blob: c53dc0d8aeb18cbe196eb4a78fd98502a1836323 [file] [log] [blame]
Fabrice Bellardde6d9b62001-07-22 14:18:561/*
2 * MSMPEG4 backend for ffmpeg encoder and decoder
Fabrice Bellardff4ec492002-05-25 22:45:333 * Copyright (c) 2001 Fabrice Bellard.
Fabrice Bellardde6d9b62001-07-22 14:18:564 *
Fabrice Bellardff4ec492002-05-25 22:45:335 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
Fabrice Bellardde6d9b62001-07-22 14:18:569 *
Fabrice Bellardff4ec492002-05-25 22:45:3310 * This library is distributed in the hope that it will be useful,
Fabrice Bellardde6d9b62001-07-22 14:18:5611 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Fabrice Bellardff4ec492002-05-25 22:45:3312 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
Fabrice Bellardde6d9b62001-07-22 14:18:5614 *
Fabrice Bellardff4ec492002-05-25 22:45:3315 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Michael Niedermayer92ba5ff2002-05-21 23:13:5718 *
Michael Niedermayer287229e2002-06-02 12:22:3019 * msmpeg4v1 & v2 stuff by Michael Niedermayer <[email protected]>
Fabrice Bellardde6d9b62001-07-22 14:18:5620 */
Fabrice Bellard6000abf2002-05-18 23:03:2921#include "avcodec.h"
Fabrice Bellardde6d9b62001-07-22 14:18:5622#include "dsputil.h"
23#include "mpegvideo.h"
Michael Niedermayerbd5e1c72002-06-22 15:52:2524//#define PRINT_MB
Michael Niedermayer92ba5ff2002-05-21 23:13:5725
Fabrice Bellardde6d9b62001-07-22 14:18:5626/*
27 * You can also call this codec : MPEG4 with a twist !
28 *
29 * TODO:
30 * - (encoding) select best mv table (two choices)
31 * - (encoding) select best vlc/dc table
Fabrice Bellardde6d9b62001-07-22 14:18:5632 */
33//#define DEBUG
34
Michael Niedermayer08dce7b2002-07-10 20:05:4235#define DC_VLC_BITS 9
36#define CBPY_VLC_BITS 6
37#define INTER_INTRA_VLC_BITS 3
38#define V1_INTRA_CBPC_VLC_BITS 6
39#define V1_INTER_CBPC_VLC_BITS 6
40#define V2_INTRA_CBPC_VLC_BITS 3
41#define V2_MB_TYPE_VLC_BITS 7
42#define MV_VLC_BITS 9
43#define V2_MV_VLC_BITS 9
44#define TEX_VLC_BITS 9
45#define MB_NON_INTRA_VLC_BITS 9
46#define MB_INTRA_VLC_BITS 9
47
Michael Niedermayer84afee32002-04-05 04:09:0448static UINT32 v2_dc_lum_table[512][2];
49static UINT32 v2_dc_chroma_table[512][2];
50
Michael Niedermayerf5957f32002-06-18 00:49:0051static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n);
52static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
53 int n, int coded);
Fabrice Bellardde6d9b62001-07-22 14:18:5654static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
55static int msmpeg4_decode_motion(MpegEncContext * s,
56 int *mx_ptr, int *my_ptr);
Michael Niedermayer3825cd12002-04-05 21:04:0957static void msmpeg4v2_encode_motion(MpegEncContext * s, int val);
Falk Hüffner20695ec2002-06-03 11:16:1158static void init_h263_dc_for_msmpeg4(void);
Michael Niedermayerde0f2f42002-07-07 08:34:4659static inline void msmpeg4_memsetw(short *tab, int val, int n);
60
Michael Niedermayer3825cd12002-04-05 21:04:0961
Fabrice Bellardde6d9b62001-07-22 14:18:5662
Michael Niedermayer6fe84b42002-02-05 22:51:2363extern UINT32 inverse[256];
64
Fabrice Bellardde6d9b62001-07-22 14:18:5665#ifdef DEBUG
66int intra_count = 0;
67int frame_count = 0;
68#endif
Fabrice Bellardde6d9b62001-07-22 14:18:5669
70#include "msmpeg4data.h"
71
72#ifdef STATS
73
74const char *st_names[ST_NB] = {
75 "unknown",
76 "dc",
77 "intra_ac",
78 "inter_ac",
79 "intra_mb",
80 "inter_mb",
81 "mv",
82};
83
84int st_current_index = 0;
85unsigned int st_bit_counts[ST_NB];
86unsigned int st_out_bit_counts[ST_NB];
87
88#define set_stat(var) st_current_index = var;
89
90void print_stats(void)
91{
92 unsigned int total;
93 int i;
94
95 printf("Input:\n");
96 total = 0;
97 for(i=0;i<ST_NB;i++)
98 total += st_bit_counts[i];
99 if (total == 0)
100 total = 1;
101 for(i=0;i<ST_NB;i++) {
102 printf("%-10s : %10.1f %5.1f%%\n",
103 st_names[i],
104 (double)st_bit_counts[i] / 8.0,
105 (double)st_bit_counts[i] * 100.0 / total);
106 }
107 printf("%-10s : %10.1f %5.1f%%\n",
108 "total",
109 (double)total / 8.0,
110 100.0);
111
112 printf("Output:\n");
113 total = 0;
114 for(i=0;i<ST_NB;i++)
115 total += st_out_bit_counts[i];
116 if (total == 0)
117 total = 1;
118 for(i=0;i<ST_NB;i++) {
119 printf("%-10s : %10.1f %5.1f%%\n",
120 st_names[i],
121 (double)st_out_bit_counts[i] / 8.0,
122 (double)st_out_bit_counts[i] * 100.0 / total);
123 }
124 printf("%-10s : %10.1f %5.1f%%\n",
125 "total",
126 (double)total / 8.0,
127 100.0);
128}
129
130#else
131
132#define set_stat(var)
133
134#endif
135
Michael Niedermayerf5957f32002-06-18 00:49:00136static void common_init(MpegEncContext * s)
137{
138 static int inited=0;
139
140 switch(s->msmpeg4_version){
141 case 1:
142 case 2:
143 s->y_dc_scale_table=
144 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
145 break;
146 case 3:
147 if(s->workaround_bugs){
148 s->y_dc_scale_table= old_ff_y_dc_scale_table;
149 s->c_dc_scale_table= old_ff_c_dc_scale_table;
150 } else{
151 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
152 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
153 }
154 break;
155 case 4:
156 s->y_dc_scale_table= wmv1_y_dc_scale_table;
157 s->c_dc_scale_table= wmv1_c_dc_scale_table;
158 break;
159 }
160
161 if(s->msmpeg4_version==4){
162 s->intra_scantable = wmv1_scantable[1];
163 s->intra_h_scantable= wmv1_scantable[2];
164 s->intra_v_scantable= wmv1_scantable[3];
165 s->inter_scantable = wmv1_scantable[0];
166 }else{
167 s->intra_scantable = zigzag_direct;
168 s->intra_h_scantable= ff_alternate_horizontal_scan;
169 s->intra_v_scantable= ff_alternate_vertical_scan;
170 s->inter_scantable = zigzag_direct;
171 }
172
173 if(!inited){
174 int i;
175 inited=1;
176
177 init_h263_dc_for_msmpeg4();
178
179 /* permute for IDCT */
180 for(i=0; i<WMV1_SCANTABLE_COUNT; i++){
181 int k;
182 for(k=0;k<64;k++) {
183 int j = wmv1_scantable[i][k];
184 wmv1_scantable[i][k]= block_permute_op(j);
185 }
186 }
187
188 }
189}
190
Fabrice Bellardde6d9b62001-07-22 14:18:56191/* build the table which associate a (x,y) motion vector to a vlc */
192static void init_mv_table(MVTable *tab)
193{
194 int i, x, y;
195
Fabrice Bellard6000abf2002-05-18 23:03:29196 tab->table_mv_index = av_malloc(sizeof(UINT16) * 4096);
Fabrice Bellardde6d9b62001-07-22 14:18:56197 /* mark all entries as not used */
198 for(i=0;i<4096;i++)
199 tab->table_mv_index[i] = tab->n;
200
201 for(i=0;i<tab->n;i++) {
202 x = tab->table_mvx[i];
203 y = tab->table_mvy[i];
204 tab->table_mv_index[(x << 6) | y] = i;
205 }
206}
207
208static void code012(PutBitContext *pb, int n)
209{
210 if (n == 0) {
211 put_bits(pb, 1, 0);
212 } else {
213 put_bits(pb, 1, 1);
214 put_bits(pb, 1, (n >= 2));
215 }
216}
217
Michael Niedermayerf5957f32002-06-18 00:49:00218void ff_msmpeg4_encode_init(MpegEncContext *s)
219{
220 static int init_done=0;
221 int i;
222
223 common_init(s);
224 if(s->msmpeg4_version>=4){
225 s->min_qcoeff= -255;
226 s->max_qcoeff= 255;
227 }
228
229 if (!init_done) {
230 /* init various encoding tables */
231 init_done = 1;
232 init_mv_table(&mv_tables[0]);
233 init_mv_table(&mv_tables[1]);
234 for(i=0;i<NB_RL_TABLES;i++)
235 init_rl(&rl_table[i]);
236 }
237}
238
239static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra){
240 int size=0;
241 int code;
242 int run_diff= intra ? 0 : 1;
243
244 code = get_rl_index(rl, last, run, level);
245 size+= rl->table_vlc[code][1];
246 if (code == rl->n) {
247 int level1, run1;
248
249 level1 = level - rl->max_level[last][run];
250 if (level1 < 1)
251 goto esc2;
252 code = get_rl_index(rl, last, run, level1);
253 if (code == rl->n) {
254 esc2:
255 size++;
256 if (level > MAX_LEVEL)
257 goto esc3;
258 run1 = run - rl->max_run[last][level] - run_diff;
259 if (run1 < 0)
260 goto esc3;
261 code = get_rl_index(rl, last, run1, level);
262 if (code == rl->n) {
263 esc3:
264 /* third escape */
265 size+=1+1+6+8;
266 } else {
267 /* second escape */
268 size+= 1+1+ rl->table_vlc[code][1];
269 }
270 } else {
271 /* first escape */
272 size+= 1+1+ rl->table_vlc[code][1];
273 }
274 } else {
275 size++;
276 }
277 return size;
278}
279
280static void find_best_tables(MpegEncContext * s)
281{
282 int i;
283 int best =-1, best_size =9999999;
284 int chroma_best=-1, best_chroma_size=9999999;
285 int last_size=0;
286
287 for(i=0; i<3; i++){
288 int level;
289 int chroma_size=0;
290 int size=0;
291
292 if(i>0){// ;)
293 size++;
294 chroma_size++;
295 }
296 for(level=0; level<=MAX_LEVEL; level++){
297 int run;
298 for(run=0; run<=MAX_RUN; run++){
299 int last;
300 for(last=0; last<2; last++){
301 int inter_count = s->ac_stats[0][0][level][run][last] + s->ac_stats[0][1][level][run][last];
302 int intra_luma_count = s->ac_stats[1][0][level][run][last];
303 int intra_chroma_count= s->ac_stats[1][1][level][run][last];
304
305 if(s->pict_type==I_TYPE){
306 size += intra_luma_count *get_size_of_code(s, &rl_table[ i], last, run, level,1);
307 chroma_size+= intra_chroma_count*get_size_of_code(s, &rl_table[3+i], last, run, level,1);
308 }else{
309 size+= intra_luma_count *get_size_of_code(s, &rl_table[ i], last, run, level,1)
310 +intra_chroma_count*get_size_of_code(s, &rl_table[3+i], last, run, level,1)
311 +inter_count *get_size_of_code(s, &rl_table[3+i], last, run, level,0);
312 }
313 }
314 }
315 }
316 if(size<best_size){
317 best_size= size;
318 best= i;
319 }
320 if(chroma_size<best_chroma_size){
321 best_chroma_size= chroma_size;
322 chroma_best= i;
323 }
324 }
325// printf("type:%d, best:%d, qp:%d, var:%d, mcvar:%d, size:%d //\n",
326// s->pict_type, best, s->qscale, s->mb_var_sum, s->mc_mb_var_sum, best_size);
327
328 if(s->pict_type==P_TYPE) chroma_best= best;
329
330 memset(s->ac_stats, 0, sizeof(int)*(MAX_LEVEL+1)*(MAX_RUN+1)*2*2*2);
331
332 s->rl_table_index = best;
333 s->rl_chroma_table_index= chroma_best;
334
335 if(s->pict_type != s->last_non_b_pict_type){
336 s->rl_table_index= 2;
337 if(s->pict_type==I_TYPE)
338 s->rl_chroma_table_index= 1;
339 else
340 s->rl_chroma_table_index= 2;
341 }
342
343}
344
Michael Niedermayer287229e2002-06-02 12:22:30345/* write MSMPEG4 compatible frame header */
Fabrice Bellardde6d9b62001-07-22 14:18:56346void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
347{
Michael Niedermayerf5957f32002-06-18 00:49:00348 find_best_tables(s);
Fabrice Bellardde6d9b62001-07-22 14:18:56349
350 align_put_bits(&s->pb);
Fabrice Bellardde6d9b62001-07-22 14:18:56351 put_bits(&s->pb, 2, s->pict_type - 1);
352
353 put_bits(&s->pb, 5, s->qscale);
Michael Niedermayerf5957f32002-06-18 00:49:00354 if(s->msmpeg4_version<=2){
355 s->rl_table_index = 2;
356 s->rl_chroma_table_index = 2;
357 }
Michael Niedermayer3825cd12002-04-05 21:04:09358
Fabrice Bellardde6d9b62001-07-22 14:18:56359 s->dc_table_index = 1;
360 s->mv_table_index = 1; /* only if P frame */
361 s->use_skip_mb_code = 1; /* only if P frame */
Michael Niedermayerf5957f32002-06-18 00:49:00362 s->per_mb_rl_table = 0;
Michael Niedermayerde0f2f42002-07-07 08:34:46363 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=128 && s->pict_type==P_TYPE);
Michael Niedermayerf5957f32002-06-18 00:49:00364
Fabrice Bellardde6d9b62001-07-22 14:18:56365 if (s->pict_type == I_TYPE) {
Michael Niedermayerf5957f32002-06-18 00:49:00366 s->no_rounding = 1;
Michael Niedermayerde0f2f42002-07-07 08:34:46367 s->slice_height= s->mb_height/1;
368 put_bits(&s->pb, 5, 0x16 + s->mb_height/s->slice_height);
Michael Niedermayerf5957f32002-06-18 00:49:00369
370 if(s->msmpeg4_version==4){
371 msmpeg4_encode_ext_header(s);
Michael Niedermayerde0f2f42002-07-07 08:34:46372 if(s->bit_rate>50)
373 put_bits(&s->pb, 1, s->per_mb_rl_table);
Michael Niedermayerf5957f32002-06-18 00:49:00374 }
Fabrice Bellardde6d9b62001-07-22 14:18:56375
Michael Niedermayer287229e2002-06-02 12:22:30376 if(s->msmpeg4_version>2){
Michael Niedermayerf5957f32002-06-18 00:49:00377 if(!s->per_mb_rl_table){
378 code012(&s->pb, s->rl_chroma_table_index);
379 code012(&s->pb, s->rl_table_index);
380 }
Fabrice Bellardde6d9b62001-07-22 14:18:56381
Michael Niedermayer3825cd12002-04-05 21:04:09382 put_bits(&s->pb, 1, s->dc_table_index);
383 }
Fabrice Bellardde6d9b62001-07-22 14:18:56384 } else {
385 put_bits(&s->pb, 1, s->use_skip_mb_code);
386
Michael Niedermayerde0f2f42002-07-07 08:34:46387 if(s->msmpeg4_version==4 && s->bit_rate>50)
Michael Niedermayerf5957f32002-06-18 00:49:00388 put_bits(&s->pb, 1, s->per_mb_rl_table);
389
Michael Niedermayer287229e2002-06-02 12:22:30390 if(s->msmpeg4_version>2){
Michael Niedermayerf5957f32002-06-18 00:49:00391 if(!s->per_mb_rl_table)
392 code012(&s->pb, s->rl_table_index);
Fabrice Bellardde6d9b62001-07-22 14:18:56393
Michael Niedermayer3825cd12002-04-05 21:04:09394 put_bits(&s->pb, 1, s->dc_table_index);
Fabrice Bellardde6d9b62001-07-22 14:18:56395
Michael Niedermayer3825cd12002-04-05 21:04:09396 put_bits(&s->pb, 1, s->mv_table_index);
397 }
398
Michael Niedermayerae404842002-01-15 22:22:41399 if(s->flipflop_rounding){
400 s->no_rounding ^= 1;
401 }else{
402 s->no_rounding = 0;
403 }
Fabrice Bellardde6d9b62001-07-22 14:18:56404 }
405
Michael Niedermayerf5957f32002-06-18 00:49:00406 s->esc3_level_length= 0;
407 s->esc3_run_length= 0;
Fabrice Bellardde6d9b62001-07-22 14:18:56408
409#ifdef DEBUG
410 intra_count = 0;
411 printf("*****frame %d:\n", frame_count++);
412#endif
413}
414
Michael Niedermayerae404842002-01-15 22:22:41415void msmpeg4_encode_ext_header(MpegEncContext * s)
416{
Michael Niedermayer2b9ab1d2002-02-22 19:19:01417 put_bits(&s->pb, 5, s->frame_rate / FRAME_RATE_BASE); //yes 29.97 -> 29
Michael Niedermayerae404842002-01-15 22:22:41418
Michael Niedermayerde0f2f42002-07-07 08:34:46419 put_bits(&s->pb, 11, MIN(s->bit_rate, 2047));
Michael Niedermayerae404842002-01-15 22:22:41420
Michael Niedermayer287229e2002-06-02 12:22:30421 if(s->msmpeg4_version<3)
422 s->flipflop_rounding=0;
423 else{
424 s->flipflop_rounding=1;
425 put_bits(&s->pb, 1, s->flipflop_rounding);
426 }
Michael Niedermayerae404842002-01-15 22:22:41427}
428
Fabrice Bellardde6d9b62001-07-22 14:18:56429/* predict coded block */
430static inline int coded_block_pred(MpegEncContext * s, int n, UINT8 **coded_block_ptr)
431{
Michael Niedermayerdbbe8992002-03-29 01:53:59432 int xy, wrap, pred, a, b, c;
Fabrice Bellardde6d9b62001-07-22 14:18:56433
Michael Niedermayerdbbe8992002-03-29 01:53:59434 xy = s->block_index[n];
435 wrap = s->block_wrap[0];
Fabrice Bellardde6d9b62001-07-22 14:18:56436
437 /* B C
438 * A X
439 */
Michael Niedermayerdbbe8992002-03-29 01:53:59440 a = s->coded_block[xy - 1 ];
441 b = s->coded_block[xy - 1 - wrap];
442 c = s->coded_block[xy - wrap];
Fabrice Bellardde6d9b62001-07-22 14:18:56443
444 if (b == c) {
445 pred = a;
446 } else {
447 pred = c;
448 }
449
450 /* store value */
Michael Niedermayerdbbe8992002-03-29 01:53:59451 *coded_block_ptr = &s->coded_block[xy];
Fabrice Bellardde6d9b62001-07-22 14:18:56452
453 return pred;
454}
455
456static void msmpeg4_encode_motion(MpegEncContext * s,
457 int mx, int my)
458{
459 int code;
460 MVTable *mv;
461
462 /* modulo encoding */
463 /* WARNING : you cannot reach all the MVs even with the modulo
464 encoding. This is a somewhat strange compromise they took !!! */
465 if (mx <= -64)
466 mx += 64;
467 else if (mx >= 64)
468 mx -= 64;
469 if (my <= -64)
470 my += 64;
471 else if (my >= 64)
472 my -= 64;
473
474 mx += 32;
475 my += 32;
476#if 0
477 if ((unsigned)mx >= 64 ||
478 (unsigned)my >= 64)
479 fprintf(stderr, "error mx=%d my=%d\n", mx, my);
480#endif
481 mv = &mv_tables[s->mv_table_index];
482
483 code = mv->table_mv_index[(mx << 6) | my];
484 set_stat(ST_MV);
485 put_bits(&s->pb,
486 mv->table_mv_bits[code],
487 mv->table_mv_code[code]);
488 if (code == mv->n) {
489 /* escape : code litterally */
490 put_bits(&s->pb, 6, mx);
491 put_bits(&s->pb, 6, my);
492 }
493}
494
Michael Niedermayerde0f2f42002-07-07 08:34:46495static inline void handle_slices(MpegEncContext *s){
496 if (s->mb_x == 0) {
497 if (s->slice_height && (s->mb_y % s->slice_height) == 0) {
498 if(s->msmpeg4_version != 4){
499 int wrap;
500 /* reset DC pred (set previous line to 1024) */
501 wrap = 2 * s->mb_width + 2;
502 msmpeg4_memsetw(&s->dc_val[0][(1) + (2 * s->mb_y) * wrap],
503 1024, 2 * s->mb_width);
504 wrap = s->mb_width + 2;
505 msmpeg4_memsetw(&s->dc_val[1][(1) + (s->mb_y) * wrap],
506 1024, s->mb_width);
507 msmpeg4_memsetw(&s->dc_val[2][(1) + (s->mb_y) * wrap],
508 1024, s->mb_width);
509
510 /* reset AC pred (set previous line to 0) */
511 wrap = s->mb_width * 2 + 2;
512 msmpeg4_memsetw(s->ac_val[0][0] + (1 + (2 * s->mb_y) * wrap)*16,
513 0, 2 * s->mb_width*16);
514 wrap = s->mb_width + 2;
515 msmpeg4_memsetw(s->ac_val[1][0] + (1 + (s->mb_y) * wrap)*16,
516 0, s->mb_width*16);
517 msmpeg4_memsetw(s->ac_val[2][0] + (1 + (s->mb_y) * wrap)*16,
518 0, s->mb_width*16);
519 }
520 s->first_slice_line = 1;
521 } else {
522 s->first_slice_line = 0;
523 }
524 }
525}
526
Fabrice Bellardde6d9b62001-07-22 14:18:56527void msmpeg4_encode_mb(MpegEncContext * s,
528 DCTELEM block[6][64],
529 int motion_x, int motion_y)
530{
531 int cbp, coded_cbp, i;
532 int pred_x, pred_y;
533 UINT8 *coded_block;
534
Michael Niedermayerde0f2f42002-07-07 08:34:46535 handle_slices(s);
536
Fabrice Bellardde6d9b62001-07-22 14:18:56537 if (!s->mb_intra) {
538 /* compute cbp */
539 set_stat(ST_INTER_MB);
540 cbp = 0;
541 for (i = 0; i < 6; i++) {
542 if (s->block_last_index[i] >= 0)
543 cbp |= 1 << (5 - i);
544 }
545 if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) {
546 /* skip macroblock */
547 put_bits(&s->pb, 1, 1);
548 return;
549 }
550 if (s->use_skip_mb_code)
551 put_bits(&s->pb, 1, 0); /* mb coded */
552
Michael Niedermayer287229e2002-06-02 12:22:30553 if(s->msmpeg4_version<=2){
Michael Niedermayer3825cd12002-04-05 21:04:09554 put_bits(&s->pb,
555 v2_mb_type[cbp&3][1],
556 v2_mb_type[cbp&3][0]);
557 if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C;
558 else coded_cbp= cbp;
Fabrice Bellardde6d9b62001-07-22 14:18:56559
Michael Niedermayer3825cd12002-04-05 21:04:09560 put_bits(&s->pb,
561 cbpy_tab[coded_cbp>>2][1],
562 cbpy_tab[coded_cbp>>2][0]);
563
564 h263_pred_motion(s, 0, &pred_x, &pred_y);
565 msmpeg4v2_encode_motion(s, motion_x - pred_x);
566 msmpeg4v2_encode_motion(s, motion_y - pred_y);
567 }else{
568 put_bits(&s->pb,
569 table_mb_non_intra[cbp + 64][1],
570 table_mb_non_intra[cbp + 64][0]);
571
572 /* motion vector */
573 h263_pred_motion(s, 0, &pred_x, &pred_y);
574 msmpeg4_encode_motion(s, motion_x - pred_x,
575 motion_y - pred_y);
576 }
Fabrice Bellardde6d9b62001-07-22 14:18:56577 } else {
578 /* compute cbp */
579 cbp = 0;
580 coded_cbp = 0;
581 for (i = 0; i < 6; i++) {
582 int val, pred;
583 val = (s->block_last_index[i] >= 1);
584 cbp |= val << (5 - i);
585 if (i < 4) {
586 /* predict value for close blocks only for luma */
587 pred = coded_block_pred(s, i, &coded_block);
588 *coded_block = val;
589 val = val ^ pred;
590 }
591 coded_cbp |= val << (5 - i);
592 }
593#if 0
594 if (coded_cbp)
595 printf("cbp=%x %x\n", cbp, coded_cbp);
596#endif
597
Michael Niedermayer287229e2002-06-02 12:22:30598 if(s->msmpeg4_version<=2){
Michael Niedermayer3825cd12002-04-05 21:04:09599 if (s->pict_type == I_TYPE) {
600 put_bits(&s->pb,
601 v2_intra_cbpc[cbp&3][1], v2_intra_cbpc[cbp&3][0]);
602 } else {
603 if (s->use_skip_mb_code)
604 put_bits(&s->pb, 1, 0); /* mb coded */
605 put_bits(&s->pb,
606 v2_mb_type[(cbp&3) + 4][1],
607 v2_mb_type[(cbp&3) + 4][0]);
608 }
609 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
610 put_bits(&s->pb,
611 cbpy_tab[cbp>>2][1],
612 cbpy_tab[cbp>>2][0]);
613 }else{
614 if (s->pict_type == I_TYPE) {
615 set_stat(ST_INTRA_MB);
616 put_bits(&s->pb,
617 table_mb_intra[coded_cbp][1], table_mb_intra[coded_cbp][0]);
618 } else {
619 if (s->use_skip_mb_code)
620 put_bits(&s->pb, 1, 0); /* mb coded */
621 put_bits(&s->pb,
622 table_mb_non_intra[cbp][1],
623 table_mb_non_intra[cbp][0]);
624 }
Fabrice Bellardde6d9b62001-07-22 14:18:56625 set_stat(ST_INTRA_MB);
Michael Niedermayer3825cd12002-04-05 21:04:09626 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
Fabrice Bellardde6d9b62001-07-22 14:18:56627 }
Fabrice Bellardde6d9b62001-07-22 14:18:56628 }
629
630 for (i = 0; i < 6; i++) {
631 msmpeg4_encode_block(s, block[i], i);
632 }
633}
634
Michael Niedermayer92ba5ff2002-05-21 23:13:57635/* old ffmpeg msmpeg4v3 mode */
636void ff_old_msmpeg4_dc_scale(MpegEncContext * s)
Fabrice Bellardde6d9b62001-07-22 14:18:56637{
Michael Niedermayer92ba5ff2002-05-21 23:13:57638 if (s->qscale < 5){
Michael Niedermayer6fb904c2002-01-11 21:27:04639 s->y_dc_scale = 8;
640 s->c_dc_scale = 8;
Michael Niedermayer6fb904c2002-01-11 21:27:04641 }else if (s->qscale < 9){
642 s->y_dc_scale = 2 * s->qscale;
643 s->c_dc_scale = (s->qscale + 13)>>1;
Michael Niedermayer92ba5ff2002-05-21 23:13:57644 }else{
Michael Niedermayer6fb904c2002-01-11 21:27:04645 s->y_dc_scale = s->qscale + 8;
646 s->c_dc_scale = (s->qscale + 13)>>1;
647 }
Fabrice Bellardde6d9b62001-07-22 14:18:56648}
649
Michael Niedermayerf5957f32002-06-18 00:49:00650static inline int msmpeg4v1_pred_dc(MpegEncContext * s, int n,
651 INT32 **dc_val_ptr)
Michael Niedermayer287229e2002-06-02 12:22:30652{
653 int i;
654
655 if (n < 4) {
656 i= 0;
657 } else {
658 i= n-3;
659 }
660
661 *dc_val_ptr= &s->last_dc[i];
662 return s->last_dc[i];
663}
664
Michael Niedermayerde0f2f42002-07-07 08:34:46665static int get_dc(uint8_t *src, int stride, int scale)
666{
667 int y;
668 int sum=0;
669 for(y=0; y<8; y++){
670 int x;
671 for(x=0; x<8; x++){
672 sum+=src[x + y*stride];
673 }
674 }
675 return (sum + (scale>>1))/scale;
676}
677
Fabrice Bellardde6d9b62001-07-22 14:18:56678/* dir = 0: left, dir = 1: top prediction */
Michael Niedermayerf5957f32002-06-18 00:49:00679static inline int msmpeg4_pred_dc(MpegEncContext * s, int n,
680 UINT16 **dc_val_ptr, int *dir_ptr)
Fabrice Bellardde6d9b62001-07-22 14:18:56681{
Michael Niedermayerdbbe8992002-03-29 01:53:59682 int a, b, c, wrap, pred, scale;
Fabrice Bellard98be9752001-08-06 00:47:50683 INT16 *dc_val;
Fabrice Bellardde6d9b62001-07-22 14:18:56684
685 /* find prediction */
686 if (n < 4) {
Fabrice Bellardde6d9b62001-07-22 14:18:56687 scale = s->y_dc_scale;
688 } else {
Fabrice Bellardde6d9b62001-07-22 14:18:56689 scale = s->c_dc_scale;
690 }
Michael Niedermayer287229e2002-06-02 12:22:30691
Michael Niedermayerdbbe8992002-03-29 01:53:59692 wrap = s->block_wrap[n];
693 dc_val= s->dc_val[0] + s->block_index[n];
Fabrice Bellardde6d9b62001-07-22 14:18:56694
695 /* B C
696 * A X
697 */
Michael Niedermayerdbbe8992002-03-29 01:53:59698 a = dc_val[ - 1];
699 b = dc_val[ - 1 - wrap];
700 c = dc_val[ - wrap];
Fabrice Bellardde6d9b62001-07-22 14:18:56701
702 /* XXX: the following solution consumes divisions, but it does not
703 necessitate to modify mpegvideo.c. The problem comes from the
704 fact they decided to store the quantized DC (which would lead
705 to problems if Q could vary !) */
Zdenek Kabelac320680d2002-01-28 18:06:28706#if defined ARCH_X86 && !defined PIC
Michael Niedermayer6f903d82002-01-14 04:34:52707 asm volatile(
708 "movl %3, %%eax \n\t"
709 "shrl $1, %%eax \n\t"
710 "addl %%eax, %2 \n\t"
711 "addl %%eax, %1 \n\t"
712 "addl %0, %%eax \n\t"
Michael Niedermayer6fe84b42002-02-05 22:51:23713 "mull %4 \n\t"
714 "movl %%edx, %0 \n\t"
Michael Niedermayer6f903d82002-01-14 04:34:52715 "movl %1, %%eax \n\t"
Michael Niedermayer6fe84b42002-02-05 22:51:23716 "mull %4 \n\t"
717 "movl %%edx, %1 \n\t"
Michael Niedermayer6f903d82002-01-14 04:34:52718 "movl %2, %%eax \n\t"
Michael Niedermayer6fe84b42002-02-05 22:51:23719 "mull %4 \n\t"
720 "movl %%edx, %2 \n\t"
Michael Niedermayerfa778d52002-02-09 00:38:44721 : "+b" (a), "+c" (b), "+D" (c)
722 : "g" (scale), "S" (inverse[scale])
Michael Niedermayer6f903d82002-01-14 04:34:52723 : "%eax", "%edx"
724 );
Zdenek Kabelac320680d2002-01-28 18:06:28725#else
726 /* #elif defined (ARCH_ALPHA) */
Nick Kurshev1e98dff2002-01-20 14:48:02727 /* Divisions are extremely costly on Alpha; optimize the most
Zdenek Kabelac320680d2002-01-28 18:06:28728 common case. But they are costly everywhere...
729 */
Nick Kurshev1e98dff2002-01-20 14:48:02730 if (scale == 8) {
731 a = (a + (8 >> 1)) / 8;
732 b = (b + (8 >> 1)) / 8;
733 c = (c + (8 >> 1)) / 8;
734 } else {
735 a = (a + (scale >> 1)) / scale;
736 b = (b + (scale >> 1)) / scale;
737 c = (c + (scale >> 1)) / scale;
738 }
Michael Niedermayer6f903d82002-01-14 04:34:52739#endif
Fabrice Bellardde6d9b62001-07-22 14:18:56740 /* XXX: WARNING: they did not choose the same test as MPEG4. This
741 is very important ! */
Michael Niedermayerbd5e1c72002-06-22 15:52:25742 if(s->msmpeg4_version>3){
Michael Niedermayerde0f2f42002-07-07 08:34:46743 if(s->inter_intra_pred){
744 uint8_t *dest;
745 int wrap;
746
747 if(n==1){
748 pred=a;
749 *dir_ptr = 0;
750 }else if(n==2){
751 pred=c;
752 *dir_ptr = 1;
753 }else if(n==3){
754 if (abs(a - b) < abs(b - c)) {
755 pred = c;
756 *dir_ptr = 1;
757 } else {
758 pred = a;
759 *dir_ptr = 0;
760 }
761 }else{
762 if(n<4){
763 wrap= s->linesize;
764 dest= s->current_picture[0] + (((n>>1) + 2*s->mb_y) * 8* wrap ) + ((n&1) + 2*s->mb_x) * 8;
765 }else{
766 wrap= s->linesize>>1;
767 dest= s->current_picture[n-3] + (s->mb_y * 8 * wrap) + s->mb_x * 8;
768 }
769 if(s->mb_x==0) a= (1024 + (scale>>1))/scale;
770 else a= get_dc(dest-8, wrap, scale*8);
771 if(s->mb_y==0) c= (1024 + (scale>>1))/scale;
772 else c= get_dc(dest-8*wrap, wrap, scale*8);
773
774 if (s->h263_aic_dir==0) {
775 pred= a;
776 *dir_ptr = 0;
777 }else if (s->h263_aic_dir==1) {
778 if(n==0){
779 pred= c;
780 *dir_ptr = 1;
781 }else{
782 pred= a;
783 *dir_ptr = 0;
784 }
785 }else if (s->h263_aic_dir==2) {
786 if(n==0){
787 pred= a;
788 *dir_ptr = 0;
789 }else{
790 pred= c;
791 *dir_ptr = 1;
792 }
793 } else {
794 pred= c;
795 *dir_ptr = 1;
796 }
797 }
798 }else{
799 if (abs(a - b) < abs(b - c)) {
800 pred = c;
801 *dir_ptr = 1;
802 } else {
803 pred = a;
804 *dir_ptr = 0;
805 }
Michael Niedermayerbd5e1c72002-06-22 15:52:25806 }
807 }else{
808 if (abs(a - b) <= abs(b - c)) {
809 pred = c;
810 *dir_ptr = 1;
811 } else {
812 pred = a;
813 *dir_ptr = 0;
814 }
Fabrice Bellardde6d9b62001-07-22 14:18:56815 }
816
817 /* update predictor */
Michael Niedermayerdbbe8992002-03-29 01:53:59818 *dc_val_ptr = &dc_val[0];
Fabrice Bellardde6d9b62001-07-22 14:18:56819 return pred;
820}
821
822#define DC_MAX 119
823
824static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
825{
826 int sign, code;
827 int pred;
Fabrice Bellardde6d9b62001-07-22 14:18:56828
Michael Niedermayer287229e2002-06-02 12:22:30829 if(s->msmpeg4_version==1){
830 INT32 *dc_val;
831 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
832
833 /* update predictor */
834 *dc_val= level;
835 }else{
Michael Niedermayerf5957f32002-06-18 00:49:00836 UINT16 *dc_val;
Michael Niedermayerbd5e1c72002-06-22 15:52:25837 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
Fabrice Bellardde6d9b62001-07-22 14:18:56838
Michael Niedermayer287229e2002-06-02 12:22:30839 /* update predictor */
840 if (n < 4) {
841 *dc_val = level * s->y_dc_scale;
842 } else {
843 *dc_val = level * s->c_dc_scale;
844 }
Fabrice Bellardde6d9b62001-07-22 14:18:56845 }
846
847 /* do the prediction */
848 level -= pred;
849
Michael Niedermayer287229e2002-06-02 12:22:30850 if(s->msmpeg4_version<=2){
Michael Niedermayer3825cd12002-04-05 21:04:09851 if (n < 4) {
852 put_bits(&s->pb,
853 v2_dc_lum_table[level+256][1],
854 v2_dc_lum_table[level+256][0]);
855 }else{
856 put_bits(&s->pb,
857 v2_dc_chroma_table[level+256][1],
858 v2_dc_chroma_table[level+256][0]);
859 }
860 }else{
861 sign = 0;
862 if (level < 0) {
863 level = -level;
864 sign = 1;
865 }
866 code = level;
867 if (code > DC_MAX)
868 code = DC_MAX;
Fabrice Bellardde6d9b62001-07-22 14:18:56869
Michael Niedermayer3825cd12002-04-05 21:04:09870 if (s->dc_table_index == 0) {
871 if (n < 4) {
872 put_bits(&s->pb, table0_dc_lum[code][1], table0_dc_lum[code][0]);
873 } else {
874 put_bits(&s->pb, table0_dc_chroma[code][1], table0_dc_chroma[code][0]);
875 }
Fabrice Bellardde6d9b62001-07-22 14:18:56876 } else {
Michael Niedermayer3825cd12002-04-05 21:04:09877 if (n < 4) {
878 put_bits(&s->pb, table1_dc_lum[code][1], table1_dc_lum[code][0]);
879 } else {
880 put_bits(&s->pb, table1_dc_chroma[code][1], table1_dc_chroma[code][0]);
881 }
Fabrice Bellardde6d9b62001-07-22 14:18:56882 }
Michael Niedermayer3825cd12002-04-05 21:04:09883
884 if (code == DC_MAX)
885 put_bits(&s->pb, 8, level);
886
887 if (level != 0) {
888 put_bits(&s->pb, 1, sign);
Fabrice Bellardde6d9b62001-07-22 14:18:56889 }
890 }
Fabrice Bellardde6d9b62001-07-22 14:18:56891}
892
893/* Encoding of a block. Very similar to MPEG4 except for a different
894 escape coding (same as H263) and more vlc tables.
895 */
Michael Niedermayerf5957f32002-06-18 00:49:00896static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
Fabrice Bellardde6d9b62001-07-22 14:18:56897{
898 int level, run, last, i, j, last_index;
899 int last_non_zero, sign, slevel;
900 int code, run_diff, dc_pred_dir;
901 const RLTable *rl;
Michael Niedermayerf5957f32002-06-18 00:49:00902 const UINT8 *scantable;
Fabrice Bellardde6d9b62001-07-22 14:18:56903
904 if (s->mb_intra) {
905 set_stat(ST_DC);
906 msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
907 i = 1;
908 if (n < 4) {
909 rl = &rl_table[s->rl_table_index];
910 } else {
911 rl = &rl_table[3 + s->rl_chroma_table_index];
912 }
913 run_diff = 0;
Michael Niedermayerf5957f32002-06-18 00:49:00914 scantable= s->intra_scantable;
Fabrice Bellardde6d9b62001-07-22 14:18:56915 set_stat(ST_INTRA_AC);
916 } else {
917 i = 0;
918 rl = &rl_table[3 + s->rl_table_index];
Michael Niedermayer287229e2002-06-02 12:22:30919 if(s->msmpeg4_version<=2)
Michael Niedermayer3825cd12002-04-05 21:04:09920 run_diff = 0;
921 else
922 run_diff = 1;
Michael Niedermayerf5957f32002-06-18 00:49:00923 scantable= s->inter_scantable;
Fabrice Bellardde6d9b62001-07-22 14:18:56924 set_stat(ST_INTER_AC);
925 }
926
Michael Niedermayerf5957f32002-06-18 00:49:00927 /* recalculate block_last_index for M$ wmv1 */
928 if(scantable!=zigzag_direct && s->block_last_index[n]>0){
929 for(last_index=63; last_index>=0; last_index--){
930 if(block[scantable[last_index]]) break;
931 }
932 }else
933 last_index = s->block_last_index[n];
Fabrice Bellardde6d9b62001-07-22 14:18:56934 /* AC coefs */
Fabrice Bellardde6d9b62001-07-22 14:18:56935 last_non_zero = i - 1;
936 for (; i <= last_index; i++) {
Michael Niedermayerf5957f32002-06-18 00:49:00937 j = scantable[i];
Fabrice Bellardde6d9b62001-07-22 14:18:56938 level = block[j];
939 if (level) {
940 run = i - last_non_zero - 1;
941 last = (i == last_index);
942 sign = 0;
943 slevel = level;
944 if (level < 0) {
945 sign = 1;
946 level = -level;
947 }
Michael Niedermayerf5957f32002-06-18 00:49:00948 if(level<=MAX_LEVEL && run<=MAX_RUN){
949 s->ac_stats[s->mb_intra][n>3][level][run][last]++;
950 }
951#if 0
952else
953 s->ac_stats[s->mb_intra][n>3][40][63][0]++; //esc3 like
954#endif
Fabrice Bellardde6d9b62001-07-22 14:18:56955 code = get_rl_index(rl, last, run, level);
956 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
957 if (code == rl->n) {
958 int level1, run1;
959
960 level1 = level - rl->max_level[last][run];
961 if (level1 < 1)
962 goto esc2;
963 code = get_rl_index(rl, last, run, level1);
964 if (code == rl->n) {
965 esc2:
966 put_bits(&s->pb, 1, 0);
967 if (level > MAX_LEVEL)
968 goto esc3;
969 run1 = run - rl->max_run[last][level] - run_diff;
970 if (run1 < 0)
971 goto esc3;
972 code = get_rl_index(rl, last, run1, level);
973 if (code == rl->n) {
974 esc3:
975 /* third escape */
976 put_bits(&s->pb, 1, 0);
977 put_bits(&s->pb, 1, last);
Michael Niedermayerf5957f32002-06-18 00:49:00978 if(s->msmpeg4_version==4){
979 if(s->esc3_level_length==0){
980 s->esc3_level_length=8;
981 s->esc3_run_length= 6;
982 if(s->qscale<8)
983 put_bits(&s->pb, 6, 3);
984 else
985 put_bits(&s->pb, 8, 3);
986 }
987 put_bits(&s->pb, s->esc3_run_length, run);
988 put_bits(&s->pb, 1, sign);
989 put_bits(&s->pb, s->esc3_level_length, level);
990 }else{
991 put_bits(&s->pb, 6, run);
992 put_bits(&s->pb, 8, slevel & 0xff);
993 }
Fabrice Bellardde6d9b62001-07-22 14:18:56994 } else {
995 /* second escape */
996 put_bits(&s->pb, 1, 1);
997 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
998 put_bits(&s->pb, 1, sign);
999 }
1000 } else {
1001 /* first escape */
1002 put_bits(&s->pb, 1, 1);
1003 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1004 put_bits(&s->pb, 1, sign);
1005 }
1006 } else {
1007 put_bits(&s->pb, 1, sign);
1008 }
1009 last_non_zero = i;
1010 }
1011 }
1012}
1013
1014/****************************************/
1015/* decoding stuff */
1016
1017static VLC mb_non_intra_vlc;
1018static VLC mb_intra_vlc;
1019static VLC dc_lum_vlc[2];
1020static VLC dc_chroma_vlc[2];
Michael Niedermayer84afee32002-04-05 04:09:041021static VLC v2_dc_lum_vlc;
1022static VLC v2_dc_chroma_vlc;
1023static VLC cbpy_vlc;
1024static VLC v2_intra_cbpc_vlc;
1025static VLC v2_mb_type_vlc;
1026static VLC v2_mv_vlc;
Michael Niedermayer287229e2002-06-02 12:22:301027static VLC v1_intra_cbpc_vlc;
1028static VLC v1_inter_cbpc_vlc;
Michael Niedermayerde0f2f42002-07-07 08:34:461029static VLC inter_intra_vlc;
Michael Niedermayer84afee32002-04-05 04:09:041030
1031/* this table is practically identical to the one from h263 except that its inverted */
Falk Hüffner20695ec2002-06-03 11:16:111032static void init_h263_dc_for_msmpeg4(void)
Michael Niedermayer84afee32002-04-05 04:09:041033{
Michael Niedermayer84afee32002-04-05 04:09:041034 int level, uni_code, uni_len;
Michael Niedermayer84afee32002-04-05 04:09:041035
Michael Niedermayer2ed627e2002-04-05 16:51:121036 for(level=-256; level<256; level++){
Michael Niedermayer84afee32002-04-05 04:09:041037 int size, v, l;
1038 /* find number of bits */
1039 size = 0;
1040 v = abs(level);
1041 while (v) {
1042 v >>= 1;
1043 size++;
1044 }
1045
1046 if (level < 0)
1047 l= (-level) ^ ((1 << size) - 1);
1048 else
1049 l= level;
1050
1051 /* luminance h263 */
1052 uni_code= DCtab_lum[size][0];
1053 uni_len = DCtab_lum[size][1];
1054 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
1055
1056 if (size > 0) {
1057 uni_code<<=size; uni_code|=l;
1058 uni_len+=size;
1059 if (size > 8){
1060 uni_code<<=1; uni_code|=1;
1061 uni_len++;
1062 }
1063 }
1064 v2_dc_lum_table[level+256][0]= uni_code;
1065 v2_dc_lum_table[level+256][1]= uni_len;
1066
1067 /* chrominance h263 */
1068 uni_code= DCtab_chrom[size][0];
1069 uni_len = DCtab_chrom[size][1];
1070 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
1071
1072 if (size > 0) {
1073 uni_code<<=size; uni_code|=l;
1074 uni_len+=size;
1075 if (size > 8){
1076 uni_code<<=1; uni_code|=1;
1077 uni_len++;
1078 }
1079 }
1080 v2_dc_chroma_table[level+256][0]= uni_code;
1081 v2_dc_chroma_table[level+256][1]= uni_len;
1082
1083 }
Michael Niedermayer84afee32002-04-05 04:09:041084}
Fabrice Bellardde6d9b62001-07-22 14:18:561085
1086/* init all vlc decoding tables */
Michael Niedermayerf5957f32002-06-18 00:49:001087int ff_msmpeg4_decode_init(MpegEncContext *s)
Fabrice Bellardde6d9b62001-07-22 14:18:561088{
Fabrice Bellardd81c5982002-06-06 14:31:181089 static int done = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:561090 int i;
1091 MVTable *mv;
1092
Michael Niedermayerf5957f32002-06-18 00:49:001093 common_init(s);
Fabrice Bellardde6d9b62001-07-22 14:18:561094
Fabrice Bellardd81c5982002-06-06 14:31:181095 if (!done) {
1096 done = 1;
Fabrice Bellardde6d9b62001-07-22 14:18:561097
Fabrice Bellardd81c5982002-06-06 14:31:181098 for(i=0;i<NB_RL_TABLES;i++) {
1099 init_rl(&rl_table[i]);
1100 init_vlc_rl(&rl_table[i]);
1101 }
1102 for(i=0;i<2;i++) {
1103 mv = &mv_tables[i];
Michael Niedermayer08dce7b2002-07-10 20:05:421104 init_vlc(&mv->vlc, MV_VLC_BITS, mv->n + 1,
Fabrice Bellardd81c5982002-06-06 14:31:181105 mv->table_mv_bits, 1, 1,
1106 mv->table_mv_code, 2, 2);
1107 }
1108
Michael Niedermayer08dce7b2002-07-10 20:05:421109 init_vlc(&dc_lum_vlc[0], DC_VLC_BITS, 120,
Fabrice Bellardd81c5982002-06-06 14:31:181110 &table0_dc_lum[0][1], 8, 4,
1111 &table0_dc_lum[0][0], 8, 4);
Michael Niedermayer08dce7b2002-07-10 20:05:421112 init_vlc(&dc_chroma_vlc[0], DC_VLC_BITS, 120,
Fabrice Bellardd81c5982002-06-06 14:31:181113 &table0_dc_chroma[0][1], 8, 4,
1114 &table0_dc_chroma[0][0], 8, 4);
Michael Niedermayer08dce7b2002-07-10 20:05:421115 init_vlc(&dc_lum_vlc[1], DC_VLC_BITS, 120,
Fabrice Bellardd81c5982002-06-06 14:31:181116 &table1_dc_lum[0][1], 8, 4,
1117 &table1_dc_lum[0][0], 8, 4);
Michael Niedermayer08dce7b2002-07-10 20:05:421118 init_vlc(&dc_chroma_vlc[1], DC_VLC_BITS, 120,
Fabrice Bellardd81c5982002-06-06 14:31:181119 &table1_dc_chroma[0][1], 8, 4,
1120 &table1_dc_chroma[0][0], 8, 4);
1121
Michael Niedermayer08dce7b2002-07-10 20:05:421122 init_vlc(&v2_dc_lum_vlc, DC_VLC_BITS, 512,
Fabrice Bellardd81c5982002-06-06 14:31:181123 &v2_dc_lum_table[0][1], 8, 4,
1124 &v2_dc_lum_table[0][0], 8, 4);
Michael Niedermayer08dce7b2002-07-10 20:05:421125 init_vlc(&v2_dc_chroma_vlc, DC_VLC_BITS, 512,
Fabrice Bellardd81c5982002-06-06 14:31:181126 &v2_dc_chroma_table[0][1], 8, 4,
1127 &v2_dc_chroma_table[0][0], 8, 4);
1128
Michael Niedermayer08dce7b2002-07-10 20:05:421129 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
Fabrice Bellardd81c5982002-06-06 14:31:181130 &cbpy_tab[0][1], 2, 1,
1131 &cbpy_tab[0][0], 2, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421132 init_vlc(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4,
Fabrice Bellardd81c5982002-06-06 14:31:181133 &v2_intra_cbpc[0][1], 2, 1,
1134 &v2_intra_cbpc[0][0], 2, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421135 init_vlc(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8,
Fabrice Bellardd81c5982002-06-06 14:31:181136 &v2_mb_type[0][1], 2, 1,
1137 &v2_mb_type[0][0], 2, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421138 init_vlc(&v2_mv_vlc, V2_MV_VLC_BITS, 33,
Fabrice Bellardd81c5982002-06-06 14:31:181139 &mvtab[0][1], 2, 1,
1140 &mvtab[0][0], 2, 1);
1141
Michael Niedermayer08dce7b2002-07-10 20:05:421142 init_vlc(&mb_non_intra_vlc, MB_NON_INTRA_VLC_BITS, 128,
Fabrice Bellardd81c5982002-06-06 14:31:181143 &table_mb_non_intra[0][1], 8, 4,
1144 &table_mb_non_intra[0][0], 8, 4);
Michael Niedermayer08dce7b2002-07-10 20:05:421145 init_vlc(&mb_intra_vlc, MB_INTRA_VLC_BITS, 64,
Fabrice Bellardd81c5982002-06-06 14:31:181146 &table_mb_intra[0][1], 4, 2,
1147 &table_mb_intra[0][0], 4, 2);
Michael Niedermayer287229e2002-06-02 12:22:301148
Michael Niedermayer08dce7b2002-07-10 20:05:421149 init_vlc(&v1_intra_cbpc_vlc, V1_INTRA_CBPC_VLC_BITS, 8,
Fabrice Bellardd81c5982002-06-06 14:31:181150 intra_MCBPC_bits, 1, 1,
1151 intra_MCBPC_code, 1, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421152 init_vlc(&v1_inter_cbpc_vlc, V1_INTER_CBPC_VLC_BITS, 25,
Fabrice Bellardd81c5982002-06-06 14:31:181153 inter_MCBPC_bits, 1, 1,
1154 inter_MCBPC_code, 1, 1);
Michael Niedermayerde0f2f42002-07-07 08:34:461155
Michael Niedermayer08dce7b2002-07-10 20:05:421156 init_vlc(&inter_intra_vlc, INTER_INTRA_VLC_BITS, 4,
Michael Niedermayerde0f2f42002-07-07 08:34:461157 &table_inter_intra[0][1], 2, 1,
1158 &table_inter_intra[0][0], 2, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181159 }
Fabrice Bellardde6d9b62001-07-22 14:18:561160 return 0;
1161}
1162
1163static int decode012(GetBitContext *gb)
1164{
1165 int n;
Arpi612476e2001-08-04 00:46:501166 n = get_bits1(gb);
Fabrice Bellardde6d9b62001-07-22 14:18:561167 if (n == 0)
1168 return 0;
1169 else
Arpi612476e2001-08-04 00:46:501170 return get_bits1(gb) + 1;
Fabrice Bellardde6d9b62001-07-22 14:18:561171}
1172
Michael Niedermayer7f89b6f2002-03-29 02:07:251173int msmpeg4_decode_picture_header(MpegEncContext * s)
1174{
Michael Niedermayerf5957f32002-06-18 00:49:001175 int code;
Michael Niedermayer84afee32002-04-05 04:09:041176
Michael Niedermayere1a9dbf2002-04-06 22:29:371177#if 0
1178{
1179int i;
1180for(i=0; i<s->gb.size*8; i++)
1181 printf("%d", get_bits1(&s->gb));
1182// get_bits1(&s->gb);
1183printf("END\n");
1184return -1;
1185}
1186#endif
Michael Niedermayer287229e2002-06-02 12:22:301187
1188 if(s->msmpeg4_version==1){
1189 int start_code, num;
1190 start_code = (get_bits(&s->gb, 16)<<16) | get_bits(&s->gb, 16);
1191 if(start_code!=0x00000100){
1192 fprintf(stderr, "invalid startcode\n");
1193 return -1;
1194 }
1195
1196 num= get_bits(&s->gb, 5); // frame number */
1197 }
1198
Michael Niedermayer7f89b6f2002-03-29 02:07:251199 s->pict_type = get_bits(&s->gb, 2) + 1;
1200 if (s->pict_type != I_TYPE &&
Michael Niedermayer287229e2002-06-02 12:22:301201 s->pict_type != P_TYPE){
1202 fprintf(stderr, "invalid picture type\n");
Michael Niedermayer7f89b6f2002-03-29 02:07:251203 return -1;
Michael Niedermayer287229e2002-06-02 12:22:301204 }
Michael Niedermayerde0f2f42002-07-07 08:34:461205#if 0
1206{
1207 static int had_i=0;
1208 if(s->pict_type == I_TYPE) had_i=1;
1209 if(!had_i) return -1;
1210}
1211#endif
Michael Niedermayer7f89b6f2002-03-29 02:07:251212 s->qscale = get_bits(&s->gb, 5);
1213
1214 if (s->pict_type == I_TYPE) {
1215 code = get_bits(&s->gb, 5);
Michael Niedermayer287229e2002-06-02 12:22:301216 if(s->msmpeg4_version==1){
1217 if(code==0 || code>s->mb_height){
1218 fprintf(stderr, "invalid slice height %d\n", code);
1219 return -1;
1220 }
1221
1222 s->slice_height = code;
1223 }else{
1224 /* 0x17: one slice, 0x18: two slices, ... */
Michael Niedermayerde0f2f42002-07-07 08:34:461225 if (code < 0x17){
1226 fprintf(stderr, "error, slice code was %X\n", code);
Michael Niedermayer287229e2002-06-02 12:22:301227 return -1;
Michael Niedermayerde0f2f42002-07-07 08:34:461228 }
Michael Niedermayer287229e2002-06-02 12:22:301229
1230 s->slice_height = s->mb_height / (code - 0x16);
1231 }
Michael Niedermayere1a9dbf2002-04-06 22:29:371232
1233 switch(s->msmpeg4_version){
Michael Niedermayer287229e2002-06-02 12:22:301234 case 1:
Michael Niedermayere1a9dbf2002-04-06 22:29:371235 case 2:
Michael Niedermayer84afee32002-04-05 04:09:041236 s->rl_chroma_table_index = 2;
1237 s->rl_table_index = 2;
Fabrice Bellardde6d9b62001-07-22 14:18:561238
Michael Niedermayer84afee32002-04-05 04:09:041239 s->dc_table_index = 0; //not used
Michael Niedermayere1a9dbf2002-04-06 22:29:371240 break;
1241 case 3:
Michael Niedermayer84afee32002-04-05 04:09:041242 s->rl_chroma_table_index = decode012(&s->gb);
1243 s->rl_table_index = decode012(&s->gb);
1244
1245 s->dc_table_index = get_bits1(&s->gb);
Michael Niedermayere1a9dbf2002-04-06 22:29:371246 break;
1247 case 4:
Michael Niedermayerf5957f32002-06-18 00:49:001248 msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8);
Michael Niedermayere1a9dbf2002-04-06 22:29:371249
Michael Niedermayerde0f2f42002-07-07 08:34:461250 if(s->bit_rate > 50) s->per_mb_rl_table= get_bits1(&s->gb);
1251 else s->per_mb_rl_table= 0;
1252
Michael Niedermayerf5957f32002-06-18 00:49:001253 if(!s->per_mb_rl_table){
1254 s->rl_chroma_table_index = decode012(&s->gb);
1255 s->rl_table_index = decode012(&s->gb);
1256 }
1257
1258 s->dc_table_index = get_bits1(&s->gb);
Michael Niedermayerde0f2f42002-07-07 08:34:461259 s->inter_intra_pred= 0;
Michael Niedermayere1a9dbf2002-04-06 22:29:371260 break;
Michael Niedermayer84afee32002-04-05 04:09:041261 }
Fabrice Bellardde6d9b62001-07-22 14:18:561262 s->no_rounding = 1;
Michael Niedermayerde0f2f42002-07-07 08:34:461263/* printf("qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d \n",
Michael Niedermayerbadaf882002-01-13 04:59:371264 s->qscale,
1265 s->rl_chroma_table_index,
1266 s->rl_table_index,
Michael Niedermayerf5957f32002-06-18 00:49:001267 s->dc_table_index,
Michael Niedermayerde0f2f42002-07-07 08:34:461268 s->per_mb_rl_table,
1269 s->slice_height);*/
Fabrice Bellardde6d9b62001-07-22 14:18:561270 } else {
Michael Niedermayer287229e2002-06-02 12:22:301271 switch(s->msmpeg4_version){
1272 case 1:
1273 case 2:
1274 if(s->msmpeg4_version==1)
1275 s->use_skip_mb_code = 1;
1276 else
1277 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayer84afee32002-04-05 04:09:041278 s->rl_table_index = 2;
1279 s->rl_chroma_table_index = s->rl_table_index;
Michael Niedermayer84afee32002-04-05 04:09:041280 s->dc_table_index = 0; //not used
Michael Niedermayer84afee32002-04-05 04:09:041281 s->mv_table_index = 0;
Michael Niedermayer287229e2002-06-02 12:22:301282 break;
1283 case 3:
1284 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayer84afee32002-04-05 04:09:041285 s->rl_table_index = decode012(&s->gb);
1286 s->rl_chroma_table_index = s->rl_table_index;
1287
1288 s->dc_table_index = get_bits1(&s->gb);
1289
1290 s->mv_table_index = get_bits1(&s->gb);
Michael Niedermayer287229e2002-06-02 12:22:301291 break;
Michael Niedermayerf5957f32002-06-18 00:49:001292 case 4:
1293 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayerde0f2f42002-07-07 08:34:461294
1295 if(s->bit_rate > 50) s->per_mb_rl_table= get_bits1(&s->gb);
1296 else s->per_mb_rl_table= 0;
1297
Michael Niedermayerf5957f32002-06-18 00:49:001298 if(!s->per_mb_rl_table){
1299 s->rl_table_index = decode012(&s->gb);
1300 s->rl_chroma_table_index = s->rl_table_index;
1301 }
1302
1303 s->dc_table_index = get_bits1(&s->gb);
1304
1305 s->mv_table_index = get_bits1(&s->gb);
Michael Niedermayerde0f2f42002-07-07 08:34:461306 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=128);
Michael Niedermayerf5957f32002-06-18 00:49:001307 break;
Michael Niedermayer84afee32002-04-05 04:09:041308 }
Michael Niedermayerde0f2f42002-07-07 08:34:461309/* printf("skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n",
Michael Niedermayerbadaf882002-01-13 04:59:371310 s->use_skip_mb_code,
1311 s->rl_table_index,
1312 s->rl_chroma_table_index,
1313 s->dc_table_index,
Michael Niedermayerf5957f32002-06-18 00:49:001314 s->mv_table_index,
Michael Niedermayerde0f2f42002-07-07 08:34:461315 s->per_mb_rl_table,
1316 s->qscale);*/
Michael Niedermayerae404842002-01-15 22:22:411317 if(s->flipflop_rounding){
1318 s->no_rounding ^= 1;
1319 }else{
1320 s->no_rounding = 0;
1321 }
Fabrice Bellardde6d9b62001-07-22 14:18:561322 }
Michael Niedermayerf5957f32002-06-18 00:49:001323
1324 s->esc3_level_length= 0;
1325 s->esc3_run_length= 0;
Michael Niedermayer84afee32002-04-05 04:09:041326
Fabrice Bellardde6d9b62001-07-22 14:18:561327#ifdef DEBUG
1328 printf("*****frame %d:\n", frame_count++);
1329#endif
1330 return 0;
1331}
1332
Michael Niedermayerae404842002-01-15 22:22:411333int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
1334{
Michael Niedermayer287229e2002-06-02 12:22:301335 int left= buf_size*8 - get_bits_count(&s->gb);
1336 int length= s->msmpeg4_version>=3 ? 17 : 16;
Michael Niedermayerae404842002-01-15 22:22:411337 /* the alt_bitstream reader could read over the end so we need to check it */
Michael Niedermayer287229e2002-06-02 12:22:301338 if(left>=length && left<length+8)
Michael Niedermayerae404842002-01-15 22:22:411339 {
Michael Niedermayer2b9ab1d2002-02-22 19:19:011340 int fps;
1341
1342 fps= get_bits(&s->gb, 5);
Michael Niedermayer287229e2002-06-02 12:22:301343 s->bit_rate= get_bits(&s->gb, 11);
1344 if(s->msmpeg4_version>=3)
1345 s->flipflop_rounding= get_bits1(&s->gb);
1346 else
1347 s->flipflop_rounding= 0;
Michael Niedermayer2b9ab1d2002-02-22 19:19:011348
Michael Niedermayer287229e2002-06-02 12:22:301349// printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate, s->flipflop_rounding);
1350 }
1351 else if(left<length+8)
1352 {
1353 s->flipflop_rounding= 0;
1354 printf("ext header missing, %d left\n", left);
Michael Niedermayerae404842002-01-15 22:22:411355 }
1356 else
1357 {
Michael Niedermayer287229e2002-06-02 12:22:301358 fprintf(stderr, "I frame too long, ignoring ext header\n");
Michael Niedermayerae404842002-01-15 22:22:411359 }
Michael Niedermayer2b9ab1d2002-02-22 19:19:011360
Michael Niedermayerae404842002-01-15 22:22:411361 return 0;
1362}
1363
Zdenek Kabelaccd4af682002-05-27 16:42:141364static inline void msmpeg4_memsetw(short *tab, int val, int n)
Fabrice Bellardde6d9b62001-07-22 14:18:561365{
1366 int i;
1367 for(i=0;i<n;i++)
1368 tab[i] = val;
1369}
1370
Michael Niedermayer3825cd12002-04-05 21:04:091371static void msmpeg4v2_encode_motion(MpegEncContext * s, int val)
1372{
1373 int range, bit_size, sign, code, bits;
1374
1375 if (val == 0) {
1376 /* zero vector */
1377 code = 0;
1378 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1379 } else {
1380 bit_size = s->f_code - 1;
1381 range = 1 << bit_size;
1382 if (val <= -64)
1383 val += 64;
1384 else if (val >= 64)
1385 val -= 64;
1386
1387 if (val >= 0) {
1388 sign = 0;
1389 } else {
1390 val = -val;
1391 sign = 1;
1392 }
1393 val--;
1394 code = (val >> bit_size) + 1;
1395 bits = val & (range - 1);
1396
1397 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1398 if (bit_size > 0) {
1399 put_bits(&s->pb, bit_size, bits);
1400 }
1401 }
1402}
1403
Michael Niedermayer84afee32002-04-05 04:09:041404/* this is identical to h263 except that its range is multiplied by 2 */
1405static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
1406{
1407 int code, val, sign, shift;
1408
Michael Niedermayer08dce7b2002-07-10 20:05:421409 code = get_vlc2(&s->gb, v2_mv_vlc.table, V2_MV_VLC_BITS, 2);
Michael Niedermayer287229e2002-06-02 12:22:301410// printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
Michael Niedermayer84afee32002-04-05 04:09:041411 if (code < 0)
1412 return 0xffff;
1413
1414 if (code == 0)
1415 return pred;
1416 sign = get_bits1(&s->gb);
1417 shift = f_code - 1;
1418 val = (code - 1) << shift;
1419 if (shift > 0)
1420 val |= get_bits(&s->gb, shift);
1421 val++;
1422 if (sign)
1423 val = -val;
Michael Niedermayer84afee32002-04-05 04:09:041424
Michael Niedermayer287229e2002-06-02 12:22:301425 val += pred;
Michael Niedermayer84afee32002-04-05 04:09:041426 if (val <= -64)
1427 val += 64;
1428 else if (val >= 64)
1429 val -= 64;
1430
1431 return val;
1432}
1433
1434
Michael Niedermayer287229e2002-06-02 12:22:301435static int msmpeg4v12_decode_mb(MpegEncContext *s,
Michael Niedermayer84afee32002-04-05 04:09:041436 DCTELEM block[6][64])
1437{
1438 int cbp, code, i;
Michael Niedermayer84afee32002-04-05 04:09:041439 if (s->pict_type == P_TYPE) {
1440 if (s->use_skip_mb_code) {
1441 if (get_bits1(&s->gb)) {
1442 /* skip mb */
1443 s->mb_intra = 0;
1444 for(i=0;i<6;i++)
1445 s->block_last_index[i] = -1;
1446 s->mv_dir = MV_DIR_FORWARD;
1447 s->mv_type = MV_TYPE_16X16;
1448 s->mv[0][0][0] = 0;
1449 s->mv[0][0][1] = 0;
1450 s->mb_skiped = 1;
1451 return 0;
1452 }
1453 }
1454
Michael Niedermayer287229e2002-06-02 12:22:301455 if(s->msmpeg4_version==2)
Michael Niedermayer08dce7b2002-07-10 20:05:421456 code = get_vlc2(&s->gb, v2_mb_type_vlc.table, V2_MB_TYPE_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301457 else
Michael Niedermayer08dce7b2002-07-10 20:05:421458 code = get_vlc2(&s->gb, v1_inter_cbpc_vlc.table, V1_INTER_CBPC_VLC_BITS, 3);
Michael Niedermayer287229e2002-06-02 12:22:301459 if(code<0 || code>7){
1460 fprintf(stderr, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y);
1461 return -1;
1462 }
1463
Michael Niedermayer84afee32002-04-05 04:09:041464 s->mb_intra = code >>2;
1465
1466 cbp = code & 0x3;
1467 } else {
1468 s->mb_intra = 1;
Michael Niedermayer287229e2002-06-02 12:22:301469 if(s->msmpeg4_version==2)
Michael Niedermayer08dce7b2002-07-10 20:05:421470 cbp= get_vlc2(&s->gb, v2_intra_cbpc_vlc.table, V2_INTRA_CBPC_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301471 else
Michael Niedermayer08dce7b2002-07-10 20:05:421472 cbp= get_vlc2(&s->gb, v1_intra_cbpc_vlc.table, V1_INTRA_CBPC_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301473 if(cbp<0 || cbp>3){
1474 fprintf(stderr, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
1475 return -1;
1476 }
Michael Niedermayer84afee32002-04-05 04:09:041477 }
1478
1479 if (!s->mb_intra) {
Michael Niedermayer287229e2002-06-02 12:22:301480 int mx, my, cbpy;
1481
Michael Niedermayer08dce7b2002-07-10 20:05:421482 cbpy= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301483 if(cbpy<0){
1484 fprintf(stderr, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
1485 return -1;
1486 }
Michael Niedermayer84afee32002-04-05 04:09:041487
Michael Niedermayer287229e2002-06-02 12:22:301488 cbp|= cbpy<<2;
1489 if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C;
Michael Niedermayer84afee32002-04-05 04:09:041490
1491 h263_pred_motion(s, 0, &mx, &my);
1492 mx= msmpeg4v2_decode_motion(s, mx, 1);
1493 my= msmpeg4v2_decode_motion(s, my, 1);
1494
1495 s->mv_dir = MV_DIR_FORWARD;
1496 s->mv_type = MV_TYPE_16X16;
1497 s->mv[0][0][0] = mx;
1498 s->mv[0][0][1] = my;
1499 } else {
Michael Niedermayer287229e2002-06-02 12:22:301500 if(s->msmpeg4_version==2){
1501 s->ac_pred = get_bits1(&s->gb);
Michael Niedermayer08dce7b2002-07-10 20:05:421502 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
Michael Niedermayer287229e2002-06-02 12:22:301503 } else{
1504 s->ac_pred = 0;
Michael Niedermayer08dce7b2002-07-10 20:05:421505 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
Michael Niedermayer287229e2002-06-02 12:22:301506 if(s->pict_type==P_TYPE) cbp^=0x3C;
1507 }
Michael Niedermayer84afee32002-04-05 04:09:041508 }
1509
1510 for (i = 0; i < 6; i++) {
1511 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
1512 {
Michael Niedermayer287229e2002-06-02 12:22:301513 fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
Michael Niedermayer84afee32002-04-05 04:09:041514 return -1;
1515 }
1516 }
1517 return 0;
1518}
1519
Fabrice Bellardde6d9b62001-07-22 14:18:561520int msmpeg4_decode_mb(MpegEncContext *s,
1521 DCTELEM block[6][64])
1522{
1523 int cbp, code, i;
Fabrice Bellardde6d9b62001-07-22 14:18:561524 UINT8 *coded_val;
1525
Michael Niedermayerbd5e1c72002-06-22 15:52:251526#ifdef PRINT_MB
1527if(s->mb_x==0){
1528 printf("\n");
1529 if(s->mb_y==0) printf("\n");
1530}
1531#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561532 /* special slice handling */
Michael Niedermayerde0f2f42002-07-07 08:34:461533 handle_slices(s);
Fabrice Bellardde6d9b62001-07-22 14:18:561534
Michael Niedermayer287229e2002-06-02 12:22:301535 if(s->msmpeg4_version<=2) return msmpeg4v12_decode_mb(s, block); //FIXME export function & call from outside perhaps
Michael Niedermayer84afee32002-04-05 04:09:041536
Fabrice Bellardde6d9b62001-07-22 14:18:561537 if (s->pict_type == P_TYPE) {
1538 set_stat(ST_INTER_MB);
1539 if (s->use_skip_mb_code) {
Arpi612476e2001-08-04 00:46:501540 if (get_bits1(&s->gb)) {
Fabrice Bellardde6d9b62001-07-22 14:18:561541 /* skip mb */
1542 s->mb_intra = 0;
1543 for(i=0;i<6;i++)
1544 s->block_last_index[i] = -1;
1545 s->mv_dir = MV_DIR_FORWARD;
1546 s->mv_type = MV_TYPE_16X16;
1547 s->mv[0][0][0] = 0;
1548 s->mv[0][0][1] = 0;
Fabrice Bellard3bb4e232001-07-24 20:43:411549 s->mb_skiped = 1;
Michael Niedermayerbd5e1c72002-06-22 15:52:251550#ifdef PRINT_MB
1551printf("S ");
1552#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561553 return 0;
1554 }
1555 }
1556
Michael Niedermayer08dce7b2002-07-10 20:05:421557 code = get_vlc2(&s->gb, mb_non_intra_vlc.table, MB_NON_INTRA_VLC_BITS, 3);
Fabrice Bellardde6d9b62001-07-22 14:18:561558 if (code < 0)
1559 return -1;
Zdenek Kabelac38d171e2002-02-18 09:34:541560 //s->mb_intra = (code & 0x40) ? 0 : 1;
1561 s->mb_intra = (~code & 0x40) >> 6;
Fabrice Bellardde6d9b62001-07-22 14:18:561562
1563 cbp = code & 0x3f;
1564 } else {
1565 set_stat(ST_INTRA_MB);
1566 s->mb_intra = 1;
Michael Niedermayer08dce7b2002-07-10 20:05:421567 code = get_vlc2(&s->gb, mb_intra_vlc.table, MB_INTRA_VLC_BITS, 2);
Fabrice Bellardde6d9b62001-07-22 14:18:561568 if (code < 0)
1569 return -1;
1570 /* predict coded block pattern */
1571 cbp = 0;
1572 for(i=0;i<6;i++) {
Zdenek Kabelac38d171e2002-02-18 09:34:541573 int val = ((code >> (5 - i)) & 1);
Fabrice Bellardde6d9b62001-07-22 14:18:561574 if (i < 4) {
Zdenek Kabelac38d171e2002-02-18 09:34:541575 int pred = coded_block_pred(s, i, &coded_val);
Fabrice Bellardde6d9b62001-07-22 14:18:561576 val = val ^ pred;
1577 *coded_val = val;
1578 }
1579 cbp |= val << (5 - i);
1580 }
1581 }
1582
1583 if (!s->mb_intra) {
1584 int mx, my;
Michael Niedermayerf5957f32002-06-18 00:49:001585//printf("P at %d %d\n", s->mb_x, s->mb_y);
1586 if(s->per_mb_rl_table && cbp){
1587 s->rl_table_index = decode012(&s->gb);
1588 s->rl_chroma_table_index = s->rl_table_index;
1589 }
Fabrice Bellardde6d9b62001-07-22 14:18:561590 set_stat(ST_MV);
1591 h263_pred_motion(s, 0, &mx, &my);
1592 if (msmpeg4_decode_motion(s, &mx, &my) < 0)
1593 return -1;
1594 s->mv_dir = MV_DIR_FORWARD;
1595 s->mv_type = MV_TYPE_16X16;
1596 s->mv[0][0][0] = mx;
1597 s->mv[0][0][1] = my;
Michael Niedermayerbd5e1c72002-06-22 15:52:251598#ifdef PRINT_MB
1599printf("P ");
1600#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561601 } else {
Michael Niedermayerf5957f32002-06-18 00:49:001602//printf("I at %d %d %d %06X\n", s->mb_x, s->mb_y, ((cbp&3)? 1 : 0) +((cbp&0x3C)? 2 : 0), show_bits(&s->gb, 24));
Fabrice Bellardde6d9b62001-07-22 14:18:561603 set_stat(ST_INTRA_MB);
Arpi612476e2001-08-04 00:46:501604 s->ac_pred = get_bits1(&s->gb);
Michael Niedermayerbd5e1c72002-06-22 15:52:251605#ifdef PRINT_MB
1606printf("%c", s->ac_pred ? 'A' : 'I');
1607#endif
Michael Niedermayerde0f2f42002-07-07 08:34:461608 if(s->inter_intra_pred){
Michael Niedermayer08dce7b2002-07-10 20:05:421609 s->h263_aic_dir= get_vlc2(&s->gb, inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1);
Michael Niedermayerde0f2f42002-07-07 08:34:461610// printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
1611 }
Michael Niedermayerf5957f32002-06-18 00:49:001612 if(s->per_mb_rl_table && cbp){
1613 s->rl_table_index = decode012(&s->gb);
1614 s->rl_chroma_table_index = s->rl_table_index;
1615 }
Fabrice Bellardde6d9b62001-07-22 14:18:561616 }
1617
1618 for (i = 0; i < 6; i++) {
1619 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
Zdenek Kabelac38d171e2002-02-18 09:34:541620 {
Michael Niedermayer287229e2002-06-02 12:22:301621 fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
1622 return -1;
Zdenek Kabelac38d171e2002-02-18 09:34:541623 }
Fabrice Bellardde6d9b62001-07-22 14:18:561624 }
Michael Niedermayerbd5e1c72002-06-22 15:52:251625
Fabrice Bellardde6d9b62001-07-22 14:18:561626 return 0;
1627}
1628
Michael Niedermayerf5957f32002-06-18 00:49:001629static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
Fabrice Bellardde6d9b62001-07-22 14:18:561630 int n, int coded)
1631{
1632 int code, level, i, j, last, run, run_diff;
1633 int dc_pred_dir;
1634 RLTable *rl;
1635 const UINT8 *scan_table;
Michael Niedermayerbadaf882002-01-13 04:59:371636 int qmul, qadd;
Fabrice Bellardde6d9b62001-07-22 14:18:561637
1638 if (s->mb_intra) {
Michael Niedermayerbadaf882002-01-13 04:59:371639 qmul=1;
1640 qadd=0;
1641
Fabrice Bellardde6d9b62001-07-22 14:18:561642 /* DC coef */
1643 set_stat(ST_DC);
1644 level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
Michael Niedermayerbd5e1c72002-06-22 15:52:251645#ifdef PRINT_MB
1646{
1647 static int c;
1648 if(n==0) c=0;
1649 if(n==4) printf("%X", c);
1650 c+= c +dc_pred_dir;
1651}
1652#endif
Michael Niedermayer287229e2002-06-02 12:22:301653 if (level < 0){
Michael Niedermayerbd5e1c72002-06-22 15:52:251654 fprintf(stderr, "dc overflow- block: %d qscale: %d//\n", n, s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461655 if(s->inter_intra_pred) level=0;
1656 else return -1;
Michael Niedermayer287229e2002-06-02 12:22:301657 }
Fabrice Bellardde6d9b62001-07-22 14:18:561658 if (n < 4) {
1659 rl = &rl_table[s->rl_table_index];
Michael Niedermayer287229e2002-06-02 12:22:301660 if(level > 256*s->y_dc_scale){
Michael Niedermayerbd5e1c72002-06-22 15:52:251661 fprintf(stderr, "dc overflow+ L qscale: %d//\n", s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461662 if(!s->inter_intra_pred) return -1;
Michael Niedermayer287229e2002-06-02 12:22:301663 }
Fabrice Bellardde6d9b62001-07-22 14:18:561664 } else {
1665 rl = &rl_table[3 + s->rl_chroma_table_index];
Michael Niedermayer287229e2002-06-02 12:22:301666 if(level > 256*s->c_dc_scale){
Michael Niedermayerbd5e1c72002-06-22 15:52:251667 fprintf(stderr, "dc overflow+ C qscale: %d//\n", s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461668 if(!s->inter_intra_pred) return -1;
Michael Niedermayer287229e2002-06-02 12:22:301669 }
Fabrice Bellardde6d9b62001-07-22 14:18:561670 }
Michael Niedermayer287229e2002-06-02 12:22:301671 block[0] = level;
Michael Niedermayerbadaf882002-01-13 04:59:371672
Fabrice Bellardde6d9b62001-07-22 14:18:561673 run_diff = 0;
1674 i = 1;
1675 if (!coded) {
1676 goto not_coded;
1677 }
1678 if (s->ac_pred) {
1679 if (dc_pred_dir == 0)
Michael Niedermayerf5957f32002-06-18 00:49:001680 scan_table = s->intra_v_scantable; /* left */
Fabrice Bellardde6d9b62001-07-22 14:18:561681 else
Michael Niedermayerf5957f32002-06-18 00:49:001682 scan_table = s->intra_h_scantable; /* top */
Fabrice Bellardde6d9b62001-07-22 14:18:561683 } else {
Michael Niedermayerf5957f32002-06-18 00:49:001684 scan_table = s->intra_scantable;
Fabrice Bellardde6d9b62001-07-22 14:18:561685 }
1686 set_stat(ST_INTRA_AC);
1687 } else {
Michael Niedermayerbadaf882002-01-13 04:59:371688 qmul = s->qscale << 1;
1689 qadd = (s->qscale - 1) | 1;
Fabrice Bellardde6d9b62001-07-22 14:18:561690 i = 0;
1691 rl = &rl_table[3 + s->rl_table_index];
Michael Niedermayer84afee32002-04-05 04:09:041692
1693 if(s->msmpeg4_version==2)
1694 run_diff = 0;
1695 else
1696 run_diff = 1;
1697
Fabrice Bellardde6d9b62001-07-22 14:18:561698 if (!coded) {
1699 s->block_last_index[n] = i - 1;
1700 return 0;
1701 }
Michael Niedermayerf5957f32002-06-18 00:49:001702 scan_table = s->inter_scantable;
Fabrice Bellardde6d9b62001-07-22 14:18:561703 set_stat(ST_INTER_AC);
1704 }
1705
1706 for(;;) {
Michael Niedermayer08dce7b2002-07-10 20:05:421707 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
Michael Niedermayerf5957f32002-06-18 00:49:001708 if (code < 0){
1709 fprintf(stderr, "illegal AC-VLC code at %d %d\n", s->mb_x, s->mb_y);
Fabrice Bellardde6d9b62001-07-22 14:18:561710 return -1;
Michael Niedermayerf5957f32002-06-18 00:49:001711 }
Fabrice Bellardde6d9b62001-07-22 14:18:561712 if (code == rl->n) {
1713 /* escape */
Michael Niedermayer287229e2002-06-02 12:22:301714 if (s->msmpeg4_version==1 || get_bits1(&s->gb) == 0) {
1715 if (s->msmpeg4_version==1 || get_bits1(&s->gb) == 0) {
Fabrice Bellardde6d9b62001-07-22 14:18:561716 /* third escape */
Michael Niedermayerf5957f32002-06-18 00:49:001717 if(s->msmpeg4_version<=3){
1718 last= get_bits1(&s->gb);
1719 run= get_bits(&s->gb, 6);
1720 level= get_bits(&s->gb, 8);
1721 level= ((int8_t)level);
1722 }else{
1723 int sign;
1724 last= get_bits1(&s->gb);
1725 if(!s->esc3_level_length){
1726 int ll;
1727 //printf("ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
1728 if(s->qscale<8){
1729 ll= get_bits(&s->gb, 3);
1730 if(ll==0){
1731 if(get_bits1(&s->gb)) printf("cool a new vlc code ,contact the ffmpeg developers and upload the file\n");
1732 ll=8;
1733 }
1734 }else{
1735 ll=2;
1736 while(ll<8 && get_bits1(&s->gb)==0) ll++;
1737 }
1738
1739 s->esc3_level_length= ll;
1740 s->esc3_run_length= get_bits(&s->gb, 2) + 3;
1741//printf("level length:%d, run length: %d\n", ll, s->esc3_run_length);
1742 }
1743 run= get_bits(&s->gb, s->esc3_run_length);
1744 sign= get_bits1(&s->gb);
1745 level= get_bits(&s->gb, s->esc3_level_length);
1746 if(sign) level= -level;
1747 }
1748//printf("level: %d, run: %d at %d %d\n", level, run, s->mb_x, s->mb_y);
Michael Niedermayer287229e2002-06-02 12:22:301749#if 0 // waste of time / this will detect very few errors
1750 {
1751 const int abs_level= ABS(level);
1752 const int run1= run - rl->max_run[last][abs_level] - run_diff;
1753 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
1754 if(abs_level <= rl->max_level[last][run]){
1755 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
1756 return DECODING_AC_LOST;
1757 }
1758 if(abs_level <= rl->max_level[last][run]*2){
1759 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
1760 return DECODING_AC_LOST;
1761 }
Michael Niedermayerf5957f32002-06-18 00:49:001762 if(run1>=0 && abs_level <= rl->max_level[last][run1]){
Michael Niedermayer287229e2002-06-02 12:22:301763 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
1764 return DECODING_AC_LOST;
1765 }
1766 }
1767 }
1768#endif
Zdenek Kabelac38d171e2002-02-18 09:34:541769 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
1770 if (level>0) level= level * qmul + qadd;
Michael Niedermayer287229e2002-06-02 12:22:301771 else level= level * qmul - qadd;
1772#if 0 // waste of time too :(
1773 if(level>2048 || level<-2048){
1774 fprintf(stderr, "|level| overflow in 3. esc\n");
1775 return DECODING_AC_LOST;
1776 }
1777#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561778 } else {
1779 /* second escape */
Michael Niedermayer08dce7b2002-07-10 20:05:421780 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
Michael Niedermayerf5957f32002-06-18 00:49:001781 if (code < 0 || code >= rl->n){
1782 fprintf(stderr, "illegal ESC2-VLC code %d at %d %d\n", code, s->mb_x, s->mb_y);
Fabrice Bellardde6d9b62001-07-22 14:18:561783 return -1;
Michael Niedermayerf5957f32002-06-18 00:49:001784 }
Fabrice Bellardde6d9b62001-07-22 14:18:561785 run = rl->table_run[code];
Michael Niedermayer99180fe2002-01-13 06:12:351786 level = rl->table_level[code];
Fabrice Bellardde6d9b62001-07-22 14:18:561787 last = code >= rl->last;
1788 run += rl->max_run[last][level] + run_diff;
Michael Niedermayer99180fe2002-01-13 06:12:351789 level= level * qmul + qadd;
Arpi612476e2001-08-04 00:46:501790 if (get_bits1(&s->gb))
Fabrice Bellardde6d9b62001-07-22 14:18:561791 level = -level;
1792 }
1793 } else {
1794 /* first escape */
Michael Niedermayer08dce7b2002-07-10 20:05:421795 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
Michael Niedermayerf5957f32002-06-18 00:49:001796 if (code < 0 || code >= rl->n){
1797 fprintf(stderr, "illegal ESC2-VLC code %d at %d %d\n", code, s->mb_x, s->mb_y);
Fabrice Bellardde6d9b62001-07-22 14:18:561798 return -1;
Michael Niedermayerf5957f32002-06-18 00:49:001799 }
Fabrice Bellardde6d9b62001-07-22 14:18:561800 run = rl->table_run[code];
1801 level = rl->table_level[code];
1802 last = code >= rl->last;
1803 level += rl->max_level[last][run];
Michael Niedermayerbadaf882002-01-13 04:59:371804 level= level * qmul + qadd;
Arpi612476e2001-08-04 00:46:501805 if (get_bits1(&s->gb))
Fabrice Bellardde6d9b62001-07-22 14:18:561806 level = -level;
1807 }
1808 } else {
1809 run = rl->table_run[code];
Michael Niedermayerbadaf882002-01-13 04:59:371810 level = rl->table_level[code] * qmul + qadd;
Fabrice Bellardde6d9b62001-07-22 14:18:561811 last = code >= rl->last;
Arpi612476e2001-08-04 00:46:501812 if (get_bits1(&s->gb))
Fabrice Bellardde6d9b62001-07-22 14:18:561813 level = -level;
1814 }
1815 i += run;
Michael Niedermayerf5957f32002-06-18 00:49:001816 if (i >= 64){
1817 fprintf(stderr, "run too long at %d %d\n", s->mb_x, s->mb_y);
Fabrice Bellardde6d9b62001-07-22 14:18:561818 return -1;
Michael Niedermayerf5957f32002-06-18 00:49:001819 }
Michael Niedermayer287229e2002-06-02 12:22:301820
Fabrice Bellardde6d9b62001-07-22 14:18:561821 j = scan_table[i];
1822 block[j] = level;
1823 i++;
1824 if (last)
1825 break;
1826 }
1827 not_coded:
1828 if (s->mb_intra) {
1829 mpeg4_pred_ac(s, block, n, dc_pred_dir);
1830 if (s->ac_pred) {
1831 i = 64; /* XXX: not optimal */
1832 }
1833 }
Michael Niedermayerf5957f32002-06-18 00:49:001834 if(s->msmpeg4_version==4 && i>1) i=64; //FIXME/XXX optimize
Fabrice Bellardde6d9b62001-07-22 14:18:561835 s->block_last_index[n] = i - 1;
Michael Niedermayerf5957f32002-06-18 00:49:001836
Fabrice Bellardde6d9b62001-07-22 14:18:561837 return 0;
1838}
1839
1840static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
1841{
1842 int level, pred;
Fabrice Bellardde6d9b62001-07-22 14:18:561843
Michael Niedermayer287229e2002-06-02 12:22:301844 if(s->msmpeg4_version<=2){
Michael Niedermayer84afee32002-04-05 04:09:041845 if (n < 4) {
Michael Niedermayer08dce7b2002-07-10 20:05:421846 level = get_vlc2(&s->gb, v2_dc_lum_vlc.table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041847 } else {
Michael Niedermayer08dce7b2002-07-10 20:05:421848 level = get_vlc2(&s->gb, v2_dc_chroma_vlc.table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041849 }
Michael Niedermayer2ed627e2002-04-05 16:51:121850 if (level < 0)
Michael Niedermayer84afee32002-04-05 04:09:041851 return -1;
Michael Niedermayer84afee32002-04-05 04:09:041852 level-=256;
1853 }else{ //FIXME optimize use unified tables & index
1854 if (n < 4) {
Michael Niedermayer08dce7b2002-07-10 20:05:421855 level = get_vlc2(&s->gb, dc_lum_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041856 } else {
Michael Niedermayer08dce7b2002-07-10 20:05:421857 level = get_vlc2(&s->gb, dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041858 }
Michael Niedermayer287229e2002-06-02 12:22:301859 if (level < 0){
1860 fprintf(stderr, "illegal dc vlc\n");
Michael Niedermayer84afee32002-04-05 04:09:041861 return -1;
Michael Niedermayer287229e2002-06-02 12:22:301862 }
Michael Niedermayer84afee32002-04-05 04:09:041863
1864 if (level == DC_MAX) {
1865 level = get_bits(&s->gb, 8);
1866 if (get_bits1(&s->gb))
1867 level = -level;
1868 } else if (level != 0) {
1869 if (get_bits1(&s->gb))
1870 level = -level;
1871 }
Fabrice Bellardde6d9b62001-07-22 14:18:561872 }
1873
Michael Niedermayer287229e2002-06-02 12:22:301874 if(s->msmpeg4_version==1){
1875 INT32 *dc_val;
1876 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
1877 level += pred;
1878
1879 /* update predictor */
1880 *dc_val= level;
1881 }else{
Michael Niedermayerf5957f32002-06-18 00:49:001882 UINT16 *dc_val;
Michael Niedermayerbd5e1c72002-06-22 15:52:251883 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
Michael Niedermayer287229e2002-06-02 12:22:301884 level += pred;
Fabrice Bellardde6d9b62001-07-22 14:18:561885
Michael Niedermayer287229e2002-06-02 12:22:301886 /* update predictor */
1887 if (n < 4) {
1888 *dc_val = level * s->y_dc_scale;
1889 } else {
1890 *dc_val = level * s->c_dc_scale;
1891 }
Fabrice Bellardde6d9b62001-07-22 14:18:561892 }
1893
1894 return level;
1895}
1896
1897static int msmpeg4_decode_motion(MpegEncContext * s,
1898 int *mx_ptr, int *my_ptr)
1899{
1900 MVTable *mv;
1901 int code, mx, my;
1902
1903 mv = &mv_tables[s->mv_table_index];
1904
Michael Niedermayer08dce7b2002-07-10 20:05:421905 code = get_vlc2(&s->gb, mv->vlc.table, MV_VLC_BITS, 2);
Michael Niedermayerf5957f32002-06-18 00:49:001906 if (code < 0){
1907 fprintf(stderr, "illegal MV code at %d %d\n", s->mb_x, s->mb_y);
Fabrice Bellardde6d9b62001-07-22 14:18:561908 return -1;
Michael Niedermayerf5957f32002-06-18 00:49:001909 }
Fabrice Bellardde6d9b62001-07-22 14:18:561910 if (code == mv->n) {
Michael Niedermayerf5957f32002-06-18 00:49:001911//printf("MV ESC %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
Fabrice Bellardde6d9b62001-07-22 14:18:561912 mx = get_bits(&s->gb, 6);
1913 my = get_bits(&s->gb, 6);
1914 } else {
1915 mx = mv->table_mvx[code];
1916 my = mv->table_mvy[code];
1917 }
1918
1919 mx += *mx_ptr - 32;
1920 my += *my_ptr - 32;
1921 /* WARNING : they do not do exactly modulo encoding */
1922 if (mx <= -64)
1923 mx += 64;
1924 else if (mx >= 64)
1925 mx -= 64;
1926
1927 if (my <= -64)
1928 my += 64;
1929 else if (my >= 64)
1930 my -= 64;
1931 *mx_ptr = mx;
1932 *my_ptr = my;
1933 return 0;
1934}