diff options
author | Nick Chalko <nchalko@google.com> | 2018-01-17 11:15:16 -0800 |
---|---|---|
committer | Nick Chalko <nchalko@google.com> | 2018-01-17 11:20:37 -0800 |
commit | 38fef3bf253578f518d1bc727da4afb263194398 (patch) | |
tree | 09a06234eda7c54216bca773b6d8407eafe0722d /src/com/android/exoplayer2/ext | |
parent | c9889d13513e26649a7708cf2d0562cb592d441a (diff) | |
download | TV-38fef3bf253578f518d1bc727da4afb263194398.tar.gz |
Fix broken build
This reverts
c9889d1 Update aosp build to use a snapshot of exoplyer. by nchalko · 5
hours ago master
8952aa7 Clean format by nchalko · 20 hours ago
ba3fb16 Merge "Use a snapshot of exoplayer" by TreeHugger Robot · 18
hours ago
ff75e39 Project import generated by Copybara. by Live Channels Team · 22
hours ago
9737fc2 Use a snapshot of exoplayer by Nick Chalko · 20 hours ago
4a5144a Project import generated by Copybara. by Live Channels Team · 6
days ago
Bug: 72092981
Bug: 69474774
Change-Id: Ie756857c10bf052c60b6442c3d61252f65b49143
Diffstat (limited to 'src/com/android/exoplayer2/ext')
-rw-r--r-- | src/com/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java | 126 | ||||
-rw-r--r-- | src/com/android/exoplayer2/ext/ffmpeg/FfmpegLibrary.java | 75 |
2 files changed, 201 insertions, 0 deletions
diff --git a/src/com/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java b/src/com/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java new file mode 100644 index 00000000..321e19da --- /dev/null +++ b/src/com/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java @@ -0,0 +1,126 @@ +/* + * 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.android.tv.common.SoftPreconditions; +import com.google.android.exoplayer2.decoder.DecoderInputBuffer; +import com.google.android.exoplayer2.decoder.SimpleOutputBuffer; +import com.google.android.exoplayer2.util.MimeTypes; +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 new file mode 100644 index 00000000..a33d4020 --- /dev/null +++ b/src/com/android/exoplayer2/ext/ffmpeg/FfmpegLibrary.java @@ -0,0 +1,75 @@ +/* + * 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); +} |