aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorArchit Taneja <archit@ti.com>2014-03-10 02:24:01 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-04-07 08:43:51 -0400
commit5269fef77e14c22b1fde44bc0973a18cf233f778 (patch)
treea5e5d8893315a23d38cc8524510102f0cf97f3b7 /drivers/media
parent92851f1cdbd082eb993847e1c4468f7de08765bb (diff)
[media] v4l: ti-vpe: Set correct field parameter for output and capture buffers
The vpe driver wasn't setting the correct field parameter for dequed CAPTURE type buffers for the case where the captured output is progressive. Set the field to V4L2_FIELD_NONE for the completed destination buffers when the captured output is progressive. For OUTPUT type buffers, a queued buffer's field is forced to V4L2_FIELD_NONE if the pixel format(configured through s_fmt for the buffer type V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE specifies) the field type isn't interlaced. If the pixel format specified was V4L2_FIELD_ALTERNATE, and the queued buffer's field isn't V4L2_FIELD_TOP or V4L2_FIELD_BOTTOM, the vb2 buf_prepare op returns an error. This ensures compliance, and that the dequeued output and captured buffers contain the field type that the driver used internally. Signed-off-by: Archit Taneja <archit@ti.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/platform/ti-vpe/vpe.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/media/platform/ti-vpe/vpe.c b/drivers/media/platform/ti-vpe/vpe.c
index f42c458aac11..b64f29a54891 100644
--- a/drivers/media/platform/ti-vpe/vpe.c
+++ b/drivers/media/platform/ti-vpe/vpe.c
@@ -1288,10 +1288,10 @@ static irqreturn_t vpe_irq(int irq_vpe, void *data)
1288 d_buf->timecode = s_buf->timecode; 1288 d_buf->timecode = s_buf->timecode;
1289 } 1289 }
1290 d_buf->sequence = ctx->sequence; 1290 d_buf->sequence = ctx->sequence;
1291 d_buf->field = ctx->field;
1292 1291
1293 d_q_data = &ctx->q_data[Q_DATA_DST]; 1292 d_q_data = &ctx->q_data[Q_DATA_DST];
1294 if (d_q_data->flags & Q_DATA_INTERLACED) { 1293 if (d_q_data->flags & Q_DATA_INTERLACED) {
1294 d_buf->field = ctx->field;
1295 if (ctx->field == V4L2_FIELD_BOTTOM) { 1295 if (ctx->field == V4L2_FIELD_BOTTOM) {
1296 ctx->sequence++; 1296 ctx->sequence++;
1297 ctx->field = V4L2_FIELD_TOP; 1297 ctx->field = V4L2_FIELD_TOP;
@@ -1300,6 +1300,7 @@ static irqreturn_t vpe_irq(int irq_vpe, void *data)
1300 ctx->field = V4L2_FIELD_BOTTOM; 1300 ctx->field = V4L2_FIELD_BOTTOM;
1301 } 1301 }
1302 } else { 1302 } else {
1303 d_buf->field = V4L2_FIELD_NONE;
1303 ctx->sequence++; 1304 ctx->sequence++;
1304 } 1305 }
1305 1306
@@ -1724,6 +1725,16 @@ static int vpe_buf_prepare(struct vb2_buffer *vb)
1724 q_data = get_q_data(ctx, vb->vb2_queue->type); 1725 q_data = get_q_data(ctx, vb->vb2_queue->type);
1725 num_planes = q_data->fmt->coplanar ? 2 : 1; 1726 num_planes = q_data->fmt->coplanar ? 2 : 1;
1726 1727
1728 if (vb->vb2_queue->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
1729 if (!(q_data->flags & Q_DATA_INTERLACED)) {
1730 vb->v4l2_buf.field = V4L2_FIELD_NONE;
1731 } else {
1732 if (vb->v4l2_buf.field != V4L2_FIELD_TOP &&
1733 vb->v4l2_buf.field != V4L2_FIELD_BOTTOM)
1734 return -EINVAL;
1735 }
1736 }
1737
1727 for (i = 0; i < num_planes; i++) { 1738 for (i = 0; i < num_planes; i++) {
1728 if (vb2_plane_size(vb, i) < q_data->sizeimage[i]) { 1739 if (vb2_plane_size(vb, i) < q_data->sizeimage[i]) {
1729 vpe_err(ctx->dev, 1740 vpe_err(ctx->dev,