annotate ffmpeg/libavcodec/ituh263enc.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 * ITU H263 bitstream encoder
yading@10 3 * Copyright (c) 2000,2001 Fabrice Bellard
yading@10 4 * H263+ support.
yading@10 5 * Copyright (c) 2001 Juan J. Sierralta P
yading@10 6 * Copyright (c) 2002-2004 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 * h263 bitstream encoder.
yading@10 28 */
yading@10 29
yading@10 30 //#define DEBUG
yading@10 31 #include <limits.h>
yading@10 32
yading@10 33 #include "avcodec.h"
yading@10 34 #include "mpegvideo.h"
yading@10 35 #include "h263.h"
yading@10 36 #include "mathops.h"
yading@10 37 #include "unary.h"
yading@10 38 #include "flv.h"
yading@10 39 #include "mpeg4video.h"
yading@10 40 #include "internal.h"
yading@10 41
yading@10 42 /**
yading@10 43 * Table of number of bits a motion vector component needs.
yading@10 44 */
yading@10 45 static uint8_t mv_penalty[MAX_FCODE+1][MAX_MV*2+1];
yading@10 46
yading@10 47 /**
yading@10 48 * Minimal fcode that a motion vector component would need.
yading@10 49 */
yading@10 50 static uint8_t fcode_tab[MAX_MV*2+1];
yading@10 51
yading@10 52 /**
yading@10 53 * Minimal fcode that a motion vector component would need in umv.
yading@10 54 * All entries in this table are 1.
yading@10 55 */
yading@10 56 static uint8_t umv_fcode_tab[MAX_MV*2+1];
yading@10 57
yading@10 58 //unified encoding tables for run length encoding of coefficients
yading@10 59 //unified in the sense that the specification specifies the encoding in several steps.
yading@10 60 static uint8_t uni_h263_intra_aic_rl_len [64*64*2*2];
yading@10 61 static uint8_t uni_h263_inter_rl_len [64*64*2*2];
yading@10 62 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
yading@10 63 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
yading@10 64 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
yading@10 65
yading@10 66 static const uint8_t wrong_run[102] = {
yading@10 67 1, 2, 3, 5, 4, 10, 9, 8,
yading@10 68 11, 15, 17, 16, 23, 22, 21, 20,
yading@10 69 19, 18, 25, 24, 27, 26, 11, 7,
yading@10 70 6, 1, 2, 13, 2, 2, 2, 2,
yading@10 71 6, 12, 3, 9, 1, 3, 4, 3,
yading@10 72 7, 4, 1, 1, 5, 5, 14, 6,
yading@10 73 1, 7, 1, 8, 1, 1, 1, 1,
yading@10 74 10, 1, 1, 5, 9, 17, 25, 24,
yading@10 75 29, 33, 32, 41, 2, 23, 28, 31,
yading@10 76 3, 22, 30, 4, 27, 40, 8, 26,
yading@10 77 6, 39, 7, 38, 16, 37, 15, 10,
yading@10 78 11, 12, 13, 14, 1, 21, 20, 18,
yading@10 79 19, 2, 1, 34, 35, 36
yading@10 80 };
yading@10 81
yading@10 82 /**
yading@10 83 * Return the 4 bit value that specifies the given aspect ratio.
yading@10 84 * This may be one of the standard aspect ratios or it specifies
yading@10 85 * that the aspect will be stored explicitly later.
yading@10 86 */
yading@10 87 av_const int ff_h263_aspect_to_info(AVRational aspect){
yading@10 88 int i;
yading@10 89
yading@10 90 if(aspect.num==0) aspect= (AVRational){1,1};
yading@10 91
yading@10 92 for(i=1; i<6; i++){
yading@10 93 if(av_cmp_q(ff_h263_pixel_aspect[i], aspect) == 0){
yading@10 94 return i;
yading@10 95 }
yading@10 96 }
yading@10 97
yading@10 98 return FF_ASPECT_EXTENDED;
yading@10 99 }
yading@10 100
yading@10 101 void ff_h263_encode_picture_header(MpegEncContext * s, int picture_number)
yading@10 102 {
yading@10 103 int format, coded_frame_rate, coded_frame_rate_base, i, temp_ref;
yading@10 104 int best_clock_code=1;
yading@10 105 int best_divisor=60;
yading@10 106 int best_error= INT_MAX;
yading@10 107
yading@10 108 if(s->h263_plus){
yading@10 109 for(i=0; i<2; i++){
yading@10 110 int div, error;
yading@10 111 div= (s->avctx->time_base.num*1800000LL + 500LL*s->avctx->time_base.den) / ((1000LL+i)*s->avctx->time_base.den);
yading@10 112 div= av_clip(div, 1, 127);
yading@10 113 error= FFABS(s->avctx->time_base.num*1800000LL - (1000LL+i)*s->avctx->time_base.den*div);
yading@10 114 if(error < best_error){
yading@10 115 best_error= error;
yading@10 116 best_divisor= div;
yading@10 117 best_clock_code= i;
yading@10 118 }
yading@10 119 }
yading@10 120 }
yading@10 121 s->custom_pcf= best_clock_code!=1 || best_divisor!=60;
yading@10 122 coded_frame_rate= 1800000;
yading@10 123 coded_frame_rate_base= (1000+best_clock_code)*best_divisor;
yading@10 124
yading@10 125 avpriv_align_put_bits(&s->pb);
yading@10 126
yading@10 127 /* Update the pointer to last GOB */
yading@10 128 s->ptr_lastgob = put_bits_ptr(&s->pb);
yading@10 129 put_bits(&s->pb, 22, 0x20); /* PSC */
yading@10 130 temp_ref= s->picture_number * (int64_t)coded_frame_rate * s->avctx->time_base.num / //FIXME use timestamp
yading@10 131 (coded_frame_rate_base * (int64_t)s->avctx->time_base.den);
yading@10 132 put_sbits(&s->pb, 8, temp_ref); /* TemporalReference */
yading@10 133
yading@10 134 put_bits(&s->pb, 1, 1); /* marker */
yading@10 135 put_bits(&s->pb, 1, 0); /* h263 id */
yading@10 136 put_bits(&s->pb, 1, 0); /* split screen off */
yading@10 137 put_bits(&s->pb, 1, 0); /* camera off */
yading@10 138 put_bits(&s->pb, 1, 0); /* freeze picture release off */
yading@10 139
yading@10 140 format = ff_match_2uint16(ff_h263_format, FF_ARRAY_ELEMS(ff_h263_format), s->width, s->height);
yading@10 141 if (!s->h263_plus) {
yading@10 142 /* H.263v1 */
yading@10 143 put_bits(&s->pb, 3, format);
yading@10 144 put_bits(&s->pb, 1, (s->pict_type == AV_PICTURE_TYPE_P));
yading@10 145 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
yading@10 146 of H.263v1 UMV implies to check the predicted MV after
yading@10 147 calculation of the current MB to see if we're on the limits */
yading@10 148 put_bits(&s->pb, 1, 0); /* Unrestricted Motion Vector: off */
yading@10 149 put_bits(&s->pb, 1, 0); /* SAC: off */
yading@10 150 put_bits(&s->pb, 1, s->obmc); /* Advanced Prediction */
yading@10 151 put_bits(&s->pb, 1, 0); /* only I/P frames, no PB frame */
yading@10 152 put_bits(&s->pb, 5, s->qscale);
yading@10 153 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
yading@10 154 } else {
yading@10 155 int ufep=1;
yading@10 156 /* H.263v2 */
yading@10 157 /* H.263 Plus PTYPE */
yading@10 158
yading@10 159 put_bits(&s->pb, 3, 7);
yading@10 160 put_bits(&s->pb,3,ufep); /* Update Full Extended PTYPE */
yading@10 161 if (format == 8)
yading@10 162 put_bits(&s->pb,3,6); /* Custom Source Format */
yading@10 163 else
yading@10 164 put_bits(&s->pb, 3, format);
yading@10 165
yading@10 166 put_bits(&s->pb,1, s->custom_pcf);
yading@10 167 put_bits(&s->pb,1, s->umvplus); /* Unrestricted Motion Vector */
yading@10 168 put_bits(&s->pb,1,0); /* SAC: off */
yading@10 169 put_bits(&s->pb,1,s->obmc); /* Advanced Prediction Mode */
yading@10 170 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
yading@10 171 put_bits(&s->pb,1,s->loop_filter); /* Deblocking Filter */
yading@10 172 put_bits(&s->pb,1,s->h263_slice_structured); /* Slice Structured */
yading@10 173 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
yading@10 174 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
yading@10 175 put_bits(&s->pb,1,s->alt_inter_vlc); /* Alternative Inter VLC */
yading@10 176 put_bits(&s->pb,1,s->modified_quant); /* Modified Quantization: */
yading@10 177 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
yading@10 178 put_bits(&s->pb,3,0); /* Reserved */
yading@10 179
yading@10 180 put_bits(&s->pb, 3, s->pict_type == AV_PICTURE_TYPE_P);
yading@10 181
yading@10 182 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
yading@10 183 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
yading@10 184 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
yading@10 185 put_bits(&s->pb,2,0); /* Reserved */
yading@10 186 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
yading@10 187
yading@10 188 /* This should be here if PLUSPTYPE */
yading@10 189 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
yading@10 190
yading@10 191 if (format == 8) {
yading@10 192 /* Custom Picture Format (CPFMT) */
yading@10 193 s->aspect_ratio_info= ff_h263_aspect_to_info(s->avctx->sample_aspect_ratio);
yading@10 194
yading@10 195 put_bits(&s->pb,4,s->aspect_ratio_info);
yading@10 196 put_bits(&s->pb,9,(s->width >> 2) - 1);
yading@10 197 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
yading@10 198 put_bits(&s->pb,9,(s->height >> 2));
yading@10 199 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
yading@10 200 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
yading@10 201 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
yading@10 202 }
yading@10 203 }
yading@10 204 if(s->custom_pcf){
yading@10 205 if(ufep){
yading@10 206 put_bits(&s->pb, 1, best_clock_code);
yading@10 207 put_bits(&s->pb, 7, best_divisor);
yading@10 208 }
yading@10 209 put_sbits(&s->pb, 2, temp_ref>>8);
yading@10 210 }
yading@10 211
yading@10 212 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
yading@10 213 if (s->umvplus)
yading@10 214 // put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
yading@10 215 //FIXME check actual requested range
yading@10 216 put_bits(&s->pb,2,1); /* unlimited */
yading@10 217 if(s->h263_slice_structured)
yading@10 218 put_bits(&s->pb,2,0); /* no weird submodes */
yading@10 219
yading@10 220 put_bits(&s->pb, 5, s->qscale);
yading@10 221 }
yading@10 222
yading@10 223 put_bits(&s->pb, 1, 0); /* no PEI */
yading@10 224
yading@10 225 if(s->h263_slice_structured){
yading@10 226 put_bits(&s->pb, 1, 1);
yading@10 227
yading@10 228 av_assert1(s->mb_x == 0 && s->mb_y == 0);
yading@10 229 ff_h263_encode_mba(s);
yading@10 230
yading@10 231 put_bits(&s->pb, 1, 1);
yading@10 232 }
yading@10 233
yading@10 234 if(s->h263_aic){
yading@10 235 s->y_dc_scale_table=
yading@10 236 s->c_dc_scale_table= ff_aic_dc_scale_table;
yading@10 237 }else{
yading@10 238 s->y_dc_scale_table=
yading@10 239 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
yading@10 240 }
yading@10 241 }
yading@10 242
yading@10 243 /**
yading@10 244 * Encode a group of blocks header.
yading@10 245 */
yading@10 246 void ff_h263_encode_gob_header(MpegEncContext * s, int mb_line)
yading@10 247 {
yading@10 248 put_bits(&s->pb, 17, 1); /* GBSC */
yading@10 249
yading@10 250 if(s->h263_slice_structured){
yading@10 251 put_bits(&s->pb, 1, 1);
yading@10 252
yading@10 253 ff_h263_encode_mba(s);
yading@10 254
yading@10 255 if(s->mb_num > 1583)
yading@10 256 put_bits(&s->pb, 1, 1);
yading@10 257 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
yading@10 258 put_bits(&s->pb, 1, 1);
yading@10 259 put_bits(&s->pb, 2, s->pict_type == AV_PICTURE_TYPE_I); /* GFID */
yading@10 260 }else{
yading@10 261 int gob_number= mb_line / s->gob_index;
yading@10 262
yading@10 263 put_bits(&s->pb, 5, gob_number); /* GN */
yading@10 264 put_bits(&s->pb, 2, s->pict_type == AV_PICTURE_TYPE_I); /* GFID */
yading@10 265 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
yading@10 266 }
yading@10 267 }
yading@10 268
yading@10 269 /**
yading@10 270 * modify qscale so that encoding is actually possible in h263 (limit difference to -2..2)
yading@10 271 */
yading@10 272 void ff_clean_h263_qscales(MpegEncContext *s){
yading@10 273 int i;
yading@10 274 int8_t * const qscale_table = s->current_picture.qscale_table;
yading@10 275
yading@10 276 ff_init_qscale_tab(s);
yading@10 277
yading@10 278 for(i=1; i<s->mb_num; i++){
yading@10 279 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i-1] ] >2)
yading@10 280 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i-1] ]+2;
yading@10 281 }
yading@10 282 for(i=s->mb_num-2; i>=0; i--){
yading@10 283 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i+1] ] >2)
yading@10 284 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i+1] ]+2;
yading@10 285 }
yading@10 286
yading@10 287 if(s->codec_id != AV_CODEC_ID_H263P){
yading@10 288 for(i=1; i<s->mb_num; i++){
yading@10 289 int mb_xy= s->mb_index2xy[i];
yading@10 290
yading@10 291 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_INTER4V)){
yading@10 292 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_INTER;
yading@10 293 }
yading@10 294 }
yading@10 295 }
yading@10 296 }
yading@10 297
yading@10 298 static const int dquant_code[5]= {1,0,9,2,3};
yading@10 299
yading@10 300 /**
yading@10 301 * Encode an 8x8 block.
yading@10 302 * @param block the 8x8 block
yading@10 303 * @param n block index (0-3 are luma, 4-5 are chroma)
yading@10 304 */
yading@10 305 static void h263_encode_block(MpegEncContext * s, int16_t * block, int n)
yading@10 306 {
yading@10 307 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
yading@10 308 RLTable *rl;
yading@10 309
yading@10 310 rl = &ff_h263_rl_inter;
yading@10 311 if (s->mb_intra && !s->h263_aic) {
yading@10 312 /* DC coef */
yading@10 313 level = block[0];
yading@10 314 /* 255 cannot be represented, so we clamp */
yading@10 315 if (level > 254) {
yading@10 316 level = 254;
yading@10 317 block[0] = 254;
yading@10 318 }
yading@10 319 /* 0 cannot be represented also */
yading@10 320 else if (level < 1) {
yading@10 321 level = 1;
yading@10 322 block[0] = 1;
yading@10 323 }
yading@10 324 if (level == 128) //FIXME check rv10
yading@10 325 put_bits(&s->pb, 8, 0xff);
yading@10 326 else
yading@10 327 put_bits(&s->pb, 8, level);
yading@10 328 i = 1;
yading@10 329 } else {
yading@10 330 i = 0;
yading@10 331 if (s->h263_aic && s->mb_intra)
yading@10 332 rl = &ff_rl_intra_aic;
yading@10 333
yading@10 334 if(s->alt_inter_vlc && !s->mb_intra){
yading@10 335 int aic_vlc_bits=0;
yading@10 336 int inter_vlc_bits=0;
yading@10 337 int wrong_pos=-1;
yading@10 338 int aic_code;
yading@10 339
yading@10 340 last_index = s->block_last_index[n];
yading@10 341 last_non_zero = i - 1;
yading@10 342 for (; i <= last_index; i++) {
yading@10 343 j = s->intra_scantable.permutated[i];
yading@10 344 level = block[j];
yading@10 345 if (level) {
yading@10 346 run = i - last_non_zero - 1;
yading@10 347 last = (i == last_index);
yading@10 348
yading@10 349 if(level<0) level= -level;
yading@10 350
yading@10 351 code = get_rl_index(rl, last, run, level);
yading@10 352 aic_code = get_rl_index(&ff_rl_intra_aic, last, run, level);
yading@10 353 inter_vlc_bits += rl->table_vlc[code][1]+1;
yading@10 354 aic_vlc_bits += ff_rl_intra_aic.table_vlc[aic_code][1]+1;
yading@10 355
yading@10 356 if (code == rl->n) {
yading@10 357 inter_vlc_bits += 1+6+8-1;
yading@10 358 }
yading@10 359 if (aic_code == ff_rl_intra_aic.n) {
yading@10 360 aic_vlc_bits += 1+6+8-1;
yading@10 361 wrong_pos += run + 1;
yading@10 362 }else
yading@10 363 wrong_pos += wrong_run[aic_code];
yading@10 364 last_non_zero = i;
yading@10 365 }
yading@10 366 }
yading@10 367 i = 0;
yading@10 368 if(aic_vlc_bits < inter_vlc_bits && wrong_pos > 63)
yading@10 369 rl = &ff_rl_intra_aic;
yading@10 370 }
yading@10 371 }
yading@10 372
yading@10 373 /* AC coefs */
yading@10 374 last_index = s->block_last_index[n];
yading@10 375 last_non_zero = i - 1;
yading@10 376 for (; i <= last_index; i++) {
yading@10 377 j = s->intra_scantable.permutated[i];
yading@10 378 level = block[j];
yading@10 379 if (level) {
yading@10 380 run = i - last_non_zero - 1;
yading@10 381 last = (i == last_index);
yading@10 382 sign = 0;
yading@10 383 slevel = level;
yading@10 384 if (level < 0) {
yading@10 385 sign = 1;
yading@10 386 level = -level;
yading@10 387 }
yading@10 388 code = get_rl_index(rl, last, run, level);
yading@10 389 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
yading@10 390 if (code == rl->n) {
yading@10 391 if(!CONFIG_FLV_ENCODER || s->h263_flv <= 1){
yading@10 392 put_bits(&s->pb, 1, last);
yading@10 393 put_bits(&s->pb, 6, run);
yading@10 394
yading@10 395 av_assert2(slevel != 0);
yading@10 396
yading@10 397 if(level < 128)
yading@10 398 put_sbits(&s->pb, 8, slevel);
yading@10 399 else{
yading@10 400 put_bits(&s->pb, 8, 128);
yading@10 401 put_sbits(&s->pb, 5, slevel);
yading@10 402 put_sbits(&s->pb, 6, slevel>>5);
yading@10 403 }
yading@10 404 }else{
yading@10 405 ff_flv2_encode_ac_esc(&s->pb, slevel, level, run, last);
yading@10 406 }
yading@10 407 } else {
yading@10 408 put_bits(&s->pb, 1, sign);
yading@10 409 }
yading@10 410 last_non_zero = i;
yading@10 411 }
yading@10 412 }
yading@10 413 }
yading@10 414
yading@10 415 /* Encode MV differences on H.263+ with Unrestricted MV mode */
yading@10 416 static void h263p_encode_umotion(MpegEncContext * s, int val)
yading@10 417 {
yading@10 418 short sval = 0;
yading@10 419 short i = 0;
yading@10 420 short n_bits = 0;
yading@10 421 short temp_val;
yading@10 422 int code = 0;
yading@10 423 int tcode;
yading@10 424
yading@10 425 if ( val == 0)
yading@10 426 put_bits(&s->pb, 1, 1);
yading@10 427 else if (val == 1)
yading@10 428 put_bits(&s->pb, 3, 0);
yading@10 429 else if (val == -1)
yading@10 430 put_bits(&s->pb, 3, 2);
yading@10 431 else {
yading@10 432
yading@10 433 sval = ((val < 0) ? (short)(-val):(short)val);
yading@10 434 temp_val = sval;
yading@10 435
yading@10 436 while (temp_val != 0) {
yading@10 437 temp_val = temp_val >> 1;
yading@10 438 n_bits++;
yading@10 439 }
yading@10 440
yading@10 441 i = n_bits - 1;
yading@10 442 while (i > 0) {
yading@10 443 tcode = (sval & (1 << (i-1))) >> (i-1);
yading@10 444 tcode = (tcode << 1) | 1;
yading@10 445 code = (code << 2) | tcode;
yading@10 446 i--;
yading@10 447 }
yading@10 448 code = ((code << 1) | (val < 0)) << 1;
yading@10 449 put_bits(&s->pb, (2*n_bits)+1, code);
yading@10 450 }
yading@10 451 }
yading@10 452
yading@10 453 void ff_h263_encode_mb(MpegEncContext * s,
yading@10 454 int16_t block[6][64],
yading@10 455 int motion_x, int motion_y)
yading@10 456 {
yading@10 457 int cbpc, cbpy, i, cbp, pred_x, pred_y;
yading@10 458 int16_t pred_dc;
yading@10 459 int16_t rec_intradc[6];
yading@10 460 int16_t *dc_ptr[6];
yading@10 461 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1);
yading@10 462
yading@10 463 if (!s->mb_intra) {
yading@10 464 /* compute cbp */
yading@10 465 cbp= get_p_cbp(s, block, motion_x, motion_y);
yading@10 466
yading@10 467 if ((cbp | motion_x | motion_y | s->dquant | (s->mv_type - MV_TYPE_16X16)) == 0) {
yading@10 468 /* skip macroblock */
yading@10 469 put_bits(&s->pb, 1, 1);
yading@10 470 if(interleaved_stats){
yading@10 471 s->misc_bits++;
yading@10 472 s->last_bits++;
yading@10 473 }
yading@10 474 s->skip_count++;
yading@10 475
yading@10 476 return;
yading@10 477 }
yading@10 478 put_bits(&s->pb, 1, 0); /* mb coded */
yading@10 479
yading@10 480 cbpc = cbp & 3;
yading@10 481 cbpy = cbp >> 2;
yading@10 482 if(s->alt_inter_vlc==0 || cbpc!=3)
yading@10 483 cbpy ^= 0xF;
yading@10 484 if(s->dquant) cbpc+= 8;
yading@10 485 if(s->mv_type==MV_TYPE_16X16){
yading@10 486 put_bits(&s->pb,
yading@10 487 ff_h263_inter_MCBPC_bits[cbpc],
yading@10 488 ff_h263_inter_MCBPC_code[cbpc]);
yading@10 489
yading@10 490 put_bits(&s->pb, ff_h263_cbpy_tab[cbpy][1], ff_h263_cbpy_tab[cbpy][0]);
yading@10 491 if(s->dquant)
yading@10 492 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
yading@10 493
yading@10 494 if(interleaved_stats){
yading@10 495 s->misc_bits+= get_bits_diff(s);
yading@10 496 }
yading@10 497
yading@10 498 /* motion vectors: 16x16 mode */
yading@10 499 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
yading@10 500
yading@10 501 if (!s->umvplus) {
yading@10 502 ff_h263_encode_motion_vector(s, motion_x - pred_x,
yading@10 503 motion_y - pred_y, 1);
yading@10 504 }
yading@10 505 else {
yading@10 506 h263p_encode_umotion(s, motion_x - pred_x);
yading@10 507 h263p_encode_umotion(s, motion_y - pred_y);
yading@10 508 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
yading@10 509 /* To prevent Start Code emulation */
yading@10 510 put_bits(&s->pb,1,1);
yading@10 511 }
yading@10 512 }else{
yading@10 513 put_bits(&s->pb,
yading@10 514 ff_h263_inter_MCBPC_bits[cbpc+16],
yading@10 515 ff_h263_inter_MCBPC_code[cbpc+16]);
yading@10 516 put_bits(&s->pb, ff_h263_cbpy_tab[cbpy][1], ff_h263_cbpy_tab[cbpy][0]);
yading@10 517 if(s->dquant)
yading@10 518 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
yading@10 519
yading@10 520 if(interleaved_stats){
yading@10 521 s->misc_bits+= get_bits_diff(s);
yading@10 522 }
yading@10 523
yading@10 524 for(i=0; i<4; i++){
yading@10 525 /* motion vectors: 8x8 mode*/
yading@10 526 ff_h263_pred_motion(s, i, 0, &pred_x, &pred_y);
yading@10 527
yading@10 528 motion_x = s->current_picture.motion_val[0][s->block_index[i]][0];
yading@10 529 motion_y = s->current_picture.motion_val[0][s->block_index[i]][1];
yading@10 530 if (!s->umvplus) {
yading@10 531 ff_h263_encode_motion_vector(s, motion_x - pred_x,
yading@10 532 motion_y - pred_y, 1);
yading@10 533 }
yading@10 534 else {
yading@10 535 h263p_encode_umotion(s, motion_x - pred_x);
yading@10 536 h263p_encode_umotion(s, motion_y - pred_y);
yading@10 537 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
yading@10 538 /* To prevent Start Code emulation */
yading@10 539 put_bits(&s->pb,1,1);
yading@10 540 }
yading@10 541 }
yading@10 542 }
yading@10 543
yading@10 544 if(interleaved_stats){
yading@10 545 s->mv_bits+= get_bits_diff(s);
yading@10 546 }
yading@10 547 } else {
yading@10 548 av_assert2(s->mb_intra);
yading@10 549
yading@10 550 cbp = 0;
yading@10 551 if (s->h263_aic) {
yading@10 552 /* Predict DC */
yading@10 553 for(i=0; i<6; i++) {
yading@10 554 int16_t level = block[i][0];
yading@10 555 int scale;
yading@10 556
yading@10 557 if(i<4) scale= s->y_dc_scale;
yading@10 558 else scale= s->c_dc_scale;
yading@10 559
yading@10 560 pred_dc = ff_h263_pred_dc(s, i, &dc_ptr[i]);
yading@10 561 level -= pred_dc;
yading@10 562 /* Quant */
yading@10 563 if (level >= 0)
yading@10 564 level = (level + (scale>>1))/scale;
yading@10 565 else
yading@10 566 level = (level - (scale>>1))/scale;
yading@10 567
yading@10 568 /* AIC can change CBP */
yading@10 569 if (level == 0 && s->block_last_index[i] == 0)
yading@10 570 s->block_last_index[i] = -1;
yading@10 571
yading@10 572 if(!s->modified_quant){
yading@10 573 if (level < -127)
yading@10 574 level = -127;
yading@10 575 else if (level > 127)
yading@10 576 level = 127;
yading@10 577 }
yading@10 578
yading@10 579 block[i][0] = level;
yading@10 580 /* Reconstruction */
yading@10 581 rec_intradc[i] = scale*level + pred_dc;
yading@10 582 /* Oddify */
yading@10 583 rec_intradc[i] |= 1;
yading@10 584 //if ((rec_intradc[i] % 2) == 0)
yading@10 585 // rec_intradc[i]++;
yading@10 586 /* Clipping */
yading@10 587 if (rec_intradc[i] < 0)
yading@10 588 rec_intradc[i] = 0;
yading@10 589 else if (rec_intradc[i] > 2047)
yading@10 590 rec_intradc[i] = 2047;
yading@10 591
yading@10 592 /* Update AC/DC tables */
yading@10 593 *dc_ptr[i] = rec_intradc[i];
yading@10 594 if (s->block_last_index[i] >= 0)
yading@10 595 cbp |= 1 << (5 - i);
yading@10 596 }
yading@10 597 }else{
yading@10 598 for(i=0; i<6; i++) {
yading@10 599 /* compute cbp */
yading@10 600 if (s->block_last_index[i] >= 1)
yading@10 601 cbp |= 1 << (5 - i);
yading@10 602 }
yading@10 603 }
yading@10 604
yading@10 605 cbpc = cbp & 3;
yading@10 606 if (s->pict_type == AV_PICTURE_TYPE_I) {
yading@10 607 if(s->dquant) cbpc+=4;
yading@10 608 put_bits(&s->pb,
yading@10 609 ff_h263_intra_MCBPC_bits[cbpc],
yading@10 610 ff_h263_intra_MCBPC_code[cbpc]);
yading@10 611 } else {
yading@10 612 if(s->dquant) cbpc+=8;
yading@10 613 put_bits(&s->pb, 1, 0); /* mb coded */
yading@10 614 put_bits(&s->pb,
yading@10 615 ff_h263_inter_MCBPC_bits[cbpc + 4],
yading@10 616 ff_h263_inter_MCBPC_code[cbpc + 4]);
yading@10 617 }
yading@10 618 if (s->h263_aic) {
yading@10 619 /* XXX: currently, we do not try to use ac prediction */
yading@10 620 put_bits(&s->pb, 1, 0); /* no AC prediction */
yading@10 621 }
yading@10 622 cbpy = cbp >> 2;
yading@10 623 put_bits(&s->pb, ff_h263_cbpy_tab[cbpy][1], ff_h263_cbpy_tab[cbpy][0]);
yading@10 624 if(s->dquant)
yading@10 625 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
yading@10 626
yading@10 627 if(interleaved_stats){
yading@10 628 s->misc_bits+= get_bits_diff(s);
yading@10 629 }
yading@10 630 }
yading@10 631
yading@10 632 for(i=0; i<6; i++) {
yading@10 633 /* encode each block */
yading@10 634 h263_encode_block(s, block[i], i);
yading@10 635
yading@10 636 /* Update INTRADC for decoding */
yading@10 637 if (s->h263_aic && s->mb_intra) {
yading@10 638 block[i][0] = rec_intradc[i];
yading@10 639
yading@10 640 }
yading@10 641 }
yading@10 642
yading@10 643 if(interleaved_stats){
yading@10 644 if (!s->mb_intra) {
yading@10 645 s->p_tex_bits+= get_bits_diff(s);
yading@10 646 s->f_count++;
yading@10 647 }else{
yading@10 648 s->i_tex_bits+= get_bits_diff(s);
yading@10 649 s->i_count++;
yading@10 650 }
yading@10 651 }
yading@10 652 }
yading@10 653
yading@10 654 void ff_h263_encode_motion(MpegEncContext * s, int val, int f_code)
yading@10 655 {
yading@10 656 int range, bit_size, sign, code, bits;
yading@10 657
yading@10 658 if (val == 0) {
yading@10 659 /* zero vector */
yading@10 660 code = 0;
yading@10 661 put_bits(&s->pb, ff_mvtab[code][1], ff_mvtab[code][0]);
yading@10 662 } else {
yading@10 663 bit_size = f_code - 1;
yading@10 664 range = 1 << bit_size;
yading@10 665 /* modulo encoding */
yading@10 666 val = sign_extend(val, 6 + bit_size);
yading@10 667 sign = val>>31;
yading@10 668 val= (val^sign)-sign;
yading@10 669 sign&=1;
yading@10 670
yading@10 671 val--;
yading@10 672 code = (val >> bit_size) + 1;
yading@10 673 bits = val & (range - 1);
yading@10 674
yading@10 675 put_bits(&s->pb, ff_mvtab[code][1] + 1, (ff_mvtab[code][0] << 1) | sign);
yading@10 676 if (bit_size > 0) {
yading@10 677 put_bits(&s->pb, bit_size, bits);
yading@10 678 }
yading@10 679 }
yading@10 680 }
yading@10 681
yading@10 682 static void init_mv_penalty_and_fcode(MpegEncContext *s)
yading@10 683 {
yading@10 684 int f_code;
yading@10 685 int mv;
yading@10 686
yading@10 687 for(f_code=1; f_code<=MAX_FCODE; f_code++){
yading@10 688 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
yading@10 689 int len;
yading@10 690
yading@10 691 if(mv==0) len= ff_mvtab[0][1];
yading@10 692 else{
yading@10 693 int val, bit_size, code;
yading@10 694
yading@10 695 bit_size = f_code - 1;
yading@10 696
yading@10 697 val=mv;
yading@10 698 if (val < 0)
yading@10 699 val = -val;
yading@10 700 val--;
yading@10 701 code = (val >> bit_size) + 1;
yading@10 702 if(code<33){
yading@10 703 len= ff_mvtab[code][1] + 1 + bit_size;
yading@10 704 }else{
yading@10 705 len= ff_mvtab[32][1] + av_log2(code>>5) + 2 + bit_size;
yading@10 706 }
yading@10 707 }
yading@10 708
yading@10 709 mv_penalty[f_code][mv+MAX_MV]= len;
yading@10 710 }
yading@10 711 }
yading@10 712
yading@10 713 for(f_code=MAX_FCODE; f_code>0; f_code--){
yading@10 714 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
yading@10 715 fcode_tab[mv+MAX_MV]= f_code;
yading@10 716 }
yading@10 717 }
yading@10 718
yading@10 719 for(mv=0; mv<MAX_MV*2+1; mv++){
yading@10 720 umv_fcode_tab[mv]= 1;
yading@10 721 }
yading@10 722 }
yading@10 723
yading@10 724 static void init_uni_h263_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
yading@10 725 int slevel, run, last;
yading@10 726
yading@10 727 av_assert0(MAX_LEVEL >= 64);
yading@10 728 av_assert0(MAX_RUN >= 63);
yading@10 729
yading@10 730 for(slevel=-64; slevel<64; slevel++){
yading@10 731 if(slevel==0) continue;
yading@10 732 for(run=0; run<64; run++){
yading@10 733 for(last=0; last<=1; last++){
yading@10 734 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
yading@10 735 int level= slevel < 0 ? -slevel : slevel;
yading@10 736 int sign= slevel < 0 ? 1 : 0;
yading@10 737 int bits, len, code;
yading@10 738
yading@10 739 len_tab[index]= 100;
yading@10 740
yading@10 741 /* ESC0 */
yading@10 742 code= get_rl_index(rl, last, run, level);
yading@10 743 bits= rl->table_vlc[code][0];
yading@10 744 len= rl->table_vlc[code][1];
yading@10 745 bits=bits*2+sign; len++;
yading@10 746
yading@10 747 if(code!=rl->n && len < len_tab[index]){
yading@10 748 if(bits_tab) bits_tab[index]= bits;
yading@10 749 len_tab [index]= len;
yading@10 750 }
yading@10 751 /* ESC */
yading@10 752 bits= rl->table_vlc[rl->n][0];
yading@10 753 len = rl->table_vlc[rl->n][1];
yading@10 754 bits=bits*2+last; len++;
yading@10 755 bits=bits*64+run; len+=6;
yading@10 756 bits=bits*256+(level&0xff); len+=8;
yading@10 757
yading@10 758 if(len < len_tab[index]){
yading@10 759 if(bits_tab) bits_tab[index]= bits;
yading@10 760 len_tab [index]= len;
yading@10 761 }
yading@10 762 }
yading@10 763 }
yading@10 764 }
yading@10 765 }
yading@10 766
yading@10 767 void ff_h263_encode_init(MpegEncContext *s)
yading@10 768 {
yading@10 769 static int done = 0;
yading@10 770
yading@10 771 if (!done) {
yading@10 772 done = 1;
yading@10 773
yading@10 774 ff_init_rl(&ff_h263_rl_inter, ff_h263_static_rl_table_store[0]);
yading@10 775 ff_init_rl(&ff_rl_intra_aic, ff_h263_static_rl_table_store[1]);
yading@10 776
yading@10 777 init_uni_h263_rl_tab(&ff_rl_intra_aic, NULL, uni_h263_intra_aic_rl_len);
yading@10 778 init_uni_h263_rl_tab(&ff_h263_rl_inter , NULL, uni_h263_inter_rl_len);
yading@10 779
yading@10 780 init_mv_penalty_and_fcode(s);
yading@10 781 }
yading@10 782 s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
yading@10 783
yading@10 784 s->intra_ac_vlc_length =s->inter_ac_vlc_length = uni_h263_inter_rl_len;
yading@10 785 s->intra_ac_vlc_last_length=s->inter_ac_vlc_last_length= uni_h263_inter_rl_len + 128*64;
yading@10 786 if(s->h263_aic){
yading@10 787 s->intra_ac_vlc_length = uni_h263_intra_aic_rl_len;
yading@10 788 s->intra_ac_vlc_last_length= uni_h263_intra_aic_rl_len + 128*64;
yading@10 789 }
yading@10 790 s->ac_esc_length= 7+1+6+8;
yading@10 791
yading@10 792 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
yading@10 793 switch(s->codec_id){
yading@10 794 case AV_CODEC_ID_MPEG4:
yading@10 795 s->fcode_tab= fcode_tab;
yading@10 796 break;
yading@10 797 case AV_CODEC_ID_H263P:
yading@10 798 if(s->umvplus)
yading@10 799 s->fcode_tab= umv_fcode_tab;
yading@10 800 if(s->modified_quant){
yading@10 801 s->min_qcoeff= -2047;
yading@10 802 s->max_qcoeff= 2047;
yading@10 803 }else{
yading@10 804 s->min_qcoeff= -127;
yading@10 805 s->max_qcoeff= 127;
yading@10 806 }
yading@10 807 break;
yading@10 808 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
yading@10 809 case AV_CODEC_ID_FLV1:
yading@10 810 if (s->h263_flv > 1) {
yading@10 811 s->min_qcoeff= -1023;
yading@10 812 s->max_qcoeff= 1023;
yading@10 813 } else {
yading@10 814 s->min_qcoeff= -127;
yading@10 815 s->max_qcoeff= 127;
yading@10 816 }
yading@10 817 s->y_dc_scale_table=
yading@10 818 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
yading@10 819 break;
yading@10 820 default: //nothing needed - default table already set in mpegvideo.c
yading@10 821 s->min_qcoeff= -127;
yading@10 822 s->max_qcoeff= 127;
yading@10 823 s->y_dc_scale_table=
yading@10 824 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
yading@10 825 }
yading@10 826 }
yading@10 827
yading@10 828 void ff_h263_encode_mba(MpegEncContext *s)
yading@10 829 {
yading@10 830 int i, mb_pos;
yading@10 831
yading@10 832 for(i=0; i<6; i++){
yading@10 833 if(s->mb_num-1 <= ff_mba_max[i]) break;
yading@10 834 }
yading@10 835 mb_pos= s->mb_x + s->mb_width*s->mb_y;
yading@10 836 put_bits(&s->pb, ff_mba_length[i], mb_pos);
yading@10 837 }