diff options
author | Michael Roitzsch <mroi@users.sourceforge.net> | 2002-12-08 15:56:23 +0000 |
---|---|---|
committer | Michael Roitzsch <mroi@users.sourceforge.net> | 2002-12-08 15:56:23 +0000 |
commit | accaed820097dfce2044866c364141df4156ae3b (patch) | |
tree | e7ebc966279e2b5b0dbca558a1996565c8d4364d | |
parent | 93641eb17c0bf9ad8d13c7c631d1a5af8e07c239 (diff) | |
download | xine-lib-accaed820097dfce2044866c364141df4156ae3b.tar.gz xine-lib-accaed820097dfce2044866c364141df4156ae3b.tar.bz2 |
- fix a rare, but longstanding dxr3 bug:
In some still menus, the highlights do not move. This is because these stills
had no proper end sequence in the MPEG stream which confused the card. We now
add an end sequence for these.
- In TV mode, tag all frames progressive. This prevents the dxr3 from sometimes
forgetting the second field during a still and makes the sill less jittering.
CVS patchset: 3462
CVS date: 2002/12/08 15:56:23
-rw-r--r-- | src/dxr3/dxr3_decode_video.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/src/dxr3/dxr3_decode_video.c b/src/dxr3/dxr3_decode_video.c index f6f2f3dc1..2880f1cec 100644 --- a/src/dxr3/dxr3_decode_video.c +++ b/src/dxr3/dxr3_decode_video.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: dxr3_decode_video.c,v 1.22 2002/11/20 11:57:42 mroi Exp $ + * $Id: dxr3_decode_video.c,v 1.23 2002/12/08 15:56:23 mroi Exp $ */ /* dxr3 video decoder plugin. @@ -113,6 +113,7 @@ typedef struct dxr3_decoder_s { int fd_video; /* to access the dxr3 devices */ int have_header_info; + int sequence_open; int width; int height; int aspect; @@ -229,6 +230,7 @@ static video_decoder_t *dxr3_open_plugin(video_decoder_class_t *class_gen, xine_ } this->have_header_info = 0; + this->sequence_open = 0; this->repeat_first_field = 0; this->force_aspect = 0; @@ -294,7 +296,7 @@ static void dxr3_decode_data(video_decoder_t *this_gen, buf_element_t *buf) vo_frame_t *img; uint8_t *buffer, byte; uint32_t shift; - + vpts = 0; /* handle aspect hints from xine-dvdnav */ @@ -338,12 +340,17 @@ static void dxr3_decode_data(video_decoder_t *this_gen, buf_element_t *buf) if (byte == 0xb3) { /* sequence data */ parse_mpeg_header(this, buffer); + this->sequence_open = 1; continue; } if (byte == 0xb5) { /* extension data */ - if ((buffer[0] & 0xf0) == 0x80) + if ((buffer[0] & 0xf0) == 0x80) { this->repeat_first_field = (buffer[3] >> 1) & 1; + if (!this->dxr3_vo->overlay_enabled) + /* in tv modes we tag all frames progressive to avoid still jitter */ + buffer[4] |= 0x80; + } /* check if we can keep syncing */ if (this->repeat_first_field && this->sync_retry) /* reset counter */ this->sync_retry = 500; @@ -357,6 +364,9 @@ static void dxr3_decode_data(video_decoder_t *this_gen, buf_element_t *buf) } continue; } + if (byte == 0xb7) + /* sequence end */ + this->sequence_open = 0; if (byte != 0x00) /* Don't care what it is. It's not a new frame */ continue; /* we have a code for a new frame */ @@ -542,6 +552,9 @@ static void dxr3_decode_data(video_decoder_t *this_gen, buf_element_t *buf) static void dxr3_reset(video_decoder_t *this_gen) { + dxr3_decoder_t *this = (dxr3_decoder_t *)this_gen; + + this->sequence_open = 0; } static void dxr3_discontinuity(video_decoder_t *this_gen) @@ -552,7 +565,17 @@ static void dxr3_flush(video_decoder_t *this_gen) { dxr3_decoder_t *this = (dxr3_decoder_t *)this_gen; - if (this->fd_video >= 0) fsync(this->fd_video); + if (this->sequence_open && + this->stream->stream_info[XINE_STREAM_INFO_VIDEO_HAS_STILL]) { + /* The dxr3 needs a sequence end code for still menus to work correctly + * (the highlights won't move without), but some dvds have stills + * with no sequence end code. Since it is very likely that flush() is called + * in still situations, we send one here. */ + static uint8_t end_buffer[4] = { 0x00, 0x00, 0x01, 0xb7 }; + write(this->fd_video, &end_buffer, 4); + this->sequence_open = 0; + printf("dxr3_decode_video: WARNING: added missing end sequence\n"); + } } static void dxr3_dispose(video_decoder_t *this_gen) |