From 5d839778b9f3edb682b7f71dde4f80f07c75b098 Mon Sep 17 00:00:00 2001 From: Luca Barbato Date: Mon, 15 Dec 2014 20:38:00 +0100 Subject: lavu: Refactor side data wiping And make sure the nb_side_data field is reset as well. Based on an initial patch from wm4 . CC: libav-stable@libav.org --- libavutil/frame.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'libavutil/frame.c') diff --git a/libavutil/frame.c b/libavutil/frame.c index 48df311dd2..32ec47066b 100644 --- a/libavutil/frame.c +++ b/libavutil/frame.c @@ -54,6 +54,18 @@ static void free_side_data(AVFrameSideData **ptr_sd) av_freep(ptr_sd); } +static void wipe_side_data(AVFrame *frame) +{ + int i; + + for (i = 0; i < frame->nb_side_data; i++) { + free_side_data(&frame->side_data[i]); + } + frame->nb_side_data = 0; + + av_freep(&frame->side_data); +} + AVFrame *av_frame_alloc(void) { AVFrame *frame = av_mallocz(sizeof(*frame)); @@ -284,10 +296,7 @@ void av_frame_unref(AVFrame *frame) { int i; - for (i = 0; i < frame->nb_side_data; i++) { - free_side_data(&frame->side_data[i]); - } - av_freep(&frame->side_data); + wipe_side_data(frame); for (i = 0; i < FF_ARRAY_ELEMS(frame->buf); i++) av_buffer_unref(&frame->buf[i]); @@ -398,10 +407,7 @@ int av_frame_copy_props(AVFrame *dst, const AVFrame *src) AVFrameSideData *sd_dst = av_frame_new_side_data(dst, sd_src->type, sd_src->size); if (!sd_dst) { - for (i = 0; i < dst->nb_side_data; i++) { - free_side_data(&dst->side_data[i]); - } - av_freep(&dst->side_data); + wipe_side_data(dst); return AVERROR(ENOMEM); } memcpy(sd_dst->data, sd_src->data, sd_src->size); -- cgit v1.2.3