/******************************************************
 * gst_v4l2src_capture_stop():
 *   stop streaming capture
 * return value: TRUE on success, FALSE on error
 ******************************************************/
gboolean
gst_v4l2src_capture_stop (GstV4l2Src * v4l2src)
{
  GST_DEBUG_OBJECT (v4l2src, "stopping capturing");

  if (!GST_V4L2_IS_OPEN (v4l2src->v4l2object)) {
    goto done;
  }
  if (!GST_V4L2_IS_ACTIVE (v4l2src->v4l2object)) {
    goto done;
  }

  if (v4l2src->use_mmap) {
    /* we actually need to sync on all queued buffers but not
     * on the non-queued ones */
    if (!gst_v4l2_object_stop_streaming (v4l2src->v4l2object)) {
      return FALSE;
    }
  }

done:

  /* make an optional pending wait stop */
  v4l2src->quit = TRUE;
  v4l2src->is_capturing = FALSE;

  return TRUE;
}
Beispiel #2
0
static GstStateChangeReturn
gst_v4l2sink_change_state (GstElement * element, GstStateChange transition)
{
    GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
    GstV4l2Sink *v4l2sink = GST_V4L2SINK (element);

    GST_DEBUG_OBJECT (v4l2sink, "%d -> %d",
                      GST_STATE_TRANSITION_CURRENT (transition),
                      GST_STATE_TRANSITION_NEXT (transition));

    switch (transition) {
    case GST_STATE_CHANGE_NULL_TO_READY:
        /* open the device */
        if (!gst_v4l2_object_start (v4l2sink->v4l2object))
            return GST_STATE_CHANGE_FAILURE;
        break;
    default:
        break;
    }

    ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);

    switch (transition) {
    case GST_STATE_CHANGE_PAUSED_TO_READY:
        if (v4l2sink->state == STATE_STREAMING) {
            if (!gst_v4l2_object_stop_streaming (v4l2sink->v4l2object)) {
                return GST_STATE_CHANGE_FAILURE;
            }
            v4l2sink->state = STATE_PENDING_STREAMON;
        }
        break;
    case GST_STATE_CHANGE_READY_TO_NULL:
        if (NULL != v4l2sink->pool)
            gst_v4l2_buffer_pool_destroy (v4l2sink->pool);
        v4l2sink->pool = NULL;
        /* close the device */
        if (!gst_v4l2_object_stop (v4l2sink->v4l2object))
            return GST_STATE_CHANGE_FAILURE;
        v4l2sink->state = STATE_OFF;
        break;
    default:
        break;
    }

    return ret;
}