parent
51fd06482b
commit
5b19e08ea9
@ -23,16 +23,12 @@ import androidx.annotation.Nullable;
|
|||||||
import androidx.media3.common.C;
|
import androidx.media3.common.C;
|
||||||
import androidx.media3.common.Format;
|
import androidx.media3.common.Format;
|
||||||
import androidx.media3.common.PlaybackException;
|
import androidx.media3.common.PlaybackException;
|
||||||
import androidx.media3.common.Timeline;
|
|
||||||
import androidx.media3.common.util.Assertions;
|
import androidx.media3.common.util.Assertions;
|
||||||
import androidx.media3.common.util.Clock;
|
import androidx.media3.common.util.Clock;
|
||||||
import androidx.media3.common.util.UnstableApi;
|
import androidx.media3.common.util.UnstableApi;
|
||||||
import androidx.media3.common.util.Util;
|
|
||||||
import androidx.media3.decoder.DecoderInputBuffer;
|
import androidx.media3.decoder.DecoderInputBuffer;
|
||||||
import androidx.media3.decoder.DecoderInputBuffer.InsufficientCapacityException;
|
import androidx.media3.decoder.DecoderInputBuffer.InsufficientCapacityException;
|
||||||
import androidx.media3.exoplayer.analytics.PlayerId;
|
import androidx.media3.exoplayer.analytics.PlayerId;
|
||||||
import androidx.media3.exoplayer.source.MediaPeriod;
|
|
||||||
import androidx.media3.exoplayer.source.MediaSource;
|
|
||||||
import androidx.media3.exoplayer.source.SampleStream;
|
import androidx.media3.exoplayer.source.SampleStream;
|
||||||
import androidx.media3.exoplayer.source.SampleStream.ReadDataResult;
|
import androidx.media3.exoplayer.source.SampleStream.ReadDataResult;
|
||||||
import androidx.media3.exoplayer.source.SampleStream.ReadFlags;
|
import androidx.media3.exoplayer.source.SampleStream.ReadFlags;
|
||||||
@ -59,7 +55,6 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
|||||||
private long readingPositionUs;
|
private long readingPositionUs;
|
||||||
private boolean streamIsFinal;
|
private boolean streamIsFinal;
|
||||||
private boolean throwRendererExceptionIsExecuting;
|
private boolean throwRendererExceptionIsExecuting;
|
||||||
private Timeline timeline;
|
|
||||||
|
|
||||||
@GuardedBy("lock")
|
@GuardedBy("lock")
|
||||||
@Nullable
|
@Nullable
|
||||||
@ -74,7 +69,6 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
|||||||
this.trackType = trackType;
|
this.trackType = trackType;
|
||||||
formatHolder = new FormatHolder();
|
formatHolder = new FormatHolder();
|
||||||
readingPositionUs = C.TIME_END_OF_SOURCE;
|
readingPositionUs = C.TIME_END_OF_SOURCE;
|
||||||
timeline = Timeline.EMPTY;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -114,14 +108,13 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
|||||||
boolean joining,
|
boolean joining,
|
||||||
boolean mayRenderStartOfStream,
|
boolean mayRenderStartOfStream,
|
||||||
long startPositionUs,
|
long startPositionUs,
|
||||||
long offsetUs,
|
long offsetUs)
|
||||||
MediaSource.MediaPeriodId mediaPeriodId)
|
|
||||||
throws ExoPlaybackException {
|
throws ExoPlaybackException {
|
||||||
Assertions.checkState(state == STATE_DISABLED);
|
Assertions.checkState(state == STATE_DISABLED);
|
||||||
this.configuration = configuration;
|
this.configuration = configuration;
|
||||||
state = STATE_ENABLED;
|
state = STATE_ENABLED;
|
||||||
onEnabled(joining, mayRenderStartOfStream);
|
onEnabled(joining, mayRenderStartOfStream);
|
||||||
replaceStream(formats, stream, startPositionUs, offsetUs, mediaPeriodId);
|
replaceStream(formats, stream, startPositionUs, offsetUs);
|
||||||
resetPosition(startPositionUs, joining);
|
resetPosition(startPositionUs, joining);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,13 +126,8 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("deprecation") // Calling deprecated method.
|
|
||||||
public final void replaceStream(
|
public final void replaceStream(
|
||||||
Format[] formats,
|
Format[] formats, SampleStream stream, long startPositionUs, long offsetUs)
|
||||||
SampleStream stream,
|
|
||||||
long startPositionUs,
|
|
||||||
long offsetUs,
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId)
|
|
||||||
throws ExoPlaybackException {
|
throws ExoPlaybackException {
|
||||||
Assertions.checkState(!streamIsFinal);
|
Assertions.checkState(!streamIsFinal);
|
||||||
this.stream = stream;
|
this.stream = stream;
|
||||||
@ -148,9 +136,6 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
|||||||
}
|
}
|
||||||
streamFormats = formats;
|
streamFormats = formats;
|
||||||
streamOffsetUs = offsetUs;
|
streamOffsetUs = offsetUs;
|
||||||
onStreamChanged(formats, startPositionUs, offsetUs, mediaPeriodId);
|
|
||||||
// Call the deprecated method after the new method, so that classes that migrate to the new
|
|
||||||
// method do not impact their subclasses that still override the deprecated method.
|
|
||||||
onStreamChanged(formats, startPositionUs, offsetUs);
|
onStreamChanged(formats, startPositionUs, offsetUs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,14 +170,6 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
|||||||
Assertions.checkNotNull(stream).maybeThrowError();
|
Assertions.checkNotNull(stream).maybeThrowError();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public final void setTimeline(Timeline timeline) {
|
|
||||||
if (!Util.areEqual(this.timeline, timeline)) {
|
|
||||||
this.timeline = timeline;
|
|
||||||
onTimelineChanged(this.timeline);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void resetPosition(long positionUs) throws ExoPlaybackException {
|
public final void resetPosition(long positionUs) throws ExoPlaybackException {
|
||||||
resetPosition(positionUs, /* joining= */ false);
|
resetPosition(positionUs, /* joining= */ false);
|
||||||
@ -282,16 +259,6 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
|||||||
// Do nothing.
|
// Do nothing.
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link #onStreamChanged(Format[], long, long, MediaSource.MediaPeriodId)}
|
|
||||||
* instead.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
protected void onStreamChanged(Format[] formats, long startPositionUs, long offsetUs)
|
|
||||||
throws ExoPlaybackException {
|
|
||||||
// Do nothing.
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the renderer's stream has changed. This occurs when the renderer is enabled after
|
* Called when the renderer's stream has changed. This occurs when the renderer is enabled after
|
||||||
* {@link #onEnabled(boolean, boolean)} has been called, and also when the stream has been
|
* {@link #onEnabled(boolean, boolean)} has been called, and also when the stream has been
|
||||||
@ -303,23 +270,17 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
|||||||
* @param startPositionUs The start position of the new stream in renderer time (microseconds).
|
* @param startPositionUs The start position of the new stream in renderer time (microseconds).
|
||||||
* @param offsetUs The offset that will be added to the timestamps of buffers read via {@link
|
* @param offsetUs The offset that will be added to the timestamps of buffers read via {@link
|
||||||
* #readSource} so that decoder input buffers have monotonically increasing timestamps.
|
* #readSource} so that decoder input buffers have monotonically increasing timestamps.
|
||||||
* @param mediaPeriodId The {@link MediaSource.MediaPeriodId} of the {@link MediaPeriod} that
|
|
||||||
* produces the stream.
|
|
||||||
* @throws ExoPlaybackException If an error occurs.
|
* @throws ExoPlaybackException If an error occurs.
|
||||||
*/
|
*/
|
||||||
protected void onStreamChanged(
|
protected void onStreamChanged(Format[] formats, long startPositionUs, long offsetUs)
|
||||||
Format[] formats,
|
|
||||||
long startPositionUs,
|
|
||||||
long offsetUs,
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId)
|
|
||||||
throws ExoPlaybackException {
|
throws ExoPlaybackException {
|
||||||
// Do nothing.
|
// Do nothing.
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the position is reset. This occurs when the renderer is enabled after {@link
|
* Called when the position is reset. This occurs when the renderer is enabled after {@link
|
||||||
* #onStreamChanged(Format[], long, long, MediaSource.MediaPeriodId)} has been called, and also
|
* #onStreamChanged(Format[], long, long)} has been called, and also when a position discontinuity
|
||||||
* when a position discontinuity is encountered.
|
* is encountered.
|
||||||
*
|
*
|
||||||
* <p>After a position reset, the renderer's {@link SampleStream} is guaranteed to provide samples
|
* <p>After a position reset, the renderer's {@link SampleStream} is guaranteed to provide samples
|
||||||
* starting from a key frame.
|
* starting from a key frame.
|
||||||
@ -381,17 +342,6 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
|||||||
// Do nothing.
|
// Do nothing.
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when a new timeline is {@linkplain #setTimeline(Timeline) set}.
|
|
||||||
*
|
|
||||||
* <p>The default implementation is a no-op.
|
|
||||||
*
|
|
||||||
* @param timeline The new timeline, which can also be obtained from {@link #getTimeline()}.
|
|
||||||
*/
|
|
||||||
protected void onTimelineChanged(Timeline timeline) {
|
|
||||||
// Do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
// Methods to be called by subclasses.
|
// Methods to be called by subclasses.
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -455,11 +405,6 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
|||||||
return checkNotNull(clock);
|
return checkNotNull(clock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the current {@link Timeline} containing the rendered stream. */
|
|
||||||
protected final Timeline getTimeline() {
|
|
||||||
return timeline;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an {@link ExoPlaybackException} of type {@link ExoPlaybackException#TYPE_RENDERER} for
|
* Creates an {@link ExoPlaybackException} of type {@link ExoPlaybackException#TYPE_RENDERER} for
|
||||||
* this renderer.
|
* this renderer.
|
||||||
|
@ -1949,9 +1949,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
/* releaseMediaSourceList= */ false,
|
/* releaseMediaSourceList= */ false,
|
||||||
/* resetError= */ true);
|
/* resetError= */ true);
|
||||||
}
|
}
|
||||||
for (Renderer renderer : renderers) {
|
|
||||||
renderer.setTimeline(timeline);
|
|
||||||
}
|
|
||||||
if (!periodPositionChanged) {
|
if (!periodPositionChanged) {
|
||||||
// We can keep the current playing period. Update the rest of the queued periods.
|
// We can keep the current playing period. Update the rest of the queued periods.
|
||||||
if (!queue.updateQueuedPeriods(
|
if (!queue.updateQueuedPeriods(
|
||||||
@ -2249,8 +2246,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
formats,
|
formats,
|
||||||
readingPeriodHolder.sampleStreams[i],
|
readingPeriodHolder.sampleStreams[i],
|
||||||
readingPeriodHolder.getStartPositionRendererTime(),
|
readingPeriodHolder.getStartPositionRendererTime(),
|
||||||
readingPeriodHolder.getRendererOffset(),
|
readingPeriodHolder.getRendererOffset());
|
||||||
readingPeriodHolder.info.id);
|
|
||||||
} else if (renderer.isEnded()) {
|
} else if (renderer.isEnded()) {
|
||||||
// The renderer has finished playback, so we can disable it now.
|
// The renderer has finished playback, so we can disable it now.
|
||||||
disableRenderer(renderer);
|
disableRenderer(renderer);
|
||||||
@ -2628,8 +2624,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
joining,
|
joining,
|
||||||
mayRenderStartOfStream,
|
mayRenderStartOfStream,
|
||||||
startPositionUs,
|
startPositionUs,
|
||||||
periodHolder.getRendererOffset(),
|
periodHolder.getRendererOffset());
|
||||||
periodHolder.info.id);
|
|
||||||
renderer.handleMessage(
|
renderer.handleMessage(
|
||||||
Renderer.MSG_SET_WAKEUP_LISTENER,
|
Renderer.MSG_SET_WAKEUP_LISTENER,
|
||||||
new Renderer.WakeupListener() {
|
new Renderer.WakeupListener() {
|
||||||
|
@ -65,8 +65,8 @@ import androidx.media3.exoplayer.upstream.Allocator;
|
|||||||
*
|
*
|
||||||
* <p>Renderers that are needed must have been enabled with the {@link #sampleStreams} for this
|
* <p>Renderers that are needed must have been enabled with the {@link #sampleStreams} for this
|
||||||
* {@link #mediaPeriod}. This means either {@link Renderer#enable(RendererConfiguration, Format[],
|
* {@link #mediaPeriod}. This means either {@link Renderer#enable(RendererConfiguration, Format[],
|
||||||
* SampleStream, long, boolean, boolean, long, long, MediaPeriodId)} or {@link
|
* SampleStream, long, boolean, boolean, long, long)} or {@link Renderer#replaceStream(Format[],
|
||||||
* Renderer#replaceStream(Format[], SampleStream, long, long, MediaPeriodId)} has been called.
|
* SampleStream, long, long)} has been called.
|
||||||
*
|
*
|
||||||
* <p>Renderers that are not needed must have been {@link Renderer#disable() disabled}.
|
* <p>Renderers that are not needed must have been {@link Renderer#disable() disabled}.
|
||||||
*/
|
*/
|
||||||
|
@ -18,12 +18,10 @@ package androidx.media3.exoplayer;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.media3.common.C;
|
import androidx.media3.common.C;
|
||||||
import androidx.media3.common.Format;
|
import androidx.media3.common.Format;
|
||||||
import androidx.media3.common.Timeline;
|
|
||||||
import androidx.media3.common.util.Assertions;
|
import androidx.media3.common.util.Assertions;
|
||||||
import androidx.media3.common.util.Clock;
|
import androidx.media3.common.util.Clock;
|
||||||
import androidx.media3.common.util.UnstableApi;
|
import androidx.media3.common.util.UnstableApi;
|
||||||
import androidx.media3.exoplayer.analytics.PlayerId;
|
import androidx.media3.exoplayer.analytics.PlayerId;
|
||||||
import androidx.media3.exoplayer.source.MediaSource;
|
|
||||||
import androidx.media3.exoplayer.source.SampleStream;
|
import androidx.media3.exoplayer.source.SampleStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||||
@ -76,14 +74,13 @@ public abstract class NoSampleRenderer implements Renderer, RendererCapabilities
|
|||||||
boolean joining,
|
boolean joining,
|
||||||
boolean mayRenderStartOfStream,
|
boolean mayRenderStartOfStream,
|
||||||
long startPositionUs,
|
long startPositionUs,
|
||||||
long offsetUs,
|
long offsetUs)
|
||||||
MediaSource.MediaPeriodId mediaPeriodId)
|
|
||||||
throws ExoPlaybackException {
|
throws ExoPlaybackException {
|
||||||
Assertions.checkState(state == STATE_DISABLED);
|
Assertions.checkState(state == STATE_DISABLED);
|
||||||
this.configuration = configuration;
|
this.configuration = configuration;
|
||||||
state = STATE_ENABLED;
|
state = STATE_ENABLED;
|
||||||
onEnabled(joining);
|
onEnabled(joining);
|
||||||
replaceStream(formats, stream, startPositionUs, offsetUs, mediaPeriodId);
|
replaceStream(formats, stream, startPositionUs, offsetUs);
|
||||||
onPositionReset(positionUs, joining);
|
onPositionReset(positionUs, joining);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,11 +93,7 @@ public abstract class NoSampleRenderer implements Renderer, RendererCapabilities
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void replaceStream(
|
public final void replaceStream(
|
||||||
Format[] formats,
|
Format[] formats, SampleStream stream, long startPositionUs, long offsetUs)
|
||||||
SampleStream stream,
|
|
||||||
long startPositionUs,
|
|
||||||
long offsetUs,
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId)
|
|
||||||
throws ExoPlaybackException {
|
throws ExoPlaybackException {
|
||||||
Assertions.checkState(!streamIsFinal);
|
Assertions.checkState(!streamIsFinal);
|
||||||
this.stream = stream;
|
this.stream = stream;
|
||||||
@ -194,11 +187,6 @@ public abstract class NoSampleRenderer implements Renderer, RendererCapabilities
|
|||||||
// Do nothing.
|
// Do nothing.
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setTimeline(Timeline timeline) {
|
|
||||||
// Do nothing.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Methods to be overridden by subclasses.
|
// Methods to be overridden by subclasses.
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -27,14 +27,11 @@ import androidx.media3.common.C;
|
|||||||
import androidx.media3.common.Effect;
|
import androidx.media3.common.Effect;
|
||||||
import androidx.media3.common.Format;
|
import androidx.media3.common.Format;
|
||||||
import androidx.media3.common.Player;
|
import androidx.media3.common.Player;
|
||||||
import androidx.media3.common.Timeline;
|
|
||||||
import androidx.media3.common.util.Clock;
|
import androidx.media3.common.util.Clock;
|
||||||
import androidx.media3.common.util.Size;
|
import androidx.media3.common.util.Size;
|
||||||
import androidx.media3.common.util.UnstableApi;
|
import androidx.media3.common.util.UnstableApi;
|
||||||
import androidx.media3.common.util.Util;
|
import androidx.media3.common.util.Util;
|
||||||
import androidx.media3.exoplayer.analytics.PlayerId;
|
import androidx.media3.exoplayer.analytics.PlayerId;
|
||||||
import androidx.media3.exoplayer.source.MediaPeriod;
|
|
||||||
import androidx.media3.exoplayer.source.MediaSource.MediaPeriodId;
|
|
||||||
import androidx.media3.exoplayer.source.SampleStream;
|
import androidx.media3.exoplayer.source.SampleStream;
|
||||||
import androidx.media3.exoplayer.video.VideoDecoderOutputBufferRenderer;
|
import androidx.media3.exoplayer.video.VideoDecoderOutputBufferRenderer;
|
||||||
import androidx.media3.exoplayer.video.VideoFrameMetadataListener;
|
import androidx.media3.exoplayer.video.VideoFrameMetadataListener;
|
||||||
@ -349,8 +346,6 @@ public interface Renderer extends PlayerMessage.Target {
|
|||||||
* @param startPositionUs The start position of the stream in renderer time (microseconds).
|
* @param startPositionUs The start position of the stream in renderer time (microseconds).
|
||||||
* @param offsetUs The offset to be added to timestamps of buffers read from {@code stream} before
|
* @param offsetUs The offset to be added to timestamps of buffers read from {@code stream} before
|
||||||
* they are rendered.
|
* they are rendered.
|
||||||
* @param mediaPeriodId The {@link MediaPeriodId} of the {@link MediaPeriod} producing the {@code
|
|
||||||
* stream}.
|
|
||||||
* @throws ExoPlaybackException If an error occurs.
|
* @throws ExoPlaybackException If an error occurs.
|
||||||
*/
|
*/
|
||||||
void enable(
|
void enable(
|
||||||
@ -361,8 +356,7 @@ public interface Renderer extends PlayerMessage.Target {
|
|||||||
boolean joining,
|
boolean joining,
|
||||||
boolean mayRenderStartOfStream,
|
boolean mayRenderStartOfStream,
|
||||||
long startPositionUs,
|
long startPositionUs,
|
||||||
long offsetUs,
|
long offsetUs)
|
||||||
MediaPeriodId mediaPeriodId)
|
|
||||||
throws ExoPlaybackException;
|
throws ExoPlaybackException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -387,16 +381,9 @@ public interface Renderer extends PlayerMessage.Target {
|
|||||||
* @param startPositionUs The start position of the new stream in renderer time (microseconds).
|
* @param startPositionUs The start position of the new stream in renderer time (microseconds).
|
||||||
* @param offsetUs The offset to be added to timestamps of buffers read from {@code stream} before
|
* @param offsetUs The offset to be added to timestamps of buffers read from {@code stream} before
|
||||||
* they are rendered.
|
* they are rendered.
|
||||||
* @param mediaPeriodId The {@link MediaPeriodId} of the {@link MediaPeriod} producing the {@code
|
|
||||||
* stream}.
|
|
||||||
* @throws ExoPlaybackException If an error occurs.
|
* @throws ExoPlaybackException If an error occurs.
|
||||||
*/
|
*/
|
||||||
void replaceStream(
|
void replaceStream(Format[] formats, SampleStream stream, long startPositionUs, long offsetUs)
|
||||||
Format[] formats,
|
|
||||||
SampleStream stream,
|
|
||||||
long startPositionUs,
|
|
||||||
long offsetUs,
|
|
||||||
MediaPeriodId mediaPeriodId)
|
|
||||||
throws ExoPlaybackException;
|
throws ExoPlaybackException;
|
||||||
|
|
||||||
/** Returns the {@link SampleStream} being consumed, or null if the renderer is disabled. */
|
/** Returns the {@link SampleStream} being consumed, or null if the renderer is disabled. */
|
||||||
@ -484,9 +471,6 @@ public interface Renderer extends PlayerMessage.Target {
|
|||||||
*/
|
*/
|
||||||
default void enableMayRenderStartOfStream() {}
|
default void enableMayRenderStartOfStream() {}
|
||||||
|
|
||||||
/** Sets the timeline that is currently being played. */
|
|
||||||
void setTimeline(Timeline timeline);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Incrementally renders the {@link SampleStream}.
|
* Incrementally renders the {@link SampleStream}.
|
||||||
*
|
*
|
||||||
@ -498,8 +482,8 @@ public interface Renderer extends PlayerMessage.Target {
|
|||||||
* <p>The renderer may also render the very start of the media at the current position (e.g. the
|
* <p>The renderer may also render the very start of the media at the current position (e.g. the
|
||||||
* first frame of a video stream) while still in the {@link #STATE_ENABLED} state, unless it's the
|
* first frame of a video stream) while still in the {@link #STATE_ENABLED} state, unless it's the
|
||||||
* initial start of the media after calling {@link #enable(RendererConfiguration, Format[],
|
* initial start of the media after calling {@link #enable(RendererConfiguration, Format[],
|
||||||
* SampleStream, long, boolean, boolean, long, long, MediaPeriodId)} with {@code
|
* SampleStream, long, boolean, boolean, long, long)} with {@code mayRenderStartOfStream} set to
|
||||||
* mayRenderStartOfStream} set to {@code false}.
|
* {@code false}.
|
||||||
*
|
*
|
||||||
* <p>This method should return quickly, and should not block if the renderer is unable to make
|
* <p>This method should return quickly, and should not block if the renderer is unable to make
|
||||||
* useful progress.
|
* useful progress.
|
||||||
|
@ -62,7 +62,6 @@ import androidx.media3.exoplayer.audio.AudioRendererEventListener.EventDispatche
|
|||||||
import androidx.media3.exoplayer.audio.AudioSink.SinkFormatSupport;
|
import androidx.media3.exoplayer.audio.AudioSink.SinkFormatSupport;
|
||||||
import androidx.media3.exoplayer.drm.DrmSession;
|
import androidx.media3.exoplayer.drm.DrmSession;
|
||||||
import androidx.media3.exoplayer.drm.DrmSession.DrmSessionException;
|
import androidx.media3.exoplayer.drm.DrmSession.DrmSessionException;
|
||||||
import androidx.media3.exoplayer.source.MediaSource;
|
|
||||||
import androidx.media3.exoplayer.source.SampleStream.ReadDataResult;
|
import androidx.media3.exoplayer.source.SampleStream.ReadDataResult;
|
||||||
import com.google.errorprone.annotations.ForOverride;
|
import com.google.errorprone.annotations.ForOverride;
|
||||||
import java.lang.annotation.Documented;
|
import java.lang.annotation.Documented;
|
||||||
@ -650,13 +649,9 @@ public abstract class DecoderAudioRenderer<
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStreamChanged(
|
protected void onStreamChanged(Format[] formats, long startPositionUs, long offsetUs)
|
||||||
Format[] formats,
|
|
||||||
long startPositionUs,
|
|
||||||
long offsetUs,
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId)
|
|
||||||
throws ExoPlaybackException {
|
throws ExoPlaybackException {
|
||||||
super.onStreamChanged(formats, startPositionUs, offsetUs, mediaPeriodId);
|
super.onStreamChanged(formats, startPositionUs, offsetUs);
|
||||||
firstStreamSampleRead = false;
|
firstStreamSampleRead = false;
|
||||||
if (outputStreamOffsetUs == C.TIME_UNSET) {
|
if (outputStreamOffsetUs == C.TIME_UNSET) {
|
||||||
setOutputStreamOffsetUs(offsetUs);
|
setOutputStreamOffsetUs(offsetUs);
|
||||||
|
@ -74,7 +74,6 @@ import androidx.media3.exoplayer.drm.DrmSession.DrmSessionException;
|
|||||||
import androidx.media3.exoplayer.drm.FrameworkCryptoConfig;
|
import androidx.media3.exoplayer.drm.FrameworkCryptoConfig;
|
||||||
import androidx.media3.exoplayer.mediacodec.MediaCodecUtil.DecoderQueryException;
|
import androidx.media3.exoplayer.mediacodec.MediaCodecUtil.DecoderQueryException;
|
||||||
import androidx.media3.exoplayer.source.MediaPeriod;
|
import androidx.media3.exoplayer.source.MediaPeriod;
|
||||||
import androidx.media3.exoplayer.source.MediaSource;
|
|
||||||
import androidx.media3.exoplayer.source.SampleStream;
|
import androidx.media3.exoplayer.source.SampleStream;
|
||||||
import androidx.media3.exoplayer.source.SampleStream.ReadDataResult;
|
import androidx.media3.exoplayer.source.SampleStream.ReadDataResult;
|
||||||
import androidx.media3.exoplayer.source.SampleStream.ReadFlags;
|
import androidx.media3.exoplayer.source.SampleStream.ReadFlags;
|
||||||
@ -709,11 +708,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStreamChanged(
|
protected void onStreamChanged(Format[] formats, long startPositionUs, long offsetUs)
|
||||||
Format[] formats,
|
|
||||||
long startPositionUs,
|
|
||||||
long offsetUs,
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId)
|
|
||||||
throws ExoPlaybackException {
|
throws ExoPlaybackException {
|
||||||
if (outputStreamInfo.streamOffsetUs == C.TIME_UNSET) {
|
if (outputStreamInfo.streamOffsetUs == C.TIME_UNSET) {
|
||||||
// This is the first stream.
|
// This is the first stream.
|
||||||
|
@ -32,7 +32,6 @@ import androidx.media3.common.util.Util;
|
|||||||
import androidx.media3.exoplayer.BaseRenderer;
|
import androidx.media3.exoplayer.BaseRenderer;
|
||||||
import androidx.media3.exoplayer.FormatHolder;
|
import androidx.media3.exoplayer.FormatHolder;
|
||||||
import androidx.media3.exoplayer.RendererCapabilities;
|
import androidx.media3.exoplayer.RendererCapabilities;
|
||||||
import androidx.media3.exoplayer.source.MediaSource;
|
|
||||||
import androidx.media3.exoplayer.source.SampleStream.ReadDataResult;
|
import androidx.media3.exoplayer.source.SampleStream.ReadDataResult;
|
||||||
import androidx.media3.extractor.metadata.MetadataDecoder;
|
import androidx.media3.extractor.metadata.MetadataDecoder;
|
||||||
import androidx.media3.extractor.metadata.MetadataInputBuffer;
|
import androidx.media3.extractor.metadata.MetadataInputBuffer;
|
||||||
@ -141,11 +140,7 @@ public final class MetadataRenderer extends BaseRenderer implements Callback {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStreamChanged(
|
protected void onStreamChanged(Format[] formats, long startPositionUs, long offsetUs) {
|
||||||
Format[] formats,
|
|
||||||
long startPositionUs,
|
|
||||||
long offsetUs,
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId) {
|
|
||||||
decoder = decoderFactory.createDecoder(formats[0]);
|
decoder = decoderFactory.createDecoder(formats[0]);
|
||||||
if (pendingMetadata != null) {
|
if (pendingMetadata != null) {
|
||||||
pendingMetadata =
|
pendingMetadata =
|
||||||
|
@ -36,7 +36,6 @@ import androidx.media3.common.util.Util;
|
|||||||
import androidx.media3.exoplayer.BaseRenderer;
|
import androidx.media3.exoplayer.BaseRenderer;
|
||||||
import androidx.media3.exoplayer.FormatHolder;
|
import androidx.media3.exoplayer.FormatHolder;
|
||||||
import androidx.media3.exoplayer.RendererCapabilities;
|
import androidx.media3.exoplayer.RendererCapabilities;
|
||||||
import androidx.media3.exoplayer.source.MediaSource;
|
|
||||||
import androidx.media3.exoplayer.source.SampleStream.ReadDataResult;
|
import androidx.media3.exoplayer.source.SampleStream.ReadDataResult;
|
||||||
import androidx.media3.extractor.text.Subtitle;
|
import androidx.media3.extractor.text.Subtitle;
|
||||||
import androidx.media3.extractor.text.SubtitleDecoder;
|
import androidx.media3.extractor.text.SubtitleDecoder;
|
||||||
@ -178,11 +177,7 @@ public final class TextRenderer extends BaseRenderer implements Callback {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStreamChanged(
|
protected void onStreamChanged(Format[] formats, long startPositionUs, long offsetUs) {
|
||||||
Format[] formats,
|
|
||||||
long startPositionUs,
|
|
||||||
long offsetUs,
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId) {
|
|
||||||
outputStreamOffsetUs = offsetUs;
|
outputStreamOffsetUs = offsetUs;
|
||||||
streamFormat = formats[0];
|
streamFormat = formats[0];
|
||||||
if (decoder != null) {
|
if (decoder != null) {
|
||||||
|
@ -54,7 +54,6 @@ import androidx.media3.exoplayer.FormatHolder;
|
|||||||
import androidx.media3.exoplayer.PlayerMessage;
|
import androidx.media3.exoplayer.PlayerMessage;
|
||||||
import androidx.media3.exoplayer.drm.DrmSession;
|
import androidx.media3.exoplayer.drm.DrmSession;
|
||||||
import androidx.media3.exoplayer.drm.DrmSession.DrmSessionException;
|
import androidx.media3.exoplayer.drm.DrmSession.DrmSessionException;
|
||||||
import androidx.media3.exoplayer.source.MediaSource;
|
|
||||||
import androidx.media3.exoplayer.source.SampleStream.ReadDataResult;
|
import androidx.media3.exoplayer.source.SampleStream.ReadDataResult;
|
||||||
import androidx.media3.exoplayer.video.VideoRendererEventListener.EventDispatcher;
|
import androidx.media3.exoplayer.video.VideoRendererEventListener.EventDispatcher;
|
||||||
import java.lang.annotation.Documented;
|
import java.lang.annotation.Documented;
|
||||||
@ -335,17 +334,13 @@ public abstract class DecoderVideoRenderer extends BaseRenderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStreamChanged(
|
protected void onStreamChanged(Format[] formats, long startPositionUs, long offsetUs)
|
||||||
Format[] formats,
|
|
||||||
long startPositionUs,
|
|
||||||
long offsetUs,
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId)
|
|
||||||
throws ExoPlaybackException {
|
throws ExoPlaybackException {
|
||||||
// TODO: This shouldn't just update the output stream offset as long as there are still buffers
|
// TODO: This shouldn't just update the output stream offset as long as there are still buffers
|
||||||
// of the previous stream in the decoder. It should also make sure to render the first frame of
|
// of the previous stream in the decoder. It should also make sure to render the first frame of
|
||||||
// the next stream if the playback position reached the new stream.
|
// the next stream if the playback position reached the new stream.
|
||||||
outputStreamOffsetUs = offsetUs;
|
outputStreamOffsetUs = offsetUs;
|
||||||
super.onStreamChanged(formats, startPositionUs, offsetUs, mediaPeriodId);
|
super.onStreamChanged(formats, startPositionUs, offsetUs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -28,7 +28,6 @@ import androidx.media3.exoplayer.ExoPlaybackException;
|
|||||||
import androidx.media3.exoplayer.FormatHolder;
|
import androidx.media3.exoplayer.FormatHolder;
|
||||||
import androidx.media3.exoplayer.Renderer;
|
import androidx.media3.exoplayer.Renderer;
|
||||||
import androidx.media3.exoplayer.RendererCapabilities;
|
import androidx.media3.exoplayer.RendererCapabilities;
|
||||||
import androidx.media3.exoplayer.source.MediaSource;
|
|
||||||
import androidx.media3.exoplayer.source.SampleStream.ReadDataResult;
|
import androidx.media3.exoplayer.source.SampleStream.ReadDataResult;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
@ -76,11 +75,7 @@ public final class CameraMotionRenderer extends BaseRenderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStreamChanged(
|
protected void onStreamChanged(Format[] formats, long startPositionUs, long offsetUs) {
|
||||||
Format[] formats,
|
|
||||||
long startPositionUs,
|
|
||||||
long offsetUs,
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId) {
|
|
||||||
this.offsetUs = offsetUs;
|
this.offsetUs = offsetUs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,6 +49,7 @@ import static androidx.media3.common.Player.COMMAND_SET_TRACK_SELECTION_PARAMETE
|
|||||||
import static androidx.media3.common.Player.COMMAND_SET_VIDEO_SURFACE;
|
import static androidx.media3.common.Player.COMMAND_SET_VIDEO_SURFACE;
|
||||||
import static androidx.media3.common.Player.COMMAND_SET_VOLUME;
|
import static androidx.media3.common.Player.COMMAND_SET_VOLUME;
|
||||||
import static androidx.media3.common.Player.COMMAND_STOP;
|
import static androidx.media3.common.Player.COMMAND_STOP;
|
||||||
|
import static androidx.media3.common.Player.STATE_ENDED;
|
||||||
import static androidx.media3.exoplayer.source.ads.ServerSideAdInsertionUtil.addAdGroupToAdPlaybackState;
|
import static androidx.media3.exoplayer.source.ads.ServerSideAdInsertionUtil.addAdGroupToAdPlaybackState;
|
||||||
import static androidx.media3.test.utils.FakeSampleStream.FakeSampleStreamItem.END_OF_STREAM_ITEM;
|
import static androidx.media3.test.utils.FakeSampleStream.FakeSampleStreamItem.END_OF_STREAM_ITEM;
|
||||||
import static androidx.media3.test.utils.FakeSampleStream.FakeSampleStreamItem.oneByteSample;
|
import static androidx.media3.test.utils.FakeSampleStream.FakeSampleStreamItem.oneByteSample;
|
||||||
@ -409,7 +410,7 @@ public final class ExoPlayerTest {
|
|||||||
playerListenerOrder.verify(mockPlayerListener).onVideoSizeChanged(new VideoSize(1280, 720));
|
playerListenerOrder.verify(mockPlayerListener).onVideoSizeChanged(new VideoSize(1280, 720));
|
||||||
playerListenerOrder.verify(mockPlayerListener).onVideoSizeChanged(VideoSize.UNKNOWN);
|
playerListenerOrder.verify(mockPlayerListener).onVideoSizeChanged(VideoSize.UNKNOWN);
|
||||||
playerListenerOrder.verify(mockPlayerListener).onVideoSizeChanged(new VideoSize(1280, 720));
|
playerListenerOrder.verify(mockPlayerListener).onVideoSizeChanged(new VideoSize(1280, 720));
|
||||||
playerListenerOrder.verify(mockPlayerListener).onPlaybackStateChanged(Player.STATE_ENDED);
|
playerListenerOrder.verify(mockPlayerListener).onPlaybackStateChanged(STATE_ENDED);
|
||||||
verify(mockPlayerListener, times(3)).onVideoSizeChanged(any());
|
verify(mockPlayerListener, times(3)).onVideoSizeChanged(any());
|
||||||
// Verify calls to analytics listener.
|
// Verify calls to analytics listener.
|
||||||
verify(mockAnalyticsListener, times(2)).onVideoEnabled(any(), any());
|
verify(mockAnalyticsListener, times(2)).onVideoEnabled(any(), any());
|
||||||
@ -3411,7 +3412,7 @@ public final class ExoPlayerTest {
|
|||||||
player.setMediaSource(new FakeMediaSource());
|
player.setMediaSource(new FakeMediaSource());
|
||||||
player.prepare();
|
player.prepare();
|
||||||
player.play();
|
player.play();
|
||||||
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED);
|
TestPlayerRunHelper.runUntilPlaybackState(player, STATE_ENDED);
|
||||||
// Now the player, which had a playback error, was re-prepared causing the error to be cleared.
|
// Now the player, which had a playback error, was re-prepared causing the error to be cleared.
|
||||||
// We expect the change to null to be notified, but not onPlayerError.
|
// We expect the change to null to be notified, but not onPlayerError.
|
||||||
verify(mockListener).onPlayerErrorChanged(ArgumentMatchers.isNull());
|
verify(mockListener).onPlayerErrorChanged(ArgumentMatchers.isNull());
|
||||||
@ -8903,8 +8904,7 @@ public final class ExoPlayerTest {
|
|||||||
boolean pendingFirstBufferTime = false;
|
boolean pendingFirstBufferTime = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStreamChanged(
|
protected void onStreamChanged(Format[] formats, long startPositionUs, long offsetUs) {
|
||||||
Format[] formats, long startPositionUs, long offsetUs, MediaPeriodId mediaPeriodId) {
|
|
||||||
rendererStreamOffsetsUs.add(offsetUs);
|
rendererStreamOffsetsUs.add(offsetUs);
|
||||||
pendingFirstBufferTime = true;
|
pendingFirstBufferTime = true;
|
||||||
}
|
}
|
||||||
@ -10592,8 +10592,7 @@ public final class ExoPlayerTest {
|
|||||||
private long positionUs;
|
private long positionUs;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStreamChanged(
|
protected void onStreamChanged(Format[] formats, long startPositionUs, long offsetUs) {
|
||||||
Format[] formats, long startPositionUs, long offsetUs, MediaPeriodId mediaPeriodId) {
|
|
||||||
this.positionUs = offsetUs;
|
this.positionUs = offsetUs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12873,12 +12872,9 @@ public final class ExoPlayerTest {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStreamChanged(
|
protected void onStreamChanged(
|
||||||
Format[] formats,
|
Format[] formats, long startPositionUs, long offsetUs)
|
||||||
long startPositionUs,
|
|
||||||
long offsetUs,
|
|
||||||
MediaPeriodId mediaPeriodId)
|
|
||||||
throws ExoPlaybackException {
|
throws ExoPlaybackException {
|
||||||
super.onStreamChanged(formats, startPositionUs, offsetUs, mediaPeriodId);
|
super.onStreamChanged(formats, startPositionUs, offsetUs);
|
||||||
streamChangeCount++;
|
streamChangeCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -13855,10 +13851,9 @@ public final class ExoPlayerTest {
|
|||||||
FakeRenderer newlyEnabledRenderer =
|
FakeRenderer newlyEnabledRenderer =
|
||||||
new FakeRenderer(C.TRACK_TYPE_AUDIO) {
|
new FakeRenderer(C.TRACK_TYPE_AUDIO) {
|
||||||
@Override
|
@Override
|
||||||
protected void onStreamChanged(
|
protected void onStreamChanged(Format[] formats, long startPositionUs, long offsetUs)
|
||||||
Format[] formats, long startPositionUs, long offsetUs, MediaPeriodId mediaPeriodId)
|
|
||||||
throws ExoPlaybackException {
|
throws ExoPlaybackException {
|
||||||
super.onStreamChanged(formats, startPositionUs, offsetUs, mediaPeriodId);
|
super.onStreamChanged(formats, startPositionUs, offsetUs);
|
||||||
startPositionInRendererUs.set(startPositionUs);
|
startPositionInRendererUs.set(startPositionUs);
|
||||||
rendererOffsetUs.set(offsetUs);
|
rendererOffsetUs.set(offsetUs);
|
||||||
}
|
}
|
||||||
@ -13887,7 +13882,7 @@ public final class ExoPlayerTest {
|
|||||||
.setTrackTypeDisabled(C.TRACK_TYPE_AUDIO, /* disabled= */ false)
|
.setTrackTypeDisabled(C.TRACK_TYPE_AUDIO, /* disabled= */ false)
|
||||||
.build());
|
.build());
|
||||||
player.play();
|
player.play();
|
||||||
runUntilPlaybackState(player, Player.STATE_ENDED);
|
runUntilPlaybackState(player, STATE_ENDED);
|
||||||
player.release();
|
player.release();
|
||||||
|
|
||||||
long expectedStartPositionInRendererUs =
|
long expectedStartPositionInRendererUs =
|
||||||
@ -13897,60 +13892,6 @@ public final class ExoPlayerTest {
|
|||||||
assertThat(startPositionInRendererUs.get()).isEqualTo(expectedStartPositionInRendererUs);
|
assertThat(startPositionInRendererUs.get()).isEqualTo(expectedStartPositionInRendererUs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void newlyEnabledRenderer_timelineIsSetBeforeEnable()
|
|
||||||
throws TimeoutException, ExoPlaybackException {
|
|
||||||
MediaItem mediaItem = MediaItem.fromUri(SAMPLE_URI);
|
|
||||||
ArrayList<Timeline> timelineOnEnabled = new ArrayList<>();
|
|
||||||
FakeRenderer videoRenderer =
|
|
||||||
new FakeRenderer(C.TRACK_TYPE_VIDEO) {
|
|
||||||
@Override
|
|
||||||
protected void onEnabled(boolean joining, boolean mayRenderStartOfStream) {
|
|
||||||
timelineOnEnabled.add(getTimeline());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
ExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(videoRenderer).build();
|
|
||||||
player.addMediaItem(mediaItem);
|
|
||||||
player.prepare();
|
|
||||||
|
|
||||||
runUntilPlaybackState(player, Player.STATE_READY);
|
|
||||||
player.release();
|
|
||||||
|
|
||||||
assertThat(timelineOnEnabled).hasSize(1);
|
|
||||||
Timeline timeline = timelineOnEnabled.get(0);
|
|
||||||
assertThat(timeline.getWindowCount()).isEqualTo(1);
|
|
||||||
assertThat(timeline.getWindow(0, new Window()).mediaItem).isSameInstanceAs(mediaItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void changeMediaItemMidPlayback_rendererReceivesNewTimelineBeforeStreamChange()
|
|
||||||
throws TimeoutException {
|
|
||||||
MediaItem mediaItem1 = MediaItem.fromUri(SAMPLE_URI);
|
|
||||||
MediaItem mediaItem2 = MediaItem.fromUri(SAMPLE_URI);
|
|
||||||
ArrayList<Timeline> timelinesOnStreamChange = new ArrayList<>();
|
|
||||||
FakeRenderer videoRenderer =
|
|
||||||
new FakeRenderer(C.TRACK_TYPE_VIDEO) {
|
|
||||||
@Override
|
|
||||||
protected void onStreamChanged(
|
|
||||||
Format[] formats, long startPositionUs, long offsetUs, MediaPeriodId mediaPeriodId) {
|
|
||||||
timelinesOnStreamChange.add(getTimeline());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
ExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(videoRenderer).build();
|
|
||||||
player.addMediaItem(mediaItem1);
|
|
||||||
player.prepare();
|
|
||||||
runUntilPlaybackState(player, Player.STATE_READY);
|
|
||||||
player.setMediaItem(mediaItem2);
|
|
||||||
runUntilPlaybackState(player, Player.STATE_READY);
|
|
||||||
player.release();
|
|
||||||
|
|
||||||
assertThat(timelinesOnStreamChange).hasSize(2);
|
|
||||||
assertThat(timelinesOnStreamChange.get(0).getWindow(0, new Window()).mediaItem)
|
|
||||||
.isSameInstanceAs(mediaItem1);
|
|
||||||
assertThat(timelinesOnStreamChange.get(1).getWindow(0, new Window()).mediaItem)
|
|
||||||
.isSameInstanceAs(mediaItem2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Internal methods.
|
// Internal methods.
|
||||||
|
|
||||||
private void addWatchAsSystemFeature() {
|
private void addWatchAsSystemFeature() {
|
||||||
|
@ -45,7 +45,6 @@ import androidx.media3.exoplayer.RendererConfiguration;
|
|||||||
import androidx.media3.exoplayer.analytics.PlayerId;
|
import androidx.media3.exoplayer.analytics.PlayerId;
|
||||||
import androidx.media3.exoplayer.drm.DrmSessionEventListener;
|
import androidx.media3.exoplayer.drm.DrmSessionEventListener;
|
||||||
import androidx.media3.exoplayer.drm.DrmSessionManager;
|
import androidx.media3.exoplayer.drm.DrmSessionManager;
|
||||||
import androidx.media3.exoplayer.source.MediaSource;
|
|
||||||
import androidx.media3.exoplayer.upstream.DefaultAllocator;
|
import androidx.media3.exoplayer.upstream.DefaultAllocator;
|
||||||
import androidx.media3.test.utils.FakeSampleStream;
|
import androidx.media3.test.utils.FakeSampleStream;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
@ -135,8 +134,7 @@ public class DecoderAudioRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
audioRenderer.setCurrentStreamFinal();
|
audioRenderer.setCurrentStreamFinal();
|
||||||
when(mockAudioSink.isEnded()).thenReturn(true);
|
when(mockAudioSink.isEnded()).thenReturn(true);
|
||||||
while (!audioRenderer.isEnded()) {
|
while (!audioRenderer.isEnded()) {
|
||||||
@ -174,8 +172,7 @@ public class DecoderAudioRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
|
|
||||||
audioRenderer.setCurrentStreamFinal();
|
audioRenderer.setCurrentStreamFinal();
|
||||||
while (!audioRenderer.isEnded()) {
|
while (!audioRenderer.isEnded()) {
|
||||||
@ -218,7 +215,6 @@ public class DecoderAudioRendererTest {
|
|||||||
oneByteSample(/* timeUs= */ 1_001_000),
|
oneByteSample(/* timeUs= */ 1_001_000),
|
||||||
END_OF_STREAM_ITEM));
|
END_OF_STREAM_ITEM));
|
||||||
fakeSampleStream2.writeData(/* startPositionUs= */ 0);
|
fakeSampleStream2.writeData(/* startPositionUs= */ 0);
|
||||||
MediaSource.MediaPeriodId mediaPeriodId = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
audioRenderer.enable(
|
audioRenderer.enable(
|
||||||
RendererConfiguration.DEFAULT,
|
RendererConfiguration.DEFAULT,
|
||||||
new Format[] {FORMAT},
|
new Format[] {FORMAT},
|
||||||
@ -227,8 +223,7 @@ public class DecoderAudioRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
mediaPeriodId);
|
|
||||||
|
|
||||||
while (!audioRenderer.hasReadStreamToEnd()) {
|
while (!audioRenderer.hasReadStreamToEnd()) {
|
||||||
audioRenderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
audioRenderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
||||||
@ -237,8 +232,7 @@ public class DecoderAudioRendererTest {
|
|||||||
new Format[] {FORMAT},
|
new Format[] {FORMAT},
|
||||||
fakeSampleStream2,
|
fakeSampleStream2,
|
||||||
/* startPositionUs= */ 1_000_000,
|
/* startPositionUs= */ 1_000_000,
|
||||||
/* offsetUs= */ 1_000_000,
|
/* offsetUs= */ 1_000_000);
|
||||||
mediaPeriodId);
|
|
||||||
audioRenderer.setCurrentStreamFinal();
|
audioRenderer.setCurrentStreamFinal();
|
||||||
while (!audioRenderer.isEnded()) {
|
while (!audioRenderer.isEnded()) {
|
||||||
audioRenderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
audioRenderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
||||||
|
@ -49,7 +49,6 @@ import androidx.media3.exoplayer.drm.DrmSessionEventListener;
|
|||||||
import androidx.media3.exoplayer.drm.DrmSessionManager;
|
import androidx.media3.exoplayer.drm.DrmSessionManager;
|
||||||
import androidx.media3.exoplayer.mediacodec.MediaCodecInfo;
|
import androidx.media3.exoplayer.mediacodec.MediaCodecInfo;
|
||||||
import androidx.media3.exoplayer.mediacodec.MediaCodecSelector;
|
import androidx.media3.exoplayer.mediacodec.MediaCodecSelector;
|
||||||
import androidx.media3.exoplayer.source.MediaSource;
|
|
||||||
import androidx.media3.exoplayer.upstream.DefaultAllocator;
|
import androidx.media3.exoplayer.upstream.DefaultAllocator;
|
||||||
import androidx.media3.test.utils.FakeSampleStream;
|
import androidx.media3.test.utils.FakeSampleStream;
|
||||||
import androidx.media3.test.utils.TestUtil;
|
import androidx.media3.test.utils.TestUtil;
|
||||||
@ -192,8 +191,7 @@ public class MediaCodecAudioRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ false,
|
/* mayRenderStartOfStream= */ false,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
|
|
||||||
mediaCodecAudioRenderer.start();
|
mediaCodecAudioRenderer.start();
|
||||||
mediaCodecAudioRenderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
mediaCodecAudioRenderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
||||||
@ -250,8 +248,7 @@ public class MediaCodecAudioRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ false,
|
/* mayRenderStartOfStream= */ false,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
|
|
||||||
mediaCodecAudioRenderer.start();
|
mediaCodecAudioRenderer.start();
|
||||||
mediaCodecAudioRenderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
mediaCodecAudioRenderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
||||||
@ -315,6 +312,7 @@ public class MediaCodecAudioRendererTest {
|
|||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
oneByteSample(/* timeUs= */ 0, C.BUFFER_FLAG_KEY_FRAME), END_OF_STREAM_ITEM));
|
oneByteSample(/* timeUs= */ 0, C.BUFFER_FLAG_KEY_FRAME), END_OF_STREAM_ITEM));
|
||||||
fakeSampleStream.writeData(/* startPositionUs= */ 0);
|
fakeSampleStream.writeData(/* startPositionUs= */ 0);
|
||||||
|
|
||||||
exceptionThrowingRenderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT);
|
exceptionThrowingRenderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT);
|
||||||
exceptionThrowingRenderer.enable(
|
exceptionThrowingRenderer.enable(
|
||||||
RendererConfiguration.DEFAULT,
|
RendererConfiguration.DEFAULT,
|
||||||
@ -324,8 +322,7 @@ public class MediaCodecAudioRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ false,
|
/* mayRenderStartOfStream= */ false,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
|
|
||||||
exceptionThrowingRenderer.start();
|
exceptionThrowingRenderer.start();
|
||||||
exceptionThrowingRenderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
exceptionThrowingRenderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
||||||
@ -406,7 +403,6 @@ public class MediaCodecAudioRendererTest {
|
|||||||
oneByteSample(/* timeUs= */ 1_001_000),
|
oneByteSample(/* timeUs= */ 1_001_000),
|
||||||
END_OF_STREAM_ITEM));
|
END_OF_STREAM_ITEM));
|
||||||
fakeSampleStream2.writeData(/* startPositionUs= */ 0);
|
fakeSampleStream2.writeData(/* startPositionUs= */ 0);
|
||||||
MediaSource.MediaPeriodId mediaPeriodId = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
mediaCodecAudioRenderer.enable(
|
mediaCodecAudioRenderer.enable(
|
||||||
RendererConfiguration.DEFAULT,
|
RendererConfiguration.DEFAULT,
|
||||||
new Format[] {AUDIO_AAC},
|
new Format[] {AUDIO_AAC},
|
||||||
@ -415,8 +411,7 @@ public class MediaCodecAudioRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
mediaPeriodId);
|
|
||||||
|
|
||||||
mediaCodecAudioRenderer.start();
|
mediaCodecAudioRenderer.start();
|
||||||
while (!mediaCodecAudioRenderer.hasReadStreamToEnd()) {
|
while (!mediaCodecAudioRenderer.hasReadStreamToEnd()) {
|
||||||
@ -426,8 +421,7 @@ public class MediaCodecAudioRendererTest {
|
|||||||
new Format[] {AUDIO_AAC},
|
new Format[] {AUDIO_AAC},
|
||||||
fakeSampleStream2,
|
fakeSampleStream2,
|
||||||
/* startPositionUs= */ 1_000_000,
|
/* startPositionUs= */ 1_000_000,
|
||||||
/* offsetUs= */ 1_000_000,
|
/* offsetUs= */ 1_000_000);
|
||||||
mediaPeriodId);
|
|
||||||
mediaCodecAudioRenderer.setCurrentStreamFinal();
|
mediaCodecAudioRenderer.setCurrentStreamFinal();
|
||||||
while (!mediaCodecAudioRenderer.isEnded()) {
|
while (!mediaCodecAudioRenderer.isEnded()) {
|
||||||
mediaCodecAudioRenderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
mediaCodecAudioRenderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
||||||
@ -493,6 +487,7 @@ public class MediaCodecAudioRendererTest {
|
|||||||
oneByteSample(/* timeUs= */ 1_000),
|
oneByteSample(/* timeUs= */ 1_000),
|
||||||
END_OF_STREAM_ITEM));
|
END_OF_STREAM_ITEM));
|
||||||
fakeSampleStream.writeData(/* startPositionUs= */ 0);
|
fakeSampleStream.writeData(/* startPositionUs= */ 0);
|
||||||
|
|
||||||
mediaCodecAudioRenderer.enable(
|
mediaCodecAudioRenderer.enable(
|
||||||
RENDERER_CONFIGURATION_OFFLOAD_ENABLED_GAPLESS_REQUIRED,
|
RENDERER_CONFIGURATION_OFFLOAD_ENABLED_GAPLESS_REQUIRED,
|
||||||
new Format[] {format},
|
new Format[] {format},
|
||||||
@ -501,8 +496,7 @@ public class MediaCodecAudioRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
mediaCodecAudioRenderer.start();
|
mediaCodecAudioRenderer.start();
|
||||||
mediaCodecAudioRenderer.setCurrentStreamFinal();
|
mediaCodecAudioRenderer.setCurrentStreamFinal();
|
||||||
|
|
||||||
@ -531,6 +525,7 @@ public class MediaCodecAudioRendererTest {
|
|||||||
oneByteSample(/* timeUs= */ 1_000),
|
oneByteSample(/* timeUs= */ 1_000),
|
||||||
END_OF_STREAM_ITEM));
|
END_OF_STREAM_ITEM));
|
||||||
fakeSampleStream.writeData(/* startPositionUs= */ 0);
|
fakeSampleStream.writeData(/* startPositionUs= */ 0);
|
||||||
|
|
||||||
mediaCodecAudioRenderer.enable(
|
mediaCodecAudioRenderer.enable(
|
||||||
RENDERER_CONFIGURATION_OFFLOAD_ENABLED_GAPLESS_REQUIRED,
|
RENDERER_CONFIGURATION_OFFLOAD_ENABLED_GAPLESS_REQUIRED,
|
||||||
new Format[] {format},
|
new Format[] {format},
|
||||||
@ -539,8 +534,7 @@ public class MediaCodecAudioRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
mediaCodecAudioRenderer.start();
|
mediaCodecAudioRenderer.start();
|
||||||
mediaCodecAudioRenderer.setCurrentStreamFinal();
|
mediaCodecAudioRenderer.setCurrentStreamFinal();
|
||||||
|
|
||||||
@ -581,7 +575,6 @@ public class MediaCodecAudioRendererTest {
|
|||||||
oneByteSample(/* timeUs= */ 1_001_000),
|
oneByteSample(/* timeUs= */ 1_001_000),
|
||||||
END_OF_STREAM_ITEM));
|
END_OF_STREAM_ITEM));
|
||||||
fakeSampleStream2.writeData(/* startPositionUs= */ 0);
|
fakeSampleStream2.writeData(/* startPositionUs= */ 0);
|
||||||
MediaSource.MediaPeriodId mediaPeriodId = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
mediaCodecAudioRenderer.enable(
|
mediaCodecAudioRenderer.enable(
|
||||||
RENDERER_CONFIGURATION_OFFLOAD_ENABLED_GAPLESS_REQUIRED,
|
RENDERER_CONFIGURATION_OFFLOAD_ENABLED_GAPLESS_REQUIRED,
|
||||||
new Format[] {format1},
|
new Format[] {format1},
|
||||||
@ -590,8 +583,7 @@ public class MediaCodecAudioRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
mediaPeriodId);
|
|
||||||
mediaCodecAudioRenderer.start();
|
mediaCodecAudioRenderer.start();
|
||||||
while (!mediaCodecAudioRenderer.hasReadStreamToEnd()) {
|
while (!mediaCodecAudioRenderer.hasReadStreamToEnd()) {
|
||||||
mediaCodecAudioRenderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
mediaCodecAudioRenderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
||||||
@ -601,8 +593,7 @@ public class MediaCodecAudioRendererTest {
|
|||||||
new Format[] {format2},
|
new Format[] {format2},
|
||||||
fakeSampleStream2,
|
fakeSampleStream2,
|
||||||
/* startPositionUs= */ 1_000_000,
|
/* startPositionUs= */ 1_000_000,
|
||||||
/* offsetUs= */ 1_000_000,
|
/* offsetUs= */ 1_000_000);
|
||||||
mediaPeriodId);
|
|
||||||
mediaCodecAudioRenderer.setCurrentStreamFinal();
|
mediaCodecAudioRenderer.setCurrentStreamFinal();
|
||||||
while (!mediaCodecAudioRenderer.isEnded()) {
|
while (!mediaCodecAudioRenderer.isEnded()) {
|
||||||
mediaCodecAudioRenderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
mediaCodecAudioRenderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
||||||
@ -643,9 +634,6 @@ public class MediaCodecAudioRendererTest {
|
|||||||
oneByteSample(/* timeUs= */ 1_001_000),
|
oneByteSample(/* timeUs= */ 1_001_000),
|
||||||
END_OF_STREAM_ITEM));
|
END_OF_STREAM_ITEM));
|
||||||
fakeSampleStream2.writeData(/* startPositionUs= */ 0);
|
fakeSampleStream2.writeData(/* startPositionUs= */ 0);
|
||||||
MediaSource.MediaPeriodId mediaPeriodId1 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId2 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
|
|
||||||
mediaCodecAudioRenderer.enable(
|
mediaCodecAudioRenderer.enable(
|
||||||
RENDERER_CONFIGURATION_OFFLOAD_ENABLED_GAPLESS_REQUIRED,
|
RENDERER_CONFIGURATION_OFFLOAD_ENABLED_GAPLESS_REQUIRED,
|
||||||
new Format[] {format1},
|
new Format[] {format1},
|
||||||
@ -654,8 +642,7 @@ public class MediaCodecAudioRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
mediaPeriodId1);
|
|
||||||
mediaCodecAudioRenderer.start();
|
mediaCodecAudioRenderer.start();
|
||||||
while (!mediaCodecAudioRenderer.hasReadStreamToEnd()) {
|
while (!mediaCodecAudioRenderer.hasReadStreamToEnd()) {
|
||||||
mediaCodecAudioRenderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
mediaCodecAudioRenderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
||||||
@ -666,8 +653,7 @@ public class MediaCodecAudioRendererTest {
|
|||||||
new Format[] {format2},
|
new Format[] {format2},
|
||||||
fakeSampleStream2,
|
fakeSampleStream2,
|
||||||
/* startPositionUs= */ 1_000_000,
|
/* startPositionUs= */ 1_000_000,
|
||||||
/* offsetUs= */ 1_000_000,
|
/* offsetUs= */ 1_000_000);
|
||||||
mediaPeriodId2);
|
|
||||||
mediaCodecAudioRenderer.setCurrentStreamFinal();
|
mediaCodecAudioRenderer.setCurrentStreamFinal();
|
||||||
while (!mediaCodecAudioRenderer.isEnded()) {
|
while (!mediaCodecAudioRenderer.isEnded()) {
|
||||||
mediaCodecAudioRenderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
mediaCodecAudioRenderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
||||||
@ -707,8 +693,7 @@ public class MediaCodecAudioRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ false,
|
/* mayRenderStartOfStream= */ false,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
mediaCodecAudioRenderer.setCurrentStreamFinal();
|
mediaCodecAudioRenderer.setCurrentStreamFinal();
|
||||||
while (!mediaCodecAudioRenderer.isEnded()) {
|
while (!mediaCodecAudioRenderer.isEnded()) {
|
||||||
mediaCodecAudioRenderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
mediaCodecAudioRenderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
||||||
|
@ -29,7 +29,6 @@ import androidx.media3.exoplayer.RendererConfiguration;
|
|||||||
import androidx.media3.exoplayer.analytics.PlayerId;
|
import androidx.media3.exoplayer.analytics.PlayerId;
|
||||||
import androidx.media3.exoplayer.drm.DrmSessionEventListener;
|
import androidx.media3.exoplayer.drm.DrmSessionEventListener;
|
||||||
import androidx.media3.exoplayer.drm.DrmSessionManager;
|
import androidx.media3.exoplayer.drm.DrmSessionManager;
|
||||||
import androidx.media3.exoplayer.source.MediaSource;
|
|
||||||
import androidx.media3.exoplayer.upstream.DefaultAllocator;
|
import androidx.media3.exoplayer.upstream.DefaultAllocator;
|
||||||
import androidx.media3.test.utils.FakeSampleStream;
|
import androidx.media3.test.utils.FakeSampleStream;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
@ -94,8 +93,7 @@ public class ImageRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
renderer.setCurrentStreamFinal();
|
renderer.setCurrentStreamFinal();
|
||||||
|
|
||||||
while (!renderer.isReady()) {
|
while (!renderer.isReady()) {
|
||||||
|
@ -41,7 +41,6 @@ import androidx.media3.exoplayer.RendererConfiguration;
|
|||||||
import androidx.media3.exoplayer.analytics.PlayerId;
|
import androidx.media3.exoplayer.analytics.PlayerId;
|
||||||
import androidx.media3.exoplayer.drm.DrmSessionEventListener;
|
import androidx.media3.exoplayer.drm.DrmSessionEventListener;
|
||||||
import androidx.media3.exoplayer.drm.DrmSessionManager;
|
import androidx.media3.exoplayer.drm.DrmSessionManager;
|
||||||
import androidx.media3.exoplayer.source.MediaSource;
|
|
||||||
import androidx.media3.exoplayer.upstream.DefaultAllocator;
|
import androidx.media3.exoplayer.upstream.DefaultAllocator;
|
||||||
import androidx.media3.test.utils.FakeSampleStream;
|
import androidx.media3.test.utils.FakeSampleStream;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
@ -67,8 +66,6 @@ public class MediaCodecRendererTest {
|
|||||||
createFakeSampleStream(format1, /* sampleTimesUs...= */ 0, 100, 200, 300);
|
createFakeSampleStream(format1, /* sampleTimesUs...= */ 0, 100, 200, 300);
|
||||||
FakeSampleStream fakeSampleStream2 =
|
FakeSampleStream fakeSampleStream2 =
|
||||||
createFakeSampleStream(format2, /* sampleTimesUs...= */ 0, 100, 200);
|
createFakeSampleStream(format2, /* sampleTimesUs...= */ 0, 100, 200);
|
||||||
MediaSource.MediaPeriodId mediaPeriodId1 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId2 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
MediaCodecRenderer renderer = spy(new TestRenderer());
|
MediaCodecRenderer renderer = spy(new TestRenderer());
|
||||||
renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT);
|
renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT);
|
||||||
|
|
||||||
@ -80,8 +77,7 @@ public class MediaCodecRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
mediaPeriodId1);
|
|
||||||
renderer.start();
|
renderer.start();
|
||||||
long positionUs = 0;
|
long positionUs = 0;
|
||||||
while (!renderer.hasReadStreamToEnd()) {
|
while (!renderer.hasReadStreamToEnd()) {
|
||||||
@ -89,11 +85,7 @@ public class MediaCodecRendererTest {
|
|||||||
positionUs += 100;
|
positionUs += 100;
|
||||||
}
|
}
|
||||||
renderer.replaceStream(
|
renderer.replaceStream(
|
||||||
new Format[] {format2},
|
new Format[] {format2}, fakeSampleStream2, /* startPositionUs= */ 400, /* offsetUs= */ 400);
|
||||||
fakeSampleStream2,
|
|
||||||
/* startPositionUs= */ 400,
|
|
||||||
/* offsetUs= */ 400,
|
|
||||||
mediaPeriodId2);
|
|
||||||
renderer.setCurrentStreamFinal();
|
renderer.setCurrentStreamFinal();
|
||||||
while (!renderer.isEnded()) {
|
while (!renderer.isEnded()) {
|
||||||
renderer.render(positionUs, SystemClock.elapsedRealtime());
|
renderer.render(positionUs, SystemClock.elapsedRealtime());
|
||||||
@ -127,8 +119,6 @@ public class MediaCodecRendererTest {
|
|||||||
createFakeSampleStream(format1, /* sampleTimesUs...= */ 0, 100, 200, 300, 400, 500, 600);
|
createFakeSampleStream(format1, /* sampleTimesUs...= */ 0, 100, 200, 300, 400, 500, 600);
|
||||||
FakeSampleStream fakeSampleStream2 =
|
FakeSampleStream fakeSampleStream2 =
|
||||||
createFakeSampleStream(format2, /* sampleTimesUs...= */ 0, 100, 200);
|
createFakeSampleStream(format2, /* sampleTimesUs...= */ 0, 100, 200);
|
||||||
MediaSource.MediaPeriodId mediaPeriodId1 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId2 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
MediaCodecRenderer renderer = spy(new TestRenderer());
|
MediaCodecRenderer renderer = spy(new TestRenderer());
|
||||||
renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT);
|
renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT);
|
||||||
|
|
||||||
@ -140,8 +130,7 @@ public class MediaCodecRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
mediaPeriodId1);
|
|
||||||
renderer.start();
|
renderer.start();
|
||||||
long positionUs = 0;
|
long positionUs = 0;
|
||||||
while (!renderer.hasReadStreamToEnd()) {
|
while (!renderer.hasReadStreamToEnd()) {
|
||||||
@ -149,11 +138,7 @@ public class MediaCodecRendererTest {
|
|||||||
positionUs += 100;
|
positionUs += 100;
|
||||||
}
|
}
|
||||||
renderer.replaceStream(
|
renderer.replaceStream(
|
||||||
new Format[] {format2},
|
new Format[] {format2}, fakeSampleStream2, /* startPositionUs= */ 400, /* offsetUs= */ 400);
|
||||||
fakeSampleStream2,
|
|
||||||
/* startPositionUs= */ 400,
|
|
||||||
/* offsetUs= */ 400,
|
|
||||||
mediaPeriodId2);
|
|
||||||
renderer.setCurrentStreamFinal();
|
renderer.setCurrentStreamFinal();
|
||||||
while (!renderer.isEnded()) {
|
while (!renderer.isEnded()) {
|
||||||
renderer.render(positionUs, SystemClock.elapsedRealtime());
|
renderer.render(positionUs, SystemClock.elapsedRealtime());
|
||||||
@ -190,8 +175,6 @@ public class MediaCodecRendererTest {
|
|||||||
createFakeSampleStream(format1, /* sampleTimesUs...= */ 0, 100, 200, 300);
|
createFakeSampleStream(format1, /* sampleTimesUs...= */ 0, 100, 200, 300);
|
||||||
FakeSampleStream fakeSampleStream2 =
|
FakeSampleStream fakeSampleStream2 =
|
||||||
createFakeSampleStream(format2, /* sampleTimesUs...= */ 0, 100, 200, 300, 400);
|
createFakeSampleStream(format2, /* sampleTimesUs...= */ 0, 100, 200, 300, 400);
|
||||||
MediaSource.MediaPeriodId mediaPeriodId1 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId2 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
MediaCodecRenderer renderer = spy(new TestRenderer());
|
MediaCodecRenderer renderer = spy(new TestRenderer());
|
||||||
renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT);
|
renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT);
|
||||||
|
|
||||||
@ -203,8 +186,7 @@ public class MediaCodecRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
mediaPeriodId1);
|
|
||||||
renderer.start();
|
renderer.start();
|
||||||
long positionUs = 0;
|
long positionUs = 0;
|
||||||
while (!renderer.hasReadStreamToEnd()) {
|
while (!renderer.hasReadStreamToEnd()) {
|
||||||
@ -212,11 +194,7 @@ public class MediaCodecRendererTest {
|
|||||||
positionUs += 100;
|
positionUs += 100;
|
||||||
}
|
}
|
||||||
renderer.replaceStream(
|
renderer.replaceStream(
|
||||||
new Format[] {format2},
|
new Format[] {format2}, fakeSampleStream2, /* startPositionUs= */ 400, /* offsetUs= */ 200);
|
||||||
fakeSampleStream2,
|
|
||||||
/* startPositionUs= */ 400,
|
|
||||||
/* offsetUs= */ 200,
|
|
||||||
mediaPeriodId2);
|
|
||||||
renderer.setCurrentStreamFinal();
|
renderer.setCurrentStreamFinal();
|
||||||
while (!renderer.isEnded()) {
|
while (!renderer.isEnded()) {
|
||||||
renderer.render(positionUs, SystemClock.elapsedRealtime());
|
renderer.render(positionUs, SystemClock.elapsedRealtime());
|
||||||
@ -251,8 +229,6 @@ public class MediaCodecRendererTest {
|
|||||||
FakeSampleStream fakeSampleStream1 = createFakeSampleStream(format1 /* no samples */);
|
FakeSampleStream fakeSampleStream1 = createFakeSampleStream(format1 /* no samples */);
|
||||||
FakeSampleStream fakeSampleStream2 =
|
FakeSampleStream fakeSampleStream2 =
|
||||||
createFakeSampleStream(format2, /* sampleTimesUs...= */ 0, 100, 200);
|
createFakeSampleStream(format2, /* sampleTimesUs...= */ 0, 100, 200);
|
||||||
MediaSource.MediaPeriodId mediaPeriodId1 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId2 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
MediaCodecRenderer renderer = spy(new TestRenderer());
|
MediaCodecRenderer renderer = spy(new TestRenderer());
|
||||||
renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT);
|
renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT);
|
||||||
|
|
||||||
@ -264,8 +240,7 @@ public class MediaCodecRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
mediaPeriodId1);
|
|
||||||
renderer.start();
|
renderer.start();
|
||||||
long positionUs = 0;
|
long positionUs = 0;
|
||||||
while (!renderer.hasReadStreamToEnd()) {
|
while (!renderer.hasReadStreamToEnd()) {
|
||||||
@ -273,11 +248,7 @@ public class MediaCodecRendererTest {
|
|||||||
positionUs += 100;
|
positionUs += 100;
|
||||||
}
|
}
|
||||||
renderer.replaceStream(
|
renderer.replaceStream(
|
||||||
new Format[] {format2},
|
new Format[] {format2}, fakeSampleStream2, /* startPositionUs= */ 0, /* offsetUs= */ 0);
|
||||||
fakeSampleStream2,
|
|
||||||
/* startPositionUs= */ 0,
|
|
||||||
/* offsetUs= */ 0,
|
|
||||||
mediaPeriodId2);
|
|
||||||
renderer.setCurrentStreamFinal();
|
renderer.setCurrentStreamFinal();
|
||||||
while (!renderer.isEnded()) {
|
while (!renderer.isEnded()) {
|
||||||
renderer.render(positionUs, SystemClock.elapsedRealtime());
|
renderer.render(positionUs, SystemClock.elapsedRealtime());
|
||||||
@ -309,9 +280,6 @@ public class MediaCodecRendererTest {
|
|||||||
FakeSampleStream fakeSampleStream2 = createFakeSampleStream(format2 /* no samples */);
|
FakeSampleStream fakeSampleStream2 = createFakeSampleStream(format2 /* no samples */);
|
||||||
FakeSampleStream fakeSampleStream3 =
|
FakeSampleStream fakeSampleStream3 =
|
||||||
createFakeSampleStream(format3, /* sampleTimesUs...= */ 0, 100, 200);
|
createFakeSampleStream(format3, /* sampleTimesUs...= */ 0, 100, 200);
|
||||||
MediaSource.MediaPeriodId mediaPeriodId1 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId2 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId3 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
MediaCodecRenderer renderer = spy(new TestRenderer());
|
MediaCodecRenderer renderer = spy(new TestRenderer());
|
||||||
renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT);
|
renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT);
|
||||||
|
|
||||||
@ -323,8 +291,7 @@ public class MediaCodecRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
mediaPeriodId1);
|
|
||||||
renderer.start();
|
renderer.start();
|
||||||
long positionUs = 0;
|
long positionUs = 0;
|
||||||
while (!renderer.hasReadStreamToEnd()) {
|
while (!renderer.hasReadStreamToEnd()) {
|
||||||
@ -332,21 +299,13 @@ public class MediaCodecRendererTest {
|
|||||||
positionUs += 100;
|
positionUs += 100;
|
||||||
}
|
}
|
||||||
renderer.replaceStream(
|
renderer.replaceStream(
|
||||||
new Format[] {format2},
|
new Format[] {format2}, fakeSampleStream2, /* startPositionUs= */ 200, /* offsetUs= */ 200);
|
||||||
fakeSampleStream2,
|
|
||||||
/* startPositionUs= */ 200,
|
|
||||||
/* offsetUs= */ 200,
|
|
||||||
mediaPeriodId2);
|
|
||||||
while (!renderer.hasReadStreamToEnd()) {
|
while (!renderer.hasReadStreamToEnd()) {
|
||||||
renderer.render(positionUs, SystemClock.elapsedRealtime());
|
renderer.render(positionUs, SystemClock.elapsedRealtime());
|
||||||
positionUs += 100;
|
positionUs += 100;
|
||||||
}
|
}
|
||||||
renderer.replaceStream(
|
renderer.replaceStream(
|
||||||
new Format[] {format3},
|
new Format[] {format3}, fakeSampleStream3, /* startPositionUs= */ 200, /* offsetUs= */ 200);
|
||||||
fakeSampleStream3,
|
|
||||||
/* startPositionUs= */ 200,
|
|
||||||
/* offsetUs= */ 200,
|
|
||||||
mediaPeriodId3);
|
|
||||||
renderer.setCurrentStreamFinal();
|
renderer.setCurrentStreamFinal();
|
||||||
while (!renderer.isEnded()) {
|
while (!renderer.isEnded()) {
|
||||||
renderer.render(positionUs, SystemClock.elapsedRealtime());
|
renderer.render(positionUs, SystemClock.elapsedRealtime());
|
||||||
@ -375,7 +334,6 @@ public class MediaCodecRendererTest {
|
|||||||
new Format.Builder().setSampleMimeType(MimeTypes.AUDIO_AAC).setAverageBitrate(1000).build();
|
new Format.Builder().setSampleMimeType(MimeTypes.AUDIO_AAC).setAverageBitrate(1000).build();
|
||||||
FakeSampleStream fakeSampleStream =
|
FakeSampleStream fakeSampleStream =
|
||||||
createFakeSampleStream(format, /* sampleTimesUs...= */ 0, 100, 200, 300, 400, 500);
|
createFakeSampleStream(format, /* sampleTimesUs...= */ 0, 100, 200, 300, 400, 500);
|
||||||
MediaSource.MediaPeriodId mediaPeriodId = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
MediaCodecRenderer renderer = spy(new TestRenderer());
|
MediaCodecRenderer renderer = spy(new TestRenderer());
|
||||||
renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT);
|
renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT);
|
||||||
|
|
||||||
@ -387,8 +345,7 @@ public class MediaCodecRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 300,
|
/* startPositionUs= */ 300,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
mediaPeriodId);
|
|
||||||
renderer.start();
|
renderer.start();
|
||||||
renderer.setCurrentStreamFinal();
|
renderer.setCurrentStreamFinal();
|
||||||
long positionUs = 0;
|
long positionUs = 0;
|
||||||
@ -418,7 +375,6 @@ public class MediaCodecRendererTest {
|
|||||||
new Format.Builder().setSampleMimeType(MimeTypes.AUDIO_AAC).setAverageBitrate(1000).build();
|
new Format.Builder().setSampleMimeType(MimeTypes.AUDIO_AAC).setAverageBitrate(1000).build();
|
||||||
FakeSampleStream fakeSampleStream =
|
FakeSampleStream fakeSampleStream =
|
||||||
createFakeSampleStream(format, /* sampleTimesUs...= */ 0, 100, 200, 300, 400, 500);
|
createFakeSampleStream(format, /* sampleTimesUs...= */ 0, 100, 200, 300, 400, 500);
|
||||||
MediaSource.MediaPeriodId mediaPeriodId = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
MediaCodecRenderer renderer = spy(new TestRenderer());
|
MediaCodecRenderer renderer = spy(new TestRenderer());
|
||||||
renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT);
|
renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT);
|
||||||
renderer.enable(
|
renderer.enable(
|
||||||
@ -429,8 +385,7 @@ public class MediaCodecRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 400,
|
/* startPositionUs= */ 400,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
mediaPeriodId);
|
|
||||||
renderer.start();
|
renderer.start();
|
||||||
|
|
||||||
renderer.resetPosition(/* positionUs= */ 200);
|
renderer.resetPosition(/* positionUs= */ 200);
|
||||||
|
@ -29,7 +29,6 @@ import androidx.media3.common.util.Assertions;
|
|||||||
import androidx.media3.exoplayer.ExoPlaybackException;
|
import androidx.media3.exoplayer.ExoPlaybackException;
|
||||||
import androidx.media3.exoplayer.drm.DrmSessionEventListener;
|
import androidx.media3.exoplayer.drm.DrmSessionEventListener;
|
||||||
import androidx.media3.exoplayer.drm.DrmSessionManager;
|
import androidx.media3.exoplayer.drm.DrmSessionManager;
|
||||||
import androidx.media3.exoplayer.source.MediaSource;
|
|
||||||
import androidx.media3.exoplayer.upstream.DefaultAllocator;
|
import androidx.media3.exoplayer.upstream.DefaultAllocator;
|
||||||
import androidx.media3.extractor.metadata.emsg.EventMessage;
|
import androidx.media3.extractor.metadata.emsg.EventMessage;
|
||||||
import androidx.media3.extractor.metadata.emsg.EventMessageEncoder;
|
import androidx.media3.extractor.metadata.emsg.EventMessageEncoder;
|
||||||
@ -170,8 +169,7 @@ public class MetadataRendererTest {
|
|||||||
new Format[] {EMSG_FORMAT},
|
new Format[] {EMSG_FORMAT},
|
||||||
fakeSampleStream,
|
fakeSampleStream,
|
||||||
/* startPositionUs= */ 0L,
|
/* startPositionUs= */ 0L,
|
||||||
/* offsetUs= */ 0L,
|
/* offsetUs= */ 0L);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
|
|
||||||
// Call render() twice, the first call is to read the format and the second call will read the
|
// Call render() twice, the first call is to read the format and the second call will read the
|
||||||
// metadata.
|
// metadata.
|
||||||
@ -210,8 +208,7 @@ public class MetadataRendererTest {
|
|||||||
new Format[] {EMSG_FORMAT},
|
new Format[] {EMSG_FORMAT},
|
||||||
fakeSampleStream,
|
fakeSampleStream,
|
||||||
/* startPositionUs= */ 0L,
|
/* startPositionUs= */ 0L,
|
||||||
/* offsetUs= */ 0L,
|
/* offsetUs= */ 0L);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
|
|
||||||
// Call render() twice, the first call is to read the format and the second call will read the
|
// Call render() twice, the first call is to read the format and the second call will read the
|
||||||
// metadata.
|
// metadata.
|
||||||
@ -249,14 +246,12 @@ public class MetadataRendererTest {
|
|||||||
sample(/* timeUs= */ 200_000, C.BUFFER_FLAG_KEY_FRAME, encodedEmsg),
|
sample(/* timeUs= */ 200_000, C.BUFFER_FLAG_KEY_FRAME, encodedEmsg),
|
||||||
END_OF_STREAM_ITEM));
|
END_OF_STREAM_ITEM));
|
||||||
fakeSampleStream.writeData(/* startPositionUs= */ 0);
|
fakeSampleStream.writeData(/* startPositionUs= */ 0);
|
||||||
MediaSource.MediaPeriodId mediaPeriodId = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
// Start of the first reading period.
|
// Start of the first reading period.
|
||||||
renderer.replaceStream(
|
renderer.replaceStream(
|
||||||
new Format[] {EMSG_FORMAT},
|
new Format[] {EMSG_FORMAT},
|
||||||
fakeSampleStream,
|
fakeSampleStream,
|
||||||
/* startPositionUs= */ 0L,
|
/* startPositionUs= */ 0L,
|
||||||
/* offsetUs= */ 0L,
|
/* offsetUs= */ 0L);
|
||||||
mediaPeriodId);
|
|
||||||
// Read the format
|
// Read the format
|
||||||
renderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
renderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
||||||
|
|
||||||
@ -273,8 +268,7 @@ public class MetadataRendererTest {
|
|||||||
new Format[] {EMSG_FORMAT},
|
new Format[] {EMSG_FORMAT},
|
||||||
fakeSampleStream,
|
fakeSampleStream,
|
||||||
/* startPositionUs= */ 0L,
|
/* startPositionUs= */ 0L,
|
||||||
/* offsetUs= */ 100_000L,
|
/* offsetUs= */ 100_000L);
|
||||||
mediaPeriodId);
|
|
||||||
renderer.render(/* positionUs= */ 199_999, /* elapsedRealtimeUs= */ 0);
|
renderer.render(/* positionUs= */ 199_999, /* elapsedRealtimeUs= */ 0);
|
||||||
assertThat(metadataOutput).hasSize(1);
|
assertThat(metadataOutput).hasSize(1);
|
||||||
|
|
||||||
@ -310,14 +304,12 @@ public class MetadataRendererTest {
|
|||||||
sample(/* timeUs= */ 200_000, C.BUFFER_FLAG_KEY_FRAME, encodedEmsg),
|
sample(/* timeUs= */ 200_000, C.BUFFER_FLAG_KEY_FRAME, encodedEmsg),
|
||||||
END_OF_STREAM_ITEM));
|
END_OF_STREAM_ITEM));
|
||||||
fakeSampleStream.writeData(/* startPositionUs= */ 0);
|
fakeSampleStream.writeData(/* startPositionUs= */ 0);
|
||||||
MediaSource.MediaPeriodId mediaPeriodId = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
// Start of the first reading period.
|
// Start of the first reading period.
|
||||||
renderer.replaceStream(
|
renderer.replaceStream(
|
||||||
new Format[] {EMSG_FORMAT},
|
new Format[] {EMSG_FORMAT},
|
||||||
fakeSampleStream,
|
fakeSampleStream,
|
||||||
/* startPositionUs= */ 0L,
|
/* startPositionUs= */ 0L,
|
||||||
/* offsetUs= */ 100_000L,
|
/* offsetUs= */ 100_000L);
|
||||||
mediaPeriodId);
|
|
||||||
// Read the format
|
// Read the format
|
||||||
renderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
renderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0);
|
||||||
|
|
||||||
@ -334,8 +326,7 @@ public class MetadataRendererTest {
|
|||||||
new Format[] {EMSG_FORMAT},
|
new Format[] {EMSG_FORMAT},
|
||||||
fakeSampleStream,
|
fakeSampleStream,
|
||||||
/* startPositionUs= */ 0L,
|
/* startPositionUs= */ 0L,
|
||||||
/* offsetUs= */ 0L,
|
/* offsetUs= */ 0L);
|
||||||
mediaPeriodId);
|
|
||||||
renderer.render(/* positionUs= */ 299_999, /* elapsedRealtimeUs= */ 0);
|
renderer.render(/* positionUs= */ 299_999, /* elapsedRealtimeUs= */ 0);
|
||||||
assertThat(metadataOutput).hasSize(1);
|
assertThat(metadataOutput).hasSize(1);
|
||||||
|
|
||||||
@ -358,8 +349,7 @@ public class MetadataRendererTest {
|
|||||||
new Format[] {EMSG_FORMAT},
|
new Format[] {EMSG_FORMAT},
|
||||||
fakeSampleStream,
|
fakeSampleStream,
|
||||||
/* startPositionUs= */ 0L,
|
/* startPositionUs= */ 0L,
|
||||||
/* offsetUs= */ 0L,
|
/* offsetUs= */ 0L);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
renderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0); // Read the format
|
renderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0); // Read the format
|
||||||
renderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0); // Read the data
|
renderer.render(/* positionUs= */ 0, /* elapsedRealtimeUs= */ 0); // Read the data
|
||||||
|
|
||||||
|
@ -41,7 +41,6 @@ import androidx.media3.exoplayer.RendererCapabilities;
|
|||||||
import androidx.media3.exoplayer.RendererConfiguration;
|
import androidx.media3.exoplayer.RendererConfiguration;
|
||||||
import androidx.media3.exoplayer.drm.DrmSessionEventListener;
|
import androidx.media3.exoplayer.drm.DrmSessionEventListener;
|
||||||
import androidx.media3.exoplayer.drm.DrmSessionManager;
|
import androidx.media3.exoplayer.drm.DrmSessionManager;
|
||||||
import androidx.media3.exoplayer.source.MediaSource;
|
|
||||||
import androidx.media3.exoplayer.upstream.DefaultAllocator;
|
import androidx.media3.exoplayer.upstream.DefaultAllocator;
|
||||||
import androidx.media3.test.utils.FakeSampleStream;
|
import androidx.media3.test.utils.FakeSampleStream;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
@ -205,8 +204,7 @@ public final class DecoderVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0L,
|
/* startPositionUs= */ 0L,
|
||||||
/* offsetUs */ 0,
|
/* offsetUs */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
renderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
renderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
||||||
// Ensure pending messages are delivered.
|
// Ensure pending messages are delivered.
|
||||||
@ -237,8 +235,7 @@ public final class DecoderVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ false,
|
/* mayRenderStartOfStream= */ false,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs */ 0,
|
/* offsetUs */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
renderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
renderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
||||||
// Ensure pending messages are delivered.
|
// Ensure pending messages are delivered.
|
||||||
@ -268,8 +265,7 @@ public final class DecoderVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ false,
|
/* mayRenderStartOfStream= */ false,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs */ 0,
|
/* offsetUs */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
renderer.start();
|
renderer.start();
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
renderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
renderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
||||||
@ -303,8 +299,6 @@ public final class DecoderVideoRendererTest {
|
|||||||
/* initialFormat= */ H264_FORMAT,
|
/* initialFormat= */ H264_FORMAT,
|
||||||
ImmutableList.of(oneByteSample(/* timeUs= */ 0), END_OF_STREAM_ITEM));
|
ImmutableList.of(oneByteSample(/* timeUs= */ 0), END_OF_STREAM_ITEM));
|
||||||
fakeSampleStream2.writeData(/* startPositionUs= */ 0);
|
fakeSampleStream2.writeData(/* startPositionUs= */ 0);
|
||||||
MediaSource.MediaPeriodId mediaPeriodId1 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId2 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
renderer.enable(
|
renderer.enable(
|
||||||
RendererConfiguration.DEFAULT,
|
RendererConfiguration.DEFAULT,
|
||||||
new Format[] {H264_FORMAT},
|
new Format[] {H264_FORMAT},
|
||||||
@ -313,8 +307,7 @@ public final class DecoderVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs */ 0,
|
/* offsetUs */ 0);
|
||||||
mediaPeriodId1);
|
|
||||||
renderer.start();
|
renderer.start();
|
||||||
|
|
||||||
boolean replacedStream = false;
|
boolean replacedStream = false;
|
||||||
@ -325,8 +318,7 @@ public final class DecoderVideoRendererTest {
|
|||||||
new Format[] {H264_FORMAT},
|
new Format[] {H264_FORMAT},
|
||||||
fakeSampleStream2,
|
fakeSampleStream2,
|
||||||
/* startPositionUs= */ 100,
|
/* startPositionUs= */ 100,
|
||||||
/* offsetUs= */ 100,
|
/* offsetUs= */ 100);
|
||||||
mediaPeriodId2);
|
|
||||||
replacedStream = true;
|
replacedStream = true;
|
||||||
}
|
}
|
||||||
// Ensure pending messages are delivered.
|
// Ensure pending messages are delivered.
|
||||||
@ -360,8 +352,6 @@ public final class DecoderVideoRendererTest {
|
|||||||
/* initialFormat= */ H264_FORMAT,
|
/* initialFormat= */ H264_FORMAT,
|
||||||
ImmutableList.of(oneByteSample(/* timeUs= */ 0), END_OF_STREAM_ITEM));
|
ImmutableList.of(oneByteSample(/* timeUs= */ 0), END_OF_STREAM_ITEM));
|
||||||
fakeSampleStream2.writeData(/* startPositionUs= */ 0);
|
fakeSampleStream2.writeData(/* startPositionUs= */ 0);
|
||||||
MediaSource.MediaPeriodId mediaPeriodId1 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId2 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
renderer.enable(
|
renderer.enable(
|
||||||
RendererConfiguration.DEFAULT,
|
RendererConfiguration.DEFAULT,
|
||||||
new Format[] {H264_FORMAT},
|
new Format[] {H264_FORMAT},
|
||||||
@ -370,8 +360,7 @@ public final class DecoderVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs */ 0,
|
/* offsetUs */ 0);
|
||||||
mediaPeriodId1);
|
|
||||||
|
|
||||||
boolean replacedStream = false;
|
boolean replacedStream = false;
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
@ -381,8 +370,7 @@ public final class DecoderVideoRendererTest {
|
|||||||
new Format[] {H264_FORMAT},
|
new Format[] {H264_FORMAT},
|
||||||
fakeSampleStream2,
|
fakeSampleStream2,
|
||||||
/* startPositionUs= */ 100,
|
/* startPositionUs= */ 100,
|
||||||
/* offsetUs= */ 100,
|
/* offsetUs= */ 100);
|
||||||
mediaPeriodId2);
|
|
||||||
replacedStream = true;
|
replacedStream = true;
|
||||||
}
|
}
|
||||||
// Ensure pending messages are delivered.
|
// Ensure pending messages are delivered.
|
||||||
|
@ -221,8 +221,7 @@ public class MediaCodecVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
/* mediaPeriodId= */ new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
|
|
||||||
mediaCodecVideoRenderer.start();
|
mediaCodecVideoRenderer.start();
|
||||||
mediaCodecVideoRenderer.render(0, SystemClock.elapsedRealtime() * 1000);
|
mediaCodecVideoRenderer.render(0, SystemClock.elapsedRealtime() * 1000);
|
||||||
@ -278,8 +277,7 @@ public class MediaCodecVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 30_000,
|
/* startPositionUs= */ 30_000,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
|
|
||||||
mediaCodecVideoRenderer.start();
|
mediaCodecVideoRenderer.start();
|
||||||
mediaCodecVideoRenderer.setCurrentStreamFinal();
|
mediaCodecVideoRenderer.setCurrentStreamFinal();
|
||||||
@ -306,14 +304,15 @@ public class MediaCodecVideoRendererTest {
|
|||||||
ArgumentCaptor<DecoderCounters> argumentDecoderCounters =
|
ArgumentCaptor<DecoderCounters> argumentDecoderCounters =
|
||||||
ArgumentCaptor.forClass(DecoderCounters.class);
|
ArgumentCaptor.forClass(DecoderCounters.class);
|
||||||
// Set up MediaPeriod with samples.
|
// Set up MediaPeriod with samples.
|
||||||
MediaSource.MediaPeriodId fakeMediaPeriodId = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
FakeMediaPeriod mediaPeriod =
|
FakeMediaPeriod mediaPeriod =
|
||||||
new FakeMediaPeriod(
|
new FakeMediaPeriod(
|
||||||
new TrackGroupArray(TRACK_GROUP_H264),
|
new TrackGroupArray(TRACK_GROUP_H264),
|
||||||
new DefaultAllocator(/* trimOnReset= */ true, /* individualAllocationSize= */ 1024),
|
new DefaultAllocator(/* trimOnReset= */ true, /* individualAllocationSize= */ 1024),
|
||||||
/* trackDataFactory= */ (format, mediaPeriodId) -> ImmutableList.of(),
|
/* trackDataFactory= */ (format, mediaPeriodId) -> ImmutableList.of(),
|
||||||
new MediaSourceEventListener.EventDispatcher()
|
new MediaSourceEventListener.EventDispatcher()
|
||||||
.withParameters(/* windowIndex= */ 0, fakeMediaPeriodId),
|
.withParameters(
|
||||||
|
/* windowIndex= */ 0,
|
||||||
|
new MediaSource.MediaPeriodId(/* periodUid= */ new Object())),
|
||||||
DrmSessionManager.DRM_UNSUPPORTED,
|
DrmSessionManager.DRM_UNSUPPORTED,
|
||||||
new DrmSessionEventListener.EventDispatcher(),
|
new DrmSessionEventListener.EventDispatcher(),
|
||||||
/* deferOnPrepared= */ false) {
|
/* deferOnPrepared= */ false) {
|
||||||
@ -389,8 +388,7 @@ public class MediaCodecVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 100,
|
/* startPositionUs= */ 100,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
fakeMediaPeriodId);
|
|
||||||
|
|
||||||
mediaCodecVideoRenderer.start();
|
mediaCodecVideoRenderer.start();
|
||||||
// Call to render should have read all samples up before endUs.
|
// Call to render should have read all samples up before endUs.
|
||||||
@ -411,14 +409,15 @@ public class MediaCodecVideoRendererTest {
|
|||||||
ArgumentCaptor<DecoderCounters> argumentDecoderCounters =
|
ArgumentCaptor<DecoderCounters> argumentDecoderCounters =
|
||||||
ArgumentCaptor.forClass(DecoderCounters.class);
|
ArgumentCaptor.forClass(DecoderCounters.class);
|
||||||
// Set up MediaPeriod with samples.
|
// Set up MediaPeriod with samples.
|
||||||
MediaSource.MediaPeriodId fakeMediaPeriodId = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
FakeMediaPeriod mediaPeriod =
|
FakeMediaPeriod mediaPeriod =
|
||||||
new FakeMediaPeriod(
|
new FakeMediaPeriod(
|
||||||
new TrackGroupArray(TRACK_GROUP_H264),
|
new TrackGroupArray(TRACK_GROUP_H264),
|
||||||
new DefaultAllocator(/* trimOnReset= */ true, /* individualAllocationSize= */ 1024),
|
new DefaultAllocator(/* trimOnReset= */ true, /* individualAllocationSize= */ 1024),
|
||||||
/* trackDataFactory= */ (format, mediaPeriodId) -> ImmutableList.of(),
|
/* trackDataFactory= */ (format, mediaPeriodId) -> ImmutableList.of(),
|
||||||
new MediaSourceEventListener.EventDispatcher()
|
new MediaSourceEventListener.EventDispatcher()
|
||||||
.withParameters(/* windowIndex= */ 0, fakeMediaPeriodId),
|
.withParameters(
|
||||||
|
/* windowIndex= */ 0,
|
||||||
|
new MediaSource.MediaPeriodId(/* periodUid= */ new Object())),
|
||||||
DrmSessionManager.DRM_UNSUPPORTED,
|
DrmSessionManager.DRM_UNSUPPORTED,
|
||||||
new DrmSessionEventListener.EventDispatcher(),
|
new DrmSessionEventListener.EventDispatcher(),
|
||||||
/* deferOnPrepared= */ false) {
|
/* deferOnPrepared= */ false) {
|
||||||
@ -494,8 +493,7 @@ public class MediaCodecVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 100,
|
/* startPositionUs= */ 100,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
fakeMediaPeriodId);
|
|
||||||
|
|
||||||
mediaCodecVideoRenderer.start();
|
mediaCodecVideoRenderer.start();
|
||||||
mediaCodecVideoRenderer.setCurrentStreamFinal();
|
mediaCodecVideoRenderer.setCurrentStreamFinal();
|
||||||
@ -531,8 +529,7 @@ public class MediaCodecVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
mediaCodecVideoRenderer.setCurrentStreamFinal();
|
mediaCodecVideoRenderer.setCurrentStreamFinal();
|
||||||
mediaCodecVideoRenderer.start();
|
mediaCodecVideoRenderer.start();
|
||||||
|
|
||||||
@ -578,8 +575,7 @@ public class MediaCodecVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ false,
|
/* mayRenderStartOfStream= */ false,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
mediaCodecVideoRenderer.start();
|
mediaCodecVideoRenderer.start();
|
||||||
mediaCodecVideoRenderer.render(/* positionUs= */ 0, msToUs(SystemClock.elapsedRealtime()));
|
mediaCodecVideoRenderer.render(/* positionUs= */ 0, msToUs(SystemClock.elapsedRealtime()));
|
||||||
ShadowSystemClock.advanceBy(10, TimeUnit.MILLISECONDS);
|
ShadowSystemClock.advanceBy(10, TimeUnit.MILLISECONDS);
|
||||||
@ -634,8 +630,7 @@ public class MediaCodecVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
|
|
||||||
mediaCodecVideoRenderer.start();
|
mediaCodecVideoRenderer.start();
|
||||||
mediaCodecVideoRenderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
mediaCodecVideoRenderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
||||||
@ -675,8 +670,7 @@ public class MediaCodecVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
mediaCodecVideoRenderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
mediaCodecVideoRenderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
||||||
}
|
}
|
||||||
@ -706,8 +700,7 @@ public class MediaCodecVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ false,
|
/* mayRenderStartOfStream= */ false,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
mediaCodecVideoRenderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
mediaCodecVideoRenderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
||||||
}
|
}
|
||||||
@ -736,8 +729,7 @@ public class MediaCodecVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ false,
|
/* mayRenderStartOfStream= */ false,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
mediaCodecVideoRenderer.start();
|
mediaCodecVideoRenderer.start();
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
mediaCodecVideoRenderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
mediaCodecVideoRenderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
||||||
@ -770,8 +762,7 @@ public class MediaCodecVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 2000,
|
/* startPositionUs= */ 2000,
|
||||||
/* offsetUs= */ 1000,
|
/* offsetUs= */ 1000);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
mediaCodecVideoRenderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
mediaCodecVideoRenderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
||||||
}
|
}
|
||||||
@ -804,8 +795,6 @@ public class MediaCodecVideoRendererTest {
|
|||||||
oneByteSample(/* timeUs= */ 1_000_000, C.BUFFER_FLAG_KEY_FRAME),
|
oneByteSample(/* timeUs= */ 1_000_000, C.BUFFER_FLAG_KEY_FRAME),
|
||||||
END_OF_STREAM_ITEM));
|
END_OF_STREAM_ITEM));
|
||||||
fakeSampleStream2.writeData(/* startPositionUs= */ 0);
|
fakeSampleStream2.writeData(/* startPositionUs= */ 0);
|
||||||
MediaSource.MediaPeriodId mediaPeriodId1 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId2 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
mediaCodecVideoRenderer.enable(
|
mediaCodecVideoRenderer.enable(
|
||||||
RendererConfiguration.DEFAULT,
|
RendererConfiguration.DEFAULT,
|
||||||
new Format[] {VIDEO_H264},
|
new Format[] {VIDEO_H264},
|
||||||
@ -814,8 +803,7 @@ public class MediaCodecVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
mediaPeriodId1);
|
|
||||||
mediaCodecVideoRenderer.start();
|
mediaCodecVideoRenderer.start();
|
||||||
|
|
||||||
boolean replacedStream = false;
|
boolean replacedStream = false;
|
||||||
@ -828,8 +816,7 @@ public class MediaCodecVideoRendererTest {
|
|||||||
new Format[] {VIDEO_H264},
|
new Format[] {VIDEO_H264},
|
||||||
fakeSampleStream2,
|
fakeSampleStream2,
|
||||||
/* startPositionUs= */ 100,
|
/* startPositionUs= */ 100,
|
||||||
/* offsetUs= */ 50,
|
/* offsetUs= */ 50);
|
||||||
mediaPeriodId2);
|
|
||||||
replacedStream = true;
|
replacedStream = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -870,8 +857,6 @@ public class MediaCodecVideoRendererTest {
|
|||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
oneByteSample(/* timeUs= */ 0, C.BUFFER_FLAG_KEY_FRAME), END_OF_STREAM_ITEM));
|
oneByteSample(/* timeUs= */ 0, C.BUFFER_FLAG_KEY_FRAME), END_OF_STREAM_ITEM));
|
||||||
fakeSampleStream2.writeData(/* startPositionUs= */ 0);
|
fakeSampleStream2.writeData(/* startPositionUs= */ 0);
|
||||||
MediaSource.MediaPeriodId mediaPeriodId1 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
MediaSource.MediaPeriodId mediaPeriodId2 = new MediaSource.MediaPeriodId(new Object());
|
|
||||||
mediaCodecVideoRenderer.enable(
|
mediaCodecVideoRenderer.enable(
|
||||||
RendererConfiguration.DEFAULT,
|
RendererConfiguration.DEFAULT,
|
||||||
new Format[] {VIDEO_H264},
|
new Format[] {VIDEO_H264},
|
||||||
@ -880,8 +865,7 @@ public class MediaCodecVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
mediaPeriodId1);
|
|
||||||
|
|
||||||
boolean replacedStream = false;
|
boolean replacedStream = false;
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
@ -892,8 +876,7 @@ public class MediaCodecVideoRendererTest {
|
|||||||
new Format[] {VIDEO_H264},
|
new Format[] {VIDEO_H264},
|
||||||
fakeSampleStream2,
|
fakeSampleStream2,
|
||||||
/* startPositionUs= */ 100,
|
/* startPositionUs= */ 100,
|
||||||
/* offsetUs= */ 100,
|
/* offsetUs= */ 100);
|
||||||
mediaPeriodId2);
|
|
||||||
replacedStream = true;
|
replacedStream = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -929,8 +912,7 @@ public class MediaCodecVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 1000,
|
/* startPositionUs= */ 1000,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
mediaCodecVideoRenderer.start();
|
mediaCodecVideoRenderer.start();
|
||||||
// Render at the original start position.
|
// Render at the original start position.
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
@ -1285,8 +1267,7 @@ public class MediaCodecVideoRendererTest {
|
|||||||
/* joining= */ false,
|
/* joining= */ false,
|
||||||
/* mayRenderStartOfStream= */ true,
|
/* mayRenderStartOfStream= */ true,
|
||||||
/* startPositionUs= */ 0,
|
/* startPositionUs= */ 0,
|
||||||
/* offsetUs= */ 0,
|
/* offsetUs= */ 0);
|
||||||
new MediaSource.MediaPeriodId(new Object()));
|
|
||||||
mediaCodecVideoRenderer.start();
|
mediaCodecVideoRenderer.start();
|
||||||
mediaCodecVideoRenderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
mediaCodecVideoRenderer.render(/* positionUs= */ 0, SystemClock.elapsedRealtime() * 1000);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user