summaryrefslogtreecommitdiff
path: root/src/libmpeg2new/libmpeg2/header.c
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/header.c
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/header.c')
-rw-r--r--src/libmpeg2new/libmpeg2/header.c128
1 files changed, 115 insertions, 13 deletions
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
}
+
+