From 647912ae4a88f27627d16500aaf39e6bf84047f7 Mon Sep 17 00:00:00 2001 From: Sangchul Lee Date: Mon, 1 Jun 2020 11:30:43 +0900 Subject: [PATCH] Add internal function - ms_find_element_in_bin_by_type() __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 --- include/media_streamer_gst.h | 2 ++ packaging/capi-media-streamer.spec | 2 +- src/media_streamer_gst.c | 51 ++++++++++++++++++++++++++++++++++---- 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/include/media_streamer_gst.h b/include/media_streamer_gst.h index e722cb7..e2bb4b9 100644 --- a/include/media_streamer_gst.h +++ b/include/media_streamer_gst.h @@ -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); diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index 7510d93..c315509 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -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 diff --git a/src/media_streamer_gst.c b/src/media_streamer_gst.c index b925b23..8c2ea4a 100644 --- a/src/media_streamer_gst.c +++ b/src/media_streamer_gst.c @@ -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) { -- 2.7.4