00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00028 #include "avcodec.h"
00029 #include "dsputil.h"
00030 #include "mpegvideo.h"
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #define DC_VLC_BITS 9
00042 #define CBPY_VLC_BITS 6
00043 #define INTER_INTRA_VLC_BITS 3
00044 #define V1_INTRA_CBPC_VLC_BITS 6
00045 #define V1_INTER_CBPC_VLC_BITS 6
00046 #define V2_INTRA_CBPC_VLC_BITS 3
00047 #define V2_MB_TYPE_VLC_BITS 7
00048 #define MV_VLC_BITS 9
00049 #define V2_MV_VLC_BITS 9
00050 #define TEX_VLC_BITS 9
00051 #define MB_NON_INTRA_VLC_BITS 9
00052 #define MB_INTRA_VLC_BITS 9
00053
00054 #define II_BITRATE 128*1024
00055 #define MBAC_BITRATE 50*1024
00056
00057 #define DEFAULT_INTER_INDEX 3
00058
00059 static uint32_t v2_dc_lum_table[512][2];
00060 static uint32_t v2_dc_chroma_table[512][2];
00061
00062 static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n);
00063 static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
00064 int n, int coded, const uint8_t *scantable);
00065 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
00066 static int msmpeg4_decode_motion(MpegEncContext * s,
00067 int *mx_ptr, int *my_ptr);
00068 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val);
00069 static void init_h263_dc_for_msmpeg4(void);
00070 static inline void msmpeg4_memsetw(short *tab, int val, int n);
00071 #ifdef CONFIG_ENCODERS
00072 static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra);
00073 #endif //CONFIG_ENCODERS
00074 static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
00075 static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
00076 static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
00077
00078
00079 extern uint8_t wmv3_dc_scale_table[32];
00080
00081 #ifdef DEBUG
00082 int intra_count = 0;
00083 int frame_count = 0;
00084 #endif
00085
00086 #include "msmpeg4data.h"
00087
00088 #ifdef CONFIG_ENCODERS //strangely gcc includes this even if its not references
00089 static uint8_t rl_length[NB_RL_TABLES][MAX_LEVEL+1][MAX_RUN+1][2];
00090 #endif //CONFIG_ENCODERS
00091
00092 #ifdef STATS
00093
00094 const char *st_names[ST_NB] = {
00095 "unknown",
00096 "dc",
00097 "intra_ac",
00098 "inter_ac",
00099 "intra_mb",
00100 "inter_mb",
00101 "mv",
00102 };
00103
00104 int st_current_index = 0;
00105 unsigned int st_bit_counts[ST_NB];
00106 unsigned int st_out_bit_counts[ST_NB];
00107
00108 #define set_stat(var) st_current_index = var;
00109
00110 void print_stats(void)
00111 {
00112 unsigned int total;
00113 int i;
00114
00115 printf("Input:\n");
00116 total = 0;
00117 for(i=0;i<ST_NB;i++)
00118 total += st_bit_counts[i];
00119 if (total == 0)
00120 total = 1;
00121 for(i=0;i<ST_NB;i++) {
00122 printf("%-10s : %10.1f %5.1f%%\n",
00123 st_names[i],
00124 (double)st_bit_counts[i] / 8.0,
00125 (double)st_bit_counts[i] * 100.0 / total);
00126 }
00127 printf("%-10s : %10.1f %5.1f%%\n",
00128 "total",
00129 (double)total / 8.0,
00130 100.0);
00131
00132 printf("Output:\n");
00133 total = 0;
00134 for(i=0;i<ST_NB;i++)
00135 total += st_out_bit_counts[i];
00136 if (total == 0)
00137 total = 1;
00138 for(i=0;i<ST_NB;i++) {
00139 printf("%-10s : %10.1f %5.1f%%\n",
00140 st_names[i],
00141 (double)st_out_bit_counts[i] / 8.0,
00142 (double)st_out_bit_counts[i] * 100.0 / total);
00143 }
00144 printf("%-10s : %10.1f %5.1f%%\n",
00145 "total",
00146 (double)total / 8.0,
00147 100.0);
00148 }
00149
00150 #else
00151
00152 #define set_stat(var)
00153
00154 #endif
00155
00156 static void common_init(MpegEncContext * s)
00157 {
00158 static int inited=0;
00159
00160 switch(s->msmpeg4_version){
00161 case 1:
00162 case 2:
00163 s->y_dc_scale_table=
00164 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
00165 break;
00166 case 3:
00167 if(s->workaround_bugs){
00168 s->y_dc_scale_table= old_ff_y_dc_scale_table;
00169 s->c_dc_scale_table= old_ff_c_dc_scale_table;
00170 } else{
00171 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
00172 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
00173 }
00174 break;
00175 case 4:
00176 case 5:
00177 s->y_dc_scale_table= wmv1_y_dc_scale_table;
00178 s->c_dc_scale_table= wmv1_c_dc_scale_table;
00179 break;
00180 #if defined(CONFIG_WMV3_DECODER)||defined(CONFIG_VC9_DECODER)
00181 case 6:
00182 s->y_dc_scale_table= wmv3_dc_scale_table;
00183 s->c_dc_scale_table= wmv3_dc_scale_table;
00184 break;
00185 #endif
00186
00187 }
00188
00189
00190 if(s->msmpeg4_version>=4){
00191 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , wmv1_scantable[1]);
00192 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, wmv1_scantable[2]);
00193 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, wmv1_scantable[3]);
00194 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , wmv1_scantable[0]);
00195 }
00196
00197
00198 if(!inited){
00199 inited=1;
00200
00201 init_h263_dc_for_msmpeg4();
00202 }
00203 }
00204
00205 #ifdef CONFIG_ENCODERS
00206
00207
00208 static void init_mv_table(MVTable *tab)
00209 {
00210 int i, x, y;
00211
00212 tab->table_mv_index = av_malloc(sizeof(uint16_t) * 4096);
00213
00214 for(i=0;i<4096;i++)
00215 tab->table_mv_index[i] = tab->n;
00216
00217 for(i=0;i<tab->n;i++) {
00218 x = tab->table_mvx[i];
00219 y = tab->table_mvy[i];
00220 tab->table_mv_index[(x << 6) | y] = i;
00221 }
00222 }
00223
00224 static void code012(PutBitContext *pb, int n)
00225 {
00226 if (n == 0) {
00227 put_bits(pb, 1, 0);
00228 } else {
00229 put_bits(pb, 1, 1);
00230 put_bits(pb, 1, (n >= 2));
00231 }
00232 }
00233
00234 void ff_msmpeg4_encode_init(MpegEncContext *s)
00235 {
00236 static int init_done=0;
00237 int i;
00238
00239 common_init(s);
00240 if(s->msmpeg4_version>=4){
00241 s->min_qcoeff= -255;
00242 s->max_qcoeff= 255;
00243 }
00244
00245 if (!init_done) {
00246
00247 init_done = 1;
00248 init_mv_table(&mv_tables[0]);
00249 init_mv_table(&mv_tables[1]);
00250 for(i=0;i<NB_RL_TABLES;i++)
00251 init_rl(&rl_table[i], 1);
00252
00253 for(i=0; i<NB_RL_TABLES; i++){
00254 int level;
00255 for(level=0; level<=MAX_LEVEL; level++){
00256 int run;
00257 for(run=0; run<=MAX_RUN; run++){
00258 int last;
00259 for(last=0; last<2; last++){
00260 rl_length[i][level][run][last]= get_size_of_code(s, &rl_table[ i], last, run, level, 0);
00261 }
00262 }
00263 }
00264 }
00265 }
00266 }
00267
00268 static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra){
00269 int size=0;
00270 int code;
00271 int run_diff= intra ? 0 : 1;
00272
00273 code = get_rl_index(rl, last, run, level);
00274 size+= rl->table_vlc[code][1];
00275 if (code == rl->n) {
00276 int level1, run1;
00277
00278 level1 = level - rl->max_level[last][run];
00279 if (level1 < 1)
00280 goto esc2;
00281 code = get_rl_index(rl, last, run, level1);
00282 if (code == rl->n) {
00283 esc2:
00284 size++;
00285 if (level > MAX_LEVEL)
00286 goto esc3;
00287 run1 = run - rl->max_run[last][level] - run_diff;
00288 if (run1 < 0)
00289 goto esc3;
00290 code = get_rl_index(rl, last, run1, level);
00291 if (code == rl->n) {
00292 esc3:
00293
00294 size+=1+1+6+8;
00295 } else {
00296
00297 size+= 1+1+ rl->table_vlc[code][1];
00298 }
00299 } else {
00300
00301 size+= 1+1+ rl->table_vlc[code][1];
00302 }
00303 } else {
00304 size++;
00305 }
00306 return size;
00307 }
00308
00309 static void find_best_tables(MpegEncContext * s)
00310 {
00311 int i;
00312 int best =-1, best_size =9999999;
00313 int chroma_best=-1, best_chroma_size=9999999;
00314
00315 for(i=0; i<3; i++){
00316 int level;
00317 int chroma_size=0;
00318 int size=0;
00319
00320 if(i>0){
00321 size++;
00322 chroma_size++;
00323 }
00324 for(level=0; level<=MAX_LEVEL; level++){
00325 int run;
00326 for(run=0; run<=MAX_RUN; run++){
00327 int last;
00328 const int last_size= size + chroma_size;
00329 for(last=0; last<2; last++){
00330 int inter_count = s->ac_stats[0][0][level][run][last] + s->ac_stats[0][1][level][run][last];
00331 int intra_luma_count = s->ac_stats[1][0][level][run][last];
00332 int intra_chroma_count= s->ac_stats[1][1][level][run][last];
00333
00334 if(s->pict_type==I_TYPE){
00335 size += intra_luma_count *rl_length[i ][level][run][last];
00336 chroma_size+= intra_chroma_count*rl_length[i+3][level][run][last];
00337 }else{
00338 size+= intra_luma_count *rl_length[i ][level][run][last]
00339 +intra_chroma_count*rl_length[i+3][level][run][last]
00340 +inter_count *rl_length[i+3][level][run][last];
00341 }
00342 }
00343 if(last_size == size+chroma_size) break;
00344 }
00345 }
00346 if(size<best_size){
00347 best_size= size;
00348 best= i;
00349 }
00350 if(chroma_size<best_chroma_size){
00351 best_chroma_size= chroma_size;
00352 chroma_best= i;
00353 }
00354 }
00355
00356
00357
00358
00359 if(s->pict_type==P_TYPE) chroma_best= best;
00360
00361 memset(s->ac_stats, 0, sizeof(int)*(MAX_LEVEL+1)*(MAX_RUN+1)*2*2*2);
00362
00363 s->rl_table_index = best;
00364 s->rl_chroma_table_index= chroma_best;
00365
00366 if(s->pict_type != s->last_non_b_pict_type){
00367 s->rl_table_index= 2;
00368 if(s->pict_type==I_TYPE)
00369 s->rl_chroma_table_index= 1;
00370 else
00371 s->rl_chroma_table_index= 2;
00372 }
00373
00374 }
00375
00376
00377 void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
00378 {
00379 find_best_tables(s);
00380
00381 align_put_bits(&s->pb);
00382 put_bits(&s->pb, 2, s->pict_type - 1);
00383
00384 put_bits(&s->pb, 5, s->qscale);
00385 if(s->msmpeg4_version<=2){
00386 s->rl_table_index = 2;
00387 s->rl_chroma_table_index = 2;
00388 }
00389
00390 s->dc_table_index = 1;
00391 s->mv_table_index = 1;
00392 s->use_skip_mb_code = 1;
00393 s->per_mb_rl_table = 0;
00394 if(s->msmpeg4_version==4)
00395 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE && s->pict_type==P_TYPE);
00396
00397
00398 if (s->pict_type == I_TYPE) {
00399 s->slice_height= s->mb_height/1;
00400 put_bits(&s->pb, 5, 0x16 + s->mb_height/s->slice_height);
00401
00402 if(s->msmpeg4_version==4){
00403 msmpeg4_encode_ext_header(s);
00404 if(s->bit_rate>MBAC_BITRATE)
00405 put_bits(&s->pb, 1, s->per_mb_rl_table);
00406 }
00407
00408 if(s->msmpeg4_version>2){
00409 if(!s->per_mb_rl_table){
00410 code012(&s->pb, s->rl_chroma_table_index);
00411 code012(&s->pb, s->rl_table_index);
00412 }
00413
00414 put_bits(&s->pb, 1, s->dc_table_index);
00415 }
00416 } else {
00417 put_bits(&s->pb, 1, s->use_skip_mb_code);
00418
00419 if(s->msmpeg4_version==4 && s->bit_rate>MBAC_BITRATE)
00420 put_bits(&s->pb, 1, s->per_mb_rl_table);
00421
00422 if(s->msmpeg4_version>2){
00423 if(!s->per_mb_rl_table)
00424 code012(&s->pb, s->rl_table_index);
00425
00426 put_bits(&s->pb, 1, s->dc_table_index);
00427
00428 put_bits(&s->pb, 1, s->mv_table_index);
00429 }
00430 }
00431
00432 s->esc3_level_length= 0;
00433 s->esc3_run_length= 0;
00434
00435 #ifdef DEBUG
00436 intra_count = 0;
00437 printf("*****frame %d:\n", frame_count++);
00438 #endif
00439 }
00440
00441 void msmpeg4_encode_ext_header(MpegEncContext * s)
00442 {
00443 put_bits(&s->pb, 5, s->avctx->time_base.den / s->avctx->time_base.num);
00444
00445 put_bits(&s->pb, 11, FFMIN(s->bit_rate/1024, 2047));
00446
00447 if(s->msmpeg4_version>=3)
00448 put_bits(&s->pb, 1, s->flipflop_rounding);
00449 else
00450 assert(s->flipflop_rounding==0);
00451 }
00452
00453 #endif //CONFIG_ENCODERS
00454
00455
00456 static inline int coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr)
00457 {
00458 int xy, wrap, pred, a, b, c;
00459
00460 xy = s->block_index[n];
00461 wrap = s->b8_stride;
00462
00463
00464
00465
00466 a = s->coded_block[xy - 1 ];
00467 b = s->coded_block[xy - 1 - wrap];
00468 c = s->coded_block[xy - wrap];
00469
00470 if (b == c) {
00471 pred = a;
00472 } else {
00473 pred = c;
00474 }
00475
00476
00477 *coded_block_ptr = &s->coded_block[xy];
00478
00479 return pred;
00480 }
00481
00482 #ifdef CONFIG_ENCODERS
00483
00484 static void msmpeg4_encode_motion(MpegEncContext * s,
00485 int mx, int my)
00486 {
00487 int code;
00488 MVTable *mv;
00489
00490
00491
00492
00493 if (mx <= -64)
00494 mx += 64;
00495 else if (mx >= 64)
00496 mx -= 64;
00497 if (my <= -64)
00498 my += 64;
00499 else if (my >= 64)
00500 my -= 64;
00501
00502 mx += 32;
00503 my += 32;
00504 #if 0
00505 if ((unsigned)mx >= 64 ||
00506 (unsigned)my >= 64)
00507 fprintf(stderr, "error mx=%d my=%d\n", mx, my);
00508 #endif
00509 mv = &mv_tables[s->mv_table_index];
00510
00511 code = mv->table_mv_index[(mx << 6) | my];
00512 set_stat(ST_MV);
00513 put_bits(&s->pb,
00514 mv->table_mv_bits[code],
00515 mv->table_mv_code[code]);
00516 if (code == mv->n) {
00517
00518 put_bits(&s->pb, 6, mx);
00519 put_bits(&s->pb, 6, my);
00520 }
00521 }
00522
00523 static inline void handle_slices(MpegEncContext *s){
00524 if (s->mb_x == 0) {
00525 if (s->slice_height && (s->mb_y % s->slice_height) == 0) {
00526 if(s->msmpeg4_version < 4){
00527 ff_mpeg4_clean_buffers(s);
00528 }
00529 s->first_slice_line = 1;
00530 } else {
00531 s->first_slice_line = 0;
00532 }
00533 }
00534 }
00535
00536 void msmpeg4_encode_mb(MpegEncContext * s,
00537 DCTELEM block[6][64],
00538 int motion_x, int motion_y)
00539 {
00540 int cbp, coded_cbp, i;
00541 int pred_x, pred_y;
00542 uint8_t *coded_block;
00543
00544 handle_slices(s);
00545
00546 if (!s->mb_intra) {
00547
00548 set_stat(ST_INTER_MB);
00549 cbp = 0;
00550 for (i = 0; i < 6; i++) {
00551 if (s->block_last_index[i] >= 0)
00552 cbp |= 1 << (5 - i);
00553 }
00554 if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) {
00555
00556 put_bits(&s->pb, 1, 1);
00557 s->last_bits++;
00558 s->misc_bits++;
00559 s->skip_count++;
00560
00561 return;
00562 }
00563 if (s->use_skip_mb_code)
00564 put_bits(&s->pb, 1, 0);
00565
00566 if(s->msmpeg4_version<=2){
00567 put_bits(&s->pb,
00568 v2_mb_type[cbp&3][1],
00569 v2_mb_type[cbp&3][0]);
00570 if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C;
00571 else coded_cbp= cbp;
00572
00573 put_bits(&s->pb,
00574 cbpy_tab[coded_cbp>>2][1],
00575 cbpy_tab[coded_cbp>>2][0]);
00576
00577 s->misc_bits += get_bits_diff(s);
00578
00579 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
00580 msmpeg4v2_encode_motion(s, motion_x - pred_x);
00581 msmpeg4v2_encode_motion(s, motion_y - pred_y);
00582 }else{
00583 put_bits(&s->pb,
00584 table_mb_non_intra[cbp + 64][1],
00585 table_mb_non_intra[cbp + 64][0]);
00586
00587 s->misc_bits += get_bits_diff(s);
00588
00589
00590 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
00591 msmpeg4_encode_motion(s, motion_x - pred_x,
00592 motion_y - pred_y);
00593 }
00594
00595 s->mv_bits += get_bits_diff(s);
00596
00597 for (i = 0; i < 6; i++) {
00598 msmpeg4_encode_block(s, block[i], i);
00599 }
00600 s->p_tex_bits += get_bits_diff(s);
00601 } else {
00602
00603 cbp = 0;
00604 coded_cbp = 0;
00605 for (i = 0; i < 6; i++) {
00606 int val, pred;
00607 val = (s->block_last_index[i] >= 1);
00608 cbp |= val << (5 - i);
00609 if (i < 4) {
00610
00611 pred = coded_block_pred(s, i, &coded_block);
00612 *coded_block = val;
00613 val = val ^ pred;
00614 }
00615 coded_cbp |= val << (5 - i);
00616 }
00617 #if 0
00618 if (coded_cbp)
00619 printf("cbp=%x %x\n", cbp, coded_cbp);
00620 #endif
00621
00622 if(s->msmpeg4_version<=2){
00623 if (s->pict_type == I_TYPE) {
00624 put_bits(&s->pb,
00625 v2_intra_cbpc[cbp&3][1], v2_intra_cbpc[cbp&3][0]);
00626 } else {
00627 if (s->use_skip_mb_code)
00628 put_bits(&s->pb, 1, 0);
00629 put_bits(&s->pb,
00630 v2_mb_type[(cbp&3) + 4][1],
00631 v2_mb_type[(cbp&3) + 4][0]);
00632 }
00633 put_bits(&s->pb, 1, 0);
00634 put_bits(&s->pb,
00635 cbpy_tab[cbp>>2][1],
00636 cbpy_tab[cbp>>2][0]);
00637 }else{
00638 if (s->pict_type == I_TYPE) {
00639 set_stat(ST_INTRA_MB);
00640 put_bits(&s->pb,
00641 ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]);
00642 } else {
00643 if (s->use_skip_mb_code)
00644 put_bits(&s->pb, 1, 0);
00645 put_bits(&s->pb,
00646 table_mb_non_intra[cbp][1],
00647 table_mb_non_intra[cbp][0]);
00648 }
00649 set_stat(ST_INTRA_MB);
00650 put_bits(&s->pb, 1, 0);
00651 if(s->inter_intra_pred){
00652 s->h263_aic_dir=0;
00653 put_bits(&s->pb, table_inter_intra[s->h263_aic_dir][1], table_inter_intra[s->h263_aic_dir][0]);
00654 }
00655 }
00656 s->misc_bits += get_bits_diff(s);
00657
00658 for (i = 0; i < 6; i++) {
00659 msmpeg4_encode_block(s, block[i], i);
00660 }
00661 s->i_tex_bits += get_bits_diff(s);
00662 s->i_count++;
00663 }
00664 }
00665
00666 #endif //CONFIG_ENCODERS
00667
00668 static inline int msmpeg4v1_pred_dc(MpegEncContext * s, int n,
00669 int32_t **dc_val_ptr)
00670 {
00671 int i;
00672
00673 if (n < 4) {
00674 i= 0;
00675 } else {
00676 i= n-3;
00677 }
00678
00679 *dc_val_ptr= &s->last_dc[i];
00680 return s->last_dc[i];
00681 }
00682
00683 static int get_dc(uint8_t *src, int stride, int scale)
00684 {
00685 int y;
00686 int sum=0;
00687 for(y=0; y<8; y++){
00688 int x;
00689 for(x=0; x<8; x++){
00690 sum+=src[x + y*stride];
00691 }
00692 }
00693 return FASTDIV((sum + (scale>>1)), scale);
00694 }
00695
00696
00697 static inline int msmpeg4_pred_dc(MpegEncContext * s, int n,
00698 uint16_t **dc_val_ptr, int *dir_ptr)
00699 {
00700 int a, b, c, wrap, pred, scale;
00701 int16_t *dc_val;
00702
00703
00704 if (n < 4) {
00705 scale = s->y_dc_scale;
00706 } else {
00707 scale = s->c_dc_scale;
00708 }
00709
00710 wrap = s->block_wrap[n];
00711 dc_val= s->dc_val[0] + s->block_index[n];
00712
00713
00714
00715
00716 a = dc_val[ - 1];
00717 b = dc_val[ - 1 - wrap];
00718 c = dc_val[ - wrap];
00719
00720 if(s->first_slice_line && (n&2)==0 && s->msmpeg4_version<4){
00721 b=c=1024;
00722 }
00723
00724
00725
00726
00727
00728 #if (defined(ARCH_X86) || defined(ARCH_X86_64)) && !defined PIC
00729 asm volatile(
00730 "movl %3, %%eax \n\t"
00731 "shrl $1, %%eax \n\t"
00732 "addl %%eax, %2 \n\t"
00733 "addl %%eax, %1 \n\t"
00734 "addl %0, %%eax \n\t"
00735 "mull %4 \n\t"
00736 "movl %%edx, %0 \n\t"
00737 "movl %1, %%eax \n\t"
00738 "mull %4 \n\t"
00739 "movl %%edx, %1 \n\t"
00740 "movl %2, %%eax \n\t"
00741 "mull %4 \n\t"
00742 "movl %%edx, %2 \n\t"
00743 : "+b" (a), "+c" (b), "+D" (c)
00744 : "g" (scale), "S" (inverse[scale])
00745 : "%eax", "%edx"
00746 );
00747 #else
00748
00749
00750
00751
00752 if (scale == 8) {
00753 a = (a + (8 >> 1)) / 8;
00754 b = (b + (8 >> 1)) / 8;
00755 c = (c + (8 >> 1)) / 8;
00756 } else {
00757 a = FASTDIV((a + (scale >> 1)), scale);
00758 b = FASTDIV((b + (scale >> 1)), scale);
00759 c = FASTDIV((c + (scale >> 1)), scale);
00760 }
00761 #endif
00762
00763
00764 if(s->msmpeg4_version>3){
00765 if(s->inter_intra_pred){
00766 uint8_t *dest;
00767 int wrap;
00768
00769 if(n==1){
00770 pred=a;
00771 *dir_ptr = 0;
00772 }else if(n==2){
00773 pred=c;
00774 *dir_ptr = 1;
00775 }else if(n==3){
00776 if (abs(a - b) < abs(b - c)) {
00777 pred = c;
00778 *dir_ptr = 1;
00779 } else {
00780 pred = a;
00781 *dir_ptr = 0;
00782 }
00783 }else{
00784 if(n<4){
00785 wrap= s->linesize;
00786 dest= s->current_picture.data[0] + (((n>>1) + 2*s->mb_y) * 8* wrap ) + ((n&1) + 2*s->mb_x) * 8;
00787 }else{
00788 wrap= s->uvlinesize;
00789 dest= s->current_picture.data[n-3] + (s->mb_y * 8 * wrap) + s->mb_x * 8;
00790 }
00791 if(s->mb_x==0) a= (1024 + (scale>>1))/scale;
00792 else a= get_dc(dest-8, wrap, scale*8);
00793 if(s->mb_y==0) c= (1024 + (scale>>1))/scale;
00794 else c= get_dc(dest-8*wrap, wrap, scale*8);
00795
00796 if (s->h263_aic_dir==0) {
00797 pred= a;
00798 *dir_ptr = 0;
00799 }else if (s->h263_aic_dir==1) {
00800 if(n==0){
00801 pred= c;
00802 *dir_ptr = 1;
00803 }else{
00804 pred= a;
00805 *dir_ptr = 0;
00806 }
00807 }else if (s->h263_aic_dir==2) {
00808 if(n==0){
00809 pred= a;
00810 *dir_ptr = 0;
00811 }else{
00812 pred= c;
00813 *dir_ptr = 1;
00814 }
00815 } else {
00816 pred= c;
00817 *dir_ptr = 1;
00818 }
00819 }
00820 }else{
00821 if (abs(a - b) < abs(b - c)) {
00822 pred = c;
00823 *dir_ptr = 1;
00824 } else {
00825 pred = a;
00826 *dir_ptr = 0;
00827 }
00828 }
00829 }else{
00830 if (abs(a - b) <= abs(b - c)) {
00831 pred = c;
00832 *dir_ptr = 1;
00833 } else {
00834 pred = a;
00835 *dir_ptr = 0;
00836 }
00837 }
00838
00839
00840 *dc_val_ptr = &dc_val[0];
00841 return pred;
00842 }
00843
00844 #define DC_MAX 119
00845
00846 static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
00847 {
00848 int sign, code;
00849 int pred;
00850
00851 if(s->msmpeg4_version==1){
00852 int32_t *dc_val;
00853 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
00854
00855
00856 *dc_val= level;
00857 }else{
00858 uint16_t *dc_val;
00859 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
00860
00861
00862 if (n < 4) {
00863 *dc_val = level * s->y_dc_scale;
00864 } else {
00865 *dc_val = level * s->c_dc_scale;
00866 }
00867 }
00868
00869
00870 level -= pred;
00871
00872 if(s->msmpeg4_version<=2){
00873 if (n < 4) {
00874 put_bits(&s->pb,
00875 v2_dc_lum_table[level+256][1],
00876 v2_dc_lum_table[level+256][0]);
00877 }else{
00878 put_bits(&s->pb,
00879 v2_dc_chroma_table[level+256][1],
00880 v2_dc_chroma_table[level+256][0]);
00881 }
00882 }else{
00883 sign = 0;
00884 if (level < 0) {
00885 level = -level;
00886 sign = 1;
00887 }
00888 code = level;
00889 if (code > DC_MAX)
00890 code = DC_MAX;
00891
00892 if (s->dc_table_index == 0) {
00893 if (n < 4) {
00894 put_bits(&s->pb, ff_table0_dc_lum[code][1], ff_table0_dc_lum[code][0]);
00895 } else {
00896 put_bits(&s->pb, ff_table0_dc_chroma[code][1], ff_table0_dc_chroma[code][0]);
00897 }
00898 } else {
00899 if (n < 4) {
00900 put_bits(&s->pb, ff_table1_dc_lum[code][1], ff_table1_dc_lum[code][0]);
00901 } else {
00902 put_bits(&s->pb, ff_table1_dc_chroma[code][1], ff_table1_dc_chroma[code][0]);
00903 }
00904 }
00905
00906 if (code == DC_MAX)
00907 put_bits(&s->pb, 8, level);
00908
00909 if (level != 0) {
00910 put_bits(&s->pb, 1, sign);
00911 }
00912 }
00913 }
00914
00915
00916
00917
00918 static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
00919 {
00920 int level, run, last, i, j, last_index;
00921 int last_non_zero, sign, slevel;
00922 int code, run_diff, dc_pred_dir;
00923 const RLTable *rl;
00924 const uint8_t *scantable;
00925
00926 if (s->mb_intra) {
00927 set_stat(ST_DC);
00928 msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
00929 i = 1;
00930 if (n < 4) {
00931 rl = &rl_table[s->rl_table_index];
00932 } else {
00933 rl = &rl_table[3 + s->rl_chroma_table_index];
00934 }
00935 run_diff = 0;
00936 scantable= s->intra_scantable.permutated;
00937 set_stat(ST_INTRA_AC);
00938 } else {
00939 i = 0;
00940 rl = &rl_table[3 + s->rl_table_index];
00941 if(s->msmpeg4_version<=2)
00942 run_diff = 0;
00943 else
00944 run_diff = 1;
00945 scantable= s->inter_scantable.permutated;
00946 set_stat(ST_INTER_AC);
00947 }
00948
00949
00950 if(s->msmpeg4_version>=4 && s->block_last_index[n]>0){
00951 for(last_index=63; last_index>=0; last_index--){
00952 if(block[scantable[last_index]]) break;
00953 }
00954 s->block_last_index[n]= last_index;
00955 }else
00956 last_index = s->block_last_index[n];
00957
00958 last_non_zero = i - 1;
00959 for (; i <= last_index; i++) {
00960 j = scantable[i];
00961 level = block[j];
00962 if (level) {
00963 run = i - last_non_zero - 1;
00964 last = (i == last_index);
00965 sign = 0;
00966 slevel = level;
00967 if (level < 0) {
00968 sign = 1;
00969 level = -level;
00970 }
00971
00972 if(level<=MAX_LEVEL && run<=MAX_RUN){
00973 s->ac_stats[s->mb_intra][n>3][level][run][last]++;
00974 }
00975 #if 0
00976 else
00977 s->ac_stats[s->mb_intra][n>3][40][63][0]++;
00978 #endif
00979 code = get_rl_index(rl, last, run, level);
00980 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
00981 if (code == rl->n) {
00982 int level1, run1;
00983
00984 level1 = level - rl->max_level[last][run];
00985 if (level1 < 1)
00986 goto esc2;
00987 code = get_rl_index(rl, last, run, level1);
00988 if (code == rl->n) {
00989 esc2:
00990 put_bits(&s->pb, 1, 0);
00991 if (level > MAX_LEVEL)
00992 goto esc3;
00993 run1 = run - rl->max_run[last][level] - run_diff;
00994 if (run1 < 0)
00995 goto esc3;
00996 code = get_rl_index(rl, last, run1, level);
00997 if (code == rl->n) {
00998 esc3:
00999
01000 put_bits(&s->pb, 1, 0);
01001 put_bits(&s->pb, 1, last);
01002 if(s->msmpeg4_version>=4){
01003 if(s->esc3_level_length==0){
01004 s->esc3_level_length=8;
01005 s->esc3_run_length= 6;
01006 if(s->qscale<8)
01007 put_bits(&s->pb, 6, 3);
01008 else
01009 put_bits(&s->pb, 8, 3);
01010 }
01011 put_bits(&s->pb, s->esc3_run_length, run);
01012 put_bits(&s->pb, 1, sign);
01013 put_bits(&s->pb, s->esc3_level_length, level);
01014 }else{
01015 put_bits(&s->pb, 6, run);
01016 put_bits(&s->pb, 8, slevel & 0xff);
01017 }
01018 } else {
01019
01020 put_bits(&s->pb, 1, 1);
01021 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
01022 put_bits(&s->pb, 1, sign);
01023 }
01024 } else {
01025
01026 put_bits(&s->pb, 1, 1);
01027 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
01028 put_bits(&s->pb, 1, sign);
01029 }
01030 } else {
01031 put_bits(&s->pb, 1, sign);
01032 }
01033 last_non_zero = i;
01034 }
01035 }
01036 }
01037
01038
01039
01040
01041 static VLC mb_non_intra_vlc[4];
01042 VLC ff_msmp4_mb_i_vlc;
01043 VLC ff_msmp4_dc_luma_vlc[2];
01044 VLC ff_msmp4_dc_chroma_vlc[2];
01045 static VLC v2_dc_lum_vlc;
01046 static VLC v2_dc_chroma_vlc;
01047 static VLC cbpy_vlc;
01048 static VLC v2_intra_cbpc_vlc;
01049 static VLC v2_mb_type_vlc;
01050 static VLC v2_mv_vlc;
01051 static VLC v1_intra_cbpc_vlc;
01052 static VLC v1_inter_cbpc_vlc;
01053 static VLC inter_intra_vlc;
01054
01055
01056 static void init_h263_dc_for_msmpeg4(void)
01057 {
01058 int level, uni_code, uni_len;
01059
01060 for(level=-256; level<256; level++){
01061 int size, v, l;
01062
01063 size = 0;
01064 v = abs(level);
01065 while (v) {
01066 v >>= 1;
01067 size++;
01068 }
01069
01070 if (level < 0)
01071 l= (-level) ^ ((1 << size) - 1);
01072 else
01073 l= level;
01074
01075
01076 uni_code= DCtab_lum[size][0];
01077 uni_len = DCtab_lum[size][1];
01078 uni_code ^= (1<<uni_len)-1;
01079
01080 if (size > 0) {
01081 uni_code<<=size; uni_code|=l;
01082 uni_len+=size;
01083 if (size > 8){
01084 uni_code<<=1; uni_code|=1;
01085 uni_len++;
01086 }
01087 }
01088 v2_dc_lum_table[level+256][0]= uni_code;
01089 v2_dc_lum_table[level+256][1]= uni_len;
01090
01091
01092 uni_code= DCtab_chrom[size][0];
01093 uni_len = DCtab_chrom[size][1];
01094 uni_code ^= (1<<uni_len)-1;
01095
01096 if (size > 0) {
01097 uni_code<<=size; uni_code|=l;
01098 uni_len+=size;
01099 if (size > 8){
01100 uni_code<<=1; uni_code|=1;
01101 uni_len++;
01102 }
01103 }
01104 v2_dc_chroma_table[level+256][0]= uni_code;
01105 v2_dc_chroma_table[level+256][1]= uni_len;
01106
01107 }
01108 }
01109
01110
01111 int ff_msmpeg4_decode_init(MpegEncContext *s)
01112 {
01113 static int done = 0;
01114 int i;
01115 MVTable *mv;
01116
01117 common_init(s);
01118
01119 if (!done) {
01120 done = 1;
01121
01122 for(i=0;i<NB_RL_TABLES;i++) {
01123 init_rl(&rl_table[i], 1);
01124 init_vlc_rl(&rl_table[i], 1);
01125 }
01126 for(i=0;i<2;i++) {
01127 mv = &mv_tables[i];
01128 init_vlc(&mv->vlc, MV_VLC_BITS, mv->n + 1,
01129 mv->table_mv_bits, 1, 1,
01130 mv->table_mv_code, 2, 2, 1);
01131 }
01132
01133 init_vlc(&ff_msmp4_dc_luma_vlc[0], DC_VLC_BITS, 120,
01134 &ff_table0_dc_lum[0][1], 8, 4,
01135 &ff_table0_dc_lum[0][0], 8, 4, 1);
01136 init_vlc(&ff_msmp4_dc_chroma_vlc[0], DC_VLC_BITS, 120,
01137 &ff_table0_dc_chroma[0][1], 8, 4,
01138 &ff_table0_dc_chroma[0][0], 8, 4, 1);
01139 init_vlc(&ff_msmp4_dc_luma_vlc[1], DC_VLC_BITS, 120,
01140 &ff_table1_dc_lum[0][1], 8, 4,
01141 &ff_table1_dc_lum[0][0], 8, 4, 1);
01142 init_vlc(&ff_msmp4_dc_chroma_vlc[1], DC_VLC_BITS, 120,
01143 &ff_table1_dc_chroma[0][1], 8, 4,
01144 &ff_table1_dc_chroma[0][0], 8, 4, 1);
01145
01146 init_vlc(&v2_dc_lum_vlc, DC_VLC_BITS, 512,
01147 &v2_dc_lum_table[0][1], 8, 4,
01148 &v2_dc_lum_table[0][0], 8, 4, 1);
01149 init_vlc(&v2_dc_chroma_vlc, DC_VLC_BITS, 512,
01150 &v2_dc_chroma_table[0][1], 8, 4,
01151 &v2_dc_chroma_table[0][0], 8, 4, 1);
01152
01153 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
01154 &cbpy_tab[0][1], 2, 1,
01155 &cbpy_tab[0][0], 2, 1, 1);
01156 init_vlc(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4,
01157 &v2_intra_cbpc[0][1], 2, 1,
01158 &v2_intra_cbpc[0][0], 2, 1, 1);
01159 init_vlc(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8,
01160 &v2_mb_type[0][1], 2, 1,
01161 &v2_mb_type[0][0], 2, 1, 1);
01162 init_vlc(&v2_mv_vlc, V2_MV_VLC_BITS, 33,
01163 &mvtab[0][1], 2, 1,
01164 &mvtab[0][0], 2, 1, 1);
01165
01166 for(i=0; i<4; i++){
01167 init_vlc(&mb_non_intra_vlc[i], MB_NON_INTRA_VLC_BITS, 128,
01168 &wmv2_inter_table[i][0][1], 8, 4,
01169 &wmv2_inter_table[i][0][0], 8, 4, 1);
01170 }
01171
01172 init_vlc(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64,
01173 &ff_msmp4_mb_i_table[0][1], 4, 2,
01174 &ff_msmp4_mb_i_table[0][0], 4, 2, 1);
01175
01176 init_vlc(&v1_intra_cbpc_vlc, V1_INTRA_CBPC_VLC_BITS, 8,
01177 intra_MCBPC_bits, 1, 1,
01178 intra_MCBPC_code, 1, 1, 1);
01179 init_vlc(&v1_inter_cbpc_vlc, V1_INTER_CBPC_VLC_BITS, 25,
01180 inter_MCBPC_bits, 1, 1,
01181 inter_MCBPC_code, 1, 1, 1);
01182
01183 init_vlc(&inter_intra_vlc, INTER_INTRA_VLC_BITS, 4,
01184 &table_inter_intra[0][1], 2, 1,
01185 &table_inter_intra[0][0], 2, 1, 1);
01186 }
01187
01188 switch(s->msmpeg4_version){
01189 case 1:
01190 case 2:
01191 s->decode_mb= msmpeg4v12_decode_mb;
01192 break;
01193 case 3:
01194 case 4:
01195 s->decode_mb= msmpeg4v34_decode_mb;
01196 break;
01197 case 5:
01198 s->decode_mb= wmv2_decode_mb;
01199 case 6:
01200
01201 break;
01202 }
01203
01204 s->slice_height= s->mb_height;
01205
01206 return 0;
01207 }
01208
01209 int msmpeg4_decode_picture_header(MpegEncContext * s)
01210 {
01211 int code;
01212
01213 #if 0
01214 {
01215 int i;
01216 for(i=0; i<s->gb.size_in_bits; i++)
01217 printf("%d", get_bits1(&s->gb));
01218
01219 printf("END\n");
01220 return -1;
01221 }
01222 #endif
01223
01224 if(s->msmpeg4_version==1){
01225 int start_code, num;
01226 start_code = (get_bits(&s->gb, 16)<<16) | get_bits(&s->gb, 16);
01227 if(start_code!=0x00000100){
01228 av_log(s->avctx, AV_LOG_ERROR, "invalid startcode\n");
01229 return -1;
01230 }
01231
01232 num= get_bits(&s->gb, 5);
01233 }
01234
01235 s->pict_type = get_bits(&s->gb, 2) + 1;
01236 if (s->pict_type != I_TYPE &&
01237 s->pict_type != P_TYPE){
01238 av_log(s->avctx, AV_LOG_ERROR, "invalid picture type\n");
01239 return -1;
01240 }
01241 #if 0
01242 {
01243 static int had_i=0;
01244 if(s->pict_type == I_TYPE) had_i=1;
01245 if(!had_i) return -1;
01246 }
01247 #endif
01248 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
01249 if(s->qscale==0){
01250 av_log(s->avctx, AV_LOG_ERROR, "invalid qscale\n");
01251 return -1;
01252 }
01253
01254 if (s->pict_type == I_TYPE) {
01255 code = get_bits(&s->gb, 5);
01256 if(s->msmpeg4_version==1){
01257 if(code==0 || code>s->mb_height){
01258 av_log(s->avctx, AV_LOG_ERROR, "invalid slice height %d\n", code);
01259 return -1;
01260 }
01261
01262 s->slice_height = code;
01263 }else{
01264
01265 if (code < 0x17){
01266 av_log(s->avctx, AV_LOG_ERROR, "error, slice code was %X\n", code);
01267 return -1;
01268 }
01269
01270 s->slice_height = s->mb_height / (code - 0x16);
01271 }
01272
01273 switch(s->msmpeg4_version){
01274 case 1:
01275 case 2:
01276 s->rl_chroma_table_index = 2;
01277 s->rl_table_index = 2;
01278
01279 s->dc_table_index = 0;
01280 break;
01281 case 3:
01282 s->rl_chroma_table_index = decode012(&s->gb);
01283 s->rl_table_index = decode012(&s->gb);
01284
01285 s->dc_table_index = get_bits1(&s->gb);
01286 break;
01287 case 4:
01288 msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8);
01289
01290 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
01291 else s->per_mb_rl_table= 0;
01292
01293 if(!s->per_mb_rl_table){
01294 s->rl_chroma_table_index = decode012(&s->gb);
01295 s->rl_table_index = decode012(&s->gb);
01296 }
01297
01298 s->dc_table_index = get_bits1(&s->gb);
01299 s->inter_intra_pred= 0;
01300 break;
01301 }
01302 s->no_rounding = 1;
01303 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
01304 av_log(s->avctx, AV_LOG_DEBUG, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d \n",
01305 s->qscale,
01306 s->rl_chroma_table_index,
01307 s->rl_table_index,
01308 s->dc_table_index,
01309 s->per_mb_rl_table,
01310 s->slice_height);
01311 } else {
01312 switch(s->msmpeg4_version){
01313 case 1:
01314 case 2:
01315 if(s->msmpeg4_version==1)
01316 s->use_skip_mb_code = 1;
01317 else
01318 s->use_skip_mb_code = get_bits1(&s->gb);
01319 s->rl_table_index = 2;
01320 s->rl_chroma_table_index = s->rl_table_index;
01321 s->dc_table_index = 0;
01322 s->mv_table_index = 0;
01323 break;
01324 case 3:
01325 s->use_skip_mb_code = get_bits1(&s->gb);
01326 s->rl_table_index = decode012(&s->gb);
01327 s->rl_chroma_table_index = s->rl_table_index;
01328
01329 s->dc_table_index = get_bits1(&s->gb);
01330
01331 s->mv_table_index = get_bits1(&s->gb);
01332 break;
01333 case 4:
01334 s->use_skip_mb_code = get_bits1(&s->gb);
01335
01336 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
01337 else s->per_mb_rl_table= 0;
01338
01339 if(!s->per_mb_rl_table){
01340 s->rl_table_index = decode012(&s->gb);
01341 s->rl_chroma_table_index = s->rl_table_index;
01342 }
01343
01344 s->dc_table_index = get_bits1(&s->gb);
01345
01346 s->mv_table_index = get_bits1(&s->gb);
01347 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
01348 break;
01349 }
01350
01351 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
01352 av_log(s->avctx, AV_LOG_DEBUG, "skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n",
01353 s->use_skip_mb_code,
01354 s->rl_table_index,
01355 s->rl_chroma_table_index,
01356 s->dc_table_index,
01357 s->mv_table_index,
01358 s->per_mb_rl_table,
01359 s->qscale);
01360
01361 if(s->flipflop_rounding){
01362 s->no_rounding ^= 1;
01363 }else{
01364 s->no_rounding = 0;
01365 }
01366 }
01367
01368
01369 s->esc3_level_length= 0;
01370 s->esc3_run_length= 0;
01371
01372 #ifdef DEBUG
01373 printf("*****frame %d:\n", frame_count++);
01374 #endif
01375 return 0;
01376 }
01377
01378 int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
01379 {
01380 int left= buf_size*8 - get_bits_count(&s->gb);
01381 int length= s->msmpeg4_version>=3 ? 17 : 16;
01382
01383 if(left>=length && left<length+8)
01384 {
01385 int fps;
01386
01387 fps= get_bits(&s->gb, 5);
01388 s->bit_rate= get_bits(&s->gb, 11)*1024;
01389 if(s->msmpeg4_version>=3)
01390 s->flipflop_rounding= get_bits1(&s->gb);
01391 else
01392 s->flipflop_rounding= 0;
01393
01394
01395 }
01396 else if(left<length+8)
01397 {
01398 s->flipflop_rounding= 0;
01399 if(s->msmpeg4_version != 2)
01400 av_log(s->avctx, AV_LOG_ERROR, "ext header missing, %d left\n", left);
01401 }
01402 else
01403 {
01404 av_log(s->avctx, AV_LOG_ERROR, "I frame too long, ignoring ext header\n");
01405 }
01406
01407 return 0;
01408 }
01409
01410 static inline void msmpeg4_memsetw(short *tab, int val, int n)
01411 {
01412 int i;
01413 for(i=0;i<n;i++)
01414 tab[i] = val;
01415 }
01416
01417 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val)
01418 {
01419 int range, bit_size, sign, code, bits;
01420
01421 if (val == 0) {
01422
01423 code = 0;
01424 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
01425 } else {
01426 bit_size = s->f_code - 1;
01427 range = 1 << bit_size;
01428 if (val <= -64)
01429 val += 64;
01430 else if (val >= 64)
01431 val -= 64;
01432
01433 if (val >= 0) {
01434 sign = 0;
01435 } else {
01436 val = -val;
01437 sign = 1;
01438 }
01439 val--;
01440 code = (val >> bit_size) + 1;
01441 bits = val & (range - 1);
01442
01443 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
01444 if (bit_size > 0) {
01445 put_bits(&s->pb, bit_size, bits);
01446 }
01447 }
01448 }
01449
01450
01451 static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
01452 {
01453 int code, val, sign, shift;
01454
01455 code = get_vlc2(&s->gb, v2_mv_vlc.table, V2_MV_VLC_BITS, 2);
01456
01457 if (code < 0)
01458 return 0xffff;
01459
01460 if (code == 0)
01461 return pred;
01462 sign = get_bits1(&s->gb);
01463 shift = f_code - 1;
01464 val = code;
01465 if (shift) {
01466 val = (val - 1) << shift;
01467 val |= get_bits(&s->gb, shift);
01468 val++;
01469 }
01470 if (sign)
01471 val = -val;
01472
01473 val += pred;
01474 if (val <= -64)
01475 val += 64;
01476 else if (val >= 64)
01477 val -= 64;
01478
01479 return val;
01480 }
01481
01482 static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
01483 {
01484 int cbp, code, i;
01485
01486 if (s->pict_type == P_TYPE) {
01487 if (s->use_skip_mb_code) {
01488 if (get_bits1(&s->gb)) {
01489
01490 s->mb_intra = 0;
01491 for(i=0;i<6;i++)
01492 s->block_last_index[i] = -1;
01493 s->mv_dir = MV_DIR_FORWARD;
01494 s->mv_type = MV_TYPE_16X16;
01495 s->mv[0][0][0] = 0;
01496 s->mv[0][0][1] = 0;
01497 s->mb_skipped = 1;
01498 return 0;
01499 }
01500 }
01501
01502 if(s->msmpeg4_version==2)
01503 code = get_vlc2(&s->gb, v2_mb_type_vlc.table, V2_MB_TYPE_VLC_BITS, 1);
01504 else
01505 code = get_vlc2(&s->gb, v1_inter_cbpc_vlc.table, V1_INTER_CBPC_VLC_BITS, 3);
01506 if(code<0 || code>7){
01507 av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y);
01508 return -1;
01509 }
01510
01511 s->mb_intra = code >>2;
01512
01513 cbp = code & 0x3;
01514 } else {
01515 s->mb_intra = 1;
01516 if(s->msmpeg4_version==2)
01517 cbp= get_vlc2(&s->gb, v2_intra_cbpc_vlc.table, V2_INTRA_CBPC_VLC_BITS, 1);
01518 else
01519 cbp= get_vlc2(&s->gb, v1_intra_cbpc_vlc.table, V1_INTRA_CBPC_VLC_BITS, 1);
01520 if(cbp<0 || cbp>3){
01521 av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
01522 return -1;
01523 }
01524 }
01525
01526 if (!s->mb_intra) {
01527 int mx, my, cbpy;
01528
01529 cbpy= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
01530 if(cbpy<0){
01531 av_log(s->avctx, AV_LOG_ERROR, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
01532 return -1;
01533 }
01534
01535 cbp|= cbpy<<2;
01536 if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C;
01537
01538 h263_pred_motion(s, 0, 0, &mx, &my);
01539 mx= msmpeg4v2_decode_motion(s, mx, 1);
01540 my= msmpeg4v2_decode_motion(s, my, 1);
01541
01542 s->mv_dir = MV_DIR_FORWARD;
01543 s->mv_type = MV_TYPE_16X16;
01544 s->mv[0][0][0] = mx;
01545 s->mv[0][0][1] = my;
01546 } else {
01547 if(s->msmpeg4_version==2){
01548 s->ac_pred = get_bits1(&s->gb);
01549 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2;
01550 } else{
01551 s->ac_pred = 0;
01552 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2;
01553 if(s->pict_type==P_TYPE) cbp^=0x3C;
01554 }
01555 }
01556
01557 s->dsp.clear_blocks(s->block[0]);
01558 for (i = 0; i < 6; i++) {
01559 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
01560 {
01561 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
01562 return -1;
01563 }
01564 }
01565 return 0;
01566 }
01567
01568 static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
01569 {
01570 int cbp, code, i;
01571 uint8_t *coded_val;
01572 uint32_t * const mb_type_ptr= &s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ];
01573
01574 if (s->pict_type == P_TYPE) {
01575 set_stat(ST_INTER_MB);
01576 if (s->use_skip_mb_code) {
01577 if (get_bits1(&s->gb)) {
01578
01579 s->mb_intra = 0;
01580 for(i=0;i<6;i++)
01581 s->block_last_index[i] = -1;
01582 s->mv_dir = MV_DIR_FORWARD;
01583 s->mv_type = MV_TYPE_16X16;
01584 s->mv[0][0][0] = 0;
01585 s->mv[0][0][1] = 0;
01586 s->mb_skipped = 1;
01587 *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
01588
01589 return 0;
01590 }
01591 }
01592
01593 code = get_vlc2(&s->gb, mb_non_intra_vlc[DEFAULT_INTER_INDEX].table, MB_NON_INTRA_VLC_BITS, 3);
01594 if (code < 0)
01595 return -1;
01596
01597 s->mb_intra = (~code & 0x40) >> 6;
01598
01599 cbp = code & 0x3f;
01600 } else {
01601 set_stat(ST_INTRA_MB);
01602 s->mb_intra = 1;
01603 code = get_vlc2(&s->gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
01604 if (code < 0)
01605 return -1;
01606
01607 cbp = 0;
01608 for(i=0;i<6;i++) {
01609 int val = ((code >> (5 - i)) & 1);
01610 if (i < 4) {
01611 int pred = coded_block_pred(s, i, &coded_val);
01612 val = val ^ pred;
01613 *coded_val = val;
01614 }
01615 cbp |= val << (5 - i);
01616 }
01617 }
01618
01619 if (!s->mb_intra) {
01620 int mx, my;
01621
01622 if(s->per_mb_rl_table && cbp){
01623 s->rl_table_index = decode012(&s->gb);
01624 s->rl_chroma_table_index = s->rl_table_index;
01625 }
01626 set_stat(ST_MV);
01627 h263_pred_motion(s, 0, 0, &mx, &my);
01628 if (msmpeg4_decode_motion(s, &mx, &my) < 0)
01629 return -1;
01630 s->mv_dir = MV_DIR_FORWARD;
01631 s->mv_type = MV_TYPE_16X16;
01632 s->mv[0][0][0] = mx;
01633 s->mv[0][0][1] = my;
01634 *mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16;
01635 } else {
01636
01637 set_stat(ST_INTRA_MB);
01638 s->ac_pred = get_bits1(&s->gb);
01639 *mb_type_ptr = MB_TYPE_INTRA;
01640 if(s->inter_intra_pred){
01641 s->h263_aic_dir= get_vlc2(&s->gb, inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1);
01642
01643 }
01644 if(s->per_mb_rl_table && cbp){
01645 s->rl_table_index = decode012(&s->gb);
01646 s->rl_chroma_table_index = s->rl_table_index;
01647 }
01648 }
01649
01650 s->dsp.clear_blocks(s->block[0]);
01651 for (i = 0; i < 6; i++) {
01652 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
01653 {
01654 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
01655 return -1;
01656 }
01657 }
01658
01659 return 0;
01660 }
01661
01662 static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
01663 int n, int coded, const uint8_t *scan_table)
01664 {
01665 int level, i, last, run, run_diff;
01666 int dc_pred_dir;
01667 RLTable *rl;
01668 RL_VLC_ELEM *rl_vlc;
01669 int qmul, qadd;
01670
01671 if (s->mb_intra) {
01672 qmul=1;
01673 qadd=0;
01674
01675
01676 set_stat(ST_DC);
01677 level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
01678
01679 if (level < 0){
01680 av_log(s->avctx, AV_LOG_ERROR, "dc overflow- block: %d qscale: %d//\n", n, s->qscale);
01681 if(s->inter_intra_pred) level=0;
01682 else return -1;
01683 }
01684 if (n < 4) {
01685 rl = &rl_table[s->rl_table_index];
01686 if(level > 256*s->y_dc_scale){
01687 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ L qscale: %d//\n", s->qscale);
01688 if(!s->inter_intra_pred) return -1;
01689 }
01690 } else {
01691 rl = &rl_table[3 + s->rl_chroma_table_index];
01692 if(level > 256*s->c_dc_scale){
01693 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ C qscale: %d//\n", s->qscale);
01694 if(!s->inter_intra_pred) return -1;
01695 }
01696 }
01697 block[0] = level;
01698
01699 run_diff = 0;
01700 i = 0;
01701 if (!coded) {
01702 goto not_coded;
01703 }
01704 if (s->ac_pred) {
01705 if (dc_pred_dir == 0)
01706 scan_table = s->intra_v_scantable.permutated;
01707 else
01708 scan_table = s->intra_h_scantable.permutated;
01709 } else {
01710 scan_table = s->intra_scantable.permutated;
01711 }
01712 set_stat(ST_INTRA_AC);
01713 rl_vlc= rl->rl_vlc[0];
01714 } else {
01715 qmul = s->qscale << 1;
01716 qadd = (s->qscale - 1) | 1;
01717 i = -1;
01718 rl = &rl_table[3 + s->rl_table_index];
01719
01720 if(s->msmpeg4_version==2)
01721 run_diff = 0;
01722 else
01723 run_diff = 1;
01724
01725 if (!coded) {
01726 s->block_last_index[n] = i;
01727 return 0;
01728 }
01729 if(!scan_table)
01730 scan_table = s->inter_scantable.permutated;
01731 set_stat(ST_INTER_AC);
01732 rl_vlc= rl->rl_vlc[s->qscale];
01733 }
01734 {
01735 OPEN_READER(re, &s->gb);
01736 for(;;) {
01737 UPDATE_CACHE(re, &s->gb);
01738 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
01739 if (level==0) {
01740 int cache;
01741 cache= GET_CACHE(re, &s->gb);
01742
01743 if (s->msmpeg4_version==1 || (cache&0x80000000)==0) {
01744 if (s->msmpeg4_version==1 || (cache&0x40000000)==0) {
01745
01746 if(s->msmpeg4_version!=1) LAST_SKIP_BITS(re, &s->gb, 2);
01747 UPDATE_CACHE(re, &s->gb);
01748 if(s->msmpeg4_version<=3){
01749 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
01750 run= SHOW_UBITS(re, &s->gb, 6); SKIP_CACHE(re, &s->gb, 6);
01751 level= SHOW_SBITS(re, &s->gb, 8); LAST_SKIP_CACHE(re, &s->gb, 8);
01752 SKIP_COUNTER(re, &s->gb, 1+6+8);
01753 }else{
01754 int sign;
01755 last= SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1);
01756 if(!s->esc3_level_length){
01757 int ll;
01758
01759 if(s->qscale<8){
01760 ll= SHOW_UBITS(re, &s->gb, 3); SKIP_BITS(re, &s->gb, 3);
01761 if(ll==0){
01762 if(SHOW_UBITS(re, &s->gb, 1)) av_log(s->avctx, AV_LOG_ERROR, "cool a new vlc code ,contact the ffmpeg developers and upload the file\n");
01763 SKIP_BITS(re, &s->gb, 1);
01764 ll=8;
01765 }
01766 }else{
01767 ll=2;
01768 while(ll<8 && SHOW_UBITS(re, &s->gb, 1)==0){
01769 ll++;
01770 SKIP_BITS(re, &s->gb, 1);
01771 }
01772 if(ll<8) SKIP_BITS(re, &s->gb, 1);
01773 }
01774
01775 s->esc3_level_length= ll;
01776 s->esc3_run_length= SHOW_UBITS(re, &s->gb, 2) + 3; SKIP_BITS(re, &s->gb, 2);
01777
01778 UPDATE_CACHE(re, &s->gb);
01779 }
01780 run= SHOW_UBITS(re, &s->gb, s->esc3_run_length);
01781 SKIP_BITS(re, &s->gb, s->esc3_run_length);
01782
01783 sign= SHOW_UBITS(re, &s->gb, 1);
01784 SKIP_BITS(re, &s->gb, 1);
01785
01786 level= SHOW_UBITS(re, &s->gb, s->esc3_level_length);
01787 SKIP_BITS(re, &s->gb, s->esc3_level_length);
01788 if(sign) level= -level;
01789 }
01790
01791 #if 0 // waste of time / this will detect very few errors
01792 {
01793 const int abs_level= ABS(level);
01794 const int run1= run - rl->max_run[last][abs_level] - run_diff;
01795 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
01796 if(abs_level <= rl->max_level[last][run]){
01797 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
01798 return DECODING_AC_LOST;
01799 }
01800 if(abs_level <= rl->max_level[last][run]*2){
01801 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
01802 return DECODING_AC_LOST;
01803 }
01804 if(run1>=0 && abs_level <= rl->max_level[last][run1]){
01805 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
01806 return DECODING_AC_LOST;
01807 }
01808 }
01809 }
01810 #endif
01811
01812 if (level>0) level= level * qmul + qadd;
01813 else level= level * qmul - qadd;
01814 #if 0 // waste of time too :(
01815 if(level>2048 || level<-2048){
01816 fprintf(stderr, "|level| overflow in 3. esc\n");
01817 return DECODING_AC_LOST;
01818 }
01819 #endif
01820 i+= run + 1;
01821 if(last) i+=192;
01822 #ifdef ERROR_DETAILS
01823 if(run==66)
01824 fprintf(stderr, "illegal vlc code in ESC3 level=%d\n", level);
01825 else if((i>62 && i<192) || i>192+63)
01826 fprintf(stderr, "run overflow in ESC3 i=%d run=%d level=%d\n", i, run, level);
01827 #endif
01828 } else {
01829
01830 #if MIN_CACHE_BITS < 23
01831 LAST_SKIP_BITS(re, &s->gb, 2);
01832 UPDATE_CACHE(re, &s->gb);
01833 #else
01834 SKIP_BITS(re, &s->gb, 2);
01835 #endif
01836 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
01837 i+= run + rl->max_run[run>>7][level/qmul] + run_diff;
01838 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
01839 LAST_SKIP_BITS(re, &s->gb, 1);
01840 #ifdef ERROR_DETAILS
01841 if(run==66)
01842 fprintf(stderr, "illegal vlc code in ESC2 level=%d\n", level);
01843 else if((i>62 && i<192) || i>192+63)
01844 fprintf(stderr, "run overflow in ESC2 i=%d run=%d level=%d\n", i, run, level);
01845 #endif
01846 }
01847 } else {
01848
01849 #if MIN_CACHE_BITS < 22
01850 LAST_SKIP_BITS(re, &s->gb, 1);
01851 UPDATE_CACHE(re, &s->gb);
01852 #else
01853 SKIP_BITS(re, &s->gb, 1);
01854 #endif
01855 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
01856 i+= run;
01857 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;
01858 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
01859 LAST_SKIP_BITS(re, &s->gb, 1);
01860 #ifdef ERROR_DETAILS
01861 if(run==66)
01862 fprintf(stderr, "illegal vlc code in ESC1 level=%d\n", level);
01863 else if((i>62 && i<192) || i>192+63)
01864 fprintf(stderr, "run overflow in ESC1 i=%d run=%d level=%d\n", i, run, level);
01865 #endif
01866 }
01867 } else {
01868 i+= run;
01869 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
01870 LAST_SKIP_BITS(re, &s->gb, 1);
01871 #ifdef ERROR_DETAILS
01872 if(run==66)
01873 fprintf(stderr, "illegal vlc code level=%d\n", level);
01874 else if((i>62 && i<192) || i>192+63)
01875 fprintf(stderr, "run overflow i=%d run=%d level=%d\n", i, run, level);
01876 #endif
01877 }
01878 if (i > 62){
01879 i-= 192;
01880 if(i&(~63)){
01881 const int left= s->gb.size_in_bits - get_bits_count(&s->gb);
01882 if(((i+192 == 64 && level/qmul==-1) || s->error_resilience<=1) && left>=0){
01883 av_log(s->avctx, AV_LOG_ERROR, "ignoring overflow at %d %d\n", s->mb_x, s->mb_y);
01884 break;
01885 }else{
01886 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
01887 return -1;
01888 }
01889 }
01890
01891 block[scan_table[i]] = level;
01892 break;
01893 }
01894
01895 block[scan_table[i]] = level;
01896 }
01897 CLOSE_READER(re, &s->gb);
01898 }
01899 not_coded:
01900 if (s->mb_intra) {
01901 mpeg4_pred_ac(s, block, n, dc_pred_dir);
01902 if (s->ac_pred) {
01903 i = 63;
01904 }
01905 }
01906 if(s->msmpeg4_version>=4 && i>0) i=63;
01907 s->block_last_index[n] = i;
01908
01909 return 0;
01910 }
01911
01912 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
01913 {
01914 int level, pred;
01915
01916 if(s->msmpeg4_version<=2){
01917 if (n < 4) {
01918 level = get_vlc2(&s->gb, v2_dc_lum_vlc.table, DC_VLC_BITS, 3);
01919 } else {
01920 level = get_vlc2(&s->gb, v2_dc_chroma_vlc.table, DC_VLC_BITS, 3);
01921 }
01922 if (level < 0)
01923 return -1;
01924 level-=256;
01925 }else{
01926 if (n < 4) {
01927 level = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
01928 } else {
01929 level = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
01930 }
01931 if (level < 0){
01932 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
01933 return -1;
01934 }
01935
01936 if (level == DC_MAX) {
01937 level = get_bits(&s->gb, 8);
01938 if (get_bits1(&s->gb))
01939 level = -level;
01940 } else if (level != 0) {
01941 if (get_bits1(&s->gb))
01942 level = -level;
01943 }
01944 }
01945
01946 if(s->msmpeg4_version==1){
01947 int32_t *dc_val;
01948 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
01949 level += pred;
01950
01951
01952 *dc_val= level;
01953 }else{
01954 uint16_t *dc_val;
01955 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
01956 level += pred;
01957
01958
01959 if (n < 4) {
01960 *dc_val = level * s->y_dc_scale;
01961 } else {
01962 *dc_val = level * s->c_dc_scale;
01963 }
01964 }
01965
01966 return level;
01967 }
01968
01969 static int msmpeg4_decode_motion(MpegEncContext * s,
01970 int *mx_ptr, int *my_ptr)
01971 {
01972 MVTable *mv;
01973 int code, mx, my;
01974
01975 mv = &mv_tables[s->mv_table_index];
01976
01977 code = get_vlc2(&s->gb, mv->vlc.table, MV_VLC_BITS, 2);
01978 if (code < 0){
01979 av_log(s->avctx, AV_LOG_ERROR, "illegal MV code at %d %d\n", s->mb_x, s->mb_y);
01980 return -1;
01981 }
01982 if (code == mv->n) {
01983
01984 mx = get_bits(&s->gb, 6);
01985 my = get_bits(&s->gb, 6);
01986 } else {
01987 mx = mv->table_mvx[code];
01988 my = mv->table_mvy[code];
01989 }
01990
01991 mx += *mx_ptr - 32;
01992 my += *my_ptr - 32;
01993
01994 if (mx <= -64)
01995 mx += 64;
01996 else if (mx >= 64)
01997 mx -= 64;
01998
01999 if (my <= -64)
02000 my += 64;
02001 else if (my >= 64)
02002 my -= 64;
02003 *mx_ptr = mx;
02004 *my_ptr = my;
02005 return 0;
02006 }
02007
02008
02009
02010
02011
02012 #include "wmv2.c"