diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 8cd1e5fdd1..5554041b59 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -6,6 +6,7 @@ * Fix gradle config to allow specifying a relative path for `exoplayerRoot` when [depending on ExoPlayer locally](README.md#locally) ([#8927](https://github.com/google/ExoPlayer/issues/8927)). + * Add `needsReconfiguration` API to the `MediaCodecAdapter` interface. * Update `MediaItem.Builder` javadoc to discourage calling setters that will be (currently) ignored if another setter is not also called. * Extractors: diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java index 6d77cdac8d..1135bf7df4 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java @@ -184,6 +184,11 @@ import java.nio.ByteBuffer; state = STATE_STARTED; } + @Override + public boolean needsReconfiguration() { + return false; + } + @Override public void queueInputBuffer( int index, int offset, int size, long presentationTimeUs, int flags) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java index 368444f81d..0b8fffd6e9 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java @@ -214,4 +214,7 @@ public interface MediaCodecAdapter { * @see MediaCodec#setVideoScalingMode(int) */ void setVideoScalingMode(@C.VideoScalingMode int scalingMode); + + /** Whether the adapter needs to be reconfigured before it is used. */ + boolean needsReconfiguration(); } 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 bd9312798a..391cd14925 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 @@ -1141,6 +1141,12 @@ public abstract class MediaCodecRenderer extends BaseRenderer { codecNeedsMonoChannelCountWorkaround(codecName, codecInputFormat); codecNeedsEosPropagation = codecNeedsEosPropagationWorkaround(codecInfo) || getCodecNeedsEosPropagation(); + if (codecAdapter.needsReconfiguration()) { + this.codecReconfigured = true; + this.codecReconfigurationState = RECONFIGURATION_STATE_WRITE_PENDING; + this.codecNeedsAdaptationWorkaroundBuffer = + codecAdaptationWorkaroundMode != ADAPTATION_WORKAROUND_MODE_NEVER; + } if ("c2.android.mp3.decoder".equals(codecInfo.name)) { c2Mp3TimestampTracker = new C2Mp3TimestampTracker(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java index 67fb24f1dd..90bf99fa06 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java @@ -88,6 +88,11 @@ public class SynchronousMediaCodecAdapter implements MediaCodecAdapter { } } + @Override + public boolean needsReconfiguration() { + return false; + } + @Override public int dequeueInputBufferIndex() { return codec.dequeueInputBuffer(0); diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/CapturingRenderersFactory.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/CapturingRenderersFactory.java index 1650ee6396..86b4d508c4 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/CapturingRenderersFactory.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/CapturingRenderersFactory.java @@ -278,6 +278,11 @@ public class CapturingRenderersFactory implements RenderersFactory, Dumper.Dumpa dumper.endBlock(); } + @Override + public boolean needsReconfiguration() { + return false; + } + private static byte[] peekBytes(ByteBuffer buffer, int offset, int size) { int originalPosition = buffer.position(); buffer.position(offset);