Beispiel #1
0
//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);
    }
}
Beispiel #2
0
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);
}