Add internal function - ms_find_element_in_bin_by_type() 24/235024/1
authorSangchul Lee <sc11.lee@samsung.com>
Mon, 1 Jun 2020 02:30:43 +0000 (11:30 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Mon, 1 Jun 2020 02:34:03 +0000 (11:34 +0900)
__ms_bin_find_element_by_type() is renamed to
__ms_bin_find_element_and_link_by_type()

[Version] 0.1.49
[Issue Type] New feature

Change-Id: I09948cb17ce496fa9c42e2a14077080825c12266
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
include/media_streamer_gst.h
packaging/capi-media-streamer.spec
src/media_streamer_gst.c

index e722cb7..e2bb4b9 100644 (file)
@@ -176,6 +176,8 @@ int ms_element_pull_packet(GstElement *sink_element, media_packet_h *packet);
  */
 int ms_find_type(media_streamer_s *ms_streamer, GstElement *element);
 
+GstElement *ms_find_element_in_bin_by_type(GstElement *bin, node_info_s *node_klass_type);
+
 void ms_rtpbin_pad_added_cb(GstElement *element, GstPad *new_pad, gpointer user_data);
 
 void ms_demux_pad_added_cb(GstElement *element, GstPad *new_pad, gpointer user_data);
index 7510d93..c315509 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-streamer
 Summary:    A Media Streamer API
-Version:    0.1.48
+Version:    0.1.49
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index b925b23..8c2ea4a 100644 (file)
@@ -436,7 +436,7 @@ static gboolean __ms_link_two_elements(GstElement *previous_element, GstPad *pre
        return elements_linked;
 }
 
-static GstElement *__ms_bin_find_element_by_type(GstElement *previous_element, GstPad *prev_elem_src_pad, GstElement *search_bin, node_info_s *node_klass_type)
+static GstElement *__ms_bin_find_element_and_link_by_type(GstElement *previous_element, GstPad *prev_elem_src_pad, GstElement *search_bin, node_info_s *node_klass_type)
 {
        GValue element_value = G_VALUE_INIT;
        GstElement *found_element = NULL;
@@ -458,7 +458,8 @@ static GstElement *__ms_bin_find_element_by_type(GstElement *previous_element, G
                found_klass = gst_element_factory_get_klass(gst_element_get_factory(found_element));
 
                /* Check if found element is of appropriate needed plugin class */
-               if (g_strrstr(found_klass, node_klass_type->klass_name) || g_strrstr(GST_ELEMENT_NAME(found_element), node_klass_type->default_name)) {
+               if (g_strrstr(found_klass, node_klass_type->klass_name) ||
+                       g_strrstr(GST_ELEMENT_NAME(found_element), node_klass_type->default_name)) {
                        ms_info("Found element by type [%s]", GST_ELEMENT_NAME(found_element));
                        if (__ms_link_two_elements(previous_element, prev_elem_src_pad, found_element)) {
                                elements_linked = TRUE;
@@ -478,6 +479,44 @@ static GstElement *__ms_bin_find_element_by_type(GstElement *previous_element, G
        return elements_linked ? found_element : NULL;
 }
 
+GstElement *ms_find_element_in_bin_by_type(GstElement *bin, node_info_s *node_klass_type)
+{
+       GValue element_value = G_VALUE_INIT;
+       GstElement *found_element = NULL;
+       GstElement *next_element = NULL;
+       const gchar *found_klass = NULL;
+       GstIterator *bin_iterator = NULL;
+
+       ms_debug_fenter();
+
+       ms_retvm_if(!bin, NULL, "bin is NULL");
+       ms_retvm_if(!node_klass_type, NULL, "node_klass_type is NULL");
+       ms_retvm_if(!node_klass_type->default_name, NULL, "node_klass_type->default_name is NULL");
+
+       bin_iterator = gst_bin_iterate_sorted(GST_BIN(bin));
+
+       while (GST_ITERATOR_OK == gst_iterator_next(bin_iterator, &element_value)) {
+               next_element = (GstElement *) g_value_get_object(&element_value);
+               found_klass = gst_element_factory_get_klass(gst_element_get_factory(found_element));
+
+               /* Check if found element is of appropriate needed plugin class */
+               if (g_strrstr(found_klass, node_klass_type->klass_name) ||
+                       g_strrstr(GST_ELEMENT_NAME(next_element), node_klass_type->default_name)) {
+                       ms_info("Found element by type [%s]", GST_ELEMENT_NAME(next_element));
+                       found_element = next_element;
+                       break;
+               }
+
+               g_value_reset(&element_value);
+       }
+
+       gst_iterator_free(bin_iterator);
+
+       ms_debug_fleave();
+
+       return found_element;
+}
+
 static int __ms_factory_rank_compare(GstPluginFeature *first_feature, GstPluginFeature *second_feature)
 {
        ms_debug_fenter();
@@ -511,7 +550,7 @@ GstElement *ms_combine_next_element(GstElement *previous_element, GstPad *prev_e
 
        /* - 2 - If previous element is not linked  - find in bin by type */
        if (!found_element)
-               found_element = __ms_bin_find_element_by_type(previous_element, prev_elem_src_pad, bin_to_find_in, node_klass_type);
+               found_element = __ms_bin_find_element_and_link_by_type(previous_element, prev_elem_src_pad, bin_to_find_in, node_klass_type);
 
        /* - 3 - If element by type is not found in bin - create element by type */
        if (!found_element) {
@@ -691,7 +730,8 @@ static void __decodebin_nomore_pads_combine(GstPad *src_pad, media_streamer_s *m
        new_pad_type = ms_get_pad_type(src_pad);
 
        if (MS_ELEMENT_IS_VIDEO(new_pad_type)) {
-               if (__ms_bin_find_element_by_type(found_element, src_pad, ms_streamer->transform_bin, ms_node_get_klass_by_its_type(MEDIA_STREAMER_NODE_TYPE_TEXT_OVERLAY))) {
+               if (__ms_bin_find_element_and_link_by_type(found_element, src_pad, ms_streamer->transform_bin,
+                                                       ms_node_get_klass_by_its_type(MEDIA_STREAMER_NODE_TYPE_TEXT_OVERLAY))) {
                        found_element = ms_combine_next_element(found_element, src_pad, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_TEXT_OVERLAY);
                        src_pad = NULL;
                }
@@ -834,7 +874,8 @@ static gboolean __ms_sink_bin_prepare(media_streamer_s *ms_streamer, GstPad *src
        if (MS_ELEMENT_IS_VIDEO(src_pad_type)) {
                gst_object_ref(parent_rtp_element);
                found_element = ms_combine_next_element(parent_rtp_element, src_pad, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_DEPAY);
-               decoder_element = __ms_bin_find_element_by_type(found_element, NULL, ms_streamer->transform_bin, ms_node_get_klass_by_its_type(MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER));
+               decoder_element = __ms_bin_find_element_and_link_by_type(found_element, NULL, ms_streamer->transform_bin,
+                                                                       ms_node_get_klass_by_its_type(MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER));
 
                if (!decoder_element) {
                        if (ms_streamer->ini.use_decodebin) {