diff options
-rw-r--r-- | src/libmpeg2/decode.c | 87 | ||||
-rw-r--r-- | src/libmpeg2/mpeg2.h | 1 | ||||
-rw-r--r-- | src/xine-engine/video_out.c | 6 |
3 files changed, 57 insertions, 37 deletions
diff --git a/src/libmpeg2/decode.c b/src/libmpeg2/decode.c index dfbf3073f..d23d8d106 100644 --- a/src/libmpeg2/decode.c +++ b/src/libmpeg2/decode.c @@ -62,6 +62,7 @@ void mpeg2_init (mpeg2dec_t * mpeg2dec, mpeg2dec->output = output; mpeg2dec->chunk_ptr = mpeg2dec->chunk_buffer; mpeg2dec->code = 0xb4; + mpeg2dec->seek_mode = 1; memset (mpeg2dec->picture, 0, sizeof (picture_t)); @@ -153,6 +154,7 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code, break; } } + break; case 0xb3: /* sequence_header_code */ @@ -170,6 +172,7 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code, IMGFMT_YV12, picture->frame_duration); picture->forward_reference_frame->PTS = 0; + picture->forward_reference_frame->bFrameBad = 1; picture->backward_reference_frame = mpeg2dec->output->get_frame (mpeg2dec->output, picture->coded_picture_width, @@ -178,6 +181,7 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code, IMGFMT_YV12, picture->frame_duration); picture->backward_reference_frame->PTS = 0; + picture->backward_reference_frame->bFrameBad = 1; } break; @@ -293,6 +297,12 @@ int mpeg2_decode_data (mpeg2dec_t * mpeg2dec, uint8_t * current, uint8_t * end, ret = 0; mpeg2dec->pts = pts; + if (mpeg2dec->seek_mode) { + mpeg2dec->chunk_ptr = mpeg2dec->chunk_buffer; + mpeg2dec->code = 0xb4; + mpeg2dec->seek_mode = 0; + } + while (current != end) { code = mpeg2dec->code; current = copy_chunk (mpeg2dec, current, end); @@ -328,44 +338,53 @@ void mpeg2_close (mpeg2dec_t * mpeg2dec) void mpeg2_find_sequence_header (mpeg2dec_t * mpeg2dec, uint8_t * current, uint8_t * end){ - uint8_t code; - picture_t *picture = mpeg2dec->picture; + uint8_t code; + picture_t *picture = mpeg2dec->picture; - while (current != end) { - code = mpeg2dec->code; - current = copy_chunk (mpeg2dec, current, end); - if (current == NULL) - return ; + while (current != end) { + code = mpeg2dec->code; + current = copy_chunk (mpeg2dec, current, end); + if (current == NULL) + return ; - if (code == 0xb3) { /* sequence_header_code */ - if (header_process_sequence_header (picture, mpeg2dec->chunk_buffer)) { - printf ("libmpeg2: bad sequence header\n"); - return; - } + stats_header (code, mpeg2dec->chunk_buffer); + + if (code == 0xb3) { /* sequence_header_code */ + if (header_process_sequence_header (picture, mpeg2dec->chunk_buffer)) { + printf ("libmpeg2: bad sequence header\n"); + continue; + } - if (mpeg2dec->is_sequence_needed) { - printf ("libmpeg2: found sequence header! :-)\n"); - - mpeg2dec->is_sequence_needed = 0; - picture->forward_reference_frame = - mpeg2dec->output->get_frame (mpeg2dec->output, - picture->coded_picture_width, - picture->coded_picture_height, - picture->aspect_ratio_information, - IMGFMT_YV12, - picture->frame_duration); - picture->forward_reference_frame->PTS = 0; - picture->backward_reference_frame = - mpeg2dec->output->get_frame (mpeg2dec->output, - picture->coded_picture_width, - picture->coded_picture_height, - picture->aspect_ratio_information, - IMGFMT_YV12, - picture->frame_duration); - picture->backward_reference_frame->PTS = 0; + if (mpeg2dec->is_sequence_needed) { + printf ("libmpeg2: found sequence header! :-)\n"); + + mpeg2dec->is_sequence_needed = 0; + picture->forward_reference_frame = + mpeg2dec->output->get_frame (mpeg2dec->output, + picture->coded_picture_width, + picture->coded_picture_height, + picture->aspect_ratio_information, + IMGFMT_YV12, + picture->frame_duration); + picture->forward_reference_frame->PTS = 0; + picture->forward_reference_frame->bFrameBad = 1; + picture->backward_reference_frame = + mpeg2dec->output->get_frame (mpeg2dec->output, + picture->coded_picture_width, + picture->coded_picture_height, + picture->aspect_ratio_information, + IMGFMT_YV12, + picture->frame_duration); + picture->backward_reference_frame->PTS = 0; + picture->backward_reference_frame->bFrameBad = 1; - } - } + } + } else if (code == 0xb5) { /* extension_start_code */ + if (header_process_extension (picture, mpeg2dec->chunk_buffer)) { + printf ("mpeg2dec: bad extension\n"); + continue ; + } } + } } diff --git a/src/libmpeg2/mpeg2.h b/src/libmpeg2/mpeg2.h index 69a4ba03d..7f70bca05 100644 --- a/src/libmpeg2/mpeg2.h +++ b/src/libmpeg2/mpeg2.h @@ -32,6 +32,7 @@ typedef struct mpeg2dec_s { int is_sequence_needed; int frames_to_drop, drop_frame; int in_slice; + int seek_mode; /* the maximum chunk size is determined by vbv_buffer_size */ /* which is 224K for MP@ML streams. */ diff --git a/src/xine-engine/video_out.c b/src/xine-engine/video_out.c index 132392ad0..d5573c77c 100644 --- a/src/xine-engine/video_out.c +++ b/src/xine-engine/video_out.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: video_out.c,v 1.20 2001/06/14 20:50:06 guenter Exp $ + * $Id: video_out.c,v 1.21 2001/06/16 12:56:29 guenter Exp $ * */ @@ -119,9 +119,9 @@ static void vo_set_timer (uint32_t video_step) { struct itimerval tval; tval.it_interval.tv_sec = 0; - tval.it_interval.tv_usec = video_step*200000/90000; + tval.it_interval.tv_usec = video_step*100000/90000; tval.it_value.tv_sec = 0; - tval.it_value.tv_usec = video_step*200000/90000; + tval.it_value.tv_usec = video_step*100000/90000; /* printf ("video_out: tval.it_interval.tv_usec = %d\n", tval.it_interval.tv_usec); */ |