From d849563bda9cd384be91d7cac139c5a653d3ad0e Mon Sep 17 00:00:00 2001 From: Carl-Anton Ingmarsson Date: Wed, 24 Jun 2009 17:51:58 +0200 Subject: [PATCH] vdpau: split gst_vdp_mpeg_dec_reset into start and stop --- sys/vdpau/gstvdpmpegdec.c | 52 ++++++++++++++++++++++++++++------------------ sys/vdpau/gstvdpvideoyuv.c | 1 - 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/sys/vdpau/gstvdpmpegdec.c b/sys/vdpau/gstvdpmpegdec.c index 9ea5688..a9f9d59 100644 --- a/sys/vdpau/gstvdpmpegdec.c +++ b/sys/vdpau/gstvdpmpegdec.c @@ -600,25 +600,19 @@ gst_vdp_mpeg_dec_flush (GstVdpMpegDec * mpeg_dec) if (mpeg_dec->vdp_info.backward_reference != VDP_INVALID_HANDLE) gst_buffer_unref (mpeg_dec->b_buffer); - gst_vdp_mpeg_dec_init_info (&mpeg_dec->vdp_info); - gst_adapter_clear (mpeg_dec->adapter); + gst_vdp_mpeg_dec_init_info (&mpeg_dec->vdp_info); mpeg_dec->next_timestamp = GST_CLOCK_TIME_NONE; } static void -gst_vdp_mpeg_dec_reset (GstVdpMpegDec * mpeg_dec) +gst_vdp_mpeg_dec_start (GstVdpMpegDec * mpeg_dec) { - gst_vdp_mpeg_dec_flush (mpeg_dec); - - if (mpeg_dec->device) { - if (mpeg_dec->decoder != VDP_INVALID_HANDLE) - mpeg_dec->device->vdp_decoder_destroy (mpeg_dec->decoder); - mpeg_dec->decoder = VDP_INVALID_HANDLE; + gst_vdp_mpeg_dec_init_info (&mpeg_dec->vdp_info); - g_object_unref (mpeg_dec->device); - } + mpeg_dec->device = NULL; + mpeg_dec->decoder = VDP_INVALID_HANDLE; mpeg_dec->state = GST_VDP_MPEG_DEC_NEED_SEQUENCE; @@ -629,6 +623,24 @@ gst_vdp_mpeg_dec_reset (GstVdpMpegDec * mpeg_dec) mpeg_dec->accumulated_duration = 0; } +static void +gst_vdp_mpeg_dec_stop (GstVdpMpegDec * mpeg_dec) +{ + if (mpeg_dec->device) { + if (mpeg_dec->decoder != VDP_INVALID_HANDLE) + mpeg_dec->device->vdp_decoder_destroy (mpeg_dec->decoder); + + g_object_unref (mpeg_dec->device); + } + + if (mpeg_dec->vdp_info.forward_reference != VDP_INVALID_HANDLE) + mpeg_dec->vdp_info.forward_reference = VDP_INVALID_HANDLE; + if (mpeg_dec->vdp_info.backward_reference != VDP_INVALID_HANDLE) + mpeg_dec->vdp_info.backward_reference = VDP_INVALID_HANDLE; + + gst_adapter_clear (mpeg_dec->adapter); +} + static GstFlowReturn gst_vdp_mpeg_dec_chain (GstPad * pad, GstBuffer * buffer) { @@ -1010,11 +1022,19 @@ gst_vdp_mpeg_dec_change_state (GstElement * element, GstStateChange transition) mpeg_dec = GST_VDP_MPEG_DEC (element); + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_vdp_mpeg_dec_start (mpeg_dec); + break; + default: + break; + } + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: - gst_vdp_mpeg_dec_reset (mpeg_dec); + gst_vdp_mpeg_dec_stop (mpeg_dec); break; default: break; @@ -1097,14 +1117,6 @@ gst_vdp_mpeg_dec_init (GstVdpMpegDec * mpeg_dec, GstVdpMpegDecClass * gclass) gst_element_add_pad (GST_ELEMENT (mpeg_dec), mpeg_dec->sink); mpeg_dec->adapter = gst_adapter_new (); - - mpeg_dec->device = NULL; - mpeg_dec->decoder = VDP_INVALID_HANDLE; - mpeg_dec->vdp_info.forward_reference = VDP_INVALID_HANDLE; - mpeg_dec->vdp_info.backward_reference = VDP_INVALID_HANDLE; - - gst_vdp_mpeg_dec_reset (mpeg_dec); - mpeg_dec->mutex = g_mutex_new (); } diff --git a/sys/vdpau/gstvdpvideoyuv.c b/sys/vdpau/gstvdpvideoyuv.c index 165f4fe..466424c 100644 --- a/sys/vdpau/gstvdpvideoyuv.c +++ b/sys/vdpau/gstvdpvideoyuv.c @@ -461,7 +461,6 @@ static void gst_vdp_video_yuv_class_init (GstVdpVideoYUVClass * klass) { GObjectClass *gobject_class; - GstElementClass *element_class; GstBaseTransformClass *trans_class; gobject_class = (GObjectClass *) klass; -- 2.7.4