diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ForwardingTrackOutput.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ForwardingTrackOutput.java index a0219301f6..d64066d053 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ForwardingTrackOutput.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ForwardingTrackOutput.java @@ -36,6 +36,11 @@ public class ForwardingTrackOutput implements TrackOutput { this.trackOutput = trackOutput; } + @Override + public void durationUs(long durationUs) { + trackOutput.durationUs(durationUs); + } + @Override public void format(Format format) { trackOutput.format(format); diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/TrackOutput.java b/libraries/extractor/src/main/java/androidx/media3/extractor/TrackOutput.java index 5bbc9f2f09..e6bd71ef52 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/TrackOutput.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/TrackOutput.java @@ -146,6 +146,13 @@ public interface TrackOutput { */ int SAMPLE_DATA_PART_SUPPLEMENTAL = 2; + /** + * Called to set the duration of the track in microseconds. + * + * @param durationUs The duration of the track in microseconds. + */ + default void durationUs(long durationUs) {} + /** * Called when the {@link Format} of the track has been extracted from the stream. * diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeTrackOutput.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeTrackOutput.java index 0da7968c9b..a7626ec0a8 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeTrackOutput.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeTrackOutput.java @@ -54,6 +54,7 @@ public final class FakeTrackOutput implements TrackOutput, Dumper.Dumpable { private byte[] sampleData; private int formatCount; private boolean receivedSampleInFormat; + private long durationUs; @Nullable public Format lastFormat; @@ -64,6 +65,7 @@ public final class FakeTrackOutput implements TrackOutput, Dumper.Dumpable { sampleData = Util.EMPTY_BYTE_ARRAY; formatCount = 0; receivedSampleInFormat = true; + durationUs = C.TIME_UNSET; } public void clear() { @@ -74,6 +76,11 @@ public final class FakeTrackOutput implements TrackOutput, Dumper.Dumpable { receivedSampleInFormat = true; } + @Override + public void durationUs(long durationUs) { + this.durationUs = durationUs; + } + @Override public void format(Format format) { if (!deduplicateConsecutiveFormats) { @@ -188,6 +195,7 @@ public final class FakeTrackOutput implements TrackOutput, Dumper.Dumpable { public void dump(Dumper dumper) { dumper.add("total output bytes", sampleData.length); dumper.add("sample count", sampleInfos.size()); + dumper.addIfNonDefault("track duration", durationUs, C.TIME_UNSET); if (dumpables.isEmpty() && lastFormat != null) { new DumpableFormat(lastFormat, 0).dump(dumper); }