From 3a53543a9af343e23d34af6fdfa551d9baf05464 Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Mon, 22 Jul 2019 19:27:05 +0100 Subject: [PATCH] Move HLS DrmInitData adjustment to the writing side + Emulates what's done for ID3 stripping. + Also avoid a copy if fields will not change because of the copy. PiperOrigin-RevId: 259369101 --- .../com/google/android/exoplayer2/Format.java | 40 +++++-------------- .../source/DecryptableSampleQueueReader.java | 20 ---------- .../source/hls/HlsSampleStreamWrapper.java | 19 +++++++-- 3 files changed, 25 insertions(+), 54 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Format.java b/library/core/src/main/java/com/google/android/exoplayer2/Format.java index df01df1708..b2bd20f0fe 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Format.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Format.java @@ -1291,39 +1291,19 @@ public final class Format implements Parcelable { } public Format copyWithDrmInitData(@Nullable DrmInitData drmInitData) { - return new Format( - id, - label, - selectionFlags, - roleFlags, - bitrate, - codecs, - metadata, - containerMimeType, - sampleMimeType, - maxInputSize, - initializationData, - drmInitData, - subsampleOffsetUs, - width, - height, - frameRate, - rotationDegrees, - pixelWidthHeightRatio, - projectionData, - stereoMode, - colorInfo, - channelCount, - sampleRate, - pcmEncoding, - encoderDelay, - encoderPadding, - language, - accessibilityChannel, - exoMediaCryptoType); + return copyWithAdjustments(drmInitData, metadata); } public Format copyWithMetadata(@Nullable Metadata metadata) { + return copyWithAdjustments(drmInitData, metadata); + } + + @SuppressWarnings("ReferenceEquality") + public Format copyWithAdjustments( + @Nullable DrmInitData drmInitData, @Nullable Metadata metadata) { + if (drmInitData == this.drmInitData && metadata == this.metadata) { + return this; + } return new Format( id, label, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DecryptableSampleQueueReader.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DecryptableSampleQueueReader.java index b0b10d4e98..365a48cadf 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DecryptableSampleQueueReader.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DecryptableSampleQueueReader.java @@ -27,8 +27,6 @@ import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** @@ -41,7 +39,6 @@ public final class DecryptableSampleQueueReader { private final DrmSessionManager sessionManager; private final FormatHolder formatHolder; private final boolean playClearSamplesWithoutKeys; - private final HashMap overridingDrmInitDatas; private @MonotonicNonNull Format currentFormat; @Nullable private DrmSession currentSession; @@ -58,19 +55,6 @@ public final class DecryptableSampleQueueReader { formatHolder = new FormatHolder(); playClearSamplesWithoutKeys = (sessionManager.getFlags() & DrmSessionManager.FLAG_PLAY_CLEAR_SAMPLES_WITHOUT_KEYS) != 0; - overridingDrmInitDatas = new HashMap<>(); - } - - /** - * Given a mapping from {@link DrmInitData#schemeType} to {@link DrmInitData}, overrides any - * {@link DrmInitData} read from the upstream {@link SampleQueue} whose {@link - * DrmInitData#schemeType} is a key in the mapping to use the corresponding {@link DrmInitData} - * value. If {@code overridingDrmInitDatas} does not contain a mapping for the upstream {@link - * DrmInitData#schemeType}, the upstream {@link DrmInitData} is used. - */ - public void setOverridingDrmInitDatas(Map overridingDrmInitDatas) { - this.overridingDrmInitDatas.clear(); - this.overridingDrmInitDatas.putAll(overridingDrmInitDatas); } /** Releases any resources acquired by this reader. */ @@ -192,10 +176,6 @@ public final class DecryptableSampleQueueReader { DrmSession previousSession = currentSession; DrmInitData drmInitData = currentFormat.drmInitData; if (drmInitData != null) { - DrmInitData overridingDrmInitData = overridingDrmInitDatas.get(drmInitData.schemeType); - if (overridingDrmInitData != null) { - drmInitData = overridingDrmInitData; - } currentSession = sessionManager.acquireSession(Assertions.checkNotNull(Looper.myLooper()), drmInitData); } else { diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index 079852c4d4..360a7d6f72 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -828,7 +828,7 @@ import java.util.Set; return createDummyTrackOutput(id, type); } } - SampleQueue trackOutput = new PrivTimestampStrippingSampleQueue(allocator); + SampleQueue trackOutput = new FormatAdjustingSampleQueue(allocator, overridingDrmInitData); trackOutput.setSampleOffsetUs(sampleOffsetUs); trackOutput.sourceId(chunkUid); trackOutput.setUpstreamFormatChangeListener(this); @@ -1170,15 +1170,26 @@ import java.util.Set; return new DummyTrackOutput(); } - private static final class PrivTimestampStrippingSampleQueue extends SampleQueue { + private static final class FormatAdjustingSampleQueue extends SampleQueue { - public PrivTimestampStrippingSampleQueue(Allocator allocator) { + private final Map overridingDrmInitData; + + public FormatAdjustingSampleQueue( + Allocator allocator, Map overridingDrmInitData) { super(allocator); + this.overridingDrmInitData = overridingDrmInitData; } @Override public void format(Format format) { - super.format(format.copyWithMetadata(getAdjustedMetadata(format.metadata))); + DrmInitData drmInitData = format.drmInitData; + if (drmInitData != null) { + DrmInitData overridingDrmInitData = this.overridingDrmInitData.get(drmInitData.schemeType); + if (overridingDrmInitData != null) { + drmInitData = overridingDrmInitData; + } + } + super.format(format.copyWithAdjustments(drmInitData, getAdjustedMetadata(format.metadata))); } /**