[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
@@ -386,10 +386,10 @@ start_error:
|
||||
*/
|
||||
static inline void store_byte(struct go7007_buffer *vb, u8 byte)
|
||||
{
|
||||
if (vb && vb->vb.v4l2_planes[0].bytesused < GO7007_BUF_SIZE) {
|
||||
u8 *ptr = vb2_plane_vaddr(&vb->vb, 0);
|
||||
if (vb && vb->vb.vb2_buf.planes[0].bytesused < GO7007_BUF_SIZE) {
|
||||
u8 *ptr = vb2_plane_vaddr(&vb->vb.vb2_buf, 0);
|
||||
|
||||
ptr[vb->vb.v4l2_planes[0].bytesused++] = byte;
|
||||
ptr[vb->vb.vb2_buf.planes[0].bytesused++] = byte;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -401,7 +401,7 @@ static void go7007_set_motion_regions(struct go7007 *go, struct go7007_buffer *v
|
||||
.type = V4L2_EVENT_MOTION_DET,
|
||||
.u.motion_det = {
|
||||
.flags = V4L2_EVENT_MD_FL_HAVE_FRAME_SEQ,
|
||||
.frame_sequence = vb->vb.v4l2_buf.sequence,
|
||||
.frame_sequence = vb->vb.sequence,
|
||||
.region_mask = motion_regions,
|
||||
},
|
||||
};
|
||||
@@ -417,7 +417,7 @@ static void go7007_set_motion_regions(struct go7007 *go, struct go7007_buffer *v
|
||||
*/
|
||||
static void go7007_motion_regions(struct go7007 *go, struct go7007_buffer *vb)
|
||||
{
|
||||
u32 *bytesused = &vb->vb.v4l2_planes[0].bytesused;
|
||||
u32 *bytesused = &vb->vb.vb2_buf.planes[0].bytesused;
|
||||
unsigned motion[4] = { 0, 0, 0, 0 };
|
||||
u32 motion_regions = 0;
|
||||
unsigned stride = (go->width + 7) >> 3;
|
||||
@@ -458,25 +458,26 @@ static struct go7007_buffer *frame_boundary(struct go7007 *go, struct go7007_buf
|
||||
go->next_seq++;
|
||||
return vb;
|
||||
}
|
||||
bytesused = &vb->vb.v4l2_planes[0].bytesused;
|
||||
bytesused = &vb->vb.vb2_buf.planes[0].bytesused;
|
||||
|
||||
vb->vb.v4l2_buf.sequence = go->next_seq++;
|
||||
vb->vb.sequence = go->next_seq++;
|
||||
if (vb->modet_active && *bytesused + 216 < GO7007_BUF_SIZE)
|
||||
go7007_motion_regions(go, vb);
|
||||
else
|
||||
go7007_set_motion_regions(go, vb, 0);
|
||||
|
||||
v4l2_get_timestamp(&vb->vb.v4l2_buf.timestamp);
|
||||
v4l2_get_timestamp(&vb->vb.timestamp);
|
||||
vb_tmp = vb;
|
||||
spin_lock(&go->spinlock);
|
||||
list_del(&vb->list);
|
||||
if (list_empty(&go->vidq_active))
|
||||
vb = NULL;
|
||||
else
|
||||
vb = list_first_entry(&go->vidq_active, struct go7007_buffer, list);
|
||||
vb = list_first_entry(&go->vidq_active,
|
||||
struct go7007_buffer, list);
|
||||
go->active_buf = vb;
|
||||
spin_unlock(&go->spinlock);
|
||||
vb2_buffer_done(&vb_tmp->vb, VB2_BUF_STATE_DONE);
|
||||
vb2_buffer_done(&vb_tmp->vb.vb2_buf, VB2_BUF_STATE_DONE);
|
||||
return vb;
|
||||
}
|
||||
|
||||
@@ -519,9 +520,10 @@ void go7007_parse_video_stream(struct go7007 *go, u8 *buf, int length)
|
||||
}
|
||||
|
||||
for (i = 0; i < length; ++i) {
|
||||
if (vb && vb->vb.v4l2_planes[0].bytesused >= GO7007_BUF_SIZE - 3) {
|
||||
if (vb && vb->vb.vb2_buf.planes[0].bytesused >=
|
||||
GO7007_BUF_SIZE - 3) {
|
||||
v4l2_info(&go->v4l2_dev, "dropping oversized frame\n");
|
||||
vb->vb.v4l2_planes[0].bytesused = 0;
|
||||
vb->vb.vb2_buf.planes[0].bytesused = 0;
|
||||
vb->frame_offset = 0;
|
||||
vb->modet_active = 0;
|
||||
vb = go->active_buf = NULL;
|
||||
@@ -601,7 +603,8 @@ void go7007_parse_video_stream(struct go7007 *go, u8 *buf, int length)
|
||||
vb = frame_boundary(go, vb);
|
||||
go->seen_frame = buf[i] == frame_start_code;
|
||||
if (vb && go->seen_frame)
|
||||
vb->frame_offset = vb->vb.v4l2_planes[0].bytesused;
|
||||
vb->frame_offset =
|
||||
vb->vb.vb2_buf.planes[0].bytesused;
|
||||
}
|
||||
/* Handle any special chunk types, or just write the
|
||||
* start code to the (potentially new) buffer */
|
||||
|
@@ -136,7 +136,7 @@ struct go7007_hpi_ops {
|
||||
#define GO7007_BUF_SIZE (GO7007_BUF_PAGES << PAGE_SHIFT)
|
||||
|
||||
struct go7007_buffer {
|
||||
struct vb2_buffer vb;
|
||||
struct vb2_v4l2_buffer vb;
|
||||
struct list_head list;
|
||||
unsigned int frame_offset;
|
||||
u32 modet_active;
|
||||
|
@@ -52,7 +52,7 @@ static bool valid_pixelformat(u32 pixelformat)
|
||||
|
||||
static u32 get_frame_type_flag(struct go7007_buffer *vb, int format)
|
||||
{
|
||||
u8 *ptr = vb2_plane_vaddr(&vb->vb, 0);
|
||||
u8 *ptr = vb2_plane_vaddr(&vb->vb.vb2_buf, 0);
|
||||
|
||||
switch (format) {
|
||||
case V4L2_PIX_FMT_MJPEG:
|
||||
@@ -386,8 +386,9 @@ static void go7007_buf_queue(struct vb2_buffer *vb)
|
||||
{
|
||||
struct vb2_queue *vq = vb->vb2_queue;
|
||||
struct go7007 *go = vb2_get_drv_priv(vq);
|
||||
struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
|
||||
struct go7007_buffer *go7007_vb =
|
||||
container_of(vb, struct go7007_buffer, vb);
|
||||
container_of(vbuf, struct go7007_buffer, vb);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&go->spinlock, flags);
|
||||
@@ -397,12 +398,13 @@ static void go7007_buf_queue(struct vb2_buffer *vb)
|
||||
|
||||
static int go7007_buf_prepare(struct vb2_buffer *vb)
|
||||
{
|
||||
struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
|
||||
struct go7007_buffer *go7007_vb =
|
||||
container_of(vb, struct go7007_buffer, vb);
|
||||
container_of(vbuf, struct go7007_buffer, vb);
|
||||
|
||||
go7007_vb->modet_active = 0;
|
||||
go7007_vb->frame_offset = 0;
|
||||
vb->v4l2_planes[0].bytesused = 0;
|
||||
vb->planes[0].bytesused = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -410,15 +412,15 @@ static void go7007_buf_finish(struct vb2_buffer *vb)
|
||||
{
|
||||
struct vb2_queue *vq = vb->vb2_queue;
|
||||
struct go7007 *go = vb2_get_drv_priv(vq);
|
||||
struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
|
||||
struct go7007_buffer *go7007_vb =
|
||||
container_of(vb, struct go7007_buffer, vb);
|
||||
container_of(vbuf, struct go7007_buffer, vb);
|
||||
u32 frame_type_flag = get_frame_type_flag(go7007_vb, go->format);
|
||||
struct v4l2_buffer *buf = &vb->v4l2_buf;
|
||||
|
||||
buf->flags &= ~(V4L2_BUF_FLAG_KEYFRAME | V4L2_BUF_FLAG_BFRAME |
|
||||
vbuf->flags &= ~(V4L2_BUF_FLAG_KEYFRAME | V4L2_BUF_FLAG_BFRAME |
|
||||
V4L2_BUF_FLAG_PFRAME);
|
||||
buf->flags |= frame_type_flag;
|
||||
buf->field = V4L2_FIELD_NONE;
|
||||
vbuf->flags |= frame_type_flag;
|
||||
vbuf->field = V4L2_FIELD_NONE;
|
||||
}
|
||||
|
||||
static int go7007_start_streaming(struct vb2_queue *q, unsigned int count)
|
||||
|
Reference in New Issue
Block a user