From 22853a5c4c44f0086364e4d816e02bbad50488fc Mon Sep 17 00:00:00 2001 From: dancho Date: Thu, 13 Feb 2025 07:16:20 -0800 Subject: [PATCH] MCVR: fix dropped input buffer count updateDroppedBufferCountersWithInputBuffers should receive buffer timestamps before adjusting offset PiperOrigin-RevId: 726473967 --- .../exoplayer/video/MediaCodecVideoRenderer.java | 12 ++++++------ .../exoplayer/video/MediaCodecVideoRendererTest.java | 11 ++++++----- 2 files changed, 12 insertions(+), 11 deletions(-) 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 f84b4e74b0..398bb903ee 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 @@ -1649,7 +1649,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer long outputStreamOffsetUs = getOutputStreamOffsetUs(); long presentationTimeUs = bufferPresentationTimeUs - outputStreamOffsetUs; - updateDroppedBufferCountersWithInputBuffers(presentationTimeUs); + updateDroppedBufferCountersWithInputBuffers(bufferPresentationTimeUs); if (videoSink != null) { // Skip decode-only buffers, e.g. after seeking, immediately. @@ -1960,16 +1960,16 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer } /** - * Updates counters to reflect dropped input buffers prior to {@code presentationTimeUs}. + * Updates counters to reflect dropped input buffers prior to {@code bufferPresentationTimeUs}. * - * @param presentationTimeUs The presentation timestamp of the last processed output buffer, in - * microseconds. + * @param bufferPresentationTimeUs The presentation timestamp of the last processed output buffer, + * in microseconds. */ - private void updateDroppedBufferCountersWithInputBuffers(long presentationTimeUs) { + private void updateDroppedBufferCountersWithInputBuffers(long bufferPresentationTimeUs) { int droppedInputBufferCount = 0; Long minDroppedDecoderBufferTimeUs; while ((minDroppedDecoderBufferTimeUs = droppedDecoderInputBufferTimestamps.peek()) != null - && minDroppedDecoderBufferTimeUs < presentationTimeUs) { + && minDroppedDecoderBufferTimeUs < bufferPresentationTimeUs) { droppedInputBufferCount++; droppedDecoderInputBufferTimestamps.poll(); } 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 78034fd82e..f770e4846a 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 @@ -1424,6 +1424,7 @@ public class MediaCodecVideoRendererTest { } }; + long offsetUs = 1_000_000_000L; mediaCodecVideoRenderer.init(/* index= */ 0, PlayerId.UNSET, Clock.DEFAULT); mediaCodecVideoRenderer.handleMessage(Renderer.MSG_SET_VIDEO_OUTPUT, surface); mediaCodecVideoRenderer.setTimeline(fakeTimeline); @@ -1434,8 +1435,8 @@ public class MediaCodecVideoRendererTest { /* positionUs= */ 0, /* joining= */ false, /* mayRenderStartOfStream= */ true, - /* startPositionUs= */ 0, - /* offsetUs= */ 0, + /* startPositionUs= */ offsetUs, + offsetUs, new MediaSource.MediaPeriodId(fakeTimeline.getUidOfPeriod(0))); shadowOf(testMainLooper).idle(); ArgumentCaptor argumentDecoderCounters = @@ -1444,13 +1445,13 @@ public class MediaCodecVideoRendererTest { DecoderCounters decoderCounters = argumentDecoderCounters.getValue(); mediaCodecVideoRenderer.start(); - mediaCodecVideoRenderer.render(0, SystemClock.elapsedRealtime() * 1000); + mediaCodecVideoRenderer.render(offsetUs, SystemClock.elapsedRealtime() * 1000); while (decoderCounters.renderedOutputBufferCount == 0) { - mediaCodecVideoRenderer.render(10_000, SystemClock.elapsedRealtime() * 1000); + mediaCodecVideoRenderer.render(offsetUs + 10_000, SystemClock.elapsedRealtime() * 1000); } // Ensure existing buffer will be ~280ms late and new (not yet read) buffers are available // to be dropped. - int posUs = 300_000; + long posUs = offsetUs + 300_000; fakeSampleStream.append( ImmutableList.of( oneByteSample(/* timeUs= */ 300_000), // Render.