GstElement *appsrc = NULL;
GstElement *queue = NULL;
GstElement *capsfilter = NULL;
+ GList *element_list = NULL;
int av_idx = GET_AV_IDX_BY_TYPE(media_type);
RET_VAL_IF(source == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "source is NULL");
if (!(appsrc = _create_element(DEFAULT_ELEMENT_APPSRC, _av_tbl[av_idx].appsrc_name)))
return WEBRTC_ERROR_INVALID_OPERATION;
+ APPEND_ELEMENT(element_list, appsrc);
g_object_set(G_OBJECT(appsrc),
"is-live", TRUE,
"format", GST_FORMAT_TIME,
NULL);
- if (!(queue = _create_element(DEFAULT_ELEMENT_QUEUE, _av_tbl[av_idx].queue_name))) {
- SAFE_GST_OBJECT_UNREF(appsrc);
- return WEBRTC_ERROR_INVALID_OPERATION;
- }
-
- if (!(capsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, _av_tbl[av_idx].capsfilter_name))) {
- SAFE_GST_OBJECT_UNREF(appsrc);
- SAFE_GST_OBJECT_UNREF(queue);
- return WEBRTC_ERROR_INVALID_OPERATION;
- }
-
- gst_bin_add_many(source->bin, appsrc, queue, capsfilter, NULL);
+ if (!(queue = _create_element(DEFAULT_ELEMENT_QUEUE, _av_tbl[av_idx].queue_name)))
+ goto exit;
+ APPEND_ELEMENT(element_list, queue);
- if (!gst_element_link_many(appsrc, queue, capsfilter, NULL)) {
- LOG_ERROR("failed to gst_element_link_many()");
- goto error;
- }
+ if (!(capsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, _av_tbl[av_idx].capsfilter_name)))
+ goto exit;
+ APPEND_ELEMENT(element_list, capsfilter);
- if (!gst_element_sync_state_with_parent(appsrc)) {
- LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(appsrc));
- goto error;
- }
+ if (!__add_elements_to_bin(source->bin, element_list))
+ goto exit;
- if (!gst_element_sync_state_with_parent(queue)) {
- LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(queue));
- goto error;
- }
+ if (!__link_elements(element_list))
+ goto exit_with_remove_from_bin;
- if (!gst_element_sync_state_with_parent(capsfilter)) {
- LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(capsfilter));
- goto error;
- }
+ if (!__sync_elements_state_with_parent(element_list))
+ goto exit_with_remove_from_bin;
ret = _set_ghost_pad_target(src_pad, capsfilter, true);
if (ret != WEBRTC_ERROR_NONE)
- goto error;
+ goto exit_with_remove_from_bin;
__add_probe_to_pad_for_pause(source, av_idx, src_pad, __payloaded_data_probe_cb);
+ SAFE_G_LIST_FREE(element_list);
+
return WEBRTC_ERROR_NONE;
-error:
- gst_bin_remove_many(source->bin, appsrc, queue, capsfilter, NULL);
+exit_with_remove_from_bin:
+ /* elements will be dereferenced */
+ __remove_elements_from_bin(source->bin, element_list);
+ SAFE_G_LIST_FREE(element_list);
+ return WEBRTC_ERROR_INVALID_OPERATION;
+exit:
+ __unref_elements(element_list);
+ SAFE_G_LIST_FREE(element_list);
return WEBRTC_ERROR_INVALID_OPERATION;
}