Commit 3a53543a by aquilescanta Committed by Oliver Woodman

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
parent 0e7f0150
......@@ -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,
......
......@@ -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 {
......
......@@ -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)));
}
/**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment