mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avcodec/options: do a more thorough clean up in avcodec_copy_context()
Free coded_frame, coded_side_data and unref hw_device_ctx to prevent potential leaks. Reviewed-by: Aaron Levinson <alevinsn@aracnet.com> Tested-by: Michael Niedermayer <michael@niedermayer.cc> Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
parent
54a4c9b4e9
commit
cac8de2da5
@ -190,14 +190,26 @@ void avcodec_free_context(AVCodecContext **pavctx)
|
|||||||
#if FF_API_COPY_CONTEXT
|
#if FF_API_COPY_CONTEXT
|
||||||
static void copy_context_reset(AVCodecContext *avctx)
|
static void copy_context_reset(AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
av_opt_free(avctx);
|
av_opt_free(avctx);
|
||||||
|
#if FF_API_CODED_FRAME
|
||||||
|
FF_DISABLE_DEPRECATION_WARNINGS
|
||||||
|
av_frame_free(&avctx->coded_frame);
|
||||||
|
FF_ENABLE_DEPRECATION_WARNINGS
|
||||||
|
#endif
|
||||||
av_freep(&avctx->rc_override);
|
av_freep(&avctx->rc_override);
|
||||||
av_freep(&avctx->intra_matrix);
|
av_freep(&avctx->intra_matrix);
|
||||||
av_freep(&avctx->inter_matrix);
|
av_freep(&avctx->inter_matrix);
|
||||||
av_freep(&avctx->extradata);
|
av_freep(&avctx->extradata);
|
||||||
av_freep(&avctx->subtitle_header);
|
av_freep(&avctx->subtitle_header);
|
||||||
av_buffer_unref(&avctx->hw_frames_ctx);
|
av_buffer_unref(&avctx->hw_frames_ctx);
|
||||||
|
av_buffer_unref(&avctx->hw_device_ctx);
|
||||||
|
for (i = 0; i < avctx->nb_coded_side_data; i++)
|
||||||
|
av_freep(&avctx->coded_side_data[i].data);
|
||||||
|
av_freep(&avctx->coded_side_data);
|
||||||
avctx->subtitle_header_size = 0;
|
avctx->subtitle_header_size = 0;
|
||||||
|
avctx->nb_coded_side_data = 0;
|
||||||
avctx->extradata_size = 0;
|
avctx->extradata_size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -238,11 +250,14 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
|||||||
|
|
||||||
/* reallocate values that should be allocated separately */
|
/* reallocate values that should be allocated separately */
|
||||||
dest->extradata = NULL;
|
dest->extradata = NULL;
|
||||||
|
dest->coded_side_data = NULL;
|
||||||
dest->intra_matrix = NULL;
|
dest->intra_matrix = NULL;
|
||||||
dest->inter_matrix = NULL;
|
dest->inter_matrix = NULL;
|
||||||
dest->rc_override = NULL;
|
dest->rc_override = NULL;
|
||||||
dest->subtitle_header = NULL;
|
dest->subtitle_header = NULL;
|
||||||
dest->hw_frames_ctx = NULL;
|
dest->hw_frames_ctx = NULL;
|
||||||
|
dest->hw_device_ctx = NULL;
|
||||||
|
dest->nb_coded_side_data = 0;
|
||||||
|
|
||||||
#define alloc_and_copy_or_fail(obj, size, pad) \
|
#define alloc_and_copy_or_fail(obj, size, pad) \
|
||||||
if (src->obj && size > 0) { \
|
if (src->obj && size > 0) { \
|
||||||
|
Loading…
Reference in New Issue
Block a user