Commit 43047f6b authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

[media] vivid: fix test pattern movement for V4L2_FIELD_ALTERNATE

The successive TOP/BOTTOM fields did not move as they should: only
every other field actually changed position.

The cause was that the tpg needs to know if it is dealing with a
FIELD_ALTERNATE case since that requires slightly different handling.

So tell the TPG whether or not the field setting is for the ALTERNATE
case or not.
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent c501abcf
...@@ -436,7 +436,8 @@ static void vivid_fillbuff(struct vivid_dev *dev, struct vivid_buffer *buf) ...@@ -436,7 +436,8 @@ static void vivid_fillbuff(struct vivid_dev *dev, struct vivid_buffer *buf)
} else { } else {
buf->vb.v4l2_buf.field = dev->field_cap; buf->vb.v4l2_buf.field = dev->field_cap;
} }
tpg_s_field(&dev->tpg, buf->vb.v4l2_buf.field); tpg_s_field(&dev->tpg, buf->vb.v4l2_buf.field,
dev->field_cap == V4L2_FIELD_ALTERNATE);
tpg_s_perc_fill_blank(&dev->tpg, dev->must_blank[buf->vb.v4l2_buf.index]); tpg_s_perc_fill_blank(&dev->tpg, dev->must_blank[buf->vb.v4l2_buf.index]);
vivid_precalc_copy_rects(dev); vivid_precalc_copy_rects(dev);
......
...@@ -1413,7 +1413,9 @@ void tpg_fillbuffer(struct tpg_data *tpg, v4l2_std_id std, unsigned p, u8 *vbuf) ...@@ -1413,7 +1413,9 @@ void tpg_fillbuffer(struct tpg_data *tpg, v4l2_std_id std, unsigned p, u8 *vbuf)
linestart_older += line_offset; linestart_older += line_offset;
linestart_newer += line_offset; linestart_newer += line_offset;
} }
if (is_60hz) { if (tpg->field_alternate) {
linestart_top = linestart_bottom = linestart_older;
} else if (is_60hz) {
linestart_top = linestart_newer; linestart_top = linestart_newer;
linestart_bottom = linestart_older; linestart_bottom = linestart_older;
} else { } else {
......
...@@ -98,6 +98,7 @@ struct tpg_data { ...@@ -98,6 +98,7 @@ struct tpg_data {
/* Scaled output frame size */ /* Scaled output frame size */
unsigned scaled_width; unsigned scaled_width;
u32 field; u32 field;
bool field_alternate;
/* crop coordinates are frame-based */ /* crop coordinates are frame-based */
struct v4l2_rect crop; struct v4l2_rect crop;
/* compose coordinates are format-based */ /* compose coordinates are format-based */
...@@ -348,9 +349,10 @@ static inline void tpg_s_buf_height(struct tpg_data *tpg, unsigned h) ...@@ -348,9 +349,10 @@ static inline void tpg_s_buf_height(struct tpg_data *tpg, unsigned h)
tpg->buf_height = h; tpg->buf_height = h;
} }
static inline void tpg_s_field(struct tpg_data *tpg, unsigned field) static inline void tpg_s_field(struct tpg_data *tpg, unsigned field, bool alternate)
{ {
tpg->field = field; tpg->field = field;
tpg->field_alternate = alternate;
} }
static inline void tpg_s_perc_fill(struct tpg_data *tpg, static inline void tpg_s_perc_fill(struct tpg_data *tpg,
......
...@@ -733,7 +733,10 @@ int vivid_s_fmt_vid_cap(struct file *file, void *priv, ...@@ -733,7 +733,10 @@ int vivid_s_fmt_vid_cap(struct file *file, void *priv,
if (tpg_g_planes(&dev->tpg) > 1) if (tpg_g_planes(&dev->tpg) > 1)
tpg_s_bytesperline(&dev->tpg, 1, mp->plane_fmt[1].bytesperline); tpg_s_bytesperline(&dev->tpg, 1, mp->plane_fmt[1].bytesperline);
dev->field_cap = mp->field; dev->field_cap = mp->field;
tpg_s_field(&dev->tpg, dev->field_cap); if (dev->field_cap == V4L2_FIELD_ALTERNATE)
tpg_s_field(&dev->tpg, V4L2_FIELD_TOP, true);
else
tpg_s_field(&dev->tpg, dev->field_cap, false);
tpg_s_crop_compose(&dev->tpg, &dev->crop_cap, &dev->compose_cap); tpg_s_crop_compose(&dev->tpg, &dev->crop_cap, &dev->compose_cap);
tpg_s_fourcc(&dev->tpg, dev->fmt_cap->fourcc); tpg_s_fourcc(&dev->tpg, dev->fmt_cap->fourcc);
if (vivid_is_sdtv_cap(dev)) if (vivid_is_sdtv_cap(dev))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment