diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 95557fec2f..718bb35eb0 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -19,6 +19,9 @@ * Metadata: * Image: * DRM: + * Allow setting a `LoadErrorHandlingPolicy` on + `DefaultDrmSessionManagerProvider` + ([#1271](https://github.com/androidx/media/issues/1271)). * Effect: * Muxers: * IMA extension: diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DefaultDrmSessionManagerProvider.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DefaultDrmSessionManagerProvider.java index e015f93a50..ad6ad520b3 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DefaultDrmSessionManagerProvider.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DefaultDrmSessionManagerProvider.java @@ -25,6 +25,7 @@ import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.Util; import androidx.media3.datasource.DataSource; import androidx.media3.datasource.DefaultHttpDataSource; +import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy; import com.google.common.primitives.Ints; import java.util.Map; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @@ -43,6 +44,7 @@ public final class DefaultDrmSessionManagerProvider implements DrmSessionManager @Nullable private DataSource.Factory drmHttpDataSourceFactory; @Nullable private String userAgent; + @Nullable private LoadErrorHandlingPolicy drmLoadErrorHandlingPolicy; public DefaultDrmSessionManagerProvider() { lock = new Object(); @@ -69,6 +71,18 @@ public final class DefaultDrmSessionManagerProvider implements DrmSessionManager this.userAgent = userAgent; } + /** + * Sets a load error handling policy to pass to {@link + * DefaultDrmSessionManager.Builder#setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)}. + * + *

If {@code null} is passed the setter is not called, so the default {@link + * LoadErrorHandlingPolicy} defined by {@link DefaultDrmSessionManager.Builder#Builder()} is used + * instead. + */ + public void setDrmLoadErrorHandlingPolicy(LoadErrorHandlingPolicy drmLoadErrorHandlingPolicy) { + this.drmLoadErrorHandlingPolicy = drmLoadErrorHandlingPolicy; + } + @Override public DrmSessionManager get(MediaItem mediaItem) { checkNotNull(mediaItem.localConfiguration); @@ -100,15 +114,18 @@ public final class DefaultDrmSessionManagerProvider implements DrmSessionManager for (Map.Entry entry : drmConfiguration.licenseRequestHeaders.entrySet()) { httpDrmCallback.setKeyRequestProperty(entry.getKey(), entry.getValue()); } - DefaultDrmSessionManager drmSessionManager = + DefaultDrmSessionManager.Builder drmSessionManagerBuilder = new DefaultDrmSessionManager.Builder() .setUuidAndExoMediaDrmProvider( drmConfiguration.scheme, FrameworkMediaDrm.DEFAULT_PROVIDER) .setMultiSession(drmConfiguration.multiSession) .setPlayClearSamplesWithoutKeys(drmConfiguration.playClearContentWithoutKey) .setUseDrmSessionsForClearContent( - Ints.toArray(drmConfiguration.forcedSessionTrackTypes)) - .build(httpDrmCallback); + Ints.toArray(drmConfiguration.forcedSessionTrackTypes)); + if (drmLoadErrorHandlingPolicy != null) { + drmSessionManagerBuilder.setLoadErrorHandlingPolicy(drmLoadErrorHandlingPolicy); + } + DefaultDrmSessionManager drmSessionManager = drmSessionManagerBuilder.build(httpDrmCallback); drmSessionManager.setMode(MODE_PLAYBACK, drmConfiguration.getKeySetId()); return drmSessionManager; }