Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ca5f5fdb authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

[media] mem2mem_testdev: fix field, sequence and time copying



- Set the sequence counters correctly.
- Copy timestamps, timecode, relevant buffer flags and field from
  the received buffer to the outgoing buffer.

Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarKamil Debski <k.debski@samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent a773632c
Loading
Loading
Loading
Loading
+24 −3
Original line number Diff line number Diff line
@@ -112,6 +112,7 @@ struct m2mtest_q_data {
	unsigned int		width;
	unsigned int		height;
	unsigned int		sizeimage;
	unsigned int		sequence;
	struct m2mtest_fmt	*fmt;
};

@@ -234,12 +235,21 @@ static int device_process(struct m2mtest_ctx *ctx,
	bytes_left = bytesperline - tile_w * MEM2MEM_NUM_TILES;
	w = 0;

	out_vb->v4l2_buf.sequence = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE)->sequence++;
	in_vb->v4l2_buf.sequence = q_data->sequence++;
	memcpy(&out_vb->v4l2_buf.timestamp,
			&in_vb->v4l2_buf.timestamp,
			sizeof(struct timeval));
	out_vb->v4l2_buf.flags &= ~V4L2_BUF_FLAG_TSTAMP_SRC_MASK;
	out_vb->v4l2_buf.flags |=
		in_vb->v4l2_buf.flags & V4L2_BUF_FLAG_TSTAMP_SRC_MASK;
	if (in_vb->v4l2_buf.flags & V4L2_BUF_FLAG_TIMECODE)
		memcpy(&out_vb->v4l2_buf.timecode, &in_vb->v4l2_buf.timecode,
			sizeof(struct v4l2_timecode));
	out_vb->v4l2_buf.field = in_vb->v4l2_buf.field;
	out_vb->v4l2_buf.flags = in_vb->v4l2_buf.flags &
		(V4L2_BUF_FLAG_TIMECODE |
		 V4L2_BUF_FLAG_KEYFRAME |
		 V4L2_BUF_FLAG_PFRAME |
		 V4L2_BUF_FLAG_BFRAME |
		 V4L2_BUF_FLAG_TSTAMP_SRC_MASK);

	switch (ctx->mode) {
	case MEM2MEM_HFLIP | MEM2MEM_VFLIP:
@@ -765,9 +775,19 @@ static int m2mtest_buf_prepare(struct vb2_buffer *vb)
static void m2mtest_buf_queue(struct vb2_buffer *vb)
{
	struct m2mtest_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);

	v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vb);
}

static int m2mtest_start_streaming(struct vb2_queue *q, unsigned count)
{
	struct m2mtest_ctx *ctx = vb2_get_drv_priv(q);
	struct m2mtest_q_data *q_data = get_q_data(ctx, q->type);

	q_data->sequence = 0;
	return 0;
}

static int m2mtest_stop_streaming(struct vb2_queue *q)
{
	struct m2mtest_ctx *ctx = vb2_get_drv_priv(q);
@@ -792,6 +812,7 @@ static struct vb2_ops m2mtest_qops = {
	.queue_setup	 = m2mtest_queue_setup,
	.buf_prepare	 = m2mtest_buf_prepare,
	.buf_queue	 = m2mtest_buf_queue,
	.start_streaming = m2mtest_start_streaming,
	.stop_streaming  = m2mtest_stop_streaming,
	.wait_prepare	 = vb2_ops_wait_prepare,
	.wait_finish	 = vb2_ops_wait_finish,