From: hj kim Date: Thu, 28 Jul 2022 04:55:48 +0000 (+0900) Subject: webrtc_source_file: remove all elements in filesrc pipeline except filesrc and decodebin X-Git-Tag: submit/tizen/20220802.115810~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d3dd341df0dc6fa87d0bf83957a68e657429933f;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_source_file: remove all elements in filesrc pipeline except filesrc and decodebin 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 --- diff --git a/include/webrtc_private.h b/include/webrtc_private.h index 48d4c1d6..b7d18603 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -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); diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index 2b8b3ab6..9e4f3c9b 100644 --- a/packaging/capi-media-webrtc.spec +++ b/packaging/capi-media-webrtc.spec @@ -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 diff --git a/src/webrtc_source.c b/src/webrtc_source.c index 2dc107ec..0fb883a7 100644 --- a/src/webrtc_source.c +++ b/src/webrtc_source.c @@ -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); diff --git a/src/webrtc_source_file.c b/src/webrtc_source_file.c index 471cb4d1..b205c222 100644 --- a/src/webrtc_source_file.c +++ b/src/webrtc_source_file.c @@ -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)