sync with tizen 2.4 26/44726/1 accepted/tizen/mobile/20150727.093307 accepted/tizen/tv/20150727.093319 accepted/tizen/wearable/20150727.093338 submit/tizen/20150727.071122
authoreunhae1.choi <eunhae1.choi@samsung.com>
Mon, 27 Jul 2015 06:51:04 +0000 (15:51 +0900)
committereunhae1.choi <eunhae1.choi@samsung.com>
Mon, 27 Jul 2015 06:52:24 +0000 (15:52 +0900)
Change-Id: I25b52a6df9d212a646b8c35bebb06d407a36c5e7

include/media_streamer_gst.h
include/media_streamer_node.h
include/media_streamer_priv.h
include/media_streamer_util.h
src/media_streamer.c
src/media_streamer_gst.c
src/media_streamer_node.c
src/media_streamer_priv.c
test/media_streamer_test.c

index 6df2fcdc382727a43361882aad9996d26436dea5..76eae5a8b1bdd7051ac55467e2738c20299232f6 100755 (executable)
  */
 void __ms_generate_dots(GstElement *bin, gchar *name_tag);
 
-/**
- * @brief Returns the string representation of GST_STATE.
- *
- * @since_tizen 3.0
- */
-const char *_ms_state_to_string(GstState state);
-
 /**
  * @brief Creates GstElement by plugin name.
  *
@@ -88,7 +81,11 @@ GstElement *__ms_rtp_element_create(media_streamer_node_s *ms_node);
  * @since_tizen 3.0
  */
 gboolean __ms_get_rtp_elements(media_streamer_node_s *ms_node,
-                               GstElement **rtp_elem, GstElement **rtcp_elem, const gchar *elem_name);
+                               GstElement **rtp_elem,
+                               GstElement **rtcp_elem,
+                               const gchar *elem_name,
+                               const gchar *direction,
+                               gboolean auto_create);
 
 /**
  * @brief Converts key-value property into needed GType
@@ -127,19 +124,26 @@ int __ms_add_node_into_bin(media_streamer_s *ms_streamer, media_streamer_node_s
  */
 int __ms_element_set_state(GstElement *gst_element, GstState gst_state);
 
+/**
+ * @brief Iterates pas inside gst element.
+ *
+ * @since_tizen 3.0
+ */
+int __ms_iterate_pads(GstElement *gst_element, GstPadDirection pad_type, char ***pad_name_array, int *pads_count);
+
 /**
  * @brief Gets mediaformat from the GstElement's pad by pad name.
  *
  * @since_tizen 3.0
  */
-media_format_h __ms_element_get_pad_fmt(GstElement *gst_element, const charpad_name);
+media_format_h __ms_element_get_pad_fmt(GstElement *gst_element, const char *pad_name);
 
 /**
  * @brief Sets mediaformat into GstElement.
  *
  * @since_tizen 3.0
  */
-int __ms_element_set_fmt(media_streamer_node_s *node, media_format_h fmt);
+int __ms_element_set_fmt(media_streamer_node_s *node, const char *pad_name, media_format_h fmt);
 
 /**
  * @brief Push the media packet buffer to the source element.
index c3143f77112da1a652e09f5ee83a5738a52103ca..e40cf2f2fc9fe971bfc61c542b390fb77d1f03f6 100755 (executable)
@@ -84,3 +84,11 @@ int __ms_node_read_params_from_bundle(media_streamer_node_s *node,
  */
 int __ms_node_write_params_into_bundle(media_streamer_node_s *node,
                                        bundle *param_list);
+
+/**
+ * @brief Writes GstElement property into user's value.
+ *
+ * @since_tizen 3.0
+ */
+int __ms_node_write_param_into_value(media_streamer_node_s *node,
+                                     const char *param_name, char **param_value);
\ No newline at end of file
index abd567ef574a6e783817c9cb977ae70043e47a06..07a3ec6d3ef507646383de50827b581b936ff2ff 100755 (executable)
@@ -28,6 +28,7 @@ extern "C" {
 #include <media_streamer.h>
 #include <media_streamer_util.h>
 
+struct media_streamer_node_s;
 /**
  * @brief Media Streamer callbacks structure.
  *
index 866e2ef87eda203b157e4e6a9fd76b6242920663..84abd2d93ba17505e0b6a9c87d12dafd268ecbcd 100755 (executable)
@@ -98,49 +98,49 @@ typedef struct __media_streamer_ini {
 } media_streamer_ini_t;
 
 /*Test elements*/
-#define DEFAULT_VIDEO_TEST_SOURCE              "videotestsrc"
-#define DEFAULT_AUDIO_TEST_SOURCE              "audiotestsrc"
-#define DEFAULT_FAKE_SINK                              "fakesink"
-#define DEFAULT_QUEUE                                  "queue"
+#define DEFAULT_VIDEO_TEST_SOURCE           "videotestsrc"
+#define DEFAULT_AUDIO_TEST_SOURCE           "audiotestsrc"
+#define DEFAULT_FAKE_SINK                   "fakesink"
+#define DEFAULT_QUEUE                       "queue"
 
 /* setting default values if each value is not specified in .ini file */
 /* general */
-#define DEFAULT_GENERATE_DOT                   FALSE
-#define DEFAULT_AUDIO_SOURCE                   "alsasrc"
-#define DEFAULT_CAMERA_SOURCE                  "camerasrc"
-#define DEFAULT_VIDEO_SOURCE                   "ximagesrc"
-#define DEFAULT_APP_SOURCE                             "appsrc"
-#define DEFAULT_AUDIO_SINK                             "pulsesink"
-#define DEFAULT_VIDEO_SINK                             "autovideosink"
-#define DEFAULT_VIDEO_CONVERT                  "videoconvert"
-#define DEFAULT_AUDIO_CONVERT                  "audioconvert"
-#define DEFAULT_AUDIO_RESAMPLE                 "audioresample"
-#define DEFAULT_APP_SINK                               "appsink"
+#define DEFAULT_GENERATE_DOT                FALSE
+#define DEFAULT_AUDIO_SOURCE                "alsasrc"
+#define DEFAULT_CAMERA_SOURCE               "v4l2src"
+#define DEFAULT_VIDEO_SOURCE                "ximagesrc"
+#define DEFAULT_APP_SOURCE                  "appsrc"
+#define DEFAULT_AUDIO_SINK                  "pulsesink"
+#define DEFAULT_VIDEO_SINK                  "autovideosink"
+#define DEFAULT_VIDEO_CONVERT               "videoconvert"
+#define DEFAULT_AUDIO_CONVERT               "audioconvert"
+#define DEFAULT_AUDIO_RESAMPLE              "audioresample"
+#define DEFAULT_APP_SINK                    "appsink"
 
 /* udp streaming */
-#define DEFAULT_UDP_SOURCE                             "udpsrc"
-#define DEFAULT_UDP_SINK                               "udpsink"
-#define DEFAULT_RTP_BIN                                        "rtpbin"
+#define DEFAULT_UDP_SOURCE                  "udpsrc"
+#define DEFAULT_UDP_SINK                    "udpsink"
+#define DEFAULT_RTP_BIN                     "rtpbin"
 
 /* video format defaults */
-#define DEFAULT_VIDEO_ENCODER                          "omxh264enc"
-#define DEFAULT_VIDEO_DECODER                          "omxh264dec"
-#define DEFAULT_VIDEO_PARSER                           "h263parse"
-#define DEFAULT_VIDEO_RTPPAY                           "rtph263pay"
-#define DEFAULT_VIDEO_RTPDEPAY                         "rtph263depay"
+#define DEFAULT_VIDEO_ENCODER               "omxh264enc"
+#define DEFAULT_VIDEO_DECODER               "omxh264dec"
+#define DEFAULT_VIDEO_PARSER                "h263parse"
+#define DEFAULT_VIDEO_RTPPAY                "rtph263pay"
+#define DEFAULT_VIDEO_RTPDEPAY              "rtph263depay"
 
 /* audio format defaults */
-#define DEFAULT_AUDIO_RTPPAY                           "rtpL16pay"
-#define DEFAULT_AUDIO_RTPDEPAY                         "rtpL16depay"
+#define DEFAULT_AUDIO_RTPPAY                "rtpL16pay"
+#define DEFAULT_AUDIO_RTPDEPAY              "rtpL16depay"
 
-#define MEDIA_STREAMER_DEFAULT_CAMERA_FORMAT "video/x-raw,width=320,height=240"
+#define MEDIA_STREAMER_DEFAULT_CAMERA_FORMAT "video/x-raw,width=1280,height=720"
 #define MEDIA_STREAMER_DEFAULT_AUDIO_FORMAT "audio/x-raw,channels=1,rate=44100,format=S16BE"
 #define MEDIA_STREAMER_DEFAULT_ENCODER_FORMAT "video/x-h263,stream-format=byte-stream,profile=high"
 
-#define MS_ELEMENT_IS_SINK(el) g_str_has_suffix(el, "sink")
-#define MS_ELEMENT_IS_SOURCE(el) g_str_has_suffix(el, "source")
-#define MS_ELEMENT_IS_AUDIO(el) g_str_has_prefix(el, "audio")
-#define MS_ELEMENT_IS_VIDEO(el) g_str_has_prefix(el, "video")
+#define MS_ELEMENT_IS_OUTPUT(el) g_strrstr(el, "out")
+#define MS_ELEMENT_IS_INPUT(el) g_strrstr(el, "in")
+#define MS_ELEMENT_IS_AUDIO(el) g_strrstr(el, "audio")
+#define MS_ELEMENT_IS_VIDEO(el) g_strrstr(el, "video")
 
 #define MEDIA_STREAMER_DEFAULT_DOT_DIR "/tmp"
 #define MEDIA_STREAMER_DEFAULT_INI \
@@ -154,7 +154,7 @@ dot dir = /tmp \n\
 [sources] \n\
 \n\
 audio_source = pulsesrc \n\
-camera_source = camerasrc \n\
+camera_source = v4l2src \n\
 video_source = ximagesrc \n\
 udp_source = udpsrc \n\
 \n\
@@ -162,7 +162,7 @@ udp_source = udpsrc \n\
 [sinks] \n\
 \n\
 audio_sink = pulsesink \n\
-video_sink = autovideosink \n\
+video_sink = waylandsink \n\
 udp_sink = udpsink \n\
 \n\
 \n\
index 5e3099bb7ef41b7e77285e94fd186eff19be63f7..7cba347c2944084eaca85c663d03a3e5e90cdba6 100755 (executable)
@@ -194,6 +194,8 @@ int media_streamer_prepare(media_streamer_h streamer)
                return MEDIA_STREAMER_ERROR_INVALID_OPERATION;
        }
 
+       __ms_autoplug_prepare(ms_streamer);
+
        if (__ms_state_change(ms_streamer, MEDIA_STREAMER_STATE_READY) != MEDIA_STREAMER_ERROR_NONE) {
                ms_error("Error: can not set state [%d]", MEDIA_STREAMER_ERROR_INVALID_OPERATION);
                return MEDIA_STREAMER_ERROR_INVALID_OPERATION;
@@ -492,7 +494,7 @@ int media_streamer_stop(media_streamer_h streamer)
                return MEDIA_STREAMER_ERROR_INVALID_OPERATION;
        }
 
-       if (__ms_state_change(ms_streamer, MEDIA_STREAMER_STATE_READY) != MEDIA_STREAMER_ERROR_NONE) {
+       if (__ms_state_change(ms_streamer, MEDIA_STREAMER_STATE_PAUSED) != MEDIA_STREAMER_ERROR_NONE) {
                ms_error("Error: can not set state [%d]", MEDIA_STREAMER_ERROR_INVALID_OPERATION);
                return MEDIA_STREAMER_ERROR_INVALID_OPERATION;
        }
@@ -582,7 +584,7 @@ int media_streamer_node_set_pad_format(media_streamer_node_h node,
        ms_retvm_if(fmt == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Format is NULL");
 
        /* By default it sets format to object's property 'caps'*/
-       return __ms_element_set_fmt(node, fmt);
+       return __ms_element_set_fmt(node, pad_name, fmt);
 }
 
 int media_streamer_node_get_pad_format(media_streamer_node_h node,
@@ -601,6 +603,31 @@ int media_streamer_node_get_pad_format(media_streamer_node_h node,
        return MEDIA_STREAMER_ERROR_NONE;
 }
 
+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)
+{
+       int ret = MEDIA_STREAMER_ERROR_NONE;
+       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(src_pad_name == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Empty src pad name");
+       ms_retvm_if(src_pad_num == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Number of src_pads is NULL");
+       ms_retvm_if(sink_pad_name == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Empty sink pad name");
+       ms_retvm_if(sink_pad_num == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Number of sink_pads is NULL");
+       ms_retvm_if(ms_node->gst_element == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+
+       ret = __ms_iterate_pads(ms_node->gst_element, GST_PAD_SRC, src_pad_name, src_pad_num);
+       ms_retvm_if(ret, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Error iterating src pads");
+
+       ret = __ms_iterate_pads(ms_node->gst_element, GST_PAD_SINK, sink_pad_name, sink_pad_num);
+       ms_retvm_if(ret, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Error iterating sink pads");
+
+       return ret;
+}
+
 int media_streamer_node_set_params(media_streamer_node_h node,
                                    bundle *param_list)
 {
@@ -630,7 +657,7 @@ int media_streamer_node_get_params(media_streamer_node_h node,
        ms_retvm_if(ms_params == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Error creating new params object");
 
        if (__ms_node_write_params_into_bundle(ms_node, ms_params) != MEDIA_STREAMER_ERROR_NONE) {
-               ms_info("Node [%s] do not have any params.", ms_node->name);
+               ms_info("Node [%s] does not have any params.", ms_node->name);
                bundle_free(ms_params);
                *param_list = NULL;
 
@@ -651,7 +678,7 @@ int media_streamer_node_set_param(media_streamer_node_h node,
        ms_retvm_if(param_name == NULL || param_value == NULL,
                    MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Parameters name or value is NULL");
 
-       return ms_node->set_param(ms_node, param_name, param_value);
+       return ms_node->set_param((struct media_streamer_node_s *)ms_node, param_name, param_value);
 }
 
 int media_streamer_node_get_param(media_streamer_node_h node,
@@ -660,9 +687,17 @@ int media_streamer_node_get_param(media_streamer_node_h node,
        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(param_name == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Param name is NULL");
+       ms_retvm_if(param_value == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Param value is NULL");
 
-  // TBD
+       char *ms_param = NULL;
+
+       if (__ms_node_write_param_into_value(ms_node, param_name,&ms_param) != MEDIA_STREAMER_ERROR_NONE) {
+               ms_info("Node [%s] does not have param [%s]", ms_node->name, param_name);
+
+               return MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+       }
 
+       *param_value = ms_param;
        return MEDIA_STREAMER_ERROR_NONE;
 }
 
index 290539ee8bc9106a76a7dfbadff425aa9cd22811..edbbb7b6c2380c071813ac5c6bc47f04e3f76dfc 100755 (executable)
@@ -33,79 +33,59 @@ void __ms_generate_dots(GstElement *bin, gchar *name_tag)
        MS_SAFE_GFREE(dot_name);
 }
 
-const char *_ms_state_to_string(GstState state)
+static int __ms_add_no_target_ghostpad(GstElement *gst_bin,
+                                       const char *ghost_pad_name,
+                                       GstPadDirection pad_direction)
 {
-       static const char pending[] = "PENDING\0";
-       static const char null_s[] = "NULL\0";
-       static const char ready[] = "READY\0";
-       static const char paused[] = "PAUSED\0";
-       static const char playing[] = "PLAYING\0";
-       switch (state) {
-               case GST_STATE_VOID_PENDING:
-                       return pending;
-                       break;
-               case GST_STATE_NULL:
-                       return null_s;
-                       break;
-               case GST_STATE_READY:
-                       return ready;
-                       break;
-               case GST_STATE_PAUSED:
-                       return paused;
-                       break;
-               case GST_STATE_PLAYING:
-                       return playing;
-                       break;
-               default:
-                       return "\0";
-                       break;
-       };
-       return 0;
-}
+       int ret = MEDIA_STREAMER_ERROR_NONE;
 
+       gchar *bin_name = gst_element_get_name(gst_bin);
+       GstPad *ghost_pad = gst_ghost_pad_new_no_target(ghost_pad_name, pad_direction);
+       if (gst_element_add_pad(GST_ELEMENT(gst_bin), ghost_pad)) {
+               ms_info("Added [%s] empty ghostpad into [%s]", ghost_pad_name, bin_name);
+       } else {
+               ms_info("Error: Failed to add empty [%s] ghostpad into [%s]", ghost_pad_name, bin_name);
+               ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+       }
+
+       MS_SAFE_GFREE(bin_name);
+       return ret;
+}
 static int __ms_add_ghostpad(GstElement *gst_element,
                              const char *pad_name,
                              GstElement *gst_bin,
                              const char *ghost_pad_name)
 {
-       ms_retvm_if(!ghost_pad_name || !gst_bin, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+       ms_retvm_if(!gst_element || !pad_name || !ghost_pad_name || !gst_bin, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
        int ret = MEDIA_STREAMER_ERROR_NONE;
 
        GstPad *ghost_pad = NULL;
        gchar *bin_name = gst_element_get_name(gst_bin);
 
-       if (!gst_element || !pad_name) {
-               ghost_pad = gst_ghost_pad_new_no_target(ghost_pad_name, GST_PAD_SRC);
+       gchar *element_name = gst_element_get_name(gst_element);
+       GstPad *element_pad = gst_element_get_static_pad(gst_element, pad_name);
+       if (!element_pad) {
+               /*maybe it is request pad */
+               element_pad = gst_element_get_request_pad(gst_element, pad_name);
+       }
+       if (element_pad != NULL) {
+               ghost_pad = gst_ghost_pad_new(ghost_pad_name, element_pad);
+               gst_pad_set_active(ghost_pad, TRUE);
+
                gst_element_add_pad(GST_ELEMENT(gst_bin), ghost_pad);
-               ms_info("Added [%s] empty ghostpad into [%s]", ghost_pad_name, bin_name);
+               ms_info("Added %s ghostpad from [%s] into [%s]", pad_name, element_name, bin_name);
+               MS_SAFE_UNREF(element_pad);
+               MS_SAFE_GFREE(element_name);
+
                ret = MEDIA_STREAMER_ERROR_NONE;
        } else {
-               gchar *element_name = gst_element_get_name(gst_element);
-               GstPad *element_pad = gst_element_get_static_pad(gst_element, pad_name);
-               if (!element_pad) {
-                       /*maybe it is request pad */
-                       element_pad = gst_element_get_request_pad(gst_element, pad_name);
-               }
-               if (element_pad != NULL) {
-                       ghost_pad = gst_ghost_pad_new(ghost_pad_name, element_pad);
-                       gst_pad_set_active(ghost_pad, TRUE);
-
-                       gst_element_add_pad(GST_ELEMENT(gst_bin), ghost_pad);
-                       ms_info("Added %s ghostpad from [%s] into [%s]", pad_name, element_name, bin_name);
-                       MS_SAFE_UNREF(element_pad);
-                       MS_SAFE_GFREE(element_name);
-
-                       ret = MEDIA_STREAMER_ERROR_NONE;
-               } else {
-                       ms_error("Error: element [%s] does not have valid [%s] pad for adding into [%s] bin",
-                                element_name, pad_name, bin_name);
-                       ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION;
-               }
+               ms_error("Error: element [%s] does not have valid [%s] pad for adding into [%s] bin",
+                               element_name, pad_name, bin_name);
+               ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION;
        }
 
        MS_SAFE_GFREE(bin_name);
-
        return ret;
 }
 
@@ -243,6 +223,8 @@ gboolean __ms_element_set_property(GstElement *element, const gchar *key, const
        }
        g_object_set_property(obj, key, &value);
        MS_SAFE_GFREE(element_name);
+
+       return TRUE;
 }
 
 gboolean __ms_element_unlink(GstElement *element)
@@ -286,7 +268,7 @@ gboolean __ms_element_unlink(GstElement *element)
        gst_iterator_free(pad_iterator);
 
        /*Remove node's element from bin and reference saving*/
-       parent = gst_element_get_parent(element);
+       parent = (GstElement *)gst_element_get_parent(GST_OBJECT_CAST(element));
 
        if (parent != NULL) {
                gst_object_ref(element);
@@ -378,9 +360,6 @@ static gboolean __ms_sink_bin_prepare(GstElement *sink_bin, GstPad *source_pad)
        gboolean ret = FALSE;
        GstPad *src_pad = NULL; //pad of unlinked inner element
 
-       GValue elem = G_VALUE_INIT;
-       GstIterator *bin_iterator;
-
        gchar *source_pad_name = gst_pad_get_name(source_pad);
 
        GstElement *found_element = __ms_bin_find_element_by_klass(sink_bin, "Depayloader/Network/RTP");
@@ -466,10 +445,10 @@ static void __ms_rtpbin_pad_added_cb(GstElement *src, GstPad *new_pad, gpointer
                const gchar *src_pad_type = gst_structure_get_string(src_pad_struct, "media");
                ms_debug("type is [%s]", src_pad_type);
                if (MS_ELEMENT_IS_VIDEO(src_pad_type)) {
-                       source_pad_name = g_strdup_printf("%s_source", "video");
+                       source_pad_name = g_strdup_printf("%s_out", "video");
                        sink_bin = ms_node->parent_streamer->sink_video_bin;
                } else if (MS_ELEMENT_IS_AUDIO(src_pad_type)) {
-                       source_pad_name = g_strdup_printf("%s_source", "audio");
+                       source_pad_name = g_strdup_printf("%s_out", "audio");
                        sink_bin = ms_node->parent_streamer->sink_audio_bin;
                }
 
@@ -522,7 +501,8 @@ int __ms_element_set_state(GstElement *gst_element, GstState gst_state)
 
        ret_state = gst_element_set_state(gst_element, gst_state);
        if (ret_state == GST_STATE_CHANGE_FAILURE) {
-               ms_error("Failed to set element [%s] into %s state", element_name, _ms_state_to_string(gst_state));
+               ms_error("Failed to set element [%s] into %s state",
+                 element_name, gst_element_state_get_name(gst_state));
                MS_SAFE_GFREE(element_name);
                return MEDIA_STREAMER_ERROR_INVALID_OPERATION;
        }
@@ -635,7 +615,10 @@ GstElement *__ms_video_decoder_element_create(dictionary *dict , media_format_mi
                g_object_set(G_OBJECT(decoder_parser), "config-interval", 5, NULL);
        }
 
-       is_omx = g_strrstr(format_prefix, "omx");
+       if (g_strrstr(format_prefix, "omx")) {
+               is_omx = TRUE;
+       }
+
        MS_SAFE_FREE(format_prefix);
        MS_SAFE_FREE(plugin_name);
 
@@ -717,37 +700,43 @@ GstElement *__ms_rtp_element_create(media_streamer_node_s *ms_node)
 }
 
 gboolean __ms_get_rtp_elements(media_streamer_node_s *ms_node,
-                               GstElement **rtp_elem, GstElement **rtcp_elem, const gchar *elem_name)
+                               GstElement **rtp_elem,
+                               GstElement **rtcp_elem,
+                               const gchar *elem_name,
+                               const gchar *direction,
+                               gboolean auto_create)
 {
-       gboolean ret = FALSE;
+       gboolean ret = TRUE;
        gchar *rtp_elem_name = NULL;
        gchar *rtcp_elem_name = NULL;
        gchar *plugin_name = NULL;
 
        GstElement *rtpbin = gst_bin_get_by_name(GST_BIN(ms_node->gst_element), "rtpbin");
 
-       ms_retvm_if(!elem_name, FALSE, "Empty rtp element name.");
+       ms_retvm_if(!elem_name || !direction, FALSE, "Empty rtp element name or direction.");
 
-       if (MS_ELEMENT_IS_SOURCE(elem_name)) {
-               plugin_name = g_strdup("udpsrc");
-       } else if (MS_ELEMENT_IS_SINK(elem_name)) {
-               plugin_name = g_strdup("udpsink");
+       if (MS_ELEMENT_IS_INPUT(direction)) {
+               plugin_name = g_strdup(DEFAULT_UDP_SOURCE);
+       } else if (MS_ELEMENT_IS_OUTPUT(direction)) {
+               plugin_name = g_strdup(DEFAULT_UDP_SINK);
        } else {
                ms_error("Error: invalid parameter name [%s]", elem_name);
                return FALSE;
        }
 
-       rtp_elem_name = g_strdup_printf("%s_rtp", elem_name);
-       rtcp_elem_name = g_strdup_printf("%s_rtcp", elem_name);
+       rtp_elem_name = g_strdup_printf("%s_%s_rtp", elem_name, direction);
+       rtcp_elem_name = g_strdup_printf("%s_%s_rtcp", elem_name, direction);
 
        /* Find video udp rtp/rtcp element if it present. */
        *rtp_elem = gst_bin_get_by_name(GST_BIN(ms_node->gst_element), rtp_elem_name);
        *rtcp_elem = gst_bin_get_by_name(GST_BIN(ms_node->gst_element), rtcp_elem_name);
 
        /* Create new udp element if it did not found. */
-       if ((NULL == *rtp_elem) && (NULL == *rtcp_elem)) {
+       if ((NULL == *rtp_elem) && (NULL == *rtcp_elem) && auto_create) {
                *rtp_elem = __ms_element_create(plugin_name, rtp_elem_name);
                *rtcp_elem = __ms_element_create(plugin_name, rtcp_elem_name);
+               gst_bin_add_many(GST_BIN(ms_node->gst_element),
+                                *rtp_elem, *rtcp_elem, NULL);
        } else {
                /*rtp/rtcp elements already into rtp bin. */
                MS_SAFE_GFREE(rtp_elem_name);
@@ -756,19 +745,16 @@ gboolean __ms_get_rtp_elements(media_streamer_node_s *ms_node,
                return TRUE;
        }
 
-       gst_bin_add_many(GST_BIN(ms_node->gst_element),
-                        *rtp_elem, *rtcp_elem, NULL);
-
-       if (MS_ELEMENT_IS_SINK(elem_name)) {
+       if (MS_ELEMENT_IS_OUTPUT(direction)) {
                g_object_set(GST_OBJECT(*rtcp_elem), "sync", FALSE, NULL);
                g_object_set(GST_OBJECT(*rtcp_elem), "async", FALSE, NULL);
 
                if (MS_ELEMENT_IS_VIDEO(elem_name)) {
-                       __ms_add_ghostpad(rtpbin, "send_rtp_sink_0", ms_node->gst_element, "video_sink");
+                       __ms_add_ghostpad(rtpbin, "send_rtp_sink_0", ms_node->gst_element, "video_in");
                        ret = gst_element_link_pads(rtpbin, "send_rtp_src_0", *rtp_elem, "sink") &&
                              gst_element_link_pads(rtpbin, "send_rtcp_src_0", *rtcp_elem, "sink");
                } else {
-                       __ms_add_ghostpad(rtpbin, "send_rtp_sink_1", ms_node->gst_element, "audio_sink");
+                       __ms_add_ghostpad(rtpbin, "send_rtp_sink_1", ms_node->gst_element, "audio_in");
                        ret = gst_element_link_pads(rtpbin, "send_rtp_src_1", *rtp_elem, "sink") &&
                              gst_element_link_pads(rtpbin, "send_rtcp_src_1", *rtcp_elem, "sink");
                }
@@ -776,17 +762,19 @@ gboolean __ms_get_rtp_elements(media_streamer_node_s *ms_node,
                if (MS_ELEMENT_IS_VIDEO(elem_name)) {
                        ret = gst_element_link_pads(*rtp_elem, "src", rtpbin, "recv_rtp_sink_0") &&
                              gst_element_link_pads(*rtcp_elem, "src", rtpbin, "recv_rtcp_sink_0");
-                       __ms_add_ghostpad(NULL, NULL, ms_node->gst_element, "video_source");
+                       __ms_add_no_target_ghostpad(ms_node->gst_element, "video_out", GST_PAD_SRC);
+                       __ms_add_no_target_ghostpad(ms_node->gst_element, "video_in_rtp", GST_PAD_SINK);
                } else {
                        ret = gst_element_link_pads(*rtp_elem, "src", rtpbin, "recv_rtp_sink_1") &&
                              gst_element_link_pads(*rtcp_elem, "src", rtpbin, "recv_rtcp_sink_1");
-                       __ms_add_ghostpad(NULL, NULL, ms_node->gst_element, "audio_source");
+                       __ms_add_no_target_ghostpad(ms_node->gst_element, "audio_out", GST_PAD_SRC);
+                       __ms_add_no_target_ghostpad(ms_node->gst_element, "audio_in_rtp", GST_PAD_SINK);
                }
        }
 
        if (!ret) {
-               ms_error("Can not link [rtpbin] pad to [%s] pad, ret code [%d] ", rtp_elem, ret);
-               ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+               ms_error("Can not link [rtpbin] pad to [%s] pad", rtp_elem_name);
+               ret = FALSE;
        }
 
        __ms_generate_dots(ms_node->gst_element, "rtp");
@@ -886,13 +874,13 @@ static gboolean __ms_bus_cb(GstBus *bus, GstMessage *message, gpointer userdata)
        if (message != NULL) {
                switch (GST_MESSAGE_TYPE(message)) {
                        case GST_MESSAGE_ERROR: {
-                                       GError *err;
-                                       gchar *debug;
+                                       GError *err = NULL;
+                                       gchar *debug = NULL;
                                        gst_message_parse_error(message, &err, &debug);
 
                                        ms_error("[Source: %s] Error: %s", GST_OBJECT_NAME(GST_OBJECT_CAST(GST_ELEMENT(GST_MESSAGE_SRC(message)))), err->message);
 
-                                       MS_SAFE_FREE(err);
+                                       g_error_free(err);
                                        MS_SAFE_FREE(debug);
                                        break;
                                }
@@ -903,39 +891,15 @@ static gboolean __ms_bus_cb(GstBus *bus, GstMessage *message, gpointer userdata)
                                                gchar *state_transition_name;
 
                                                gst_message_parse_state_changed(message, &state_old, &state_new, &state_pending);
-                                               ms_info("GST_MESSAGE_STATE_CHANGED: [%s] %s -> %s\n",
-                                                       gst_object_get_name(GST_MESSAGE_SRC(message)),
-                                                       _ms_state_to_string(state_old),
-                                                       _ms_state_to_string(state_new));
-
                                                state_transition_name = g_strdup_printf("%s_%s",
                                                                                        gst_element_state_get_name(state_old),
                                                                                        gst_element_state_get_name(state_new));
-
+                                               ms_info("GST_MESSAGE_STATE_CHANGED: [%s] %s",
+                                                       gst_object_get_name(GST_MESSAGE_SRC(message)),
+                                                               state_transition_name);
                                                __ms_generate_dots(ms_streamer->pipeline, state_transition_name);
 
                                                MS_SAFE_GFREE(state_transition_name);
-
-                                               if (state_old == GST_STATE_NULL && state_new == GST_STATE_READY) {
-                                                       ms_info("[Success] GST_STATE_NULL => GST_STATE_READY");
-
-                                                       /* Pause Media_Streamer */
-                                                       ret = __ms_element_set_state(ms_streamer->pipeline, GST_STATE_PAUSED);
-                                                       if (ret != MEDIA_STREAMER_ERROR_NONE) {
-                                                               ms_error("ERROR - Pause pipeline");
-                                                               return FALSE;
-                                                       }
-                                               }
-
-                                               if (state_old == GST_STATE_READY && state_new == GST_STATE_PAUSED) {
-                                                       ms_info("[Success] GST_STATE_READY => GST_STATE_PAUSED");
-
-                                                       ret = __ms_element_set_state(ms_streamer->pipeline, GST_STATE_PLAYING);
-                                                       if (ret != MEDIA_STREAMER_ERROR_NONE) {
-                                                               ms_error("ERROR - Play Pipeline");
-                                                               return FALSE;
-                                                       }
-                                               }
                                        }
                                        break;
                                }
@@ -1019,7 +983,7 @@ static GstCaps *__ms_create_caps_from_fmt(media_format_h fmt)
                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, */
+                                                  "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);
@@ -1081,13 +1045,17 @@ static media_format_h __ms_create_fmt_from_caps(GstCaps *caps)
 
        ms_debug("Pad type is [%s], format: [%s]", pad_type, pad_format);
        if (MS_ELEMENT_IS_VIDEO(pad_type)) {
-               int width, height;
-               media_format_set_video_mime(fmt, __ms_convert_string_format_to_mime(pad_format));
-               gst_structure_get_int(pad_struct, "width", &width);
-               media_format_set_video_width(fmt, width);
+               int width, height, avg_bps, max_bps;
 
+               gst_structure_get_int(pad_struct, "width", &width);
+               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_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));
@@ -1100,6 +1068,52 @@ static media_format_h __ms_create_fmt_from_caps(GstCaps *caps)
        return fmt;
 }
 
+int __ms_iterate_pads(GstElement *gst_element, GstPadDirection pad_type, char ***pad_name_array, int *pads_count)
+{
+       int ret = MEDIA_STREAMER_ERROR_NONE;
+
+       int pad_number = 0;
+       GValue elem = G_VALUE_INIT;
+       GstPad *pad = NULL;
+       char **pad_names = NULL;
+       GstIterator *pad_iterator = NULL;
+
+       if(pad_type == GST_PAD_SRC) {
+               pad_iterator = gst_element_iterate_src_pads(gst_element);
+       } else if(pad_type == GST_PAD_SINK) {
+               pad_iterator = gst_element_iterate_sink_pads(gst_element);
+       } else {
+               pad_iterator = gst_element_iterate_pads(gst_element);
+               ms_info("Iterating all pads of the Gst element");
+       }
+
+       while (GST_ITERATOR_OK == gst_iterator_next(pad_iterator, &elem)) {
+               pad = (GstPad *)g_value_get_object(&elem);
+
+               pad_names = (char **)realloc(pad_names, sizeof(char *) * (pad_number + 1));
+               if(!pad_names){
+                       ms_error("Error allocation memory");
+                       ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+                       pad_number = 0;
+                       MS_SAFE_FREE(pad_names);
+                       break;
+               }
+
+               pad_names[pad_number] = gst_pad_get_name(pad);
+               ++pad_number;
+
+               g_value_reset(&elem);
+       }
+
+       g_value_unset(&elem);
+       gst_iterator_free(pad_iterator);
+
+       *pad_name_array = pad_names;
+       *pads_count = pad_number;
+
+       return ret;
+}
+
 media_format_h __ms_element_get_pad_fmt(GstElement *gst_element, const char *pad_name)
 {
        media_format_h fmt;
@@ -1129,15 +1143,52 @@ media_format_h __ms_element_get_pad_fmt(GstElement *gst_element, const char *pad
        return fmt;
 }
 
-int __ms_element_set_fmt(media_streamer_node_s *node, media_format_h fmt)
+int __ms_element_set_fmt(media_streamer_node_s *node, const char *pad_name, media_format_h fmt)
 {
        GstCaps *caps = NULL;
        GObject *obj = NULL;
        GValue value = G_VALUE_INIT;
-       caps = __ms_create_caps_from_fmt(fmt);
-       ms_retvm_if(caps == NULL, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Fail creating caps from fmt.");
 
-       obj = __ms_get_property_owner(node->gst_element, "caps", &value);
+       if (node->type == MEDIA_STREAMER_NODE_TYPE_RTP) {
+               /* It is needed to set 'application/x-rtp' for audio and video udpsrc*/
+               media_format_mimetype_e mime;
+               GstElement *rtp_elem, *rtcp_elem;
+
+               /*Check if it is a valid pad*/
+               GstPad *pad = gst_element_get_static_pad(node->gst_element, pad_name);
+               if (!pad) {
+                       ms_error("Error: Failed set format to pad [%s].[%s].", node->name, pad_name);
+                       return MEDIA_STREAMER_ERROR_INVALID_PARAMETER;
+               }
+
+               if (MEDIA_FORMAT_ERROR_NONE == media_format_get_video_info(fmt, &mime, NULL, NULL, NULL, NULL)) {
+                       __ms_get_rtp_elements(node, &rtp_elem, &rtcp_elem, "video", "in", FALSE);
+
+                       caps = gst_caps_from_string("application/x-rtp,media=video,clock-rate=90000,encoding-name=H264");
+                       ms_retvm_if(caps == NULL, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Fail creating caps from fmt.");
+
+                       obj = __ms_get_property_owner(rtp_elem, "caps", &value);
+               } else if (MEDIA_FORMAT_ERROR_NONE == media_format_get_audio_info(fmt, &mime, NULL, NULL, NULL, NULL)) {
+                       __ms_get_rtp_elements(node, &rtp_elem, &rtcp_elem, "audio", "in", FALSE);
+
+                       caps = gst_caps_from_string("application/x-rtp,media=audio,clock-rate=44100,encoding-name=L16,"
+                                                   "encoding-params=1,channels=1,payload=96");
+                       ms_retvm_if(caps == NULL, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Fail creating caps from fmt.");
+
+                       obj = __ms_get_property_owner(rtp_elem, "caps", &value);
+               } else {
+                       ms_error("Failed getting media info from fmt.");
+                       return MEDIA_STREAMER_ERROR_INVALID_PARAMETER;
+               }
+
+               MS_SAFE_UNREF(pad);
+       } else {
+               caps = __ms_create_caps_from_fmt(fmt);
+               ms_retvm_if(caps == NULL, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Fail creating caps from fmt.");
+
+               obj = __ms_get_property_owner(node->gst_element, "caps", &value);
+       }
+
        gst_value_set_caps(&value, caps);
        g_object_set_property(obj, "caps", &value);
        gst_caps_unref(caps);
@@ -1162,7 +1213,7 @@ int __ms_element_push_packet(GstElement *src_element, media_packet_h packet)
        }
 
        media_packet_get_buffer_size(packet, &size);
-       media_packet_get_buffer_data_ptr(packet, &buffer_data);
+       media_packet_get_buffer_data_ptr(packet, (void **)&buffer_data);
        media_packet_get_pts(packet, &pts);
        media_packet_get_duration(packet, &duration);
 
@@ -1185,7 +1236,6 @@ int __ms_element_push_packet(GstElement *src_element, media_packet_h packet)
 int __ms_element_pull_packet(GstElement *sink_element, media_packet_h *packet)
 {
        GstBuffer *buffer = NULL;
-       GstFlowReturn gst_ret = GST_FLOW_OK;
        GstSample *sample = NULL;
        GstMapInfo map;
 
@@ -1202,7 +1252,7 @@ int __ms_element_pull_packet(GstElement *sink_element, media_packet_h *packet)
        ms_retvm_if(fmt == NULL, MEDIA_STREAMER_ERROR_INVALID_OPERATION,
                        "Error while getting media format from sink pad");
 
-       media_packet_create_from_external_memory(&fmt, (void *)map.data, map.size, NULL, NULL, packet);
+       media_packet_create_from_external_memory(fmt, (void *)map.data, map.size, NULL, NULL, packet);
        media_packet_set_pts(*packet, GST_BUFFER_PTS(buffer));
        media_packet_set_dts(*packet, GST_BUFFER_DTS(buffer));
        media_packet_set_pts(*packet, GST_BUFFER_DURATION(buffer));
index 0c22ee479c19721a956fc9184d5eb45be4f041d3..2cff14026bfc3ffe49dd035976c172bcbf697b5b 100755 (executable)
@@ -37,43 +37,70 @@ static int __ms_rtp_node_set_property(media_streamer_node_s *ms_node,
        ms_retvm_if(!ms_node && !ms_node->gst_element, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Error: empty node");
 
        gchar **tokens = NULL;
-       gchar *elem_name = NULL;
-       guint i = 0;
        GstElement *rtp_elem = NULL;
        GstElement *rtcp_elem = NULL;
 
-       tokens = g_strsplit(param_key, ",", 3);
-       ms_retvm_if(tokens == NULL, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Invalid rtp parameter line.");
-       elem_name = tokens[0];
+       gchar *elem_name, *direction, *param;
+
+       tokens = g_strsplit(param_key, "_", 3);
+       if (tokens && tokens[0] && !tokens[1]) {
+               /*In this case can be param names without direction description
+                * parameter 'host' will be set to all udpsink
+                * parameter 'format' will be set all udpsrc
+                */
+
+               param = tokens[0];
+               if (!g_strcmp0(param, MEDIA_STREAMER_PARAM_HOST)) {
+                       __ms_get_rtp_elements(ms_node, &rtp_elem, &rtcp_elem, "audio", "out", FALSE);
+                       if (rtp_elem && rtcp_elem) {
+                               __ms_element_set_property(rtp_elem, param, param_value);
+                               __ms_element_set_property(rtcp_elem, param, param_value);
+                       }
+
+                       __ms_get_rtp_elements(ms_node, &rtp_elem, &rtcp_elem, "video", "out", FALSE);
+                       if (rtp_elem && rtcp_elem) {
+                               __ms_element_set_property(rtp_elem, param, param_value);
+                               __ms_element_set_property(rtcp_elem, param, param_value);
+                       }
+               } else {
+                       ms_error("Error: Unsupported parameter [%s] for rtp node.");
+               }
 
-       if (FALSE == __ms_get_rtp_elements(ms_node, &rtp_elem, &rtcp_elem, elem_name)) {
-               ms_error("Error: invalid parameter [%s]", param_key);
                g_strfreev(tokens);
-               return MEDIA_STREAMER_ERROR_INVALID_OPERATION;
-       }
-
-       for (i = 1; (tokens && tokens[i]); i++) {
-               ms_retvm_if(!rtp_elem || !rtcp_elem,
-                           MEDIA_STREAMER_ERROR_INVALID_OPERATION,
-                           "Error: [%s] did not found or created into streamer", tokens[i]);
+               return MEDIA_STREAMER_ERROR_NONE;
+       } else if (tokens || tokens[0] || tokens[1] || tokens[2]) {
+
+               /*
+                * Rtp node parameter name consist of three fields separated with symbol '_':
+                * <video/audio>_<in/out>_<param_key>
+                */
+
+               elem_name = tokens[0];
+               direction = tokens[1];
+               param = tokens[2];
+               if (FALSE == __ms_get_rtp_elements(ms_node, &rtp_elem, &rtcp_elem, elem_name, direction, TRUE)) {
+                       ms_error("Error: invalid parameter [%s]", param_key);
+                       g_strfreev(tokens);
+                       return MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+               }
 
-               if (!g_strcmp0(tokens[i], "port")) {
-                       __ms_element_set_property(rtp_elem, tokens[i], param_value);
+               if (!g_strcmp0(param, MEDIA_STREAMER_PARAM_PORT)) {
+                       __ms_element_set_property(rtp_elem, param, param_value);
                        gchar *next_port = g_strdup(param_value);
                        next_port[strlen(next_port) - 1] += 1;
-                       __ms_element_set_property(rtcp_elem, tokens[i], next_port);
+                       __ms_element_set_property(rtcp_elem, param, next_port);
                        MS_SAFE_GFREE(next_port);
-               } else if (!g_strcmp0(tokens[i], "host") && MS_ELEMENT_IS_SINK(elem_name)) {
-                       __ms_element_set_property(rtp_elem, tokens[i], param_value);
-                       __ms_element_set_property(rtcp_elem, tokens[i], param_value);
-               } else if (!g_strcmp0(tokens[i], "format") && MS_ELEMENT_IS_SOURCE(elem_name)) {
-                       __ms_element_set_property(rtp_elem, "caps", param_value);
                }
 
+               g_strfreev(tokens);
+               return MEDIA_STREAMER_ERROR_NONE;
+       } else {
+               ms_error("Invalid rtp parameter name.");
        }
+
        g_strfreev(tokens);
 
-       return MEDIA_STREAMER_ERROR_NONE;
+       return MEDIA_STREAMER_ERROR_INVALID_PARAMETER;
 }
 
 int __ms_node_create(media_streamer_node_s *node,
@@ -476,7 +503,7 @@ static void __params_foreach_cb(const char *key,
                ms_info("Read param value[%s] with size [%d].", (gchar *)basic_val, basic_size);
 
                if (ms_node->set_param != NULL) {
-                       ret = ms_node->set_param(ms_node, (gchar *)key, (gchar *)basic_val);
+                       ret = ms_node->set_param((struct media_streamer_node_s *)ms_node, (char *)key, (char *)basic_val);
                } else {
                        ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION;
                }
@@ -498,6 +525,94 @@ int __ms_node_read_params_from_bundle(media_streamer_node_s *node,
        return ret;
 }
 
+static void __ms_node_get_param_value(GParamSpec *param, GValue value,char **string_value)
+{
+       char *value_in_string = NULL;
+
+       ms_info("%-20s: %s\n", g_param_spec_get_name(param), g_param_spec_get_blurb(param));
+
+       switch (G_VALUE_TYPE(&value)) {
+       case G_TYPE_STRING:
+               ms_info("Got string value: [%s]", g_value_get_string(&value));
+               break;
+
+       case G_TYPE_BOOLEAN:
+               value_in_string = g_strdup_printf("%s", g_value_get_boolean(&value) ? "true" : "false");
+               ms_info("Got boolean value: [%s]", value_in_string);
+               break;
+
+       case G_TYPE_ULONG: {
+               GParamSpecULong *pulong = G_PARAM_SPEC_ULONG(param);
+               value_in_string = g_strdup_printf("%lu", g_value_get_ulong(&value));
+               ms_info("Got ulong value: [%s], range: %lu - %lu (default %s)",
+                               value_in_string, pulong->minimum, pulong->maximum);
+               break;
+       }
+
+       case G_TYPE_LONG: {
+               GParamSpecLong *plong = G_PARAM_SPEC_LONG(param);
+               value_in_string = g_strdup_printf("%ld", g_value_get_long(&value));
+               ms_info("Got long value: [%s], range: %ld - %ld (default %s)",
+                               value_in_string, plong->minimum, plong->maximum);
+               break;
+       }
+
+       case G_TYPE_UINT: {
+               GParamSpecUInt *puint = G_PARAM_SPEC_UINT(param);
+               value_in_string = g_strdup_printf("%u", g_value_get_uint(&value));
+               ms_info("Got uint value: [%s], range: %u - %u",
+                               value_in_string, puint->minimum, puint->maximum);
+               break;
+       }
+
+       case G_TYPE_INT: {
+               GParamSpecInt *pint = G_PARAM_SPEC_INT(param);
+               value_in_string = g_strdup_printf("%d", g_value_get_int(&value));
+               ms_info("Got int value: [%s], range: %d - %d",
+                               value_in_string, pint->minimum, pint->maximum);
+               break;
+       }
+
+       case G_TYPE_UINT64: {
+               GParamSpecUInt64 *puint64 = G_PARAM_SPEC_UINT64(param);
+               value_in_string = g_strdup_printf("%" G_GUINT64_FORMAT, g_value_get_uint64(&value));
+               ms_info("Got uint64 value: [%s], range: %" G_GUINT64_FORMAT "- %" G_GUINT64_FORMAT,
+                               value_in_string, puint64->minimum, puint64->maximum);
+               break;
+       }
+
+       case G_TYPE_INT64: {
+               GParamSpecInt64 *pint64 = G_PARAM_SPEC_INT64(param);
+               value_in_string = g_strdup_printf("%" G_GINT64_FORMAT, g_value_get_int64(&value));
+               ms_info("Got uint64 value: [%s], range: %" G_GINT64_FORMAT "- %" G_GINT64_FORMAT,
+                               value_in_string, pint64->minimum, pint64->maximum);
+               break;
+       }
+
+       case G_TYPE_FLOAT: {
+               GParamSpecFloat *pfloat = G_PARAM_SPEC_FLOAT(param);
+               value_in_string = g_strdup_printf("%15.7g", g_value_get_float(&value));
+               ms_info("Got float value: [%s], range:%15.7g -%15.7g",
+                               value_in_string, pfloat->minimum, pfloat->maximum);
+               break;
+       }
+
+       case G_TYPE_DOUBLE: {
+               GParamSpecDouble *pdouble = G_PARAM_SPEC_DOUBLE(param);
+               value_in_string = g_strdup_printf("%15.7g", g_value_get_double(&value));
+               ms_info("Got double value: [%s], range:%15.7g -%15.7g",
+                               value_in_string, pdouble->minimum, pdouble->maximum);
+               break;
+       }
+
+       default:
+               ms_info("Got unknown type with param->value_type [%d]", param->value_type);
+               break;
+       }
+
+       *string_value = value_in_string;
+}
+
 int __ms_node_write_params_into_bundle(media_streamer_node_s *node,
                                        bundle *param_list)
 {
@@ -505,8 +620,8 @@ int __ms_node_write_params_into_bundle(media_streamer_node_s *node,
        guint num_properties, i;
        char *string_val = NULL;
 
-       property_specs = g_object_class_list_properties
-                        (G_OBJECT_GET_CLASS(node->gst_element), &num_properties);
+       property_specs = g_object_class_list_properties(G_OBJECT_GET_CLASS(node->gst_element),
+                                                        &num_properties);
 
        if (num_properties <= 0) {
                return MEDIA_STREAMER_ERROR_INVALID_OPERATION;
@@ -526,98 +641,36 @@ int __ms_node_write_params_into_bundle(media_streamer_node_s *node,
                        continue;
                }
 
-               ms_info("%-20s: %s\n", g_param_spec_get_name(param), g_param_spec_get_blurb(param));
-
-               switch (G_VALUE_TYPE(&value)) {
-                       case G_TYPE_STRING:
-                               bundle_add_str(param_list, g_param_spec_get_name(param), g_value_get_string(&value));
-                               ms_info("Got string value: [%s]", g_value_get_string(&value));
-                               break;
-
-                       case G_TYPE_BOOLEAN:
-                               string_val = g_strdup_printf("%s", g_value_get_boolean(&value) ? "true" : "false");
-                               bundle_add_str(param_list, g_param_spec_get_name(param), string_val);
-                               ms_info("Got boolean value: [%s]", string_val);
-                               break;
-
-                       case G_TYPE_ULONG: {
-                                       GParamSpecULong *pulong = G_PARAM_SPEC_ULONG(param);
-                                       string_val = g_strdup_printf("%lu", g_value_get_ulong(&value));
-                                       bundle_add_str(param_list, g_param_spec_get_name(param), string_val);
-                                       ms_info("Got ulong value: [%s], range: %lu - %lu (default %s)",
-                                               string_val, pulong->minimum, pulong->maximum);
-                                       break;
-                               }
-
-                       case G_TYPE_LONG: {
-                                       GParamSpecLong *plong = G_PARAM_SPEC_LONG(param);
-                                       string_val = g_strdup_printf("%ld", g_value_get_long(&value));
-                                       bundle_add_str(param_list, g_param_spec_get_name(param), string_val);
-                                       ms_info("Got long value: [%s], range: %ld - %ld (default %s)",
-                                               string_val, plong->minimum, plong->maximum);
-                                       break;
-                               }
-
-                       case G_TYPE_UINT: {
-                                       GParamSpecUInt *puint = G_PARAM_SPEC_UINT(param);
-                                       string_val = g_strdup_printf("%u", g_value_get_uint(&value));
-                                       bundle_add_str(param_list, g_param_spec_get_name(param), string_val);
-                                       ms_info("Got uint value: [%s], range: %u - %u",
-                                               string_val, puint->minimum, puint->maximum);
-                                       break;
-                               }
-
-                       case G_TYPE_INT: {
-                                       GParamSpecInt *pint = G_PARAM_SPEC_INT(param);
-                                       string_val = g_strdup_printf("%d", g_value_get_int(&value));
-                                       bundle_add_str(param_list, g_param_spec_get_name(param), string_val);
-                                       ms_info("Got int value: [%s], range: %d - %d",
-                                               string_val, pint->minimum, pint->maximum);
-                                       break;
-                               }
-
-                       case G_TYPE_UINT64: {
-                                       GParamSpecUInt64 *puint64 = G_PARAM_SPEC_UINT64(param);
-                                       string_val = g_strdup_printf("%" G_GUINT64_FORMAT, g_value_get_uint64(&value));
-                                       bundle_add_str(param_list, g_param_spec_get_name(param), string_val);
-                                       ms_info("Got uint64 value: [%s], range: %" G_GUINT64_FORMAT "- %" G_GUINT64_FORMAT,
-                                               string_val, puint64->minimum, puint64->maximum);
-                                       break;
-                               }
-
-                       case G_TYPE_INT64: {
-                                       GParamSpecInt64 *pint64 = G_PARAM_SPEC_INT64(param);
-                                       string_val = g_strdup_printf("%" G_GINT64_FORMAT, g_value_get_int64(&value));
-                                       bundle_add_str(param_list, g_param_spec_get_name(param), string_val);
-                                       ms_info("Got uint64 value: [%s], range: %" G_GINT64_FORMAT "- %" G_GINT64_FORMAT,
-                                               string_val, pint64->minimum, pint64->maximum);
-                                       break;
-                               }
-
-                       case G_TYPE_FLOAT: {
-                                       GParamSpecFloat *pfloat = G_PARAM_SPEC_FLOAT(param);
-                                       string_val = g_strdup_printf("%15.7g", g_value_get_float(&value));
-                                       bundle_add_str(param_list, g_param_spec_get_name(param), string_val);
-                                       ms_info("Got float value: [%s], range:%15.7g -%15.7g",
-                                               string_val, pfloat->minimum, pfloat->maximum);
-                                       break;
-                               }
-
-                       case G_TYPE_DOUBLE: {
-                                       GParamSpecDouble *pdouble = G_PARAM_SPEC_DOUBLE(param);
-                                       string_val = g_strdup_printf("%15.7g", g_value_get_double(&value));
-                                       bundle_add_str(param_list, g_param_spec_get_name(param), string_val);
-                                       ms_info("Got double value: [%s], range:%15.7g -%15.7g",
-                                               string_val, pdouble->minimum, pdouble->maximum);
-                                       break;
-                               }
-
-                       default:
-                               ms_info("Got unknown type with param->value_type [%d]", param->value_type);
-                               break;
-
-                               MS_SAFE_FREE(string_val);
-               }
+               __ms_node_get_param_value(param, value, &string_val);
+
+               bundle_add_str(param_list, g_param_spec_get_name(param), string_val);
+       }
+
+       return MEDIA_STREAMER_ERROR_NONE;
+}
+
+int __ms_node_write_param_into_value(media_streamer_node_s *node,
+                                     const char *param_name, char **param_value)
+{
+       GParamSpec *property_specs;
+       char *string_val = NULL;
+
+       property_specs = g_object_class_find_property(G_OBJECT_GET_CLASS(node->gst_element),
+                                                      param_name);
+
+       ms_info("Getting parameter of the Node [%s]", node->name);
+
+       GValue value = { 0, };
+       GParamSpec *param = property_specs;
+
+       g_value_init(&value, param->value_type);
+       if (param->flags & G_PARAM_READWRITE) {
+               g_object_get_property(G_OBJECT(node->gst_element), param->name, &value);
        }
+
+       __ms_node_get_param_value(param, value, &string_val);
+
+       *param_value = string_val;
+
        return MEDIA_STREAMER_ERROR_NONE;
 }
index 37b5ddbf8151a9e8abca690334bbbecb407f24d7..e5e9271ac16cf8086b817b541e96d5282d2bddf0 100755 (executable)
@@ -47,7 +47,7 @@ int __ms_state_change(media_streamer_s *ms_streamer, media_streamer_state_e stat
                        }
                        break;
                case MEDIA_STREAMER_STATE_READY:
-                       ret = __ms_autoplug_prepare(ms_streamer);
+                       ret = __ms_element_set_state(ms_streamer->pipeline, GST_STATE_READY);
                        break;
                case MEDIA_STREAMER_STATE_PLAYING:
                        ret = __ms_element_set_state(ms_streamer->pipeline, GST_STATE_PLAYING);
@@ -150,13 +150,13 @@ void __ms_streamer_destroy(media_streamer_s *ms_streamer)
        MS_TABLE_SAFE_UNREF(ms_streamer->nodes_table);
 
        if (ms_streamer->sink_video_bin &&
-                       GST_OBJECT_PARENT(ms_streamer->sink_video_bin) != ms_streamer->pipeline) {
+                       GST_OBJECT_PARENT(ms_streamer->sink_video_bin) != GST_OBJECT(ms_streamer->pipeline)) {
                MS_SAFE_UNREF(ms_streamer->sink_video_bin);
                ms_info("sink_video_bin removed from pipeline");
        }
 
        if (ms_streamer->sink_audio_bin &&
-                       GST_OBJECT_PARENT(ms_streamer->sink_audio_bin) != ms_streamer->pipeline) {
+                       GST_OBJECT_PARENT(ms_streamer->sink_audio_bin) != GST_OBJECT(ms_streamer->pipeline)) {
                MS_SAFE_UNREF(ms_streamer->sink_audio_bin);
                ms_info("sink_audio_bin removed from pipeline");
        }
index 2b979c375e8af4e7763c43acd769b193b478e470..b3183721a79a70b405b7648f65d3265f1adf1159 100755 (executable)
@@ -69,7 +69,7 @@ static media_streamer_h current_media_streamer = &g_media_streamer;
 #define VIDEO_PORT 5000
 #define AUDIO_PORT 6000
 
-/*#define DISABLE_AUDIO */
+#define DISABLE_AUDIO
 /*#define DISABLE_VIDEO */
 
 /*---------------------------------------------------------------------------
@@ -157,6 +157,36 @@ static gboolean _play()
        return TRUE;
 }
 
+static gboolean _pause()
+{
+       g_print("== pause \n");
+       int ret = MEDIA_STREAMER_ERROR_NONE;
+
+       ret = media_streamer_pause(current_media_streamer);
+       if (ret != MEDIA_STREAMER_ERROR_NONE) {
+               g_print("Fail to pause media streamer");
+               return FALSE;
+       }
+       g_print("== success pause \n");
+
+       return TRUE;
+}
+
+static gboolean _stop()
+{
+       g_print("== stop \n");
+       int ret = MEDIA_STREAMER_ERROR_NONE;
+
+       ret = media_streamer_stop(current_media_streamer);
+       if (ret != MEDIA_STREAMER_ERROR_NONE) {
+               g_print("Fail to stop media streamer");
+               return FALSE;
+       }
+       g_print("== success stop \n");
+
+       return TRUE;
+}
+
 static gboolean _destroy(media_streamer_h streamer)
 {
        g_print("== destroy \n");
@@ -173,7 +203,6 @@ static gboolean _destroy(media_streamer_h streamer)
                return FALSE;
        }
 
-
        if (current_media_streamer == g_media_streamer) {
                g_media_streamer = NULL;
        } else {
@@ -234,14 +263,10 @@ static void set_rtp_params(media_streamer_node_h rtp_node,
        gchar *audio_sink_port = g_strdup_printf("%d", port_reverse ? audio_port : (audio_port + 5));
 
        if (g_menu_preset & PRESET_RTP_STREAMER) {
-               bundle_add_str(params, "audio_sink,port", audio_sink_port);
-               bundle_add_str(params, "audio_sink,host", ip);
+               bundle_add_str(params, MEDIA_STREAMER_PARAM_AUDIO_OUT_PORT, audio_sink_port);
        }
        if (g_menu_preset & PRESET_RTP_CLIENT) {
-               bundle_add_str(params, "audio_source,port", audio_src_port);
-               bundle_add_str(params, "audio_source,format",
-                              "application/x-rtp,media=audio,clock-rate=44100,encoding-name=L16,"
-                              "encoding-params=1,channels=1,payload=96");
+               bundle_add_str(params, MEDIA_STREAMER_PARAM_AUDIO_IN_PORT, audio_src_port);
        }
 
        g_free(audio_src_port);
@@ -253,20 +278,21 @@ static void set_rtp_params(media_streamer_node_h rtp_node,
        char *video_sink_port = g_strdup_printf("%d", port_reverse ? video_port : (video_port + 5));
 
        if (g_menu_preset & PRESET_RTP_STREAMER) {
-               bundle_add_str(params, "video_sink,port", video_sink_port);
-               bundle_add_str(params, "video_sink,host", ip);
+               bundle_add_str(params, MEDIA_STREAMER_PARAM_VIDEO_OUT_PORT, video_sink_port);
        }
        if (g_menu_preset & PRESET_RTP_CLIENT) {
-               bundle_add_str(params, "video_source,port", video_src_port);
-               bundle_add_str(params, "video_source,format",
-                              "application/x-rtp,media=video,clock-rate=90000,encoding-name=H264");
+               bundle_add_str(params, MEDIA_STREAMER_PARAM_VIDEO_IN_PORT, video_src_port);
        }
 
        g_free(video_src_port);
        g_free(video_sink_port);
 #endif
+       bundle_add_str(params, MEDIA_STREAMER_PARAM_HOST, ip);
 
        media_streamer_node_set_params(rtp_node, params);
+       media_streamer_node_set_pad_format(rtp_node, "video_in_rtp", vfmt_encoded);
+       media_streamer_node_set_pad_format(rtp_node, "audio_in_rtp", afmt_raw);
+
        bundle_free(params);
        params = NULL;
 }
@@ -281,7 +307,7 @@ static gboolean _create_rtp_streamer(media_streamer_node_h rtp_bin)
 #ifdef ONE_DEVICE_TEST
        if (g_menu_preset & SECOND_VOIP_MASK) {
                media_streamer_node_create_src(MEDIA_STREAMER_NODE_SRC_TYPE_VIDEO_TEST, &video_src);
-               media_streamer_node_set_param(video_src, "is-live", "true");
+               media_streamer_node_set_param(video_src, MEDIA_STREAMER_PARAM_IS_LIVE_STREAM, "true");
        } else {
                media_streamer_node_create_src(MEDIA_STREAMER_NODE_SRC_TYPE_CAMERA, &video_src);
        }
@@ -305,7 +331,7 @@ static gboolean _create_rtp_streamer(media_streamer_node_h rtp_bin)
        /*====================Linking Video Streamer=========================== */
        media_streamer_node_link(video_src, "src", video_enc, "sink");
        media_streamer_node_link(video_enc, "src", video_pay, "sink");
-       media_streamer_node_link(video_pay, "src", rtp_bin, "video_sink");
+       media_streamer_node_link(video_pay, "src", rtp_bin, "video_in");
        /*====================================================================== */
 
        g_print("== success streamer video part \n");
@@ -331,7 +357,7 @@ static gboolean _create_rtp_streamer(media_streamer_node_h rtp_bin)
        /*====================Linking Audio Streamer========================== */
        media_streamer_node_link(audio_src, "src", audio_enc, "sink");
        media_streamer_node_link(audio_enc, "src", audio_pay, "sink");
-       media_streamer_node_link(audio_pay, "src", rtp_bin, "audio_sink");
+       media_streamer_node_link(audio_pay, "src", rtp_bin, "audio_in");
        /*====================================================================== */
 
        g_print("== success streamer audio part \n");
@@ -349,10 +375,10 @@ static gboolean _create_rtp_streamer_autoplug(media_streamer_node_h rtp_bin)
        media_streamer_node_h video_src = NULL;
 #ifdef ONE_DEVICE_TEST
        if (g_menu_preset & SECOND_VOIP_MASK) {
-               media_streamer_node_create_src(MEDIA_STREAMER_SRC_TYPE_VIDEO_TEST, &video_src);
-               media_streamer_node_set_single_param(video_src, "is-live", "true");
+               media_streamer_node_create_src(MEDIA_STREAMER_NODE_SRC_TYPE_VIDEO_TEST, &video_src);
+               media_streamer_node_set_param(video_src, MEDIA_STREAMER_PARAM_IS_LIVE_STREAM, "true");
        } else {
-               media_streamer_node_create_src(MEDIA_STREAMER_SRC_TYPE_CAMERA, &video_src);
+               media_streamer_node_create_src(MEDIA_STREAMER_NODE_SRC_TYPE_CAMERA, &video_src);
        }
 #else
        media_streamer_node_create_src(MEDIA_STREAMER_NODE_SRC_TYPE_CAMERA, &video_src);
@@ -398,7 +424,7 @@ static gboolean _create_rtp_client(media_streamer_node_h rtp_bin)
        /*====================Linking Video Client=========================== */
        media_streamer_node_link(video_depay, "src", video_dec, "sink");
        media_streamer_node_link(video_dec, "src", video_sink, "sink");
-       /*      media_streamer_node_link(rtp_bin, "video_source", video_depay,"sink"); */
+       /*      media_streamer_node_link(rtp_bin, "video_out", video_depay,"sink"); */
 
        g_print("== success client video part \n");
 #endif
@@ -428,7 +454,7 @@ static gboolean _create_rtp_client(media_streamer_node_h rtp_bin)
        media_streamer_node_link(audio_depay, "src", audio_converter, "sink");
        media_streamer_node_link(audio_converter, "src", audio_res, "sink");
        media_streamer_node_link(audio_res, "src", audio_sink, "sink");
-       /*media_streamer_node_link(rtp_bin, "audio_source", audio_depay,"sink"); */
+       /*media_streamer_node_link(rtp_bin, "audio_out", audio_depay,"sink"); */
        /*====================================================================== */
 
        g_print("== success client audio part \n");
@@ -463,10 +489,9 @@ static gboolean _create_rtp_client_autoplug(media_streamer_node_h rtp_bin)
 }
 
 
-static media_streamer_node_h _create_rtp(
-    int video_port,
-    int audio_port,
-    gboolean second_client)
+static media_streamer_node_h _create_rtp(int video_port,
+                                         int audio_port,
+                                         gboolean second_client)
 {
        g_print("== create rtp node for current preset \n");
 
@@ -478,6 +503,7 @@ static media_streamer_node_h _create_rtp(
        return rtp_bin;
 }
 
+#if 0
 /* Application source callback */
 static void buffer_status_cb(media_streamer_node_h node,
                media_streamer_custom_buffer_status_e status,
@@ -492,7 +518,7 @@ static void buffer_status_cb(media_streamer_node_h node,
                guint64 size = strlen(test);
 
                media_packet_h packet;
-               media_packet_create_from_external_memory(&vfmt_encoded,
+               media_packet_create_from_external_memory(vfmt_encoded,
                                (void *)test, size, NULL, NULL, &packet);
                media_streamer_node_push_packet(node, packet);
                count++;
@@ -509,7 +535,7 @@ static void new_buffer_cb(media_streamer_node_h node, void *user_data)
        media_packet_h packet;
 
        media_streamer_node_pull_packet(node, &packet);
-       media_packet_get_buffer_data_ptr(packet, &received_data);
+       media_packet_get_buffer_data_ptr(packet, (void **)&received_data);
        g_print("Received new packet from appsink with data [%s]\n", received_data);
 
        media_packet_destroy(packet);
@@ -548,17 +574,12 @@ static gboolean _create_app_test()
 
        return TRUE;
 }
+#endif
 
 /***************************************************************/
 /**  Testsuite */
 /***************************************************************/
 
-void quit()
-{
-       reset_current_menu_state();
-       g_main_loop_quit(g_loop);
-}
-
 /*
  * Function resets menu state to the main menu state
  * and cleans media streamer handle.
@@ -585,6 +606,12 @@ void reset_current_menu_state(void)
        }
 }
 
+void quit()
+{
+       reset_current_menu_state();
+       g_main_loop_quit(g_loop);
+}
+
 static void display_getting_ip_menu(void)
 {
        g_print("\n");
@@ -613,7 +640,9 @@ static void display_preset_menu(void)
        g_print("4. prepare \n");
        g_print("5. unprepare \n");
        g_print("6. play \n");
-       g_print("7. destroy media streamer \n\n");
+       g_print("7. pause \n");
+       g_print("8. stop \n");
+       g_print("9. destroy media streamer \n\n");
        g_print("b. back \n");
        g_print("----------------------------------------------------\n");
        g_print("====================================================\n");
@@ -772,7 +801,6 @@ void _interpret_main_menu(char *cmd)
        }
 }
 
-/*=====================Broadcast Menu============================// */
 void _interpret_broadcast_menu(char *cmd)
 {
        int len = strlen(cmd);
@@ -840,7 +868,7 @@ void _interpret_getting_ip_menu(char *cmd)
 
        if (cmd_len > min_len) {
                g_broadcast_address = g_strdup(cmd);
-               g_print("== IP address setted to [%s]\n", g_broadcast_address);
+               g_print("== IP address set to [%s]\n", g_broadcast_address);
        } else {
                g_broadcast_address = g_strdup(DEFAULT_IP_ADDR);
                g_print("Invalid IP. Default address will be used [%s]\n", DEFAULT_IP_ADDR);
@@ -852,10 +880,8 @@ void _interpret_getting_ip_menu(char *cmd)
 
 void _interpret_autoplug_menu(char *cmd)
 {
-
        int cmd_number = atoi(cmd) - 1;
 
-
        if (cmd_number == 1 || cmd_number == 0) {
                g_autoplug_mode = cmd_number;
        } else {
@@ -899,6 +925,10 @@ void _interpret_preset_menu(char *cmd)
                } else if (!strncmp(cmd, "6", len)) {
                        _play(g_media_streamer);
                } else if (!strncmp(cmd, "7", len)) {
+                       _pause(g_media_streamer);
+               } else if (!strncmp(cmd, "8", len)) {
+                       _stop(g_media_streamer);
+               } else if (!strncmp(cmd, "9", len)) {
                        _destroy(current_media_streamer);
                } else if (!strncmp(cmd, "b", len)) {
                        if (g_menu_preset & DOUBLE_STREAMER_MASK) {
@@ -970,7 +1000,6 @@ gboolean input(GIOChannel *channel)
        interpret_cmd(buf);
 
        return TRUE;
-
 }
 
 int main(int argc, char **argv)