mirror of
https://github.com/androidx/media.git
synced 2025-05-11 09:39:52 +08:00
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:
parent
0e7f015020
commit
3a53543a9a
@ -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)));
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user