diff options
| author | Guennadi Liakhovetski <g.liakhovetski@gmx.de> | 2011-08-31 05:51:10 -0400 |
|---|---|---|
| committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-11-03 16:28:23 -0400 |
| commit | ebc087d0905c41d7fe450866eb1afd1f661cba76 (patch) | |
| tree | cf7b2d60a7b116c1e094ee462aa02c38d968b58f /drivers | |
| parent | 2b3d0457b8b2562bb25e3244ea591f0f6373701b (diff) | |
[media] V4L: add a new videobuf2 buffer state VB2_BUF_STATE_PREPARED
This patch prepares for a better separation of the buffer preparation
stage.
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/media/video/videobuf2-core.c | 61 |
1 files changed, 39 insertions, 22 deletions
diff --git a/drivers/media/video/videobuf2-core.c b/drivers/media/video/videobuf2-core.c index 3f5c7a38e6e8..b88b5b08792b 100644 --- a/drivers/media/video/videobuf2-core.c +++ b/drivers/media/video/videobuf2-core.c | |||
| @@ -366,6 +366,7 @@ static int __fill_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b) | |||
| 366 | b->flags |= V4L2_BUF_FLAG_DONE; | 366 | b->flags |= V4L2_BUF_FLAG_DONE; |
| 367 | break; | 367 | break; |
| 368 | case VB2_BUF_STATE_DEQUEUED: | 368 | case VB2_BUF_STATE_DEQUEUED: |
| 369 | case VB2_BUF_STATE_PREPARED: | ||
| 369 | /* nothing */ | 370 | /* nothing */ |
| 370 | break; | 371 | break; |
| 371 | } | 372 | } |
| @@ -832,6 +833,33 @@ static void __enqueue_in_driver(struct vb2_buffer *vb) | |||
| 832 | q->ops->buf_queue(vb); | 833 | q->ops->buf_queue(vb); |
| 833 | } | 834 | } |
| 834 | 835 | ||
| 836 | static int __buf_prepare(struct vb2_buffer *vb, struct v4l2_buffer *b) | ||
| 837 | { | ||
| 838 | struct vb2_queue *q = vb->vb2_queue; | ||
| 839 | int ret; | ||
| 840 | |||
| 841 | switch (q->memory) { | ||
| 842 | case V4L2_MEMORY_MMAP: | ||
| 843 | ret = __qbuf_mmap(vb, b); | ||
| 844 | break; | ||
| 845 | case V4L2_MEMORY_USERPTR: | ||
| 846 | ret = __qbuf_userptr(vb, b); | ||
| 847 | break; | ||
| 848 | default: | ||
| 849 | WARN(1, "Invalid queue type\n"); | ||
| 850 | ret = -EINVAL; | ||
| 851 | } | ||
| 852 | |||
| 853 | if (!ret) | ||
| 854 | ret = call_qop(q, buf_prepare, vb); | ||
| 855 | if (ret) | ||
| 856 | dprintk(1, "qbuf: buffer preparation failed: %d\n", ret); | ||
| 857 | else | ||
| 858 | vb->state = VB2_BUF_STATE_PREPARED; | ||
| 859 | |||
| 860 | return ret; | ||
| 861 | } | ||
| 862 | |||
| 835 | /** | 863 | /** |
| 836 | * vb2_qbuf() - Queue a buffer from userspace | 864 | * vb2_qbuf() - Queue a buffer from userspace |
| 837 | * @q: videobuf2 queue | 865 | * @q: videobuf2 queue |
| @@ -841,8 +869,8 @@ static void __enqueue_in_driver(struct vb2_buffer *vb) | |||
| 841 | * Should be called from vidioc_qbuf ioctl handler of a driver. | 869 | * Should be called from vidioc_qbuf ioctl handler of a driver. |
| 842 | * This function: | 870 | * This function: |
| 843 | * 1) verifies the passed buffer, | 871 | * 1) verifies the passed buffer, |
| 844 | * 2) calls buf_prepare callback in the driver (if provided), in which | 872 | * 2) if necessary, calls buf_prepare callback in the driver (if provided), in |
| 845 | * driver-specific buffer initialization can be performed, | 873 | * which driver-specific buffer initialization can be performed, |
| 846 | * 3) if streaming is on, queues the buffer in driver by the means of buf_queue | 874 | * 3) if streaming is on, queues the buffer in driver by the means of buf_queue |
| 847 | * callback for processing. | 875 | * callback for processing. |
| 848 | * | 876 | * |
| @@ -852,7 +880,7 @@ static void __enqueue_in_driver(struct vb2_buffer *vb) | |||
| 852 | int vb2_qbuf(struct vb2_queue *q, struct v4l2_buffer *b) | 880 | int vb2_qbuf(struct vb2_queue *q, struct v4l2_buffer *b) |
| 853 | { | 881 | { |
| 854 | struct vb2_buffer *vb; | 882 | struct vb2_buffer *vb; |
| 855 | int ret = 0; | 883 | int ret; |
| 856 | 884 | ||
| 857 | if (q->fileio) { | 885 | if (q->fileio) { |
| 858 | dprintk(1, "qbuf: file io in progress\n"); | 886 | dprintk(1, "qbuf: file io in progress\n"); |
| @@ -881,29 +909,18 @@ int vb2_qbuf(struct vb2_queue *q, struct v4l2_buffer *b) | |||
| 881 | return -EINVAL; | 909 | return -EINVAL; |
| 882 | } | 910 | } |
| 883 | 911 | ||
| 884 | if (vb->state != VB2_BUF_STATE_DEQUEUED) { | 912 | switch (vb->state) { |
| 913 | case VB2_BUF_STATE_DEQUEUED: | ||
| 914 | ret = __buf_prepare(vb, b); | ||
| 915 | if (ret) | ||
| 916 | return ret; | ||
| 917 | case VB2_BUF_STATE_PREPARED: | ||
| 918 | break; | ||
| 919 | default: | ||
| 885 | dprintk(1, "qbuf: buffer already in use\n"); | 920 | dprintk(1, "qbuf: buffer already in use\n"); |
| 886 | return -EINVAL; | 921 | return -EINVAL; |
| 887 | } | 922 | } |
| 888 | 923 | ||
| 889 | if (q->memory == V4L2_MEMORY_MMAP) | ||
| 890 | ret = __qbuf_mmap(vb, b); | ||
| 891 | else if (q->memory == V4L2_MEMORY_USERPTR) | ||
| 892 | ret = __qbuf_userptr(vb, b); | ||
| 893 | else { | ||
| 894 | WARN(1, "Invalid queue type\n"); | ||
| 895 | return -EINVAL; | ||
| 896 | } | ||
| 897 | |||
| 898 | if (ret) | ||
| 899 | return ret; | ||
| 900 | |||
| 901 | ret = call_qop(q, buf_prepare, vb); | ||
| 902 | if (ret) { | ||
| 903 | dprintk(1, "qbuf: buffer preparation failed\n"); | ||
| 904 | return ret; | ||
| 905 | } | ||
| 906 | |||
| 907 | /* | 924 | /* |
| 908 | * Add to the queued buffers list, a buffer will stay on it until | 925 | * Add to the queued buffers list, a buffer will stay on it until |
| 909 | * dequeued in dqbuf. | 926 | * dequeued in dqbuf. |
