From 08619bf6faffcf744b08bba5b5306ee8db30fae0 Mon Sep 17 00:00:00 2001 From: rohks Date: Wed, 27 Nov 2024 10:23:32 -0800 Subject: [PATCH] Add `KEY_TRACK_ID` to `MediaFormat` returned by `getTrackFormat(int)` This aligns the behavior with `MediaExtractor`, which sets this key in its [`MediaFormat`](https://developer.android.com/reference/android/media/MediaExtractor#getTrackFormat(int)) output. Additionally, unnecessary `selectTrack` calls have been removed from the existing `getTrackFormat_...` tests, as they are not required to fetch the track format. PiperOrigin-RevId: 700741326 --- .../exoplayer/MediaExtractorCompatTest.java | 26 ++++++++++++++++--- .../exoplayer/MediaExtractorCompat.java | 1 + 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/libraries/exoplayer/src/androidTest/java/androidx/media3/exoplayer/MediaExtractorCompatTest.java b/libraries/exoplayer/src/androidTest/java/androidx/media3/exoplayer/MediaExtractorCompatTest.java index 75704876b0..24d4ddda14 100644 --- a/libraries/exoplayer/src/androidTest/java/androidx/media3/exoplayer/MediaExtractorCompatTest.java +++ b/libraries/exoplayer/src/androidTest/java/androidx/media3/exoplayer/MediaExtractorCompatTest.java @@ -649,7 +649,6 @@ public class MediaExtractorCompatTest { return Extractor.RESULT_CONTINUE; }); mediaExtractorCompat.setDataSource(PLACEHOLDER_URI, /* offset= */ 0); - mediaExtractorCompat.selectTrack(/* trackIndex= */ 0); MediaFormat mediaFormat = mediaExtractorCompat.getTrackFormat(/* trackIndex= */ 0); @@ -671,7 +670,6 @@ public class MediaExtractorCompatTest { return Extractor.RESULT_CONTINUE; }); mediaExtractorCompat.setDataSource(PLACEHOLDER_URI, /* offset= */ 0); - mediaExtractorCompat.selectTrack(/* trackIndex= */ 0); MediaFormat mediaFormat = mediaExtractorCompat.getTrackFormat(/* trackIndex= */ 0); @@ -694,13 +692,35 @@ public class MediaExtractorCompatTest { return Extractor.RESULT_CONTINUE; }); mediaExtractorCompat.setDataSource(PLACEHOLDER_URI, /* offset= */ 0); - mediaExtractorCompat.selectTrack(/* trackIndex= */ 0); MediaFormat mediaFormat = mediaExtractorCompat.getTrackFormat(/* trackIndex= */ 0); assertThat(mediaFormat.containsKey(MediaFormat.KEY_DURATION)).isFalse(); } + @Test + public void getTrackFormat_withMultipleTracks_returnsCorrectTrackId() throws IOException { + fakeExtractor.addReadAction( + (input, seekPosition) -> { + TrackOutput output1 = extractorOutput.track(/* id= */ 1, C.TRACK_TYPE_VIDEO); + TrackOutput output2 = extractorOutput.track(/* id= */ 2, C.TRACK_TYPE_AUDIO); + extractorOutput.endTracks(); + output1.format(PLACEHOLDER_FORMAT_VIDEO); + output2.format(PLACEHOLDER_FORMAT_AUDIO); + return Extractor.RESULT_CONTINUE; + }); + + mediaExtractorCompat.setDataSource(PLACEHOLDER_URI, /* offset= */ 0); + + MediaFormat videoFormat = mediaExtractorCompat.getTrackFormat(/* trackIndex= */ 0); + assertThat(videoFormat.containsKey(MediaFormat.KEY_TRACK_ID)).isTrue(); + assertThat(videoFormat.getInteger(MediaFormat.KEY_TRACK_ID)).isEqualTo(1); + + MediaFormat audioFormat = mediaExtractorCompat.getTrackFormat(/* trackIndex= */ 1); + assertThat(audioFormat.containsKey(MediaFormat.KEY_TRACK_ID)).isTrue(); + assertThat(audioFormat.getInteger(MediaFormat.KEY_TRACK_ID)).isEqualTo(2); + } + @Test public void getLogSessionId_withUnsetSessionId_returnsNone() { assumeTrue(Util.SDK_INT >= 31); diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaExtractorCompat.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaExtractorCompat.java index 6965ef7586..9c791509bd 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaExtractorCompat.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaExtractorCompat.java @@ -1002,6 +1002,7 @@ public final class MediaExtractorCompat { FormatHolder scratchFormatHolder, DecoderInputBuffer scratchNoDataDecoderInputBuffer) { Format format = getFormat(scratchFormatHolder, scratchNoDataDecoderInputBuffer); MediaFormat mediaFormatResult = MediaFormatUtil.createMediaFormatFromFormat(format); + mediaFormatResult.setInteger(MediaFormat.KEY_TRACK_ID, getIdOfBackingTrack()); if (compatibilityTrackMimeType != null) { if (Util.SDK_INT >= 29) { mediaFormatResult.removeKey(MediaFormat.KEY_CODECS_STRING);