diff options
Diffstat (limited to 'src/libmpeg2')
-rw-r--r-- | src/libmpeg2/decode.c | 14 | ||||
-rw-r--r-- | src/libmpeg2/mpeg2.h | 2 | ||||
-rw-r--r-- | src/libmpeg2/xine_decoder.c | 3 |
3 files changed, 14 insertions, 5 deletions
diff --git a/src/libmpeg2/decode.c b/src/libmpeg2/decode.c index d23d8d106..cc813ba82 100644 --- a/src/libmpeg2/decode.c +++ b/src/libmpeg2/decode.c @@ -82,6 +82,9 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code, if (mpeg2dec->is_sequence_needed && (code != 0xb3)) return 0; + if (mpeg2dec->is_frame_needed && (code != 0x00)) + return 0; + stats_header (code, buffer); picture = mpeg2dec->picture; @@ -93,7 +96,7 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code, if (((picture->picture_structure == FRAME_PICTURE) || (picture->second_field)) ) { - picture->current_frame->bFrameBad = mpeg2dec->drop_frame; + picture->current_frame->bFrameBad |= mpeg2dec->drop_frame; if (picture->picture_coding_type == B_TYPE) { if (picture->mpeg1) @@ -120,6 +123,8 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code, exit (1); } + mpeg2dec->is_frame_needed=0; + if (!picture->second_field) { /* find out if we want to skip this frame */ mpeg2dec->drop_frame = 0; @@ -229,6 +234,7 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code, picture->backward_reference_frame; picture->backward_reference_frame = picture->current_frame; } + picture->current_frame->bFrameBad = 0; picture->current_frame->PTS = mpeg2dec->pts; mpeg2dec->pts = 0; @@ -301,6 +307,8 @@ int mpeg2_decode_data (mpeg2dec_t * mpeg2dec, uint8_t * current, uint8_t * end, mpeg2dec->chunk_ptr = mpeg2dec->chunk_buffer; mpeg2dec->code = 0xb4; mpeg2dec->seek_mode = 0; + mpeg2dec->shift = 0xffffff00; + mpeg2dec->is_frame_needed = 1; } while (current != end) { @@ -310,6 +318,7 @@ int mpeg2_decode_data (mpeg2dec_t * mpeg2dec, uint8_t * current, uint8_t * end, return ret; ret += parse_chunk (mpeg2dec, code, mpeg2dec->chunk_buffer); } + return ret; } @@ -318,7 +327,7 @@ void mpeg2_close (mpeg2dec_t * mpeg2dec) static uint8_t finalizer[] = {0,0,1,0xb4}; picture_t *picture = mpeg2dec->picture; - mpeg2_decode_data (mpeg2dec, finalizer, finalizer+4, 0); + /* mpeg2_decode_data (mpeg2dec, finalizer, finalizer+4, 0); */ if (picture->throwaway_frame) picture->throwaway_frame->free (picture->throwaway_frame); @@ -356,7 +365,6 @@ void mpeg2_find_sequence_header (mpeg2dec_t * mpeg2dec, } if (mpeg2dec->is_sequence_needed) { - printf ("libmpeg2: found sequence header! :-)\n"); mpeg2dec->is_sequence_needed = 0; picture->forward_reference_frame = diff --git a/src/libmpeg2/mpeg2.h b/src/libmpeg2/mpeg2.h index 7f70bca05..4172d2291 100644 --- a/src/libmpeg2/mpeg2.h +++ b/src/libmpeg2/mpeg2.h @@ -32,7 +32,7 @@ typedef struct mpeg2dec_s { int is_sequence_needed; int frames_to_drop, drop_frame; int in_slice; - int seek_mode; + int seek_mode, is_frame_needed; /* the maximum chunk size is determined by vbv_buffer_size */ /* which is 224K for MP@ML streams. */ diff --git a/src/libmpeg2/xine_decoder.c b/src/libmpeg2/xine_decoder.c index 9094ecb0f..7490e9e56 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.8 2001/06/14 09:19:44 guenter Exp $ + * $Id: xine_decoder.c,v 1.9 2001/06/16 14:34:49 guenter Exp $ * * stuff needed to turn libmpeg2 into a xine decoder plugin */ @@ -69,6 +69,7 @@ static void mpeg2dec_close (video_decoder_t *this_gen) { mpeg2dec_decoder_t *this = (mpeg2dec_decoder_t *) this_gen; mpeg2_close (&this->mpeg2); + this->video_out->close(this->video_out); } |