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:
parent
ff914afd7f
commit
e7d95aff34
@ -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;
|
||||||
|
@ -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.
|
||||||
*
|
*
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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.
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user