vaapidecode: unref video codec frame twice
authorMichael Olbrich <m.olbrich@pengutronix.de>
Thu, 11 Dec 2014 11:02:38 +0000 (12:02 +0100)
committerVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Fri, 10 Apr 2015 10:42:38 +0000 (12:42 +0200)
We get one reference when the frame is passed to decode_handle_frame()
and create another one in gst_vaapi_decoder_push_frame().

Usually the frame is handled in gst_vaapidecode_push_decoded_frame().
Here the frame is always released twice:
gst_video_decoder_finish_frame() + gst_video_codec_frame_unref() or
gst_video_decoder_drop_frame() + gst_video_codec_frame_unref().

In gst_vaapidecode_reset_full() both references to the frame must be
released as well.

Signed-off-by: Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
https://bugzilla.gnome.org/show_bug.cgi?id=743226

gst/vaapi/gstvaapidecode.c

index 05c9d0c..707efab 100644 (file)
@@ -636,6 +636,7 @@ gst_vaapidecode_reset_full (GstVaapiDecode * decode, GstCaps * caps,
 
   /* Reset timers if hard reset was requested (e.g. seek) */
   if (hard) {
+    GstVideoDecoder *const vdec = GST_VIDEO_DECODER (decode);
     GstVideoCodecFrame *out_frame = NULL;
 
     gst_vaapi_decoder_flush (decode->decoder);
@@ -643,6 +644,7 @@ gst_vaapidecode_reset_full (GstVaapiDecode * decode, GstCaps * caps,
     /* Purge all decoded frames as we don't need them (e.g. seek) */
     while (gst_vaapi_decoder_get_frame_with_timeout (decode->decoder,
             &out_frame, 0) == GST_VAAPI_DECODER_STATUS_SUCCESS) {
+      gst_video_decoder_drop_frame (vdec, out_frame);
       gst_video_codec_frame_unref (out_frame);
       out_frame = NULL;
     }