From: Sangchul Lee Date: Mon, 8 Nov 2021 01:29:05 +0000 (+0900) Subject: webrtc_source: Use list to carry elements to remove these from file source X-Git-Tag: submit/tizen_6.5/20211124.101818~5 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ac1af648f580c7bff8f72202c2a9e41503ee65e4;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_source: Use list to carry elements to remove these from file source Variable and function are also renamed to use 'payloader' not 'payload'. [Version] 0.2.148 [Issue Type] Refactoring Change-Id: Iaf165625dc135d2e0248e3c103ffc0aa9775bcd4 Signed-off-by: Sangchul Lee --- diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index 1ba56a99..23c3c28e 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.2.147 +Version: 0.2.148 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_source.c b/src/webrtc_source.c index 63f6312d..532d7a4a 100644 --- a/src/webrtc_source.c +++ b/src/webrtc_source.c @@ -28,39 +28,38 @@ #define GST_KLASS_NAME_CONVERTER_AUDIO "Filter/Converter/Audio" #define GST_KLASS_NAME_CONVERTER_VIDEO "Filter/Converter/Video" -#define DEFAULT_ELEMENT_CAMERASRC "v4l2src" -#define DEFAULT_ELEMENT_AUDIOSRC "pulsesrc" -#define DEFAULT_ELEMENT_VIDEOTESTSRC "videotestsrc" -#define DEFAULT_ELEMENT_AUDIOTESTSRC "audiotestsrc" -#define DEFAULT_ELEMENT_APPSRC "appsrc" -#define DEFAULT_ELEMENT_SCREENSRC "waylandsrc" -#define DEFAULT_ELEMENT_QUEUE "queue" -#define DEFAULT_ELEMENT_VOLUME "volume" -#define DEFAULT_ELEMENT_INPUT_SELECTOR "input-selector" -#define DEFAULT_ELEMENT_VIDEOCROP "videocrop" -#define DEFAULT_ELEMENT_FILESRC "filesrc" - - -#define ELEMENT_NAME_FIRST_CAPSFILTER "firstCapsfilter" -#define ELEMENT_NAME_RTP_CAPSFILTER "rtpCapsfilter" -#define ELEMENT_NAME_VIDEO_SRC "videoSrc" -#define ELEMENT_NAME_VIDEO_SWITCH "videoSwitch" -#define ELEMENT_NAME_VIDEO_MUTE_SRC "videoMuteSrc" -#define ELEMENT_NAME_VOLUME "volume" -#define ELEMENT_NAME_MIC_SRC "micSrc" -#define DEFAULT_NAME_FILE_SRC "fileSrc" -#define DEFAULT_NAME_AUDIO_QUEUE "audioQueue" -#define DEFAULT_NAME_VIDEO_QUEUE "videoQueue" -#define DEFAULT_NAME_AUDIO_CAPSFILTER "audioCapsfilter" -#define DEFAULT_NAME_VIDEO_CAPSFILTER "videoCapsfilter" -#define DEFAULT_NAME_AUDIO_PAYLOAD "audioPayload" -#define DEFAULT_NAME_VIDEO_PAYLOAD "videoPayload" -#define DEFAULT_NAME_VIDEOCROP "videoCrop" -#define DEFAULT_NAME_SCREENSRC "waylandSrc" -#define DEFAULT_NAME_AUDIO_FAKESINK "audioFakeSink" -#define DEFAULT_NAME_VIDEO_FAKESINK "videoFakeSink" -#define DEFAULT_NAME_AUDIO_APPSRC "audioAppsrc" -#define DEFAULT_NAME_VIDEO_APPSRC "videoAppsrc" +#define DEFAULT_ELEMENT_CAMERASRC "v4l2src" +#define DEFAULT_ELEMENT_AUDIOSRC "pulsesrc" +#define DEFAULT_ELEMENT_VIDEOTESTSRC "videotestsrc" +#define DEFAULT_ELEMENT_AUDIOTESTSRC "audiotestsrc" +#define DEFAULT_ELEMENT_APPSRC "appsrc" +#define DEFAULT_ELEMENT_SCREENSRC "waylandsrc" +#define DEFAULT_ELEMENT_QUEUE "queue" +#define DEFAULT_ELEMENT_VOLUME "volume" +#define DEFAULT_ELEMENT_INPUT_SELECTOR "input-selector" +#define DEFAULT_ELEMENT_VIDEOCROP "videocrop" +#define DEFAULT_ELEMENT_FILESRC "filesrc" + +#define ELEMENT_NAME_FIRST_CAPSFILTER "firstCapsfilter" +#define ELEMENT_NAME_RTP_CAPSFILTER "rtpCapsfilter" +#define ELEMENT_NAME_VIDEO_SRC "videoSrc" +#define ELEMENT_NAME_VIDEO_SWITCH "videoSwitch" +#define ELEMENT_NAME_VIDEO_MUTE_SRC "videoMuteSrc" +#define ELEMENT_NAME_VOLUME "volume" +#define ELEMENT_NAME_MIC_SRC "micSrc" +#define DEFAULT_NAME_FILE_SRC "fileSrc" +#define DEFAULT_NAME_AUDIO_QUEUE "audioQueue" +#define DEFAULT_NAME_VIDEO_QUEUE "videoQueue" +#define DEFAULT_NAME_AUDIO_CAPSFILTER "audioCapsfilter" +#define DEFAULT_NAME_VIDEO_CAPSFILTER "videoCapsfilter" +#define DEFAULT_NAME_AUDIO_PAYLOADER "audioPayloader" +#define DEFAULT_NAME_VIDEO_PAYLOADER "videoPayloader" +#define DEFAULT_NAME_VIDEOCROP "videoCrop" +#define DEFAULT_NAME_SCREENSRC "waylandSrc" +#define DEFAULT_NAME_AUDIO_FAKESINK "audioFakeSink" +#define DEFAULT_NAME_VIDEO_FAKESINK "videoFakeSink" +#define DEFAULT_NAME_AUDIO_APPSRC "audioAppsrc" +#define DEFAULT_NAME_VIDEO_APPSRC "videoAppsrc" #define APPEND_ELEMENT(x_list, x_element) \ do { \ @@ -106,7 +105,7 @@ static direction_info_s __direction_info[] = { typedef struct { const char *appsrc_name; const char *queue_name; - const char *payload_name; + const char *payloader_name; const char *capsfilter_name; const char *fakesink_name; } av_mapping_table_s; @@ -115,14 +114,14 @@ static av_mapping_table_s _av_tbl[AV_IDX_MAX] = { { DEFAULT_NAME_AUDIO_APPSRC, DEFAULT_NAME_AUDIO_QUEUE, - DEFAULT_NAME_AUDIO_PAYLOAD, + DEFAULT_NAME_AUDIO_PAYLOADER, DEFAULT_NAME_AUDIO_CAPSFILTER, DEFAULT_NAME_AUDIO_FAKESINK, }, { DEFAULT_NAME_VIDEO_APPSRC, DEFAULT_NAME_VIDEO_QUEUE, - DEFAULT_NAME_VIDEO_PAYLOAD, + DEFAULT_NAME_VIDEO_PAYLOADER, DEFAULT_NAME_VIDEO_CAPSFILTER, DEFAULT_NAME_VIDEO_FAKESINK, } @@ -1762,30 +1761,41 @@ exit: static void __remove_rest_of_elements_for_filesrc_pipeline(webrtc_gst_slot_s *source, bool is_audio) { - GstBin *bin = NULL; - GstElement *queue = NULL; - GstElement *payload = NULL; - GstElement *capsfilter = NULL; - GstElement *fakesink = NULL; + GstBin *bin; + GstElement *queue; + GstElement *payloader; + GstElement *capsfilter; + GstElement *fakesink; + GList *element_list = NULL; int av_idx = GET_AV_IDX(is_audio); RET_IF(source == NULL, "pad is NULL"); bin = GST_BIN(source->filesrc_pipeline); - queue = gst_bin_get_by_name(bin, _av_tbl[av_idx].queue_name); - RET_IF(queue == NULL, "queue is NULL"); + if ((queue = gst_bin_get_by_name(bin, _av_tbl[av_idx].queue_name))) + APPEND_ELEMENT(element_list, queue); + else + LOG_ERROR("queue is NULL"); - payload = gst_bin_get_by_name(bin, _av_tbl[av_idx].payload_name); - RET_IF(payload == NULL, "payload is NULL"); + if ((payloader = gst_bin_get_by_name(bin, _av_tbl[av_idx].payloader_name))) + APPEND_ELEMENT(element_list, payloader); + else + LOG_ERROR("payloader is NULL"); - capsfilter = gst_bin_get_by_name(bin, _av_tbl[av_idx].capsfilter_name); - RET_IF(capsfilter == NULL, "capsfilter is NULL"); + if ((capsfilter = gst_bin_get_by_name(bin, _av_tbl[av_idx].capsfilter_name))) + APPEND_ELEMENT(element_list, capsfilter); + else + LOG_ERROR("capsfilter is NULL"); - fakesink = gst_bin_get_by_name(bin, _av_tbl[av_idx].fakesink_name); - RET_IF(fakesink == NULL, "fakesink is NULL"); + if ((fakesink = gst_bin_get_by_name(bin, _av_tbl[av_idx].fakesink_name))) + APPEND_ELEMENT(element_list, fakesink); + else + LOG_ERROR("fakesink is NULL"); + + __remove_elements_from_bin(bin, element_list); - gst_bin_remove_many(bin, queue, payload, capsfilter, fakesink, NULL); + SAFE_G_LIST_FREE(element_list); } static void __filesrc_pipeline_audio_stream_handoff_cb(GstElement *object, GstBuffer *buffer, GstPad *pad, gpointer data) @@ -1833,23 +1843,23 @@ static GstPadProbeReturn __fakesink_probe_cb(GstPad *pad, GstPadProbeInfo *info return GST_PAD_PROBE_REMOVE; } -static GstElement * __create_payload_for_filesrc_pipeline(GstPad *pad, bool is_audio) +static GstElement * __create_payloader_for_filesrc_pipeline(GstPad *pad, bool is_audio) { element_info_s elem_info; - GstElement *payload = NULL; + GstElement *payloader = NULL; RET_VAL_IF(pad == NULL, NULL, "pad is NULL"); CREATE_ELEMENT_FROM_REGISTRY(elem_info, GST_KLASS_NAME_PAYLOADER_RTP, gst_pad_get_current_caps(pad), NULL, - payload); + payloader); - RET_VAL_IF(payload == NULL, NULL, "payload is NULL"); + RET_VAL_IF(payloader == NULL, NULL, "payloader is NULL"); - gst_element_set_name(payload, _av_tbl[GET_AV_IDX(is_audio)].payload_name); + gst_element_set_name(payloader, _av_tbl[GET_AV_IDX(is_audio)].payloader_name); - return payload; + return payloader; } static GstElement * __prepare_capsfilter_for_filesrc_pipeline(webrtc_gst_slot_s *source, bool is_audio) @@ -1908,11 +1918,11 @@ static GstElement * __prepare_fakesink_for_filesrc_pipeline(webrtc_gst_slot_s *s static int __create_rest_of_elements_for_filesrc_pipeline(webrtc_gst_slot_s *source, GstPad *pad, bool is_audio) { - GstBin *bin = NULL; - GstElement *queue = NULL; - GstElement *payload = NULL; - GstElement *capsfilter = NULL; - GstElement *fakesink = NULL; + GstBin *bin; + GstElement *queue; + GstElement *payloader; + GstElement *capsfilter; + GstElement *fakesink; GList *element_list = NULL; RET_VAL_IF(source == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "source is NULL"); @@ -1924,9 +1934,9 @@ static int __create_rest_of_elements_for_filesrc_pipeline(webrtc_gst_slot_s *sou return WEBRTC_ERROR_INVALID_OPERATION; APPEND_ELEMENT(element_list, queue); - if (!(payload = __create_payload_for_filesrc_pipeline(pad, is_audio))) + if (!(payloader = __create_payloader_for_filesrc_pipeline(pad, is_audio))) goto exit; - APPEND_ELEMENT(element_list, payload); + APPEND_ELEMENT(element_list, payloader); if (!(capsfilter = __prepare_capsfilter_for_filesrc_pipeline(source, is_audio))) goto exit; @@ -3097,6 +3107,8 @@ static void __release_filesrc_resources(webrtc_gst_slot_s *source) gst_element_foreach_src_pad(GST_ELEMENT(source->bin), __foreach_src_pad_cb, source); for (av_idx = 0; av_idx < AV_IDX_MAX; av_idx++) { + GList *element_list = NULL; + if (source->av[av_idx].src_pad_probe_id == 0) continue; @@ -3113,19 +3125,24 @@ static void __release_filesrc_resources(webrtc_gst_slot_s *source) __remove_rest_of_elements_for_filesrc_pipeline(source, (av_idx == AV_IDX_AUDIO)); - appsrc = gst_bin_get_by_name(source->bin, _av_tbl[av_idx].appsrc_name); - if (!appsrc) + if ((appsrc = gst_bin_get_by_name(source->bin, _av_tbl[av_idx].appsrc_name))) + APPEND_ELEMENT(element_list, appsrc); + else LOG_ERROR("appsrc is NULL"); - queue = gst_bin_get_by_name(source->bin, _av_tbl[av_idx].queue_name); - if (!queue) + if ((queue = gst_bin_get_by_name(source->bin, _av_tbl[av_idx].queue_name))) + APPEND_ELEMENT(element_list, queue); + else LOG_ERROR("queue is NULL"); - capsfilter = gst_bin_get_by_name(source->bin, _av_tbl[av_idx].capsfilter_name); - if (!capsfilter) + if ((capsfilter = gst_bin_get_by_name(source->bin, _av_tbl[av_idx].capsfilter_name))) + APPEND_ELEMENT(element_list, capsfilter); + else LOG_ERROR("capsfilter is NULL"); - gst_bin_remove_many(source->bin, appsrc, queue, capsfilter, NULL); + __remove_elements_from_bin(source->bin, element_list); + + SAFE_G_LIST_FREE(element_list); } if (source->display)