From 2866b2b3e4d1f0161a7d7f7b39562b75cae897aa Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Fri, 6 Sep 2019 13:12:16 +0100 Subject: [PATCH] Make renderers ignore drmInitData if the MediaSource provides a DrmSession Will allows to use a DrmSession for clear periods. Issue:#4867 PiperOrigin-RevId: 267576982 --- .../android/exoplayer2/BaseRenderer.java | 33 ++++++++++++++++++ .../audio/SimpleDecoderAudioRenderer.java | 34 +++++-------------- .../mediacodec/MediaCodecRenderer.java | 33 ++++-------------- .../video/SimpleDecoderVideoRenderer.java | 33 ++++-------------- 4 files changed, 55 insertions(+), 78 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java index f5db0145fe..f4e51a38a0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java @@ -15,13 +15,17 @@ */ package com.google.android.exoplayer2; +import android.os.Looper; import androidx.annotation.Nullable; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.drm.DrmInitData; +import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSessionManager; +import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.source.SampleStream; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.MediaClock; +import com.google.android.exoplayer2.util.Util; import java.io.IOException; /** @@ -283,6 +287,35 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities { return configuration; } + /** Returns a {@link DrmSession} ready for assignment, handling resource management. */ + @Nullable + protected final DrmSession getUpdatedSourceDrmSession( + @Nullable Format oldFormat, + Format newFormat, + @Nullable DrmSessionManager drmSessionManager, + @Nullable DrmSession existingSourceSession) + throws ExoPlaybackException { + boolean drmInitDataChanged = + !Util.areEqual(newFormat.drmInitData, oldFormat == null ? null : oldFormat.drmInitData); + if (!drmInitDataChanged) { + return existingSourceSession; + } + @Nullable DrmSession newSourceDrmSession = null; + if (newFormat.drmInitData != null) { + if (drmSessionManager == null) { + throw ExoPlaybackException.createForRenderer( + new IllegalStateException("Media requires a DrmSessionManager"), getIndex()); + } + newSourceDrmSession = + drmSessionManager.acquireSession( + Assertions.checkNotNull(Looper.myLooper()), newFormat.drmInitData); + } + if (existingSourceSession != null) { + existingSourceSession.releaseReference(); + } + return newSourceDrmSession; + } + /** * Returns the index of the renderer within the player. */ diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRenderer.java index 52d55b2c31..e92f1d63db 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRenderer.java @@ -17,7 +17,6 @@ package com.google.android.exoplayer2.audio; import android.media.audiofx.Virtualizer; import android.os.Handler; -import android.os.Looper; import android.os.SystemClock; import androidx.annotation.IntDef; import androidx.annotation.Nullable; @@ -673,32 +672,15 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements @SuppressWarnings("unchecked") private void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException { - Format oldFormat = inputFormat; - inputFormat = formatHolder.format; - - boolean drmInitDataChanged = !Util.areEqual(inputFormat.drmInitData, oldFormat == null ? null - : oldFormat.drmInitData); - if (drmInitDataChanged) { - if (inputFormat.drmInitData != null) { - - if (formatHolder.includesDrmSession) { - setSourceDrmSession((DrmSession) formatHolder.drmSession); - } else { - if (drmSessionManager == null) { - throw ExoPlaybackException.createForRenderer( - new IllegalStateException("Media requires a DrmSessionManager"), getIndex()); - } - DrmSession session = - drmSessionManager.acquireSession(Looper.myLooper(), inputFormat.drmInitData); - if (sourceDrmSession != null) { - sourceDrmSession.releaseReference(); - } - sourceDrmSession = session; - } - } else { - setSourceDrmSession(null); - } + Format newFormat = Assertions.checkNotNull(formatHolder.format); + if (formatHolder.includesDrmSession) { + setSourceDrmSession((DrmSession) formatHolder.drmSession); + } else { + sourceDrmSession = + getUpdatedSourceDrmSession(inputFormat, newFormat, drmSessionManager, sourceDrmSession); } + Format oldFormat = inputFormat; + inputFormat = newFormat; if (!canKeepCodec(oldFormat, inputFormat)) { if (decoderReceivedBuffers) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java index 45ae82d049..f853339474 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java @@ -23,7 +23,6 @@ import android.media.MediaCrypto; import android.media.MediaCryptoException; import android.media.MediaFormat; import android.os.Bundle; -import android.os.Looper; import android.os.SystemClock; import androidx.annotation.CheckResult; import androidx.annotation.IntDef; @@ -1200,33 +1199,15 @@ public abstract class MediaCodecRenderer extends BaseRenderer { */ @SuppressWarnings("unchecked") protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException { - Format oldFormat = inputFormat; - Format newFormat = formatHolder.format; - inputFormat = newFormat; waitingForFirstSampleInFormat = true; - - boolean drmInitDataChanged = - !Util.areEqual(newFormat.drmInitData, oldFormat == null ? null : oldFormat.drmInitData); - if (drmInitDataChanged) { - if (newFormat.drmInitData != null) { - if (formatHolder.includesDrmSession) { - setSourceDrmSession((DrmSession) formatHolder.drmSession); - } else { - if (drmSessionManager == null) { - throw ExoPlaybackException.createForRenderer( - new IllegalStateException("Media requires a DrmSessionManager"), getIndex()); - } - DrmSession session = - drmSessionManager.acquireSession(Looper.myLooper(), newFormat.drmInitData); - if (sourceDrmSession != null) { - sourceDrmSession.releaseReference(); - } - sourceDrmSession = session; - } - } else { - setSourceDrmSession(null); - } + Format newFormat = Assertions.checkNotNull(formatHolder.format); + if (formatHolder.includesDrmSession) { + setSourceDrmSession((DrmSession) formatHolder.drmSession); + } else { + sourceDrmSession = + getUpdatedSourceDrmSession(inputFormat, newFormat, drmSessionManager, sourceDrmSession); } + inputFormat = newFormat; if (codec == null) { maybeInitCodec(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/SimpleDecoderVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/SimpleDecoderVideoRenderer.java index 39c3aa2621..d69ad25ba2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/SimpleDecoderVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/SimpleDecoderVideoRenderer.java @@ -16,7 +16,6 @@ package com.google.android.exoplayer2.video; import android.os.Handler; -import android.os.Looper; import android.os.SystemClock; import android.view.Surface; import androidx.annotation.CallSuper; @@ -38,7 +37,6 @@ import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.TimedValueQueue; import com.google.android.exoplayer2.util.TraceUtil; -import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoRendererEventListener.EventDispatcher; import java.lang.annotation.Documented; import java.lang.annotation.Retention; @@ -363,32 +361,15 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer { @CallSuper @SuppressWarnings("unchecked") protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException { - Format oldFormat = format; - format = formatHolder.format; pendingFormat = format; - - boolean drmInitDataChanged = - !Util.areEqual(format.drmInitData, oldFormat == null ? null : oldFormat.drmInitData); - if (drmInitDataChanged) { - if (format.drmInitData != null) { - if (formatHolder.includesDrmSession) { - setSourceDrmSession((DrmSession) formatHolder.drmSession); - } else { - if (drmSessionManager == null) { - throw ExoPlaybackException.createForRenderer( - new IllegalStateException("Media requires a DrmSessionManager"), getIndex()); - } - DrmSession session = - drmSessionManager.acquireSession(Looper.myLooper(), format.drmInitData); - if (sourceDrmSession != null) { - sourceDrmSession.releaseReference(); - } - sourceDrmSession = session; - } - } else { - setSourceDrmSession(null); - } + Format newFormat = Assertions.checkNotNull(formatHolder.format); + if (formatHolder.includesDrmSession) { + setSourceDrmSession((DrmSession) formatHolder.drmSession); + } else { + sourceDrmSession = + getUpdatedSourceDrmSession(format, newFormat, drmSessionManager, sourceDrmSession); } + format = newFormat; if (sourceDrmSession != decoderDrmSession) { if (decoderReceivedBuffers) {