vaapidecode: refactor gst_vaapidecode_destroy()

Add the method gst_vaapidecode_purge(). This method releases the
flushed frames from the decoder.

This new method add more readablity to gst_vaapidecode_destroy()
This commit is contained in:
Víctor Manuel Jáquez Leal 2015-04-20 13:27:27 +02:00
parent 11c963a3c1
commit dbc8f3f25f

View file

@ -630,22 +630,38 @@ gst_vaapidecode_create (GstVaapiDecode * decode, GstCaps * caps)
return TRUE; return TRUE;
} }
static void
gst_vaapidecode_purge (GstVaapiDecode * decode)
{
GstVaapiDecoderStatus status;
if (!decode->decoder)
return;
status = gst_vaapi_decoder_flush (decode->decoder);
if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
GST_INFO_OBJECT (decode, "decoder flush failed");
/* Purge all decoded frames as we don't need them (e.g. flush and close)
* Releasing the frames is important, otherwise the frames are not
* freed. */
do {
GstVideoCodecFrame *frame = NULL;
status =
gst_vaapi_decoder_get_frame_with_timeout (decode->decoder, &frame, 0);
if (frame) {
gst_video_decoder_release_frame (GST_VIDEO_DECODER (decode), frame);
gst_video_codec_frame_unref (frame);
}
} while (status == GST_VAAPI_DECODER_STATUS_SUCCESS);
}
static void static void
gst_vaapidecode_destroy (GstVaapiDecode * decode) gst_vaapidecode_destroy (GstVaapiDecode * decode)
{ {
GstVideoCodecFrame *out_frame = NULL; gst_vaapidecode_purge (decode);
if (decode->decoder) {
gst_vaapi_decoder_flush (decode->decoder);
/* 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_release_frame (GST_VIDEO_DECODER (decode), out_frame);
gst_video_codec_frame_unref (out_frame);
out_frame = NULL;
}
}
gst_vaapi_decoder_replace (&decode->decoder, NULL); gst_vaapi_decoder_replace (&decode->decoder, NULL);
gst_caps_replace (&decode->decoder_caps, NULL); gst_caps_replace (&decode->decoder_caps, NULL);