summaryrefslogtreecommitdiff
path: root/src/libmpeg2new/libmpeg2
diff options
context:
space:
mode:
authorJames Courtier-Dutton <jcdutton@users.sourceforge.net>2003-06-13 00:52:47 +0000
committerJames Courtier-Dutton <jcdutton@users.sourceforge.net>2003-06-13 00:52:47 +0000
commita6b05cacbf52dd3b3b7aa4974d81e2221e203097 (patch)
tree3a6c069763ea9bd4b2d9cd8303585de4655a4e09 /src/libmpeg2new/libmpeg2
parentd2eaa7e3911b072f1ce3751c86d06ffdc15f2f2b (diff)
downloadxine-lib-a6b05cacbf52dd3b3b7aa4974d81e2221e203097.tar.gz
xine-lib-a6b05cacbf52dd3b3b7aa4974d81e2221e203097.tar.bz2
Some updates. We now use our own version of libmpeg2 version 0.3.2.
Once we have it working 100% we will look at sending patches to the libmpeg2 list. Lots of debug info it currently in the code. It will be removed once it is working. Currently working: - 1) All frames allocated and freed correctly. Fixing that took a long time. 2) It seems that we do not need any of the flush, discontinuity or reset calls yet. Adding seeking might change that. The reason for this is that we properly support sequence end information, so still images get displayed immeadiately. TODO: - 1) Picture info needs to be fixed. I.E. Check that the correct picture info matchs the image buffer. 2) Closed captions. Implement the closed caption decoder. 3) PTS info. 4) extra info. 5) Seeking. 6) Repeat first field pattern sensing. 7) Picture coding type. E.g. Frame, Fields, RFF etc. using in the get_frame call. CVS patchset: 5031 CVS date: 2003/06/13 00:52:47
Diffstat (limited to 'src/libmpeg2new/libmpeg2')
-rw-r--r--src/libmpeg2new/libmpeg2/Makefile.am25
-rw-r--r--src/libmpeg2new/libmpeg2/alloc.c2
-rw-r--r--src/libmpeg2new/libmpeg2/cpu_accel.c2
-rw-r--r--src/libmpeg2new/libmpeg2/cpu_state.c6
-rw-r--r--src/libmpeg2new/libmpeg2/decode.c100
-rw-r--r--src/libmpeg2new/libmpeg2/header.c128
-rw-r--r--src/libmpeg2new/libmpeg2/idct.c4
-rw-r--r--src/libmpeg2new/libmpeg2/idct_altivec.c4
-rw-r--r--src/libmpeg2new/libmpeg2/idct_mlib.c2
-rw-r--r--src/libmpeg2new/libmpeg2/idct_mmx.c6
-rw-r--r--src/libmpeg2new/libmpeg2/motion_comp.c2
-rw-r--r--src/libmpeg2new/libmpeg2/motion_comp_alpha.c4
-rw-r--r--src/libmpeg2new/libmpeg2/motion_comp_altivec.c2
-rw-r--r--src/libmpeg2new/libmpeg2/motion_comp_mlib.c2
-rw-r--r--src/libmpeg2new/libmpeg2/motion_comp_mmx.c6
-rw-r--r--src/libmpeg2new/libmpeg2/slice.c28
16 files changed, 263 insertions, 60 deletions
diff --git a/src/libmpeg2new/libmpeg2/Makefile.am b/src/libmpeg2new/libmpeg2/Makefile.am
index ed9b50e21..3ba2d6542 100644
--- a/src/libmpeg2new/libmpeg2/Makefile.am
+++ b/src/libmpeg2new/libmpeg2/Makefile.am
@@ -1,19 +1,16 @@
-AM_CFLAGS = $(OPT_CFLAGS) $(LIBMPEG2_CFLAGS)
+include $(top_srcdir)/misc/Makefile.common
+
+
+AM_CFLAGS = @ANSI_FLAGS@
+
+noinst_LTLIBRARIES = libmpeg2.la libmpeg2arch.la
-lib_LTLIBRARIES = libmpeg2.la
libmpeg2_la_SOURCES = alloc.c header.c decode.c slice.c motion_comp.c idct.c \
- motion_comp_mlib.c idct_mlib.c
-libmpeg2_la_LIBADD = libmpeg2arch.la $(LIBMPEG2_LIBS)
-libmpeg2_la_LDFLAGS = -no-undefined
+ motion_comp_mlib.c idct_mlib.c
+libmpeg2_la_LIBADD = libmpeg2arch.la
-noinst_LTLIBRARIES = libmpeg2arch.la
libmpeg2arch_la_SOURCES = motion_comp_mmx.c idct_mmx.c \
- motion_comp_altivec.c idct_altivec.c \
- motion_comp_alpha.c idct_alpha.c \
- cpu_accel.c cpu_state.c
-libmpeg2arch_la_CFLAGS = $(OPT_CFLAGS) $(ARCH_OPT_CFLAGS) $(LIBMPEG2_CFLAGS)
-
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = libmpeg2.pc
+ motion_comp_altivec.c idct_altivec.c \
+ motion_comp_alpha.c idct_alpha.c \
+ cpu_accel.c cpu_state.c
-EXTRA_DIST = configure.incl vlc.h mpeg2_internal.h
diff --git a/src/libmpeg2new/libmpeg2/alloc.c b/src/libmpeg2new/libmpeg2/alloc.c
index 2e4792e94..67a5d5c6a 100644
--- a/src/libmpeg2new/libmpeg2/alloc.c
+++ b/src/libmpeg2new/libmpeg2/alloc.c
@@ -26,7 +26,7 @@
#include <stdlib.h>
#include <inttypes.h>
-#include "mpeg2.h"
+#include "../include/mpeg2.h"
#include "mpeg2_internal.h"
#if defined(HAVE_MEMALIGN) && !defined(__cplusplus)
diff --git a/src/libmpeg2new/libmpeg2/cpu_accel.c b/src/libmpeg2new/libmpeg2/cpu_accel.c
index 97e5ea3ca..a1096f2ef 100644
--- a/src/libmpeg2new/libmpeg2/cpu_accel.c
+++ b/src/libmpeg2new/libmpeg2/cpu_accel.c
@@ -25,7 +25,7 @@
#include <inttypes.h>
-#include "mpeg2.h"
+#include "../include/mpeg2.h"
#ifdef ACCEL_DETECT
#ifdef ARCH_X86
diff --git a/src/libmpeg2new/libmpeg2/cpu_state.c b/src/libmpeg2new/libmpeg2/cpu_state.c
index a94e5fedc..6761747fa 100644
--- a/src/libmpeg2new/libmpeg2/cpu_state.c
+++ b/src/libmpeg2new/libmpeg2/cpu_state.c
@@ -26,11 +26,11 @@
#include <stdlib.h>
#include <inttypes.h>
-#include "mpeg2.h"
+#include "../include/mpeg2.h"
#include "mpeg2_internal.h"
-#include "attributes.h"
+#include "../include/attributes.h"
#ifdef ARCH_X86
-#include "mmx.h"
+#include "../include/mmx.h"
#endif
void (* mpeg2_cpu_state_save) (cpu_state_t * state) = NULL;
diff --git a/src/libmpeg2new/libmpeg2/decode.c b/src/libmpeg2new/libmpeg2/decode.c
index df2ca2f28..382798f75 100644
--- a/src/libmpeg2new/libmpeg2/decode.c
+++ b/src/libmpeg2new/libmpeg2/decode.c
@@ -23,13 +23,14 @@
#include "config.h"
+#include <stdio.h> /* For testing printf */
#include <string.h> /* memcmp/memset, try to remove */
#include <stdlib.h>
#include <inttypes.h>
-#include "mpeg2.h"
+#include "../include/mpeg2.h"
#include "mpeg2_internal.h"
-#include "convert.h"
+#include "../include/convert.h"
static int mpeg2_accels = 0;
@@ -160,6 +161,20 @@ 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;
@@ -187,6 +202,7 @@ 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;
}
}
@@ -202,22 +218,80 @@ 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;
+
+ mpeg2dec->info.current_fbuf = mpeg2dec->fbuf[0];
+ if (mpeg2dec->decoder.coding_type == B_TYPE) {
+ 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;
+
+ mpeg2dec->info.current_fbuf = mpeg2dec->fbuf[0];
+ if (mpeg2dec->decoder.coding_type == B_TYPE) {
+ 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;
}
@@ -230,6 +304,7 @@ 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 -
@@ -248,6 +323,7 @@ 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;
}
}
@@ -256,15 +332,18 @@ 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;
@@ -272,11 +351,13 @@ 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 */
@@ -292,6 +373,7 @@ mpeg2_state_t mpeg2_parse_header (mpeg2dec_t * mpeg2dec)
default:
mpeg2dec->action = seek_header;
+ printf("mpeg2dec:action = seek_header\n");
return STATE_INVALID;
}
@@ -359,6 +441,10 @@ void mpeg2_set_buf (mpeg2dec_t * mpeg2dec, uint8_t * buf[3], void * id)
void mpeg2_custom_fbuf (mpeg2dec_t * mpeg2dec, int custom_fbuf)
{
mpeg2dec->custom_fbuf = custom_fbuf;
+ mpeg2dec->fbuf[0] = NULL;
+ mpeg2dec->fbuf[1] = NULL;
+ mpeg2dec->fbuf[2] = NULL;
+
}
void mpeg2_skip (mpeg2dec_t * mpeg2dec, int skip)
@@ -414,14 +500,20 @@ 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 55f16f1ee..62c87c700 100644
--- a/src/libmpeg2new/libmpeg2/header.c
+++ b/src/libmpeg2new/libmpeg2/header.c
@@ -23,14 +23,16 @@
#include "config.h"
+#include <stdio.h> /* For printf */
#include <inttypes.h>
#include <stdlib.h> /* defines NULL */
#include <string.h> /* memcmp */
+#include <assert.h>
-#include "mpeg2.h"
+#include "../include/mpeg2.h"
#include "mpeg2_internal.h"
-#include "convert.h"
-#include "attributes.h"
+#include "../include/convert.h"
+#include "../include/attributes.h"
#define SEQ_EXT 2
#define SEQ_DISPLAY_EXT 4
@@ -91,6 +93,7 @@ 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;
}
@@ -362,13 +365,19 @@ void mpeg2_set_fbuf (mpeg2dec_t * mpeg2dec, int coding_type)
if (mpeg2dec->fbuf[1] != &mpeg2dec->fbuf_alloc[i].fbuf &&
mpeg2dec->fbuf[2] != &mpeg2dec->fbuf_alloc[i].fbuf) {
mpeg2dec->fbuf[0] = &mpeg2dec->fbuf_alloc[i].fbuf;
- mpeg2dec->info.current_fbuf = mpeg2dec->fbuf[0];
- if ((coding_type == B_TYPE) ||
- (mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY)) {
- if ((coding_type == B_TYPE) || (mpeg2dec->convert_start))
- mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[0];
- mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[0];
- }
+ 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)) {
+ mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[0];
+ 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");
+ }
+ }
+ }
break;
}
}
@@ -446,9 +455,17 @@ int mpeg2_header_picture (mpeg2dec_t * mpeg2dec)
mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[1];
}
}
- if (!low_delay + !mpeg2dec->convert_start)
+ if (!low_delay + !mpeg2dec->convert_start) {
mpeg2dec->info.discard_fbuf =
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) {
while (mpeg2dec->alloc_index < 3) {
@@ -471,6 +488,7 @@ int mpeg2_header_picture (mpeg2dec_t * mpeg2dec)
fbuf->buf[2] = fbuf->buf[1] + (size >> 2);
}
}
+ assert(0);
mpeg2_set_fbuf (mpeg2dec, type);
}
} else {
@@ -695,9 +713,51 @@ 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;
}
+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;
+}
+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)
+{
+ mpeg2dec->info.display_fbuf = 0;
+ 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;
+}
+mpeg2_state_t mpeg2_header_end_itype (mpeg2dec_t * mpeg2dec)
+{
+ 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;
+}
+
mpeg2_state_t mpeg2_header_end (mpeg2dec_t * mpeg2dec)
{
mpeg2_picture_t * picture;
@@ -710,16 +770,58 @@ mpeg2_state_t mpeg2_header_end (mpeg2dec_t * mpeg2dec)
mpeg2dec->state = STATE_END;
reset_info (&(mpeg2dec->info));
+ if (b_type) {
+ mpeg2dec->info.display_picture = picture;
+ if (picture->nb_fields == 1)
+ mpeg2dec->info.display_picture_2nd = picture + 1;
+ mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[0];
+ 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;
+ if (picture->nb_fields == 1)
+ mpeg2dec->info.display_picture_2nd = picture + 1;
+ if (mpeg2dec->fbuf[2]) {
+ mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[1];
+ 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;
+ }
+
+ }
+
+
+#if 0
if (!(mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY)) {
mpeg2dec->info.display_picture = picture;
if (picture->nb_fields == 1)
mpeg2dec->info.display_picture_2nd = picture + 1;
mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[b_type];
- if (!mpeg2dec->convert_start)
+ if (!mpeg2dec->convert_start) {
mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[b_type + 1];
- } else if (!mpeg2dec->convert_start)
+ 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/libmpeg2/idct.c b/src/libmpeg2new/libmpeg2/idct.c
index 932efcf2a..57aba175b 100644
--- a/src/libmpeg2new/libmpeg2/idct.c
+++ b/src/libmpeg2new/libmpeg2/idct.c
@@ -26,9 +26,9 @@
#include <stdlib.h>
#include <inttypes.h>
-#include "mpeg2.h"
+#include "../include/mpeg2.h"
#include "mpeg2_internal.h"
-#include "attributes.h"
+#include "../include/attributes.h"
#define W1 2841 /* 2048 * sqrt (2) * cos (1 * pi / 16) */
#define W2 2676 /* 2048 * sqrt (2) * cos (2 * pi / 16) */
diff --git a/src/libmpeg2new/libmpeg2/idct_altivec.c b/src/libmpeg2new/libmpeg2/idct_altivec.c
index e9fc28bc4..d8f3ceab0 100644
--- a/src/libmpeg2new/libmpeg2/idct_altivec.c
+++ b/src/libmpeg2new/libmpeg2/idct_altivec.c
@@ -30,9 +30,9 @@
#endif
#include <inttypes.h>
-#include "mpeg2.h"
+#include "../include/mpeg2.h"
#include "mpeg2_internal.h"
-#include "attributes.h"
+#include "../include/attributes.h"
typedef vector signed char vector_s8_t;
typedef vector unsigned char vector_u8_t;
diff --git a/src/libmpeg2new/libmpeg2/idct_mlib.c b/src/libmpeg2new/libmpeg2/idct_mlib.c
index 83c39738d..e8f321a83 100644
--- a/src/libmpeg2new/libmpeg2/idct_mlib.c
+++ b/src/libmpeg2new/libmpeg2/idct_mlib.c
@@ -31,7 +31,7 @@
#include <string.h>
#include <inttypes.h>
-#include "mpeg2.h"
+#include "../include/mpeg2.h"
#include "mpeg2_internal.h"
void mpeg2_idct_add_mlib (const int last, int16_t * const block,
diff --git a/src/libmpeg2new/libmpeg2/idct_mmx.c b/src/libmpeg2new/libmpeg2/idct_mmx.c
index e2afe6bb4..c0e88f220 100644
--- a/src/libmpeg2new/libmpeg2/idct_mmx.c
+++ b/src/libmpeg2new/libmpeg2/idct_mmx.c
@@ -27,10 +27,10 @@
#include <inttypes.h>
-#include "mpeg2.h"
+#include "../include/mpeg2.h"
#include "mpeg2_internal.h"
-#include "attributes.h"
-#include "mmx.h"
+#include "../include/attributes.h"
+#include "../include/mmx.h"
#define ROW_SHIFT 11
#define COL_SHIFT 6
diff --git a/src/libmpeg2new/libmpeg2/motion_comp.c b/src/libmpeg2new/libmpeg2/motion_comp.c
index 24cfee1e1..cf9f807e2 100644
--- a/src/libmpeg2new/libmpeg2/motion_comp.c
+++ b/src/libmpeg2new/libmpeg2/motion_comp.c
@@ -25,7 +25,7 @@
#include <inttypes.h>
-#include "mpeg2.h"
+#include "../include/mpeg2.h"
#include "mpeg2_internal.h"
mpeg2_mc_t mpeg2_mc;
diff --git a/src/libmpeg2new/libmpeg2/motion_comp_alpha.c b/src/libmpeg2new/libmpeg2/motion_comp_alpha.c
index 662221b4d..efa0c44af 100644
--- a/src/libmpeg2new/libmpeg2/motion_comp_alpha.c
+++ b/src/libmpeg2new/libmpeg2/motion_comp_alpha.c
@@ -26,9 +26,9 @@
#include <inttypes.h>
-#include "mpeg2.h"
+#include "../include/mpeg2.h"
#include "mpeg2_internal.h"
-#include "alpha_asm.h"
+#include "../include/alpha_asm.h"
static inline uint64_t avg2 (uint64_t a, uint64_t b)
{
diff --git a/src/libmpeg2new/libmpeg2/motion_comp_altivec.c b/src/libmpeg2new/libmpeg2/motion_comp_altivec.c
index f5d884e6e..f0b6fa691 100644
--- a/src/libmpeg2new/libmpeg2/motion_comp_altivec.c
+++ b/src/libmpeg2new/libmpeg2/motion_comp_altivec.c
@@ -30,7 +30,7 @@
#endif
#include <inttypes.h>
-#include "mpeg2.h"
+#include "../include/mpeg2.h"
#include "mpeg2_internal.h"
typedef vector signed char vector_s8_t;
diff --git a/src/libmpeg2new/libmpeg2/motion_comp_mlib.c b/src/libmpeg2new/libmpeg2/motion_comp_mlib.c
index c7ed6b285..96f000991 100644
--- a/src/libmpeg2new/libmpeg2/motion_comp_mlib.c
+++ b/src/libmpeg2new/libmpeg2/motion_comp_mlib.c
@@ -30,7 +30,7 @@
#include <mlib_video.h>
#include <inttypes.h>
-#include "mpeg2.h"
+#include "../include/mpeg2.h"
#include "mpeg2_internal.h"
static void MC_put_o_16_mlib (uint8_t * dest, const uint8_t * ref,
diff --git a/src/libmpeg2new/libmpeg2/motion_comp_mmx.c b/src/libmpeg2new/libmpeg2/motion_comp_mmx.c
index 2434ccee1..fc8e83abc 100644
--- a/src/libmpeg2new/libmpeg2/motion_comp_mmx.c
+++ b/src/libmpeg2new/libmpeg2/motion_comp_mmx.c
@@ -27,10 +27,10 @@
#include <inttypes.h>
-#include "mpeg2.h"
+#include "../include/mpeg2.h"
#include "mpeg2_internal.h"
-#include "attributes.h"
-#include "mmx.h"
+#include "../include/attributes.h"
+#include "../include/mmx.h"
#define CPU_MMXEXT 0
#define CPU_3DNOW 1
diff --git a/src/libmpeg2new/libmpeg2/slice.c b/src/libmpeg2new/libmpeg2/slice.c
index 3e2db0803..095fc4c82 100644
--- a/src/libmpeg2new/libmpeg2/slice.c
+++ b/src/libmpeg2new/libmpeg2/slice.c
@@ -25,9 +25,9 @@
#include <inttypes.h>
-#include "mpeg2.h"
+#include "../include/mpeg2.h"
#include "mpeg2_internal.h"
-#include "attributes.h"
+#include "../include/attributes.h"
extern mpeg2_mc_t mpeg2_mc;
extern void (* mpeg2_idct_copy) (int16_t * block, uint8_t * dest, int stride);
@@ -1469,9 +1469,15 @@ void mpeg2_init_fbuf (mpeg2_decoder_t * decoder, uint8_t * current_fbuf[3],
decoder->picture_dest[1] = current_fbuf[1] + (offset >> 1);
decoder->picture_dest[2] = current_fbuf[2] + (offset >> 1);
- decoder->f_motion.ref[0][0] = forward_fbuf[0] + offset;
- decoder->f_motion.ref[0][1] = forward_fbuf[1] + (offset >> 1);
- decoder->f_motion.ref[0][2] = forward_fbuf[2] + (offset >> 1);
+ if (forward_fbuf) {
+ decoder->f_motion.ref[0][0] = forward_fbuf[0] + offset;
+ decoder->f_motion.ref[0][1] = forward_fbuf[1] + (offset >> 1);
+ decoder->f_motion.ref[0][2] = forward_fbuf[2] + (offset >> 1);
+ } else {
+ decoder->f_motion.ref[0][0] = 0;
+ decoder->f_motion.ref[0][1] = 0;
+ decoder->f_motion.ref[0][2] = 0;
+ }
decoder->b_motion.ref[0][0] = backward_fbuf[0] + offset;
decoder->b_motion.ref[0][1] = backward_fbuf[1] + (offset >> 1);
@@ -1488,9 +1494,15 @@ void mpeg2_init_fbuf (mpeg2_decoder_t * decoder, uint8_t * current_fbuf[3],
if (decoder->second_field && (decoder->coding_type != B_TYPE))
forward_fbuf = current_fbuf;
- decoder->f_motion.ref[1][0] = forward_fbuf[0] + offset;
- decoder->f_motion.ref[1][1] = forward_fbuf[1] + (offset >> 1);
- decoder->f_motion.ref[1][2] = forward_fbuf[2] + (offset >> 1);
+ if (forward_fbuf) {
+ decoder->f_motion.ref[1][0] = forward_fbuf[0] + offset;
+ decoder->f_motion.ref[1][1] = forward_fbuf[1] + (offset >> 1);
+ decoder->f_motion.ref[1][2] = forward_fbuf[2] + (offset >> 1);
+ } else {
+ decoder->f_motion.ref[0][0] = 0;
+ decoder->f_motion.ref[0][1] = 0;
+ decoder->f_motion.ref[0][2] = 0;
+ }
decoder->b_motion.ref[1][0] = backward_fbuf[0] + offset;
decoder->b_motion.ref[1][1] = backward_fbuf[1] + (offset >> 1);