From 378a8d94dcfd0d1e9b19890a3c87622846d822d8 Mon Sep 17 00:00:00 2001 From: Julien MOUTTE Date: Mon, 30 May 2011 08:43:40 +0200 Subject: [PATCH] dshowdecwrapper: Fix element registration using data in the type instead of a global --- sys/dshowdecwrapper/gstdshowaudiodec.cpp | 30 ++++++++++++++--------- sys/dshowdecwrapper/gstdshowutil.h | 4 +++ sys/dshowdecwrapper/gstdshowvideodec.cpp | 31 +++++++++++++++--------- 3 files changed, 42 insertions(+), 23 deletions(-) diff --git a/sys/dshowdecwrapper/gstdshowaudiodec.cpp b/sys/dshowdecwrapper/gstdshowaudiodec.cpp index 1f4bd989a6..b4ead24219 100644 --- a/sys/dshowdecwrapper/gstdshowaudiodec.cpp +++ b/sys/dshowdecwrapper/gstdshowaudiodec.cpp @@ -1,6 +1,6 @@ /* * GStreamer DirectShow codecs wrapper - * Copyright <2006, 2007, 2008> Fluendo + * Copyright <2006, 2007, 2008, 2009, 2010> Fluendo * Copyright <2006, 2007, 2008> Pioneers of the Inevitable * Copyright <2007,2008> Sebastien Moutte * @@ -58,8 +58,6 @@ GST_DEBUG_CATEGORY_STATIC (dshowaudiodec_debug); GST_BOILERPLATE (GstDshowAudioDec, gst_dshowaudiodec, GstElement, GST_TYPE_ELEMENT); -static const AudioCodecEntry *tmp; - static void gst_dshowaudiodec_dispose (GObject * object); static GstStateChangeReturn gst_dshowaudiodec_change_state (GstElement * element, GstStateChange transition); @@ -314,15 +312,25 @@ gst_dshowaudiodec_base_init (gpointer klass) GstPadTemplate *src, *sink; GstCaps *srccaps, *sinkcaps; GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - char *description; + GstElementDetails details; + const AudioCodecEntry *tmp; + gpointer qdata; - audiodec_class->entry = tmp; - description = g_strdup_printf ("DirectShow %s Decoder Wrapper", + qdata = g_type_get_qdata (G_OBJECT_CLASS_TYPE (klass), DSHOW_CODEC_QDATA); + + /* element details */ + tmp = audiodec_class->entry = (AudioCodecEntry *) qdata; + + details.longname = g_strdup_printf ("DirectShow %s Decoder Wrapper", tmp->element_longname); - gst_element_class_set_details_simple (element_class, description, - "Codec/Decoder/Audio", description, - "Sebastien Moutte "); - g_free (description); + details.klass = g_strdup ("Codec/Decoder/Audio"); + details.description = g_strdup_printf ("DirectShow %s Decoder Wrapper", + tmp->element_longname); + details.author = "Sebastien Moutte "; + gst_element_class_set_details (element_class, &details); + g_free (details.longname); + g_free (details.klass); + g_free (details.description); sinkcaps = gst_caps_from_string (tmp->sinkcaps); @@ -1103,9 +1111,9 @@ dshow_adec_register (GstPlugin * plugin) { GST_DEBUG ("Registering %s", audio_dec_codecs[i].element_name); - tmp = &audio_dec_codecs[i]; type = g_type_register_static (GST_TYPE_ELEMENT, audio_dec_codecs[i].element_name, &info, (GTypeFlags)0); + g_type_set_qdata (type, DSHOW_CODEC_QDATA, (gpointer) (audio_dec_codecs + i)); if (!gst_element_register (plugin, audio_dec_codecs[i].element_name, GST_RANK_SECONDARY, type)) { return FALSE; diff --git a/sys/dshowdecwrapper/gstdshowutil.h b/sys/dshowdecwrapper/gstdshowutil.h index 80299fb275..3cea05e1ff 100644 --- a/sys/dshowdecwrapper/gstdshowutil.h +++ b/sys/dshowdecwrapper/gstdshowutil.h @@ -1,4 +1,5 @@ /* GStreamer + * Copyright <2006, 2007, 2008, 2009, 2010> Fluendo * Copyright (C) 2007 Sebastien Moutte * * gstdshow.h: @@ -45,4 +46,7 @@ IBaseFilter * gst_dshow_find_filter(CLSID input_majortype, CLSID input_subtype, CLSID output_majortype, CLSID output_subtype, PreferredFilter *preferred_filters); + +#define DSHOW_CODEC_QDATA g_quark_from_string ("dshow-codec") + #endif /* _GST_DSHOW_UTIL_H_ */ diff --git a/sys/dshowdecwrapper/gstdshowvideodec.cpp b/sys/dshowdecwrapper/gstdshowvideodec.cpp index 6be02fe45d..0dcc3fa7f6 100644 --- a/sys/dshowdecwrapper/gstdshowvideodec.cpp +++ b/sys/dshowdecwrapper/gstdshowvideodec.cpp @@ -1,6 +1,6 @@ /* * GStreamer DirectShow codecs wrapper - * Copyright <2006, 2007, 2008> Fluendo + * Copyright <2006, 2007, 2008, 2009, 2010> Fluendo * Copyright <2006, 2007, 2008> Pioneers of the Inevitable * Copyright <2007,2008> Sebastien Moutte * @@ -58,7 +58,6 @@ GST_DEBUG_CATEGORY_STATIC (dshowvideodec_debug); GST_BOILERPLATE (GstDshowVideoDec, gst_dshowvideodec, GstElement, GST_TYPE_ELEMENT); -static const VideoCodecEntry *tmp; static void gst_dshowvideodec_dispose (GObject * object); static GstStateChangeReturn gst_dshowvideodec_change_state @@ -369,16 +368,25 @@ gst_dshowvideodec_base_init (gpointer klass) GstPadTemplate *src, *sink; GstCaps *srccaps, *sinkcaps; GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - char *description; + GstElementDetails details; + const VideoCodecEntry *tmp; + gpointer qdata; - videodec_class->entry = tmp; + qdata = g_type_get_qdata (G_OBJECT_CLASS_TYPE (klass), DSHOW_CODEC_QDATA); - description = g_strdup_printf ("DirectShow %s Decoder Wrapper", + /* element details */ + tmp = videodec_class->entry = (VideoCodecEntry *) qdata; + + details.longname = g_strdup_printf ("DirectShow %s Decoder Wrapper", tmp->element_longname); - gst_element_class_set_details_simple (element_class, description, - "Codec/Decoder/Video", description, - "Sebastien Moutte "); - g_free (description); + details.klass = g_strdup ("Codec/Decoder/Video"); + details.description = g_strdup_printf ("DirectShow %s Decoder Wrapper", + tmp->element_longname); + details.author = "Sebastien Moutte "; + gst_element_class_set_details (element_class, &details); + g_free (details.longname); + g_free (details.klass); + g_free (details.description); sinkcaps = gst_caps_from_string (tmp->sinkcaps); gst_caps_set_simple (sinkcaps, @@ -1193,10 +1201,9 @@ dshow_vdec_register (GstPlugin * plugin) GST_DEBUG ("Registering %s", video_dec_codecs[i].element_name); - tmp = &video_dec_codecs[i]; - type = - g_type_register_static (GST_TYPE_ELEMENT, + type = g_type_register_static (GST_TYPE_ELEMENT, video_dec_codecs[i].element_name, &info, (GTypeFlags)0); + g_type_set_qdata (type, DSHOW_CODEC_QDATA, (gpointer) (video_dec_codecs + i)); if (!gst_element_register (plugin, video_dec_codecs[i].element_name, GST_RANK_PRIMARY, type)) { return FALSE;