From 48118f3c87d66fb6319f0553ad6a0d2a4a93f0d7 Mon Sep 17 00:00:00 2001 From: tonihei Date: Fri, 19 Nov 2021 10:33:51 +0000 Subject: [PATCH] Set LogSessionId on MediaParser for DASH sources. This requires some plumbing through DashMediaPeriod and DashChunkSource. PiperOrigin-RevId: 411012115 --- .../source/chunk/BundledChunkExtractor.java | 3 ++- .../exoplayer/source/chunk/ChunkExtractor.java | 6 +++++- .../source/chunk/MediaParserChunkExtractor.java | 17 ++++++++++++++--- .../media3/exoplayer/dash/DashChunkSource.java | 5 ++++- .../media3/exoplayer/dash/DashMediaPeriod.java | 9 +++++++-- .../media3/exoplayer/dash/DashMediaSource.java | 3 ++- .../exoplayer/dash/DefaultDashChunkSource.java | 14 ++++++++++---- .../exoplayer/dash/DashMediaPeriodTest.java | 4 +++- .../dash/DefaultDashChunkSourceTest.java | 10 +++++++--- 9 files changed, 54 insertions(+), 17 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/BundledChunkExtractor.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/BundledChunkExtractor.java index 172698d3d3..924eb0c4f0 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/BundledChunkExtractor.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/BundledChunkExtractor.java @@ -53,7 +53,8 @@ public final class BundledChunkExtractor implements ExtractorOutput, ChunkExtrac format, enableEventMessageTrack, closedCaptionFormats, - playerEmsgTrackOutput) -> { + playerEmsgTrackOutput, + playerId) -> { @Nullable String containerMimeType = format.containerMimeType; Extractor extractor; if (MimeTypes.isText(containerMimeType)) { diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkExtractor.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkExtractor.java index a6ae74ee03..4089f0cbf4 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkExtractor.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkExtractor.java @@ -19,6 +19,7 @@ import androidx.annotation.Nullable; import androidx.media3.common.C; import androidx.media3.common.Format; import androidx.media3.common.util.UnstableApi; +import androidx.media3.exoplayer.analytics.PlayerId; import androidx.media3.extractor.ChunkIndex; import androidx.media3.extractor.ExtractorInput; import androidx.media3.extractor.TrackOutput; @@ -44,6 +45,8 @@ public interface ChunkExtractor { * @param representationFormat The format of the representation to extract from. * @param enableEventMessageTrack Whether to enable the event message track. * @param closedCaptionFormats The {@link Format Formats} of the Closed-Caption tracks. + * @param playerEmsgTrackOutput The {@link TrackOutput} for extracted EMSG messages, or null. + * @param playerId The {@link PlayerId} of the player using this chunk extractor. * @return A new {@link ChunkExtractor} instance, or null if not applicable. */ @Nullable @@ -52,7 +55,8 @@ public interface ChunkExtractor { Format representationFormat, boolean enableEventMessageTrack, List closedCaptionFormats, - @Nullable TrackOutput playerEmsgTrackOutput); + @Nullable TrackOutput playerEmsgTrackOutput, + PlayerId playerId); } /** Provides {@link TrackOutput} instances to be written to during extraction. */ diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/MediaParserChunkExtractor.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/MediaParserChunkExtractor.java index 630c79c82b..9c364bf2cd 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/MediaParserChunkExtractor.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/MediaParserChunkExtractor.java @@ -34,6 +34,8 @@ import androidx.media3.common.MimeTypes; import androidx.media3.common.util.Assertions; import androidx.media3.common.util.Log; import androidx.media3.common.util.UnstableApi; +import androidx.media3.common.util.Util; +import androidx.media3.exoplayer.analytics.PlayerId; import androidx.media3.exoplayer.source.mediaparser.InputReaderAdapterV30; import androidx.media3.exoplayer.source.mediaparser.MediaParserUtil; import androidx.media3.exoplayer.source.mediaparser.OutputConsumerAdapterV30; @@ -60,10 +62,12 @@ public final class MediaParserChunkExtractor implements ChunkExtractor { format, enableEventMessageTrack, closedCaptionFormats, - playerEmsgTrackOutput) -> { + playerEmsgTrackOutput, + playerId) -> { if (!MimeTypes.isText(format.containerMimeType)) { // Container is either Matroska or Fragmented MP4. - return new MediaParserChunkExtractor(primaryTrackType, format, closedCaptionFormats); + return new MediaParserChunkExtractor( + primaryTrackType, format, closedCaptionFormats, playerId); } else { // This is either RAWCC (unsupported) or a text track that does not require an extractor. Log.w(TAG, "Ignoring an unsupported text track."); @@ -88,10 +92,14 @@ public final class MediaParserChunkExtractor implements ChunkExtractor { * @param manifestFormat The chunks {@link Format} as obtained from the manifest. * @param closedCaptionFormats A list containing the {@link Format Formats} of the closed-caption * tracks in the chunks. + * @param playerId The {@link PlayerId} of the player this chunk extractor is used for. */ @SuppressLint("WrongConstant") public MediaParserChunkExtractor( - @C.TrackType int primaryTrackType, Format manifestFormat, List closedCaptionFormats) { + @C.TrackType int primaryTrackType, + Format manifestFormat, + List closedCaptionFormats, + PlayerId playerId) { outputConsumerAdapter = new OutputConsumerAdapterV30( manifestFormat, primaryTrackType, /* expectDummySeekMap= */ true); @@ -116,6 +124,9 @@ public final class MediaParserChunkExtractor implements ChunkExtractor { MediaParserUtil.toCaptionsMediaFormat(closedCaptionFormats.get(i))); } mediaParser.setParameter(PARAMETER_EXPOSE_CAPTION_FORMATS, closedCaptionMediaFormats); + if (Util.SDK_INT >= 31) { + MediaParserUtil.setLogSessionIdOnMediaParser(mediaParser, playerId); + } outputConsumerAdapter.setMuxedCaptionFormats(closedCaptionFormats); trackOutputProviderAdapter = new TrackOutputProviderAdapter(); dummyTrackOutput = new DummyTrackOutput(); diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashChunkSource.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashChunkSource.java index 01f822d9e2..11c18a3970 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashChunkSource.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashChunkSource.java @@ -21,6 +21,7 @@ import androidx.media3.common.C; import androidx.media3.common.Format; import androidx.media3.common.util.UnstableApi; import androidx.media3.datasource.TransferListener; +import androidx.media3.exoplayer.analytics.PlayerId; import androidx.media3.exoplayer.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler; import androidx.media3.exoplayer.dash.manifest.DashManifest; import androidx.media3.exoplayer.source.chunk.ChunkSource; @@ -51,6 +52,7 @@ public interface DashChunkSource extends ChunkSource { * @param closedCaptionFormats The {@link Format Formats} of closed caption tracks to be output. * @param transferListener The transfer listener which should be informed of any data transfers. * May be null if no listener is available. + * @param playerId The {@link PlayerId} of the player using this chunk source. * @return The created {@link DashChunkSource}. */ DashChunkSource createDashChunkSource( @@ -65,7 +67,8 @@ public interface DashChunkSource extends ChunkSource { boolean enableEventMessageTrack, List closedCaptionFormats, @Nullable PlayerTrackEmsgHandler playerEmsgHandler, - @Nullable TransferListener transferListener); + @Nullable TransferListener transferListener, + PlayerId playerId); } /** diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaPeriod.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaPeriod.java index 2fe55a5f04..67aeb8011e 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaPeriod.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaPeriod.java @@ -31,6 +31,7 @@ import androidx.media3.common.TrackGroupArray; import androidx.media3.common.util.Util; import androidx.media3.datasource.TransferListener; import androidx.media3.exoplayer.SeekParameters; +import androidx.media3.exoplayer.analytics.PlayerId; import androidx.media3.exoplayer.dash.PlayerEmsgHandler.PlayerEmsgCallback; import androidx.media3.exoplayer.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler; import androidx.media3.exoplayer.dash.manifest.AdaptationSet; @@ -96,6 +97,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; trackEmsgHandlerBySampleStream; private final MediaSourceEventListener.EventDispatcher mediaSourceEventDispatcher; private final DrmSessionEventListener.EventDispatcher drmEventDispatcher; + private final PlayerId playerId; @Nullable private Callback callback; private ChunkSampleStream[] sampleStreams; @@ -120,7 +122,8 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; LoaderErrorThrower manifestLoaderErrorThrower, Allocator allocator, CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory, - PlayerEmsgCallback playerEmsgCallback) { + PlayerEmsgCallback playerEmsgCallback, + PlayerId playerId) { this.id = id; this.manifest = manifest; this.baseUrlExclusionList = baseUrlExclusionList; @@ -135,6 +138,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; this.manifestLoaderErrorThrower = manifestLoaderErrorThrower; this.allocator = allocator; this.compositeSequenceableLoaderFactory = compositeSequenceableLoaderFactory; + this.playerId = playerId; playerEmsgHandler = new PlayerEmsgHandler(manifest, playerEmsgCallback, allocator); sampleStreams = newSampleStreamArray(0); eventSampleStreams = new EventSampleStream[0]; @@ -777,7 +781,8 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; enableEventMessageTrack, embeddedClosedCaptionTrackFormats, trackPlayerEmsgHandler, - transferListener); + transferListener, + playerId); ChunkSampleStream stream = new ChunkSampleStream<>( trackGroupInfo.trackType, diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java index aa23d56b79..af9d6ddbbd 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java @@ -600,7 +600,8 @@ public final class DashMediaSource extends BaseMediaSource { manifestLoadErrorThrower, allocator, compositeSequenceableLoaderFactory, - playerEmsgCallback); + playerEmsgCallback, + getPlayerId()); periodsById.put(mediaPeriod.id, mediaPeriod); return mediaPeriod; } diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DefaultDashChunkSource.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DefaultDashChunkSource.java index a913be8801..4be30e9115 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DefaultDashChunkSource.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DefaultDashChunkSource.java @@ -31,6 +31,7 @@ import androidx.media3.datasource.DataSpec; import androidx.media3.datasource.HttpDataSource.InvalidResponseCodeException; import androidx.media3.datasource.TransferListener; import androidx.media3.exoplayer.SeekParameters; +import androidx.media3.exoplayer.analytics.PlayerId; import androidx.media3.exoplayer.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler; import androidx.media3.exoplayer.dash.manifest.AdaptationSet; import androidx.media3.exoplayer.dash.manifest.BaseUrl; @@ -112,7 +113,8 @@ public class DefaultDashChunkSource implements DashChunkSource { boolean enableEventMessageTrack, List closedCaptionFormats, @Nullable PlayerTrackEmsgHandler playerEmsgHandler, - @Nullable TransferListener transferListener) { + @Nullable TransferListener transferListener, + PlayerId playerId) { DataSource dataSource = dataSourceFactory.createDataSource(); if (transferListener != null) { dataSource.addTransferListener(transferListener); @@ -131,7 +133,8 @@ public class DefaultDashChunkSource implements DashChunkSource { maxSegmentsPerLoad, enableEventMessageTrack, closedCaptionFormats, - playerEmsgHandler); + playerEmsgHandler, + playerId); } } @@ -173,6 +176,7 @@ public class DefaultDashChunkSource implements DashChunkSource { * @param closedCaptionFormats The {@link Format Formats} of closed caption tracks to be output. * @param playerTrackEmsgHandler The {@link PlayerTrackEmsgHandler} instance to handle emsg * messages targeting the player. Maybe null if this is not necessary. + * @param playerId The {@link PlayerId} of the player using this chunk source. */ public DefaultDashChunkSource( ChunkExtractor.Factory chunkExtractorFactory, @@ -188,7 +192,8 @@ public class DefaultDashChunkSource implements DashChunkSource { int maxSegmentsPerLoad, boolean enableEventMessageTrack, List closedCaptionFormats, - @Nullable PlayerTrackEmsgHandler playerTrackEmsgHandler) { + @Nullable PlayerTrackEmsgHandler playerTrackEmsgHandler, + PlayerId playerId) { this.manifestLoaderErrorThrower = manifestLoaderErrorThrower; this.manifest = manifest; this.baseUrlExclusionList = baseUrlExclusionList; @@ -219,7 +224,8 @@ public class DefaultDashChunkSource implements DashChunkSource { representation.format, enableEventMessageTrack, closedCaptionFormats, - playerTrackEmsgHandler), + playerTrackEmsgHandler, + playerId), /* segmentNumShift= */ 0, representation.getIndex()); } diff --git a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DashMediaPeriodTest.java b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DashMediaPeriodTest.java index 4a904b1f28..6fc8279dbd 100644 --- a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DashMediaPeriodTest.java +++ b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DashMediaPeriodTest.java @@ -23,6 +23,7 @@ import androidx.media3.common.MimeTypes; import androidx.media3.common.TrackGroup; import androidx.media3.common.TrackGroupArray; import androidx.media3.datasource.TransferListener; +import androidx.media3.exoplayer.analytics.PlayerId; import androidx.media3.exoplayer.dash.PlayerEmsgHandler.PlayerEmsgCallback; import androidx.media3.exoplayer.dash.manifest.AdaptationSet; import androidx.media3.exoplayer.dash.manifest.DashManifest; @@ -212,7 +213,8 @@ public final class DashMediaPeriodTest { mock(LoaderErrorThrower.class), mock(Allocator.class), mock(CompositeSequenceableLoaderFactory.class), - mock(PlayerEmsgCallback.class)); + mock(PlayerEmsgCallback.class), + PlayerId.UNSET); } private static DashManifest parseManifest(String fileName) throws IOException { diff --git a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DefaultDashChunkSourceTest.java b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DefaultDashChunkSourceTest.java index 06a4859037..6811ebe02b 100644 --- a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DefaultDashChunkSourceTest.java +++ b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DefaultDashChunkSourceTest.java @@ -29,6 +29,7 @@ import androidx.media3.common.util.Assertions; import androidx.media3.common.util.Util; import androidx.media3.datasource.DataSpec; import androidx.media3.datasource.HttpDataSource; +import androidx.media3.exoplayer.analytics.PlayerId; import androidx.media3.exoplayer.dash.manifest.DashManifest; import androidx.media3.exoplayer.dash.manifest.DashManifestParser; import androidx.media3.exoplayer.source.LoadEventInfo; @@ -95,7 +96,8 @@ public class DefaultDashChunkSourceTest { /* maxSegmentsPerLoad= */ 1, /* enableEventMessageTrack= */ false, /* closedCaptionFormats */ ImmutableList.of(), - /* playerTrackEmsgHandler= */ null); + /* playerTrackEmsgHandler= */ null, + PlayerId.UNSET); long nowInPeriodUs = Util.msToUs(nowMs - manifest.availabilityStartTimeMs); ChunkHolder output = new ChunkHolder(); @@ -143,7 +145,8 @@ public class DefaultDashChunkSourceTest { /* maxSegmentsPerLoad= */ 1, /* enableEventMessageTrack= */ false, /* closedCaptionFormats */ ImmutableList.of(), - /* playerTrackEmsgHandler= */ null); + /* playerTrackEmsgHandler= */ null, + PlayerId.UNSET); ChunkHolder output = new ChunkHolder(); chunkSource.getNextChunk( @@ -326,7 +329,8 @@ public class DefaultDashChunkSourceTest { /* maxSegmentsPerLoad= */ 1, /* enableEventMessageTrack= */ false, /* closedCaptionFormats */ ImmutableList.of(), - /* playerTrackEmsgHandler= */ null); + /* playerTrackEmsgHandler= */ null, + PlayerId.UNSET); } private LoadErrorHandlingPolicy.LoadErrorInfo createFakeLoadErrorInfo(