mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
MCVR: fix dropped input buffer count
updateDroppedBufferCountersWithInputBuffers should receive buffer timestamps before adjusting offset PiperOrigin-RevId: 726473967
This commit is contained in:
parent
12072f7248
commit
22853a5c4c
@ -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();
|
||||
}
|
||||
|
@ -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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user