summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libmpeg2/decode.c87
-rw-r--r--src/libmpeg2/mpeg2.h1
-rw-r--r--src/xine-engine/video_out.c6
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); */