Commit 49b9775d by tonihei Committed by Oliver Woodman

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
parent fd081d49
...@@ -37,7 +37,7 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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();
} }
/** /**
......
...@@ -123,6 +123,11 @@ public abstract class NoSampleRenderer implements Renderer, RendererCapabilities ...@@ -123,6 +123,11 @@ public abstract class NoSampleRenderer implements Renderer, RendererCapabilities
} }
@Override @Override
public long getReadingPositionUs() {
return C.TIME_END_OF_SOURCE;
}
@Override
public final void setCurrentStreamFinal() { public final void setCurrentStreamFinal() {
streamIsFinal = true; streamIsFinal = true;
} }
......
...@@ -161,6 +161,16 @@ public interface Renderer extends PlayerMessage.Target { ...@@ -161,6 +161,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.
* <p> * <p>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment