webrtc_source_file: remove all elements in filesrc pipeline except filesrc and decodebin 19/278919/10
authorhj kim <backto.kim@samsung.com>
Thu, 28 Jul 2022 04:55:48 +0000 (13:55 +0900)
committerhj kim <backto.kim@samsung.com>
Tue, 2 Aug 2022 03:26:10 +0000 (12:26 +0900)
The result of the operation is same now.
However, there is no need to care about the elements can be added/deleted.

[Version] 0.3.185
[Issue Type] Improvement

Change-Id: I50e74b4db3738374d3bbeaf558e773ba7b13f17f

include/webrtc_private.h
packaging/capi-media-webrtc.spec
src/webrtc_source.c
src/webrtc_source_file.c

index 48d4c1d6fa5e28433741e9d9fa0528d3da548c81..b7d1860374daab02a78072212d290a4c5a37595d 100644 (file)
@@ -652,7 +652,7 @@ int _remove_filesrc_pad_block_probe(webrtc_s *webrtc);
 void _set_filesrc_media_types(webrtc_gst_slot_s *source, const char *path);
 int _build_filesrc_pipeline(webrtc_s *webrtc, webrtc_gst_slot_s *source);
 void _destroy_filesrc_pipeline(webrtc_gst_slot_s *source);
-void _remove_rest_of_elements_for_filesrc_pipeline(webrtc_gst_slot_s *source, bool is_audio);
+void _remove_rest_of_elements_for_filesrc_pipeline(webrtc_gst_slot_s *source);
 
 /* media packet source */
 int _build_mediapacketsrc(webrtc_s *webrtc, webrtc_gst_slot_s *source);
index 2b8b3ab6f329e9cb8de31b07b4296d89dda5cd7f..9e4f3c9b94a379da11e2774ea8a815ab366d96ab 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.3.184
+Version:    0.3.185
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 2dc107ec9550dee7200451ea8a0d548efb434504..0fb883a70e61e21fabaf3ff5f2a4603465b7367d 100644 (file)
@@ -1587,8 +1587,6 @@ static void __release_filesrc_resources(webrtc_gst_slot_s *source)
                        SAFE_GST_OBJECT_UNREF(source->av[av_idx].render.pipeline);
                }
 
-               _remove_rest_of_elements_for_filesrc_pipeline(source, (av_idx == AV_IDX_AUDIO));
-
                if ((appsrc = gst_bin_get_by_name(source->bin, _get_element_name(av_idx, ELEMENT_APPSRC))))
                        APPEND_ELEMENT(element_list, appsrc);
                else
@@ -1609,6 +1607,8 @@ static void __release_filesrc_resources(webrtc_gst_slot_s *source)
                SAFE_G_LIST_FREE(element_list);
        }
 
+       _remove_rest_of_elements_for_filesrc_pipeline(source);
+
        if (source->display)
                _release_display(source->display);
 
index 471cb4d1c8eb4e7407d105065c820577aa4a697d..b205c222c1addb7b0a63226cbf732e4fd3a5aed1 100644 (file)
@@ -335,45 +335,47 @@ exit:
        return WEBRTC_ERROR_INVALID_OPERATION;
 }
 
-void _remove_rest_of_elements_for_filesrc_pipeline(webrtc_gst_slot_s *source, bool is_audio)
+void _remove_rest_of_elements_for_filesrc_pipeline(webrtc_gst_slot_s *source)
 {
-       GstBin *bin;
-       GstElement *queue;
-       GstElement *payloader;
-       GstElement *capsfilter;
-       GstElement *fakesink;
-       GList *element_list = NULL;
-       int av_idx = GET_AV_IDX(is_audio);
+       GstBin *bin = NULL;
+       GstIterator *iter = NULL;
+       GstIteratorResult result;
+       GValue value = { 0 };
+       GstElement *elem = NULL;
 
        RET_IF(source == NULL, "pad is NULL");
-       RET_IF(source->webrtc == NULL, "webrtc is NULL");
        RET_IF(source->filesrc_pipeline == NULL, "filesrc_pipeline is NULL");
 
        bin = GST_BIN(source->filesrc_pipeline);
 
-       if ((queue = gst_bin_get_by_name(bin, _get_element_name(av_idx, ELEMENT_QUEUE))))
-               APPEND_ELEMENT(element_list, queue);
-       else
-               LOG_ERROR("queue is NULL");
+       iter = gst_bin_iterate_elements(bin);
+
+       do {
+               switch ((result = gst_iterator_next (iter, &value))) {
+               case GST_ITERATOR_OK:
+                       elem = (GstElement *) g_value_get_object(&value);
+                       if (!g_strrstr(GST_ELEMENT_NAME(elem), ELEMENT_NAME_FILE_SRC) && !g_strrstr(GST_ELEMENT_NAME(elem), "decodebin"))
+                               gst_bin_remove(bin, elem);
+                       g_value_unset (&value);
+                       break;
 
-       if ((payloader = gst_bin_get_by_name(bin, _get_element_name(av_idx, ELEMENT_PAYLOADER))))
-               APPEND_ELEMENT(element_list, payloader);
-       else
-               LOG_ERROR("payloader is NULL");
+               case GST_ITERATOR_RESYNC:
+                       gst_iterator_resync(iter);
+                       break;
 
-       if ((capsfilter = gst_bin_get_by_name(bin, _get_element_name(av_idx, ELEMENT_CAPSFILTER))))
-               APPEND_ELEMENT(element_list, capsfilter);
-       else
-               LOG_ERROR("capsfilter is NULL");
+               case GST_ITERATOR_ERROR:
+                       LOG_ERROR("error in iterating elements");
+                       break;
 
-       if ((fakesink = gst_bin_get_by_name(bin, _get_element_name(av_idx, ELEMENT_FAKESINK))))
-               APPEND_ELEMENT(element_list, fakesink);
-       else
-               LOG_ERROR("fakesink is NULL");
+               case GST_ITERATOR_DONE:
+                       break;
 
-       _remove_elements_from_bin(bin, element_list);
+               default:
+                       break;
+               }
+       } while (result == GST_ITERATOR_OK || result == GST_ITERATOR_RESYNC);
 
-       SAFE_G_LIST_FREE(element_list);
+       gst_iterator_free(iter);
 }
 
 static gboolean __filesrc_pipeline_bus_watch_cb(GstBus *bus, GstMessage *message, gpointer user_data)