From ac8e418f3d28876ed38b0d6465793e4cdfb273ba Mon Sep 17 00:00:00 2001 From: hschlueter Date: Thu, 18 Nov 2021 15:25:38 +0000 Subject: [PATCH] Adjust timestamp even if frame is dropped. The `SefSlowMotionVideoSampleTransformer` drops frames by setting `buffer.data = null` and updates the timestamps of the frames it keeps. However, these buffers with dropped frames are still used in the pipeline as they may contain other useful information, specifically whether the end of the input has been reached. So, the timestamps should also be updated for the buffers where frames are dropped. PiperOrigin-RevId: 410797678 --- .../transformer/SefSlowMotionVideoSampleTransformer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/SefSlowMotionVideoSampleTransformer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/SefSlowMotionVideoSampleTransformer.java index 48395703f9..0663fa9f03 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SefSlowMotionVideoSampleTransformer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SefSlowMotionVideoSampleTransformer.java @@ -148,8 +148,10 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; "Missing SVC extension prefix NAL unit."); int layer = (scratch[3] & 0xFF) >> 5; boolean shouldKeepFrame = processCurrentFrame(layer, buffer.timeUs); + // Update buffer timestamp regardless of whether the frame is dropped because the buffer might + // still be passed to a decoder if it contains an end of stream flag. + buffer.timeUs = getCurrentFrameOutputTimeUs(/* inputTimeUs= */ buffer.timeUs); if (shouldKeepFrame) { - buffer.timeUs = getCurrentFrameOutputTimeUs(/* inputTimeUs= */ buffer.timeUs); skipToNextNalUnit(data); // Skip over prefix_nal_unit_svc. } else { buffer.data = null;