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;
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;
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();
/* - 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) {
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;
}
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) {