From 847c1252e21f8cc624e5bf3a520cbfb81f8c2d2d Mon Sep 17 00:00:00 2001 From: rohks Date: Mon, 21 Oct 2024 06:15:10 -0700 Subject: [PATCH] Add `default` method `durationUs(long)` in `TrackOutput` The method allows extractors to set track duration when available. The `default` implementation does nothing, allowing implementers of `TrackOutput` to override it if they need to handle track duration. Implemented it in `FakeExtractor` to print track duration in dump files. PiperOrigin-RevId: 688110288 --- .../androidx/media3/extractor/ForwardingTrackOutput.java | 5 +++++ .../main/java/androidx/media3/extractor/TrackOutput.java | 7 +++++++ .../java/androidx/media3/test/utils/FakeTrackOutput.java | 8 ++++++++ 3 files changed, 20 insertions(+) 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); }