summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libmpeg2new/libmpeg2/cpu_accel.c2
-rw-r--r--src/libmpeg2new/libmpeg2/decode.c49
-rw-r--r--src/libmpeg2new/libmpeg2/header.c22
-rw-r--r--src/libmpeg2new/xine_decoder.c24
4 files changed, 20 insertions, 77 deletions
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