return true;
}
-static void __foreach_unref_object_cb(gpointer data, gpointer user_data)
+static void __foreach_unref_rest_of_elements_cb(gpointer data, gpointer user_data)
{
GstElement *element = GST_ELEMENT_CAST(data);
{
GstElement *element;
GList *list;
- GList *added_list = NULL;
+ g_autoptr(GList) added_list = NULL;
RET_VAL_IF(bin == NULL, false, "bin is NULL");
RET_VAL_IF(element_list == NULL, false, "element_list is NULL");
- for (list = element_list; list; list = list->next) {
+ for (list = element_list; list; list = g_list_next(list)) {
element = GST_ELEMENT_CAST(list->data);
- if (!gst_bin_add(bin, element)) {
- LOG_ERROR("failed to gst_bin_add(), bin[%s], element[%s]", GST_ELEMENT_NAME(bin), GST_ELEMENT_NAME(element));
- _remove_elements_from_bin(bin, added_list);
- SAFE_G_LIST_FREE(added_list);
- g_list_foreach(list, __foreach_unref_object_cb, NULL); /* rest of elements on the list should be unreferenced */
- return false;
- }
+ if (!gst_bin_add(bin, element))
+ goto error;
APPEND_ELEMENT(added_list, element);
}
LOG_DEBUG("%d elements are added to bin[%s]", g_list_length(added_list), GST_ELEMENT_NAME(bin));
- SAFE_G_LIST_FREE(added_list);
-
return true;
+
+error:
+ LOG_ERROR("failed to gst_bin_add(), bin[%s], element[%s]", GST_ELEMENT_NAME(bin), GST_ELEMENT_NAME(element));
+ _remove_elements_from_bin(bin, added_list);
+ g_list_foreach(list, __foreach_unref_rest_of_elements_cb, NULL);
+ return false;
}
bool _link_elements(GList *element_list)