Modifying set/get pad_format() 23/62723/2
authorVyacheslav Valkovoy <v.valkovoy@samsung.com>
Thu, 17 Mar 2016 16:28:35 +0000 (18:28 +0200)
committerAndrey Shelest <a.shelest@samsung.com>
Fri, 18 Mar 2016 12:35:19 +0000 (14:35 +0200)
Change-Id: I5f9b4cd759496ab7a98bdd5f9b760cc1fcbe0556
Signed-off-by: Vyacheslav Valkovoy <v.valkovoy@samsung.com>
include/media_streamer_util.h
src/media_streamer.c
src/media_streamer_gst.c
src/media_streamer_node.c
src/media_streamer_util.c

index 99010a9949f93a6b7f44470fc36fc06d0b45f393..9644286788eb170004d8c4e3eb5e688a3c482c00 100644 (file)
@@ -113,6 +113,16 @@ typedef struct __media_streamer_ini {
 
 } media_streamer_ini_t;
 
+/**
+ * @brief Media Streamer format type handle.
+ *
+ * @since_tizen 3.0
+ */
+typedef struct {
+       media_format_mimetype_e format;
+       char *format_name;
+} format_s;
+
 /**
  * @brief Media Streamer signal structure.
  *
@@ -264,6 +274,13 @@ gboolean __ms_destroy_ini_dictionary(dictionary *dict);
  */
 gchar *__ms_ini_get_string(dictionary *dict, const char *ini_path, char *default_str);
 
+/**
+ * @brief Converts Media Format mime type into Caps media format string.
+ *
+ * @since_tizen 3.0
+ */
+const gchar *__ms_convert_mime_to_string_format(media_format_mimetype_e mime);
+
 /**
  * @brief Converts Media Format mime type into Caps media format string.
  *
@@ -283,7 +300,7 @@ const gchar *__ms_convert_mime_to_rtp_format(media_format_mimetype_e mime);
  *
  * @since_tizen 3.0
  */
-media_format_mimetype_e __ms_convert_string_format_to_mime(const char *format_type);
+media_format_mimetype_e __ms_convert_string_format_to_media_format(const char *format_type);
 
 /**
  * @brief Creates Media streamer signal structure,
index da8a1e4a61a35009cd4765644b4d6bf931cb398c..1110273922973d11fc0c86af1d25b92b4cdf6fdc 100644 (file)
@@ -589,8 +589,24 @@ int media_streamer_node_link(media_streamer_node_h src_node, const char *src_pad
        gchar *src_element_name = gst_element_get_name(ms_src_node->gst_element);
        gchar *sink_element_name = gst_element_get_name(ms_dest_node->gst_element);
 
-       gboolean link_ret = gst_element_link_pads(ms_src_node->gst_element, src_pad_name,
-                                                                                         ms_dest_node->gst_element, sink_pad_name);
+       GstCaps *src_pad_caps = NULL;
+       GstCaps *sink_pad_caps = NULL;
+       GValue *val = NULL;
+
+       val = (GValue *) g_object_get_data(G_OBJECT(ms_src_node->gst_element), src_pad_name);
+       if (val) {
+               src_pad_caps = GST_CAPS(gst_value_get_caps(val));
+               ms_info("Pad [%s] of node [%s] was set with caps [%s]\n", src_pad_name, ms_src_node->name, gst_caps_to_string(src_pad_caps));
+       }
+
+       val = (GValue *) g_object_get_data(G_OBJECT(ms_dest_node->gst_element), sink_pad_name);
+       if (val) {
+               sink_pad_caps = GST_CAPS(gst_value_get_caps(val));
+               ms_info("Pad [%s] of node [%s] was set with caps [%s]\n", src_pad_name, ms_src_node->name, gst_caps_to_string(sink_pad_caps));
+       }
+
+       gboolean link_ret = gst_element_link_pads_filtered(ms_src_node->gst_element, src_pad_name,
+                                                                                         ms_dest_node->gst_element, sink_pad_name, src_pad_caps ? src_pad_caps : sink_pad_caps);
        if (!link_ret) {
                ms_error("Can not link [%s]->%s pad to [%s]->%s pad, ret code [%d] ", ms_src_node->name, src_pad_name, ms_dest_node->name, sink_pad_name, link_ret);
                ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION;
index deef712a8b7ebdec9fa39929e41fac2f3e908303..900bd1d59a7f5dd4d84f577445869adaf3a282c5 100755 (executable)
@@ -83,37 +83,6 @@ static gboolean __ms_add_ghostpad(GstElement *gst_element, const char *pad_name,
        return ret;
 }
 
-static GObject *__ms_get_property_owner(GstElement *element, const gchar *key, GValue *value)
-{
-       GParamSpec *param = NULL;
-       GObject *obj = NULL;
-
-       if (GST_IS_CHILD_PROXY(element)) {
-               int i;
-               const int childs_count = gst_child_proxy_get_children_count(GST_CHILD_PROXY(element));
-
-               for (i = 0; (i < childs_count) && (param == NULL); ++i) {
-                       obj = gst_child_proxy_get_child_by_index(GST_CHILD_PROXY(element), i);
-                       param = g_object_class_find_property(G_OBJECT_GET_CLASS(obj), key);
-               }
-               ms_retvm_if(param == NULL || obj == NULL, NULL, "Error: Bin object does not have property [%s].", key);
-       } else {
-               obj = G_OBJECT(element);
-               param = g_object_class_find_property(G_OBJECT_GET_CLASS(obj), key);
-       }
-
-       g_value_init(value, param->value_type);
-
-       if (!(param->flags & G_PARAM_WRITABLE)) {
-               /* Skip properties which user can not change. */
-               ms_error("Error: node param [%s] is not writable!", key);
-               return NULL;
-       }
-       ms_info("%-20s: %s\n", g_param_spec_get_name(param), g_param_spec_get_blurb(param));
-
-       return obj;
-}
-
 /* This unlinks from its peer and ghostpads on its way */
 static gboolean __ms_pad_peer_unlink(GstPad *pad)
 {
@@ -1452,43 +1421,33 @@ int __ms_pipeline_create(media_streamer_s *ms_streamer)
 static GstCaps *__ms_create_caps_from_fmt(media_format_h fmt)
 {
        GstCaps *caps = NULL;
+       gchar *caps_name = NULL;
        media_format_mimetype_e mime;
-       gchar *format_name = NULL;
-       int width;
-       int height;
-       int avg_bps;
-       int max_bps;
-       int channel;
-       int samplerate;
-       int bit;
-
-       if (media_format_get_video_info(fmt, &mime, &width, &height, &avg_bps, &max_bps) == MEDIA_PACKET_ERROR_NONE) {
-
-               ms_info("Creating video Caps from media format [width=%d, height=%d, bps=%d, mime=%d]", width, height, avg_bps, mime);
-
-               if (mime & MEDIA_FORMAT_RAW) {
-                       format_name = g_strdup(__ms_convert_mime_to_string(mime));
-                       caps = gst_caps_new_simple("video/x-raw", "framerate", GST_TYPE_FRACTION, max_bps, avg_bps, "format", G_TYPE_STRING, format_name, "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL);
-               } else {
-                       /*mime & MEDIA_FORMAT_ENCODED */
-                       format_name = g_strdup_printf("video/x-%s", __ms_convert_mime_to_string(mime));
-                       caps = gst_caps_new_simple(format_name, "framerate", GST_TYPE_FRACTION, max_bps, avg_bps, "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL);
-               }
-
-       } else if (media_format_get_audio_info(fmt, &mime, &channel, &samplerate, &bit, &avg_bps) == MEDIA_PACKET_ERROR_NONE) {
-               ms_info("Creating audio Caps from media format [channel=%d, samplerate=%d, bit=%d, avg_bps=%d, mime=%d]", channel, samplerate, bit, avg_bps, mime);
-
-               if (mime & MEDIA_FORMAT_RAW) {
-                       format_name = g_strdup(__ms_convert_mime_to_string(mime));
-                       caps = gst_caps_new_simple("audio/x-raw", "channels", G_TYPE_INT, channel, "format", G_TYPE_STRING, format_name, "rate", G_TYPE_INT, samplerate, NULL);
-               } else {
-                       ms_error("Encoded audio formats does not supported yet.");
-               }
-       } else {
-               ms_error("Failed getting media info from fmt.");
-       }
-       MS_SAFE_GFREE(format_name);
-
+       int width, height, avg_bps, max_bps, channel, samplerate, bit;
+
+       if (!media_format_get_audio_info(fmt, &mime, &channel, &samplerate, &bit, &avg_bps)) {
+               if (MEDIA_FORMAT_RAW == (mime & MEDIA_FORMAT_RAW))
+                       caps = gst_caps_new_simple("audio/x-raw", "channels", G_TYPE_INT, channel, "format",
+                                                               G_TYPE_STRING, __ms_convert_mime_to_string_format(mime), "rate", G_TYPE_INT, samplerate, NULL);
+               else if (MEDIA_FORMAT_ENCODED == (mime & MEDIA_FORMAT_ENCODED))
+                       caps = gst_caps_new_simple(__ms_convert_mime_to_string_format(mime), "channels",G_TYPE_INT, channel, "rate", G_TYPE_INT, samplerate, NULL);
+               caps_name = gst_caps_to_string(caps);
+               ms_info("Creating Audio Caps from media format [%s]", caps_name);
+
+       } else if (!media_format_get_video_info(fmt, &mime, &width, &height, &avg_bps, &max_bps)) {
+               if (MEDIA_FORMAT_RAW == (mime & MEDIA_FORMAT_RAW))
+                       caps = gst_caps_new_simple("video/x-raw", "framerate", GST_TYPE_FRACTION, max_bps,
+                                       avg_bps, "format", G_TYPE_STRING, __ms_convert_mime_to_string_format(mime), "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL);
+               else if (MEDIA_FORMAT_ENCODED == (mime & MEDIA_FORMAT_ENCODED))
+                       caps = gst_caps_new_simple(__ms_convert_mime_to_string_format(mime), "framerate", GST_TYPE_FRACTION, max_bps,
+                                                       avg_bps, "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL);
+               caps_name = gst_caps_to_string(caps);
+               ms_info("Creating Video Caps from media format [%s]", caps_name);
+
+       } else
+               ms_error("Error getting media format information");
+
+       MS_SAFE_GFREE(caps_name);
        return caps;
 }
 
@@ -1524,14 +1483,14 @@ static media_format_h __ms_create_fmt_from_caps(GstCaps *caps)
                gst_structure_get_fraction(pad_struct, "framerate", &max_bps, &avg_bps);
                gst_structure_get_int(pad_struct, "height", &height);
 
-               media_format_set_video_mime(fmt, __ms_convert_string_format_to_mime(pad_format));
+               media_format_set_video_mime(fmt, __ms_convert_string_format_to_media_format(pad_format));
                media_format_set_video_width(fmt, width);
                media_format_set_video_height(fmt, height);
                media_format_set_video_avg_bps(fmt, avg_bps);
                media_format_set_video_max_bps(fmt, max_bps);
        } else if (MS_ELEMENT_IS_AUDIO(pad_type)) {
                int channels, bps;
-               media_format_set_audio_mime(fmt, __ms_convert_string_format_to_mime(pad_format));
+               media_format_set_audio_mime(fmt, __ms_convert_string_format_to_media_format(pad_format));
                gst_structure_get_int(pad_struct, "channels", &channels);
                media_format_set_audio_channel(fmt, channels);
                gst_structure_get_int(pad_struct, "rate", &bps);
@@ -1590,38 +1549,33 @@ int __ms_element_pad_names(GstElement *gst_element, GstPadDirection pad_type, ch
 int __ms_element_get_pad_fmt(GstElement *gst_element, const char *pad_name, media_format_h *fmt)
 {
        GstCaps *allowed_caps = NULL;
-       GstCaps *property_caps = NULL;
-       GValue value = G_VALUE_INIT;
+       GstCaps *format_caps = NULL;
 
        ms_retvm_if(gst_element == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Element handle is 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_CAPS(gst_value_get_caps(&value));
-               }
-               g_value_unset(&value);
-       }
+       GValue *value = (GValue *) g_object_get_data(G_OBJECT(gst_element), pad_name);
+       if (value)
+               format_caps = GST_CAPS(gst_value_get_caps(value));
+       else
+               ms_info(" No any format is set for pad [%s]", pad_name);
 
        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);
+                       if (format_caps)
+                               *fmt = __ms_create_fmt_from_caps(format_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);
+               if (format_caps)
+                       *fmt = __ms_create_fmt_from_caps(format_caps);
                else
                        ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION;
        }
@@ -1635,19 +1589,31 @@ int __ms_element_get_pad_fmt(GstElement *gst_element, const char *pad_name, medi
 
 int __ms_element_set_fmt(media_streamer_node_s *node, const char *pad_name, media_format_h fmt)
 {
-       ms_retvm_if(!node || !pad_name || !fmt,  MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+       ms_retvm_if(!node || !pad_name || !fmt, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+       gboolean can_accept = FALSE;
 
-       GValue value = G_VALUE_INIT;
-       GObject *obj = __ms_get_property_owner(node->gst_element, "caps", &value);
-       ms_retvm_if(!obj,  MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Can't find object");
+       GstCaps *fmt_caps = __ms_create_caps_from_fmt(fmt);
+       ms_retvm_if(!fmt_caps, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Can't convert fmt into Caps");
 
-       GstCaps *caps = __ms_create_caps_from_fmt(fmt);
-       ms_retvm_if(!caps,  MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Can't convert fmt into Caps");
+       GstElementFactory *factory = gst_element_get_factory(node->gst_element);
+       GstPad *node_pad = gst_element_get_static_pad(node->gst_element, pad_name);
+
+       if (GST_PAD_IS_SRC(node_pad))
+               can_accept  = gst_element_factory_can_src_any_caps(factory, fmt_caps);
+       else if (GST_PAD_IS_SINK(node_pad))
+               can_accept  = gst_element_factory_can_sink_any_caps(factory, fmt_caps);
+       else
+               ms_error(" Node [%s] doesn`t have valid pad [%s]", node->name, pad_name);
 
-       gst_value_set_caps(&value, caps);
-       g_object_set_property(obj, "caps", &value);
-       g_value_unset(&value);
-       gst_caps_unref(caps);
+       if (!can_accept) {
+               if (fmt_caps)
+                       gst_caps_unref(fmt_caps);
+               ms_error("Node`s pad [%s] can`t be set with the given format", pad_name);
+               return MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+       } else {
+               MS_SET_INT_CAPS_PARAM(node->gst_element, pad_name, fmt_caps);
+               ms_info("Pad [%s] of node [%s] was set with given format", pad_name, node->name);
+       }
 
        return MEDIA_STREAMER_ERROR_NONE;
 }
index 29e6d7f455057a797fbf3f7bae22f003abc58298..222780ef0b52f7e96c6a679f73cdb719bde4a29c 100755 (executable)
@@ -468,6 +468,10 @@ static void _src_node_prepare(const GValue *item, gpointer user_data)
        media_streamer_s *ms_streamer = (media_streamer_s *) user_data;
        GstElement *src_element = GST_ELEMENT(g_value_get_object(item));
 
+       media_streamer_node_s *found_node = (media_streamer_node_s *) g_hash_table_lookup(ms_streamer->nodes_table, GST_ELEMENT_NAME(src_element));
+       if (!found_node)
+               return;
+
        ms_retm_if(!ms_streamer || !src_element, "Handle is NULL");
        ms_debug("Autoplug: found src element [%s]", GST_ELEMENT_NAME(src_element));
 
@@ -489,7 +493,7 @@ static void _src_node_prepare(const GValue *item, gpointer user_data)
                if (MS_ELEMENT_IS_VIDEO(new_pad_type) || MS_ELEMENT_IS_IMAGE(new_pad_type)) {
                        found_element = __ms_combine_next_element(src_element, src_pad, ms_streamer->topology_bin, NULL, NULL, DEFAULT_FILTER);
                        GstCaps *videoCaps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_CAMERA_FORMAT);
-                       g_object_set(G_OBJECT(found_element), "caps", videoCaps,NULL);
+                       g_object_set(G_OBJECT(found_element), "caps", videoCaps, NULL);
                        gst_caps_unref(videoCaps);
                        found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->topology_bin, MEDIA_STREAMER_BIN_KLASS, "video_encoder", NULL);
                        found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->topology_bin, MEDIA_STREAMER_PAYLOADER_KLASS, NULL, NULL);
index 98cab1da9736624c469ec7251d2e221bebf395d2..8ed41a3ae88de6978f4c47bf5221931aebb24b02 100644 (file)
 #include <media_streamer.h>
 #include <media_streamer_util.h>
 
+format_s format_table[] = {
+       /* Audio - ENCODED */
+       {MEDIA_FORMAT_L16, "audio/x-raw"},
+       {MEDIA_FORMAT_ALAW, "audio/x-alaw"},
+       {MEDIA_FORMAT_ULAW, "audio/x-mulaw"},
+       {MEDIA_FORMAT_AMR, "audio/AMR"},
+       {MEDIA_FORMAT_AMR_NB, "audio/AMR"},
+       {MEDIA_FORMAT_AMR_WB, "audio/AMR-WB"},
+       {MEDIA_FORMAT_G729, "audio/G729"},
+       {MEDIA_FORMAT_AAC, "audio/mpeg"},
+       {MEDIA_FORMAT_AAC_LC, "audio/mpeg"},
+       {MEDIA_FORMAT_AAC_HE, "audio/mpeg"},
+       {MEDIA_FORMAT_AAC_HE_PS, "audio/mpeg"},
+       {MEDIA_FORMAT_MP3, "audio/mpeg"},
+       /* Audio - RAW */
+       {MEDIA_FORMAT_PCM, "S16LE"},
+       /* {MEDIA_FORMAT_PCMA, "audio/x-alaw"}, */
+       /* {MEDIA_FORMAT_PCMU, "audio/x-mulaw"}, */
+       /* Video - ENCODED */
+       {MEDIA_FORMAT_H261, "video/x-h261"},
+       {MEDIA_FORMAT_H263, "video/x-h263"},
+       {MEDIA_FORMAT_H263P, "video/x-h263"},
+       {MEDIA_FORMAT_H264_SP, "video/x-h264"},
+       {MEDIA_FORMAT_H264_MP, "video/x-h264"},
+       {MEDIA_FORMAT_H264_HP, "video/x-h264"},
+       {MEDIA_FORMAT_MJPEG, "image/jpeg"},
+       {MEDIA_FORMAT_MPEG1, "video/mpeg"},
+       {MEDIA_FORMAT_MPEG2_SP, "video/mpeg"},
+       {MEDIA_FORMAT_MPEG2_MP, "video/mpeg"},
+       {MEDIA_FORMAT_MPEG2_HP, "video/mpeg"},
+       {MEDIA_FORMAT_MPEG4_SP, "video/mpeg"},
+       {MEDIA_FORMAT_MPEG4_ASP, "video/mpeg"},
+       {MEDIA_FORMAT_HEVC, "video/x-h265"},
+       {MEDIA_FORMAT_VP8, "video/x-vp8"},
+       {MEDIA_FORMAT_VP9, "video/x-vp9"},
+       {MEDIA_FORMAT_VC1, "video/x-wmv"},
+       /* Video - RAW */
+       {MEDIA_FORMAT_I420, "I420"},
+       {MEDIA_FORMAT_NV12, "NV12"},
+       {MEDIA_FORMAT_NV12T, "NV12T"},
+       {MEDIA_FORMAT_YV12, "YV12"},
+       {MEDIA_FORMAT_NV21, "NV21"},
+       {MEDIA_FORMAT_NV16, "NV16"},
+       {MEDIA_FORMAT_YUYV, "YUYV"},
+       {MEDIA_FORMAT_UYVY, "UYVY"},
+       {MEDIA_FORMAT_422P, "422P"},
+       {MEDIA_FORMAT_RGB565, "RGB565"},
+       {MEDIA_FORMAT_RGB888, "RGB888"},
+       {MEDIA_FORMAT_RGBA, "RGBA"},
+       {MEDIA_FORMAT_ARGB, "ARGB"},
+       {MEDIA_FORMAT_NATIVE_VIDEO, "NATIVE_VIDEO"},
+       {MEDIA_FORMAT_MAX, NULL}
+};
+
 static void __ms_check_ini_status(void);
 
 gchar *__ms_ini_get_string(dictionary *dict, const char *ini_path, char *default_str)
@@ -145,6 +199,20 @@ static void __ms_check_ini_status(void)
        }
 }
 
+const gchar *__ms_convert_mime_to_string_format(media_format_mimetype_e mime)
+{
+       gchar *format_name = NULL;
+       int it_format;
+       for (it_format = 0; format_table[it_format].format != MEDIA_FORMAT_MAX; it_format++) {
+               if (mime == format_table[it_format].format) {
+                       format_name = format_table[it_format].format_name;
+                       break;
+               }
+       }
+
+       return format_name;
+}
+
 const gchar *__ms_convert_mime_to_string(media_format_mimetype_e mime)
 {
        switch (mime) {
@@ -186,22 +254,18 @@ const gchar *__ms_convert_mime_to_rtp_format(media_format_mimetype_e mime)
        }
 }
 
-media_format_mimetype_e __ms_convert_string_format_to_mime(const char *format_type)
+media_format_mimetype_e __ms_convert_string_format_to_media_format(const char *format_type)
 {
-       if (g_strrstr(format_type, "I420")) {
-               return MEDIA_FORMAT_I420;
-       } else if (g_strrstr(format_type, "YV12")) {
-               return MEDIA_FORMAT_YV12;
-       } else if (g_strrstr(format_type, "h263")) {
-               return MEDIA_FORMAT_H263;
-       } else if (g_strrstr(format_type, "h264")) {
-               return MEDIA_FORMAT_H264_SP;
-       } else if (g_strrstr(format_type, DEFAULT_AUDIO)) {
-               return MEDIA_FORMAT_PCM;
-       } else {
-               ms_error("Invalid or Unsupported media format [%s].", format_type);
-               return MEDIA_FORMAT_NONE;
+       media_format_mimetype_e mime = 0;
+       int it_format;
+       for (it_format = 0; format_table[it_format].format != MEDIA_FORMAT_MAX; it_format++) {
+               if (g_strrstr(format_type, format_table[it_format].format_name)) {
+                       mime = format_table[it_format].format;
+                       break;
+               }
        }
+
+       return mime;
 }
 
 void __ms_signal_create(GList **sig_list, GstElement *obj, const char *sig_name, GCallback cb, gpointer user_data)