From 9cdf4f698f81d42be7dc9ffe0ec2ad380eb0abeb Mon Sep 17 00:00:00 2001 From: Vyacheslav Valkovoy Date: Tue, 8 Dec 2015 16:43:16 +0200 Subject: [PATCH] Modified get_pad_format() API Change-Id: Ibb4cb777e1de1ccfb7417da4f1b2dfc193bd05f9 Signed-off-by: Vyacheslav Valkovoy --- include/media_streamer_gst.h | 2 +- src/media_streamer.c | 8 ++---- src/media_streamer_gst.c | 59 +++++++++++++++++++++++++++++--------------- src/media_streamer_node.c | 4 +++ 4 files changed, 46 insertions(+), 27 deletions(-) diff --git a/include/media_streamer_gst.h b/include/media_streamer_gst.h index e8b9335..550649c 100644 --- a/include/media_streamer_gst.h +++ b/include/media_streamer_gst.h @@ -193,7 +193,7 @@ int __ms_element_pad_names(GstElement *gst_element, GstPadDirection pad_type, ch * * @since_tizen 3.0 */ -media_format_h __ms_element_get_pad_fmt(GstElement *gst_element, const char *pad_name); +int __ms_element_get_pad_fmt(GstElement * gst_element, const char *pad_name, media_format_h *fmt); /** * @brief Sets mediaformat into GstElement. diff --git a/src/media_streamer.c b/src/media_streamer.c index b71ce1c..60dd209 100644 --- a/src/media_streamer.c +++ b/src/media_streamer.c @@ -614,18 +614,14 @@ int media_streamer_node_set_pad_format(media_streamer_node_h node, const char *p return __ms_element_set_fmt(node, pad_name, fmt); } -int media_streamer_node_get_pad_format(media_streamer_node_h node, const char *pad_name, media_format_h * fmt) +int media_streamer_node_get_pad_format(media_streamer_node_h node, const char *pad_name, media_format_h *fmt) { media_streamer_node_s *ms_node = (media_streamer_node_s *) node; ms_retvm_if(ms_node == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL"); ms_retvm_if(pad_name == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Empty pad name"); ms_retvm_if(fmt == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Format is NULL"); - *fmt = __ms_element_get_pad_fmt(ms_node->gst_element, pad_name); - - ms_retvm_if(*fmt == NULL, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Error while getting node fmt"); - - return MEDIA_STREAMER_ERROR_NONE; + return __ms_element_get_pad_fmt(ms_node->gst_element, pad_name, fmt); } int media_streamer_node_get_pad_name(media_streamer_node_h node, char ***src_pad_name, int *src_pad_num, char ***sink_pad_name, int *sink_pad_num) diff --git a/src/media_streamer_gst.c b/src/media_streamer_gst.c index 1e75749..f35e038 100755 --- a/src/media_streamer_gst.c +++ b/src/media_streamer_gst.c @@ -1619,33 +1619,50 @@ int __ms_element_pad_names(GstElement * gst_element, GstPadDirection pad_type, c return ret; } -media_format_h __ms_element_get_pad_fmt(GstElement * gst_element, const char *pad_name) +int __ms_element_get_pad_fmt(GstElement * gst_element, const char *pad_name, media_format_h *fmt) { - media_format_h fmt; - GstCaps *caps = NULL; + GstCaps *allowed_caps = NULL; + GstCaps *property_caps = NULL; + GValue value = G_VALUE_INIT; - GstPad *pad = gst_element_get_static_pad(gst_element, pad_name); - gchar *element_name = gst_element_get_name(gst_element); + ms_retvm_if(gst_element == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Element handle is NULL"); - if (pad == NULL) { - ms_error("Fail to get pad [%s] from element [%s].", pad_name, element_name); - MS_SAFE_FREE(element_name); - return NULL; + GstPad *pad = gst_element_get_static_pad(gst_element, pad_name); + ms_retvm_if(pad == NULL, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Fail to get pad [%s] from element [%s].", pad_name, GST_ELEMENT_NAME(gst_element)); + + GParamSpec *param = g_object_class_find_property(G_OBJECT_GET_CLASS(gst_element), "caps"); + if (param) { + g_value_init(&value, param->value_type); + if (param->flags & G_PARAM_READWRITE) { + g_object_get_property(G_OBJECT(gst_element), "caps", &value); + property_caps = gst_value_get_caps(&value); + } + g_value_unset(&value); } - caps = gst_pad_get_allowed_caps(pad); - if (caps == NULL) { - ms_error("Fail to get caps from element [%s] and pad [%s].", element_name, pad_name); - MS_SAFE_FREE(element_name); - MS_SAFE_UNREF(pad); - return NULL; + int ret = MEDIA_STREAMER_ERROR_NONE; + allowed_caps = gst_pad_get_allowed_caps(pad); + if (allowed_caps) { + if (gst_caps_is_empty(allowed_caps) || gst_caps_is_any(allowed_caps)) { + if (property_caps) + *fmt = __ms_create_fmt_from_caps(property_caps); + else + ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; + } else { + *fmt = __ms_create_fmt_from_caps(allowed_caps); + } + } else { + if (property_caps) + *fmt = __ms_create_fmt_from_caps(property_caps); + else + ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; } - fmt = __ms_create_fmt_from_caps(caps); + if (allowed_caps) + gst_caps_unref(allowed_caps); - MS_SAFE_FREE(element_name); MS_SAFE_UNREF(pad); - return fmt; + return ret; } int __ms_element_set_fmt(media_streamer_node_s * node, const char *pad_name, media_format_h fmt) @@ -1773,6 +1790,7 @@ int __ms_element_pull_packet(GstElement * sink_element, media_packet_h * packet) GstSample *sample = NULL; GstMapInfo map; guint8 *buffer_res = NULL; + int ret = MEDIA_STREAMER_ERROR_NONE; ms_retvm_if(sink_element == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL"); ms_retvm_if(packet == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL"); @@ -1784,7 +1802,8 @@ int __ms_element_pull_packet(GstElement * sink_element, media_packet_h * packet) buffer = gst_sample_get_buffer(sample); gst_buffer_map(buffer, &map, GST_MAP_READ); - media_format_h fmt = __ms_element_get_pad_fmt(sink_element, "sink"); + media_format_h fmt = NULL; + ret = __ms_element_get_pad_fmt(sink_element, "sink", &fmt); if (!fmt) { ms_error("Error while getting media format from sink pad"); @@ -1805,5 +1824,5 @@ int __ms_element_pull_packet(GstElement * sink_element, media_packet_h * packet) gst_buffer_unmap(buffer, &map); gst_sample_unref(sample); - return MEDIA_STREAMER_ERROR_NONE; + return ret; } diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 032c29a..2f53094 100755 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -373,6 +373,10 @@ int __ms_sink_node_create(media_streamer_node_s * node) plugin_name = __ms_ini_get_string(dict, "sinks:video_sink", DEFAULT_VIDEO_SINK); node->gst_element = __ms_element_create(plugin_name, NULL); break; + case MEDIA_STREAMER_NODE_SINK_TYPE_EVAS: + plugin_name = __ms_ini_get_string(dict, "sinks:evas_sink", DEFAULT_EVAS_SINK); + node->gst_element = __ms_element_create(plugin_name, NULL); + break; case MEDIA_STREAMER_NODE_SINK_TYPE_FAKE: node->gst_element = __ms_element_create(DEFAULT_FAKE_SINK, NULL); break; -- 2.7.4