From: Sangchul Lee Date: Mon, 1 Nov 2021 06:26:16 +0000 (+0900) Subject: webrtc_source: Use list to carry elements for making encoded media packet source X-Git-Tag: submit/tizen/20211109.062149~5 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3422092c3af237e886a593776a60cb431fc6ba9b;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_source: Use list to carry elements for making encoded media packet source 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 --- diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index 5fb89c2a..1004e2e4 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.145 +Version: 0.2.146 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_source.c b/src/webrtc_source.c index 7d8b95a4..63f6312d 100644 --- a/src/webrtc_source.c +++ b/src/webrtc_source.c @@ -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