00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00030 #include <stdint.h>
00031 #include <string.h>
00032
00033 #include "libavutil/avutil.h"
00034 #include "libavutil/mem.h"
00035 #include "mpegvideo.h"
00036 #include "msmpeg4.h"
00037 #include "h263.h"
00038 #include "mpeg4video.h"
00039 #include "msmpeg4.h"
00040 #include "msmpeg4data.h"
00041 #include "put_bits.h"
00042 #include "rl.h"
00043 #include "vc1data.h"
00044
00045 static uint8_t rl_length[NB_RL_TABLES][MAX_LEVEL+1][MAX_RUN+1][2];
00046
00047
00048 static void init_mv_table(MVTable *tab)
00049 {
00050 int i, x, y;
00051
00052 tab->table_mv_index = av_malloc(sizeof(uint16_t) * 4096);
00053
00054 for(i=0;i<4096;i++)
00055 tab->table_mv_index[i] = tab->n;
00056
00057 for(i=0;i<tab->n;i++) {
00058 x = tab->table_mvx[i];
00059 y = tab->table_mvy[i];
00060 tab->table_mv_index[(x << 6) | y] = i;
00061 }
00062 }
00063
00064 void ff_msmpeg4_code012(PutBitContext *pb, int n)
00065 {
00066 if (n == 0) {
00067 put_bits(pb, 1, 0);
00068 } else {
00069 put_bits(pb, 1, 1);
00070 put_bits(pb, 1, (n >= 2));
00071 }
00072 }
00073
00074 static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra){
00075 int size=0;
00076 int code;
00077 int run_diff= intra ? 0 : 1;
00078
00079 code = get_rl_index(rl, last, run, level);
00080 size+= rl->table_vlc[code][1];
00081 if (code == rl->n) {
00082 int level1, run1;
00083
00084 level1 = level - rl->max_level[last][run];
00085 if (level1 < 1)
00086 goto esc2;
00087 code = get_rl_index(rl, last, run, level1);
00088 if (code == rl->n) {
00089 esc2:
00090 size++;
00091 if (level > MAX_LEVEL)
00092 goto esc3;
00093 run1 = run - rl->max_run[last][level] - run_diff;
00094 if (run1 < 0)
00095 goto esc3;
00096 code = get_rl_index(rl, last, run1, level);
00097 if (code == rl->n) {
00098 esc3:
00099
00100 size+=1+1+6+8;
00101 } else {
00102
00103 size+= 1+1+ rl->table_vlc[code][1];
00104 }
00105 } else {
00106
00107 size+= 1+1+ rl->table_vlc[code][1];
00108 }
00109 } else {
00110 size++;
00111 }
00112 return size;
00113 }
00114
00115 av_cold void ff_msmpeg4_encode_init(MpegEncContext *s)
00116 {
00117 static int init_done=0;
00118 int i;
00119
00120 ff_msmpeg4_common_init(s);
00121 if(s->msmpeg4_version>=4){
00122 s->min_qcoeff= -255;
00123 s->max_qcoeff= 255;
00124 }
00125
00126 if (!init_done) {
00127
00128 init_done = 1;
00129 init_mv_table(&ff_mv_tables[0]);
00130 init_mv_table(&ff_mv_tables[1]);
00131 for(i=0;i<NB_RL_TABLES;i++)
00132 ff_init_rl(&ff_rl_table[i], ff_static_rl_table_store[i]);
00133
00134 for(i=0; i<NB_RL_TABLES; i++){
00135 int level;
00136 for (level = 1; level <= MAX_LEVEL; level++) {
00137 int run;
00138 for(run=0; run<=MAX_RUN; run++){
00139 int last;
00140 for(last=0; last<2; last++){
00141 rl_length[i][level][run][last]= get_size_of_code(s, &ff_rl_table[ i], last, run, level, 0);
00142 }
00143 }
00144 }
00145 }
00146 }
00147 }
00148
00149 static void find_best_tables(MpegEncContext * s)
00150 {
00151 int i;
00152 int best = 0, best_size = INT_MAX;
00153 int chroma_best = 0, best_chroma_size = INT_MAX;
00154
00155 for(i=0; i<3; i++){
00156 int level;
00157 int chroma_size=0;
00158 int size=0;
00159
00160 if(i>0){
00161 size++;
00162 chroma_size++;
00163 }
00164 for(level=0; level<=MAX_LEVEL; level++){
00165 int run;
00166 for(run=0; run<=MAX_RUN; run++){
00167 int last;
00168 const int last_size= size + chroma_size;
00169 for(last=0; last<2; last++){
00170 int inter_count = s->ac_stats[0][0][level][run][last] + s->ac_stats[0][1][level][run][last];
00171 int intra_luma_count = s->ac_stats[1][0][level][run][last];
00172 int intra_chroma_count= s->ac_stats[1][1][level][run][last];
00173
00174 if(s->pict_type==AV_PICTURE_TYPE_I){
00175 size += intra_luma_count *rl_length[i ][level][run][last];
00176 chroma_size+= intra_chroma_count*rl_length[i+3][level][run][last];
00177 }else{
00178 size+= intra_luma_count *rl_length[i ][level][run][last]
00179 +intra_chroma_count*rl_length[i+3][level][run][last]
00180 +inter_count *rl_length[i+3][level][run][last];
00181 }
00182 }
00183 if(last_size == size+chroma_size) break;
00184 }
00185 }
00186 if(size<best_size){
00187 best_size= size;
00188 best= i;
00189 }
00190 if(chroma_size<best_chroma_size){
00191 best_chroma_size= chroma_size;
00192 chroma_best= i;
00193 }
00194 }
00195
00196 if(s->pict_type==AV_PICTURE_TYPE_P) chroma_best= best;
00197
00198 memset(s->ac_stats, 0, sizeof(int)*(MAX_LEVEL+1)*(MAX_RUN+1)*2*2*2);
00199
00200 s->rl_table_index = best;
00201 s->rl_chroma_table_index= chroma_best;
00202
00203 if(s->pict_type != s->last_non_b_pict_type){
00204 s->rl_table_index= 2;
00205 if(s->pict_type==AV_PICTURE_TYPE_I)
00206 s->rl_chroma_table_index= 1;
00207 else
00208 s->rl_chroma_table_index= 2;
00209 }
00210
00211 }
00212
00213
00214 void ff_msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
00215 {
00216 find_best_tables(s);
00217
00218 avpriv_align_put_bits(&s->pb);
00219 put_bits(&s->pb, 2, s->pict_type - 1);
00220
00221 put_bits(&s->pb, 5, s->qscale);
00222 if(s->msmpeg4_version<=2){
00223 s->rl_table_index = 2;
00224 s->rl_chroma_table_index = 2;
00225 }
00226
00227 s->dc_table_index = 1;
00228 s->mv_table_index = 1;
00229 s->use_skip_mb_code = 1;
00230 s->per_mb_rl_table = 0;
00231 if(s->msmpeg4_version==4)
00232 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE && s->pict_type==AV_PICTURE_TYPE_P);
00233 av_dlog(s, "%d %d %d %d %d\n", s->pict_type, s->bit_rate,
00234 s->inter_intra_pred, s->width, s->height);
00235
00236 if (s->pict_type == AV_PICTURE_TYPE_I) {
00237 s->slice_height= s->mb_height/1;
00238 put_bits(&s->pb, 5, 0x16 + s->mb_height/s->slice_height);
00239
00240 if(s->msmpeg4_version==4){
00241 ff_msmpeg4_encode_ext_header(s);
00242 if(s->bit_rate>MBAC_BITRATE)
00243 put_bits(&s->pb, 1, s->per_mb_rl_table);
00244 }
00245
00246 if(s->msmpeg4_version>2){
00247 if(!s->per_mb_rl_table){
00248 ff_msmpeg4_code012(&s->pb, s->rl_chroma_table_index);
00249 ff_msmpeg4_code012(&s->pb, s->rl_table_index);
00250 }
00251
00252 put_bits(&s->pb, 1, s->dc_table_index);
00253 }
00254 } else {
00255 put_bits(&s->pb, 1, s->use_skip_mb_code);
00256
00257 if(s->msmpeg4_version==4 && s->bit_rate>MBAC_BITRATE)
00258 put_bits(&s->pb, 1, s->per_mb_rl_table);
00259
00260 if(s->msmpeg4_version>2){
00261 if(!s->per_mb_rl_table)
00262 ff_msmpeg4_code012(&s->pb, s->rl_table_index);
00263
00264 put_bits(&s->pb, 1, s->dc_table_index);
00265
00266 put_bits(&s->pb, 1, s->mv_table_index);
00267 }
00268 }
00269
00270 s->esc3_level_length= 0;
00271 s->esc3_run_length= 0;
00272 }
00273
00274 void ff_msmpeg4_encode_ext_header(MpegEncContext * s)
00275 {
00276 unsigned fps = s->avctx->time_base.den / s->avctx->time_base.num / FFMAX(s->avctx->ticks_per_frame, 1);
00277 put_bits(&s->pb, 5, FFMIN(fps, 31));
00278
00279 put_bits(&s->pb, 11, FFMIN(s->bit_rate/1024, 2047));
00280
00281 if(s->msmpeg4_version>=3)
00282 put_bits(&s->pb, 1, s->flipflop_rounding);
00283 else
00284 av_assert0(s->flipflop_rounding==0);
00285 }
00286
00287 void ff_msmpeg4_encode_motion(MpegEncContext * s,
00288 int mx, int my)
00289 {
00290 int code;
00291 MVTable *mv;
00292
00293
00294
00295
00296 if (mx <= -64)
00297 mx += 64;
00298 else if (mx >= 64)
00299 mx -= 64;
00300 if (my <= -64)
00301 my += 64;
00302 else if (my >= 64)
00303 my -= 64;
00304
00305 mx += 32;
00306 my += 32;
00307 #if 0
00308 if ((unsigned)mx >= 64 ||
00309 (unsigned)my >= 64)
00310 av_log(s->avctx, AV_LOG_ERROR, "error mx=%d my=%d\n", mx, my);
00311 #endif
00312 mv = &ff_mv_tables[s->mv_table_index];
00313
00314 code = mv->table_mv_index[(mx << 6) | my];
00315 put_bits(&s->pb,
00316 mv->table_mv_bits[code],
00317 mv->table_mv_code[code]);
00318 if (code == mv->n) {
00319
00320 put_bits(&s->pb, 6, mx);
00321 put_bits(&s->pb, 6, my);
00322 }
00323 }
00324
00325 void ff_msmpeg4_handle_slices(MpegEncContext *s){
00326 if (s->mb_x == 0) {
00327 if (s->slice_height && (s->mb_y % s->slice_height) == 0) {
00328 if(s->msmpeg4_version < 4){
00329 ff_mpeg4_clean_buffers(s);
00330 }
00331 s->first_slice_line = 1;
00332 } else {
00333 s->first_slice_line = 0;
00334 }
00335 }
00336 }
00337
00338 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val)
00339 {
00340 int range, bit_size, sign, code, bits;
00341
00342 if (val == 0) {
00343
00344 code = 0;
00345 put_bits(&s->pb, ff_mvtab[code][1], ff_mvtab[code][0]);
00346 } else {
00347 bit_size = s->f_code - 1;
00348 range = 1 << bit_size;
00349 if (val <= -64)
00350 val += 64;
00351 else if (val >= 64)
00352 val -= 64;
00353
00354 if (val >= 0) {
00355 sign = 0;
00356 } else {
00357 val = -val;
00358 sign = 1;
00359 }
00360 val--;
00361 code = (val >> bit_size) + 1;
00362 bits = val & (range - 1);
00363
00364 put_bits(&s->pb, ff_mvtab[code][1] + 1, (ff_mvtab[code][0] << 1) | sign);
00365 if (bit_size > 0) {
00366 put_bits(&s->pb, bit_size, bits);
00367 }
00368 }
00369 }
00370
00371 void ff_msmpeg4_encode_mb(MpegEncContext * s,
00372 DCTELEM block[6][64],
00373 int motion_x, int motion_y)
00374 {
00375 int cbp, coded_cbp, i;
00376 int pred_x, pred_y;
00377 uint8_t *coded_block;
00378
00379 ff_msmpeg4_handle_slices(s);
00380
00381 if (!s->mb_intra) {
00382
00383 cbp = 0;
00384 for (i = 0; i < 6; i++) {
00385 if (s->block_last_index[i] >= 0)
00386 cbp |= 1 << (5 - i);
00387 }
00388 if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) {
00389
00390 put_bits(&s->pb, 1, 1);
00391 s->last_bits++;
00392 s->misc_bits++;
00393 s->skip_count++;
00394
00395 return;
00396 }
00397 if (s->use_skip_mb_code)
00398 put_bits(&s->pb, 1, 0);
00399
00400 if(s->msmpeg4_version<=2){
00401 put_bits(&s->pb,
00402 ff_v2_mb_type[cbp&3][1],
00403 ff_v2_mb_type[cbp&3][0]);
00404 if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C;
00405 else coded_cbp= cbp;
00406
00407 put_bits(&s->pb,
00408 ff_h263_cbpy_tab[coded_cbp>>2][1],
00409 ff_h263_cbpy_tab[coded_cbp>>2][0]);
00410
00411 s->misc_bits += get_bits_diff(s);
00412
00413 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
00414 msmpeg4v2_encode_motion(s, motion_x - pred_x);
00415 msmpeg4v2_encode_motion(s, motion_y - pred_y);
00416 }else{
00417 put_bits(&s->pb,
00418 ff_table_mb_non_intra[cbp + 64][1],
00419 ff_table_mb_non_intra[cbp + 64][0]);
00420
00421 s->misc_bits += get_bits_diff(s);
00422
00423
00424 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
00425 ff_msmpeg4_encode_motion(s, motion_x - pred_x,
00426 motion_y - pred_y);
00427 }
00428
00429 s->mv_bits += get_bits_diff(s);
00430
00431 for (i = 0; i < 6; i++) {
00432 ff_msmpeg4_encode_block(s, block[i], i);
00433 }
00434 s->p_tex_bits += get_bits_diff(s);
00435 } else {
00436
00437 cbp = 0;
00438 coded_cbp = 0;
00439 for (i = 0; i < 6; i++) {
00440 int val, pred;
00441 val = (s->block_last_index[i] >= 1);
00442 cbp |= val << (5 - i);
00443 if (i < 4) {
00444
00445 pred = ff_msmpeg4_coded_block_pred(s, i, &coded_block);
00446 *coded_block = val;
00447 val = val ^ pred;
00448 }
00449 coded_cbp |= val << (5 - i);
00450 }
00451
00452 if(s->msmpeg4_version<=2){
00453 if (s->pict_type == AV_PICTURE_TYPE_I) {
00454 put_bits(&s->pb,
00455 ff_v2_intra_cbpc[cbp&3][1], ff_v2_intra_cbpc[cbp&3][0]);
00456 } else {
00457 if (s->use_skip_mb_code)
00458 put_bits(&s->pb, 1, 0);
00459 put_bits(&s->pb,
00460 ff_v2_mb_type[(cbp&3) + 4][1],
00461 ff_v2_mb_type[(cbp&3) + 4][0]);
00462 }
00463 put_bits(&s->pb, 1, 0);
00464 put_bits(&s->pb,
00465 ff_h263_cbpy_tab[cbp>>2][1],
00466 ff_h263_cbpy_tab[cbp>>2][0]);
00467 }else{
00468 if (s->pict_type == AV_PICTURE_TYPE_I) {
00469 put_bits(&s->pb,
00470 ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]);
00471 } else {
00472 if (s->use_skip_mb_code)
00473 put_bits(&s->pb, 1, 0);
00474 put_bits(&s->pb,
00475 ff_table_mb_non_intra[cbp][1],
00476 ff_table_mb_non_intra[cbp][0]);
00477 }
00478 put_bits(&s->pb, 1, 0);
00479 if(s->inter_intra_pred){
00480 s->h263_aic_dir=0;
00481 put_bits(&s->pb, ff_table_inter_intra[s->h263_aic_dir][1], ff_table_inter_intra[s->h263_aic_dir][0]);
00482 }
00483 }
00484 s->misc_bits += get_bits_diff(s);
00485
00486 for (i = 0; i < 6; i++) {
00487 ff_msmpeg4_encode_block(s, block[i], i);
00488 }
00489 s->i_tex_bits += get_bits_diff(s);
00490 s->i_count++;
00491 }
00492 }
00493
00494 static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
00495 {
00496 int sign, code;
00497 int pred, extquant;
00498 int extrabits = 0;
00499
00500 int16_t *dc_val;
00501 pred = ff_msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
00502
00503
00504 if (n < 4) {
00505 *dc_val = level * s->y_dc_scale;
00506 } else {
00507 *dc_val = level * s->c_dc_scale;
00508 }
00509
00510
00511 level -= pred;
00512
00513 if(s->msmpeg4_version<=2){
00514 if (n < 4) {
00515 put_bits(&s->pb,
00516 ff_v2_dc_lum_table[level + 256][1],
00517 ff_v2_dc_lum_table[level + 256][0]);
00518 }else{
00519 put_bits(&s->pb,
00520 ff_v2_dc_chroma_table[level + 256][1],
00521 ff_v2_dc_chroma_table[level + 256][0]);
00522 }
00523 }else{
00524 sign = 0;
00525 if (level < 0) {
00526 level = -level;
00527 sign = 1;
00528 }
00529 code = level;
00530 if (code > DC_MAX)
00531 code = DC_MAX;
00532 else if( s->msmpeg4_version>=6 ) {
00533 if( s->qscale == 1 ) {
00534 extquant = (level + 3) & 0x3;
00535 code = ((level+3)>>2);
00536 } else if( s->qscale == 2 ) {
00537 extquant = (level + 1) & 0x1;
00538 code = ((level+1)>>1);
00539 }
00540 }
00541
00542 if (s->dc_table_index == 0) {
00543 if (n < 4) {
00544 put_bits(&s->pb, ff_table0_dc_lum[code][1], ff_table0_dc_lum[code][0]);
00545 } else {
00546 put_bits(&s->pb, ff_table0_dc_chroma[code][1], ff_table0_dc_chroma[code][0]);
00547 }
00548 } else {
00549 if (n < 4) {
00550 put_bits(&s->pb, ff_table1_dc_lum[code][1], ff_table1_dc_lum[code][0]);
00551 } else {
00552 put_bits(&s->pb, ff_table1_dc_chroma[code][1], ff_table1_dc_chroma[code][0]);
00553 }
00554 }
00555
00556 if(s->msmpeg4_version>=6 && s->qscale<=2)
00557 extrabits = 3 - s->qscale;
00558
00559 if (code == DC_MAX)
00560 put_bits(&s->pb, 8 + extrabits, level);
00561 else if(extrabits > 0)
00562 put_bits(&s->pb, extrabits, extquant);
00563
00564 if (level != 0) {
00565 put_bits(&s->pb, 1, sign);
00566 }
00567 }
00568 }
00569
00570
00571
00572
00573 void ff_msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
00574 {
00575 int level, run, last, i, j, last_index;
00576 int last_non_zero, sign, slevel;
00577 int code, run_diff, dc_pred_dir;
00578 const RLTable *rl;
00579 const uint8_t *scantable;
00580
00581 if (s->mb_intra) {
00582 msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
00583 i = 1;
00584 if (n < 4) {
00585 rl = &ff_rl_table[s->rl_table_index];
00586 } else {
00587 rl = &ff_rl_table[3 + s->rl_chroma_table_index];
00588 }
00589 run_diff = s->msmpeg4_version>=4;
00590 scantable= s->intra_scantable.permutated;
00591 } else {
00592 i = 0;
00593 rl = &ff_rl_table[3 + s->rl_table_index];
00594 if(s->msmpeg4_version<=2)
00595 run_diff = 0;
00596 else
00597 run_diff = 1;
00598 scantable= s->inter_scantable.permutated;
00599 }
00600
00601
00602 if(s->msmpeg4_version>=4 && s->msmpeg4_version<6 && s->block_last_index[n]>0){
00603 for(last_index=63; last_index>=0; last_index--){
00604 if(block[scantable[last_index]]) break;
00605 }
00606 s->block_last_index[n]= last_index;
00607 }else
00608 last_index = s->block_last_index[n];
00609
00610 last_non_zero = i - 1;
00611 for (; i <= last_index; i++) {
00612 j = scantable[i];
00613 level = block[j];
00614 if (level) {
00615 run = i - last_non_zero - 1;
00616 last = (i == last_index);
00617 sign = 0;
00618 slevel = level;
00619 if (level < 0) {
00620 sign = 1;
00621 level = -level;
00622 }
00623
00624 if(level<=MAX_LEVEL && run<=MAX_RUN){
00625 s->ac_stats[s->mb_intra][n>3][level][run][last]++;
00626 }
00627
00628 s->ac_stats[s->mb_intra][n > 3][40][63][0]++;
00629
00630 code = get_rl_index(rl, last, run, level);
00631 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
00632 if (code == rl->n) {
00633 int level1, run1;
00634
00635 level1 = level - rl->max_level[last][run];
00636 if (level1 < 1)
00637 goto esc2;
00638 code = get_rl_index(rl, last, run, level1);
00639 if (code == rl->n) {
00640 esc2:
00641 put_bits(&s->pb, 1, 0);
00642 if (level > MAX_LEVEL)
00643 goto esc3;
00644 run1 = run - rl->max_run[last][level] - run_diff;
00645 if (run1 < 0)
00646 goto esc3;
00647 code = get_rl_index(rl, last, run1+1, level);
00648 if (s->msmpeg4_version == 4 && code == rl->n)
00649 goto esc3;
00650 code = get_rl_index(rl, last, run1, level);
00651 if (code == rl->n) {
00652 esc3:
00653
00654 put_bits(&s->pb, 1, 0);
00655 put_bits(&s->pb, 1, last);
00656 if(s->msmpeg4_version>=4){
00657 if(s->esc3_level_length==0){
00658 s->esc3_level_length=8;
00659 s->esc3_run_length= 6;
00660
00661 if(s->qscale<8)
00662 put_bits(&s->pb, 6 + (s->msmpeg4_version>=6), 3);
00663 else
00664 put_bits(&s->pb, 8, 3);
00665 }
00666 put_bits(&s->pb, s->esc3_run_length, run);
00667 put_bits(&s->pb, 1, sign);
00668 put_bits(&s->pb, s->esc3_level_length, level);
00669 }else{
00670 put_bits(&s->pb, 6, run);
00671 put_sbits(&s->pb, 8, slevel);
00672 }
00673 } else {
00674
00675 put_bits(&s->pb, 1, 1);
00676 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
00677 put_bits(&s->pb, 1, sign);
00678 }
00679 } else {
00680
00681 put_bits(&s->pb, 1, 1);
00682 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
00683 put_bits(&s->pb, 1, sign);
00684 }
00685 } else {
00686 put_bits(&s->pb, 1, sign);
00687 }
00688 last_non_zero = i;
00689 }
00690 }
00691 }