MCVR: fix dropped input buffer count

updateDroppedBufferCountersWithInputBuffers should receive
buffer timestamps before adjusting offset

PiperOrigin-RevId: 726473967
This commit is contained in:
dancho 2025-02-13 07:16:20 -08:00 committed by Copybara-Service
parent 12072f7248
commit 22853a5c4c
2 changed files with 12 additions and 11 deletions

View File

@ -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();
}

View File

@ -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<DecoderCounters> 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.