//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) {
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);
}
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++;
}
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;
}
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");
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