Merge pull request #6999 from xufuji456:dev-v2

PiperOrigin-RevId: 298544278
This commit is contained in:
Oliver Woodman 2020-03-10 10:17:13 +00:00
commit aeea17dd0f
4 changed files with 17 additions and 23 deletions

View File

@ -33,7 +33,7 @@ public final class FfmpegLibrary {
private static final String TAG = "FfmpegLibrary"; private static final String TAG = "FfmpegLibrary";
private static final LibraryLoader LOADER = private static final LibraryLoader LOADER =
new LibraryLoader("avutil", "avresample", "swresample", "avcodec", "ffmpeg"); new LibraryLoader("avutil", "swresample", "avcodec", "ffmpeg");
private FfmpegLibrary() {} private FfmpegLibrary() {}

View File

@ -21,11 +21,6 @@ LOCAL_MODULE := libavcodec
LOCAL_SRC_FILES := ffmpeg/android-libs/$(TARGET_ARCH_ABI)/$(LOCAL_MODULE).so LOCAL_SRC_FILES := ffmpeg/android-libs/$(TARGET_ARCH_ABI)/$(LOCAL_MODULE).so
include $(PREBUILT_SHARED_LIBRARY) include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libavresample
LOCAL_SRC_FILES := ffmpeg/android-libs/$(TARGET_ARCH_ABI)/$(LOCAL_MODULE).so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_MODULE := libswresample LOCAL_MODULE := libswresample
LOCAL_SRC_FILES := ffmpeg/android-libs/$(TARGET_ARCH_ABI)/$(LOCAL_MODULE).so LOCAL_SRC_FILES := ffmpeg/android-libs/$(TARGET_ARCH_ABI)/$(LOCAL_MODULE).so
@ -40,6 +35,6 @@ include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg LOCAL_MODULE := ffmpeg
LOCAL_SRC_FILES := ffmpeg_jni.cc LOCAL_SRC_FILES := ffmpeg_jni.cc
LOCAL_C_INCLUDES := ffmpeg LOCAL_C_INCLUDES := ffmpeg
LOCAL_SHARED_LIBRARIES := libavcodec libavresample libswresample libavutil LOCAL_SHARED_LIBRARIES := libavcodec libswresample libavutil
LOCAL_LDLIBS := -Lffmpeg/android-libs/$(TARGET_ARCH_ABI) -llog LOCAL_LDLIBS := -Lffmpeg/android-libs/$(TARGET_ARCH_ABI) -llog
include $(BUILD_SHARED_LIBRARY) include $(BUILD_SHARED_LIBRARY)

View File

@ -32,7 +32,7 @@ COMMON_OPTIONS="
--disable-postproc --disable-postproc
--disable-avfilter --disable-avfilter
--disable-symver --disable-symver
--enable-avresample --disable-avresample
--enable-swresample --enable-swresample
" "
TOOLCHAIN_PREFIX="${NDK_PATH}/toolchains/llvm/prebuilt/${HOST_PLATFORM}/bin" TOOLCHAIN_PREFIX="${NDK_PATH}/toolchains/llvm/prebuilt/${HOST_PLATFORM}/bin"

View File

@ -26,10 +26,10 @@ extern "C" {
#include <stdint.h> #include <stdint.h>
#endif #endif
#include <libavcodec/avcodec.h> #include <libavcodec/avcodec.h>
#include <libavresample/avresample.h>
#include <libavutil/channel_layout.h> #include <libavutil/channel_layout.h>
#include <libavutil/error.h> #include <libavutil/error.h>
#include <libavutil/opt.h> #include <libavutil/opt.h>
#include <libswresample/swresample.h>
} }
#define LOG_TAG "ffmpeg_jni" #define LOG_TAG "ffmpeg_jni"
@ -289,11 +289,11 @@ int decodePacket(AVCodecContext *context, AVPacket *packet,
int sampleCount = frame->nb_samples; int sampleCount = frame->nb_samples;
int dataSize = av_samples_get_buffer_size(NULL, channelCount, sampleCount, int dataSize = av_samples_get_buffer_size(NULL, channelCount, sampleCount,
sampleFormat, 1); sampleFormat, 1);
AVAudioResampleContext *resampleContext; SwrContext *resampleContext;
if (context->opaque) { if (context->opaque) {
resampleContext = (AVAudioResampleContext *) context->opaque; resampleContext = (SwrContext *)context->opaque;
} else { } else {
resampleContext = avresample_alloc_context(); resampleContext = swr_alloc();
av_opt_set_int(resampleContext, "in_channel_layout", channelLayout, 0); av_opt_set_int(resampleContext, "in_channel_layout", channelLayout, 0);
av_opt_set_int(resampleContext, "out_channel_layout", channelLayout, 0); av_opt_set_int(resampleContext, "out_channel_layout", channelLayout, 0);
av_opt_set_int(resampleContext, "in_sample_rate", sampleRate, 0); av_opt_set_int(resampleContext, "in_sample_rate", sampleRate, 0);
@ -302,9 +302,9 @@ int decodePacket(AVCodecContext *context, AVPacket *packet,
// The output format is always the requested format. // The output format is always the requested format.
av_opt_set_int(resampleContext, "out_sample_fmt", av_opt_set_int(resampleContext, "out_sample_fmt",
context->request_sample_fmt, 0); context->request_sample_fmt, 0);
result = avresample_open(resampleContext); result = swr_init(resampleContext);
if (result < 0) { if (result < 0) {
logError("avresample_open", result); logError("swr_init", result);
av_frame_free(&frame); av_frame_free(&frame);
return -1; return -1;
} }
@ -312,7 +312,7 @@ int decodePacket(AVCodecContext *context, AVPacket *packet,
} }
int inSampleSize = av_get_bytes_per_sample(sampleFormat); int inSampleSize = av_get_bytes_per_sample(sampleFormat);
int outSampleSize = av_get_bytes_per_sample(context->request_sample_fmt); int outSampleSize = av_get_bytes_per_sample(context->request_sample_fmt);
int outSamples = avresample_get_out_samples(resampleContext, sampleCount); int outSamples = swr_get_out_samples(resampleContext, sampleCount);
int bufferOutSize = outSampleSize * channelCount * outSamples; int bufferOutSize = outSampleSize * channelCount * outSamples;
if (outSize + bufferOutSize > outputSize) { if (outSize + bufferOutSize > outputSize) {
LOGE("Output buffer size (%d) too small for output data (%d).", LOGE("Output buffer size (%d) too small for output data (%d).",
@ -320,15 +320,14 @@ int decodePacket(AVCodecContext *context, AVPacket *packet,
av_frame_free(&frame); av_frame_free(&frame);
return -1; return -1;
} }
result = avresample_convert(resampleContext, &outputBuffer, bufferOutSize, result = swr_convert(resampleContext, &outputBuffer, bufferOutSize,
outSamples, frame->data, frame->linesize[0], (const uint8_t **)frame->data, frame->nb_samples);
sampleCount);
av_frame_free(&frame); av_frame_free(&frame);
if (result < 0) { if (result < 0) {
logError("avresample_convert", result); logError("swr_convert", result);
return result; return result;
} }
int available = avresample_available(resampleContext); int available = swr_get_out_samples(resampleContext, 0);
if (available != 0) { if (available != 0) {
LOGE("Expected no samples remaining after resampling, but found %d.", LOGE("Expected no samples remaining after resampling, but found %d.",
available); available);
@ -351,9 +350,9 @@ void releaseContext(AVCodecContext *context) {
if (!context) { if (!context) {
return; return;
} }
AVAudioResampleContext *resampleContext; SwrContext *swrContext;
if ((resampleContext = (AVAudioResampleContext *) context->opaque)) { if ((swrContext = (SwrContext *)context->opaque)) {
avresample_free(&resampleContext); swr_free(&swrContext);
context->opaque = NULL; context->opaque = NULL;
} }
avcodec_free_context(&context); avcodec_free_context(&context);