From f86f7a3a08809f55d0218312a8986c9693899245 Mon Sep 17 00:00:00 2001 From: Michael Roitzsch Date: Tue, 5 Aug 2003 15:09:23 +0000 Subject: handle dvdnav aspect force hints correctly with pan&scan CVS patchset: 5250 CVS date: 2003/08/05 15:09:23 --- src/libmpeg2/decode.c | 10 ++++++++-- src/libmpeg2/mpeg2.h | 1 + src/libmpeg2/xine_decoder.c | 12 +++++++----- 3 files changed, 16 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/libmpeg2/decode.c b/src/libmpeg2/decode.c index 372afd403..4ce672022 100644 --- a/src/libmpeg2/decode.c +++ b/src/libmpeg2/decode.c @@ -395,6 +395,7 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code, data.width = picture->coded_picture_width; data.height = picture->coded_picture_height; data.aspect = picture->aspect_ratio_information; + data.pan_scan = mpeg2dec->force_pan_scan; xine_event_send(mpeg2dec->stream, &event); mpeg2dec->stream->stream_info[XINE_STREAM_INFO_VIDEO_WIDTH] @@ -453,6 +454,9 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code, else mpeg2dec->drop_frame = 1; } else { + int flags = VO_INTERLACED_FLAG | picture->picture_structure; + if (mpeg2dec->force_pan_scan) flags |= VO_PAN_SCAN_FLAG; + if ( picture->current_frame && picture->current_frame != picture->backward_reference_frame && picture->current_frame != picture->forward_reference_frame ) { @@ -482,7 +486,7 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code, picture->coded_picture_height, ratio, XINE_IMGFMT_YV12, - VO_INTERLACED_FLAG | picture->picture_structure); + flags); else { picture->current_frame = mpeg2dec->stream->video_out->get_frame (mpeg2dec->stream->video_out, @@ -490,7 +494,7 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code, picture->coded_picture_height, ratio, XINE_IMGFMT_YV12, - (VO_INTERLACED_FLAG | VO_PREDICTION_FLAG | picture->picture_structure)); + flags); if (picture->forward_reference_frame && picture->forward_reference_frame != picture->backward_reference_frame) picture->forward_reference_frame->free (picture->forward_reference_frame); @@ -804,6 +808,7 @@ void mpeg2_find_sequence_header (mpeg2dec_t * mpeg2dec, data.width = picture->coded_picture_width; data.height = picture->coded_picture_height; data.aspect = picture->aspect_ratio_information; + data.pan_scan = mpeg2dec->force_pan_scan; xine_event_send(mpeg2dec->stream, &event); mpeg2dec->stream->stream_info[XINE_STREAM_INFO_VIDEO_WIDTH] @@ -852,6 +857,7 @@ static void process_userdata(mpeg2dec_t *mpeg2dec, uint8_t *buffer) data.width = mpeg2dec->picture->coded_picture_width; data.height = mpeg2dec->picture->coded_picture_height; data.aspect = mpeg2dec->picture->aspect_ratio_information; + data.pan_scan = mpeg2dec->force_pan_scan; xine_event_send(mpeg2dec->stream, &event); mpeg2dec->stream->stream_info[XINE_STREAM_INFO_VIDEO_WIDTH] diff --git a/src/libmpeg2/mpeg2.h b/src/libmpeg2/mpeg2.h index bb3ef96d5..2fdbacdce 100644 --- a/src/libmpeg2/mpeg2.h +++ b/src/libmpeg2/mpeg2.h @@ -45,6 +45,7 @@ typedef struct mpeg2dec_s { int64_t pts; uint32_t rff_pattern; int force_aspect; + int force_pan_scan; xine_stream_t *stream; diff --git a/src/libmpeg2/xine_decoder.c b/src/libmpeg2/xine_decoder.c index 073ed47e7..7b1313e85 100644 --- a/src/libmpeg2/xine_decoder.c +++ b/src/libmpeg2/xine_decoder.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: xine_decoder.c,v 1.48 2003/08/04 03:47:09 miguelfreitas Exp $ + * $Id: xine_decoder.c,v 1.49 2003/08/05 15:09:23 mroi Exp $ * * stuff needed to turn libmpeg2 into a xine decoder plugin */ @@ -63,9 +63,11 @@ static void mpeg2dec_decode_data (video_decoder_t *this_gen, buf_element_t *buf) if (buf->decoder_flags & BUF_FLAG_SPECIAL) { if (buf->decoder_info[1] == BUF_SPECIAL_ASPECT) { this->mpeg2.force_aspect = buf->decoder_info[2]; - if (buf->decoder_info[3] == 0x1 && buf->decoder_info[2] == XINE_VO_ASPECT_ANAMORPHIC) - /* letterboxing is denied, we have to do pan&scan */ - this->mpeg2.force_aspect = XINE_VO_ASPECT_PAN_SCAN; + if (buf->decoder_info[3] == 0x1 && buf->decoder_info[2] == 3) + /* letterboxing is denied, we have to do pan&scan */ + this->mpeg2.force_pan_scan = 1; + else + this->mpeg2.force_pan_scan = 0; } return; } @@ -137,7 +139,7 @@ static video_decoder_t *open_plugin (video_decoder_class_t *class_gen, xine_stre mpeg2_init (&this->mpeg2); stream->video_out->open(stream->video_out, stream); - this->mpeg2.force_aspect = 0; + this->mpeg2.force_aspect = this->mpeg2.force_pan_scan = 0; return &this->video_decoder; } -- cgit v1.2.3