webrtc_source: Use list to carry elements for making encoded media packet source 71/265871/2
authorSangchul Lee <sc11.lee@samsung.com>
Mon, 1 Nov 2021 06:26:16 +0000 (15:26 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Tue, 2 Nov 2021 04:34:13 +0000 (13:34 +0900)
Some codes exiting without releasing resources are fixed.
Level of logs in __link_elements() is changed.
Redundant logs are removed.

[Version] 0.2.146
[Issue Type] Improvement

Change-Id: I3d315984ab5fd4d2046a546d823549a29ab4c7e2
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
packaging/capi-media-webrtc.spec
src/webrtc_source.c

index 5fb89c2ab88fbad88c9b114527d87ccf571b2661..1004e2e4a1e3af9933587953c2181d595721ab61 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.2.145
+Version:    0.2.146
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 7d8b95a4d107bddfd3ec632b3feb4f9ac104fa51..63f6312d5d27681abe4449089b8a0ab29581b325 100644 (file)
@@ -974,37 +974,41 @@ error:
 
 //LCOV_EXCL_START
 static int __create_rest_of_elements_for_encoded_format(webrtc_s *webrtc, webrtc_gst_slot_s *source,
-       GstElement **payloader, GstElement **queue, GstElement **capsfilter)
+       GList **element_list)
 {
        GstCaps *sink_caps;
        element_info_s elem_info;
        gchar *media_type = NULL;
+       GstElement *payloader;
+       GstElement *queue;
+       GstElement *capsfilter;
        unsigned int payload_id;
 
        RET_VAL_IF(webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
        RET_VAL_IF(source == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "source is NULL");
-       RET_VAL_IF(payloader == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "payloader is NULL");
-       RET_VAL_IF(queue == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "queue is NULL");
-       RET_VAL_IF(capsfilter == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "capsfilter is NULL");
+       RET_VAL_IF(element_list == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "element_list is NULL");
 
        CREATE_ELEMENT_FROM_REGISTRY(elem_info, GST_KLASS_NAME_PAYLOADER_RTP,
                                                __make_encoded_caps_from_media_format(source, &media_type),
                                                NULL,
-                                               *payloader);
-       if (*payloader == NULL) {
+                                               payloader);
+       if (payloader == NULL) {
                g_free(media_type);
                return WEBRTC_ERROR_INVALID_OPERATION;
        }
+       APPEND_ELEMENT(*element_list, payloader);
 
-       if (!(*queue = _create_element(DEFAULT_ELEMENT_QUEUE, NULL))) {
+       if (!(queue = _create_element(DEFAULT_ELEMENT_QUEUE, NULL))) {
                g_free(media_type);
                return WEBRTC_ERROR_INVALID_OPERATION;
        }
+       APPEND_ELEMENT(*element_list, queue);
 
-       if (!(*capsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, NULL))) {
+       if (!(capsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, ELEMENT_NAME_RTP_CAPSFILTER))) {
                g_free(media_type);
                return WEBRTC_ERROR_INVALID_OPERATION;
        }
+       APPEND_ELEMENT(*element_list, capsfilter);
 
        payload_id = __get_available_payload_id(webrtc);
        if (payload_id == 0) {
@@ -1014,7 +1018,7 @@ static int __create_rest_of_elements_for_encoded_format(webrtc_s *webrtc, webrtc
        source->av[GET_AV_IDX_BY_TYPE(source->media_types)].payload_id = payload_id;
 
        if ((sink_caps = __make_rtp_caps(media_type, payload_id))) {
-               g_object_set(G_OBJECT(*capsfilter), "caps", sink_caps, NULL);
+               g_object_set(G_OBJECT(capsfilter), "caps", sink_caps, NULL);
                gst_caps_unref(sink_caps);
        }
 
@@ -1203,7 +1207,7 @@ static bool __link_elements(GList *element_list)
                curr = (GstElement *)list->data;
                RET_VAL_IF(!gst_element_link(prev, curr), false,
                        "failed to gst_element_link(), [%s] - [%s]", GST_ELEMENT_NAME(prev), GST_ELEMENT_NAME(curr));
-               LOG_DEBUG("[%s] - [%s]", GST_ELEMENT_NAME(prev), GST_ELEMENT_NAME(curr));
+               LOG_WARNING("[%s] - [%s]", GST_ELEMENT_NAME(prev), GST_ELEMENT_NAME(curr));
                count++;
        }
 
@@ -2301,7 +2305,6 @@ static int __complete_mediapacketsrc_from_raw_format(webrtc_s *webrtc, webrtc_gs
                goto exit;
 
        if (!(sink_caps = __make_raw_caps_from_media_format(source))) {
-               LOG_ERROR("failed to __make_raw_caps_from_media_format()");
                ret = WEBRTC_ERROR_INVALID_OPERATION;
                goto exit;
        }
@@ -2348,9 +2351,9 @@ static int __complete_mediapacketsrc_from_encoded_format(webrtc_s *webrtc, webrt
        int ret = WEBRTC_ERROR_NONE;
        GstPad **src_pad;
        GstElement *appsrc;
-       GstElement *payloader;
-       GstElement *queue;
        GstElement *capsfilter;
+       GList *element_list = NULL;
+       GList *element_list2 = NULL;
        GstCaps *sink_caps;
 
        RET_VAL_IF(webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
@@ -2365,25 +2368,48 @@ static int __complete_mediapacketsrc_from_encoded_format(webrtc_s *webrtc, webrt
        appsrc = __find_element_in_bin(source->bin, "appsrc");
        RET_VAL_IF(appsrc == NULL, WEBRTC_ERROR_INVALID_OPERATION, "appsrc is NULL");
 
-       if ((ret = __create_rest_of_elements_for_encoded_format(webrtc, source, &payloader, &queue, &capsfilter)) != WEBRTC_ERROR_NONE)
-               return ret;
+       if ((ret = __create_rest_of_elements_for_encoded_format(webrtc, source, &element_list)) != WEBRTC_ERROR_NONE)
+               goto exit;
 
        if (!(sink_caps = __make_encoded_caps_from_media_format(source, NULL))) {
-               LOG_ERROR("failed to __make_encoded_caps_for_appsrc()");
-               return WEBRTC_ERROR_INVALID_OPERATION;
+               ret = WEBRTC_ERROR_INVALID_OPERATION;
+               goto exit;
        }
        PRINT_CAPS(sink_caps, "appsrc");
 
        g_object_set(G_OBJECT(appsrc), "caps", sink_caps, NULL);
        gst_caps_unref(sink_caps);
 
-       gst_bin_add_many(source->bin, payloader, queue, capsfilter, NULL);
-       if (!gst_element_link_many(appsrc, payloader, queue, capsfilter, NULL)) {
-               LOG_ERROR("failed to gst_element_link_many()");
+       if (!__add_elements_to_bin(source->bin, element_list)) {
+               SAFE_G_LIST_FREE(element_list);
                return WEBRTC_ERROR_INVALID_OPERATION;
        }
 
+       element_list2 = g_list_copy(element_list);
+       PREPEND_ELEMENT(element_list2, appsrc); /* element_list2 has appsrc */
+       if (!__link_elements(element_list2)) {
+               ret = WEBRTC_ERROR_INVALID_OPERATION;
+               goto exit_with_remove_from_bin;
+       }
+
+       if (!(capsfilter = gst_bin_get_by_name(source->bin, ELEMENT_NAME_RTP_CAPSFILTER))) {
+               ret = WEBRTC_ERROR_INVALID_OPERATION;
+               goto exit_with_remove_from_bin;
+       }
+
+       SAFE_G_LIST_FREE(element_list);
+       SAFE_G_LIST_FREE(element_list2);
+
        return _set_ghost_pad_target(*src_pad, capsfilter, true);
+
+exit_with_remove_from_bin:
+       __remove_elements_from_bin(source->bin, element_list);
+       SAFE_G_LIST_FREE(element_list);
+       SAFE_G_LIST_FREE(element_list2);
+       return ret;
+exit:
+       SAFE_G_LIST_FREE_FULL(element_list, gst_object_unref);
+       return ret;
 }
 //LCOV_EXCL_STOP