//FIXME this should be part of the library void shmdata_base_reader_clean_element (GstElement *element) { if (element != NULL && GST_IS_ELEMENT(element) && GST_STATE_CHANGE_FAILURE != GST_STATE_RETURN(element)) { { // unlinking pads GstIterator *pad_iter = gst_element_iterate_pads(element); gst_iterator_foreach(pad_iter, (GFunc) shmdata_base_reader_unlink_pad, NULL); gst_iterator_free(pad_iter); } { // releasing request pads GstIterator *pad_iter = gst_element_iterate_pads(element); gst_iterator_foreach(pad_iter, (GFunc) shmdata_base_reader_release_request_pad, element); gst_iterator_free(pad_iter); } GstState state = GST_STATE_TARGET(element); if (state != GST_STATE_NULL) { if (GST_STATE_CHANGE_ASYNC == gst_element_set_state(element, GST_STATE_NULL)) { while (GST_STATE(element) != GST_STATE_NULL) { // warning this may be blocking gst_element_get_state(element, NULL, NULL, GST_CLOCK_TIME_NONE); } } } if (GST_IS_BIN(gst_element_get_parent(element))) gst_bin_remove(GST_BIN(gst_element_get_parent(element)), element); else gst_object_unref(element); } }
void GstUtils::clean_element(GstElement *element) { if (nullptr == element) return; if (!GST_IS_ELEMENT(element)) { g_warning("%s failed (not a gst element)", __FUNCTION__); return; } if (GST_STATE_CHANGE_FAILURE == GST_STATE_RETURN(element)) { g_warning("%s failed (state error)", __FUNCTION__); return; } // if (GST_IS_BIN(element)) // g_debug("%d, %d, %d, state return %d", GST_STATE(element), // GST_STATE_TARGET(element), GST_STATE_PENDING(element), // GST_STATE_RETURN(element)); // FIXME { // unlinking pads // GstIterator *pad_iter; // pad_iter = gst_element_iterate_pads(element); // gst_iterator_foreach(pad_iter, (GFunc) GstUtils::unlink_pad, nullptr); // gst_iterator_free(pad_iter); // } // FIXME { // releasing request pads // GstIterator *pad_iter; // pad_iter = gst_element_iterate_pads(element); // gst_iterator_foreach(pad_iter, (GFunc) GstUtils::release_request_pad, element); // gst_iterator_free(pad_iter); // } // GstState state = GST_STATE_TARGET(element); // if (state != GST_STATE_NULL) { // if (GST_STATE_CHANGE_ASYNC == // gst_element_set_state(element, GST_STATE_NULL)) { // while (GST_STATE(element) != GST_STATE_NULL) { // // warning this may be blocking // gst_element_get_state(element, nullptr, nullptr, // GST_CLOCK_TIME_NONE); // } // } // } // if (GST_IS_BIN(gst_element_get_parent(element))) // gst_bin_remove(GST_BIN(gst_element_get_parent(element)), element); // else if (!GST_IS_BIN(gst_element_get_parent(element)) && ((GObject *) element)->ref_count > 0) gst_object_unref(element); }