diff options
author | Ian Armstrong <ian@iarmst.demon.co.uk> | 2007-08-03 09:01:39 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2007-10-09 21:04:29 -0400 |
commit | bfd7beacff2b5c811badb587a74c3dfbf7f98721 (patch) | |
tree | 47628dfa13bc221e2a5466934830ca54a6f46bc0 /drivers/media/video/ivtv/ivtv-driver.h | |
parent | 943e8910db31e36d945f2bf7d4c273ca5fa01f6e (diff) |
V4L/DVB (5973): ivtv: attach yuv field order to each frame
In the current driver, the field order is global. As soon as it's changed it
takes immediate effect. This is a problem when the video changes order mid
stream. Although it mostly works okay, the video may judder / flicker.
This patch attaches the field order to the frame, so that any buffered frames
will not be displayed until the correct field. In the event that the field
order is changed mid stream, the driver will ensure that the previous frame
is displayed for a minimum of 3 fields. These are the two original fields the
frame should have occupied, plus the one extra since the new frame still has
to wait for the correct field.
Signed-off-by: Ian Armstrong <ian@iarmst.demon.co.uk>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/video/ivtv/ivtv-driver.h')
-rw-r--r-- | drivers/media/video/ivtv/ivtv-driver.h | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/media/video/ivtv/ivtv-driver.h b/drivers/media/video/ivtv/ivtv-driver.h index 6e53a1f04f7e..6c7c9a57a1ab 100644 --- a/drivers/media/video/ivtv/ivtv-driver.h +++ b/drivers/media/video/ivtv/ivtv-driver.h | |||
@@ -531,6 +531,7 @@ struct yuv_frame_info | |||
531 | u32 tru_w; | 531 | u32 tru_w; |
532 | u32 tru_h; | 532 | u32 tru_h; |
533 | u32 offset_y; | 533 | u32 offset_y; |
534 | int lace_mode; | ||
534 | }; | 535 | }; |
535 | 536 | ||
536 | #define IVTV_YUV_MODE_INTERLACED 0x00 | 537 | #define IVTV_YUV_MODE_INTERLACED 0x00 |
@@ -603,7 +604,6 @@ struct yuv_playback_info | |||
603 | int decode_height; | 604 | int decode_height; |
604 | 605 | ||
605 | int frame_interlaced; | 606 | int frame_interlaced; |
606 | int frame_interlaced_last; | ||
607 | 607 | ||
608 | int lace_mode; | 608 | int lace_mode; |
609 | int lace_threshold; | 609 | int lace_threshold; |
@@ -614,6 +614,11 @@ struct yuv_playback_info | |||
614 | 614 | ||
615 | u32 yuv_forced_update; | 615 | u32 yuv_forced_update; |
616 | int update_frame; | 616 | int update_frame; |
617 | |||
618 | int sync_field[4]; /* Field to sync on */ | ||
619 | int field_delay[4]; /* Flag to extend duration of previous frame */ | ||
620 | u8 fields_lapsed; /* Counter used when delaying a frame */ | ||
621 | |||
617 | struct yuv_frame_info new_frame_info[4]; | 622 | struct yuv_frame_info new_frame_info[4]; |
618 | struct yuv_frame_info old_frame_info; | 623 | struct yuv_frame_info old_frame_info; |
619 | struct yuv_frame_info old_frame_info_args; | 624 | struct yuv_frame_info old_frame_info_args; |