vpxdec: Unref frame in all code paths of handle_frame()
authorSebastian Dröge <sebastian@centricular.com>
Wed, 20 Jan 2016 08:02:48 +0000 (10:02 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Wed, 20 Jan 2016 08:02:48 +0000 (10:02 +0200)
https://bugzilla.gnome.org/show_bug.cgi?id=760666

ext/vpx/gstvpxdec.c

index 1d2ddca..d955ef0 100644 (file)
@@ -564,12 +564,10 @@ gst_vpx_dec_open_codec (GstVPXDec * dec, GstVideoCodecFrame * frame)
   if (status != VPX_CODEC_OK) {
     GST_WARNING_OBJECT (dec, "VPX preprocessing error: %s",
         gst_vpx_error_name (status));
-    gst_video_decoder_drop_frame (GST_VIDEO_DECODER (dec), frame);
     return GST_FLOW_CUSTOM_SUCCESS_1;
   }
   if (!stream_info.is_kf) {
     GST_WARNING_OBJECT (dec, "No keyframe, skipping");
-    gst_video_decoder_drop_frame (GST_VIDEO_DECODER (dec), frame);
     return GST_FLOW_CUSTOM_SUCCESS_1;
   }
 
@@ -644,10 +642,13 @@ gst_vpx_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
 
   if (!dec->decoder_inited) {
     ret = vpxclass->open_codec (dec, frame);
-    if (ret == GST_FLOW_CUSTOM_SUCCESS_1)
+    if (ret == GST_FLOW_CUSTOM_SUCCESS_1) {
+      gst_video_decoder_drop_frame (decoder, frame);
       return GST_FLOW_OK;
-    else if (ret != GST_FLOW_OK)
+    } else if (ret != GST_FLOW_OK) {
+      gst_video_codec_frame_unref (frame);
       return ret;
+    }
   }
 
   deadline = gst_video_decoder_get_max_decode_time (decoder, frame);
@@ -661,6 +662,7 @@ gst_vpx_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
 
   if (!gst_buffer_map (frame->input_buffer, &minfo, GST_MAP_READ)) {
     GST_ERROR_OBJECT (dec, "Failed to map input buffer");
+    gst_video_codec_frame_unref (frame);
     return GST_FLOW_ERROR;
   }
 
@@ -672,6 +674,7 @@ gst_vpx_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
   if (status) {
     GST_VIDEO_DECODER_ERROR (decoder, 1, LIBRARY, ENCODE,
         ("Failed to decode frame"), ("%s", gst_vpx_error_name (status)), ret);
+    gst_video_codec_frame_unref (frame);
     return ret;
   }
 
@@ -682,6 +685,7 @@ gst_vpx_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
       GST_ELEMENT_ERROR (decoder, LIBRARY, ENCODE,
           ("Failed to decode frame"), ("Unsupported color format %d",
               img->fmt));
+      gst_video_codec_frame_unref (frame);
       return GST_FLOW_ERROR;
     }