summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Zabel2013-09-30 15:34:52 +0200
committerMauro Carvalho Chehab2013-10-28 18:26:54 +0100
commit64ba40accce3e6bb916a36390d3e202085804da8 (patch)
treed0036b0c2c37589c0121b0abbb0f61ef4a2979ad
parent[media] coda: v4l2-compliance fix: overwrite invalid pixel formats with the c... (diff)
downloadkernel-qcow2-linux-64ba40accce3e6bb916a36390d3e202085804da8.tar.gz
kernel-qcow2-linux-64ba40accce3e6bb916a36390d3e202085804da8.tar.xz
kernel-qcow2-linux-64ba40accce3e6bb916a36390d3e202085804da8.zip
[media] coda: v4l2-compliance fix: implement try_decoder_cmd
Implement try_decoder_cmd to let userspace determine available commands and flags. Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> Signed-off-by: Kamil Debski <k.debski@samsung.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
-rw-r--r--drivers/media/platform/coda.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/drivers/media/platform/coda.c b/drivers/media/platform/coda.c
index 4820bd57ed40..b541c069ffe9 100644
--- a/drivers/media/platform/coda.c
+++ b/drivers/media/platform/coda.c
@@ -835,23 +835,34 @@ static int coda_streamoff(struct file *file, void *priv,
return ret;
}
-static int coda_decoder_cmd(struct file *file, void *fh,
- struct v4l2_decoder_cmd *dc)
+static int coda_try_decoder_cmd(struct file *file, void *fh,
+ struct v4l2_decoder_cmd *dc)
{
- struct coda_ctx *ctx = fh_to_ctx(fh);
-
if (dc->cmd != V4L2_DEC_CMD_STOP)
return -EINVAL;
- if ((dc->flags & V4L2_DEC_CMD_STOP_TO_BLACK) ||
- (dc->flags & V4L2_DEC_CMD_STOP_IMMEDIATELY))
+ if (dc->flags & V4L2_DEC_CMD_STOP_TO_BLACK)
return -EINVAL;
- if (dc->stop.pts != 0)
+ if (!(dc->flags & V4L2_DEC_CMD_STOP_IMMEDIATELY) && (dc->stop.pts != 0))
return -EINVAL;
+ return 0;
+}
+
+static int coda_decoder_cmd(struct file *file, void *fh,
+ struct v4l2_decoder_cmd *dc)
+{
+ struct coda_ctx *ctx = fh_to_ctx(fh);
+ int ret;
+
+ ret = coda_try_decoder_cmd(file, fh, dc);
+ if (ret < 0)
+ return ret;
+
+ /* Ignore decoder stop command silently in encoder context */
if (ctx->inst_type != CODA_INST_DECODER)
- return -EINVAL;
+ return 0;
/* Set the strem-end flag on this context */
ctx->bit_stream_param |= CODA_BIT_STREAM_END_FLAG;
@@ -894,6 +905,7 @@ static const struct v4l2_ioctl_ops coda_ioctl_ops = {
.vidioc_streamon = coda_streamon,
.vidioc_streamoff = coda_streamoff,
+ .vidioc_try_decoder_cmd = coda_try_decoder_cmd,
.vidioc_decoder_cmd = coda_decoder_cmd,
.vidioc_subscribe_event = coda_subscribe_event,