Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=ac4251445d7302697814351f1d9f548f5aa49342
Commit:     ac4251445d7302697814351f1d9f548f5aa49342
Parent:     bc147135bc410bdd9da684646af75a188d882d56
Author:     Hans Verkuil <[EMAIL PROTECTED]>
AuthorDate: Sun Jul 22 08:46:38 2007 -0300
Committer:  Mauro Carvalho Chehab <[EMAIL PROTECTED]>
CommitDate: Mon Jul 30 16:26:32 2007 -0300

    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 <[EMAIL PROTECTED]>
    Signed-off-by: Mauro Carvalho Chehab <[EMAIL PROTECTED]>
---
 drivers/media/video/ivtv/ivtv-driver.h  |    1 +
 drivers/media/video/ivtv/ivtv-fileops.c |    1 +
 drivers/media/video/ivtv/ivtv-ioctl.c   |   11 +++++++++--
 3 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/media/video/ivtv/ivtv-driver.h 
b/drivers/media/video/ivtv/ivtv-driver.h
index 91b588d..8abb34a 100644
--- a/drivers/media/video/ivtv/ivtv-driver.h
+++ b/drivers/media/video/ivtv/ivtv-driver.h
@@ -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_PIO  18  /* there is work to be done for PIO */
 #define IVTV_F_I_PIO              19   /* PIO in progress */
+#define IVTV_F_I_DEC_PAUSED       20   /* the decoder is paused */
 
 /* Event notifications */
 #define IVTV_F_I_EV_DEC_STOPPED           28   /* decoder stopped event */
diff --git a/drivers/media/video/ivtv/ivtv-fileops.c 
b/drivers/media/video/ivtv/ivtv-fileops.c
index 8e97a93..baa17cb 100644
--- a/drivers/media/video/ivtv/ivtv-fileops.c
+++ b/drivers/media/video/ivtv/ivtv-fileops.c
@@ -757,6 +757,7 @@ static void ivtv_stop_decoding(struct ivtv_open_id *id, int 
flags, u64 pts)
            itv->output_mode = OUT_NONE;
 
        itv->speed = 0;
+       clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags);
        ivtv_release_stream(s);
 }
 
diff --git a/drivers/media/video/ivtv/ivtv-ioctl.c 
b/drivers/media/video/ivtv/ivtv-ioctl.c
index 4773453..047624b 100644
--- a/drivers/media/video/ivtv/ivtv-ioctl.c
+++ b/drivers/media/video/ivtv/ivtv-ioctl.c
@@ -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)
                        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);
        }
 
@@ -309,6 +313,7 @@ static int ivtv_video_command(struct ivtv *itv, struct 
ivtv_open_id *id,
                if (atomic_read(&itv->decoding) > 0) {
                        ivtv_vapi(itv, CX2341X_DEC_PAUSE_PLAYBACK, 1,
                                (vc->flags & VIDEO_CMD_FREEZE_TO_BLACK) ? 1 : 
0);
+                       set_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags);
                }
                break;
 
@@ -317,8 +322,10 @@ static int ivtv_video_command(struct ivtv *itv, struct 
ivtv_open_id *id,
                if (try) break;
                if (itv->output_mode != OUT_MPG)
                        return -EBUSY;
-               if (atomic_read(&itv->decoding) > 0) {
-                       ivtv_vapi(itv, CX2341X_DEC_START_PLAYBACK, 2, 0, 0);
+               if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags)) {
+                       int speed = itv->speed;
+                       itv->speed = 0;
+                       return ivtv_start_decoding(id, speed);
                }
                break;
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to