From: hj kim Date: Thu, 22 Sep 2022 23:52:35 +0000 (+0900) Subject: webrtc_source_private: Reduce code complexity X-Git-Tag: accepted/tizen/unified/20220927.132346~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=66b3f14671774be893d829f617ce135560b311b9;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_source_private: Reduce code complexity [Version] 0.3.248 [Issue Type] Refactoring Change-Id: Iecdd0ed61d19c2899085614e96a9a71204ad54dd --- diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index 15d8b1fa..648edcfe 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.247 +Version: 0.3.248 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_source_private.c b/src/webrtc_source_private.c index b892a942..90f4aa70 100644 --- a/src/webrtc_source_private.c +++ b/src/webrtc_source_private.c @@ -657,6 +657,45 @@ static GstElement * __prepare_encoder(webrtc_s *webrtc, webrtc_gst_slot_s *sourc return encoder; } +static GstElement *__prepare_first_capsfilter(webrtc_s *webrtc, webrtc_gst_slot_s *source, int av_idx, GList **element_list, bool *encoded_support, GstCaps **caps_for_render) +{ + GstElement *capsfilter; + GstCaps *sink_caps; + + RET_VAL_IF(webrtc == NULL, NULL, "webrtc is NULL"); + RET_VAL_IF(source == NULL, NULL, "source is NULL"); + RET_VAL_IF(encoded_support == NULL, NULL, "encoded_support is NULL"); + RET_VAL_IF(caps_for_render == NULL, NULL, "caps_for_render is NULL"); + + if (!(capsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, ELEMENT_NAME_FIRST_CAPSFILTER))) + return NULL; + APPEND_ELEMENT(*element_list, capsfilter); + + _get_video_encoded_support_from_ini(&webrtc->ini, source->type, encoded_support); + + if (*encoded_support) { + if ((sink_caps = __make_default_encoded_caps(source, &webrtc->ini, NULL))) { + PRINT_CAPS(sink_caps, "capsfilter"); + g_object_set(G_OBJECT(capsfilter), "caps", sink_caps, NULL); + + *caps_for_render = sink_caps; + } + + _set_need_decoding_for_loopback(source, av_idx, true); + + return capsfilter; + } + + if ((sink_caps = __make_default_raw_caps(source, &webrtc->ini))) { + PRINT_CAPS(sink_caps, "capsfilter"); + g_object_set(G_OBJECT(capsfilter), "caps", sink_caps, NULL); + + *caps_for_render = sink_caps; + } + + return capsfilter; +} + static bool __is_videoscale_needed(webrtc_s *webrtc, webrtc_gst_slot_s *source) { bool drc_support; @@ -683,6 +722,35 @@ static bool __is_videoscale_needed(webrtc_s *webrtc, webrtc_gst_slot_s *source) return true; } +static GstElement *__prepare_videoscale(webrtc_gst_slot_s *source, GList **element_list) +{ + GstElement *videoscale; + GstElement *videoscaleCapsfilter; + GstCaps *caps; + + RET_VAL_IF(source == NULL, NULL, "source is NULL"); + RET_VAL_IF(element_list == NULL, NULL, "element_list is NULL"); + + if (!(videoscale = _create_element(DEFAULT_ELEMENT_VIDEOSCALE, NULL))) + return NULL; + APPEND_ELEMENT(*element_list, videoscale); + + if (!(videoscaleCapsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, ELEMENT_NAME_VIDEOSCALE_CAPSFILTER))) + return NULL; + APPEND_ELEMENT(*element_list, videoscaleCapsfilter); + + caps = gst_caps_new_simple(MEDIA_TYPE_VIDEO_RAW, + "width", G_TYPE_INT, source->video_info.width, + "height", G_TYPE_INT, source->video_info.height, + NULL); + + PRINT_CAPS(caps, ELEMENT_NAME_VIDEOSCALE_CAPSFILTER); + g_object_set(G_OBJECT(videoscaleCapsfilter), "caps", caps, NULL); + gst_caps_unref(caps); + + return videoscaleCapsfilter; +} + static bool __is_videorate_needed(webrtc_s *webrtc, webrtc_gst_slot_s *source) { bool encoded_support; @@ -703,6 +771,31 @@ static bool __is_videorate_needed(webrtc_s *webrtc, webrtc_gst_slot_s *source) return true; } +static GstElement *__prepare_videorate(webrtc_gst_slot_s *source, GList **element_list) +{ + GstElement *videorate; + GstElement *videorateCapsfilter; + GstCaps *caps; + + if (!(videorate = _create_element(DEFAULT_ELEMENT_VIDEORATE, NULL))) + return NULL; + APPEND_ELEMENT(*element_list, videorate); + + if (!(videorateCapsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, ELEMENT_NAME_VIDEORATE_CAPSFILTER))) + return NULL; + APPEND_ELEMENT(*element_list, videorateCapsfilter); + + caps = gst_caps_new_simple(MEDIA_TYPE_VIDEO_RAW, + "framerate", GST_TYPE_FRACTION, source->video_info.framerate, 1, + NULL); + + PRINT_CAPS(caps, ELEMENT_NAME_VIDEORATE_CAPSFILTER); + g_object_set(G_OBJECT(videorateCapsfilter), "caps", caps, NULL); + gst_caps_unref(caps); + + return videorateCapsfilter; +} + int _create_rest_of_elements(webrtc_s *webrtc, webrtc_gst_slot_s *source, bool need_capsfilter, GList **element_list, bool is_audio) { GstElement *encoder = NULL; @@ -724,83 +817,33 @@ int _create_rest_of_elements(webrtc_s *webrtc, webrtc_gst_slot_s *source, bool n idx = GET_AV_IDX(is_audio); if (need_capsfilter) { + GstElement *capsfilter; bool encoded_support; - GstElement *capsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, ELEMENT_NAME_FIRST_CAPSFILTER); - if (!capsfilter) - return WEBRTC_ERROR_INVALID_OPERATION; - APPEND_ELEMENT(*element_list, capsfilter); - - _get_video_encoded_support_from_ini(&webrtc->ini, source->type, &encoded_support); - if (encoded_support) { - if ((sink_caps = __make_default_encoded_caps(source, &webrtc->ini, NULL))) { - PRINT_CAPS(sink_caps, "capsfilter"); - g_object_set(G_OBJECT(capsfilter), "caps", sink_caps, NULL); - caps_for_render = sink_caps; - } + if(!(capsfilter = __prepare_first_capsfilter(webrtc, source, idx, element_list, &encoded_support, &caps_for_render))) + return WEBRTC_ERROR_INVALID_OPERATION; - _set_need_decoding_for_loopback(source, idx, true); - pad_for_render = gst_element_get_static_pad(capsfilter, "src"); + pad_for_render = gst_element_get_static_pad(capsfilter, "src"); + if (encoded_support) goto skip_encoder; - } - - if ((sink_caps = __make_default_raw_caps(source, &webrtc->ini))) { - PRINT_CAPS(sink_caps, "capsfilter"); - g_object_set(G_OBJECT(capsfilter), "caps", sink_caps, NULL); - - caps_for_render = sink_caps; - } - - pad_for_render = gst_element_get_static_pad(capsfilter, "src"); } if (__is_videoscale_needed(webrtc, source)) { - GstElement *videoscale; GstElement *videoscaleCapsfilter; - GstCaps *caps; - - if (!(videoscale = _create_element(DEFAULT_ELEMENT_VIDEOSCALE, NULL))) - goto error; - APPEND_ELEMENT(*element_list, videoscale); - if (!(videoscaleCapsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, ELEMENT_NAME_VIDEOSCALE_CAPSFILTER))) + if(!(videoscaleCapsfilter = __prepare_videoscale(source, element_list))) goto error; - APPEND_ELEMENT(*element_list, videoscaleCapsfilter); - - caps = gst_caps_new_simple(MEDIA_TYPE_VIDEO_RAW, - "width", G_TYPE_INT, source->video_info.width, - "height", G_TYPE_INT, source->video_info.height, - NULL); - - PRINT_CAPS(caps, ELEMENT_NAME_VIDEOSCALE_CAPSFILTER); - g_object_set(G_OBJECT(videoscaleCapsfilter), "caps", caps, NULL); - gst_caps_unref(caps); gst_object_unref(pad_for_render); pad_for_render = gst_element_get_static_pad(videoscaleCapsfilter, "src"); } if (__is_videorate_needed(webrtc, source)) { - GstElement *videorate; GstElement *videorateCapsfilter; - GstCaps *caps; - if (!(videorate = _create_element(DEFAULT_ELEMENT_VIDEORATE, NULL))) + if(!(videorateCapsfilter = __prepare_videorate(source, element_list))) goto error; - APPEND_ELEMENT(*element_list, videorate); - - if (!(videorateCapsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, ELEMENT_NAME_VIDEORATE_CAPSFILTER))) - goto error; - APPEND_ELEMENT(*element_list, videorateCapsfilter); - - caps = gst_caps_new_simple(MEDIA_TYPE_VIDEO_RAW, - "framerate", GST_TYPE_FRACTION, source->video_info.framerate, 1, - NULL); - - PRINT_CAPS(caps, ELEMENT_NAME_VIDEORATE_CAPSFILTER); - g_object_set(G_OBJECT(videorateCapsfilter), "caps", caps, NULL); - gst_caps_unref(caps); gst_object_unref(pad_for_render); pad_for_render = gst_element_get_static_pad(videorateCapsfilter, "src"); @@ -815,8 +858,7 @@ int _create_rest_of_elements(webrtc_s *webrtc, webrtc_gst_slot_s *source, bool n pad_for_render = gst_element_get_static_pad(videocrop, "src"); } - encoder = __prepare_encoder(webrtc, source, is_audio); - if (encoder == NULL) + if (!(encoder = __prepare_encoder(webrtc, source, is_audio))) goto error; APPEND_ELEMENT(*element_list, encoder);