aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2002-06-02 12:22:30 +0000
committerMichael Niedermayer <michaelni@gmx.at>2002-06-02 12:22:30 +0000
commit287229e554267b908f3969d9038bec004cfe51a8 (patch)
tree81551c2e4f4aaafeb5cd4b4e0281748b82a3b786 /libavcodec
parent7f2fe444a39bca733d390b6608801c5f002bfd31 (diff)
downloadffmpeg-287229e554267b908f3969d9038bec004cfe51a8.tar.gz
msmpeg4v1 decoding
Originally committed as revision 643 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/h263data.h8
-rw-r--r--libavcodec/msmpeg4.c284
-rw-r--r--libavcodec/msmpeg4data.h51
3 files changed, 250 insertions, 93 deletions
diff --git a/libavcodec/h263data.h b/libavcodec/h263data.h
index c4342ffd37..5a7b943ea3 100644
--- a/libavcodec/h263data.h
+++ b/libavcodec/h263data.h
@@ -1,11 +1,11 @@
/* intra MCBPC, mb_type = (intra), then (intraq) */
-static const UINT8 intra_MCBPC_code[8] = { 1, 1, 2, 3, 1, 1, 2, 3 };
-static const UINT8 intra_MCBPC_bits[8] = { 1, 3, 3, 3, 4, 6, 6, 6 };
+const UINT8 intra_MCBPC_code[8] = { 1, 1, 2, 3, 1, 1, 2, 3 };
+const UINT8 intra_MCBPC_bits[8] = { 1, 3, 3, 3, 4, 6, 6, 6 };
/* inter MCBPC, mb_type = (inter), (intra), (interq), (intraq), (inter4v) */
/* Changed the tables for interq and inter4v+q, following the standard ** Juanjo ** */
-static const UINT8 inter_MCBPC_code[25] = {
+const UINT8 inter_MCBPC_code[25] = {
1, 3, 2, 5,
3, 4, 3, 3,
3, 7, 6, 5,
@@ -14,7 +14,7 @@ static const UINT8 inter_MCBPC_code[25] = {
1, /* Stuffing */
2, 12, 14, 15,
};
-static const UINT8 inter_MCBPC_bits[25] = {
+const UINT8 inter_MCBPC_bits[25] = {
1, 4, 4, 6,
5, 8, 8, 7,
3, 7, 7, 9,
diff --git a/libavcodec/msmpeg4.c b/libavcodec/msmpeg4.c
index ea744b3609..2c4a31989a 100644
--- a/libavcodec/msmpeg4.c
+++ b/libavcodec/msmpeg4.c
@@ -16,7 +16,7 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * msmpeg4v2 stuff by Michael Niedermayer <michaelni@gmx.at>
+ * msmpeg4v1 & v2 stuff by Michael Niedermayer <michaelni@gmx.at>
*/
#include "avcodec.h"
#include "dsputil.h"
@@ -159,7 +159,7 @@ static void code012(PutBitContext *pb, int n)
}
}
-/* write MSMPEG4 V3 compatible frame header */
+/* write MSMPEG4 compatible frame header */
void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
{
int i;
@@ -171,7 +171,7 @@ void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
put_bits(&s->pb, 5, s->qscale);
s->rl_table_index = 2;
- if(s->msmpeg4_version==2)
+ if(s->msmpeg4_version<=2)
s->rl_chroma_table_index = 2; /* only for I frame */
else
s->rl_chroma_table_index = 1; /* only for I frame */
@@ -183,7 +183,7 @@ void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
if (s->pict_type == I_TYPE) {
put_bits(&s->pb, 5, 0x17); /* indicate only one "slice" */
- if(s->msmpeg4_version!=2){
+ if(s->msmpeg4_version>2){
code012(&s->pb, s->rl_chroma_table_index);
code012(&s->pb, s->rl_table_index);
@@ -194,7 +194,7 @@ void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
put_bits(&s->pb, 1, s->use_skip_mb_code);
s->rl_chroma_table_index = s->rl_table_index;
- if(s->msmpeg4_version!=2){
+ if(s->msmpeg4_version>2){
code012(&s->pb, s->rl_table_index);
put_bits(&s->pb, 1, s->dc_table_index);
@@ -228,14 +228,16 @@ void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
void msmpeg4_encode_ext_header(MpegEncContext * s)
{
- s->flipflop_rounding=1;
- s->bitrate= 910; // FIXME
-
put_bits(&s->pb, 5, s->frame_rate / FRAME_RATE_BASE); //yes 29.97 -> 29
- put_bits(&s->pb, 11, s->bitrate);
+ put_bits(&s->pb, 11, MIN(s->bit_rate, 2047));
- put_bits(&s->pb, 1, s->flipflop_rounding);
+ if(s->msmpeg4_version<3)
+ s->flipflop_rounding=0;
+ else{
+ s->flipflop_rounding=1;
+ put_bits(&s->pb, 1, s->flipflop_rounding);
+ }
}
/* predict coded block */
@@ -328,7 +330,7 @@ void msmpeg4_encode_mb(MpegEncContext * s,
if (s->use_skip_mb_code)
put_bits(&s->pb, 1, 0); /* mb coded */
- if(s->msmpeg4_version==2){
+ if(s->msmpeg4_version<=2){
put_bits(&s->pb,
v2_mb_type[cbp&3][1],
v2_mb_type[cbp&3][0]);
@@ -373,7 +375,7 @@ void msmpeg4_encode_mb(MpegEncContext * s,
printf("cbp=%x %x\n", cbp, coded_cbp);
#endif
- if(s->msmpeg4_version==2){
+ if(s->msmpeg4_version<=2){
if (s->pict_type == I_TYPE) {
put_bits(&s->pb,
v2_intra_cbpc[cbp&3][1], v2_intra_cbpc[cbp&3][0]);
@@ -425,6 +427,21 @@ void ff_old_msmpeg4_dc_scale(MpegEncContext * s)
}
}
+static int msmpeg4v1_pred_dc(MpegEncContext * s, int n,
+ INT32 **dc_val_ptr)
+{
+ int i;
+
+ if (n < 4) {
+ i= 0;
+ } else {
+ i= n-3;
+ }
+
+ *dc_val_ptr= &s->last_dc[i];
+ return s->last_dc[i];
+}
+
/* dir = 0: left, dir = 1: top prediction */
static int msmpeg4_pred_dc(MpegEncContext * s, int n,
INT16 **dc_val_ptr, int *dir_ptr)
@@ -438,6 +455,7 @@ static int msmpeg4_pred_dc(MpegEncContext * s, int n,
} else {
scale = s->c_dc_scale;
}
+
wrap = s->block_wrap[n];
dc_val= s->dc_val[0] + s->block_index[n];
@@ -507,21 +525,29 @@ static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr
{
int sign, code;
int pred;
- INT16 *dc_val;
- pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
+ if(s->msmpeg4_version==1){
+ INT32 *dc_val;
+ pred = msmpeg4v1_pred_dc(s, n, &dc_val);
+
+ /* update predictor */
+ *dc_val= level;
+ }else{
+ INT16 *dc_val;
+ pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
- /* update predictor */
- if (n < 4) {
- *dc_val = level * s->y_dc_scale;
- } else {
- *dc_val = level * s->c_dc_scale;
+ /* update predictor */
+ if (n < 4) {
+ *dc_val = level * s->y_dc_scale;
+ } else {
+ *dc_val = level * s->c_dc_scale;
+ }
}
/* do the prediction */
level -= pred;
- if(s->msmpeg4_version==2){
+ if(s->msmpeg4_version<=2){
if (n < 4) {
put_bits(&s->pb,
v2_dc_lum_table[level+256][1],
@@ -588,7 +614,7 @@ static void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
} else {
i = 0;
rl = &rl_table[3 + s->rl_table_index];
- if(s->msmpeg4_version==2)
+ if(s->msmpeg4_version<=2)
run_diff = 0;
else
run_diff = 1;
@@ -668,6 +694,8 @@ static VLC cbpy_vlc;
static VLC v2_intra_cbpc_vlc;
static VLC v2_mb_type_vlc;
static VLC v2_mv_vlc;
+static VLC v1_intra_cbpc_vlc;
+static VLC v1_inter_cbpc_vlc;
/* this table is practically identical to the one from h263 except that its inverted */
static void init_h263_dc_for_msmpeg4()
@@ -786,6 +814,14 @@ int msmpeg4_decode_init_vlc(MpegEncContext *s)
init_vlc(&mb_intra_vlc, 9, 64,
&table_mb_intra[0][1], 4, 2,
&table_mb_intra[0][0], 4, 2);
+
+ init_vlc(&v1_intra_cbpc_vlc, 6, 8,
+ intra_MCBPC_bits, 1, 1,
+ intra_MCBPC_code, 1, 1);
+ init_vlc(&v1_inter_cbpc_vlc, 6, 25,
+ inter_MCBPC_bits, 1, 1,
+ inter_MCBPC_code, 1, 1);
+
return 0;
}
@@ -813,21 +849,46 @@ printf("END\n");
return -1;
}
#endif
+
+ if(s->msmpeg4_version==1){
+ int start_code, num;
+ start_code = (get_bits(&s->gb, 16)<<16) | get_bits(&s->gb, 16);
+ if(start_code!=0x00000100){
+ fprintf(stderr, "invalid startcode\n");
+ return -1;
+ }
+
+ num= get_bits(&s->gb, 5); // frame number */
+ }
+
s->pict_type = get_bits(&s->gb, 2) + 1;
if (s->pict_type != I_TYPE &&
- s->pict_type != P_TYPE)
+ s->pict_type != P_TYPE){
+ fprintf(stderr, "invalid picture type\n");
return -1;
+ }
s->qscale = get_bits(&s->gb, 5);
if (s->pict_type == I_TYPE) {
code = get_bits(&s->gb, 5);
- /* 0x17: one slice, 0x18: two slices */
- if (code < 0x17)
- return -1;
- s->slice_height = s->mb_height / (code - 0x16);
+ if(s->msmpeg4_version==1){
+ if(code==0 || code>s->mb_height){
+ fprintf(stderr, "invalid slice height %d\n", code);
+ return -1;
+ }
+
+ s->slice_height = code;
+ }else{
+ /* 0x17: one slice, 0x18: two slices, ... */
+ if (code < 0x17)
+ return -1;
+
+ s->slice_height = s->mb_height / (code - 0x16);
+ }
switch(s->msmpeg4_version){
+ case 1:
case 2:
s->rl_chroma_table_index = 2;
s->rl_table_index = 2;
@@ -862,22 +923,28 @@ return -1;
s->rl_table_index,
s->dc_table_index);*/
} else {
- s->use_skip_mb_code = get_bits1(&s->gb);
- if(s->msmpeg4_version==2){
+ switch(s->msmpeg4_version){
+ case 1:
+ case 2:
+ if(s->msmpeg4_version==1)
+ s->use_skip_mb_code = 1;
+ else
+ s->use_skip_mb_code = get_bits1(&s->gb);
s->rl_table_index = 2;
s->rl_chroma_table_index = s->rl_table_index;
-
s->dc_table_index = 0; //not used
-
s->mv_table_index = 0;
- }else{
+ break;
+ case 3:
+ s->use_skip_mb_code = get_bits1(&s->gb);
s->rl_table_index = decode012(&s->gb);
s->rl_chroma_table_index = s->rl_table_index;
s->dc_table_index = get_bits1(&s->gb);
s->mv_table_index = get_bits1(&s->gb);
+ break;
}
/* printf(" %d %d %d %d %d \n",
s->use_skip_mb_code,
@@ -914,21 +981,30 @@ return -1;
int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
{
+ int left= buf_size*8 - get_bits_count(&s->gb);
+ int length= s->msmpeg4_version>=3 ? 17 : 16;
/* the alt_bitstream reader could read over the end so we need to check it */
- if(get_bits_count(&s->gb) + 16 < buf_size*8)
+ if(left>=length && left<length+8)
{
int fps;
fps= get_bits(&s->gb, 5);
- s->bitrate= get_bits(&s->gb, 11);
- s->flipflop_rounding= get_bits1(&s->gb);
+ s->bit_rate= get_bits(&s->gb, 11);
+ if(s->msmpeg4_version>=3)
+ s->flipflop_rounding= get_bits1(&s->gb);
+ else
+ s->flipflop_rounding= 0;
-// printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bitrate, s->flipflop_rounding);
+// printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate, s->flipflop_rounding);
}
- else
+ else if(left<length+8)
{
s->flipflop_rounding= 0;
- s->bitrate= 0;
+ printf("ext header missing, %d left\n", left);
+ }
+ else
+ {
+ fprintf(stderr, "I frame too long, ignoring ext header\n");
}
return 0;
@@ -980,6 +1056,7 @@ static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
int code, val, sign, shift;
code = get_vlc(&s->gb, &v2_mv_vlc);
+// printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
if (code < 0)
return 0xffff;
@@ -993,8 +1070,8 @@ static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
val++;
if (sign)
val = -val;
- val += pred;
+ val += pred;
if (val <= -64)
val += 64;
else if (val >= 64)
@@ -1004,7 +1081,7 @@ static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
}
-int msmpeg4v2_decode_mb(MpegEncContext *s,
+static int msmpeg4v12_decode_mb(MpegEncContext *s,
DCTELEM block[6][64])
{
int cbp, code, i;
@@ -1024,20 +1101,41 @@ int msmpeg4v2_decode_mb(MpegEncContext *s,
}
}
- code = get_vlc(&s->gb, &v2_mb_type_vlc);
+ if(s->msmpeg4_version==2)
+ code = get_vlc(&s->gb, &v2_mb_type_vlc);
+ else
+ code = get_vlc(&s->gb, &v1_inter_cbpc_vlc);
+ if(code<0 || code>7){
+ fprintf(stderr, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y);
+ return -1;
+ }
+
s->mb_intra = code >>2;
cbp = code & 0x3;
} else {
s->mb_intra = 1;
- cbp= get_vlc(&s->gb, &v2_intra_cbpc_vlc);
+ if(s->msmpeg4_version==2)
+ cbp= get_vlc(&s->gb, &v2_intra_cbpc_vlc);
+ else
+ cbp= get_vlc(&s->gb, &v1_intra_cbpc_vlc);
+ if(cbp<0 || cbp>3){
+ fprintf(stderr, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
+ return -1;
+ }
}
if (!s->mb_intra) {
- int mx, my;
+ int mx, my, cbpy;
+
+ cbpy= get_vlc(&s->gb, &cbpy_vlc);
+ if(cbpy<0){
+ fprintf(stderr, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
+ return -1;
+ }
- cbp|= get_vlc(&s->gb, &cbpy_vlc)<<2;
- if((cbp&3) != 3) cbp^= 0x3C;
+ cbp|= cbpy<<2;
+ if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C;
h263_pred_motion(s, 0, &mx, &my);
mx= msmpeg4v2_decode_motion(s, mx, 1);
@@ -1048,14 +1146,20 @@ int msmpeg4v2_decode_mb(MpegEncContext *s,
s->mv[0][0][0] = mx;
s->mv[0][0][1] = my;
} else {
- s->ac_pred = get_bits1(&s->gb);
- cbp|= get_vlc(&s->gb, &cbpy_vlc)<<2;
+ if(s->msmpeg4_version==2){
+ s->ac_pred = get_bits1(&s->gb);
+ cbp|= get_vlc(&s->gb, &cbpy_vlc)<<2; //FIXME check errors
+ } else{
+ s->ac_pred = 0;
+ cbp|= get_vlc(&s->gb, &cbpy_vlc)<<2; //FIXME check errors
+ if(s->pict_type==P_TYPE) cbp^=0x3C;
+ }
}
for (i = 0; i < 6; i++) {
if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
{
- fprintf(stderr,"\nIgnoring error while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
+ fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
return -1;
}
}
@@ -1098,7 +1202,7 @@ int msmpeg4_decode_mb(MpegEncContext *s,
}
}
- if(s->msmpeg4_version==2) return msmpeg4v2_decode_mb(s, block); //FIXME merge if possible
+ if(s->msmpeg4_version<=2) return msmpeg4v12_decode_mb(s, block); //FIXME export function & call from outside perhaps
if (s->pict_type == P_TYPE) {
set_stat(ST_INTER_MB);
@@ -1161,10 +1265,11 @@ int msmpeg4_decode_mb(MpegEncContext *s,
for (i = 0; i < 6; i++) {
if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
{
- fprintf(stderr,"\nIgnoring error while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
- // return -1;
+ fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
+ return -1;
}
}
+
return 0;
}
@@ -1184,14 +1289,24 @@ static int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
/* DC coef */
set_stat(ST_DC);
level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
- if (level < 0)
+ if (level < 0){
+ fprintf(stderr, "dc overflow-\n");
return -1;
- block[0] = level;
+ }
if (n < 4) {
rl = &rl_table[s->rl_table_index];
+ if(level > 256*s->y_dc_scale){
+ fprintf(stderr, "dc overflow+\n");
+ return -1;
+ }
} else {
rl = &rl_table[3 + s->rl_chroma_table_index];
+ if(level > 256*s->c_dc_scale){
+ fprintf(stderr, "dc overflow+\n");
+ return -1;
+ }
}
+ block[0] = level;
run_diff = 0;
i = 1;
@@ -1232,16 +1347,42 @@ static int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
return -1;
if (code == rl->n) {
/* escape */
- if (get_bits1(&s->gb) == 0) {
- if (get_bits1(&s->gb) == 0) {
+ if (s->msmpeg4_version==1 || get_bits1(&s->gb) == 0) {
+ if (s->msmpeg4_version==1 || get_bits1(&s->gb) == 0) {
/* third escape */
last = get_bits1(&s->gb);
run = get_bits(&s->gb, 6);
level = get_bits(&s->gb, 8);
level = (level << 24) >> 24; /* sign extend */
+#if 0 // waste of time / this will detect very few errors
+ {
+ const int abs_level= ABS(level);
+ const int run1= run - rl->max_run[last][abs_level] - run_diff;
+ if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
+ if(abs_level <= rl->max_level[last][run]){
+ fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
+ return DECODING_AC_LOST;
+ }
+ if(abs_level <= rl->max_level[last][run]*2){
+ fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
+ return DECODING_AC_LOST;
+ }
+ if(abs_level <= rl->max_level[last][run1] && 0){
+ fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
+ return DECODING_AC_LOST;
+ }
+ }
+ }
+#endif
//level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
if (level>0) level= level * qmul + qadd;
- else level= level * qmul - qadd;
+ else level= level * qmul - qadd;
+#if 0 // waste of time too :(
+ if(level>2048 || level<-2048){
+ fprintf(stderr, "|level| overflow in 3. esc\n");
+ return DECODING_AC_LOST;
+ }
+#endif
} else {
/* second escape */
code = get_vlc(&s->gb, &rl->vlc);
@@ -1278,7 +1419,7 @@ static int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
i += run;
if (i >= 64)
return -1;
-//printf("RL:%d %d %d ", run, level, last);
+
j = scan_table[i];
block[j] = level;
i++;
@@ -1300,9 +1441,8 @@ static int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
{
int level, pred;
- INT16 *dc_val;
- if(s->msmpeg4_version==2){
+ if(s->msmpeg4_version<=2){
if (n < 4) {
level = get_vlc(&s->gb, &v2_dc_lum_vlc);
} else {
@@ -1317,8 +1457,10 @@ static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
} else {
level = get_vlc(&s->gb, &dc_chroma_vlc[s->dc_table_index]);
}
- if (level < 0)
+ if (level < 0){
+ fprintf(stderr, "illegal dc vlc\n");
return -1;
+ }
if (level == DC_MAX) {
level = get_bits(&s->gb, 8);
@@ -1330,14 +1472,24 @@ static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
}
}
- pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
- level += pred;
+ if(s->msmpeg4_version==1){
+ INT32 *dc_val;
+ pred = msmpeg4v1_pred_dc(s, n, &dc_val);
+ level += pred;
+
+ /* update predictor */
+ *dc_val= level;
+ }else{
+ INT16 *dc_val;
+ pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
+ level += pred;
- /* update predictor */
- if (n < 4) {
- *dc_val = level * s->y_dc_scale;
- } else {
- *dc_val = level * s->c_dc_scale;
+ /* update predictor */
+ if (n < 4) {
+ *dc_val = level * s->y_dc_scale;
+ } else {
+ *dc_val = level * s->c_dc_scale;
+ }
}
return level;
diff --git a/libavcodec/msmpeg4data.h b/libavcodec/msmpeg4data.h
index 9dcb8276fc..66e0a3d895 100644
--- a/libavcodec/msmpeg4data.h
+++ b/libavcodec/msmpeg4data.h
@@ -3,7 +3,7 @@
*/
/* intra picture macro block coded block pattern */
-const UINT16 table_mb_intra[64][2] = {
+static const UINT16 table_mb_intra[64][2] = {
{ 0x1, 1 },{ 0x17, 6 },{ 0x9, 5 },{ 0x5, 5 },
{ 0x6, 5 },{ 0x47, 9 },{ 0x20, 7 },{ 0x10, 7 },
{ 0x2, 5 },{ 0x7c, 9 },{ 0x3a, 7 },{ 0x1d, 7 },
@@ -23,7 +23,7 @@ const UINT16 table_mb_intra[64][2] = {
};
/* non intra picture macro block coded block pattern + mb type */
-const UINT32 table_mb_non_intra[128][2] = {
+static const UINT32 table_mb_non_intra[128][2] = {
{ 0x40, 7 },{ 0x13c9, 13 },{ 0x9fd, 12 },{ 0x1fc, 15 },
{ 0x9fc, 12 },{ 0xa83, 18 },{ 0x12d34, 17 },{ 0x83bc, 16 },
{ 0x83a, 12 },{ 0x7f8, 17 },{ 0x3fd, 16 },{ 0x3ff, 16 },
@@ -128,7 +128,7 @@ static const UINT32 table0_dc_chroma[120][2] = {
/* dc table 1 */
-const UINT32 table1_dc_lum[120][2] = {
+static const UINT32 table1_dc_lum[120][2] = {
{ 0x2, 2 },{ 0x3, 2 },{ 0x3, 3 },{ 0x2, 4 },
{ 0x5, 4 },{ 0x1, 5 },{ 0x3, 5 },{ 0x8, 5 },
{ 0x0, 6 },{ 0x5, 6 },{ 0xd, 6 },{ 0xf, 6 },
@@ -161,7 +161,7 @@ const UINT32 table1_dc_lum[120][2] = {
{ 0x1e6964, 26 },{ 0x1e6965, 26 },{ 0x1e6966, 26 },{ 0x1e6967, 26 },
};
-const UINT32 table1_dc_chroma[120][2] = {
+static const UINT32 table1_dc_chroma[120][2] = {
{ 0x0, 2 },{ 0x1, 2 },{ 0x4, 3 },{ 0x7, 3 },
{ 0xb, 4 },{ 0xd, 4 },{ 0x15, 5 },{ 0x28, 6 },
{ 0x30, 6 },{ 0x32, 6 },{ 0x52, 7 },{ 0x62, 7 },
@@ -233,7 +233,7 @@ static const UINT16 table0_vlc[133][2] = {
{ 0x16, 7 },
};
-const INT8 table0_level[132] = {
+static const INT8 table0_level[132] = {
1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16,
1, 2, 3, 4, 5, 6, 7, 8,
@@ -253,7 +253,7 @@ const INT8 table0_level[132] = {
1, 1, 1, 1,
};
-const INT8 table0_run[132] = {
+static const INT8 table0_run[132] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1,
@@ -275,7 +275,7 @@ const INT8 table0_run[132] = {
/* vlc table 1, for intra chroma and P macro blocks */
-const UINT16 table1_vlc[149][2] = {
+static const UINT16 table1_vlc[149][2] = {
{ 0x4, 3 },{ 0x14, 5 },{ 0x17, 7 },{ 0x7f, 8 },
{ 0x154, 9 },{ 0x1f2, 10 },{ 0xbf, 11 },{ 0x65, 12 },
{ 0xaaa, 12 },{ 0x630, 13 },{ 0x1597, 13 },{ 0x3b7, 14 },
@@ -316,7 +316,7 @@ const UINT16 table1_vlc[149][2] = {
{ 0xd, 9 },
};
-const INT8 table1_level[148] = {
+static const INT8 table1_level[148] = {
1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 1, 2,
3, 4, 5, 6, 7, 8, 9, 1,
@@ -338,7 +338,7 @@ const INT8 table1_level[148] = {
1, 1, 1, 1,
};
-const INT8 table1_run[148] = {
+static const INT8 table1_run[148] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 1, 1, 1, 1, 1, 2,
@@ -362,7 +362,7 @@ const INT8 table1_run[148] = {
/* third vlc table */
-const UINT16 table2_vlc[186][2] = {
+static const UINT16 table2_vlc[186][2] = {
{ 0x1, 2 },{ 0x5, 3 },{ 0xd, 4 },{ 0x12, 5 },
{ 0xe, 6 },{ 0x15, 7 },{ 0x13, 8 },{ 0x3f, 8 },
{ 0x4b, 9 },{ 0x11f, 9 },{ 0xb8, 10 },{ 0x3e3, 10 },
@@ -412,7 +412,7 @@ const UINT16 table2_vlc[186][2] = {
{ 0x23dc, 14 },{ 0x4a, 9 },
};
-const INT8 table2_level[185] = {
+static const INT8 table2_level[185] = {
1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 1, 2, 3, 4, 5,
@@ -439,7 +439,7 @@ const INT8 table2_level[185] = {
1,
};
-const INT8 table2_run[185] = {
+static const INT8 table2_run[185] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 1, 1,
@@ -467,7 +467,7 @@ const INT8 table2_run[185] = {
};
/* second non intra vlc table */
-const UINT16 table4_vlc[169][2] = {
+static const UINT16 table4_vlc[169][2] = {
{ 0x0, 3 },{ 0x3, 4 },{ 0xb, 5 },{ 0x14, 6 },
{ 0x3f, 6 },{ 0x5d, 7 },{ 0xa2, 8 },{ 0xac, 9 },
{ 0x16e, 9 },{ 0x20a, 10 },{ 0x2e2, 10 },{ 0x432, 11 },
@@ -513,7 +513,7 @@ const UINT16 table4_vlc[169][2] = {
{ 0x169, 9 },
};
-const INT8 table4_level[168] = {
+static const INT8 table4_level[168] = {
1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 1,
@@ -537,7 +537,7 @@ const INT8 table4_level[168] = {
1, 1, 1, 1, 1, 1, 1, 1,
};
-const INT8 table4_run[168] = {
+static const INT8 table4_run[168] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1,
@@ -575,6 +575,11 @@ extern const UINT8 DCtab_chrom[13][2];
extern const UINT8 cbpy_tab[16][2];
extern const UINT8 mvtab[33][2];
+extern const UINT8 intra_MCBPC_code[8];
+extern const UINT8 intra_MCBPC_bits[8];
+
+extern const UINT8 inter_MCBPC_code[8];
+extern const UINT8 inter_MCBPC_bits[8];
#define NB_RL_TABLES 6
@@ -627,7 +632,7 @@ static RLTable rl_table[NB_RL_TABLES] = {
/* motion vector table 0 */
-const UINT16 table0_mv_code[1100] = {
+static const UINT16 table0_mv_code[1100] = {
0x0001, 0x0003, 0x0005, 0x0007, 0x0003, 0x0008, 0x000c, 0x0001,
0x0002, 0x001b, 0x0006, 0x000b, 0x0015, 0x0002, 0x000e, 0x000f,
0x0014, 0x0020, 0x0022, 0x0025, 0x0027, 0x0029, 0x002d, 0x004b,
@@ -768,7 +773,7 @@ const UINT16 table0_mv_code[1100] = {
0x5f0d, 0x5f0e, 0x5f0f, 0x0000,
};
-const UINT8 table0_mv_bits[1100] = {
+static const UINT8 table0_mv_bits[1100] = {
1, 4, 4, 4, 5, 5, 5, 6,
6, 6, 7, 7, 7, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
@@ -909,7 +914,7 @@ const UINT8 table0_mv_bits[1100] = {
17, 17, 17, 8,
};
-const UINT8 table0_mvx[1099] = {
+static const UINT8 table0_mvx[1099] = {
32, 32, 31, 32, 33, 31, 33, 31,
33, 32, 34, 32, 30, 32, 31, 34,
35, 32, 34, 33, 29, 33, 30, 30,
@@ -1050,7 +1055,7 @@ const UINT8 table0_mvx[1099] = {
61, 19, 19,
};
-const UINT8 table0_mvy[1099] = {
+static const UINT8 table0_mvy[1099] = {
32, 31, 32, 33, 32, 31, 31, 33,
33, 34, 32, 30, 32, 35, 34, 31,
32, 29, 33, 30, 32, 34, 33, 31,
@@ -1192,7 +1197,7 @@ const UINT8 table0_mvy[1099] = {
};
/* motion vector table 1 */
-const UINT16 table1_mv_code[1100] = {
+static const UINT16 table1_mv_code[1100] = {
0x0000, 0x0007, 0x0009, 0x000f, 0x000a, 0x0011, 0x001a, 0x001c,
0x0011, 0x0031, 0x0025, 0x002d, 0x002f, 0x006f, 0x0075, 0x0041,
0x004c, 0x004e, 0x005c, 0x0060, 0x0062, 0x0066, 0x0068, 0x0069,
@@ -1333,7 +1338,7 @@ const UINT16 table1_mv_code[1100] = {
0x2473, 0x26a2, 0x26a3, 0x000b,
};
-const UINT8 table1_mv_bits[1100] = {
+static const UINT8 table1_mv_bits[1100] = {
2, 4, 4, 4, 5, 5, 5, 5,
6, 6, 7, 7, 7, 7, 7, 8,
8, 8, 8, 8, 8, 8, 8, 8,
@@ -1474,7 +1479,7 @@ const UINT8 table1_mv_bits[1100] = {
15, 15, 15, 4,
};
-const UINT8 table1_mvx[1099] = {
+static const UINT8 table1_mvx[1099] = {
32, 31, 32, 31, 33, 32, 33, 33,
31, 34, 30, 32, 32, 34, 35, 32,
34, 33, 29, 30, 30, 32, 31, 31,
@@ -1615,7 +1620,7 @@ const UINT8 table1_mvx[1099] = {
0, 12, 27,
};
-const UINT8 table1_mvy[1099] = {
+static const UINT8 table1_mvy[1099] = {
32, 32, 31, 31, 32, 33, 31, 33,
33, 32, 32, 30, 34, 31, 32, 29,
33, 30, 32, 33, 31, 35, 34, 30,