From a03bd8248c6372e23fb8a24b166d47bdb50c239a Mon Sep 17 00:00:00 2001 From: rohks Date: Wed, 23 Oct 2024 03:31:29 -0700 Subject: [PATCH] Fix duration calculation for AVI files The duration is now correctly calculated as the maximum of all track durations, instead of being overwritten by the last track's value. This aligns with how other Extractor implementations handle durations for multiple tracks. PiperOrigin-RevId: 688896743 (cherry picked from commit e677c8dccda196551e090f58e4d1014f907a9bfd) --- .../java/androidx/media3/extractor/avi/AviExtractor.java | 3 ++- .../src/test/assets/extractordumps/avi/sample.avi.0.dump | 6 +++--- .../src/test/assets/extractordumps/avi/sample.avi.1.dump | 6 +++--- .../src/test/assets/extractordumps/avi/sample.avi.2.dump | 6 +++--- .../src/test/assets/extractordumps/avi/sample.avi.3.dump | 6 +++--- .../extractordumps/avi/sample.avi.unknown_length.dump | 6 +++--- 6 files changed, 17 insertions(+), 16 deletions(-) diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/avi/AviExtractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/avi/AviExtractor.java index 7fa8133820..c759619767 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/avi/AviExtractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/avi/AviExtractor.java @@ -15,6 +15,7 @@ */ package androidx.media3.extractor.avi; +import static java.lang.Math.max; import static java.lang.annotation.ElementType.TYPE_USE; import androidx.annotation.IntDef; @@ -521,7 +522,7 @@ public final class AviExtractor implements Extractor { ChunkReader chunkReader = new ChunkReader( streamId, trackType, durationUs, aviStreamHeaderChunk.length, trackOutput); - this.durationUs = durationUs; + this.durationUs = max(this.durationUs, durationUs); return chunkReader; } else { // We don't currently support tracks other than video and audio. diff --git a/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.0.dump b/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.0.dump index 666526a13d..d49d31921a 100644 --- a/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.0.dump @@ -1,10 +1,10 @@ seekMap: isSeekable = true - duration = 4080000 + duration = 4087416 getPosition(0) = [[timeUs=0, position=9996]] getPosition(1) = [[timeUs=0, position=9996]] - getPosition(2040000) = [[timeUs=1835152, position=160708], [timeUs=2335648, position=198850]] - getPosition(4080000) = [[timeUs=3837136, position=308434]] + getPosition(2043708) = [[timeUs=1835152, position=160708], [timeUs=2335648, position=198850]] + getPosition(4087416) = [[timeUs=3837136, position=308434]] numberOfTracks = 2 track 0: total output bytes = 252777 diff --git a/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.1.dump b/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.1.dump index 94a7031440..a4fe2bc546 100644 --- a/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.1.dump @@ -1,10 +1,10 @@ seekMap: isSeekable = true - duration = 4080000 + duration = 4087416 getPosition(0) = [[timeUs=0, position=9996]] getPosition(1) = [[timeUs=0, position=9996]] - getPosition(2040000) = [[timeUs=1835152, position=160708], [timeUs=2335648, position=198850]] - getPosition(4080000) = [[timeUs=3837136, position=308434]] + getPosition(2043708) = [[timeUs=1835152, position=160708], [timeUs=2335648, position=198850]] + getPosition(4087416) = [[timeUs=3837136, position=308434]] numberOfTracks = 2 track 0: total output bytes = 165531 diff --git a/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.2.dump b/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.2.dump index ba5d85a844..20ec6584e4 100644 --- a/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.2.dump @@ -1,10 +1,10 @@ seekMap: isSeekable = true - duration = 4080000 + duration = 4087416 getPosition(0) = [[timeUs=0, position=9996]] getPosition(1) = [[timeUs=0, position=9996]] - getPosition(2040000) = [[timeUs=1835152, position=160708], [timeUs=2335648, position=198850]] - getPosition(4080000) = [[timeUs=3837136, position=308434]] + getPosition(2043708) = [[timeUs=1835152, position=160708], [timeUs=2335648, position=198850]] + getPosition(4087416) = [[timeUs=3837136, position=308434]] numberOfTracks = 2 track 0: total output bytes = 102418 diff --git a/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.3.dump b/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.3.dump index 2be55648da..a99ed20fc9 100644 --- a/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.3.dump @@ -1,10 +1,10 @@ seekMap: isSeekable = true - duration = 4080000 + duration = 4087416 getPosition(0) = [[timeUs=0, position=9996]] getPosition(1) = [[timeUs=0, position=9996]] - getPosition(2040000) = [[timeUs=1835152, position=160708], [timeUs=2335648, position=198850]] - getPosition(4080000) = [[timeUs=3837136, position=308434]] + getPosition(2043708) = [[timeUs=1835152, position=160708], [timeUs=2335648, position=198850]] + getPosition(4087416) = [[timeUs=3837136, position=308434]] numberOfTracks = 2 track 0: total output bytes = 17833 diff --git a/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.unknown_length.dump index 666526a13d..d49d31921a 100644 --- a/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/avi/sample.avi.unknown_length.dump @@ -1,10 +1,10 @@ seekMap: isSeekable = true - duration = 4080000 + duration = 4087416 getPosition(0) = [[timeUs=0, position=9996]] getPosition(1) = [[timeUs=0, position=9996]] - getPosition(2040000) = [[timeUs=1835152, position=160708], [timeUs=2335648, position=198850]] - getPosition(4080000) = [[timeUs=3837136, position=308434]] + getPosition(2043708) = [[timeUs=1835152, position=160708], [timeUs=2335648, position=198850]] + getPosition(4087416) = [[timeUs=3837136, position=308434]] numberOfTracks = 2 track 0: total output bytes = 252777