]> git.sesse.net Git - ffmpeg/blobdiff - libavutil/frame.c
Merge commit 'a0e1c3517a656dd32293f054a339e0ac73328138'
[ffmpeg] / libavutil / frame.c
index b6b755f5dd21f711ebd033a880b527f0d15518d5..fdfbc4675371a1f756f2489e7b797fa0b2fafcf9 100644 (file)
@@ -113,6 +113,15 @@ static void get_frame_defaults(AVFrame *frame)
 #endif
 }
 
+static void free_side_data(AVFrameSideData **ptr_sd)
+{
+    AVFrameSideData *sd = *ptr_sd;
+
+    av_freep(&sd->data);
+    av_dict_free(&sd->metadata);
+    av_freep(ptr_sd);
+}
+
 AVFrame *av_frame_alloc(void)
 {
     AVFrame *frame = av_mallocz(sizeof(*frame));
@@ -360,9 +369,7 @@ void av_frame_unref(AVFrame *frame)
     int i;
 
     for (i = 0; i < frame->nb_side_data; i++) {
-        av_freep(&frame->side_data[i]->data);
-        av_dict_free(&frame->side_data[i]->metadata);
-        av_freep(&frame->side_data[i]);
+        free_side_data(&frame->side_data[i]);
     }
     av_freep(&frame->side_data);
 
@@ -493,9 +500,7 @@ int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
                                                          sd_src->size);
         if (!sd_dst) {
             for (i = 0; i < dst->nb_side_data; i++) {
-                av_freep(&dst->side_data[i]->data);
-                av_dict_free(&dst->side_data[i]->metadata);
-                av_freep(&dst->side_data[i]);
+                free_side_data(&dst->side_data[i]);
             }
             av_freep(&dst->side_data);
             return AVERROR(ENOMEM);
@@ -661,9 +666,7 @@ void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type)
     for (i = 0; i < frame->nb_side_data; i++) {
         AVFrameSideData *sd = frame->side_data[i];
         if (sd->type == type) {
-            av_freep(&sd->data);
-            av_dict_free(&sd->metadata);
-            av_freep(&frame->side_data[i]);
+            free_side_data(&frame->side_data[i]);
             frame->side_data[i] = frame->side_data[frame->nb_side_data - 1];
             frame->nb_side_data--;
         }