From 278eaf47ade51381fff73931b164ce85bd9bec21 Mon Sep 17 00:00:00 2001 From: rohks Date: Mon, 4 Nov 2024 06:36:07 -0800 Subject: [PATCH] Add log session ID APIs to `MediaExtractorCompat` Implemented `setLogSessionId(LogSessionId)` and `getLogSessionId()` methods. Note: The `LogSessionId` is currently **not** forwarded to `MediaParser`, but this will be addressed once `MediaParser` can be used to configure `MediaExtractorCompat`. PiperOrigin-RevId: 692945255 --- .../exoplayer/MediaExtractorCompatTest.java | 28 +++++++++++++++++++ .../exoplayer/MediaExtractorCompat.java | 16 +++++++++++ 2 files changed, 44 insertions(+) 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 eb1ed0c3db..fb606f23ed 100644 --- a/libraries/exoplayer/src/androidTest/java/androidx/media3/exoplayer/MediaExtractorCompatTest.java +++ b/libraries/exoplayer/src/androidTest/java/androidx/media3/exoplayer/MediaExtractorCompatTest.java @@ -17,16 +17,21 @@ package androidx.media3.exoplayer; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; +import static org.junit.Assume.assumeTrue; import android.content.Context; import android.media.MediaExtractor; import android.media.MediaFormat; +import android.media.metrics.LogSessionId; +import android.media.metrics.MediaMetricsManager; +import android.media.metrics.PlaybackSession; import android.net.Uri; import androidx.media3.common.C; import androidx.media3.common.Format; import androidx.media3.common.MimeTypes; import androidx.media3.common.ParserException; import androidx.media3.common.util.ParsableByteArray; +import androidx.media3.common.util.Util; import androidx.media3.datasource.DefaultDataSource; import androidx.media3.exoplayer.upstream.Allocator; import androidx.media3.extractor.Extractor; @@ -41,6 +46,7 @@ import androidx.media3.extractor.TrackOutput; import androidx.media3.test.utils.TestUtil; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; @@ -687,6 +693,28 @@ public class MediaExtractorCompatTest { assertThat(mediaFormat.containsKey(MediaFormat.KEY_DURATION)).isFalse(); } + @Test + public void getLogSessionId_withUnsetSessionId_returnsNone() { + assumeTrue(Util.SDK_INT >= 31); + assertThat(mediaExtractorCompat.getLogSessionId()).isEqualTo(LogSessionId.LOG_SESSION_ID_NONE); + } + + @Test + public void getLogSessionId_withSetSessionId_returnsSetSessionId() { + assumeTrue(Util.SDK_INT >= 31); + + MediaMetricsManager mediaMetricsManager = + InstrumentationRegistry.getInstrumentation() + .getTargetContext() + .getSystemService(MediaMetricsManager.class); + PlaybackSession playbackSession = mediaMetricsManager.createPlaybackSession(); + LogSessionId logSessionId = playbackSession.getSessionId(); + + mediaExtractorCompat.setLogSessionId(logSessionId); + + assertThat(mediaExtractorCompat.getLogSessionId()).isEqualTo(logSessionId); + } + // Internal methods. private void assertReadSample(int trackIndex, long timeUs, int size, byte... sampleData) { 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 6fb494fdca..4e7621ed03 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaExtractorCompat.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaExtractorCompat.java @@ -27,6 +27,7 @@ import android.content.res.AssetFileDescriptor; import android.media.MediaDataSource; import android.media.MediaExtractor; import android.media.MediaFormat; +import android.media.metrics.LogSessionId; import android.net.Uri; import android.util.SparseArray; import androidx.annotation.IntDef; @@ -138,6 +139,7 @@ public final class MediaExtractorCompat { private boolean tracksEnded; private int upstreamFormatsCount; @Nullable private Map httpRequestHeaders; + @Nullable private LogSessionId logSessionId; /** Creates a new instance. */ public MediaExtractorCompat(Context context) { @@ -572,6 +574,20 @@ public final class MediaExtractorCompat { return sampleMetadataQueue.peekFirst().flags; } + /** Sets the {@link LogSessionId} for MediaExtractorCompat. */ + @RequiresApi(31) + public void setLogSessionId(LogSessionId logSessionId) { + if (!logSessionId.equals(LogSessionId.LOG_SESSION_ID_NONE)) { + this.logSessionId = logSessionId; + } + } + + /** Returns the {@link LogSessionId} for MediaExtractorCompat. */ + @RequiresApi(31) + public LogSessionId getLogSessionId() { + return logSessionId != null ? logSessionId : LogSessionId.LOG_SESSION_ID_NONE; + } + @VisibleForTesting(otherwise = NONE) public Allocator getAllocator() { return allocator;