vdpau: make the decoder clean up after itself

This commit is contained in:
Carl-Anton Ingmarsson 2009-04-01 21:40:14 +02:00 committed by Jan Schmidt
parent 21d7740236
commit 6fa5b4ff14
2 changed files with 32 additions and 2 deletions

View file

@ -57,6 +57,7 @@ static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
GST_BOILERPLATE_FULL (GstVdpauDecoder, gst_vdpaudecoder, GstElement,
GST_TYPE_ELEMENT, DEBUG_INIT);
static void gst_vdpau_decoder_finalize (GObject * object);
static void gst_vdpaudecoder_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_vdpaudecoder_get_property (GObject * object, guint prop_id,
@ -453,6 +454,7 @@ gst_vdpaudecoder_class_init (GstVdpauDecoderClass * klass)
gobject_class = (GObjectClass *) klass;
gstelement_class = (GstElementClass *) klass;
gobject_class->finalize = gst_vdpau_decoder_finalize;
gobject_class->set_property = gst_vdpaudecoder_set_property;
gobject_class->get_property = gst_vdpaudecoder_get_property;
@ -494,6 +496,19 @@ gst_vdpaudecoder_init (GstVdpauDecoder * dec, GstVdpauDecoderClass * klass)
gst_pad_set_active (dec->sink, TRUE);
}
static void
gst_vdpau_decoder_finalize (GObject * object)
{
GstVdpauDecoder *dec = (GstVdpauDecoder *) object;
if (dec->src_caps)
g_object_unref (dec->src_caps);
if (dec->device)
g_object_unref (dec->device);
g_free (dec->display_name);
}
static void
gst_vdpaudecoder_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)

View file

@ -71,6 +71,7 @@ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
GST_BOILERPLATE (GstVdpauMpegDecoder, gst_vdpau_mpeg_decoder, GstVdpauDecoder,
GST_TYPE_VDPAU_DECODER);
static void gst_vdpau_mpeg_decoder_finalize (GObject * object);
static void gst_vdpau_mpeg_decoder_set_property (GObject * object,
guint prop_id, const GValue * value, GParamSpec * pspec);
static void gst_vdpau_mpeg_decoder_get_property (GObject * object,
@ -227,8 +228,8 @@ gst_vdpau_mpeg_decoder_parse_picture (GstVdpauMpegDecoder * mpeg_dec,
if (pic_hdr.pic_type == I_FRAME &&
mpeg_dec->vdp_info.forward_reference != VDP_INVALID_HANDLE) {
dec->device->vdp_video_surface_destroy (mpeg_dec->
vdp_info.forward_reference);
dec->device->vdp_video_surface_destroy (mpeg_dec->vdp_info.
forward_reference);
mpeg_dec->vdp_info.forward_reference = VDP_INVALID_HANDLE;
}
@ -374,6 +375,7 @@ gst_vdpau_mpeg_decoder_class_init (GstVdpauMpegDecoderClass * klass)
gstelement_class = (GstElementClass *) klass;
vdpaudec_class = (GstVdpauDecoderClass *) klass;
gobject_class->finalize = gst_vdpau_mpeg_decoder_finalize;
gobject_class->set_property = gst_vdpau_mpeg_decoder_set_property;
gobject_class->get_property = gst_vdpau_mpeg_decoder_get_property;
@ -414,6 +416,19 @@ gst_vdpau_mpeg_decoder_init (GstVdpauMpegDecoder * mpeg_dec,
gst_pad_set_chain_function (dec->sink, gst_vdpau_mpeg_decoder_chain);
}
static void
gst_vdpau_mpeg_decoder_finalize (GObject * object)
{
GstVdpauMpegDecoder *mpeg_dec = (GstVdpauMpegDecoder *) object;
#if 0 /* FIXME: can't free the decoder since the device already has been freed */
if (mpeg_dec->decoder != VDP_INVALID_HANDLE)
dec->device->vdp_decoder_destroy (mpeg_dec->decoder);
#endif
g_object_unref (mpeg_dec->adapter);
}
static void
gst_vdpau_mpeg_decoder_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)