mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Add getReadingPositionUs to Renderer.
This method is a generalization of the existing hasReadStreamToEnd. It is useful to determine whether a renderer already read beyond a new duration of a period. PiperOrigin-RevId: 230689165
This commit is contained in:
parent
fd081d49c7
commit
49b9775d08
3 changed files with 28 additions and 7 deletions
|
|
@ -37,7 +37,7 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
||||||
private SampleStream stream;
|
private SampleStream stream;
|
||||||
private Format[] streamFormats;
|
private Format[] streamFormats;
|
||||||
private long streamOffsetUs;
|
private long streamOffsetUs;
|
||||||
private boolean readEndOfStream;
|
private long readingPositionUs;
|
||||||
private boolean streamIsFinal;
|
private boolean streamIsFinal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -46,7 +46,7 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
||||||
*/
|
*/
|
||||||
public BaseRenderer(int trackType) {
|
public BaseRenderer(int trackType) {
|
||||||
this.trackType = trackType;
|
this.trackType = trackType;
|
||||||
readEndOfStream = true;
|
readingPositionUs = C.TIME_END_OF_SOURCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -98,7 +98,7 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
||||||
throws ExoPlaybackException {
|
throws ExoPlaybackException {
|
||||||
Assertions.checkState(!streamIsFinal);
|
Assertions.checkState(!streamIsFinal);
|
||||||
this.stream = stream;
|
this.stream = stream;
|
||||||
readEndOfStream = false;
|
readingPositionUs = offsetUs;
|
||||||
streamFormats = formats;
|
streamFormats = formats;
|
||||||
streamOffsetUs = offsetUs;
|
streamOffsetUs = offsetUs;
|
||||||
onStreamChanged(formats, offsetUs);
|
onStreamChanged(formats, offsetUs);
|
||||||
|
|
@ -111,7 +111,12 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final boolean hasReadStreamToEnd() {
|
public final boolean hasReadStreamToEnd() {
|
||||||
return readEndOfStream;
|
return readingPositionUs == C.TIME_END_OF_SOURCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final long getReadingPositionUs() {
|
||||||
|
return readingPositionUs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -132,7 +137,7 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
||||||
@Override
|
@Override
|
||||||
public final void resetPosition(long positionUs) throws ExoPlaybackException {
|
public final void resetPosition(long positionUs) throws ExoPlaybackException {
|
||||||
streamIsFinal = false;
|
streamIsFinal = false;
|
||||||
readEndOfStream = false;
|
readingPositionUs = positionUs;
|
||||||
onPositionReset(positionUs, false);
|
onPositionReset(positionUs, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -303,10 +308,11 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
||||||
int result = stream.readData(formatHolder, buffer, formatRequired);
|
int result = stream.readData(formatHolder, buffer, formatRequired);
|
||||||
if (result == C.RESULT_BUFFER_READ) {
|
if (result == C.RESULT_BUFFER_READ) {
|
||||||
if (buffer.isEndOfStream()) {
|
if (buffer.isEndOfStream()) {
|
||||||
readEndOfStream = true;
|
readingPositionUs = C.TIME_END_OF_SOURCE;
|
||||||
return streamIsFinal ? C.RESULT_BUFFER_READ : C.RESULT_NOTHING_READ;
|
return streamIsFinal ? C.RESULT_BUFFER_READ : C.RESULT_NOTHING_READ;
|
||||||
}
|
}
|
||||||
buffer.timeUs += streamOffsetUs;
|
buffer.timeUs += streamOffsetUs;
|
||||||
|
readingPositionUs = Math.max(readingPositionUs, buffer.timeUs);
|
||||||
} else if (result == C.RESULT_FORMAT_READ) {
|
} else if (result == C.RESULT_FORMAT_READ) {
|
||||||
Format format = formatHolder.format;
|
Format format = formatHolder.format;
|
||||||
if (format.subsampleOffsetUs != Format.OFFSET_SAMPLE_RELATIVE) {
|
if (format.subsampleOffsetUs != Format.OFFSET_SAMPLE_RELATIVE) {
|
||||||
|
|
@ -332,7 +338,7 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
||||||
* Returns whether the upstream source is ready.
|
* Returns whether the upstream source is ready.
|
||||||
*/
|
*/
|
||||||
protected final boolean isSourceReady() {
|
protected final boolean isSourceReady() {
|
||||||
return readEndOfStream ? streamIsFinal : stream.isReady();
|
return hasReadStreamToEnd() ? streamIsFinal : stream.isReady();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -122,6 +122,11 @@ public abstract class NoSampleRenderer implements Renderer, RendererCapabilities
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getReadingPositionUs() {
|
||||||
|
return C.TIME_END_OF_SOURCE;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void setCurrentStreamFinal() {
|
public final void setCurrentStreamFinal() {
|
||||||
streamIsFinal = true;
|
streamIsFinal = true;
|
||||||
|
|
|
||||||
|
|
@ -160,6 +160,16 @@ public interface Renderer extends PlayerMessage.Target {
|
||||||
*/
|
*/
|
||||||
boolean hasReadStreamToEnd();
|
boolean hasReadStreamToEnd();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the playback position up to which the renderer has read samples from the current {@link
|
||||||
|
* SampleStream}, in microseconds, or {@link C#TIME_END_OF_SOURCE} if the renderer has read the
|
||||||
|
* current {@link SampleStream} to the end.
|
||||||
|
*
|
||||||
|
* <p>This method may be called when the renderer is in the following states: {@link
|
||||||
|
* #STATE_ENABLED}, {@link #STATE_STARTED}.
|
||||||
|
*/
|
||||||
|
long getReadingPositionUs();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Signals to the renderer that the current {@link SampleStream} will be the final one supplied
|
* Signals to the renderer that the current {@link SampleStream} will be the final one supplied
|
||||||
* before it is next disabled or reset.
|
* before it is next disabled or reset.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue