/** * vb2_streamoff - stop streaming * @q: videobuf2 queue * @type: type argument passed from userspace to vidioc_streamoff handler * * Should be called from vidioc_streamoff handler of a driver. * This function: * 1) verifies current state, * 2) stop streaming and dequeues any queued buffers, including those previously * passed to the driver (after waiting for the driver to finish). * * This call can be used for pausing playback. * The return values from this function are intended to be directly returned * from vidioc_streamoff handler in the driver */ int vb2_streamoff(struct vb2_queue *q, enum v4l2_buf_type type) { if (q->fileio) { dprintk(1, "streamoff: file io in progress\n"); return -EBUSY; } if (type != q->type) { dprintk(1, "streamoff: invalid stream type\n"); return -EINVAL; } if (!q->streaming) { dprintk(1, "streamoff: not streaming\n"); return -EINVAL; } /* * Cancel will pause streaming and remove all buffers from the driver * and videobuf, effectively returning control over them to userspace. */ __vb2_queue_cancel(q); dprintk(3, "Streamoff successful\n"); return 0; }
int vb2_streamon(struct vb2_queue *q, enum v4l2_buf_type type) { struct vb2_buffer *vb; int ret; if (q->fileio) { dprintk(1, "streamon: file io in progress\n"); return -EBUSY; } if (type != q->type) { dprintk(1, "streamon: invalid stream type\n"); return -EINVAL; } if (q->streaming) { dprintk(1, "streamon: already streaming\n"); return -EBUSY; } list_for_each_entry(vb, &q->queued_list, queued_entry) __enqueue_in_driver(vb); ret = call_qop(q, start_streaming, q, atomic_read(&q->queued_count)); if (ret) { dprintk(1, "streamon: driver refused to start streaming\n"); __vb2_queue_cancel(q); return ret; } q->streaming = 1; dprintk(3, "Streamon successful\n"); return 0; }
int vb2_streamoff(struct vb2_queue *q, enum v4l2_buf_type type) { if (q->fileio) { dprintk(1, "streamoff: file io in progress\n"); return -EBUSY; } if (type != q->type) { dprintk(1, "streamoff: invalid stream type\n"); return -EINVAL; } if (!q->streaming) { dprintk(1, "streamoff: not streaming\n"); return -EINVAL; } __vb2_queue_cancel(q); dprintk(3, "Streamoff successful\n"); return 0; }
/** * vb2_queue_release() - stop streaming, release the queue and free memory * @q: videobuf2 queue * * This function stops streaming and performs necessary clean ups, including * freeing video buffer memory. The driver is responsible for freeing * the vb2_queue structure itself. */ void vb2_queue_release(struct vb2_queue *q) { __vb2_cleanup_fileio(q); __vb2_queue_cancel(q); __vb2_queue_free(q); }