mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-11 18:05:37 +00:00
vdpau: make the decoder clean up after itself
This commit is contained in:
parent
21d7740236
commit
6fa5b4ff14
2 changed files with 32 additions and 2 deletions
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue