From 466900e75d165056a83a6f1ad6af6001ed64b783 Mon Sep 17 00:00:00 2001 From: Guenter Bartsch Date: Thu, 31 May 2001 22:54:38 +0000 Subject: fixed support for field pictures plus video_out bugfixes (missing functions) CVS patchset: 109 CVS date: 2001/05/31 22:54:38 --- src/libmpeg2/decode.c | 69 +++++++++++++++++++++++++++------------------------ 1 file changed, 36 insertions(+), 33 deletions(-) (limited to 'src/libmpeg2/decode.c') diff --git a/src/libmpeg2/decode.c b/src/libmpeg2/decode.c index 847227ebb..ed15bbddf 100644 --- a/src/libmpeg2/decode.c +++ b/src/libmpeg2/decode.c @@ -75,6 +75,8 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code, picture_t * picture; int is_frame_done; + /* printf ("parse_chunk %d\n", code); */ + /* wait for sequence_header_code */ if (mpeg2dec->is_sequence_needed && (code != 0xb3)) return 0; @@ -117,40 +119,40 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code, exit (1); } - /* find out if we want to skip this frame */ - mpeg2dec->drop_frame = 0; - - picture->skip_non_intra_dct = (mpeg2dec->frames_to_drop>0) ; - + if (!picture->second_field) { + /* find out if we want to skip this frame */ + mpeg2dec->drop_frame = 0; + + picture->skip_non_intra_dct = (mpeg2dec->frames_to_drop>0) ; + + switch (picture->picture_coding_type) { + case B_TYPE: - switch (picture->picture_coding_type) { - case B_TYPE: - - if (mpeg2dec->frames_to_drop>1) { - mpeg2dec->drop_frame = 1; - } else if (picture->forward_reference_frame->bFrameBad - || picture->backward_reference_frame->bFrameBad) { - mpeg2dec->drop_frame = 1; - } - break; - - case P_TYPE: - - if (mpeg2dec->frames_to_drop>2) { - mpeg2dec->drop_frame = 1; - } else if (picture->backward_reference_frame->bFrameBad) { - mpeg2dec->drop_frame = 1; - } - break; - - case I_TYPE: - - if (mpeg2dec->frames_to_drop>4) { - mpeg2dec->drop_frame = 1; + if (mpeg2dec->frames_to_drop>1) { + mpeg2dec->drop_frame = 1; + } else if (picture->forward_reference_frame->bFrameBad + || picture->backward_reference_frame->bFrameBad) { + mpeg2dec->drop_frame = 1; + } + break; + + case P_TYPE: + + if (mpeg2dec->frames_to_drop>2) { + mpeg2dec->drop_frame = 1; + } else if (picture->backward_reference_frame->bFrameBad) { + mpeg2dec->drop_frame = 1; + } + break; + + case I_TYPE: + + if (mpeg2dec->frames_to_drop>4) { + mpeg2dec->drop_frame = 1; + } + break; } - break; } - break; case 0xb3: /* sequence_header_code */ @@ -197,9 +199,9 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code, if (!(mpeg2dec->in_slice)) { mpeg2dec->in_slice = 1; - if (picture->second_field) + if (picture->second_field) picture->current_frame->field(picture->current_frame, - picture->picture_structure); + picture->picture_structure); else { if (picture->picture_coding_type == B_TYPE) picture->throwaway_frame = picture->current_frame = @@ -239,6 +241,7 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code, } } + /* printf ("parse_chunk %d completed\n", code); */ return is_frame_done; } -- cgit v1.2.3