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) {
|
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,
|
||||||
|
@ -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 {
|
||||||
|
@ -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)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user