From cbe99ec4755264508ca6d448a7f90d9a79938497 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 17 Mar 2020 18:12:29 +0000 Subject: [PATCH] Make SimpleDecoderXRenderers work with any Decoder implementation The restriction that these classes only work with SimpleDecoders is unnecessary. An FfmpegVideoRenderer will not be able to use a SimpleDecoder, because the SimpleDecoder assumption that each input buffer can be decoded immediately into a corresponding output is not true for all video codecs that Ffmpeg supports (e.g., H264 does not have this property). Generalizing SimpleDecoderVideoRenderer to DecoderVideoRenderer will allow FfmpegVideoRenderer to still use the base class, without having to use a SimpleDecoder. This is a preliminary change toward being able to merge a version of https://github.com/google/ExoPlayer/pull/7079. Issue: #2159 PiperOrigin-RevId: 301412344 --- RELEASENOTES.md | 3 +++ .../ext/av1/Libgav1VideoRenderer.java | 4 ++-- .../ext/ffmpeg/FfmpegAudioRenderer.java | 8 +++---- .../exoplayer2/ext/ffmpeg/FfmpegDecoder.java | 2 +- .../exoplayer2/ext/flac/FlacDecoder.java | 2 +- .../ext/flac/LibflacAudioRenderer.java | 4 ++-- .../ext/opus/LibopusAudioRenderer.java | 4 ++-- .../exoplayer2/ext/opus/OpusDecoder.java | 2 +- .../ext/vp9/LibvpxVideoRenderer.java | 4 ++-- .../exoplayer2/ext/vp9/VpxOutputBuffer.java | 2 +- .../google/android/exoplayer2/Renderer.java | 4 ++-- ...enderer.java => DecoderAudioRenderer.java} | 23 +++++++++---------- .../exoplayer2/decoder/OutputBuffer.java | 12 +++++++++- .../exoplayer2/decoder/SimpleDecoder.java | 5 +++- .../decoder/SimpleOutputBuffer.java | 4 ++-- .../text/SimpleSubtitleDecoder.java | 7 +----- .../text/SimpleSubtitleOutputBuffer.java | 8 +++---- .../exoplayer2/text/SubtitleOutputBuffer.java | 3 --- .../exoplayer2/text/cea/CeaDecoder.java | 13 ++++++++--- ...enderer.java => DecoderVideoRenderer.java} | 12 +++++----- .../video/VideoDecoderOutputBuffer.java | 15 ++---------- ...est.java => DecoderAudioRendererTest.java} | 10 ++++---- ...est.java => DecoderVideoRendererTest.java} | 8 +++---- 23 files changed, 79 insertions(+), 80 deletions(-) rename library/core/src/main/java/com/google/android/exoplayer2/audio/{SimpleDecoderAudioRenderer.java => DecoderAudioRenderer.java} (97%) rename library/core/src/main/java/com/google/android/exoplayer2/video/{SimpleDecoderVideoRenderer.java => DecoderVideoRenderer.java} (99%) rename library/core/src/test/java/com/google/android/exoplayer2/audio/{SimpleDecoderAudioRendererTest.java => DecoderAudioRendererTest.java} (95%) rename library/core/src/test/java/com/google/android/exoplayer2/video/{SimpleDecoderVideoRendererTest.java => DecoderVideoRendererTest.java} (98%) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 0b4d419d8c..6e726ee8ef 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -53,6 +53,9 @@ * Add option to `MergingMediaSource` to adjust the time offsets between the merged sources ([#6103](https://github.com/google/ExoPlayer/issues/6103)). + * `SimpleDecoderVideoRenderer` and `SimpleDecoderAudioRenderer` renamed to + `DecoderVideoRenderer` and `DecoderAudioRenderer` respectively, and + generalized to work with `Decoder` rather than `SimpleDecoder`. * Text: * Parse `` and `` tags in WebVTT subtitles (rendering is coming later). diff --git a/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Libgav1VideoRenderer.java b/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Libgav1VideoRenderer.java index b75c4fdf3d..c3a936a10f 100644 --- a/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Libgav1VideoRenderer.java +++ b/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Libgav1VideoRenderer.java @@ -31,7 +31,7 @@ import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.TraceUtil; import com.google.android.exoplayer2.util.Util; -import com.google.android.exoplayer2.video.SimpleDecoderVideoRenderer; +import com.google.android.exoplayer2.video.DecoderVideoRenderer; import com.google.android.exoplayer2.video.VideoDecoderException; import com.google.android.exoplayer2.video.VideoDecoderInputBuffer; import com.google.android.exoplayer2.video.VideoDecoderOutputBuffer; @@ -52,7 +52,7 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener; * VideoDecoderOutputBufferRenderer}, or null. * */ -public class Libgav1VideoRenderer extends SimpleDecoderVideoRenderer { +public class Libgav1VideoRenderer extends DecoderVideoRenderer { private static final int DEFAULT_NUM_OF_INPUT_BUFFERS = 4; private static final int DEFAULT_NUM_OF_OUTPUT_BUFFERS = 4; diff --git a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioRenderer.java b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioRenderer.java index daf4a8a16c..01e20f05b1 100644 --- a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioRenderer.java +++ b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioRenderer.java @@ -22,17 +22,15 @@ import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.audio.AudioProcessor; import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AudioSink; +import com.google.android.exoplayer2.audio.DecoderAudioRenderer; import com.google.android.exoplayer2.audio.DefaultAudioSink; -import com.google.android.exoplayer2.audio.SimpleDecoderAudioRenderer; import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.MimeTypes; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; -/** - * Decodes and renders audio using FFmpeg. - */ -public final class FfmpegAudioRenderer extends SimpleDecoderAudioRenderer { +/** Decodes and renders audio using FFmpeg. */ +public final class FfmpegAudioRenderer extends DecoderAudioRenderer { /** The number of input and output buffers. */ private static final int NUM_BUFFERS = 16; diff --git a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegDecoder.java b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegDecoder.java index 6fa3d888db..ceef86d0cc 100644 --- a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegDecoder.java +++ b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegDecoder.java @@ -88,7 +88,7 @@ import java.util.List; @Override protected SimpleOutputBuffer createOutputBuffer() { - return new SimpleOutputBuffer(this); + return new SimpleOutputBuffer(this::releaseOutputBuffer); } @Override diff --git a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacDecoder.java b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacDecoder.java index c3eab1dfbc..84cb081b29 100644 --- a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacDecoder.java +++ b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacDecoder.java @@ -85,7 +85,7 @@ import java.util.List; @Override protected SimpleOutputBuffer createOutputBuffer() { - return new SimpleOutputBuffer(this); + return new SimpleOutputBuffer(this::releaseOutputBuffer); } @Override diff --git a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java index 1c04cb00fd..f1f6bb3e1e 100644 --- a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java +++ b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java @@ -22,7 +22,7 @@ import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.audio.AudioProcessor; import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AudioSink; -import com.google.android.exoplayer2.audio.SimpleDecoderAudioRenderer; +import com.google.android.exoplayer2.audio.DecoderAudioRenderer; import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.extractor.FlacStreamMetadata; import com.google.android.exoplayer2.util.Assertions; @@ -32,7 +32,7 @@ import com.google.android.exoplayer2.util.Util; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** Decodes and renders audio using the native Flac decoder. */ -public final class LibflacAudioRenderer extends SimpleDecoderAudioRenderer { +public final class LibflacAudioRenderer extends DecoderAudioRenderer { private static final int NUM_BUFFERS = 16; diff --git a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.java b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.java index 394afd31e4..45723179f8 100644 --- a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.java +++ b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.java @@ -21,12 +21,12 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.audio.AudioProcessor; import com.google.android.exoplayer2.audio.AudioRendererEventListener; -import com.google.android.exoplayer2.audio.SimpleDecoderAudioRenderer; +import com.google.android.exoplayer2.audio.DecoderAudioRenderer; import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.util.MimeTypes; /** Decodes and renders audio using the native Opus decoder. */ -public class LibopusAudioRenderer extends SimpleDecoderAudioRenderer { +public class LibopusAudioRenderer extends DecoderAudioRenderer { /** The number of input and output buffers. */ private static final int NUM_BUFFERS = 16; diff --git a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java index f0e993e3b9..fb7ed99909 100644 --- a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java +++ b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java @@ -148,7 +148,7 @@ import java.util.List; @Override protected SimpleOutputBuffer createOutputBuffer() { - return new SimpleOutputBuffer(this); + return new SimpleOutputBuffer(this::releaseOutputBuffer); } @Override diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java index a39f76ea8e..0863f512bb 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java @@ -30,7 +30,7 @@ import com.google.android.exoplayer2.decoder.SimpleDecoder; import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.TraceUtil; -import com.google.android.exoplayer2.video.SimpleDecoderVideoRenderer; +import com.google.android.exoplayer2.video.DecoderVideoRenderer; import com.google.android.exoplayer2.video.VideoDecoderException; import com.google.android.exoplayer2.video.VideoDecoderInputBuffer; import com.google.android.exoplayer2.video.VideoDecoderOutputBuffer; @@ -52,7 +52,7 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener; * VideoDecoderOutputBufferRenderer}, or null. * */ -public class LibvpxVideoRenderer extends SimpleDecoderVideoRenderer { +public class LibvpxVideoRenderer extends DecoderVideoRenderer { /** The number of input buffers. */ private final int numInputBuffers; diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxOutputBuffer.java b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxOutputBuffer.java index 1c434032d0..99f35217fc 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxOutputBuffer.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxOutputBuffer.java @@ -32,7 +32,7 @@ public final class VpxOutputBuffer extends VideoDecoderOutputBuffer { * * @param owner Buffer owner. */ - public VpxOutputBuffer(VideoDecoderOutputBuffer.Owner owner) { + public VpxOutputBuffer(Owner owner) { super(owner); } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java index 4ae0c0e111..287e3b30c0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java @@ -24,7 +24,7 @@ import com.google.android.exoplayer2.audio.AuxEffectInfo; import com.google.android.exoplayer2.source.SampleStream; import com.google.android.exoplayer2.util.MediaClock; import com.google.android.exoplayer2.util.Util; -import com.google.android.exoplayer2.video.SimpleDecoderVideoRenderer; +import com.google.android.exoplayer2.video.DecoderVideoRenderer; import com.google.android.exoplayer2.video.VideoDecoderOutputBufferRenderer; import com.google.android.exoplayer2.video.VideoFrameMetadataListener; import com.google.android.exoplayer2.video.spherical.CameraMotionListener; @@ -115,7 +115,7 @@ public interface Renderer extends PlayerMessage.Target { @SuppressWarnings("deprecation") int MSG_SET_CAMERA_MOTION_LISTENER = C.MSG_SET_CAMERA_MOTION_LISTENER; /** - * The type of a message that can be passed to a {@link SimpleDecoderVideoRenderer} via {@link + * The type of a message that can be passed to a {@link DecoderVideoRenderer} via {@link * ExoPlayer#createMessage(Target)}. The message payload should be the target {@link * VideoDecoderOutputBufferRenderer}, or null. * 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/DecoderAudioRenderer.java similarity index 97% rename from library/core/src/main/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRenderer.java rename to library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java index 94de29ed06..b4bf67528b 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/DecoderAudioRenderer.java @@ -29,9 +29,9 @@ import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.PlayerMessage.Target; import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.audio.AudioRendererEventListener.EventDispatcher; +import com.google.android.exoplayer2.decoder.Decoder; import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; -import com.google.android.exoplayer2.decoder.SimpleDecoder; import com.google.android.exoplayer2.decoder.SimpleOutputBuffer; import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException; @@ -47,7 +47,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** - * Decodes and renders audio using a {@link SimpleDecoder}. + * Decodes and renders audio using a {@link Decoder}. * *

This renderer accepts the following messages sent via {@link ExoPlayer#createMessage(Target)} * on the playback thread: @@ -68,7 +68,7 @@ import java.lang.annotation.RetentionPolicy; * underlying audio track. * */ -public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements MediaClock { +public abstract class DecoderAudioRenderer extends BaseRenderer implements MediaClock { @Documented @Retention(RetentionPolicy.SOURCE) @@ -105,8 +105,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements private int encoderPadding; @Nullable - private SimpleDecoder< - DecoderInputBuffer, ? extends SimpleOutputBuffer, ? extends AudioDecoderException> + private Decoder decoder; @Nullable private DecoderInputBuffer inputBuffer; @@ -125,7 +124,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements private boolean outputStreamEnded; private boolean waitingForKeys; - public SimpleDecoderAudioRenderer() { + public DecoderAudioRenderer() { this(/* eventHandler= */ null, /* eventListener= */ null); } @@ -135,7 +134,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements * @param eventListener A listener of events. May be null if delivery of events is not required. * @param audioProcessors Optional {@link AudioProcessor}s that will process audio before output. */ - public SimpleDecoderAudioRenderer( + public DecoderAudioRenderer( @Nullable Handler eventHandler, @Nullable AudioRendererEventListener eventListener, AudioProcessor... audioProcessors) { @@ -154,7 +153,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements * default capabilities (no encoded audio passthrough support) should be assumed. * @param audioProcessors Optional {@link AudioProcessor}s that will process audio before output. */ - public SimpleDecoderAudioRenderer( + public DecoderAudioRenderer( @Nullable Handler eventHandler, @Nullable AudioRendererEventListener eventListener, @Nullable AudioCapabilities audioCapabilities, @@ -168,7 +167,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements * @param eventListener A listener of events. May be null if delivery of events is not required. * @param audioSink The sink to which audio will be output. */ - public SimpleDecoderAudioRenderer( + public DecoderAudioRenderer( @Nullable Handler eventHandler, @Nullable AudioRendererEventListener eventListener, AudioSink audioSink) { @@ -306,7 +305,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements * @return The decoder. * @throws AudioDecoderException If an error occurred creating a suitable decoder. */ - protected abstract SimpleDecoder< + protected abstract Decoder< DecoderInputBuffer, ? extends SimpleOutputBuffer, ? extends AudioDecoderException> createDecoder(Format format, @Nullable ExoMediaCrypto mediaCrypto) throws AudioDecoderException; @@ -689,14 +688,14 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements @Override public void onAudioSessionId(int audioSessionId) { eventDispatcher.audioSessionId(audioSessionId); - SimpleDecoderAudioRenderer.this.onAudioSessionId(audioSessionId); + DecoderAudioRenderer.this.onAudioSessionId(audioSessionId); } @Override public void onPositionDiscontinuity() { onAudioTrackPositionDiscontinuity(); // We are out of sync so allow currentPositionUs to jump backwards. - SimpleDecoderAudioRenderer.this.allowPositionDiscontinuity = true; + DecoderAudioRenderer.this.allowPositionDiscontinuity = true; } @Override diff --git a/library/core/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java b/library/core/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java index 730ce15ed4..ca431bf77e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java @@ -20,6 +20,17 @@ package com.google.android.exoplayer2.decoder; */ public abstract class OutputBuffer extends Buffer { + /** Buffer owner. */ + public interface Owner { + + /** + * Releases the buffer. + * + * @param outputBuffer Output buffer. + */ + void releaseOutputBuffer(S outputBuffer); + } + /** * The presentation timestamp for the buffer, in microseconds. */ @@ -34,5 +45,4 @@ public abstract class OutputBuffer extends Buffer { * Releases the output buffer for reuse. Must be called when the buffer is no longer needed. */ public abstract void release(); - } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java b/library/core/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java index 94d4fd11f0..538cc10344 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java @@ -21,7 +21,10 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.util.Assertions; import java.util.ArrayDeque; -/** Base class for {@link Decoder}s that use their own decode thread. */ +/** + * Base class for {@link Decoder}s that use their own decode thread and decode each input buffer + * immediately into a corresponding output buffer. + */ @SuppressWarnings("UngroupedOverloads") public abstract class SimpleDecoder< I extends DecoderInputBuffer, O extends OutputBuffer, E extends Exception> diff --git a/library/core/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java b/library/core/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java index 84cffc1145..22cff021de 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java @@ -24,11 +24,11 @@ import java.nio.ByteOrder; */ public class SimpleOutputBuffer extends OutputBuffer { - private final SimpleDecoder owner; + private final Owner owner; @Nullable public ByteBuffer data; - public SimpleOutputBuffer(SimpleDecoder owner) { + public SimpleOutputBuffer(Owner owner) { this.owner = owner; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleDecoder.java b/library/core/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleDecoder.java index 8a1aea179a..c9ddc9dd7e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleDecoder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleDecoder.java @@ -55,7 +55,7 @@ public abstract class SimpleSubtitleDecoder extends @Override protected final SubtitleOutputBuffer createOutputBuffer() { - return new SimpleSubtitleOutputBuffer(this); + return new SimpleSubtitleOutputBuffer(this::releaseOutputBuffer); } @Override @@ -63,11 +63,6 @@ public abstract class SimpleSubtitleDecoder extends return new SubtitleDecoderException("Unexpected decode error", error); } - @Override - protected final void releaseOutputBuffer(SubtitleOutputBuffer buffer) { - super.releaseOutputBuffer(buffer); - } - @SuppressWarnings("ByteBufferBackingArray") @Override @Nullable diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleOutputBuffer.java b/library/core/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleOutputBuffer.java index b2c25631f4..6807661c84 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleOutputBuffer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleOutputBuffer.java @@ -20,12 +20,10 @@ package com.google.android.exoplayer2.text; */ /* package */ final class SimpleSubtitleOutputBuffer extends SubtitleOutputBuffer { - private final SimpleSubtitleDecoder owner; + private final Owner owner; - /** - * @param owner The decoder that owns this buffer. - */ - public SimpleSubtitleOutputBuffer(SimpleSubtitleDecoder owner) { + /** @param owner The decoder that owns this buffer. */ + public SimpleSubtitleOutputBuffer(Owner owner) { super(); this.owner = owner; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/SubtitleOutputBuffer.java b/library/core/src/main/java/com/google/android/exoplayer2/text/SubtitleOutputBuffer.java index 1dcdecf95f..63b997a613 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/SubtitleOutputBuffer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/SubtitleOutputBuffer.java @@ -65,9 +65,6 @@ public abstract class SubtitleOutputBuffer extends OutputBuffer implements Subti return Assertions.checkNotNull(subtitle).getCues(timeUs - subsampleOffsetUs); } - @Override - public abstract void release(); - @Override public void clear() { super.clear(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/cea/CeaDecoder.java b/library/core/src/main/java/com/google/android/exoplayer2/text/cea/CeaDecoder.java index 2281ee25a1..03a7255538 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/cea/CeaDecoder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/cea/CeaDecoder.java @@ -44,6 +44,7 @@ import java.util.PriorityQueue; private long playbackPositionUs; private long queuedInputBufferCount; + @SuppressWarnings("nullness:methodref.receiver.bound.invalid") public CeaDecoder() { availableInputBuffers = new ArrayDeque<>(); for (int i = 0; i < NUM_INPUT_BUFFERS; i++) { @@ -51,7 +52,7 @@ import java.util.PriorityQueue; } availableOutputBuffers = new ArrayDeque<>(); for (int i = 0; i < NUM_OUTPUT_BUFFERS; i++) { - availableOutputBuffers.add(new CeaOutputBuffer()); + availableOutputBuffers.add(new CeaOutputBuffer(this::releaseOutputBuffer)); } queuedInputBuffers = new PriorityQueue<>(); } @@ -199,11 +200,17 @@ import java.util.PriorityQueue; } } - private final class CeaOutputBuffer extends SubtitleOutputBuffer { + private static final class CeaOutputBuffer extends SubtitleOutputBuffer { + + private Owner owner; + + public CeaOutputBuffer(Owner owner) { + this.owner = owner; + } @Override public final void release() { - releaseOutputBuffer(this); + owner.releaseOutputBuffer(this); } } } 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/DecoderVideoRenderer.java similarity index 99% rename from library/core/src/main/java/com/google/android/exoplayer2/video/SimpleDecoderVideoRenderer.java rename to library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java index fd89c6574e..cc0a9cdd95 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/DecoderVideoRenderer.java @@ -26,9 +26,9 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; +import com.google.android.exoplayer2.decoder.Decoder; import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; -import com.google.android.exoplayer2.decoder.SimpleDecoder; import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException; import com.google.android.exoplayer2.drm.ExoMediaCrypto; @@ -41,8 +41,8 @@ import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -/** Decodes and renders video using a {@link SimpleDecoder}. */ -public abstract class SimpleDecoderVideoRenderer extends BaseRenderer { +/** Decodes and renders video using a {@link Decoder}. */ +public abstract class DecoderVideoRenderer extends BaseRenderer { /** Decoder reinitialization states. */ @Documented @@ -76,7 +76,7 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer { private Format inputFormat; private Format outputFormat; - private SimpleDecoder< + private Decoder< VideoDecoderInputBuffer, ? extends VideoDecoderOutputBuffer, ? extends VideoDecoderException> @@ -125,7 +125,7 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer { * @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between * invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}. */ - protected SimpleDecoderVideoRenderer( + protected DecoderVideoRenderer( long allowedJoiningTimeMs, @Nullable Handler eventHandler, @Nullable VideoRendererEventListener eventListener, @@ -490,7 +490,7 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer { * @return The decoder. * @throws VideoDecoderException If an error occurred creating a suitable decoder. */ - protected abstract SimpleDecoder< + protected abstract Decoder< VideoDecoderInputBuffer, ? extends VideoDecoderOutputBuffer, ? extends VideoDecoderException> diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBuffer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBuffer.java index 457aa30ade..e78a511e5a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBuffer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBuffer.java @@ -23,17 +23,6 @@ import java.nio.ByteBuffer; /** Video decoder output buffer containing video frame data. */ public class VideoDecoderOutputBuffer extends OutputBuffer { - /** Buffer owner. */ - public interface Owner { - - /** - * Releases the buffer. - * - * @param outputBuffer Output buffer. - */ - void releaseOutputBuffer(VideoDecoderOutputBuffer outputBuffer); - } - // LINT.IfChange public static final int COLORSPACE_UNKNOWN = 0; public static final int COLORSPACE_BT601 = 1; @@ -68,14 +57,14 @@ public class VideoDecoderOutputBuffer extends OutputBuffer { */ @Nullable public ByteBuffer supplementalData; - private final Owner owner; + private final Owner owner; /** * Creates VideoDecoderOutputBuffer. * * @param owner Buffer owner. */ - public VideoDecoderOutputBuffer(Owner owner) { + public VideoDecoderOutputBuffer(Owner owner) { this.owner = owner; } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRendererTest.java b/library/core/src/test/java/com/google/android/exoplayer2/audio/DecoderAudioRendererTest.java similarity index 95% rename from library/core/src/test/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRendererTest.java rename to library/core/src/test/java/com/google/android/exoplayer2/audio/DecoderAudioRendererTest.java index b71f87dbb7..a73e703d51 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRendererTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/audio/DecoderAudioRendererTest.java @@ -42,21 +42,21 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.annotation.Config; -/** Unit test for {@link SimpleDecoderAudioRenderer}. */ +/** Unit test for {@link DecoderAudioRenderer}. */ @RunWith(AndroidJUnit4.class) -public class SimpleDecoderAudioRendererTest { +public class DecoderAudioRendererTest { private static final Format FORMAT = new Format.Builder().setSampleMimeType(MimeTypes.AUDIO_RAW).build(); @Mock private AudioSink mockAudioSink; - private SimpleDecoderAudioRenderer audioRenderer; + private DecoderAudioRenderer audioRenderer; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); audioRenderer = - new SimpleDecoderAudioRenderer(null, null, mockAudioSink) { + new DecoderAudioRenderer(null, null, mockAudioSink) { @Override @FormatSupport protected int supportsFormatInternal(Format format) { @@ -132,7 +132,7 @@ public class SimpleDecoderAudioRendererTest { @Override protected SimpleOutputBuffer createOutputBuffer() { - return new SimpleOutputBuffer(this); + return new SimpleOutputBuffer(this::releaseOutputBuffer); } @Override diff --git a/library/core/src/test/java/com/google/android/exoplayer2/video/SimpleDecoderVideoRendererTest.java b/library/core/src/test/java/com/google/android/exoplayer2/video/DecoderVideoRendererTest.java similarity index 98% rename from library/core/src/test/java/com/google/android/exoplayer2/video/SimpleDecoderVideoRendererTest.java rename to library/core/src/test/java/com/google/android/exoplayer2/video/DecoderVideoRendererTest.java index af98fd9ebf..cab0a5b2c8 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/video/SimpleDecoderVideoRendererTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/video/DecoderVideoRendererTest.java @@ -47,10 +47,10 @@ import org.mockito.junit.MockitoRule; import org.robolectric.annotation.LooperMode; import org.robolectric.shadows.ShadowLooper; -/** Unit test for {@link SimpleDecoderVideoRenderer}. */ +/** Unit test for {@link DecoderVideoRenderer}. */ @LooperMode(LooperMode.Mode.PAUSED) @RunWith(AndroidJUnit4.class) -public final class SimpleDecoderVideoRendererTest { +public final class DecoderVideoRendererTest { @Rule public final MockitoRule mockito = MockitoJUnit.rule(); private static final Format H264_FORMAT = @@ -60,13 +60,13 @@ public final class SimpleDecoderVideoRendererTest { .setHeight(1080) .build(); - private SimpleDecoderVideoRenderer renderer; + private DecoderVideoRenderer renderer; @Mock private VideoRendererEventListener eventListener; @Before public void setUp() { renderer = - new SimpleDecoderVideoRenderer( + new DecoderVideoRenderer( /* allowedJoiningTimeMs= */ 0, new Handler(), eventListener,