annotate ffmpeg/libavcodec/msmpeg4enc.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * MSMPEG4 encoder backend
yading@10 3 * Copyright (c) 2001 Fabrice Bellard
yading@10 4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
yading@10 5 *
yading@10 6 * msmpeg4v1 & v2 stuff by Michael Niedermayer <michaelni@gmx.at>
yading@10 7 *
yading@10 8 * This file is part of FFmpeg.
yading@10 9 *
yading@10 10 * FFmpeg is free software; you can redistribute it and/or
yading@10 11 * modify it under the terms of the GNU Lesser General Public
yading@10 12 * License as published by the Free Software Foundation; either
yading@10 13 * version 2.1 of the License, or (at your option) any later version.
yading@10 14 *
yading@10 15 * FFmpeg is distributed in the hope that it will be useful,
yading@10 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 18 * Lesser General Public License for more details.
yading@10 19 *
yading@10 20 * You should have received a copy of the GNU Lesser General Public
yading@10 21 * License along with FFmpeg; if not, write to the Free Software
yading@10 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 23 */
yading@10 24
yading@10 25 /**
yading@10 26 * @file
yading@10 27 * MSMPEG4 encoder backend
yading@10 28 */
yading@10 29
yading@10 30 #include <stdint.h>
yading@10 31 #include <string.h>
yading@10 32
yading@10 33 #include "libavutil/avutil.h"
yading@10 34 #include "libavutil/mem.h"
yading@10 35 #include "mpegvideo.h"
yading@10 36 #include "msmpeg4.h"
yading@10 37 #include "h263.h"
yading@10 38 #include "mpeg4video.h"
yading@10 39 #include "msmpeg4.h"
yading@10 40 #include "msmpeg4data.h"
yading@10 41 #include "put_bits.h"
yading@10 42 #include "rl.h"
yading@10 43 #include "vc1data.h"
yading@10 44
yading@10 45 static uint8_t rl_length[NB_RL_TABLES][MAX_LEVEL+1][MAX_RUN+1][2];
yading@10 46
yading@10 47 /* build the table which associate a (x,y) motion vector to a vlc */
yading@10 48 static void init_mv_table(MVTable *tab)
yading@10 49 {
yading@10 50 int i, x, y;
yading@10 51
yading@10 52 tab->table_mv_index = av_malloc(sizeof(uint16_t) * 4096);
yading@10 53 /* mark all entries as not used */
yading@10 54 for(i=0;i<4096;i++)
yading@10 55 tab->table_mv_index[i] = tab->n;
yading@10 56
yading@10 57 for(i=0;i<tab->n;i++) {
yading@10 58 x = tab->table_mvx[i];
yading@10 59 y = tab->table_mvy[i];
yading@10 60 tab->table_mv_index[(x << 6) | y] = i;
yading@10 61 }
yading@10 62 }
yading@10 63
yading@10 64 void ff_msmpeg4_code012(PutBitContext *pb, int n)
yading@10 65 {
yading@10 66 if (n == 0) {
yading@10 67 put_bits(pb, 1, 0);
yading@10 68 } else {
yading@10 69 put_bits(pb, 1, 1);
yading@10 70 put_bits(pb, 1, (n >= 2));
yading@10 71 }
yading@10 72 }
yading@10 73
yading@10 74 static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra){
yading@10 75 int size=0;
yading@10 76 int code;
yading@10 77 int run_diff= intra ? 0 : 1;
yading@10 78
yading@10 79 code = get_rl_index(rl, last, run, level);
yading@10 80 size+= rl->table_vlc[code][1];
yading@10 81 if (code == rl->n) {
yading@10 82 int level1, run1;
yading@10 83
yading@10 84 level1 = level - rl->max_level[last][run];
yading@10 85 if (level1 < 1)
yading@10 86 goto esc2;
yading@10 87 code = get_rl_index(rl, last, run, level1);
yading@10 88 if (code == rl->n) {
yading@10 89 esc2:
yading@10 90 size++;
yading@10 91 if (level > MAX_LEVEL)
yading@10 92 goto esc3;
yading@10 93 run1 = run - rl->max_run[last][level] - run_diff;
yading@10 94 if (run1 < 0)
yading@10 95 goto esc3;
yading@10 96 code = get_rl_index(rl, last, run1, level);
yading@10 97 if (code == rl->n) {
yading@10 98 esc3:
yading@10 99 /* third escape */
yading@10 100 size+=1+1+6+8;
yading@10 101 } else {
yading@10 102 /* second escape */
yading@10 103 size+= 1+1+ rl->table_vlc[code][1];
yading@10 104 }
yading@10 105 } else {
yading@10 106 /* first escape */
yading@10 107 size+= 1+1+ rl->table_vlc[code][1];
yading@10 108 }
yading@10 109 } else {
yading@10 110 size++;
yading@10 111 }
yading@10 112 return size;
yading@10 113 }
yading@10 114
yading@10 115 av_cold void ff_msmpeg4_encode_init(MpegEncContext *s)
yading@10 116 {
yading@10 117 static int init_done=0;
yading@10 118 int i;
yading@10 119
yading@10 120 ff_msmpeg4_common_init(s);
yading@10 121 if(s->msmpeg4_version>=4){
yading@10 122 s->min_qcoeff= -255;
yading@10 123 s->max_qcoeff= 255;
yading@10 124 }
yading@10 125
yading@10 126 if (!init_done) {
yading@10 127 /* init various encoding tables */
yading@10 128 init_done = 1;
yading@10 129 init_mv_table(&ff_mv_tables[0]);
yading@10 130 init_mv_table(&ff_mv_tables[1]);
yading@10 131 for(i=0;i<NB_RL_TABLES;i++)
yading@10 132 ff_init_rl(&ff_rl_table[i], ff_static_rl_table_store[i]);
yading@10 133
yading@10 134 for(i=0; i<NB_RL_TABLES; i++){
yading@10 135 int level;
yading@10 136 for (level = 1; level <= MAX_LEVEL; level++) {
yading@10 137 int run;
yading@10 138 for(run=0; run<=MAX_RUN; run++){
yading@10 139 int last;
yading@10 140 for(last=0; last<2; last++){
yading@10 141 rl_length[i][level][run][last]= get_size_of_code(s, &ff_rl_table[ i], last, run, level, 0);
yading@10 142 }
yading@10 143 }
yading@10 144 }
yading@10 145 }
yading@10 146 }
yading@10 147 }
yading@10 148
yading@10 149 static void find_best_tables(MpegEncContext * s)
yading@10 150 {
yading@10 151 int i;
yading@10 152 int best = 0, best_size = INT_MAX;
yading@10 153 int chroma_best = 0, best_chroma_size = INT_MAX;
yading@10 154
yading@10 155 for(i=0; i<3; i++){
yading@10 156 int level;
yading@10 157 int chroma_size=0;
yading@10 158 int size=0;
yading@10 159
yading@10 160 if(i>0){// ;)
yading@10 161 size++;
yading@10 162 chroma_size++;
yading@10 163 }
yading@10 164 for(level=0; level<=MAX_LEVEL; level++){
yading@10 165 int run;
yading@10 166 for(run=0; run<=MAX_RUN; run++){
yading@10 167 int last;
yading@10 168 const int last_size= size + chroma_size;
yading@10 169 for(last=0; last<2; last++){
yading@10 170 int inter_count = s->ac_stats[0][0][level][run][last] + s->ac_stats[0][1][level][run][last];
yading@10 171 int intra_luma_count = s->ac_stats[1][0][level][run][last];
yading@10 172 int intra_chroma_count= s->ac_stats[1][1][level][run][last];
yading@10 173
yading@10 174 if(s->pict_type==AV_PICTURE_TYPE_I){
yading@10 175 size += intra_luma_count *rl_length[i ][level][run][last];
yading@10 176 chroma_size+= intra_chroma_count*rl_length[i+3][level][run][last];
yading@10 177 }else{
yading@10 178 size+= intra_luma_count *rl_length[i ][level][run][last]
yading@10 179 +intra_chroma_count*rl_length[i+3][level][run][last]
yading@10 180 +inter_count *rl_length[i+3][level][run][last];
yading@10 181 }
yading@10 182 }
yading@10 183 if(last_size == size+chroma_size) break;
yading@10 184 }
yading@10 185 }
yading@10 186 if(size<best_size){
yading@10 187 best_size= size;
yading@10 188 best= i;
yading@10 189 }
yading@10 190 if(chroma_size<best_chroma_size){
yading@10 191 best_chroma_size= chroma_size;
yading@10 192 chroma_best= i;
yading@10 193 }
yading@10 194 }
yading@10 195
yading@10 196 if(s->pict_type==AV_PICTURE_TYPE_P) chroma_best= best;
yading@10 197
yading@10 198 memset(s->ac_stats, 0, sizeof(int)*(MAX_LEVEL+1)*(MAX_RUN+1)*2*2*2);
yading@10 199
yading@10 200 s->rl_table_index = best;
yading@10 201 s->rl_chroma_table_index= chroma_best;
yading@10 202
yading@10 203 if(s->pict_type != s->last_non_b_pict_type){
yading@10 204 s->rl_table_index= 2;
yading@10 205 if(s->pict_type==AV_PICTURE_TYPE_I)
yading@10 206 s->rl_chroma_table_index= 1;
yading@10 207 else
yading@10 208 s->rl_chroma_table_index= 2;
yading@10 209 }
yading@10 210
yading@10 211 }
yading@10 212
yading@10 213 /* write MSMPEG4 compatible frame header */
yading@10 214 void ff_msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
yading@10 215 {
yading@10 216 find_best_tables(s);
yading@10 217
yading@10 218 avpriv_align_put_bits(&s->pb);
yading@10 219 put_bits(&s->pb, 2, s->pict_type - 1);
yading@10 220
yading@10 221 put_bits(&s->pb, 5, s->qscale);
yading@10 222 if(s->msmpeg4_version<=2){
yading@10 223 s->rl_table_index = 2;
yading@10 224 s->rl_chroma_table_index = 2;
yading@10 225 }
yading@10 226
yading@10 227 s->dc_table_index = 1;
yading@10 228 s->mv_table_index = 1; /* only if P frame */
yading@10 229 s->use_skip_mb_code = 1; /* only if P frame */
yading@10 230 s->per_mb_rl_table = 0;
yading@10 231 if(s->msmpeg4_version==4)
yading@10 232 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE && s->pict_type==AV_PICTURE_TYPE_P);
yading@10 233 av_dlog(s, "%d %d %d %d %d\n", s->pict_type, s->bit_rate,
yading@10 234 s->inter_intra_pred, s->width, s->height);
yading@10 235
yading@10 236 if (s->pict_type == AV_PICTURE_TYPE_I) {
yading@10 237 s->slice_height= s->mb_height/1;
yading@10 238 put_bits(&s->pb, 5, 0x16 + s->mb_height/s->slice_height);
yading@10 239
yading@10 240 if(s->msmpeg4_version==4){
yading@10 241 ff_msmpeg4_encode_ext_header(s);
yading@10 242 if(s->bit_rate>MBAC_BITRATE)
yading@10 243 put_bits(&s->pb, 1, s->per_mb_rl_table);
yading@10 244 }
yading@10 245
yading@10 246 if(s->msmpeg4_version>2){
yading@10 247 if(!s->per_mb_rl_table){
yading@10 248 ff_msmpeg4_code012(&s->pb, s->rl_chroma_table_index);
yading@10 249 ff_msmpeg4_code012(&s->pb, s->rl_table_index);
yading@10 250 }
yading@10 251
yading@10 252 put_bits(&s->pb, 1, s->dc_table_index);
yading@10 253 }
yading@10 254 } else {
yading@10 255 put_bits(&s->pb, 1, s->use_skip_mb_code);
yading@10 256
yading@10 257 if(s->msmpeg4_version==4 && s->bit_rate>MBAC_BITRATE)
yading@10 258 put_bits(&s->pb, 1, s->per_mb_rl_table);
yading@10 259
yading@10 260 if(s->msmpeg4_version>2){
yading@10 261 if(!s->per_mb_rl_table)
yading@10 262 ff_msmpeg4_code012(&s->pb, s->rl_table_index);
yading@10 263
yading@10 264 put_bits(&s->pb, 1, s->dc_table_index);
yading@10 265
yading@10 266 put_bits(&s->pb, 1, s->mv_table_index);
yading@10 267 }
yading@10 268 }
yading@10 269
yading@10 270 s->esc3_level_length= 0;
yading@10 271 s->esc3_run_length= 0;
yading@10 272 }
yading@10 273
yading@10 274 void ff_msmpeg4_encode_ext_header(MpegEncContext * s)
yading@10 275 {
yading@10 276 unsigned fps = s->avctx->time_base.den / s->avctx->time_base.num / FFMAX(s->avctx->ticks_per_frame, 1);
yading@10 277 put_bits(&s->pb, 5, FFMIN(fps, 31)); //yes 29.97 -> 29
yading@10 278
yading@10 279 put_bits(&s->pb, 11, FFMIN(s->bit_rate/1024, 2047));
yading@10 280
yading@10 281 if(s->msmpeg4_version>=3)
yading@10 282 put_bits(&s->pb, 1, s->flipflop_rounding);
yading@10 283 else
yading@10 284 av_assert0(s->flipflop_rounding==0);
yading@10 285 }
yading@10 286
yading@10 287 void ff_msmpeg4_encode_motion(MpegEncContext * s,
yading@10 288 int mx, int my)
yading@10 289 {
yading@10 290 int code;
yading@10 291 MVTable *mv;
yading@10 292
yading@10 293 /* modulo encoding */
yading@10 294 /* WARNING : you cannot reach all the MVs even with the modulo
yading@10 295 encoding. This is a somewhat strange compromise they took !!! */
yading@10 296 if (mx <= -64)
yading@10 297 mx += 64;
yading@10 298 else if (mx >= 64)
yading@10 299 mx -= 64;
yading@10 300 if (my <= -64)
yading@10 301 my += 64;
yading@10 302 else if (my >= 64)
yading@10 303 my -= 64;
yading@10 304
yading@10 305 mx += 32;
yading@10 306 my += 32;
yading@10 307 #if 0
yading@10 308 if ((unsigned)mx >= 64 ||
yading@10 309 (unsigned)my >= 64)
yading@10 310 av_log(s->avctx, AV_LOG_ERROR, "error mx=%d my=%d\n", mx, my);
yading@10 311 #endif
yading@10 312 mv = &ff_mv_tables[s->mv_table_index];
yading@10 313
yading@10 314 code = mv->table_mv_index[(mx << 6) | my];
yading@10 315 put_bits(&s->pb,
yading@10 316 mv->table_mv_bits[code],
yading@10 317 mv->table_mv_code[code]);
yading@10 318 if (code == mv->n) {
yading@10 319 /* escape : code literally */
yading@10 320 put_bits(&s->pb, 6, mx);
yading@10 321 put_bits(&s->pb, 6, my);
yading@10 322 }
yading@10 323 }
yading@10 324
yading@10 325 void ff_msmpeg4_handle_slices(MpegEncContext *s){
yading@10 326 if (s->mb_x == 0) {
yading@10 327 if (s->slice_height && (s->mb_y % s->slice_height) == 0) {
yading@10 328 if(s->msmpeg4_version < 4){
yading@10 329 ff_mpeg4_clean_buffers(s);
yading@10 330 }
yading@10 331 s->first_slice_line = 1;
yading@10 332 } else {
yading@10 333 s->first_slice_line = 0;
yading@10 334 }
yading@10 335 }
yading@10 336 }
yading@10 337
yading@10 338 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val)
yading@10 339 {
yading@10 340 int range, bit_size, sign, code, bits;
yading@10 341
yading@10 342 if (val == 0) {
yading@10 343 /* zero vector */
yading@10 344 code = 0;
yading@10 345 put_bits(&s->pb, ff_mvtab[code][1], ff_mvtab[code][0]);
yading@10 346 } else {
yading@10 347 bit_size = s->f_code - 1;
yading@10 348 range = 1 << bit_size;
yading@10 349 if (val <= -64)
yading@10 350 val += 64;
yading@10 351 else if (val >= 64)
yading@10 352 val -= 64;
yading@10 353
yading@10 354 if (val >= 0) {
yading@10 355 sign = 0;
yading@10 356 } else {
yading@10 357 val = -val;
yading@10 358 sign = 1;
yading@10 359 }
yading@10 360 val--;
yading@10 361 code = (val >> bit_size) + 1;
yading@10 362 bits = val & (range - 1);
yading@10 363
yading@10 364 put_bits(&s->pb, ff_mvtab[code][1] + 1, (ff_mvtab[code][0] << 1) | sign);
yading@10 365 if (bit_size > 0) {
yading@10 366 put_bits(&s->pb, bit_size, bits);
yading@10 367 }
yading@10 368 }
yading@10 369 }
yading@10 370
yading@10 371 void ff_msmpeg4_encode_mb(MpegEncContext * s,
yading@10 372 int16_t block[6][64],
yading@10 373 int motion_x, int motion_y)
yading@10 374 {
yading@10 375 int cbp, coded_cbp, i;
yading@10 376 int pred_x, pred_y;
yading@10 377 uint8_t *coded_block;
yading@10 378
yading@10 379 ff_msmpeg4_handle_slices(s);
yading@10 380
yading@10 381 if (!s->mb_intra) {
yading@10 382 /* compute cbp */
yading@10 383 cbp = 0;
yading@10 384 for (i = 0; i < 6; i++) {
yading@10 385 if (s->block_last_index[i] >= 0)
yading@10 386 cbp |= 1 << (5 - i);
yading@10 387 }
yading@10 388 if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) {
yading@10 389 /* skip macroblock */
yading@10 390 put_bits(&s->pb, 1, 1);
yading@10 391 s->last_bits++;
yading@10 392 s->misc_bits++;
yading@10 393 s->skip_count++;
yading@10 394
yading@10 395 return;
yading@10 396 }
yading@10 397 if (s->use_skip_mb_code)
yading@10 398 put_bits(&s->pb, 1, 0); /* mb coded */
yading@10 399
yading@10 400 if(s->msmpeg4_version<=2){
yading@10 401 put_bits(&s->pb,
yading@10 402 ff_v2_mb_type[cbp&3][1],
yading@10 403 ff_v2_mb_type[cbp&3][0]);
yading@10 404 if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C;
yading@10 405 else coded_cbp= cbp;
yading@10 406
yading@10 407 put_bits(&s->pb,
yading@10 408 ff_h263_cbpy_tab[coded_cbp>>2][1],
yading@10 409 ff_h263_cbpy_tab[coded_cbp>>2][0]);
yading@10 410
yading@10 411 s->misc_bits += get_bits_diff(s);
yading@10 412
yading@10 413 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
yading@10 414 msmpeg4v2_encode_motion(s, motion_x - pred_x);
yading@10 415 msmpeg4v2_encode_motion(s, motion_y - pred_y);
yading@10 416 }else{
yading@10 417 put_bits(&s->pb,
yading@10 418 ff_table_mb_non_intra[cbp + 64][1],
yading@10 419 ff_table_mb_non_intra[cbp + 64][0]);
yading@10 420
yading@10 421 s->misc_bits += get_bits_diff(s);
yading@10 422
yading@10 423 /* motion vector */
yading@10 424 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
yading@10 425 ff_msmpeg4_encode_motion(s, motion_x - pred_x,
yading@10 426 motion_y - pred_y);
yading@10 427 }
yading@10 428
yading@10 429 s->mv_bits += get_bits_diff(s);
yading@10 430
yading@10 431 for (i = 0; i < 6; i++) {
yading@10 432 ff_msmpeg4_encode_block(s, block[i], i);
yading@10 433 }
yading@10 434 s->p_tex_bits += get_bits_diff(s);
yading@10 435 } else {
yading@10 436 /* compute cbp */
yading@10 437 cbp = 0;
yading@10 438 coded_cbp = 0;
yading@10 439 for (i = 0; i < 6; i++) {
yading@10 440 int val, pred;
yading@10 441 val = (s->block_last_index[i] >= 1);
yading@10 442 cbp |= val << (5 - i);
yading@10 443 if (i < 4) {
yading@10 444 /* predict value for close blocks only for luma */
yading@10 445 pred = ff_msmpeg4_coded_block_pred(s, i, &coded_block);
yading@10 446 *coded_block = val;
yading@10 447 val = val ^ pred;
yading@10 448 }
yading@10 449 coded_cbp |= val << (5 - i);
yading@10 450 }
yading@10 451
yading@10 452 if(s->msmpeg4_version<=2){
yading@10 453 if (s->pict_type == AV_PICTURE_TYPE_I) {
yading@10 454 put_bits(&s->pb,
yading@10 455 ff_v2_intra_cbpc[cbp&3][1], ff_v2_intra_cbpc[cbp&3][0]);
yading@10 456 } else {
yading@10 457 if (s->use_skip_mb_code)
yading@10 458 put_bits(&s->pb, 1, 0); /* mb coded */
yading@10 459 put_bits(&s->pb,
yading@10 460 ff_v2_mb_type[(cbp&3) + 4][1],
yading@10 461 ff_v2_mb_type[(cbp&3) + 4][0]);
yading@10 462 }
yading@10 463 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
yading@10 464 put_bits(&s->pb,
yading@10 465 ff_h263_cbpy_tab[cbp>>2][1],
yading@10 466 ff_h263_cbpy_tab[cbp>>2][0]);
yading@10 467 }else{
yading@10 468 if (s->pict_type == AV_PICTURE_TYPE_I) {
yading@10 469 put_bits(&s->pb,
yading@10 470 ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]);
yading@10 471 } else {
yading@10 472 if (s->use_skip_mb_code)
yading@10 473 put_bits(&s->pb, 1, 0); /* mb coded */
yading@10 474 put_bits(&s->pb,
yading@10 475 ff_table_mb_non_intra[cbp][1],
yading@10 476 ff_table_mb_non_intra[cbp][0]);
yading@10 477 }
yading@10 478 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
yading@10 479 if(s->inter_intra_pred){
yading@10 480 s->h263_aic_dir=0;
yading@10 481 put_bits(&s->pb, ff_table_inter_intra[s->h263_aic_dir][1], ff_table_inter_intra[s->h263_aic_dir][0]);
yading@10 482 }
yading@10 483 }
yading@10 484 s->misc_bits += get_bits_diff(s);
yading@10 485
yading@10 486 for (i = 0; i < 6; i++) {
yading@10 487 ff_msmpeg4_encode_block(s, block[i], i);
yading@10 488 }
yading@10 489 s->i_tex_bits += get_bits_diff(s);
yading@10 490 s->i_count++;
yading@10 491 }
yading@10 492 }
yading@10 493
yading@10 494 static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
yading@10 495 {
yading@10 496 int sign, code;
yading@10 497 int pred, av_uninit(extquant);
yading@10 498 int extrabits = 0;
yading@10 499
yading@10 500 int16_t *dc_val;
yading@10 501 pred = ff_msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
yading@10 502
yading@10 503 /* update predictor */
yading@10 504 if (n < 4) {
yading@10 505 *dc_val = level * s->y_dc_scale;
yading@10 506 } else {
yading@10 507 *dc_val = level * s->c_dc_scale;
yading@10 508 }
yading@10 509
yading@10 510 /* do the prediction */
yading@10 511 level -= pred;
yading@10 512
yading@10 513 if(s->msmpeg4_version<=2){
yading@10 514 if (n < 4) {
yading@10 515 put_bits(&s->pb,
yading@10 516 ff_v2_dc_lum_table[level + 256][1],
yading@10 517 ff_v2_dc_lum_table[level + 256][0]);
yading@10 518 }else{
yading@10 519 put_bits(&s->pb,
yading@10 520 ff_v2_dc_chroma_table[level + 256][1],
yading@10 521 ff_v2_dc_chroma_table[level + 256][0]);
yading@10 522 }
yading@10 523 }else{
yading@10 524 sign = 0;
yading@10 525 if (level < 0) {
yading@10 526 level = -level;
yading@10 527 sign = 1;
yading@10 528 }
yading@10 529 code = level;
yading@10 530 if (code > DC_MAX)
yading@10 531 code = DC_MAX;
yading@10 532 else if( s->msmpeg4_version>=6 ) {
yading@10 533 if( s->qscale == 1 ) {
yading@10 534 extquant = (level + 3) & 0x3;
yading@10 535 code = ((level+3)>>2);
yading@10 536 } else if( s->qscale == 2 ) {
yading@10 537 extquant = (level + 1) & 0x1;
yading@10 538 code = ((level+1)>>1);
yading@10 539 }
yading@10 540 }
yading@10 541
yading@10 542 if (s->dc_table_index == 0) {
yading@10 543 if (n < 4) {
yading@10 544 put_bits(&s->pb, ff_table0_dc_lum[code][1], ff_table0_dc_lum[code][0]);
yading@10 545 } else {
yading@10 546 put_bits(&s->pb, ff_table0_dc_chroma[code][1], ff_table0_dc_chroma[code][0]);
yading@10 547 }
yading@10 548 } else {
yading@10 549 if (n < 4) {
yading@10 550 put_bits(&s->pb, ff_table1_dc_lum[code][1], ff_table1_dc_lum[code][0]);
yading@10 551 } else {
yading@10 552 put_bits(&s->pb, ff_table1_dc_chroma[code][1], ff_table1_dc_chroma[code][0]);
yading@10 553 }
yading@10 554 }
yading@10 555
yading@10 556 if(s->msmpeg4_version>=6 && s->qscale<=2)
yading@10 557 extrabits = 3 - s->qscale;
yading@10 558
yading@10 559 if (code == DC_MAX)
yading@10 560 put_bits(&s->pb, 8 + extrabits, level);
yading@10 561 else if(extrabits > 0)//== VC1 && s->qscale<=2
yading@10 562 put_bits(&s->pb, extrabits, extquant);
yading@10 563
yading@10 564 if (level != 0) {
yading@10 565 put_bits(&s->pb, 1, sign);
yading@10 566 }
yading@10 567 }
yading@10 568 }
yading@10 569
yading@10 570 /* Encoding of a block. Very similar to MPEG4 except for a different
yading@10 571 escape coding (same as H263) and more vlc tables.
yading@10 572 */
yading@10 573 void ff_msmpeg4_encode_block(MpegEncContext * s, int16_t * block, int n)
yading@10 574 {
yading@10 575 int level, run, last, i, j, last_index;
yading@10 576 int last_non_zero, sign, slevel;
yading@10 577 int code, run_diff, dc_pred_dir;
yading@10 578 const RLTable *rl;
yading@10 579 const uint8_t *scantable;
yading@10 580
yading@10 581 if (s->mb_intra) {
yading@10 582 msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
yading@10 583 i = 1;
yading@10 584 if (n < 4) {
yading@10 585 rl = &ff_rl_table[s->rl_table_index];
yading@10 586 } else {
yading@10 587 rl = &ff_rl_table[3 + s->rl_chroma_table_index];
yading@10 588 }
yading@10 589 run_diff = s->msmpeg4_version>=4;
yading@10 590 scantable= s->intra_scantable.permutated;
yading@10 591 } else {
yading@10 592 i = 0;
yading@10 593 rl = &ff_rl_table[3 + s->rl_table_index];
yading@10 594 if(s->msmpeg4_version<=2)
yading@10 595 run_diff = 0;
yading@10 596 else
yading@10 597 run_diff = 1;
yading@10 598 scantable= s->inter_scantable.permutated;
yading@10 599 }
yading@10 600
yading@10 601 /* recalculate block_last_index for M$ wmv1 */
yading@10 602 if(s->msmpeg4_version>=4 && s->msmpeg4_version<6 && s->block_last_index[n]>0){
yading@10 603 for(last_index=63; last_index>=0; last_index--){
yading@10 604 if(block[scantable[last_index]]) break;
yading@10 605 }
yading@10 606 s->block_last_index[n]= last_index;
yading@10 607 }else
yading@10 608 last_index = s->block_last_index[n];
yading@10 609 /* AC coefs */
yading@10 610 last_non_zero = i - 1;
yading@10 611 for (; i <= last_index; i++) {
yading@10 612 j = scantable[i];
yading@10 613 level = block[j];
yading@10 614 if (level) {
yading@10 615 run = i - last_non_zero - 1;
yading@10 616 last = (i == last_index);
yading@10 617 sign = 0;
yading@10 618 slevel = level;
yading@10 619 if (level < 0) {
yading@10 620 sign = 1;
yading@10 621 level = -level;
yading@10 622 }
yading@10 623
yading@10 624 if(level<=MAX_LEVEL && run<=MAX_RUN){
yading@10 625 s->ac_stats[s->mb_intra][n>3][level][run][last]++;
yading@10 626 }
yading@10 627
yading@10 628 s->ac_stats[s->mb_intra][n > 3][40][63][0]++; //esc3 like
yading@10 629
yading@10 630 code = get_rl_index(rl, last, run, level);
yading@10 631 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
yading@10 632 if (code == rl->n) {
yading@10 633 int level1, run1;
yading@10 634
yading@10 635 level1 = level - rl->max_level[last][run];
yading@10 636 if (level1 < 1)
yading@10 637 goto esc2;
yading@10 638 code = get_rl_index(rl, last, run, level1);
yading@10 639 if (code == rl->n) {
yading@10 640 esc2:
yading@10 641 put_bits(&s->pb, 1, 0);
yading@10 642 if (level > MAX_LEVEL)
yading@10 643 goto esc3;
yading@10 644 run1 = run - rl->max_run[last][level] - run_diff;
yading@10 645 if (run1 < 0)
yading@10 646 goto esc3;
yading@10 647 code = get_rl_index(rl, last, run1+1, level);
yading@10 648 if (s->msmpeg4_version == 4 && code == rl->n)
yading@10 649 goto esc3;
yading@10 650 code = get_rl_index(rl, last, run1, level);
yading@10 651 if (code == rl->n) {
yading@10 652 esc3:
yading@10 653 /* third escape */
yading@10 654 put_bits(&s->pb, 1, 0);
yading@10 655 put_bits(&s->pb, 1, last);
yading@10 656 if(s->msmpeg4_version>=4){
yading@10 657 if(s->esc3_level_length==0){
yading@10 658 s->esc3_level_length=8;
yading@10 659 s->esc3_run_length= 6;
yading@10 660 //ESCLVLSZ + ESCRUNSZ
yading@10 661 if(s->qscale<8)
yading@10 662 put_bits(&s->pb, 6 + (s->msmpeg4_version>=6), 3);
yading@10 663 else
yading@10 664 put_bits(&s->pb, 8, 3);
yading@10 665 }
yading@10 666 put_bits(&s->pb, s->esc3_run_length, run);
yading@10 667 put_bits(&s->pb, 1, sign);
yading@10 668 put_bits(&s->pb, s->esc3_level_length, level);
yading@10 669 }else{
yading@10 670 put_bits(&s->pb, 6, run);
yading@10 671 put_sbits(&s->pb, 8, slevel);
yading@10 672 }
yading@10 673 } else {
yading@10 674 /* second escape */
yading@10 675 put_bits(&s->pb, 1, 1);
yading@10 676 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
yading@10 677 put_bits(&s->pb, 1, sign);
yading@10 678 }
yading@10 679 } else {
yading@10 680 /* first escape */
yading@10 681 put_bits(&s->pb, 1, 1);
yading@10 682 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
yading@10 683 put_bits(&s->pb, 1, sign);
yading@10 684 }
yading@10 685 } else {
yading@10 686 put_bits(&s->pb, 1, sign);
yading@10 687 }
yading@10 688 last_non_zero = i;
yading@10 689 }
yading@10 690 }
yading@10 691 }