Commit 1a806401 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

[media] ivtv: DECODER_CMD v4l2-compliance fixes

VIDIOC_DECODER_CMD didn't return EPERM when calling PAUSE or RESUME if no
decoding is in progress.
VIDIOC_G_ENC_INDEX didn't set entries_cap or return 0 if no decoding was
in progress.
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 30634e8e
...@@ -289,6 +289,8 @@ static int ivtv_video_command(struct ivtv *itv, struct ivtv_open_id *id, ...@@ -289,6 +289,8 @@ static int ivtv_video_command(struct ivtv *itv, struct ivtv_open_id *id,
case V4L2_DEC_CMD_PAUSE: case V4L2_DEC_CMD_PAUSE:
dc->flags &= V4L2_DEC_CMD_PAUSE_TO_BLACK; dc->flags &= V4L2_DEC_CMD_PAUSE_TO_BLACK;
if (try) break; if (try) break;
if (!atomic_read(&itv->decoding))
return -EPERM;
if (itv->output_mode != OUT_MPG) if (itv->output_mode != OUT_MPG)
return -EBUSY; return -EBUSY;
if (atomic_read(&itv->decoding) > 0) { if (atomic_read(&itv->decoding) > 0) {
...@@ -301,6 +303,8 @@ static int ivtv_video_command(struct ivtv *itv, struct ivtv_open_id *id, ...@@ -301,6 +303,8 @@ static int ivtv_video_command(struct ivtv *itv, struct ivtv_open_id *id,
case V4L2_DEC_CMD_RESUME: case V4L2_DEC_CMD_RESUME:
dc->flags = 0; dc->flags = 0;
if (try) break; if (try) break;
if (!atomic_read(&itv->decoding))
return -EPERM;
if (itv->output_mode != OUT_MPG) if (itv->output_mode != OUT_MPG)
return -EBUSY; return -EBUSY;
if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags)) { if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags)) {
...@@ -1250,6 +1254,9 @@ static int ivtv_g_enc_index(struct file *file, void *fh, struct v4l2_enc_idx *id ...@@ -1250,6 +1254,9 @@ static int ivtv_g_enc_index(struct file *file, void *fh, struct v4l2_enc_idx *id
if (entries > V4L2_ENC_IDX_ENTRIES) if (entries > V4L2_ENC_IDX_ENTRIES)
entries = V4L2_ENC_IDX_ENTRIES; entries = V4L2_ENC_IDX_ENTRIES;
idx->entries = 0; idx->entries = 0;
idx->entries_cap = IVTV_MAX_PGM_INDEX;
if (!atomic_read(&itv->capturing))
return 0;
for (i = 0; i < entries; i++) { for (i = 0; i < entries; i++) {
*e = itv->pgm_info[(itv->pgm_info_read_idx + i) % IVTV_MAX_PGM_INDEX]; *e = itv->pgm_info[(itv->pgm_info_read_idx + i) % IVTV_MAX_PGM_INDEX];
if ((e->flags & V4L2_ENC_IDX_FRAME_MASK) <= V4L2_ENC_IDX_FRAME_B) { if ((e->flags & V4L2_ENC_IDX_FRAME_MASK) <= V4L2_ENC_IDX_FRAME_B) {
......
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