diff --git a/libraries/decoder_ffmpeg/src/main/jni/ffmpeg_jni.cc b/libraries/decoder_ffmpeg/src/main/jni/ffmpeg_jni.cc index c4c650a888..17b4d747c9 100644 --- a/libraries/decoder_ffmpeg/src/main/jni/ffmpeg_jni.cc +++ b/libraries/decoder_ffmpeg/src/main/jni/ffmpeg_jni.cc @@ -89,6 +89,11 @@ AVCodecContext *createContext(JNIEnv *env, AVCodec *codec, jbyteArray extraData, int decodePacket(AVCodecContext *context, AVPacket *packet, uint8_t *outputBuffer, int outputSize); +/** + * Transforms ffmpeg AVERROR into a negative AUDIO_DECODER_ERROR constant value. + */ +int transformError(const char *functionName, int errorNumber); + /** * Outputs a log message describing the avcodec error number. */ @@ -265,8 +270,7 @@ int decodePacket(AVCodecContext *context, AVPacket *packet, result = avcodec_send_packet(context, packet); if (result) { logError("avcodec_send_packet", result); - return result == AVERROR_INVALIDDATA ? AUDIO_DECODER_ERROR_INVALID_DATA - : AUDIO_DECODER_ERROR_OTHER; + return transformError(result); } // Dequeue output data until it runs out. @@ -275,7 +279,7 @@ int decodePacket(AVCodecContext *context, AVPacket *packet, AVFrame *frame = av_frame_alloc(); if (!frame) { LOGE("Failed to allocate output frame."); - return -1; + return AUDIO_DECODER_ERROR_INVALID_DATA; } result = avcodec_receive_frame(context, frame); if (result) { @@ -284,7 +288,7 @@ int decodePacket(AVCodecContext *context, AVPacket *packet, break; } logError("avcodec_receive_frame", result); - return result; + return transformError(result); } // Resample output. @@ -312,7 +316,7 @@ int decodePacket(AVCodecContext *context, AVPacket *packet, if (result < 0) { logError("swr_init", result); av_frame_free(&frame); - return -1; + return transformError(result); } context->opaque = resampleContext; } @@ -324,20 +328,20 @@ int decodePacket(AVCodecContext *context, AVPacket *packet, LOGE("Output buffer size (%d) too small for output data (%d).", outputSize, outSize + bufferOutSize); av_frame_free(&frame); - return -1; + return AUDIO_DECODER_ERROR_INVALID_DATA; } result = swr_convert(resampleContext, &outputBuffer, bufferOutSize, (const uint8_t **)frame->data, frame->nb_samples); av_frame_free(&frame); if (result < 0) { logError("swr_convert", result); - return result; + return AUDIO_DECODER_ERROR_INVALID_DATA; } int available = swr_get_out_samples(resampleContext, 0); if (available != 0) { LOGE("Expected no samples remaining after resampling, but found %d.", available); - return -1; + return AUDIO_DECODER_ERROR_INVALID_DATA; } outputBuffer += bufferOutSize; outSize += bufferOutSize; @@ -345,6 +349,11 @@ int decodePacket(AVCodecContext *context, AVPacket *packet, return outSize; } +int transformError(int result) { + return result == AVERROR_INVALIDDATA ? AUDIO_DECODER_ERROR_INVALID_DATA + : AUDIO_DECODER_ERROR_OTHER; +} + void logError(const char *functionName, int errorNumber) { char *buffer = (char *)malloc(ERROR_STRING_BUFFER_LENGTH * sizeof(char)); av_strerror(errorNumber, buffer, ERROR_STRING_BUFFER_LENGTH);