vaapidecode: unref video codec frame twice

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
This commit is contained in:
Michael Olbrich 2014-12-11 12:02:38 +01:00 committed by Víctor Manuel Jáquez Leal
parent 93d0141cc2
commit a314b682b2

View file

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