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

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.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<String, DrmInitData> 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<String, DrmInitData> 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 {

View File

@ -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<String, DrmInitData> overridingDrmInitData;
public FormatAdjustingSampleQueue(
Allocator allocator, Map<String, DrmInitData> 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)));
}
/**