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
This commit is contained in:
rohks 2024-11-04 06:36:07 -08:00 committed by Copybara-Service
parent 0270267e08
commit 278eaf47ad
2 changed files with 44 additions and 0 deletions

View File

@ -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) {

View File

@ -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<String, String> 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;