aboutsummaryrefslogtreecommitdiff
path: root/src/com/android/exoplayer2/ext/ffmpeg
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/exoplayer2/ext/ffmpeg')
-rw-r--r--src/com/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java127
-rw-r--r--src/com/android/exoplayer2/ext/ffmpeg/FfmpegLibrary.java84
2 files changed, 0 insertions, 211 deletions
diff --git a/src/com/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java b/src/com/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java
deleted file mode 100644
index 2b7817dc..00000000
--- a/src/com/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2017 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.ext.ffmpeg;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
-import com.google.android.exoplayer2.decoder.SimpleOutputBuffer;
-import com.google.android.exoplayer2.util.MimeTypes;
-import com.android.tv.common.SoftPreconditions;
-
-import java.nio.ByteBuffer;
-
-/**
- * Audio decoder which uses ffmpeg extension of ExoPlayer2. Since {@link FfmpegDecoder} is package
- * private, expose the decoder via this class. Supported formats are AC3 and MP2.
- */
-public class FfmpegAudioDecoder {
- private static final int NUM_DECODER_BUFFERS = 1;
-
- // The largest AC3 sample size. This is bigger than the largest MP2 sample size (1729).
- private static final int INITIAL_INPUT_BUFFER_SIZE = 2560;
- private static boolean AVAILABLE;
-
- static {
- AVAILABLE =
- FfmpegLibrary.supportsFormat(MimeTypes.AUDIO_AC3)
- && FfmpegLibrary.supportsFormat(MimeTypes.AUDIO_MPEG_L2);
- }
-
- private FfmpegDecoder mDecoder;
- private DecoderInputBuffer mInputBuffer;
- private SimpleOutputBuffer mOutputBuffer;
- private boolean mStarted;
-
- /** Return whether Ffmpeg based software audio decoder is available. */
- public static boolean isAvailable() {
- return AVAILABLE;
- }
-
- /** Creates an Ffmpeg based software audio decoder. */
- public FfmpegAudioDecoder(Context context) {
- if (context.checkSelfPermission("android.permission.INTERNET")
- == PackageManager.PERMISSION_GRANTED) {
- throw new IllegalStateException("This code should run in an isolated process");
- }
- }
-
- /**
- * Decodes an audio sample.
- *
- * @param timeUs presentation timestamp of the sample
- * @param sample data
- */
- public void decode(long timeUs, byte[] sample) {
- SoftPreconditions.checkState(AVAILABLE);
- mInputBuffer.data.clear();
- mInputBuffer.data.put(sample);
- mInputBuffer.data.flip();
- mInputBuffer.timeUs = timeUs;
- mDecoder.decode(mInputBuffer, mOutputBuffer, !mStarted);
- if (!mStarted) {
- mStarted = true;
- }
- }
-
- /** Returns a decoded sample from decoder. */
- public ByteBuffer getDecodedSample() {
- return mOutputBuffer.data;
- }
-
- /** Returns the presentation time for the decoded sample. */
- public long getDecodedTimeUs() {
- return mOutputBuffer.timeUs;
- }
-
- /**
- * Clear previous decode state if any. Prepares to decode samples of the specified encoding.
- * This method should be called before using decode.
- *
- * @param mime audio encoding
- */
- public void resetDecoderState(String mime) {
- SoftPreconditions.checkState(AVAILABLE);
- release();
- try {
- mDecoder =
- new FfmpegDecoder(
- NUM_DECODER_BUFFERS,
- NUM_DECODER_BUFFERS,
- INITIAL_INPUT_BUFFER_SIZE,
- mime,
- null);
- mStarted = false;
- mInputBuffer = mDecoder.createInputBuffer();
- // Since native JNI requires direct buffer, we should allocate it by #allocateDirect.
- mInputBuffer.data = ByteBuffer.allocateDirect(INITIAL_INPUT_BUFFER_SIZE);
- mOutputBuffer = mDecoder.createOutputBuffer();
- } catch (FfmpegDecoderException e) {
- // if AVAILABLE is {@code true}, this will not happen.
- }
- }
-
- /** Releases all the resource. */
- public void release() {
- SoftPreconditions.checkState(AVAILABLE);
- if (mDecoder != null) {
- mDecoder.release();
- mInputBuffer = null;
- mOutputBuffer = null;
- mDecoder = null;
- }
- }
-}
diff --git a/src/com/android/exoplayer2/ext/ffmpeg/FfmpegLibrary.java b/src/com/android/exoplayer2/ext/ffmpeg/FfmpegLibrary.java
deleted file mode 100644
index daa77340..00000000
--- a/src/com/android/exoplayer2/ext/ffmpeg/FfmpegLibrary.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2017 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.ext.ffmpeg;
-
-import com.google.android.exoplayer2.util.LibraryLoader;
-import com.google.android.exoplayer2.util.MimeTypes;
-
-/**
- * This class is based on com.google.android.exoplayer2.ext.ffmpeg.FfmpegLibrary from ExoPlayer2
- * in order to support mp2 decoder.
- * Configures and queries the underlying native library.
- */
-public final class FfmpegLibrary {
-
- private static final LibraryLoader LOADER =
- new LibraryLoader("avutil", "avresample", "avcodec", "ffmpeg");
-
- private FfmpegLibrary() {}
-
- /**
- * Overrides the names of the FFmpeg native libraries. If an application wishes to call this
- * method, it must do so before calling any other method defined by this class, and before
- * instantiating a {@link FfmpegAudioRenderer} instance.
- */
- public static void setLibraries(String... libraries) {
- LOADER.setLibraries(libraries);
- }
-
- /**
- * Returns whether the underlying library is available, loading it if necessary.
- */
- public static boolean isAvailable() {
- return LOADER.isAvailable();
- }
-
- /**
- * Returns the version of the underlying library if available, or null otherwise.
- */
- public static String getVersion() {
- return isAvailable() ? ffmpegGetVersion() : null;
- }
-
- /**
- * Returns whether the underlying library supports the specified MIME type.
- */
- public static boolean supportsFormat(String mimeType) {
- if (!isAvailable()) {
- return false;
- }
- String codecName = getCodecName(mimeType);
- return codecName != null && ffmpegHasDecoder(codecName);
- }
-
- /**
- * Returns the name of the FFmpeg decoder that could be used to decode {@code mimeType}.
- */
- /* package */ static String getCodecName(String mimeType) {
- switch (mimeType) {
- case MimeTypes.AUDIO_MPEG_L2:
- return "mp2";
- case MimeTypes.AUDIO_AC3:
- return "ac3";
- default:
- return null;
- }
- }
-
- private static native String ffmpegGetVersion();
- private static native boolean ffmpegHasDecoder(String codecName);
-
-}