summaryrefslogtreecommitdiff
path: root/src/libmpeg2new/libmpeg2/decode.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/decode.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/decode.c')
-rw-r--r--src/libmpeg2new/libmpeg2/decode.c100
1 files changed, 96 insertions, 4 deletions
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;
}