Modified get_pad_format() API 74/53674/1 accepted/tizen/mobile/20151217.093653 accepted/tizen/tv/20151217.093627 accepted/tizen/wearable/20151217.093636 submit/tizen/20151217.073742
authorVyacheslav Valkovoy <v.valkovoy@samsung.com>
Tue, 8 Dec 2015 14:43:16 +0000 (16:43 +0200)
committerVyacheslav Valkovoy <v.valkovoy@samsung.com>
Tue, 8 Dec 2015 14:43:52 +0000 (16:43 +0200)
Change-Id: Ibb4cb777e1de1ccfb7417da4f1b2dfc193bd05f9
Signed-off-by: Vyacheslav Valkovoy <v.valkovoy@samsung.com>
include/media_streamer_gst.h
src/media_streamer.c
src/media_streamer_gst.c
src/media_streamer_node.c

index e8b9335..550649c 100644 (file)
@@ -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.
index b71ce1c..60dd209 100644 (file)
@@ -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)
index 1e75749..f35e038 100755 (executable)
@@ -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;
 }
index 032c29a..2f53094 100755 (executable)
@@ -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;