From 63331dbd1bd4a173aa3a28cdeb91f78cc34ea2ea Mon Sep 17 00:00:00 2001 From: tonihei Date: Wed, 5 Jul 2023 16:56:48 +0100 Subject: [PATCH] Use Clock in video renderers This makes tests more realistic because the returned value matches the rest of the simulated test time. It also prevents test flakiness in (yet to be written) tests that may accidentally drop output buffers or calculate the wrong values. PiperOrigin-RevId: 545690008 --- .../media3/exoplayer/BaseRenderer.java | 14 ++++++- .../exoplayer/ExoPlayerImplInternal.java | 6 +-- .../media3/exoplayer/NoSampleRenderer.java | 3 +- .../androidx/media3/exoplayer/Renderer.java | 4 +- .../exoplayer/video/DecoderVideoRenderer.java | 2 +- .../video/MediaCodecVideoRenderer.java | 40 +++++++++++-------- .../audio/DecoderAudioRendererTest.java | 3 +- .../audio/MediaCodecAudioRendererTest.java | 7 ++-- .../mediacodec/MediaCodecRendererTest.java | 11 ++--- .../video/MediaCodecVideoRendererTest.java | 11 +++-- 10 files changed, 64 insertions(+), 37 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/BaseRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/BaseRenderer.java index b11e946e90..12eb1004e7 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/BaseRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/BaseRenderer.java @@ -24,6 +24,7 @@ import androidx.media3.common.C; import androidx.media3.common.Format; import androidx.media3.common.PlaybackException; import androidx.media3.common.util.Assertions; +import androidx.media3.common.util.Clock; import androidx.media3.common.util.UnstableApi; import androidx.media3.decoder.DecoderInputBuffer; import androidx.media3.decoder.DecoderInputBuffer.InsufficientCapacityException; @@ -45,6 +46,7 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities { @Nullable private RendererConfiguration configuration; private int index; private @MonotonicNonNull PlayerId playerId; + private @MonotonicNonNull Clock clock; private int state; @Nullable private SampleStream stream; @Nullable private Format[] streamFormats; @@ -80,9 +82,10 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities { } @Override - public final void init(int index, PlayerId playerId) { + public final void init(int index, PlayerId playerId, Clock clock) { this.index = index; this.playerId = playerId; + this.clock = clock; } @Override @@ -393,6 +396,15 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities { return checkNotNull(playerId); } + /** + * Returns the {@link Clock}. + * + *

Must only be used after the renderer has been initialized by the player. + */ + protected final Clock getClock() { + return checkNotNull(clock); + } + /** * Creates an {@link ExoPlaybackException} of type {@link ExoPlaybackException#TYPE_RENDERER} for * this renderer. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java index 305f91dfca..f3035b0683 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java @@ -17,6 +17,7 @@ package androidx.media3.exoplayer; import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Util.castNonNull; +import static androidx.media3.common.util.Util.msToUs; import static java.lang.Math.max; import static java.lang.Math.min; @@ -25,7 +26,6 @@ import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.os.Process; -import android.os.SystemClock; import android.util.Pair; import androidx.annotation.CheckResult; import androidx.annotation.Nullable; @@ -277,7 +277,7 @@ import java.util.concurrent.atomic.AtomicBoolean; RendererCapabilities.Listener rendererCapabilitiesListener = trackSelector.getRendererCapabilitiesListener(); for (int i = 0; i < renderers.length; i++) { - renderers[i].init(/* index= */ i, playerId); + renderers[i].init(/* index= */ i, playerId, clock); rendererCapabilities[i] = renderers[i].getCapabilities(); if (rendererCapabilitiesListener != null) { rendererCapabilities[i].setListener(rendererCapabilitiesListener); @@ -1056,7 +1056,7 @@ import java.util.concurrent.atomic.AtomicBoolean; boolean renderersEnded = true; boolean renderersAllowPlayback = true; if (playingPeriodHolder.prepared) { - long rendererPositionElapsedRealtimeUs = SystemClock.elapsedRealtime() * 1000; + long rendererPositionElapsedRealtimeUs = msToUs(clock.elapsedRealtime()); playingPeriodHolder.mediaPeriod.discardBuffer( playbackInfo.positionUs - backBufferDurationUs, retainBackBufferFromKeyframe); for (int i = 0; i < renderers.length; i++) { diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/NoSampleRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/NoSampleRenderer.java index c9cf750d62..3b33e06a2e 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/NoSampleRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/NoSampleRenderer.java @@ -19,6 +19,7 @@ import androidx.annotation.Nullable; import androidx.media3.common.C; import androidx.media3.common.Format; import androidx.media3.common.util.Assertions; +import androidx.media3.common.util.Clock; import androidx.media3.common.util.UnstableApi; import androidx.media3.exoplayer.analytics.PlayerId; import androidx.media3.exoplayer.source.SampleStream; @@ -49,7 +50,7 @@ public abstract class NoSampleRenderer implements Renderer, RendererCapabilities } @Override - public final void init(int index, PlayerId playerId) { + public final void init(int index, PlayerId playerId, Clock clock) { this.index = index; } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/Renderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/Renderer.java index e5de1f2eaf..ff994b1f8a 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/Renderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/Renderer.java @@ -27,6 +27,7 @@ import androidx.media3.common.C; import androidx.media3.common.Effect; import androidx.media3.common.Format; import androidx.media3.common.Player; +import androidx.media3.common.util.Clock; import androidx.media3.common.util.Size; import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.Util; @@ -305,8 +306,9 @@ public interface Renderer extends PlayerMessage.Target { * * @param index The renderer index within the player. * @param playerId The {@link PlayerId} of the player. + * @param clock The {@link Clock}. */ - void init(int index, PlayerId playerId); + void init(int index, PlayerId playerId, Clock clock); /** * If the renderer advances its own playback position then this method returns a corresponding diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DecoderVideoRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DecoderVideoRenderer.java index b02b6fd3c8..91a90f4502 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DecoderVideoRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DecoderVideoRenderer.java @@ -573,7 +573,7 @@ public abstract class DecoderVideoRenderer extends BaseRenderer { throws DecoderException { if (frameMetadataListener != null) { frameMetadataListener.onVideoFrameAboutToBeRendered( - presentationTimeUs, System.nanoTime(), outputFormat, /* mediaFormat= */ null); + presentationTimeUs, getClock().nanoTime(), outputFormat, /* mediaFormat= */ null); } lastRenderTimeUs = Util.msToUs(SystemClock.elapsedRealtime() * 1000); int bufferMode = outputBuffer.mode; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java index 8aae18bbad..5900dc5067 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java @@ -19,6 +19,7 @@ import static android.view.Display.DEFAULT_DISPLAY; import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.common.util.Assertions.checkStateNotNull; +import static androidx.media3.common.util.Util.msToUs; import static androidx.media3.exoplayer.DecoderReuseEvaluation.DISCARD_REASON_MAX_INPUT_SIZE_EXCEEDED; import static androidx.media3.exoplayer.DecoderReuseEvaluation.DISCARD_REASON_VIDEO_MAX_RESOLUTION_EXCEEDED; import static androidx.media3.exoplayer.DecoderReuseEvaluation.REUSE_RESULT_NO; @@ -59,6 +60,7 @@ import androidx.media3.common.SurfaceInfo; import androidx.media3.common.VideoFrameProcessingException; import androidx.media3.common.VideoFrameProcessor; import androidx.media3.common.VideoSize; +import androidx.media3.common.util.Clock; import androidx.media3.common.util.Log; import androidx.media3.common.util.MediaFormatUtil; import androidx.media3.common.util.Size; @@ -644,7 +646,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { } else if (joiningDeadlineMs == C.TIME_UNSET) { // Not joining. return false; - } else if (SystemClock.elapsedRealtime() < joiningDeadlineMs) { + } else if (getClock().elapsedRealtime() < joiningDeadlineMs) { // Joining and still within the joining deadline. return true; } else { @@ -658,8 +660,9 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { protected void onStarted() { super.onStarted(); droppedFrames = 0; - droppedFrameAccumulationStartTimeMs = SystemClock.elapsedRealtime(); - lastRenderRealtimeUs = SystemClock.elapsedRealtime() * 1000; + long elapsedRealtimeMs = getClock().elapsedRealtime(); + droppedFrameAccumulationStartTimeMs = elapsedRealtimeMs; + lastRenderRealtimeUs = msToUs(elapsedRealtimeMs); totalVideoFrameProcessingOffsetUs = 0; videoFrameProcessingOffsetCount = 0; frameReleaseHelper.onStarted(); @@ -1009,7 +1012,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { @Override protected void onReadyToInitializeCodec(Format format) throws ExoPlaybackException { if (!videoFrameProcessorManager.isEnabled()) { - videoFrameProcessorManager.maybeEnable(format, getOutputStreamOffsetUs()); + videoFrameProcessorManager.maybeEnable(format, getOutputStreamOffsetUs(), getClock()); } } @@ -1202,7 +1205,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { // Note: Use of double rather than float is intentional for accuracy in the calculations below. boolean isStarted = getState() == STATE_STARTED; - long elapsedRealtimeNowUs = SystemClock.elapsedRealtime() * 1000; + long elapsedRealtimeNowUs = msToUs(getClock().elapsedRealtime()); long earlyUs = calculateEarlyTimeUs( positionUs, @@ -1244,7 +1247,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { } // Compute the buffer's desired release time in nanoseconds. - long systemTimeNs = System.nanoTime(); + long systemTimeNs = getClock().nanoTime(); long unadjustedFrameReleaseTimeNs = systemTimeNs + (earlyUs * 1000); // Apply a timestamp adjustment, if there is one. @@ -1330,7 +1333,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { !renderedFirstFrameAfterEnable ? (isStarted || mayRenderFirstFrameAfterEnableIfNotStarted) : !renderedFirstFrameAfterReset; - long elapsedSinceLastRenderUs = SystemClock.elapsedRealtime() * 1000 - lastRenderRealtimeUs; + long elapsedSinceLastRenderUs = msToUs(getClock().elapsedRealtime()) - lastRenderRealtimeUs; // Don't force output until we joined and the position reached the current stream. return joiningDeadlineMs == C.TIME_UNSET && positionUs >= getOutputStreamOffsetUs() @@ -1597,7 +1600,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { ? videoFrameProcessorManager.getCorrectedFramePresentationTimeUs( presentationTimeUs, getOutputStreamOffsetUs()) * 1000 - : System.nanoTime(); + : getClock().nanoTime(); if (notifyFrameMetadataListener) { notifyFrameMetadataListener(presentationTimeUs, releaseTimeNs, format); } @@ -1627,7 +1630,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { decoderCounters.renderedOutputBufferCount++; consecutiveDroppedFrameCount = 0; if (!videoFrameProcessorManager.isEnabled()) { - lastRenderRealtimeUs = SystemClock.elapsedRealtime() * 1000; + lastRenderRealtimeUs = msToUs(getClock().elapsedRealtime()); maybeNotifyVideoSizeChanged(decodedVideoSize); maybeNotifyRenderedFirstFrame(); } @@ -1655,7 +1658,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { decoderCounters.renderedOutputBufferCount++; consecutiveDroppedFrameCount = 0; if (!videoFrameProcessorManager.isEnabled()) { - lastRenderRealtimeUs = SystemClock.elapsedRealtime() * 1000; + lastRenderRealtimeUs = msToUs(getClock().elapsedRealtime()); maybeNotifyVideoSizeChanged(decodedVideoSize); maybeNotifyRenderedFirstFrame(); } @@ -1680,7 +1683,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { private void setJoiningDeadlineMs() { joiningDeadlineMs = allowedJoiningTimeMs > 0 - ? (SystemClock.elapsedRealtime() + allowedJoiningTimeMs) + ? (getClock().elapsedRealtime() + allowedJoiningTimeMs) : C.TIME_UNSET; } @@ -1734,7 +1737,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { private void maybeNotifyDroppedFrames() { if (droppedFrames > 0) { - long now = SystemClock.elapsedRealtime(); + long now = getClock().elapsedRealtime(); long elapsedMs = now - droppedFrameAccumulationStartTimeMs; eventDispatcher.droppedFrames(droppedFrames, elapsedMs); droppedFrames = 0; @@ -1936,6 +1939,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { */ private @MonotonicNonNull Pair currentFrameFormat; + private @MonotonicNonNull Clock clock; @Nullable private Pair currentSurfaceAndSize; private int videoFrameProcessorMaxPendingFrameCount; @@ -2039,7 +2043,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { * @throws ExoPlaybackException When enabling the {@link VideoFrameProcessor} failed. */ @CanIgnoreReturnValue - public boolean maybeEnable(Format inputFormat, long initialStreamOffsetUs) + public boolean maybeEnable(Format inputFormat, long initialStreamOffsetUs, Clock clock) throws ExoPlaybackException { checkState(!isEnabled()); if (!canEnableFrameProcessing) { @@ -2052,6 +2056,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { // Playback thread handler. handler = Util.createHandlerForCurrentLooper(); + this.clock = clock; Pair inputAndOutputColorInfos = renderer.experimentalGetVideoFrameProcessorColorConfiguration(inputFormat.colorInfo); @@ -2292,7 +2297,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { renderer.calculateEarlyTimeUs( positionUs, elapsedRealtimeUs, - SystemClock.elapsedRealtime() * 1000, + msToUs(clock.elapsedRealtime()), bufferPresentationTimeUs, isStarted); @@ -2313,10 +2318,11 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { } frameReleaseHelper.onNextFrame(bufferPresentationTimeUs); - long unadjustedFrameReleaseTimeNs = System.nanoTime() + earlyUs * 1000; + long systemNanoTime = checkNotNull(clock).nanoTime(); + long unadjustedFrameReleaseTimeNs = systemNanoTime + earlyUs * 1000; long adjustedFrameReleaseTimeNs = frameReleaseHelper.adjustReleaseTime(unadjustedFrameReleaseTimeNs); - earlyUs = (adjustedFrameReleaseTimeNs - System.nanoTime()) / 1000; + earlyUs = (adjustedFrameReleaseTimeNs - systemNanoTime) / 1000; // TODO(b/238302341) Handle very late buffers and drop to key frame. Need to flush // VideoFrameProcessor input frames in this case. @@ -2364,7 +2370,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { checkStateNotNull(videoFrameProcessor); videoFrameProcessor.renderOutputFrame(releaseTimeNs); processedFramesTimestampsUs.remove(); - renderer.lastRenderRealtimeUs = SystemClock.elapsedRealtime() * 1000; + renderer.lastRenderRealtimeUs = msToUs(clock.elapsedRealtime()); if (releaseTimeNs != VideoFrameProcessor.DROP_OUTPUT_FRAME) { renderer.maybeNotifyRenderedFirstFrame(); } diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/DecoderAudioRendererTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/DecoderAudioRendererTest.java index 0c9e4517e3..4710314321 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/DecoderAudioRendererTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/DecoderAudioRendererTest.java @@ -35,6 +35,7 @@ import androidx.annotation.Nullable; import androidx.media3.common.C; import androidx.media3.common.Format; import androidx.media3.common.MimeTypes; +import androidx.media3.common.util.Clock; import androidx.media3.decoder.CryptoConfig; import androidx.media3.decoder.DecoderException; import androidx.media3.decoder.DecoderInputBuffer; @@ -91,7 +92,7 @@ public class DecoderAudioRendererTest { return FORMAT; } }; - audioRenderer.init(/* index= */ 0, PlayerId.UNSET); + audioRenderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT); } @Config(sdk = 19) diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/MediaCodecAudioRendererTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/MediaCodecAudioRendererTest.java index 683af28ab3..728f1dd424 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/MediaCodecAudioRendererTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/audio/MediaCodecAudioRendererTest.java @@ -38,6 +38,7 @@ import androidx.media3.common.C; import androidx.media3.common.Format; import androidx.media3.common.MimeTypes; import androidx.media3.common.PlaybackException; +import androidx.media3.common.util.Clock; import androidx.media3.exoplayer.ExoPlaybackException; import androidx.media3.exoplayer.RendererCapabilities; import androidx.media3.exoplayer.RendererCapabilities.Capabilities; @@ -134,7 +135,7 @@ public class MediaCodecAudioRendererTest { eventHandler, audioRendererEventListener, audioSink); - mediaCodecAudioRenderer.init(/* index= */ 0, PlayerId.UNSET); + mediaCodecAudioRenderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT); } @Test @@ -289,7 +290,7 @@ public class MediaCodecAudioRendererTest { oneByteSample(/* timeUs= */ 0, C.BUFFER_FLAG_KEY_FRAME), END_OF_STREAM_ITEM)); fakeSampleStream.writeData(/* startPositionUs= */ 0); - exceptionThrowingRenderer.init(/* index= */ 0, PlayerId.UNSET); + exceptionThrowingRenderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT); exceptionThrowingRenderer.enable( RendererConfiguration.DEFAULT, new Format[] {AUDIO_AAC, changedFormat}, @@ -438,7 +439,7 @@ public class MediaCodecAudioRendererTest { /* eventHandler= */ new Handler(Looper.getMainLooper()), audioRendererEventListener, audioSink); - renderer.init(/* index= */ 0, PlayerId.UNSET); + renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT); @Capabilities int capabilities = renderer.supportsFormat(mediaFormat); diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/mediacodec/MediaCodecRendererTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/mediacodec/MediaCodecRendererTest.java index b27a3d3106..58a7f2f2c6 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/mediacodec/MediaCodecRendererTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/mediacodec/MediaCodecRendererTest.java @@ -30,6 +30,7 @@ import androidx.annotation.Nullable; import androidx.media3.common.C; import androidx.media3.common.Format; import androidx.media3.common.MimeTypes; +import androidx.media3.common.util.Clock; import androidx.media3.exoplayer.DecoderReuseEvaluation; import androidx.media3.exoplayer.ExoPlaybackException; import androidx.media3.exoplayer.RendererCapabilities; @@ -63,7 +64,7 @@ public class MediaCodecRendererTest { FakeSampleStream fakeSampleStream2 = createFakeSampleStream(format2, /* sampleTimesUs...= */ 0, 100, 200); MediaCodecRenderer renderer = spy(new TestRenderer()); - renderer.init(/* index= */ 0, PlayerId.UNSET); + renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT); renderer.enable( RendererConfiguration.DEFAULT, @@ -116,7 +117,7 @@ public class MediaCodecRendererTest { FakeSampleStream fakeSampleStream2 = createFakeSampleStream(format2, /* sampleTimesUs...= */ 0, 100, 200); MediaCodecRenderer renderer = spy(new TestRenderer()); - renderer.init(/* index= */ 0, PlayerId.UNSET); + renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT); renderer.enable( RendererConfiguration.DEFAULT, @@ -172,7 +173,7 @@ public class MediaCodecRendererTest { FakeSampleStream fakeSampleStream2 = createFakeSampleStream(format2, /* sampleTimesUs...= */ 0, 100, 200, 300, 400); MediaCodecRenderer renderer = spy(new TestRenderer()); - renderer.init(/* index= */ 0, PlayerId.UNSET); + renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT); renderer.enable( RendererConfiguration.DEFAULT, @@ -226,7 +227,7 @@ public class MediaCodecRendererTest { FakeSampleStream fakeSampleStream2 = createFakeSampleStream(format2, /* sampleTimesUs...= */ 0, 100, 200); MediaCodecRenderer renderer = spy(new TestRenderer()); - renderer.init(/* index= */ 0, PlayerId.UNSET); + renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT); renderer.enable( RendererConfiguration.DEFAULT, @@ -277,7 +278,7 @@ public class MediaCodecRendererTest { FakeSampleStream fakeSampleStream3 = createFakeSampleStream(format3, /* sampleTimesUs...= */ 0, 100, 200); MediaCodecRenderer renderer = spy(new TestRenderer()); - renderer.init(/* index= */ 0, PlayerId.UNSET); + renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT); renderer.enable( RendererConfiguration.DEFAULT, diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/video/MediaCodecVideoRendererTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/video/MediaCodecVideoRendererTest.java index 5d6dac43d8..c7369c2fb7 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/video/MediaCodecVideoRendererTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/video/MediaCodecVideoRendererTest.java @@ -47,6 +47,7 @@ import androidx.media3.common.C; import androidx.media3.common.Format; import androidx.media3.common.MimeTypes; import androidx.media3.common.VideoSize; +import androidx.media3.common.util.Clock; import androidx.media3.decoder.CryptoInfo; import androidx.media3.exoplayer.DecoderCounters; import androidx.media3.exoplayer.Renderer; @@ -169,6 +170,7 @@ public class MediaCodecVideoRendererTest { } }; + mediaCodecVideoRenderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT); surface = new Surface(new SurfaceTexture(/* texName= */ 0)); mediaCodecVideoRenderer.handleMessage(Renderer.MSG_SET_VIDEO_OUTPUT, surface); } @@ -247,6 +249,7 @@ public class MediaCodecVideoRendererTest { /* eventHandler= */ new Handler(testMainLooper), /* eventListener= */ eventListener, /* maxDroppedFramesToNotify= */ 1); + mediaCodecVideoRenderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT); mediaCodecVideoRenderer.handleMessage(Renderer.MSG_SET_VIDEO_OUTPUT, surface); mediaCodecVideoRenderer.enable( RendererConfiguration.DEFAULT, @@ -697,7 +700,7 @@ public class MediaCodecVideoRendererTest { /* eventHandler= */ new Handler(testMainLooper), /* eventListener= */ eventListener, /* maxDroppedFramesToNotify= */ 1); - renderer.init(/* index= */ 0, PlayerId.UNSET); + renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT); @Capabilities int capabilitiesDvheDtrFallbackToH265 = renderer.supportsFormat(formatDvheDtrFallbackToH265); @@ -782,7 +785,7 @@ public class MediaCodecVideoRendererTest { /* eventHandler= */ new Handler(testMainLooper), /* eventListener= */ eventListener, /* maxDroppedFramesToNotify= */ 1); - renderer.init(/* index= */ 0, PlayerId.UNSET); + renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT); @Capabilities int capabilitiesDvheDtr = renderer.supportsFormat(formatDvheDtr); @@ -842,7 +845,7 @@ public class MediaCodecVideoRendererTest { /* eventHandler= */ new Handler(testMainLooper), /* eventListener= */ eventListener, /* maxDroppedFramesToNotify= */ 1); - renderer.init(/* index= */ 0, PlayerId.UNSET); + renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT); List mediaCodecInfoList = renderer.getDecoderInfos(mediaCodecSelector, avcFormat, false); @@ -885,7 +888,7 @@ public class MediaCodecVideoRendererTest { /* eventHandler= */ new Handler(testMainLooper), /* eventListener= */ eventListener, /* maxDroppedFramesToNotify= */ 1); - renderer.init(/* index= */ 0, PlayerId.UNSET); + renderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT); List mediaCodecInfoList = renderer.getDecoderInfos(mediaCodecSelector, avcFormat, false);