webrtc_source_private: Reduce code complexity 73/281873/4
authorhj kim <backto.kim@samsung.com>
Thu, 22 Sep 2022 23:52:35 +0000 (08:52 +0900)
committerhj kim <backto.kim@samsung.com>
Mon, 26 Sep 2022 02:30:44 +0000 (11:30 +0900)
[Version] 0.3.248
[Issue Type] Refactoring

Change-Id: Iecdd0ed61d19c2899085614e96a9a71204ad54dd

packaging/capi-media-webrtc.spec
src/webrtc_source_private.c

index 15d8b1fa4ca301c69594c8e50bfeab5557bb0ece..648edcfe1988ccd6a8828cdcba10f29380ee41a1 100644 (file)
@@ -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
index b892a942760e0cd521a9798c91655df475cc4d55..90f4aa7060f770ba45d318b5a280165a7558fe09 100644 (file)
@@ -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);