Update Renderer documentation

- Cleaned up documentation
- Removed getIndex from Renderer interface
- Renamed reset to be positionReset

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127731006
This commit is contained in:
olly 2016-07-18 10:30:38 -07:00 committed by Oliver Woodman
parent ff914afd7f
commit e7d95aff34
10 changed files with 198 additions and 169 deletions

View File

@ -106,6 +106,7 @@ public final class LibvpxVideoRenderer extends BaseRenderer {
public LibvpxVideoRenderer(boolean scaleToFit, long allowedJoiningTimeMs, public LibvpxVideoRenderer(boolean scaleToFit, long allowedJoiningTimeMs,
Handler eventHandler, VideoRendererEventListener eventListener, Handler eventHandler, VideoRendererEventListener eventListener,
int maxDroppedFrameCountToNotify) { int maxDroppedFrameCountToNotify) {
super(C.TRACK_TYPE_VIDEO);
this.scaleToFit = scaleToFit; this.scaleToFit = scaleToFit;
this.allowedJoiningTimeMs = allowedJoiningTimeMs; this.allowedJoiningTimeMs = allowedJoiningTimeMs;
this.maxDroppedFrameCountToNotify = maxDroppedFrameCountToNotify; this.maxDroppedFrameCountToNotify = maxDroppedFrameCountToNotify;
@ -138,11 +139,6 @@ public final class LibvpxVideoRenderer extends BaseRenderer {
return isLibvpxAvailable() ? VpxDecoder.getLibvpxConfig() : null; return isLibvpxAvailable() ? VpxDecoder.getLibvpxConfig() : null;
} }
@Override
public int getTrackType() {
return C.TRACK_TYPE_VIDEO;
}
@Override @Override
public int supportsFormat(Format format) { public int supportsFormat(Format format) {
return isLibvpxAvailable() && MimeTypes.VIDEO_VP9.equalsIgnoreCase(format.sampleMimeType) return isLibvpxAvailable() && MimeTypes.VIDEO_VP9.equalsIgnoreCase(format.sampleMimeType)
@ -359,7 +355,7 @@ public final class LibvpxVideoRenderer extends BaseRenderer {
} }
@Override @Override
protected void onReset(long positionUs, boolean joining) { protected void onPositionReset(long positionUs, boolean joining) {
inputStreamEnded = false; inputStreamEnded = false;
outputStreamEnded = false; outputStreamEnded = false;
renderedFirstFrame = false; renderedFirstFrame = false;

View File

@ -27,6 +27,8 @@ import java.io.IOException;
*/ */
public abstract class BaseRenderer implements Renderer, RendererCapabilities { public abstract class BaseRenderer implements Renderer, RendererCapabilities {
private final int trackType;
private int index; private int index;
private int state; private int state;
private SampleStream stream; private SampleStream stream;
@ -34,10 +36,20 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
private boolean readEndOfStream; private boolean readEndOfStream;
private boolean streamIsFinal; private boolean streamIsFinal;
public BaseRenderer() { /**
* @param trackType The track type that the renderer handles. One of the {@link C}
* {@code TRACK_TYPE_*} constants.
*/
public BaseRenderer(int trackType) {
this.trackType = trackType;
readEndOfStream = true; readEndOfStream = true;
} }
@Override
public final int getTrackType() {
return trackType;
}
@Override @Override
public final RendererCapabilities getCapabilities() { public final RendererCapabilities getCapabilities() {
return this; return this;
@ -48,11 +60,6 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
this.index = index; this.index = index;
} }
@Override
public final int getIndex() {
return index;
}
@Override @Override
public MediaClock getMediaClock() { public MediaClock getMediaClock() {
return null; return null;
@ -70,19 +77,14 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
state = STATE_ENABLED; state = STATE_ENABLED;
onEnabled(joining); onEnabled(joining);
replaceStream(formats, stream, offsetUs); replaceStream(formats, stream, offsetUs);
onReset(positionUs, joining); onPositionReset(positionUs, joining);
} }
/** @Override
* Called when the renderer is enabled. public final void start() throws ExoPlaybackException {
* <p> Assertions.checkState(state == STATE_ENABLED);
* The default implementation is a no-op. state = STATE_STARTED;
* onStarted();
* @param joining Whether this renderer is being enabled to join an ongoing playback.
* @throws ExoPlaybackException If an error occurs.
*/
protected void onEnabled(boolean joining) throws ExoPlaybackException {
// Do nothing.
} }
@Override @Override
@ -95,38 +97,6 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
onStreamChanged(formats); onStreamChanged(formats);
} }
/**
* Called when the renderer's stream has changed.
* <p>
* The default implementation is a no-op.
*
* @param formats The enabled formats.
* @throws ExoPlaybackException Thrown if an error occurs.
*/
protected void onStreamChanged(Format[] formats) throws ExoPlaybackException {
// Do nothing.
}
@Override
public final void reset(long positionUs) throws ExoPlaybackException {
streamIsFinal = false;
onReset(positionUs, false);
}
/**
* Invoked when a reset is encountered, and also when the renderer is enabled.
* <p>
* This method may be called when the renderer is in the following states:
* {@link #STATE_ENABLED}, {@link #STATE_STARTED}.
*
* @param positionUs The playback position in microseconds.
* @param joining Whether this renderer is being enabled to join an ongoing playback.
* @throws ExoPlaybackException If an error occurs handling the reset.
*/
protected void onReset(long positionUs, boolean joining) throws ExoPlaybackException {
// Do nothing.
}
@Override @Override
public final boolean hasReadStreamToEnd() { public final boolean hasReadStreamToEnd() {
return readEndOfStream; return readEndOfStream;
@ -138,21 +108,14 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
} }
@Override @Override
public final void start() throws ExoPlaybackException { public final void maybeThrowStreamError() throws IOException {
Assertions.checkState(state == STATE_ENABLED); stream.maybeThrowError();
state = STATE_STARTED;
onStarted();
} }
/** @Override
* Called when the renderer is started. public final void resetPosition(long positionUs) throws ExoPlaybackException {
* <p> streamIsFinal = false;
* The default implementation is a no-op. onPositionReset(positionUs, false);
*
* @throws ExoPlaybackException If an error occurs.
*/
protected void onStarted() throws ExoPlaybackException {
// Do nothing.
} }
@Override @Override
@ -162,17 +125,6 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
onStopped(); onStopped();
} }
/**
* Called when the renderer is stopped.
* <p>
* The default implementation is a no-op.
*
* @throws ExoPlaybackException If an error occurs.
*/
protected void onStopped() throws ExoPlaybackException {
// Do nothing.
}
@Override @Override
public final void disable() { public final void disable() {
Assertions.checkState(state == STATE_ENABLED); Assertions.checkState(state == STATE_ENABLED);
@ -182,20 +134,6 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
streamIsFinal = false; streamIsFinal = false;
} }
/**
* Called when the renderer is disabled.
* <p>
* The default implementation is a no-op.
*/
protected void onDisabled() {
// Do nothing.
}
@Override
public final void maybeThrowStreamError() throws IOException {
stream.maybeThrowError();
}
// RendererCapabilities implementation. // RendererCapabilities implementation.
@Override @Override
@ -210,8 +148,95 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
// Do nothing. // Do nothing.
} }
// Methods to be overridden by subclasses.
/**
* Called when the renderer is enabled.
* <p>
* The default implementation is a no-op.
*
* @param joining Whether this renderer is being enabled to join an ongoing playback.
* @throws ExoPlaybackException If an error occurs.
*/
protected void onEnabled(boolean joining) throws ExoPlaybackException {
// Do nothing.
}
/**
* Called when the renderer's stream has changed. This occurs when the renderer is enabled after
* {@link #onEnabled(boolean)} has been called, and also when the stream has been replaced whilst
* the renderer is enabled or started.
* <p>
* The default implementation is a no-op.
*
* @param formats The enabled formats.
* @throws ExoPlaybackException If an error occurs.
*/
protected void onStreamChanged(Format[] formats) throws ExoPlaybackException {
// Do nothing.
}
/**
* Invoked when the position is reset. This occurs when the renderer is enabled after
* {@link #onStreamChanged(Format[])} has been called, and also when a position discontinuity
* is encountered.
* <p>
* After a position reset, the renderer's {@link SampleStream} is guaranteed to provide samples
* starting from a key frame.
* <p>
* The default implementation is a no-op.
*
* @param positionUs The new playback position in microseconds.
* @param joining Whether this renderer is being enabled to join an ongoing playback.
* @throws ExoPlaybackException If an error occurs.
*/
protected void onPositionReset(long positionUs, boolean joining)
throws ExoPlaybackException {
// Do nothing.
}
/**
* Called when the renderer is started.
* <p>
* The default implementation is a no-op.
*
* @throws ExoPlaybackException If an error occurs.
*/
protected void onStarted() throws ExoPlaybackException {
// Do nothing.
}
/**
* Called when the renderer is stopped.
* <p>
* The default implementation is a no-op.
*
* @throws ExoPlaybackException If an error occurs.
*/
protected void onStopped() throws ExoPlaybackException {
// Do nothing.
}
/**
* Called when the renderer is disabled.
* <p>
* The default implementation is a no-op.
*/
protected void onDisabled() {
// Do nothing.
}
// Methods to be called by subclasses. // Methods to be called by subclasses.
/**
* Returns the index of the renderer within the player.
*
* @return The index of the renderer within the player.
*/
protected final int getIndex() {
return index;
}
/** /**
* Reads from the enabled upstream source. * Reads from the enabled upstream source.
* *

View File

@ -500,7 +500,7 @@ import java.util.ArrayList;
internalPositionUs = sourceOffsetUs + periodPositionUs; internalPositionUs = sourceOffsetUs + periodPositionUs;
standaloneMediaClock.setPositionUs(internalPositionUs); standaloneMediaClock.setPositionUs(internalPositionUs);
for (Renderer renderer : enabledRenderers) { for (Renderer renderer : enabledRenderers) {
renderer.reset(internalPositionUs); renderer.resetPosition(internalPositionUs);
} }
} }

View File

@ -71,13 +71,6 @@ public interface Renderer extends ExoPlayerComponent {
*/ */
void setIndex(int index); void setIndex(int index);
/**
* Returns the index of the renderer within the player.
*
* @return The index of the renderer within the player.
*/
int getIndex();
/** /**
* If the renderer advances its own playback position then this method returns a corresponding * If the renderer advances its own playback position then this method returns a corresponding
* {@link MediaClock}. If provided, the player will use the returned {@link MediaClock} as its * {@link MediaClock}. If provided, the player will use the returned {@link MediaClock} as its
@ -97,6 +90,9 @@ public interface Renderer extends ExoPlayerComponent {
/** /**
* Enable the renderer to consume from the specified {@link SampleStream}. * Enable the renderer to consume from the specified {@link SampleStream}.
* <p>
* This method may be called when the renderer is in the following states:
* {@link #STATE_DISABLED}.
* *
* @param formats The enabled formats. * @param formats The enabled formats.
* @param stream The {@link SampleStream} from which the renderer should consume. * @param stream The {@link SampleStream} from which the renderer should consume.
@ -110,7 +106,21 @@ public interface Renderer extends ExoPlayerComponent {
long offsetUs) throws ExoPlaybackException; long offsetUs) throws ExoPlaybackException;
/** /**
* Sets the {@link SampleStream} from which samples will be consumed. * Starts the renderer, meaning that calls to {@link #render(long, long)} will cause media to be
* rendered.
* <p>
* This method may be called when the renderer is in the following states:
* {@link #STATE_ENABLED}.
*
* @throws ExoPlaybackException If an error occurs.
*/
void start() throws ExoPlaybackException;
/**
* Replaces the {@link SampleStream} from which samples will be consumed.
* <p>
* This method may be called when the renderer is in the following states:
* {@link #STATE_ENABLED}, {@link #STATE_STARTED}.
* *
* @param formats The enabled formats. * @param formats The enabled formats.
* @param stream The {@link SampleStream} from which the renderer should consume. * @param stream The {@link SampleStream} from which the renderer should consume.
@ -121,60 +131,58 @@ public interface Renderer extends ExoPlayerComponent {
void replaceStream(Format[] formats, SampleStream stream, long offsetUs) void replaceStream(Format[] formats, SampleStream stream, long offsetUs)
throws ExoPlaybackException; throws ExoPlaybackException;
/**
* Called when a reset is encountered.
*
* @param positionUs The playback position in microseconds.
* @throws ExoPlaybackException If an error occurs handling the reset.
*/
void reset(long positionUs) throws ExoPlaybackException;
/** /**
* Returns whether the renderer has read the current {@link SampleStream} to the end. * Returns whether 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}.
*/ */
boolean hasReadStreamToEnd(); boolean hasReadStreamToEnd();
/** /**
* 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>
* This method may be called when the renderer is in the following states:
* {@link #STATE_ENABLED}, {@link #STATE_STARTED}.
*/ */
void setCurrentStreamIsFinal(); void setCurrentStreamIsFinal();
/**
* Starts the renderer, meaning that calls to {@link #render(long, long)} will cause media to be
* rendered.
*
* @throws ExoPlaybackException If an error occurs.
*/
void start() throws ExoPlaybackException;
/**
* Stops the renderer.
*
* @throws ExoPlaybackException If an error occurs.
*/
void stop() throws ExoPlaybackException;
/**
* Disable the renderer.
*/
void disable();
/** /**
* Throws an error that's preventing the renderer from reading from its {@link SampleStream}. Does * Throws an error that's preventing the renderer from reading from its {@link SampleStream}. Does
* nothing if no such error exists. * nothing if no such error exists.
* <p> * <p>
* This method may be called when the renderer is in the following states: * This method may be called when the renderer is in the following states:
* {@link #STATE_ENABLED}. * {@link #STATE_ENABLED}, {@link #STATE_STARTED}.
* *
* @throws IOException An error that's preventing the renderer from making progress or buffering * @throws IOException An error that's preventing the renderer from making progress or buffering
* more data. * more data.
*/ */
void maybeThrowStreamError() throws IOException; void maybeThrowStreamError() throws IOException;
/**
* Called when a position discontinuity is encountered.
* <p>
* After a position discontinuity, the renderer's {@link SampleStream} is guaranteed to provide
* samples starting from a key frame.
* <p>
* This method may be called when the renderer is in the following states:
* {@link #STATE_ENABLED}, {@link #STATE_STARTED}.
*
* @param positionUs The new playback position in microseconds.
* @throws ExoPlaybackException If an error occurs handling the reset.
*/
void resetPosition(long positionUs) throws ExoPlaybackException;
/** /**
* Incrementally renders the {@link SampleStream}. * Incrementally renders the {@link SampleStream}.
* <p> * <p>
* If the renderer is in the {@link #STATE_ENABLED} state then each call to this method will do
* work toward being ready to render the {@link SampleStream} when the renderer is started. It may
* also render the very start of the media, for example the first frame of a video stream. If the
* renderer is in the {@link #STATE_STARTED} state then calls to this method will render the
* {@link SampleStream} in sync with the specified media positions.
* <p>
* This method should return quickly, and should not block if the renderer is unable to make * This method should return quickly, and should not block if the renderer is unable to make
* useful progress. * useful progress.
* <p> * <p>
@ -218,4 +226,22 @@ public interface Renderer extends ExoPlayerComponent {
*/ */
boolean isEnded(); boolean isEnded();
/**
* Stops the renderer.
* <p>
* This method may be called when the renderer is in the following states:
* {@link #STATE_STARTED}.
*
* @throws ExoPlaybackException If an error occurs.
*/
void stop() throws ExoPlaybackException;
/**
* Disable the renderer.
* <p>
* This method may be called when the renderer is in the following states:
* {@link #STATE_ENABLED}.
*/
void disable();
} }

View File

@ -132,17 +132,12 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
DrmSessionManager drmSessionManager, boolean playClearSamplesWithoutKeys, DrmSessionManager drmSessionManager, boolean playClearSamplesWithoutKeys,
Handler eventHandler, AudioRendererEventListener eventListener, Handler eventHandler, AudioRendererEventListener eventListener,
AudioCapabilities audioCapabilities, int streamType) { AudioCapabilities audioCapabilities, int streamType) {
super(mediaCodecSelector, drmSessionManager, playClearSamplesWithoutKeys); super(C.TRACK_TYPE_AUDIO, mediaCodecSelector, drmSessionManager, playClearSamplesWithoutKeys);
audioSessionId = AudioTrack.SESSION_ID_NOT_SET; audioSessionId = AudioTrack.SESSION_ID_NOT_SET;
audioTrack = new AudioTrack(audioCapabilities, streamType); audioTrack = new AudioTrack(audioCapabilities, streamType);
eventDispatcher = new EventDispatcher(eventHandler, eventListener); eventDispatcher = new EventDispatcher(eventHandler, eventListener);
} }
@Override
public int getTrackType() {
return C.TRACK_TYPE_AUDIO;
}
@Override @Override
protected int supportsFormat(MediaCodecSelector mediaCodecSelector, Format format) protected int supportsFormat(MediaCodecSelector mediaCodecSelector, Format format)
throws DecoderQueryException { throws DecoderQueryException {
@ -264,8 +259,8 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
} }
@Override @Override
protected void onReset(long positionUs, boolean joining) throws ExoPlaybackException { protected void onPositionReset(long positionUs, boolean joining) throws ExoPlaybackException {
super.onReset(positionUs, joining); super.onPositionReset(positionUs, joining);
audioTrack.reset(); audioTrack.reset();
currentPositionUs = positionUs; currentPositionUs = positionUs;
allowPositionDiscontinuity = true; allowPositionDiscontinuity = true;

View File

@ -85,6 +85,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
public SimpleDecoderAudioRenderer(Handler eventHandler, public SimpleDecoderAudioRenderer(Handler eventHandler,
AudioRendererEventListener eventListener, AudioCapabilities audioCapabilities, AudioRendererEventListener eventListener, AudioCapabilities audioCapabilities,
int streamType) { int streamType) {
super(C.TRACK_TYPE_AUDIO);
eventDispatcher = new EventDispatcher(eventHandler, eventListener); eventDispatcher = new EventDispatcher(eventHandler, eventListener);
audioSessionId = AudioTrack.SESSION_ID_NOT_SET; audioSessionId = AudioTrack.SESSION_ID_NOT_SET;
audioTrack = new AudioTrack(audioCapabilities, streamType); audioTrack = new AudioTrack(audioCapabilities, streamType);
@ -137,11 +138,6 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
decoderCounters.ensureUpdated(); decoderCounters.ensureUpdated();
} }
@Override
public int getTrackType() {
return C.TRACK_TYPE_AUDIO;
}
protected abstract SimpleDecoder<DecoderInputBuffer, ? extends SimpleOutputBuffer, protected abstract SimpleDecoder<DecoderInputBuffer, ? extends SimpleOutputBuffer,
? extends AudioDecoderException> createDecoder(Format format) throws AudioDecoderException; ? extends AudioDecoderException> createDecoder(Format format) throws AudioDecoderException;
@ -311,7 +307,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
} }
@Override @Override
protected void onReset(long positionUs, boolean joining) { protected void onPositionReset(long positionUs, boolean joining) {
audioTrack.reset(); audioTrack.reset();
currentPositionUs = positionUs; currentPositionUs = positionUs;
allowPositionDiscontinuity = true; allowPositionDiscontinuity = true;

View File

@ -205,6 +205,8 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
protected DecoderCounters decoderCounters; protected DecoderCounters decoderCounters;
/** /**
* @param trackType The track type that the renderer handles. One of the {@code C.TRACK_TYPE_*}
* constants defined in {@link C}.
* @param mediaCodecSelector A decoder selector. * @param mediaCodecSelector A decoder selector.
* @param drmSessionManager For use with encrypted media. May be null if support for encrypted * @param drmSessionManager For use with encrypted media. May be null if support for encrypted
* media is not required. * media is not required.
@ -214,8 +216,9 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
* permitted to play clear regions of encrypted media files before {@code drmSessionManager} * permitted to play clear regions of encrypted media files before {@code drmSessionManager}
* has obtained the keys necessary to decrypt encrypted regions of the media. * has obtained the keys necessary to decrypt encrypted regions of the media.
*/ */
public MediaCodecRenderer(MediaCodecSelector mediaCodecSelector, public MediaCodecRenderer(int trackType, MediaCodecSelector mediaCodecSelector,
DrmSessionManager drmSessionManager, boolean playClearSamplesWithoutKeys) { DrmSessionManager drmSessionManager, boolean playClearSamplesWithoutKeys) {
super(trackType);
Assertions.checkState(Util.SDK_INT >= 16); Assertions.checkState(Util.SDK_INT >= 16);
this.mediaCodecSelector = Assertions.checkNotNull(mediaCodecSelector); this.mediaCodecSelector = Assertions.checkNotNull(mediaCodecSelector);
this.drmSessionManager = drmSessionManager; this.drmSessionManager = drmSessionManager;
@ -383,7 +386,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
} }
@Override @Override
protected void onReset(long positionUs, boolean joining) throws ExoPlaybackException { protected void onPositionReset(long positionUs, boolean joining) throws ExoPlaybackException {
inputStreamEnded = false; inputStreamEnded = false;
outputStreamEnded = false; outputStreamEnded = false;
if (codec != null) { if (codec != null) {
@ -899,8 +902,9 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
* modified between successive calls. Hence an implementation can, for example, modify the * modified between successive calls. Hence an implementation can, for example, modify the
* buffer's position to keep track of how much of the data it has processed. * buffer's position to keep track of how much of the data it has processed.
* <p> * <p>
* Note that the first call to this method following a call to {@link #onReset(long, boolean)} * Note that the first call to this method following a call to
* will always receive a new {@link ByteBuffer} to be processed. * {@link #onPositionReset(long, boolean)} will always receive a new {@link ByteBuffer} to be
* processed.
* *
* @param positionUs The current media time in microseconds, measured at the start of the * @param positionUs The current media time in microseconds, measured at the start of the
* current iteration of the rendering loop. * current iteration of the rendering loop.

View File

@ -77,6 +77,7 @@ public final class MetadataRenderer<T> extends BaseRenderer implements Callback
*/ */
public MetadataRenderer(Output<T> output, Looper outputLooper, public MetadataRenderer(Output<T> output, Looper outputLooper,
MetadataDecoder<T> metadataDecoder) { MetadataDecoder<T> metadataDecoder) {
super(C.TRACK_TYPE_METADATA);
this.output = Assertions.checkNotNull(output); this.output = Assertions.checkNotNull(output);
this.outputHandler = outputLooper == null ? null : new Handler(outputLooper, this); this.outputHandler = outputLooper == null ? null : new Handler(outputLooper, this);
this.metadataDecoder = Assertions.checkNotNull(metadataDecoder); this.metadataDecoder = Assertions.checkNotNull(metadataDecoder);
@ -84,11 +85,6 @@ public final class MetadataRenderer<T> extends BaseRenderer implements Callback
buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL); buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL);
} }
@Override
public int getTrackType() {
return C.TRACK_TYPE_METADATA;
}
@Override @Override
public int supportsFormat(Format format) { public int supportsFormat(Format format) {
return metadataDecoder.canDecode(format.sampleMimeType) ? FORMAT_HANDLED return metadataDecoder.canDecode(format.sampleMimeType) ? FORMAT_HANDLED
@ -96,7 +92,7 @@ public final class MetadataRenderer<T> extends BaseRenderer implements Callback
} }
@Override @Override
protected void onReset(long positionUs, boolean joining) { protected void onPositionReset(long positionUs, boolean joining) {
pendingMetadata = null; pendingMetadata = null;
inputStreamEnded = false; inputStreamEnded = false;
} }

View File

@ -93,17 +93,13 @@ public final class TextRenderer extends BaseRenderer implements Callback {
* @param decoderFactory A factory from which to obtain {@link SubtitleDecoder} instances. * @param decoderFactory A factory from which to obtain {@link SubtitleDecoder} instances.
*/ */
public TextRenderer(Output output, Looper outputLooper, SubtitleDecoderFactory decoderFactory) { public TextRenderer(Output output, Looper outputLooper, SubtitleDecoderFactory decoderFactory) {
super(C.TRACK_TYPE_TEXT);
this.output = Assertions.checkNotNull(output); this.output = Assertions.checkNotNull(output);
this.outputHandler = outputLooper == null ? null : new Handler(outputLooper, this); this.outputHandler = outputLooper == null ? null : new Handler(outputLooper, this);
this.decoderFactory = decoderFactory; this.decoderFactory = decoderFactory;
formatHolder = new FormatHolder(); formatHolder = new FormatHolder();
} }
@Override
public int getTrackType() {
return C.TRACK_TYPE_TEXT;
}
@Override @Override
public int supportsFormat(Format format) { public int supportsFormat(Format format) {
return decoderFactory.supportsFormat(format) ? FORMAT_HANDLED return decoderFactory.supportsFormat(format) ? FORMAT_HANDLED
@ -120,7 +116,7 @@ public final class TextRenderer extends BaseRenderer implements Callback {
} }
@Override @Override
protected void onReset(long positionUs, boolean joining) { protected void onPositionReset(long positionUs, boolean joining) {
inputStreamEnded = false; inputStreamEnded = false;
outputStreamEnded = false; outputStreamEnded = false;
if (subtitle != null) { if (subtitle != null) {

View File

@ -151,7 +151,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
int videoScalingMode, long allowedJoiningTimeMs, DrmSessionManager drmSessionManager, int videoScalingMode, long allowedJoiningTimeMs, DrmSessionManager drmSessionManager,
boolean playClearSamplesWithoutKeys, Handler eventHandler, boolean playClearSamplesWithoutKeys, Handler eventHandler,
VideoRendererEventListener eventListener, int maxDroppedFrameCountToNotify) { VideoRendererEventListener eventListener, int maxDroppedFrameCountToNotify) {
super(mediaCodecSelector, drmSessionManager, playClearSamplesWithoutKeys); super(C.TRACK_TYPE_VIDEO, mediaCodecSelector, drmSessionManager, playClearSamplesWithoutKeys);
this.videoScalingMode = videoScalingMode; this.videoScalingMode = videoScalingMode;
this.allowedJoiningTimeMs = allowedJoiningTimeMs; this.allowedJoiningTimeMs = allowedJoiningTimeMs;
this.maxDroppedFrameCountToNotify = maxDroppedFrameCountToNotify; this.maxDroppedFrameCountToNotify = maxDroppedFrameCountToNotify;
@ -168,11 +168,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
lastReportedPixelWidthHeightRatio = -1; lastReportedPixelWidthHeightRatio = -1;
} }
@Override
public int getTrackType() {
return C.TRACK_TYPE_VIDEO;
}
@Override @Override
protected int supportsFormat(MediaCodecSelector mediaCodecSelector, Format format) protected int supportsFormat(MediaCodecSelector mediaCodecSelector, Format format)
throws DecoderQueryException { throws DecoderQueryException {
@ -235,8 +230,8 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
} }
@Override @Override
protected void onReset(long positionUs, boolean joining) throws ExoPlaybackException { protected void onPositionReset(long positionUs, boolean joining) throws ExoPlaybackException {
super.onReset(positionUs, joining); super.onPositionReset(positionUs, joining);
renderedFirstFrame = false; renderedFirstFrame = false;
consecutiveDroppedFrameCount = 0; consecutiveDroppedFrameCount = 0;
joiningDeadlineMs = joining && allowedJoiningTimeMs > 0 joiningDeadlineMs = joining && allowedJoiningTimeMs > 0