V4L/DVB (5916): ivtv: fix pause/continue/play handling
Pausing a decoder followed by a Play command would do nothing. Fixed. Pausing a decoder running at non-standard speed following by a Continue would reset the speed to 100%. Fixed. Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
bc147135bc
commit
ac4251445d
|
@ -417,6 +417,7 @@ struct ivtv_mailbox_data {
|
||||||
#define IVTV_F_I_WORK_HANDLER_YUV 17 /* there is work to be done for YUV */
|
#define IVTV_F_I_WORK_HANDLER_YUV 17 /* there is work to be done for YUV */
|
||||||
#define IVTV_F_I_WORK_HANDLER_PIO 18 /* there is work to be done for PIO */
|
#define IVTV_F_I_WORK_HANDLER_PIO 18 /* there is work to be done for PIO */
|
||||||
#define IVTV_F_I_PIO 19 /* PIO in progress */
|
#define IVTV_F_I_PIO 19 /* PIO in progress */
|
||||||
|
#define IVTV_F_I_DEC_PAUSED 20 /* the decoder is paused */
|
||||||
|
|
||||||
/* Event notifications */
|
/* Event notifications */
|
||||||
#define IVTV_F_I_EV_DEC_STOPPED 28 /* decoder stopped event */
|
#define IVTV_F_I_EV_DEC_STOPPED 28 /* decoder stopped event */
|
||||||
|
|
|
@ -757,6 +757,7 @@ static void ivtv_stop_decoding(struct ivtv_open_id *id, int flags, u64 pts)
|
||||||
itv->output_mode = OUT_NONE;
|
itv->output_mode = OUT_NONE;
|
||||||
|
|
||||||
itv->speed = 0;
|
itv->speed = 0;
|
||||||
|
clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags);
|
||||||
ivtv_release_stream(s);
|
ivtv_release_stream(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -285,6 +285,10 @@ static int ivtv_video_command(struct ivtv *itv, struct ivtv_open_id *id,
|
||||||
|
|
||||||
if (ivtv_set_output_mode(itv, OUT_MPG) != OUT_MPG)
|
if (ivtv_set_output_mode(itv, OUT_MPG) != OUT_MPG)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags)) {
|
||||||
|
/* forces ivtv_set_speed to be called */
|
||||||
|
itv->speed = 0;
|
||||||
|
}
|
||||||
return ivtv_start_decoding(id, vc->play.speed);
|
return ivtv_start_decoding(id, vc->play.speed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -309,6 +313,7 @@ static int ivtv_video_command(struct ivtv *itv, struct ivtv_open_id *id,
|
||||||
if (atomic_read(&itv->decoding) > 0) {
|
if (atomic_read(&itv->decoding) > 0) {
|
||||||
ivtv_vapi(itv, CX2341X_DEC_PAUSE_PLAYBACK, 1,
|
ivtv_vapi(itv, CX2341X_DEC_PAUSE_PLAYBACK, 1,
|
||||||
(vc->flags & VIDEO_CMD_FREEZE_TO_BLACK) ? 1 : 0);
|
(vc->flags & VIDEO_CMD_FREEZE_TO_BLACK) ? 1 : 0);
|
||||||
|
set_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -317,8 +322,10 @@ static int ivtv_video_command(struct ivtv *itv, struct ivtv_open_id *id,
|
||||||
if (try) break;
|
if (try) break;
|
||||||
if (itv->output_mode != OUT_MPG)
|
if (itv->output_mode != OUT_MPG)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
if (atomic_read(&itv->decoding) > 0) {
|
if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags)) {
|
||||||
ivtv_vapi(itv, CX2341X_DEC_START_PLAYBACK, 2, 0, 0);
|
int speed = itv->speed;
|
||||||
|
itv->speed = 0;
|
||||||
|
return ivtv_start_decoding(id, speed);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue