mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Add default implementations for ExoMediaDrm.Provider
Issue:#4721 PiperOrigin-RevId: 269378440
This commit is contained in:
parent
5630273155
commit
6ae3e0983a
2 changed files with 50 additions and 5 deletions
|
|
@ -46,6 +46,28 @@ public interface ExoMediaDrm<T extends ExoMediaCrypto> {
|
||||||
ExoMediaDrm<T> acquireExoMediaDrm(UUID uuid);
|
ExoMediaDrm<T> acquireExoMediaDrm(UUID uuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link Provider} implementation which provides an {@link ExoMediaDrm} instance owned by the
|
||||||
|
* app.
|
||||||
|
*
|
||||||
|
* <p>This provider should be used to manually handle {@link ExoMediaDrm} resources.
|
||||||
|
*/
|
||||||
|
final class AppManagedProvider<T extends ExoMediaCrypto> implements Provider<T> {
|
||||||
|
|
||||||
|
private final ExoMediaDrm<T> exoMediaDrm;
|
||||||
|
|
||||||
|
/** Creates an instance, which provides the given {@link ExoMediaDrm}. */
|
||||||
|
public AppManagedProvider(ExoMediaDrm<T> exoMediaDrm) {
|
||||||
|
this.exoMediaDrm = exoMediaDrm;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ExoMediaDrm<T> acquireExoMediaDrm(UUID uuid) {
|
||||||
|
exoMediaDrm.acquire();
|
||||||
|
return exoMediaDrm;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** @see MediaDrm#EVENT_KEY_REQUIRED */
|
/** @see MediaDrm#EVENT_KEY_REQUIRED */
|
||||||
@SuppressWarnings("InlinedApi")
|
@SuppressWarnings("InlinedApi")
|
||||||
int EVENT_KEY_REQUIRED = MediaDrm.EVENT_KEY_REQUIRED;
|
int EVENT_KEY_REQUIRED = MediaDrm.EVENT_KEY_REQUIRED;
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,22 @@ import java.util.UUID;
|
||||||
@TargetApi(23)
|
@TargetApi(23)
|
||||||
public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto> {
|
public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link ExoMediaDrm.Provider} that returns a new {@link FrameworkMediaDrm} for the requested
|
||||||
|
* UUID. Returns a {@link DummyExoMediaDrm} if the protection scheme identified by the given UUID
|
||||||
|
* is not supported by the device.
|
||||||
|
*
|
||||||
|
* <p>This provider should be used to make ExoPlayer handle {@link ExoMediaDrm} resources.
|
||||||
|
*/
|
||||||
|
public static final Provider<FrameworkMediaCrypto> DEFAULT_PROVIDER =
|
||||||
|
uuid -> {
|
||||||
|
try {
|
||||||
|
return newInstance(uuid);
|
||||||
|
} catch (UnsupportedDrmException e) {
|
||||||
|
return new DummyExoMediaDrm<>();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
private static final String CENC_SCHEME_MIME_TYPE = "cenc";
|
private static final String CENC_SCHEME_MIME_TYPE = "cenc";
|
||||||
private static final String MOCK_LA_URL_VALUE = "https://x";
|
private static final String MOCK_LA_URL_VALUE = "https://x";
|
||||||
private static final String MOCK_LA_URL = "<LA_URL>" + MOCK_LA_URL_VALUE + "</LA_URL>";
|
private static final String MOCK_LA_URL = "<LA_URL>" + MOCK_LA_URL_VALUE + "</LA_URL>";
|
||||||
|
|
@ -56,9 +72,11 @@ public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto
|
||||||
|
|
||||||
private final UUID uuid;
|
private final UUID uuid;
|
||||||
private final MediaDrm mediaDrm;
|
private final MediaDrm mediaDrm;
|
||||||
|
private int referenceCount;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an instance for the specified scheme UUID.
|
* Creates an instance with an {@link #acquire() acquired reference} for the specified scheme
|
||||||
|
* UUID.
|
||||||
*
|
*
|
||||||
* @param uuid The scheme uuid.
|
* @param uuid The scheme uuid.
|
||||||
* @return The created instance.
|
* @return The created instance.
|
||||||
|
|
@ -79,6 +97,8 @@ public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto
|
||||||
Assertions.checkArgument(!C.COMMON_PSSH_UUID.equals(uuid), "Use C.CLEARKEY_UUID instead");
|
Assertions.checkArgument(!C.COMMON_PSSH_UUID.equals(uuid), "Use C.CLEARKEY_UUID instead");
|
||||||
this.uuid = uuid;
|
this.uuid = uuid;
|
||||||
this.mediaDrm = new MediaDrm(adjustUuid(uuid));
|
this.mediaDrm = new MediaDrm(adjustUuid(uuid));
|
||||||
|
// Creators of an instance automatically acquire ownership of the created instance.
|
||||||
|
referenceCount = 1;
|
||||||
if (C.WIDEVINE_UUID.equals(uuid) && needsForceWidevineL3Workaround()) {
|
if (C.WIDEVINE_UUID.equals(uuid) && needsForceWidevineL3Workaround()) {
|
||||||
forceWidevineL3(mediaDrm);
|
forceWidevineL3(mediaDrm);
|
||||||
}
|
}
|
||||||
|
|
@ -186,14 +206,17 @@ public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void acquire() {
|
public synchronized void acquire() {
|
||||||
// TODO: Implement reference counting.
|
Assertions.checkState(referenceCount > 0);
|
||||||
|
referenceCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void release() {
|
public synchronized void release() {
|
||||||
|
if (--referenceCount == 0) {
|
||||||
mediaDrm.release();
|
mediaDrm.release();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void restoreKeys(byte[] sessionId, byte[] keySetId) {
|
public void restoreKeys(byte[] sessionId, byte[] keySetId) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue