From 3d6c5f3ff9d35a4d3cd04e449647a0082d2b8da0 Mon Sep 17 00:00:00 2001 From: James Courtier-Dutton Date: Sat, 14 Jun 2003 01:14:05 +0000 Subject: More picture info added. Small cleanup. CVS patchset: 5042 CVS date: 2003/06/14 01:14:05 --- src/libmpeg2new/libmpeg2/cpu_accel.c | 2 ++ src/libmpeg2new/libmpeg2/decode.c | 49 ------------------------------------ src/libmpeg2new/libmpeg2/header.c | 22 +--------------- src/libmpeg2new/xine_decoder.c | 24 ++++++++++++------ 4 files changed, 20 insertions(+), 77 deletions(-) (limited to 'src') diff --git a/src/libmpeg2new/libmpeg2/cpu_accel.c b/src/libmpeg2new/libmpeg2/cpu_accel.c index a1096f2ef..dac3cf83d 100644 --- a/src/libmpeg2new/libmpeg2/cpu_accel.c +++ b/src/libmpeg2new/libmpeg2/cpu_accel.c @@ -27,6 +27,8 @@ #include "../include/mpeg2.h" +#define ACCEL_DETECT /* Force accel on */ + #ifdef ACCEL_DETECT #ifdef ARCH_X86 static inline uint32_t arch_accel (void) diff --git a/src/libmpeg2new/libmpeg2/decode.c b/src/libmpeg2new/libmpeg2/decode.c index 382798f75..640861b5c 100644 --- a/src/libmpeg2new/libmpeg2/decode.c +++ b/src/libmpeg2new/libmpeg2/decode.c @@ -161,20 +161,6 @@ mpeg2_state_t mpeg2_parse (mpeg2dec_t * mpeg2dec) { int size_buffer, size_chunk, copied; - printf("mpeg2dec-lib:decode.c:CODE=%x\n",mpeg2dec->code); - printf("mpeg2_parse:mpeg2dec->fbuf[0]=%p",mpeg2dec->fbuf[0]); - if (mpeg2dec->fbuf[0]) printf(", img=%p\n", mpeg2dec->fbuf[0]->id); - else printf("\n"); - printf("mpeg2_parse:mpeg2dec->fbuf[1]=%p",mpeg2dec->fbuf[1]); - if (mpeg2dec->fbuf[1]) printf(", img=%p\n", mpeg2dec->fbuf[1]->id); - else printf("\n"); - printf("mpeg2_parse:mpeg2dec->fbuf[2]=%p",mpeg2dec->fbuf[2]); - if (mpeg2dec->fbuf[2]) printf(", img=%p\n", mpeg2dec->fbuf[2]->id); - else printf("\n"); - printf("mpeg2_parse:mpeg2dec->decoder->pictures[0]=%p\n",&mpeg2dec->pictures[0]); - printf("mpeg2_parse:mpeg2dec->decoder->pictures[1]=%p\n",&mpeg2dec->pictures[1]); - printf("mpeg2_parse:mpeg2dec->decoder->pictures[2]=%p\n",&mpeg2dec->pictures[2]); - printf("mpeg2_parse:mpeg2dec->decoder->pictures[3]=%p\n",&mpeg2dec->pictures[3]); if (mpeg2dec->action) { mpeg2_state_t state; @@ -202,7 +188,6 @@ mpeg2_state_t mpeg2_parse (mpeg2dec_t * mpeg2dec) /* filled the chunk buffer without finding a start code */ mpeg2dec->bytes_since_pts += size_chunk; mpeg2dec->action = seek_chunk; - printf("mpeg2dec:action = mpeg2_seek_chunk\n"); return STATE_INVALID; } } @@ -218,21 +203,13 @@ mpeg2_state_t mpeg2_parse (mpeg2dec_t * mpeg2dec) if (seek_chunk (mpeg2dec) == STATE_BUFFER) return STATE_BUFFER; } - printf("mpeg2dec-lib:decode.c:CODE2=%x\n",mpeg2dec->code); - printf("mpeg2_parse:mpeg2dec->fbuf[0]=%p\n",mpeg2dec->fbuf[0]); - printf("mpeg2_parse:mpeg2dec->fbuf[1]=%p\n",mpeg2dec->fbuf[1]); - printf("mpeg2_parse:mpeg2dec->fbuf[2]=%p\n",mpeg2dec->fbuf[2]); switch (mpeg2dec->code) { case 0x00: mpeg2dec->action = mpeg2_header_picture_start; - printf("mpeg2dec:action = mpeg2_header_picture_start\n"); - printf("mpeg2dec:returning state = %d\n", mpeg2dec->state); if (mpeg2dec->state == STATE_SLICE) { - printf("mpeg2dec:slicing info0\n"); mpeg2dec->info.current_picture = mpeg2dec->info.current_picture_2nd = NULL; mpeg2dec->info.display_picture = mpeg2dec->info.display_picture_2nd = NULL; mpeg2dec->info.current_fbuf = mpeg2dec->info.display_fbuf = mpeg2dec->info.discard_fbuf = NULL; - printf("mpeg2dec:reset_info in CODE\n"); mpeg2dec->info.user_data = NULL; mpeg2dec->info.user_data_len = 0; @@ -241,37 +218,29 @@ mpeg2_state_t mpeg2_parse (mpeg2dec_t * mpeg2dec) mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[0]; mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[0]; mpeg2dec->fbuf[0]=0; - printf("mpeg2dec:mpeg_parse:discard_fbuf=fbuf[0]\n"); } else { mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[1]; mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[2]; mpeg2dec->fbuf[2]=0; - printf("mpeg2dec:mpeg_parse:discard_fbuf=fbuf[2]\n"); } } return mpeg2dec->state; case 0xb7: mpeg2dec->action = mpeg2_header_end; - printf("mpeg2dec:action = mpeg2_header_end\n"); break; case 0xb3: case 0xb8: mpeg2dec->action = mpeg2_parse_header; - printf("mpeg2dec:action = mpeg2_parse_header\n"); break; default: mpeg2dec->action = seek_chunk; - printf("mpeg2dec:action = seek_chunk\n"); - printf("mpeg2dec:returning state = %d\n", mpeg2dec->state); return STATE_INVALID; } if (mpeg2dec->state == STATE_SLICE) { - printf("mpeg2dec:slicing info\n"); mpeg2dec->info.current_picture = mpeg2dec->info.current_picture_2nd = NULL; mpeg2dec->info.display_picture = mpeg2dec->info.display_picture_2nd = NULL; mpeg2dec->info.current_fbuf = mpeg2dec->info.display_fbuf = mpeg2dec->info.discard_fbuf = NULL; - printf("mpeg2dec:reset_info in CODE\n"); mpeg2dec->info.user_data = NULL; mpeg2dec->info.user_data_len = 0; @@ -280,18 +249,15 @@ mpeg2_state_t mpeg2_parse (mpeg2dec_t * mpeg2dec) mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[0]; mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[0]; mpeg2dec->fbuf[0]=0; - printf("mpeg2dec:mpeg_parse:discard_fbuf=fbuf[0]\n"); } else { mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[1]; mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[2]; mpeg2dec->fbuf[2]=0; - printf("mpeg2dec:mpeg_parse:discard_fbuf=fbuf[2]\n"); } } - printf("mpeg2dec:returning state = %d\n", mpeg2dec->state); return (mpeg2dec->state == STATE_SLICE) ? STATE_SLICE : STATE_INVALID; } @@ -304,7 +270,6 @@ mpeg2_state_t mpeg2_parse_header (mpeg2dec_t * mpeg2dec) int size_buffer, size_chunk, copied; mpeg2dec->action = mpeg2_parse_header; - printf("mpeg2dec:action = mpeg2_parse_header\n"); while (1) { size_buffer = mpeg2dec->buf_end - mpeg2dec->buf_start; size_chunk = (mpeg2dec->chunk_buffer + BUFFER_SIZE - @@ -323,7 +288,6 @@ mpeg2_state_t mpeg2_parse_header (mpeg2dec_t * mpeg2dec) mpeg2dec->bytes_since_pts += size_chunk; mpeg2dec->code = 0xb4; mpeg2dec->action = seek_header; - printf("mpeg2dec:action = seek_header\n"); return STATE_INVALID; } } @@ -332,18 +296,15 @@ mpeg2_state_t mpeg2_parse_header (mpeg2dec_t * mpeg2dec) if (process_header[mpeg2dec->code & 0x0b] (mpeg2dec)) { mpeg2dec->code = mpeg2dec->buf_start[-1]; mpeg2dec->action = seek_header; - printf("mpeg2dec:action = seek_header\n"); return STATE_INVALID; } mpeg2dec->code = mpeg2dec->buf_start[-1]; - printf("mpeg2dec:CODE3=%x, state=%x\n",mpeg2dec->code, mpeg2dec->state); switch (RECEIVED (mpeg2dec->code, mpeg2dec->state)) { /* state transition after a sequence header */ case RECEIVED (0x00, STATE_SEQUENCE): mpeg2dec->action = mpeg2_header_picture_start; - printf("mpeg2dec:action = mpeg2_header_picture_start\n"); case RECEIVED (0xb8, STATE_SEQUENCE): mpeg2_header_sequence_finalize (mpeg2dec); break; @@ -351,13 +312,11 @@ mpeg2_state_t mpeg2_parse_header (mpeg2dec_t * mpeg2dec) /* other legal state transitions */ case RECEIVED (0x00, STATE_GOP): mpeg2dec->action = mpeg2_header_picture_start; - printf("mpeg2dec:action = mpeg2_header_picture_start\n"); break; case RECEIVED (0x01, STATE_PICTURE): case RECEIVED (0x01, STATE_PICTURE_2ND): mpeg2_header_matrix_finalize (mpeg2dec); mpeg2dec->action = mpeg2_header_slice_start; - printf("mpeg2dec:action = mpeg2_header_slice_start\n"); break; /* legal headers within a given state */ @@ -373,7 +332,6 @@ mpeg2_state_t mpeg2_parse_header (mpeg2dec_t * mpeg2dec) default: mpeg2dec->action = seek_header; - printf("mpeg2dec:action = seek_header\n"); return STATE_INVALID; } @@ -500,20 +458,13 @@ mpeg2dec_t * mpeg2_init (void) mpeg2dec->shift = 0xffffff00; mpeg2dec->action = mpeg2_seek_sequence; - printf("mpeg2dec:action = mpeg2_seek_sequence\n"); mpeg2dec->code = 0xb4; mpeg2dec->first_decode_slice = 1; mpeg2dec->nb_decode_slices = 0xb0 - 1; mpeg2dec->convert_id = NULL; /* initialize substructures */ - printf("mpeg2_init:mpeg2dec->fbuf[0]=%p\n",mpeg2dec->fbuf[0]); - printf("mpeg2_init:mpeg2dec->fbuf[1]=%p\n",mpeg2dec->fbuf[1]); - printf("mpeg2_init:mpeg2dec->fbuf[2]=%p\n",mpeg2dec->fbuf[2]); mpeg2_header_state_init (mpeg2dec); - printf("mpeg2_init:mpeg2dec->fbuf[0]=%p\n",mpeg2dec->fbuf[0]); - printf("mpeg2_init:mpeg2dec->fbuf[1]=%p\n",mpeg2dec->fbuf[1]); - printf("mpeg2_init:mpeg2dec->fbuf[2]=%p\n",mpeg2dec->fbuf[2]); return mpeg2dec; } diff --git a/src/libmpeg2new/libmpeg2/header.c b/src/libmpeg2new/libmpeg2/header.c index 62c87c700..3c47119be 100644 --- a/src/libmpeg2new/libmpeg2/header.c +++ b/src/libmpeg2new/libmpeg2/header.c @@ -93,7 +93,6 @@ static void reset_info (mpeg2_info_t * info) info->current_picture = info->current_picture_2nd = NULL; info->display_picture = info->display_picture_2nd = NULL; info->current_fbuf = info->display_fbuf = info->discard_fbuf = NULL; - printf("mpeg2dec:reset_info\n"); info->user_data = NULL; info->user_data_len = 0; } @@ -366,7 +365,6 @@ void mpeg2_set_fbuf (mpeg2dec_t * mpeg2dec, int coding_type) mpeg2dec->fbuf[2] != &mpeg2dec->fbuf_alloc[i].fbuf) { mpeg2dec->fbuf[0] = &mpeg2dec->fbuf_alloc[i].fbuf; if (!mpeg2dec->custom_fbuf) { - printf("mpeg2dec:set_fbuf:NO NO NO!!!\n"); mpeg2dec->info.current_fbuf = mpeg2dec->fbuf[0]; if ((coding_type == B_TYPE) || (mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY)) { @@ -374,7 +372,6 @@ void mpeg2_set_fbuf (mpeg2dec_t * mpeg2dec, int coding_type) if ((coding_type == B_TYPE) || (mpeg2dec->convert_start)) { mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[0]; mpeg2dec->fbuf[0]=0; - printf("mpeg2dec:set_fbuf:discard_fbuf=fbuf[0]\n"); } } } @@ -460,11 +457,6 @@ int mpeg2_header_picture (mpeg2dec_t * mpeg2dec) mpeg2dec->fbuf[!low_delay + !mpeg2dec->convert_start]; // FIXME: Might want to wipe this whole section, once pictures is sorted. // mpeg2dec->fbuf[!low_delay + !mpeg2dec->convert_start]=0; - printf("mpeg2dec:header_picture:discard_fbuf=??\n"); - printf("mpeg2dec:header_picture:express = %d\n",!low_delay + !mpeg2dec->convert_start); - printf("mpeg2dec:header_picture:fbuf[0]=%p\n", mpeg2dec->fbuf[0]); - printf("mpeg2dec:header_picture:fbuf[1]=%p\n", mpeg2dec->fbuf[1]); - printf("mpeg2dec:header_picture:fbuf[2]=%p\n", mpeg2dec->fbuf[2]); } } if (!mpeg2dec->custom_fbuf) { @@ -552,6 +544,7 @@ static int picture_coding_ext (mpeg2dec_t * mpeg2dec) picture->nb_fields = 1; break; case FRAME_PICTURE: + /* buffer[3] & 2 is repeat first field */ if (!(mpeg2dec->sequence.flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE)) { picture->nb_fields = (buffer[3] & 2) ? 3 : 2; flags |= (buffer[3] & 128) ? PIC_FLAG_TOP_FIELD_FIRST : 0; @@ -713,7 +706,6 @@ mpeg2_state_t mpeg2_header_slice_start (mpeg2dec_t * mpeg2dec) mpeg2dec->fbuf[b_type]->buf); } mpeg2dec->action = NULL; - printf("mpeg2dec:action = NULL\n"); return (mpeg2_state_t)-1; } @@ -721,10 +713,8 @@ mpeg2_state_t mpeg2_header_end_btype2 (mpeg2dec_t * mpeg2dec) { mpeg2dec->info.display_fbuf = 0; mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[1]; - printf("mpeg2dec:header_end_btype2:discard_fbuf=1\n"); mpeg2dec->fbuf[1]=0; mpeg2dec->action = mpeg2_seek_sequence; - printf("mpeg2dec:action = mpeg2_seek_sequence\n"); mpeg2dec->first = 1; return STATE_END; } @@ -732,10 +722,8 @@ mpeg2_state_t mpeg2_header_end_btype (mpeg2dec_t * mpeg2dec) { mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[1]; mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[2]; - printf("mpeg2dec:header_end_btype:discard_fbuf=0\n"); mpeg2dec->fbuf[2]=0; mpeg2dec->action = mpeg2_header_end_btype2; - printf("mpeg2dec:action = mpeg2_header_end_btype2\n"); return STATE_SLICE; } mpeg2_state_t mpeg2_header_end_itype2 (mpeg2dec_t * mpeg2dec) @@ -744,7 +732,6 @@ mpeg2_state_t mpeg2_header_end_itype2 (mpeg2dec_t * mpeg2dec) mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[0]; mpeg2dec->fbuf[0]=0; mpeg2dec->action = mpeg2_seek_sequence; - printf("mpeg2dec:action = mpeg2_seek_sequence\n"); mpeg2dec->first = 1; return STATE_END; } @@ -754,7 +741,6 @@ mpeg2_state_t mpeg2_header_end_itype (mpeg2dec_t * mpeg2dec) mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[1]; mpeg2dec->fbuf[1]=0; mpeg2dec->action = mpeg2_header_end_itype2; - printf("mpeg2dec:action = mpeg2_header_end_itype2\n"); return STATE_SLICE; } @@ -778,7 +764,6 @@ mpeg2_state_t mpeg2_header_end (mpeg2dec_t * mpeg2dec) mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[0]; mpeg2dec->fbuf[0]=0; mpeg2dec->action = mpeg2_header_end_btype; - printf("mpeg2dec:action = mpeg2_header_end_btype\n"); return STATE_SLICE; } else { mpeg2dec->info.display_picture = picture; @@ -789,14 +774,12 @@ mpeg2_state_t mpeg2_header_end (mpeg2dec_t * mpeg2dec) mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[2]; mpeg2dec->fbuf[2]=0; mpeg2dec->action = mpeg2_header_end_itype; - printf("mpeg2dec:action = mpeg2_header_end_itype\n"); return STATE_SLICE; } else { mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[0]; mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[1]; mpeg2dec->fbuf[1]=0; mpeg2dec->action = mpeg2_header_end_itype2; - printf("mpeg2dec:action = mpeg2_header_end_itype2\n"); return STATE_SLICE; } @@ -811,14 +794,11 @@ mpeg2_state_t mpeg2_header_end (mpeg2dec_t * mpeg2dec) mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[b_type]; if (!mpeg2dec->convert_start) { mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[b_type + 1]; - printf("mpeg2dec:header_end:discard_fbuf=b_type+1\n"); } } else if (!mpeg2dec->convert_start) { mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[b_type]; - printf("mpeg2dec:header_end:discard_fbuf=b_type\n"); } mpeg2dec->action = mpeg2_seek_sequence; - printf("mpeg2dec:action = mpeg2_seek_sequence\n"); mpeg2dec->first = 1; return STATE_END; #endif diff --git a/src/libmpeg2new/xine_decoder.c b/src/libmpeg2new/xine_decoder.c index 5b78782a8..f28f8d121 100644 --- a/src/libmpeg2new/xine_decoder.c +++ b/src/libmpeg2new/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.5 2003/06/13 00:52:47 jcdutton Exp $ + * $Id: xine_decoder.c,v 1.6 2003/06/14 01:14:05 jcdutton Exp $ * * stuff needed to turn libmpeg2 into a xine decoder plugin */ @@ -99,6 +99,8 @@ static void mpeg2_video_decode_data (video_decoder_t *this_gen, buf_element_t *b uint32_t pts; mpeg2_state_t state; vo_frame_t * img; + uint32_t picture_structure; + /* handle aspect hints from xine-dvdnav */ if (buf_element->decoder_flags & BUF_FLAG_SPECIAL) { if (buf_element->decoder_info[1] == BUF_SPECIAL_ASPECT) { @@ -107,27 +109,26 @@ static void mpeg2_video_decode_data (video_decoder_t *this_gen, buf_element_t *b /* letterboxing is denied, we have to do pan&scan */ this->force_aspect = XINE_VO_ASPECT_PAN_SCAN; } - printf("libmpeg2:decode_data: forced aspect to=%d\n", this->force_aspect); return; } if (buf_element->decoder_flags != 0) return; - printf ("libmpeg2:decode_data:buffer\n"); pts=buf_element->pts; mpeg2_buffer (this->mpeg2dec, current, end); info = mpeg2_info (this->mpeg2dec); while ((state = mpeg2_parse (this->mpeg2dec)) != STATE_BUFFER) { +#if 0 printf("libmpeg2:decode_data:current_fbuf="); mpeg2_video_print_fbuf(info->current_fbuf); printf("libmpeg2:decode_data:display_fbuf="); mpeg2_video_print_fbuf(info->display_fbuf); printf("libmpeg2:decode_data:discard_fbuf="); mpeg2_video_print_fbuf(info->discard_fbuf); - +#endif switch (state) { case STATE_SEQUENCE: /* might set nb fbuf, convert format, stride */ @@ -203,16 +204,24 @@ static void mpeg2_video_decode_data (video_decoder_t *this_gen, buf_element_t *b info->display_picture_2nd->nb_fields, info->display_picture_2nd->flags); } + if (info->current_picture->nb_fields == 1) { + picture_structure = info->current_picture->flags & PIC_FLAG_TOP_FIELD_FIRST ? VO_TOP_FIELD : VO_BOTTOM_FIELD; + } else { + picture_structure = VO_BOTH_FIELDS; + } + img = this->stream->video_out->get_frame (this->stream->video_out, info->sequence->picture_width, info->sequence->picture_height, this->aspect_ratio, /* Aspect ratio */ XINE_IMGFMT_YV12, - //picture->picture_structure); - 0); + picture_structure); this->frame_number++; printf("libmpeg2:frame_number=%u\n",this->frame_number); //img->pts=buf_element->pts; + img->top_field_first = info->current_picture->flags & PIC_FLAG_TOP_FIELD_FIRST ? 1 : 0; + img->repeat_first_field = (info->current_picture->nb_fields > 2) ? 1 : 0; + img->duration=info->sequence->frame_period / 300; #ifdef LOG_FRAME_ALLOC_FREE printf ("libmpeg2:decode_data:get_frame %p (id=%d)\n", img,img->id); #endif @@ -252,7 +261,8 @@ static void mpeg2_video_decode_data (video_decoder_t *this_gen, buf_element_t *b } if (info->display_fbuf && info->display_fbuf->id) { img = (vo_frame_t *) info->display_fbuf->id; - img->duration=info->sequence->frame_period / 300; + /* FIXME: Do rff pattern analysis here */ + printf ("libmpeg2:decode_data:rff = %d, duration = %d\n", img->repeat_first_field, img->duration); #ifdef LOG_FRAME_ALLOC_FREE printf ("libmpeg2:decode_data:draw_frame %p, id=%d \n", info->display_fbuf, img->id); #endif -- cgit v1.2.3