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
This commit is contained in:
aquilescanta 2019-07-22 19:27:05 +01:00 committed by Oliver Woodman
parent 0e7f015020
commit 3a53543a9a
3 changed files with 25 additions and 54 deletions

View File

@ -1291,39 +1291,19 @@ public final class Format implements Parcelable {
} }
public Format copyWithDrmInitData(@Nullable DrmInitData drmInitData) { public Format copyWithDrmInitData(@Nullable DrmInitData drmInitData) {
return new Format( return copyWithAdjustments(drmInitData, metadata);
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);
} }
public Format copyWithMetadata(@Nullable Metadata 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( return new Format(
id, id,
label, label,

View File

@ -27,8 +27,6 @@ import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
/** /**
@ -41,7 +39,6 @@ public final class DecryptableSampleQueueReader {
private final DrmSessionManager<?> sessionManager; private final DrmSessionManager<?> sessionManager;
private final FormatHolder formatHolder; private final FormatHolder formatHolder;
private final boolean playClearSamplesWithoutKeys; private final boolean playClearSamplesWithoutKeys;
private final HashMap<String, DrmInitData> overridingDrmInitDatas;
private @MonotonicNonNull Format currentFormat; private @MonotonicNonNull Format currentFormat;
@Nullable private DrmSession<?> currentSession; @Nullable private DrmSession<?> currentSession;
@ -58,19 +55,6 @@ public final class DecryptableSampleQueueReader {
formatHolder = new FormatHolder(); formatHolder = new FormatHolder();
playClearSamplesWithoutKeys = playClearSamplesWithoutKeys =
(sessionManager.getFlags() & DrmSessionManager.FLAG_PLAY_CLEAR_SAMPLES_WITHOUT_KEYS) != 0; (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<String, DrmInitData> overridingDrmInitDatas) {
this.overridingDrmInitDatas.clear();
this.overridingDrmInitDatas.putAll(overridingDrmInitDatas);
} }
/** Releases any resources acquired by this reader. */ /** Releases any resources acquired by this reader. */
@ -192,10 +176,6 @@ public final class DecryptableSampleQueueReader {
DrmSession<?> previousSession = currentSession; DrmSession<?> previousSession = currentSession;
DrmInitData drmInitData = currentFormat.drmInitData; DrmInitData drmInitData = currentFormat.drmInitData;
if (drmInitData != null) { if (drmInitData != null) {
DrmInitData overridingDrmInitData = overridingDrmInitDatas.get(drmInitData.schemeType);
if (overridingDrmInitData != null) {
drmInitData = overridingDrmInitData;
}
currentSession = currentSession =
sessionManager.acquireSession(Assertions.checkNotNull(Looper.myLooper()), drmInitData); sessionManager.acquireSession(Assertions.checkNotNull(Looper.myLooper()), drmInitData);
} else { } else {

View File

@ -828,7 +828,7 @@ import java.util.Set;
return createDummyTrackOutput(id, type); return createDummyTrackOutput(id, type);
} }
} }
SampleQueue trackOutput = new PrivTimestampStrippingSampleQueue(allocator); SampleQueue trackOutput = new FormatAdjustingSampleQueue(allocator, overridingDrmInitData);
trackOutput.setSampleOffsetUs(sampleOffsetUs); trackOutput.setSampleOffsetUs(sampleOffsetUs);
trackOutput.sourceId(chunkUid); trackOutput.sourceId(chunkUid);
trackOutput.setUpstreamFormatChangeListener(this); trackOutput.setUpstreamFormatChangeListener(this);
@ -1170,15 +1170,26 @@ import java.util.Set;
return new DummyTrackOutput(); return new DummyTrackOutput();
} }
private static final class PrivTimestampStrippingSampleQueue extends SampleQueue { private static final class FormatAdjustingSampleQueue extends SampleQueue {
public PrivTimestampStrippingSampleQueue(Allocator allocator) { private final Map<String, DrmInitData> overridingDrmInitData;
public FormatAdjustingSampleQueue(
Allocator allocator, Map<String, DrmInitData> overridingDrmInitData) {
super(allocator); super(allocator);
this.overridingDrmInitData = overridingDrmInitData;
} }
@Override @Override
public void format(Format format) { 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)));
} }
/** /**