From: Sebastian Dröge Date: Tue, 12 Jul 2011 09:36:42 +0000 (+0200) Subject: omxvideodec: Make sink/src pad template caps configurable X-Git-Tag: 1.0.0~436 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a24cdd41bc7b3dbc2387196e4ba553305bc3a05f;p=platform%2Fupstream%2Fgst-omx.git omxvideodec: Make sink/src pad template caps configurable --- diff --git a/omx/gstomxh264dec.c b/omx/gstomxh264dec.c index 3ec2166..6272d43 100644 --- a/omx/gstomxh264dec.c +++ b/omx/gstomxh264dec.c @@ -50,32 +50,11 @@ enum GST_BOILERPLATE_FULL (GstOMXH264Dec, gst_omx_h264_dec, GstOMXVideoDec, GST_TYPE_OMX_VIDEO_DEC, DEBUG_INIT); -static GstStaticPadTemplate gst_omx_h264_dec_sink_template = -GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-h264, " - "parsed=(boolean) true, " - "alignment=(string)au, " "stream-format=(string) {avc, byte-stream}") - ); - -static GstStaticPadTemplate gst_omx_h264_dec_src_template = -GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) - ); - static void gst_omx_h264_dec_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_omx_h264_dec_src_template)); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_omx_h264_dec_sink_template)); - gst_element_class_set_details_simple (element_class, "OpenMAX H264 Video Decoder", "Codec/Decoder/Video", @@ -94,6 +73,11 @@ gst_omx_h264_dec_class_init (GstOMXH264DecClass * klass) videodec_class->is_format_change = GST_DEBUG_FUNCPTR (gst_omx_h264_dec_is_format_change); videodec_class->set_format = GST_DEBUG_FUNCPTR (gst_omx_h264_dec_set_format); + + videodec_class->default_sink_template_caps = "video/x-h264, " + "parsed=(boolean) true, " + "alignment=(string)au, " "stream-format=(string) avc"; + videodec_class->default_src_template_caps = GST_VIDEO_CAPS_YUV ("I420"); } static void diff --git a/omx/gstomxmpeg4videodec.c b/omx/gstomxmpeg4videodec.c index c956a8b..6ef81e9 100644 --- a/omx/gstomxmpeg4videodec.c +++ b/omx/gstomxmpeg4videodec.c @@ -50,34 +50,11 @@ enum GST_BOILERPLATE_FULL (GstOMXMPEG4VideoDec, gst_omx_mpeg4_video_dec, GstOMXVideoDec, GST_TYPE_OMX_VIDEO_DEC, DEBUG_INIT); -static GstStaticPadTemplate gst_omx_mpeg4_video_dec_sink_template = -GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/mpeg, " - "mpegversion=(int) 4, " - "systemstream=(boolean) false, " - "parsed=(boolean) true, " - "width=(int) [ 16, 4096 ], " "height=(int) [ 16, 4096 ]") - ); - -static GstStaticPadTemplate gst_omx_mpeg4_video_dec_src_template = -GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) - ); - static void gst_omx_mpeg4_video_dec_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_omx_mpeg4_video_dec_src_template)); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_omx_mpeg4_video_dec_sink_template)); - gst_element_class_set_details_simple (element_class, "OpenMAX MPEG4 Video Decoder", "Codec/Decoder/Video", @@ -97,6 +74,13 @@ gst_omx_mpeg4_video_dec_class_init (GstOMXMPEG4VideoDecClass * klass) GST_DEBUG_FUNCPTR (gst_omx_mpeg4_video_dec_is_format_change); videodec_class->set_format = GST_DEBUG_FUNCPTR (gst_omx_mpeg4_video_dec_set_format); + + videodec_class->default_sink_template_caps = "video/mpeg, " + "mpegversion=(int) 4, " + "systemstream=(boolean) false, " + "parsed=(boolean) true, " + "width=(int) [ 16, 4096 ], " "height=(int) [ 16, 4096 ]"; + videodec_class->default_src_template_caps = GST_VIDEO_CAPS_YUV ("I420"); } static void diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c index 0130608..f84a48f 100644 --- a/omx/gstomxvideodec.c +++ b/omx/gstomxvideodec.c @@ -77,12 +77,16 @@ GST_BOILERPLATE_FULL (GstOMXVideoDec, gst_omx_video_dec, GstBaseVideoDecoder, static void gst_omx_video_dec_base_init (gpointer g_class) { + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstOMXVideoDecClass *videodec_class = GST_OMX_VIDEO_DEC_CLASS (g_class); GKeyFile *config; const gchar *element_name; GError *err; gchar *core_name, *component_name; gint in_port_index, out_port_index; + gchar *template_caps; + GstPadTemplate *templ; + GstCaps *caps; element_name = g_type_get_qdata (G_TYPE_FROM_CLASS (g_class), @@ -124,6 +128,59 @@ gst_omx_video_dec_base_init (gpointer g_class) g_error_free (err); } videodec_class->out_port_index = out_port_index; + + /* Add pad templates */ + err = NULL; + if (!(template_caps = + g_key_file_get_string (config, element_name, "sink-template-caps", + &err))) { + GST_DEBUG + ("No sink template caps specified for element '%s', using default '%s'", + element_name, videodec_class->default_sink_template_caps); + caps = gst_caps_from_string (videodec_class->default_sink_template_caps); + g_assert (caps != NULL); + g_error_free (err); + } else { + caps = gst_caps_from_string (template_caps); + if (!caps) { + GST_DEBUG + ("Could not parse sink template caps '%s' for element '%s', using default '%s'", + template_caps, element_name, + videodec_class->default_sink_template_caps); + caps = gst_caps_from_string (videodec_class->default_sink_template_caps); + g_assert (caps != NULL); + } + } + templ = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps); + g_free (template_caps); + gst_element_class_add_pad_template (element_class, templ); + gst_object_unref (templ); + + err = NULL; + if (!(template_caps = + g_key_file_get_string (config, element_name, "src-template-caps", + &err))) { + GST_DEBUG + ("No src template caps specified for element '%s', using default '%s'", + element_name, videodec_class->default_src_template_caps); + caps = gst_caps_from_string (videodec_class->default_src_template_caps); + g_assert (caps != NULL); + g_error_free (err); + } else { + caps = gst_caps_from_string (template_caps); + if (!caps) { + GST_DEBUG + ("Could not parse src template caps '%s' for element '%s', using default '%s'", + template_caps, element_name, + videodec_class->default_src_template_caps); + caps = gst_caps_from_string (videodec_class->default_src_template_caps); + g_assert (caps != NULL); + } + } + templ = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, caps); + g_free (template_caps); + gst_element_class_add_pad_template (element_class, templ); + gst_object_unref (templ); } static void @@ -150,9 +207,6 @@ gst_omx_video_dec_class_init (GstOMXVideoDecClass * klass) GST_DEBUG_FUNCPTR (gst_omx_video_dec_handle_frame); base_video_decoder_class->finish = GST_DEBUG_FUNCPTR (gst_omx_video_dec_finish); - - klass->in_port_index = 0; - klass->out_port_index = 1; } static void @@ -177,7 +231,6 @@ gst_omx_video_dec_open (GstOMXVideoDec * self) GST_CLOCK_TIME_NONE) != OMX_StateLoaded) return FALSE; - /* FIXME: Always 0 == input, 1 == output? Make configurable? Let subclass decide? */ self->in_port = gst_omx_component_add_port (self->component, klass->in_port_index); self->out_port = diff --git a/omx/gstomxvideodec.h b/omx/gstomxvideodec.h index fb7ea8a..53d5b70 100644 --- a/omx/gstomxvideodec.h +++ b/omx/gstomxvideodec.h @@ -63,6 +63,9 @@ struct _GstOMXVideoDecClass const gchar *core_name; const gchar *component_name; + + const gchar *default_src_template_caps; + const gchar *default_sink_template_caps; guint32 in_port_index, out_port_index;