[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer. Add new member variables - bytesused, length, offset, userptr, fd, data_offset - to struct vb2_plane in order to cover all information of v4l2_plane. struct vb2_plane { <snip> unsigned int bytesused; unsigned int length; union { unsigned int offset; unsigned long userptr; int fd; } m; unsigned int data_offset; } Replace v4l2_buf with new member variables - index, type, memory - which are common fields for buffer management. struct vb2_buffer { <snip> unsigned int index; unsigned int type; unsigned int memory; unsigned int num_planes; struct vb2_plane planes[VIDEO_MAX_PLANES]; <snip> }; v4l2 specific fields - flags, field, timestamp, timecode, sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c struct vb2_v4l2_buffer { struct vb2_buffer vb2_buf; __u32 flags; __u32 field; struct timeval timestamp; struct v4l2_timecode timecode; __u32 sequence; }; Signed-off-by: Junghak Sung <jh1009.sung@samsung.com> Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com> Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com> Acked-by: Inki Dae <inki.dae@samsung.com> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
This commit is contained in:

committed by
Mauro Carvalho Chehab

parent
c139990e84
commit
2d7007153f
@@ -240,9 +240,9 @@ static void pwc_frame_complete(struct pwc_device *pdev)
|
||||
PWC_DEBUG_FLOW("Frame buffer underflow (%d bytes);"
|
||||
" discarded.\n", fbuf->filled);
|
||||
} else {
|
||||
fbuf->vb.v4l2_buf.field = V4L2_FIELD_NONE;
|
||||
fbuf->vb.v4l2_buf.sequence = pdev->vframe_count;
|
||||
vb2_buffer_done(&fbuf->vb, VB2_BUF_STATE_DONE);
|
||||
fbuf->vb.field = V4L2_FIELD_NONE;
|
||||
fbuf->vb.sequence = pdev->vframe_count;
|
||||
vb2_buffer_done(&fbuf->vb.vb2_buf, VB2_BUF_STATE_DONE);
|
||||
pdev->fill_buf = NULL;
|
||||
pdev->vsync = 0;
|
||||
}
|
||||
@@ -287,7 +287,7 @@ static void pwc_isoc_handler(struct urb *urb)
|
||||
{
|
||||
PWC_ERROR("Too many ISOC errors, bailing out.\n");
|
||||
if (pdev->fill_buf) {
|
||||
vb2_buffer_done(&pdev->fill_buf->vb,
|
||||
vb2_buffer_done(&pdev->fill_buf->vb.vb2_buf,
|
||||
VB2_BUF_STATE_ERROR);
|
||||
pdev->fill_buf = NULL;
|
||||
}
|
||||
@@ -317,7 +317,7 @@ static void pwc_isoc_handler(struct urb *urb)
|
||||
|
||||
if (pdev->vsync == 1) {
|
||||
v4l2_get_timestamp(
|
||||
&fbuf->vb.v4l2_buf.timestamp);
|
||||
&fbuf->vb.timestamp);
|
||||
pdev->vsync = 2;
|
||||
}
|
||||
|
||||
@@ -520,7 +520,7 @@ static void pwc_cleanup_queued_bufs(struct pwc_device *pdev,
|
||||
buf = list_entry(pdev->queued_bufs.next, struct pwc_frame_buf,
|
||||
list);
|
||||
list_del(&buf->list);
|
||||
vb2_buffer_done(&buf->vb, state);
|
||||
vb2_buffer_done(&buf->vb.vb2_buf, state);
|
||||
}
|
||||
spin_unlock_irqrestore(&pdev->queued_bufs_lock, flags);
|
||||
}
|
||||
@@ -594,7 +594,9 @@ static int queue_setup(struct vb2_queue *vq, const struct v4l2_format *fmt,
|
||||
|
||||
static int buffer_init(struct vb2_buffer *vb)
|
||||
{
|
||||
struct pwc_frame_buf *buf = container_of(vb, struct pwc_frame_buf, vb);
|
||||
struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
|
||||
struct pwc_frame_buf *buf =
|
||||
container_of(vbuf, struct pwc_frame_buf, vb);
|
||||
|
||||
/* need vmalloc since frame buffer > 128K */
|
||||
buf->data = vzalloc(PWC_FRAME_SIZE);
|
||||
@@ -618,7 +620,9 @@ static int buffer_prepare(struct vb2_buffer *vb)
|
||||
static void buffer_finish(struct vb2_buffer *vb)
|
||||
{
|
||||
struct pwc_device *pdev = vb2_get_drv_priv(vb->vb2_queue);
|
||||
struct pwc_frame_buf *buf = container_of(vb, struct pwc_frame_buf, vb);
|
||||
struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
|
||||
struct pwc_frame_buf *buf =
|
||||
container_of(vbuf, struct pwc_frame_buf, vb);
|
||||
|
||||
if (vb->state == VB2_BUF_STATE_DONE) {
|
||||
/*
|
||||
@@ -633,7 +637,9 @@ static void buffer_finish(struct vb2_buffer *vb)
|
||||
|
||||
static void buffer_cleanup(struct vb2_buffer *vb)
|
||||
{
|
||||
struct pwc_frame_buf *buf = container_of(vb, struct pwc_frame_buf, vb);
|
||||
struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
|
||||
struct pwc_frame_buf *buf =
|
||||
container_of(vbuf, struct pwc_frame_buf, vb);
|
||||
|
||||
vfree(buf->data);
|
||||
}
|
||||
@@ -641,12 +647,14 @@ static void buffer_cleanup(struct vb2_buffer *vb)
|
||||
static void buffer_queue(struct vb2_buffer *vb)
|
||||
{
|
||||
struct pwc_device *pdev = vb2_get_drv_priv(vb->vb2_queue);
|
||||
struct pwc_frame_buf *buf = container_of(vb, struct pwc_frame_buf, vb);
|
||||
struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
|
||||
struct pwc_frame_buf *buf =
|
||||
container_of(vbuf, struct pwc_frame_buf, vb);
|
||||
unsigned long flags = 0;
|
||||
|
||||
/* Check the device has not disconnected between prep and queuing */
|
||||
if (!pdev->udev) {
|
||||
vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
|
||||
vb2_buffer_done(vb, VB2_BUF_STATE_ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -695,7 +703,8 @@ static void stop_streaming(struct vb2_queue *vq)
|
||||
|
||||
pwc_cleanup_queued_bufs(pdev, VB2_BUF_STATE_ERROR);
|
||||
if (pdev->fill_buf)
|
||||
vb2_buffer_done(&pdev->fill_buf->vb, VB2_BUF_STATE_ERROR);
|
||||
vb2_buffer_done(&pdev->fill_buf->vb.vb2_buf,
|
||||
VB2_BUF_STATE_ERROR);
|
||||
mutex_unlock(&pdev->v4l2_lock);
|
||||
}
|
||||
|
||||
|
@@ -40,7 +40,7 @@ int pwc_decompress(struct pwc_device *pdev, struct pwc_frame_buf *fbuf)
|
||||
u16 *src;
|
||||
u16 *dsty, *dstu, *dstv;
|
||||
|
||||
image = vb2_plane_vaddr(&fbuf->vb, 0);
|
||||
image = vb2_plane_vaddr(&fbuf->vb.vb2_buf, 0);
|
||||
|
||||
yuv = fbuf->data + pdev->frame_header_size; /* Skip header */
|
||||
|
||||
@@ -55,12 +55,12 @@ int pwc_decompress(struct pwc_device *pdev, struct pwc_frame_buf *fbuf)
|
||||
* determine this using the type of the webcam */
|
||||
memcpy(raw_frame->cmd, pdev->cmd_buf, 4);
|
||||
memcpy(raw_frame+1, yuv, pdev->frame_size);
|
||||
vb2_set_plane_payload(&fbuf->vb, 0,
|
||||
vb2_set_plane_payload(&fbuf->vb.vb2_buf, 0,
|
||||
pdev->frame_size + sizeof(struct pwc_raw_frame));
|
||||
return 0;
|
||||
}
|
||||
|
||||
vb2_set_plane_payload(&fbuf->vb, 0,
|
||||
vb2_set_plane_payload(&fbuf->vb.vb2_buf, 0,
|
||||
pdev->width * pdev->height * 3 / 2);
|
||||
|
||||
if (pdev->vbandlength == 0) {
|
||||
|
@@ -40,6 +40,7 @@
|
||||
#include <media/v4l2-ctrls.h>
|
||||
#include <media/v4l2-fh.h>
|
||||
#include <media/v4l2-event.h>
|
||||
#include <media/videobuf2-v4l2.h>
|
||||
#include <media/videobuf2-vmalloc.h>
|
||||
#ifdef CONFIG_USB_PWC_INPUT_EVDEV
|
||||
#include <linux/input.h>
|
||||
@@ -210,7 +211,8 @@ struct pwc_raw_frame {
|
||||
/* intermediate buffers with raw data from the USB cam */
|
||||
struct pwc_frame_buf
|
||||
{
|
||||
struct vb2_buffer vb; /* common v4l buffer stuff -- must be first */
|
||||
/* common v4l buffer stuff -- must be first */
|
||||
struct vb2_v4l2_buffer vb;
|
||||
struct list_head list;
|
||||
void *data;
|
||||
int filled; /* number of bytes filled */
|
||||
|
Reference in New Issue
Block a user