Get decoder buffers into the right place
PiperOrigin-RevId: 404876228
This commit is contained in:
parent
5e26ba8238
commit
37b5847681
@ -6,6 +6,6 @@
|
||||
}
|
||||
|
||||
# Some members of this class are being accessed from native methods. Keep them unobfuscated.
|
||||
-keep class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer {
|
||||
-keep class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer {
|
||||
*;
|
||||
}
|
||||
|
@ -24,15 +24,14 @@ import androidx.annotation.VisibleForTesting;
|
||||
import com.google.android.exoplayer2.C;
|
||||
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
||||
import com.google.android.exoplayer2.decoder.SimpleDecoder;
|
||||
import com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer;
|
||||
import com.google.android.exoplayer2.util.Util;
|
||||
import com.google.android.exoplayer2.video.VideoDecoderInputBuffer;
|
||||
import com.google.android.exoplayer2.video.VideoDecoderOutputBuffer;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
/** Gav1 decoder. */
|
||||
@VisibleForTesting(otherwise = PACKAGE_PRIVATE)
|
||||
public final class Gav1Decoder
|
||||
extends SimpleDecoder<VideoDecoderInputBuffer, VideoDecoderOutputBuffer, Gav1DecoderException> {
|
||||
extends SimpleDecoder<DecoderInputBuffer, VideoDecoderOutputBuffer, Gav1DecoderException> {
|
||||
|
||||
private static final int GAV1_ERROR = 0;
|
||||
private static final int GAV1_OK = 1;
|
||||
@ -56,9 +55,7 @@ public final class Gav1Decoder
|
||||
public Gav1Decoder(
|
||||
int numInputBuffers, int numOutputBuffers, int initialInputBufferSize, int threads)
|
||||
throws Gav1DecoderException {
|
||||
super(
|
||||
new VideoDecoderInputBuffer[numInputBuffers],
|
||||
new VideoDecoderOutputBuffer[numOutputBuffers]);
|
||||
super(new DecoderInputBuffer[numInputBuffers], new VideoDecoderOutputBuffer[numOutputBuffers]);
|
||||
if (!Gav1Library.isAvailable()) {
|
||||
throw new Gav1DecoderException("Failed to load decoder native library.");
|
||||
}
|
||||
@ -86,8 +83,8 @@ public final class Gav1Decoder
|
||||
}
|
||||
|
||||
@Override
|
||||
protected VideoDecoderInputBuffer createInputBuffer() {
|
||||
return new VideoDecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT);
|
||||
protected DecoderInputBuffer createInputBuffer() {
|
||||
return new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -98,7 +95,7 @@ public final class Gav1Decoder
|
||||
@Override
|
||||
@Nullable
|
||||
protected Gav1DecoderException decode(
|
||||
VideoDecoderInputBuffer inputBuffer, VideoDecoderOutputBuffer outputBuffer, boolean reset) {
|
||||
DecoderInputBuffer inputBuffer, VideoDecoderOutputBuffer outputBuffer, boolean reset) {
|
||||
ByteBuffer inputData = Util.castNonNull(inputBuffer.data);
|
||||
int inputSize = inputData.limit();
|
||||
if (gav1Decode(gav1DecoderContext, inputData, inputSize) == GAV1_ERROR) {
|
||||
|
@ -25,11 +25,11 @@ import com.google.android.exoplayer2.Format;
|
||||
import com.google.android.exoplayer2.RendererCapabilities;
|
||||
import com.google.android.exoplayer2.decoder.CryptoConfig;
|
||||
import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation;
|
||||
import com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer;
|
||||
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.DecoderVideoRenderer;
|
||||
import com.google.android.exoplayer2.video.VideoDecoderOutputBuffer;
|
||||
import com.google.android.exoplayer2.video.VideoRendererEventListener;
|
||||
|
||||
/** Decodes and renders video using libgav1 decoder. */
|
||||
|
@ -537,7 +537,7 @@ DECODER_FUNC(jlong, gav1Init, jint threads) {
|
||||
|
||||
// Populate JNI References.
|
||||
const jclass outputBufferClass = env->FindClass(
|
||||
"com/google/android/exoplayer2/video/VideoDecoderOutputBuffer");
|
||||
"com/google/android/exoplayer2/decoder/VideoDecoderOutputBuffer");
|
||||
context->decoder_private_field =
|
||||
env->GetFieldID(outputBufferClass, "decoderPrivate", "I");
|
||||
context->output_mode_field = env->GetFieldID(outputBufferClass, "mode", "I");
|
||||
|
@ -20,7 +20,7 @@ import com.google.android.exoplayer2.C;
|
||||
import com.google.android.exoplayer2.Format;
|
||||
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.decoder.SimpleDecoderOutputBuffer;
|
||||
import com.google.android.exoplayer2.util.Assertions;
|
||||
import com.google.android.exoplayer2.util.MimeTypes;
|
||||
import com.google.android.exoplayer2.util.ParsableByteArray;
|
||||
@ -30,7 +30,7 @@ import java.util.List;
|
||||
|
||||
/** FFmpeg audio decoder. */
|
||||
/* package */ final class FfmpegAudioDecoder
|
||||
extends SimpleDecoder<DecoderInputBuffer, SimpleOutputBuffer, FfmpegDecoderException> {
|
||||
extends SimpleDecoder<DecoderInputBuffer, SimpleDecoderOutputBuffer, FfmpegDecoderException> {
|
||||
|
||||
// Output buffer sizes when decoding PCM mu-law streams, which is the maximum FFmpeg outputs.
|
||||
private static final int OUTPUT_BUFFER_SIZE_16BIT = 65536;
|
||||
@ -56,7 +56,7 @@ import java.util.List;
|
||||
int initialInputBufferSize,
|
||||
boolean outputFloat)
|
||||
throws FfmpegDecoderException {
|
||||
super(new DecoderInputBuffer[numInputBuffers], new SimpleOutputBuffer[numOutputBuffers]);
|
||||
super(new DecoderInputBuffer[numInputBuffers], new SimpleDecoderOutputBuffer[numOutputBuffers]);
|
||||
if (!FfmpegLibrary.isAvailable()) {
|
||||
throw new FfmpegDecoderException("Failed to load decoder native libraries.");
|
||||
}
|
||||
@ -86,8 +86,8 @@ import java.util.List;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SimpleOutputBuffer createOutputBuffer() {
|
||||
return new SimpleOutputBuffer(this::releaseOutputBuffer);
|
||||
protected SimpleDecoderOutputBuffer createOutputBuffer() {
|
||||
return new SimpleDecoderOutputBuffer(this::releaseOutputBuffer);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -98,7 +98,7 @@ import java.util.List;
|
||||
@Override
|
||||
@Nullable
|
||||
protected FfmpegDecoderException decode(
|
||||
DecoderInputBuffer inputBuffer, SimpleOutputBuffer outputBuffer, boolean reset) {
|
||||
DecoderInputBuffer inputBuffer, SimpleDecoderOutputBuffer outputBuffer, boolean reset) {
|
||||
if (reset) {
|
||||
nativeContext = ffmpegReset(nativeContext, extraData);
|
||||
if (nativeContext == 0) {
|
||||
|
@ -27,12 +27,12 @@ import com.google.android.exoplayer2.Format;
|
||||
import com.google.android.exoplayer2.RendererCapabilities;
|
||||
import com.google.android.exoplayer2.decoder.CryptoConfig;
|
||||
import com.google.android.exoplayer2.decoder.Decoder;
|
||||
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
||||
import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation;
|
||||
import com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer;
|
||||
import com.google.android.exoplayer2.util.TraceUtil;
|
||||
import com.google.android.exoplayer2.util.Util;
|
||||
import com.google.android.exoplayer2.video.DecoderVideoRenderer;
|
||||
import com.google.android.exoplayer2.video.VideoDecoderInputBuffer;
|
||||
import com.google.android.exoplayer2.video.VideoDecoderOutputBuffer;
|
||||
import com.google.android.exoplayer2.video.VideoRendererEventListener;
|
||||
|
||||
// TODO: Remove the NOTE below.
|
||||
@ -94,7 +94,7 @@ public final class FfmpegVideoRenderer extends DecoderVideoRenderer {
|
||||
|
||||
@SuppressWarnings("nullness:return")
|
||||
@Override
|
||||
protected Decoder<VideoDecoderInputBuffer, VideoDecoderOutputBuffer, FfmpegDecoderException>
|
||||
protected Decoder<DecoderInputBuffer, VideoDecoderOutputBuffer, FfmpegDecoderException>
|
||||
createDecoder(Format format, @Nullable CryptoConfig cryptoConfig)
|
||||
throws FfmpegDecoderException {
|
||||
TraceUtil.beginSection("createFfmpegVideoDecoder");
|
||||
|
@ -23,7 +23,7 @@ import com.google.android.exoplayer2.Format;
|
||||
import com.google.android.exoplayer2.ParserException;
|
||||
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.decoder.SimpleDecoderOutputBuffer;
|
||||
import com.google.android.exoplayer2.extractor.FlacStreamMetadata;
|
||||
import com.google.android.exoplayer2.util.Util;
|
||||
import java.io.IOException;
|
||||
@ -33,7 +33,7 @@ import java.util.List;
|
||||
/** Flac decoder. */
|
||||
@VisibleForTesting(otherwise = PACKAGE_PRIVATE)
|
||||
public final class FlacDecoder
|
||||
extends SimpleDecoder<DecoderInputBuffer, SimpleOutputBuffer, FlacDecoderException> {
|
||||
extends SimpleDecoder<DecoderInputBuffer, SimpleDecoderOutputBuffer, FlacDecoderException> {
|
||||
|
||||
private final FlacStreamMetadata streamMetadata;
|
||||
private final FlacDecoderJni decoderJni;
|
||||
@ -55,7 +55,7 @@ public final class FlacDecoder
|
||||
int maxInputBufferSize,
|
||||
List<byte[]> initializationData)
|
||||
throws FlacDecoderException {
|
||||
super(new DecoderInputBuffer[numInputBuffers], new SimpleOutputBuffer[numOutputBuffers]);
|
||||
super(new DecoderInputBuffer[numInputBuffers], new SimpleDecoderOutputBuffer[numOutputBuffers]);
|
||||
if (initializationData.size() != 1) {
|
||||
throw new FlacDecoderException("Initialization data must be of length 1");
|
||||
}
|
||||
@ -86,8 +86,8 @@ public final class FlacDecoder
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SimpleOutputBuffer createOutputBuffer() {
|
||||
return new SimpleOutputBuffer(this::releaseOutputBuffer);
|
||||
protected SimpleDecoderOutputBuffer createOutputBuffer() {
|
||||
return new SimpleDecoderOutputBuffer(this::releaseOutputBuffer);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -98,7 +98,7 @@ public final class FlacDecoder
|
||||
@Override
|
||||
@Nullable
|
||||
protected FlacDecoderException decode(
|
||||
DecoderInputBuffer inputBuffer, SimpleOutputBuffer outputBuffer, boolean reset) {
|
||||
DecoderInputBuffer inputBuffer, SimpleDecoderOutputBuffer outputBuffer, boolean reset) {
|
||||
if (reset) {
|
||||
decoderJni.flush();
|
||||
}
|
||||
|
@ -6,6 +6,6 @@
|
||||
}
|
||||
|
||||
# Some members of this class are being accessed from native methods. Keep them unobfuscated.
|
||||
-keep class com.google.android.exoplayer2.decoder.SimpleOutputBuffer {
|
||||
-keep class com.google.android.exoplayer2.decoder.SimpleDecoderOutputBuffer {
|
||||
*;
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ import com.google.android.exoplayer2.decoder.CryptoException;
|
||||
import com.google.android.exoplayer2.decoder.CryptoInfo;
|
||||
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.decoder.SimpleDecoderOutputBuffer;
|
||||
import com.google.android.exoplayer2.util.Assertions;
|
||||
import com.google.android.exoplayer2.util.Util;
|
||||
import java.nio.ByteBuffer;
|
||||
@ -35,7 +35,7 @@ import java.util.List;
|
||||
/** Opus decoder. */
|
||||
@VisibleForTesting(otherwise = PACKAGE_PRIVATE)
|
||||
public final class OpusDecoder
|
||||
extends SimpleDecoder<DecoderInputBuffer, SimpleOutputBuffer, OpusDecoderException> {
|
||||
extends SimpleDecoder<DecoderInputBuffer, SimpleDecoderOutputBuffer, OpusDecoderException> {
|
||||
|
||||
private static final int NO_ERROR = 0;
|
||||
private static final int DECODE_ERROR = -1;
|
||||
@ -73,7 +73,7 @@ public final class OpusDecoder
|
||||
@Nullable CryptoConfig cryptoConfig,
|
||||
boolean outputFloat)
|
||||
throws OpusDecoderException {
|
||||
super(new DecoderInputBuffer[numInputBuffers], new SimpleOutputBuffer[numOutputBuffers]);
|
||||
super(new DecoderInputBuffer[numInputBuffers], new SimpleDecoderOutputBuffer[numOutputBuffers]);
|
||||
if (!OpusLibrary.isAvailable()) {
|
||||
throw new OpusDecoderException("Failed to load decoder native libraries");
|
||||
}
|
||||
@ -147,8 +147,8 @@ public final class OpusDecoder
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SimpleOutputBuffer createOutputBuffer() {
|
||||
return new SimpleOutputBuffer(this::releaseOutputBuffer);
|
||||
protected SimpleDecoderOutputBuffer createOutputBuffer() {
|
||||
return new SimpleDecoderOutputBuffer(this::releaseOutputBuffer);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -159,7 +159,7 @@ public final class OpusDecoder
|
||||
@Override
|
||||
@Nullable
|
||||
protected OpusDecoderException decode(
|
||||
DecoderInputBuffer inputBuffer, SimpleOutputBuffer outputBuffer, boolean reset) {
|
||||
DecoderInputBuffer inputBuffer, SimpleDecoderOutputBuffer outputBuffer, boolean reset) {
|
||||
if (reset) {
|
||||
opusReset(nativeDecoderContext);
|
||||
// When seeking to 0, skip number of samples as specified in opus header. When seeking to
|
||||
@ -239,14 +239,14 @@ public final class OpusDecoder
|
||||
long timeUs,
|
||||
ByteBuffer inputBuffer,
|
||||
int inputSize,
|
||||
SimpleOutputBuffer outputBuffer);
|
||||
SimpleDecoderOutputBuffer outputBuffer);
|
||||
|
||||
private native int opusSecureDecode(
|
||||
long decoder,
|
||||
long timeUs,
|
||||
ByteBuffer inputBuffer,
|
||||
int inputSize,
|
||||
SimpleOutputBuffer outputBuffer,
|
||||
SimpleDecoderOutputBuffer outputBuffer,
|
||||
int sampleRate,
|
||||
@Nullable CryptoConfig mediaCrypto,
|
||||
int inputMode,
|
||||
|
@ -87,7 +87,7 @@ DECODER_FUNC(jlong, opusInit, jint sampleRate, jint channelCount,
|
||||
|
||||
// Populate JNI References.
|
||||
const jclass outputBufferClass = env->FindClass(
|
||||
"com/google/android/exoplayer2/decoder/SimpleOutputBuffer");
|
||||
"com/google/android/exoplayer2/decoder/SimpleDecoderOutputBuffer");
|
||||
outputBufferInit =
|
||||
env->GetMethodID(outputBufferClass, "init", "(JI)Ljava/nio/ByteBuffer;");
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
}
|
||||
|
||||
# Some members of this class are being accessed from native methods. Keep them unobfuscated.
|
||||
-keep class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer {
|
||||
-keep class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer {
|
||||
*;
|
||||
}
|
||||
|
||||
|
@ -26,10 +26,10 @@ import com.google.android.exoplayer2.Format;
|
||||
import com.google.android.exoplayer2.RendererCapabilities;
|
||||
import com.google.android.exoplayer2.decoder.CryptoConfig;
|
||||
import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation;
|
||||
import com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer;
|
||||
import com.google.android.exoplayer2.util.MimeTypes;
|
||||
import com.google.android.exoplayer2.util.TraceUtil;
|
||||
import com.google.android.exoplayer2.video.DecoderVideoRenderer;
|
||||
import com.google.android.exoplayer2.video.VideoDecoderOutputBuffer;
|
||||
import com.google.android.exoplayer2.video.VideoRendererEventListener;
|
||||
|
||||
/** Decodes and renders video using the native VP9 decoder. */
|
||||
|
@ -26,16 +26,15 @@ import com.google.android.exoplayer2.decoder.CryptoException;
|
||||
import com.google.android.exoplayer2.decoder.CryptoInfo;
|
||||
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
||||
import com.google.android.exoplayer2.decoder.SimpleDecoder;
|
||||
import com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer;
|
||||
import com.google.android.exoplayer2.util.Assertions;
|
||||
import com.google.android.exoplayer2.util.Util;
|
||||
import com.google.android.exoplayer2.video.VideoDecoderInputBuffer;
|
||||
import com.google.android.exoplayer2.video.VideoDecoderOutputBuffer;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
/** Vpx decoder. */
|
||||
@VisibleForTesting(otherwise = PACKAGE_PRIVATE)
|
||||
public final class VpxDecoder
|
||||
extends SimpleDecoder<VideoDecoderInputBuffer, VideoDecoderOutputBuffer, VpxDecoderException> {
|
||||
extends SimpleDecoder<DecoderInputBuffer, VideoDecoderOutputBuffer, VpxDecoderException> {
|
||||
|
||||
// These constants should match the codes returned from vpxDecode and vpxSecureDecode functions in
|
||||
// https://github.com/google/ExoPlayer/blob/release-v2/extensions/vp9/src/main/jni/vpx_jni.cc.
|
||||
@ -68,9 +67,7 @@ public final class VpxDecoder
|
||||
@Nullable CryptoConfig cryptoConfig,
|
||||
int threads)
|
||||
throws VpxDecoderException {
|
||||
super(
|
||||
new VideoDecoderInputBuffer[numInputBuffers],
|
||||
new VideoDecoderOutputBuffer[numOutputBuffers]);
|
||||
super(new DecoderInputBuffer[numInputBuffers], new VideoDecoderOutputBuffer[numOutputBuffers]);
|
||||
if (!VpxLibrary.isAvailable()) {
|
||||
throw new VpxDecoderException("Failed to load decoder native libraries.");
|
||||
}
|
||||
@ -92,8 +89,8 @@ public final class VpxDecoder
|
||||
}
|
||||
|
||||
@Override
|
||||
protected VideoDecoderInputBuffer createInputBuffer() {
|
||||
return new VideoDecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT);
|
||||
protected DecoderInputBuffer createInputBuffer() {
|
||||
return new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -119,7 +116,7 @@ public final class VpxDecoder
|
||||
@Override
|
||||
@Nullable
|
||||
protected VpxDecoderException decode(
|
||||
VideoDecoderInputBuffer inputBuffer, VideoDecoderOutputBuffer outputBuffer, boolean reset) {
|
||||
DecoderInputBuffer inputBuffer, VideoDecoderOutputBuffer outputBuffer, boolean reset) {
|
||||
if (reset && lastSupplementalData != null) {
|
||||
// Don't propagate supplemental data across calls to flush the decoder.
|
||||
lastSupplementalData.clear();
|
||||
|
@ -479,7 +479,7 @@ DECODER_FUNC(jlong, vpxInit, jboolean disableLoopFilter,
|
||||
|
||||
// Populate JNI References.
|
||||
const jclass outputBufferClass = env->FindClass(
|
||||
"com/google/android/exoplayer2/video/VideoDecoderOutputBuffer");
|
||||
"com/google/android/exoplayer2/decoder/VideoDecoderOutputBuffer");
|
||||
initForYuvFrame =
|
||||
env->GetMethodID(outputBufferClass, "initForYuvFrame", "(IIIII)Z");
|
||||
initForPrivateFrame =
|
||||
|
@ -44,7 +44,7 @@ import com.google.android.exoplayer2.decoder.DecoderCounters;
|
||||
import com.google.android.exoplayer2.decoder.DecoderException;
|
||||
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
||||
import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation;
|
||||
import com.google.android.exoplayer2.decoder.SimpleOutputBuffer;
|
||||
import com.google.android.exoplayer2.decoder.SimpleDecoderOutputBuffer;
|
||||
import com.google.android.exoplayer2.drm.DrmSession;
|
||||
import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException;
|
||||
import com.google.android.exoplayer2.source.SampleStream.ReadDataResult;
|
||||
@ -82,7 +82,10 @@ import java.lang.annotation.RetentionPolicy;
|
||||
*/
|
||||
public abstract class DecoderAudioRenderer<
|
||||
T extends
|
||||
Decoder<DecoderInputBuffer, ? extends SimpleOutputBuffer, ? extends DecoderException>>
|
||||
Decoder<
|
||||
DecoderInputBuffer,
|
||||
? extends SimpleDecoderOutputBuffer,
|
||||
? extends DecoderException>>
|
||||
extends BaseRenderer implements MediaClock {
|
||||
|
||||
private static final String TAG = "DecoderAudioRenderer";
|
||||
@ -124,7 +127,7 @@ public abstract class DecoderAudioRenderer<
|
||||
@Nullable private T decoder;
|
||||
|
||||
@Nullable private DecoderInputBuffer inputBuffer;
|
||||
@Nullable private SimpleOutputBuffer outputBuffer;
|
||||
@Nullable private SimpleDecoderOutputBuffer outputBuffer;
|
||||
@Nullable private DrmSession decoderDrmSession;
|
||||
@Nullable private DrmSession sourceDrmSession;
|
||||
|
||||
@ -456,6 +459,7 @@ public abstract class DecoderAudioRenderer<
|
||||
return false;
|
||||
}
|
||||
inputBuffer.flip();
|
||||
inputBuffer.format = inputFormat;
|
||||
onQueueInputBuffer(inputBuffer);
|
||||
decoder.queueInputBuffer(inputBuffer);
|
||||
decoderReceivedBuffers = true;
|
||||
|
@ -42,6 +42,7 @@ import com.google.android.exoplayer2.decoder.DecoderCounters;
|
||||
import com.google.android.exoplayer2.decoder.DecoderException;
|
||||
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
||||
import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation;
|
||||
import com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer;
|
||||
import com.google.android.exoplayer2.drm.DrmSession;
|
||||
import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException;
|
||||
import com.google.android.exoplayer2.source.SampleStream.ReadDataResult;
|
||||
@ -108,10 +109,10 @@ public abstract class DecoderVideoRenderer extends BaseRenderer {
|
||||
|
||||
@Nullable
|
||||
private Decoder<
|
||||
VideoDecoderInputBuffer, ? extends VideoDecoderOutputBuffer, ? extends DecoderException>
|
||||
DecoderInputBuffer, ? extends VideoDecoderOutputBuffer, ? extends DecoderException>
|
||||
decoder;
|
||||
|
||||
private VideoDecoderInputBuffer inputBuffer;
|
||||
private DecoderInputBuffer inputBuffer;
|
||||
private VideoDecoderOutputBuffer outputBuffer;
|
||||
@VideoOutputMode private int outputMode;
|
||||
@Nullable private Object output;
|
||||
@ -415,7 +416,7 @@ public abstract class DecoderVideoRenderer extends BaseRenderer {
|
||||
*
|
||||
* @param buffer The buffer that will be queued.
|
||||
*/
|
||||
protected void onQueueInputBuffer(VideoDecoderInputBuffer buffer) {
|
||||
protected void onQueueInputBuffer(DecoderInputBuffer buffer) {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
@ -536,7 +537,7 @@ public abstract class DecoderVideoRenderer extends BaseRenderer {
|
||||
* @throws DecoderException If an error occurred creating a suitable decoder.
|
||||
*/
|
||||
protected abstract Decoder<
|
||||
VideoDecoderInputBuffer, ? extends VideoDecoderOutputBuffer, ? extends DecoderException>
|
||||
DecoderInputBuffer, ? extends VideoDecoderOutputBuffer, ? extends DecoderException>
|
||||
createDecoder(Format format, @Nullable CryptoConfig cryptoConfig) throws DecoderException;
|
||||
|
||||
/**
|
||||
|
@ -20,6 +20,7 @@ import android.opengl.GLES20;
|
||||
import android.opengl.GLSurfaceView;
|
||||
import android.util.AttributeSet;
|
||||
import androidx.annotation.Nullable;
|
||||
import com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer;
|
||||
import com.google.android.exoplayer2.util.Assertions;
|
||||
import com.google.android.exoplayer2.util.GlUtil;
|
||||
import java.nio.ByteBuffer;
|
||||
|
@ -1,54 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2019 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.google.android.exoplayer2.video;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import com.google.android.exoplayer2.Format;
|
||||
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
||||
|
||||
/** Input buffer to a video decoder. */
|
||||
public class VideoDecoderInputBuffer extends DecoderInputBuffer {
|
||||
|
||||
@Nullable public Format format;
|
||||
|
||||
/**
|
||||
* Creates a new instance.
|
||||
*
|
||||
* @param bufferReplacementMode Determines the behavior of {@link #ensureSpaceForWrite(int)}. One
|
||||
* of {@link #BUFFER_REPLACEMENT_MODE_DISABLED}, {@link #BUFFER_REPLACEMENT_MODE_NORMAL} and
|
||||
* {@link #BUFFER_REPLACEMENT_MODE_DIRECT}.
|
||||
*/
|
||||
public VideoDecoderInputBuffer(@BufferReplacementMode int bufferReplacementMode) {
|
||||
super(bufferReplacementMode);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new instance.
|
||||
*
|
||||
* @param bufferReplacementMode Determines the behavior of {@link #ensureSpaceForWrite(int)}. One
|
||||
* of {@link #BUFFER_REPLACEMENT_MODE_DISABLED}, {@link #BUFFER_REPLACEMENT_MODE_NORMAL} and
|
||||
* {@link #BUFFER_REPLACEMENT_MODE_DIRECT}.
|
||||
* @param paddingSize If non-zero, {@link #ensureSpaceForWrite(int)} will ensure that the buffer
|
||||
* is this number of bytes larger than the requested length. This can be useful for decoders
|
||||
* that consume data in fixed size blocks, for efficiency. Setting the padding size to the
|
||||
* decoder's fixed read size is necessary to prevent such a decoder from trying to read beyond
|
||||
* the end of the buffer.
|
||||
*/
|
||||
public VideoDecoderInputBuffer(
|
||||
@BufferReplacementMode int bufferReplacementMode, int paddingSize) {
|
||||
super(bufferReplacementMode, paddingSize);
|
||||
}
|
||||
}
|
@ -15,6 +15,8 @@
|
||||
*/
|
||||
package com.google.android.exoplayer2.video;
|
||||
|
||||
import com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer;
|
||||
|
||||
/** Renders the {@link VideoDecoderOutputBuffer}. */
|
||||
public interface VideoDecoderOutputBufferRenderer {
|
||||
|
||||
|
@ -34,7 +34,7 @@ import com.google.android.exoplayer2.decoder.CryptoConfig;
|
||||
import com.google.android.exoplayer2.decoder.DecoderException;
|
||||
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.decoder.SimpleDecoderOutputBuffer;
|
||||
import com.google.android.exoplayer2.drm.DrmSessionEventListener;
|
||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
||||
import com.google.android.exoplayer2.testutil.FakeSampleStream;
|
||||
@ -133,10 +133,10 @@ public class DecoderAudioRendererTest {
|
||||
}
|
||||
|
||||
private static final class FakeDecoder
|
||||
extends SimpleDecoder<DecoderInputBuffer, SimpleOutputBuffer, DecoderException> {
|
||||
extends SimpleDecoder<DecoderInputBuffer, SimpleDecoderOutputBuffer, DecoderException> {
|
||||
|
||||
public FakeDecoder() {
|
||||
super(new DecoderInputBuffer[1], new SimpleOutputBuffer[1]);
|
||||
super(new DecoderInputBuffer[1], new SimpleDecoderOutputBuffer[1]);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -150,8 +150,8 @@ public class DecoderAudioRendererTest {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SimpleOutputBuffer createOutputBuffer() {
|
||||
return new SimpleOutputBuffer(this::releaseOutputBuffer);
|
||||
protected SimpleDecoderOutputBuffer createOutputBuffer() {
|
||||
return new SimpleDecoderOutputBuffer(this::releaseOutputBuffer);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -161,7 +161,7 @@ public class DecoderAudioRendererTest {
|
||||
|
||||
@Override
|
||||
protected DecoderException decode(
|
||||
DecoderInputBuffer inputBuffer, SimpleOutputBuffer outputBuffer, boolean reset) {
|
||||
DecoderInputBuffer inputBuffer, SimpleDecoderOutputBuffer outputBuffer, boolean reset) {
|
||||
if (inputBuffer.isEndOfStream()) {
|
||||
outputBuffer.setFlags(C.BUFFER_FLAG_END_OF_STREAM);
|
||||
}
|
||||
|
@ -38,6 +38,7 @@ import com.google.android.exoplayer2.decoder.CryptoConfig;
|
||||
import com.google.android.exoplayer2.decoder.DecoderException;
|
||||
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
||||
import com.google.android.exoplayer2.decoder.SimpleDecoder;
|
||||
import com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer;
|
||||
import com.google.android.exoplayer2.drm.DrmSessionEventListener;
|
||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
||||
import com.google.android.exoplayer2.testutil.FakeSampleStream;
|
||||
@ -108,7 +109,7 @@ public final class DecoderVideoRendererTest {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onQueueInputBuffer(VideoDecoderInputBuffer buffer) {
|
||||
protected void onQueueInputBuffer(DecoderInputBuffer buffer) {
|
||||
// Decoding is done on a background thread we have no control about from the test.
|
||||
// Ensure the background calls are predictably serialized by waiting for them to finish:
|
||||
// 1. Register queued input buffers here.
|
||||
@ -125,17 +126,16 @@ public final class DecoderVideoRendererTest {
|
||||
|
||||
@Override
|
||||
protected SimpleDecoder<
|
||||
VideoDecoderInputBuffer,
|
||||
DecoderInputBuffer,
|
||||
? extends VideoDecoderOutputBuffer,
|
||||
? extends DecoderException>
|
||||
createDecoder(Format format, @Nullable CryptoConfig cryptoConfig) {
|
||||
return new SimpleDecoder<
|
||||
VideoDecoderInputBuffer, VideoDecoderOutputBuffer, DecoderException>(
|
||||
new VideoDecoderInputBuffer[10], new VideoDecoderOutputBuffer[10]) {
|
||||
DecoderInputBuffer, VideoDecoderOutputBuffer, DecoderException>(
|
||||
new DecoderInputBuffer[10], new VideoDecoderOutputBuffer[10]) {
|
||||
@Override
|
||||
protected VideoDecoderInputBuffer createInputBuffer() {
|
||||
return new VideoDecoderInputBuffer(
|
||||
DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT) {
|
||||
protected DecoderInputBuffer createInputBuffer() {
|
||||
return new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT) {
|
||||
@Override
|
||||
public void clear() {
|
||||
super.clear();
|
||||
@ -157,7 +157,7 @@ public final class DecoderVideoRendererTest {
|
||||
@Nullable
|
||||
@Override
|
||||
protected DecoderException decode(
|
||||
VideoDecoderInputBuffer inputBuffer,
|
||||
DecoderInputBuffer inputBuffer,
|
||||
VideoDecoderOutputBuffer outputBuffer,
|
||||
boolean reset) {
|
||||
outputBuffer.init(inputBuffer.timeUs, outputMode, /* supplementalData= */ null);
|
||||
|
@ -18,6 +18,7 @@ package com.google.android.exoplayer2.decoder;
|
||||
import androidx.annotation.IntDef;
|
||||
import androidx.annotation.Nullable;
|
||||
import com.google.android.exoplayer2.C;
|
||||
import com.google.android.exoplayer2.Format;
|
||||
import java.lang.annotation.Documented;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
@ -73,6 +74,9 @@ public class DecoderInputBuffer extends Buffer {
|
||||
/** Allows buffer replacement using {@link ByteBuffer#allocateDirect(int)}. */
|
||||
public static final int BUFFER_REPLACEMENT_MODE_DIRECT = 2;
|
||||
|
||||
/** The {@link Format}. */
|
||||
@Nullable public Format format;
|
||||
|
||||
/** {@link CryptoInfo} for encrypted data. */
|
||||
public final CryptoInfo cryptoInfo;
|
||||
|
||||
|
@ -16,10 +16,10 @@
|
||||
package com.google.android.exoplayer2.decoder;
|
||||
|
||||
/** Output buffer decoded by a {@link Decoder}. */
|
||||
public abstract class OutputBuffer extends Buffer {
|
||||
public abstract class DecoderOutputBuffer extends Buffer {
|
||||
|
||||
/** Buffer owner. */
|
||||
public interface Owner<S extends OutputBuffer> {
|
||||
public interface Owner<S extends DecoderOutputBuffer> {
|
||||
|
||||
/**
|
||||
* Releases the buffer.
|
@ -27,7 +27,7 @@ import java.util.ArrayDeque;
|
||||
*/
|
||||
@SuppressWarnings("UngroupedOverloads")
|
||||
public abstract class SimpleDecoder<
|
||||
I extends DecoderInputBuffer, O extends OutputBuffer, E extends DecoderException>
|
||||
I extends DecoderInputBuffer, O extends DecoderOutputBuffer, E extends DecoderException>
|
||||
implements Decoder<I, O, E> {
|
||||
|
||||
private final Thread decodeThread;
|
||||
|
@ -20,13 +20,13 @@ import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
|
||||
/** Buffer for {@link SimpleDecoder} output. */
|
||||
public class SimpleOutputBuffer extends OutputBuffer {
|
||||
public class SimpleDecoderOutputBuffer extends DecoderOutputBuffer {
|
||||
|
||||
private final Owner<SimpleOutputBuffer> owner;
|
||||
private final Owner<SimpleDecoderOutputBuffer> owner;
|
||||
|
||||
@Nullable public ByteBuffer data;
|
||||
|
||||
public SimpleOutputBuffer(Owner<SimpleOutputBuffer> owner) {
|
||||
public SimpleDecoderOutputBuffer(Owner<SimpleDecoderOutputBuffer> owner) {
|
||||
this.owner = owner;
|
||||
}
|
||||
|
@ -13,16 +13,15 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.google.android.exoplayer2.video;
|
||||
package com.google.android.exoplayer2.decoder;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import com.google.android.exoplayer2.C;
|
||||
import com.google.android.exoplayer2.Format;
|
||||
import com.google.android.exoplayer2.decoder.OutputBuffer;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
/** Video decoder output buffer containing video frame data. */
|
||||
public class VideoDecoderOutputBuffer extends OutputBuffer {
|
||||
public class VideoDecoderOutputBuffer extends DecoderOutputBuffer {
|
||||
|
||||
public static final int COLORSPACE_UNKNOWN = 0;
|
||||
public static final int COLORSPACE_BT601 = 1;
|
@ -17,12 +17,12 @@ package com.google.android.exoplayer2.text;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import com.google.android.exoplayer2.Format;
|
||||
import com.google.android.exoplayer2.decoder.OutputBuffer;
|
||||
import com.google.android.exoplayer2.decoder.DecoderOutputBuffer;
|
||||
import com.google.android.exoplayer2.util.Assertions;
|
||||
import java.util.List;
|
||||
|
||||
/** Base class for {@link SubtitleDecoder} output buffers. */
|
||||
public abstract class SubtitleOutputBuffer extends OutputBuffer implements Subtitle {
|
||||
public abstract class SubtitleOutputBuffer extends DecoderOutputBuffer implements Subtitle {
|
||||
|
||||
@Nullable private Subtitle subtitle;
|
||||
private long subsampleOffsetUs;
|
||||
|
Loading…
x
Reference in New Issue
Block a user