[ffmpeg] Always allocate memory to pass extradata

Despite wording of the documentation to the contrary, we can't provide a static pointer to an immutable object.
This commit is contained in:
trav90 2018-10-01 20:51:17 -05:00 committed by Roy Tam
commit c582c801da

View file

@ -69,12 +69,21 @@ FFmpegDataDecoder<LIBAV_VER>::InitDecoder()
mCodecContext->extradata_size = mExtraData->Length();
// FFmpeg may use SIMD instructions to access the data which reads the
// data in 32 bytes block. Must ensure we have enough data to read.
uint32_t padding_size =
#if LIBAVCODEC_VERSION_MAJOR >= 58
mExtraData->AppendElements(AV_INPUT_BUFFER_PADDING_SIZE);
AV_INPUT_BUFFER_PADDING_SIZE;
#else
mExtraData->AppendElements(FF_INPUT_BUFFER_PADDING_SIZE);
FF_INPUT_BUFFER_PADDING_SIZE;
#endif
mCodecContext->extradata = mExtraData->Elements();
mCodecContext->extradata = static_cast<uint8_t*>(
mLib->av_malloc(mExtraData->Length() + padding_size));
if (!mCodecContext->extradata) {
return MediaResult(NS_ERROR_OUT_OF_MEMORY,
RESULT_DETAIL("Couldn't init ffmpeg extradata"));
}
memcpy(mCodecContext->extradata,
mExtraData->Elements(),
mExtraData->Length());
} else {
mCodecContext->extradata_size = 0;
}
@ -165,6 +174,9 @@ FFmpegDataDecoder<LIBAV_VER>::ProcessShutdown()
StaticMutexAutoLock mon(sMonitor);
if (mCodecContext) {
if (mCodecContext->extradata) {
mLib->av_freep(&mCodecContext->extradata);
}
mLib->avcodec_close(mCodecContext);
mLib->av_freep(&mCodecContext);
#if LIBAVCODEC_VERSION_MAJOR >= 55