00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00032
00033 #include <limits.h>
00034
00035 #include "common.h"
00036 #include "dsputil.h"
00037 #include "avcodec.h"
00038 #include "mpegvideo.h"
00039 #include "h263data.h"
00040 #include "mpeg4data.h"
00041
00042
00043
00044
00045 #define INTRA_MCBPC_VLC_BITS 6
00046 #define INTER_MCBPC_VLC_BITS 7
00047 #define CBPY_VLC_BITS 6
00048 #define MV_VLC_BITS 9
00049 #define DC_VLC_BITS 9
00050 #define SPRITE_TRAJ_VLC_BITS 6
00051 #define MB_TYPE_B_VLC_BITS 4
00052 #define TEX_VLC_BITS 9
00053 #define H263_MBTYPE_B_VLC_BITS 6
00054 #define CBPC_B_VLC_BITS 3
00055
00056 #ifdef CONFIG_ENCODERS
00057 static void h263_encode_block(MpegEncContext * s, DCTELEM * block,
00058 int n);
00059 static void h263p_encode_umotion(MpegEncContext * s, int val);
00060 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block,
00061 int n, int dc, uint8_t *scan_table,
00062 PutBitContext *dc_pb, PutBitContext *ac_pb);
00063 #endif
00064
00065 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode);
00066 static int h263p_decode_umotion(MpegEncContext * s, int pred);
00067 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
00068 int n, int coded);
00069 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
00070 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
00071 int n, int coded, int intra, int rvlc);
00072 static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
00073 uint8_t *scan_table);
00074 static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr);
00075 #ifdef CONFIG_ENCODERS
00076 static void mpeg4_encode_visual_object_header(MpegEncContext * s);
00077 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number);
00078 #endif //CONFIG_ENCODERS
00079 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb);
00080 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding);
00081
00082 #ifdef CONFIG_ENCODERS
00083 static uint8_t uni_DCtab_lum_len[512];
00084 static uint8_t uni_DCtab_chrom_len[512];
00085 static uint16_t uni_DCtab_lum_bits[512];
00086 static uint16_t uni_DCtab_chrom_bits[512];
00087
00088 static uint8_t (*mv_penalty)[MAX_MV*2+1]= NULL;
00089 static uint8_t fcode_tab[MAX_MV*2+1];
00090 static uint8_t umv_fcode_tab[MAX_MV*2+1];
00091
00092 static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2];
00093 static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2];
00094 static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2];
00095 static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2];
00096 static uint8_t uni_h263_intra_aic_rl_len [64*64*2*2];
00097 static uint8_t uni_h263_inter_rl_len [64*64*2*2];
00098
00099
00100 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111 #endif
00112
00113 #if 0 //3IV1 is quite rare and it slows things down a tiny bit
00114 #define IS_3IV1 s->avctx->codec_tag == ff_get_fourcc("3IV1")
00115 #else
00116 #define IS_3IV1 0
00117 #endif
00118
00119 int h263_get_picture_format(int width, int height)
00120 {
00121 int format;
00122
00123 if (width == 128 && height == 96)
00124 format = 1;
00125 else if (width == 176 && height == 144)
00126 format = 2;
00127 else if (width == 352 && height == 288)
00128 format = 3;
00129 else if (width == 704 && height == 576)
00130 format = 4;
00131 else if (width == 1408 && height == 1152)
00132 format = 5;
00133 else
00134 format = 7;
00135 return format;
00136 }
00137
00138 #ifdef CONFIG_ENCODERS
00139
00140 static void aspect_to_info(MpegEncContext * s, AVRational aspect){
00141 int i;
00142
00143 if(aspect.num==0) aspect= (AVRational){1,1};
00144
00145 for(i=1; i<6; i++){
00146 if(av_cmp_q(pixel_aspect[i], aspect) == 0){
00147 s->aspect_ratio_info=i;
00148 return;
00149 }
00150 }
00151
00152 s->aspect_ratio_info= FF_ASPECT_EXTENDED;
00153 }
00154
00155 void ff_flv_encode_picture_header(MpegEncContext * s, int picture_number)
00156 {
00157 int format;
00158
00159 align_put_bits(&s->pb);
00160
00161 put_bits(&s->pb, 17, 1);
00162 put_bits(&s->pb, 5, (s->h263_flv-1));
00163 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->time_base.num) /
00164 s->avctx->time_base.den) & 0xff);
00165 if (s->width == 352 && s->height == 288)
00166 format = 2;
00167 else if (s->width == 176 && s->height == 144)
00168 format = 3;
00169 else if (s->width == 128 && s->height == 96)
00170 format = 4;
00171 else if (s->width == 320 && s->height == 240)
00172 format = 5;
00173 else if (s->width == 160 && s->height == 120)
00174 format = 6;
00175 else if (s->width <= 255 && s->height <= 255)
00176 format = 0;
00177 else
00178 format = 1;
00179 put_bits(&s->pb, 3, format);
00180 if (format == 0) {
00181 put_bits(&s->pb, 8, s->width);
00182 put_bits(&s->pb, 8, s->height);
00183 } else if (format == 1) {
00184 put_bits(&s->pb, 16, s->width);
00185 put_bits(&s->pb, 16, s->height);
00186 }
00187 put_bits(&s->pb, 2, s->pict_type == P_TYPE);
00188 put_bits(&s->pb, 1, 1);
00189 put_bits(&s->pb, 5, s->qscale);
00190 put_bits(&s->pb, 1, 0);
00191
00192 if(s->h263_aic){
00193 s->y_dc_scale_table=
00194 s->c_dc_scale_table= ff_aic_dc_scale_table;
00195 }else{
00196 s->y_dc_scale_table=
00197 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
00198 }
00199 }
00200
00201 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
00202 {
00203 int format, coded_frame_rate, coded_frame_rate_base, i, temp_ref;
00204 int best_clock_code=1;
00205 int best_divisor=60;
00206 int best_error= INT_MAX;
00207
00208 if(s->h263_plus){
00209 for(i=0; i<2; i++){
00210 int div, error;
00211 div= (s->avctx->time_base.num*1800000LL + 500LL*s->avctx->time_base.den) / ((1000LL+i)*s->avctx->time_base.den);
00212 div= clip(1, div, 127);
00213 error= ABS(s->avctx->time_base.num*1800000LL - (1000LL+i)*s->avctx->time_base.den*div);
00214 if(error < best_error){
00215 best_error= error;
00216 best_divisor= div;
00217 best_clock_code= i;
00218 }
00219 }
00220 }
00221 s->custom_pcf= best_clock_code!=1 || best_divisor!=60;
00222 coded_frame_rate= 1800000;
00223 coded_frame_rate_base= (1000+best_clock_code)*best_divisor;
00224
00225 align_put_bits(&s->pb);
00226
00227
00228 s->ptr_lastgob = pbBufPtr(&s->pb);
00229 put_bits(&s->pb, 22, 0x20);
00230 temp_ref= s->picture_number * (int64_t)coded_frame_rate * s->avctx->time_base.num /
00231 (coded_frame_rate_base * (int64_t)s->avctx->time_base.den);
00232 put_bits(&s->pb, 8, temp_ref & 0xff);
00233
00234 put_bits(&s->pb, 1, 1);
00235 put_bits(&s->pb, 1, 0);
00236 put_bits(&s->pb, 1, 0);
00237 put_bits(&s->pb, 1, 0);
00238 put_bits(&s->pb, 1, 0);
00239
00240 format = h263_get_picture_format(s->width, s->height);
00241 if (!s->h263_plus) {
00242
00243 put_bits(&s->pb, 3, format);
00244 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
00245
00246
00247
00248 put_bits(&s->pb, 1, 0);
00249 put_bits(&s->pb, 1, 0);
00250 put_bits(&s->pb, 1, s->obmc);
00251 put_bits(&s->pb, 1, 0);
00252 put_bits(&s->pb, 5, s->qscale);
00253 put_bits(&s->pb, 1, 0);
00254 } else {
00255 int ufep=1;
00256
00257
00258
00259 put_bits(&s->pb, 3, 7);
00260 put_bits(&s->pb,3,ufep);
00261 if (format == 7)
00262 put_bits(&s->pb,3,6);
00263 else
00264 put_bits(&s->pb, 3, format);
00265
00266 put_bits(&s->pb,1, s->custom_pcf);
00267 put_bits(&s->pb,1, s->umvplus);
00268 put_bits(&s->pb,1,0);
00269 put_bits(&s->pb,1,s->obmc);
00270 put_bits(&s->pb,1,s->h263_aic);
00271 put_bits(&s->pb,1,s->loop_filter);
00272 put_bits(&s->pb,1,s->h263_slice_structured);
00273 put_bits(&s->pb,1,0);
00274 put_bits(&s->pb,1,0);
00275 put_bits(&s->pb,1,s->alt_inter_vlc);
00276 put_bits(&s->pb,1,s->modified_quant);
00277 put_bits(&s->pb,1,1);
00278 put_bits(&s->pb,3,0);
00279
00280 put_bits(&s->pb, 3, s->pict_type == P_TYPE);
00281
00282 put_bits(&s->pb,1,0);
00283 put_bits(&s->pb,1,0);
00284 put_bits(&s->pb,1,s->no_rounding);
00285 put_bits(&s->pb,2,0);
00286 put_bits(&s->pb,1,1);
00287
00288
00289 put_bits(&s->pb, 1, 0);
00290
00291 if (format == 7) {
00292
00293 aspect_to_info(s, s->avctx->sample_aspect_ratio);
00294
00295 put_bits(&s->pb,4,s->aspect_ratio_info);
00296 put_bits(&s->pb,9,(s->width >> 2) - 1);
00297 put_bits(&s->pb,1,1);
00298 put_bits(&s->pb,9,(s->height >> 2));
00299 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
00300 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
00301 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
00302 }
00303 }
00304 if(s->custom_pcf){
00305 if(ufep){
00306 put_bits(&s->pb, 1, best_clock_code);
00307 put_bits(&s->pb, 7, best_divisor);
00308 }
00309 put_bits(&s->pb, 2, (temp_ref>>8)&3);
00310 }
00311
00312
00313 if (s->umvplus)
00314
00315
00316 put_bits(&s->pb,2,1);
00317 if(s->h263_slice_structured)
00318 put_bits(&s->pb,2,0);
00319
00320 put_bits(&s->pb, 5, s->qscale);
00321 }
00322
00323 put_bits(&s->pb, 1, 0);
00324
00325 if(s->h263_slice_structured){
00326 put_bits(&s->pb, 1, 1);
00327
00328 assert(s->mb_x == 0 && s->mb_y == 0);
00329 ff_h263_encode_mba(s);
00330
00331 put_bits(&s->pb, 1, 1);
00332 }
00333
00334 if(s->h263_aic){
00335 s->y_dc_scale_table=
00336 s->c_dc_scale_table= ff_aic_dc_scale_table;
00337 }else{
00338 s->y_dc_scale_table=
00339 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
00340 }
00341 }
00342
00346 void h263_encode_gob_header(MpegEncContext * s, int mb_line)
00347 {
00348 put_bits(&s->pb, 17, 1);
00349
00350 if(s->h263_slice_structured){
00351 put_bits(&s->pb, 1, 1);
00352
00353 ff_h263_encode_mba(s);
00354
00355 if(s->mb_num > 1583)
00356 put_bits(&s->pb, 1, 1);
00357 put_bits(&s->pb, 5, s->qscale);
00358 put_bits(&s->pb, 1, 1);
00359 put_bits(&s->pb, 2, s->pict_type == I_TYPE);
00360 }else{
00361 int gob_number= mb_line / s->gob_index;
00362
00363 put_bits(&s->pb, 5, gob_number);
00364 put_bits(&s->pb, 2, s->pict_type == I_TYPE);
00365 put_bits(&s->pb, 5, s->qscale);
00366 }
00367 }
00368
00369 static inline int get_block_rate(MpegEncContext * s, DCTELEM block[64], int block_last_index, uint8_t scantable[64]){
00370 int last=0;
00371 int j;
00372 int rate=0;
00373
00374 for(j=1; j<=block_last_index; j++){
00375 const int index= scantable[j];
00376 int level= block[index];
00377 if(level){
00378 level+= 64;
00379 if((level&(~127)) == 0){
00380 if(j<block_last_index) rate+= s->intra_ac_vlc_length [UNI_AC_ENC_INDEX(j-last-1, level)];
00381 else rate+= s->intra_ac_vlc_last_length[UNI_AC_ENC_INDEX(j-last-1, level)];
00382 }else
00383 rate += s->ac_esc_length;
00384 level-= 64;
00385
00386 last= j;
00387 }
00388 }
00389
00390 return rate;
00391 }
00392
00393 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
00394 {
00395 int score= 0;
00396 int i, n;
00397 int8_t * const qscale_table= s->current_picture.qscale_table;
00398
00399 memcpy(zigzag_last_index, s->block_last_index, sizeof(int)*6);
00400
00401 for(n=0; n<6; n++){
00402 int16_t *ac_val, *ac_val1;
00403
00404 score -= get_block_rate(s, block[n], s->block_last_index[n], s->intra_scantable.permutated);
00405
00406 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
00407 ac_val1= ac_val;
00408 if(dir[n]){
00409 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
00410
00411 ac_val-= s->block_wrap[n]*16;
00412 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
00413
00414 for(i=1; i<8; i++){
00415 const int level= block[n][s->dsp.idct_permutation[i ]];
00416 block[n][s->dsp.idct_permutation[i ]] = level - ac_val[i+8];
00417 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
00418 ac_val1[i+8]= level;
00419 }
00420 }else{
00421
00422 for(i=1; i<8; i++){
00423 const int level= block[n][s->dsp.idct_permutation[i ]];
00424 block[n][s->dsp.idct_permutation[i ]] = level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
00425 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
00426 ac_val1[i+8]= level;
00427 }
00428 }
00429 st[n]= s->intra_h_scantable.permutated;
00430 }else{
00431 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
00432
00433 ac_val-= 16;
00434 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
00435
00436 for(i=1; i<8; i++){
00437 const int level= block[n][s->dsp.idct_permutation[i<<3]];
00438 block[n][s->dsp.idct_permutation[i<<3]]= level - ac_val[i];
00439 ac_val1[i ]= level;
00440 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
00441 }
00442 }else{
00443
00444 for(i=1; i<8; i++){
00445 const int level= block[n][s->dsp.idct_permutation[i<<3]];
00446 block[n][s->dsp.idct_permutation[i<<3]]= level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
00447 ac_val1[i ]= level;
00448 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
00449 }
00450 }
00451 st[n]= s->intra_v_scantable.permutated;
00452 }
00453
00454 for(i=63; i>0; i--)
00455 if(block[n][ st[n][i] ]) break;
00456 s->block_last_index[n]= i;
00457
00458 score += get_block_rate(s, block[n], s->block_last_index[n], st[n]);
00459 }
00460
00461 return score < 0;
00462 }
00463
00464 static inline void restore_ac_coeffs(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
00465 {
00466 int i, n;
00467 memcpy(s->block_last_index, zigzag_last_index, sizeof(int)*6);
00468
00469 for(n=0; n<6; n++){
00470 int16_t *ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
00471
00472 st[n]= s->intra_scantable.permutated;
00473 if(dir[n]){
00474
00475 for(i=1; i<8; i++){
00476 block[n][s->dsp.idct_permutation[i ]] = ac_val[i+8];
00477 }
00478 }else{
00479
00480 for(i=1; i<8; i++){
00481 block[n][s->dsp.idct_permutation[i<<3]]= ac_val[i ];
00482 }
00483 }
00484 }
00485 }
00486
00490 void ff_clean_h263_qscales(MpegEncContext *s){
00491 int i;
00492 int8_t * const qscale_table= s->current_picture.qscale_table;
00493
00494 for(i=1; i<s->mb_num; i++){
00495 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i-1] ] >2)
00496 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i-1] ]+2;
00497 }
00498 for(i=s->mb_num-2; i>=0; i--){
00499 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i+1] ] >2)
00500 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i+1] ]+2;
00501 }
00502
00503 if(s->codec_id != CODEC_ID_H263P){
00504 for(i=1; i<s->mb_num; i++){
00505 int mb_xy= s->mb_index2xy[i];
00506
00507 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_INTER4V)){
00508 s->mb_type[mb_xy]&= ~CANDIDATE_MB_TYPE_INTER4V;
00509 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_INTER;
00510 }
00511 }
00512 }
00513 }
00514
00518 void ff_clean_mpeg4_qscales(MpegEncContext *s){
00519 int i;
00520 int8_t * const qscale_table= s->current_picture.qscale_table;
00521
00522 ff_clean_h263_qscales(s);
00523
00524 if(s->pict_type== B_TYPE){
00525 int odd=0;
00526
00527
00528 for(i=0; i<s->mb_num; i++){
00529 int mb_xy= s->mb_index2xy[i];
00530 odd += qscale_table[mb_xy]&1;
00531 }
00532
00533 if(2*odd > s->mb_num) odd=1;
00534 else odd=0;
00535
00536 for(i=0; i<s->mb_num; i++){
00537 int mb_xy= s->mb_index2xy[i];
00538 if((qscale_table[mb_xy]&1) != odd)
00539 qscale_table[mb_xy]++;
00540 if(qscale_table[mb_xy] > 31)
00541 qscale_table[mb_xy]= 31;
00542 }
00543
00544 for(i=1; i<s->mb_num; i++){
00545 int mb_xy= s->mb_index2xy[i];
00546 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_DIRECT)){
00547 s->mb_type[mb_xy]&= ~CANDIDATE_MB_TYPE_DIRECT;
00548 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_BIDIR;
00549 }
00550 }
00551 }
00552 }
00553
00554 #endif //CONFIG_ENCODERS
00555
00559 int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){
00560 const int mb_index= s->mb_x + s->mb_y*s->mb_stride;
00561 const int colocated_mb_type= s->next_picture.mb_type[mb_index];
00562 int xy= s->block_index[0];
00563 uint16_t time_pp= s->pp_time;
00564 uint16_t time_pb= s->pb_time;
00565 int i;
00566
00567
00568
00569 if(IS_8X8(colocated_mb_type)){
00570 s->mv_type = MV_TYPE_8X8;
00571 for(i=0; i<4; i++){
00572 xy= s->block_index[i];
00573 s->mv[0][i][0] = s->next_picture.motion_val[0][xy][0]*time_pb/time_pp + mx;
00574 s->mv[0][i][1] = s->next_picture.motion_val[0][xy][1]*time_pb/time_pp + my;
00575 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->next_picture.motion_val[0][xy][0]
00576 : s->next_picture.motion_val[0][xy][0]*(time_pb - time_pp)/time_pp;
00577 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->next_picture.motion_val[0][xy][1]
00578 : s->next_picture.motion_val[0][xy][1]*(time_pb - time_pp)/time_pp;
00579 }
00580 return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_L0L1;
00581 } else if(IS_INTERLACED(colocated_mb_type)){
00582 s->mv_type = MV_TYPE_FIELD;
00583 for(i=0; i<2; i++){
00584 int field_select= s->next_picture.ref_index[0][s->block_index[2*i]];
00585 if(s->top_field_first){
00586 time_pp= s->pp_field_time - field_select + i;
00587 time_pb= s->pb_field_time - field_select + i;
00588 }else{
00589 time_pp= s->pp_field_time + field_select - i;
00590 time_pb= s->pb_field_time + field_select - i;
00591 }
00592 s->mv[0][i][0] = s->p_field_mv_table[i][0][mb_index][0]*time_pb/time_pp + mx;
00593 s->mv[0][i][1] = s->p_field_mv_table[i][0][mb_index][1]*time_pb/time_pp + my;
00594 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->p_field_mv_table[i][0][mb_index][0]
00595 : s->p_field_mv_table[i][0][mb_index][0]*(time_pb - time_pp)/time_pp;
00596 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->p_field_mv_table[i][0][mb_index][1]
00597 : s->p_field_mv_table[i][0][mb_index][1]*(time_pb - time_pp)/time_pp;
00598 }
00599 return MB_TYPE_DIRECT2 | MB_TYPE_16x8 | MB_TYPE_L0L1 | MB_TYPE_INTERLACED;
00600 }else{
00601 s->mv[0][0][0] = s->mv[0][1][0] = s->mv[0][2][0] = s->mv[0][3][0] = s->next_picture.motion_val[0][xy][0]*time_pb/time_pp + mx;
00602 s->mv[0][0][1] = s->mv[0][1][1] = s->mv[0][2][1] = s->mv[0][3][1] = s->next_picture.motion_val[0][xy][1]*time_pb/time_pp + my;
00603 s->mv[1][0][0] = s->mv[1][1][0] = s->mv[1][2][0] = s->mv[1][3][0] = mx ? s->mv[0][0][0] - s->next_picture.motion_val[0][xy][0]
00604 : s->next_picture.motion_val[0][xy][0]*(time_pb - time_pp)/time_pp;
00605 s->mv[1][0][1] = s->mv[1][1][1] = s->mv[1][2][1] = s->mv[1][3][1] = my ? s->mv[0][0][1] - s->next_picture.motion_val[0][xy][1]
00606 : s->next_picture.motion_val[0][xy][1]*(time_pb - time_pp)/time_pp;
00607 if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample)
00608 s->mv_type= MV_TYPE_16X16;
00609 else
00610 s->mv_type= MV_TYPE_8X8;
00611 return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_L0L1;
00612 }
00613 }
00614
00615 void ff_h263_update_motion_val(MpegEncContext * s){
00616 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
00617
00618 const int wrap = s->b8_stride;
00619 const int xy = s->block_index[0];
00620
00621 s->current_picture.mbskip_table[mb_xy]= s->mb_skipped;
00622
00623 if(s->mv_type != MV_TYPE_8X8){
00624 int motion_x, motion_y;
00625 if (s->mb_intra) {
00626 motion_x = 0;
00627 motion_y = 0;
00628 } else if (s->mv_type == MV_TYPE_16X16) {
00629 motion_x = s->mv[0][0][0];
00630 motion_y = s->mv[0][0][1];
00631 } else {
00632 int i;
00633 motion_x = s->mv[0][0][0] + s->mv[0][1][0];
00634 motion_y = s->mv[0][0][1] + s->mv[0][1][1];
00635 motion_x = (motion_x>>1) | (motion_x&1);
00636 for(i=0; i<2; i++){
00637 s->p_field_mv_table[i][0][mb_xy][0]= s->mv[0][i][0];
00638 s->p_field_mv_table[i][0][mb_xy][1]= s->mv[0][i][1];
00639 }
00640 s->current_picture.ref_index[0][xy ]=
00641 s->current_picture.ref_index[0][xy + 1]= s->field_select[0][0];
00642 s->current_picture.ref_index[0][xy + wrap ]=
00643 s->current_picture.ref_index[0][xy + wrap + 1]= s->field_select[0][1];
00644 }
00645
00646
00647 s->current_picture.motion_val[0][xy][0] = motion_x;
00648 s->current_picture.motion_val[0][xy][1] = motion_y;
00649 s->current_picture.motion_val[0][xy + 1][0] = motion_x;
00650 s->current_picture.motion_val[0][xy + 1][1] = motion_y;
00651 s->current_picture.motion_val[0][xy + wrap][0] = motion_x;
00652 s->current_picture.motion_val[0][xy + wrap][1] = motion_y;
00653 s->current_picture.motion_val[0][xy + 1 + wrap][0] = motion_x;
00654 s->current_picture.motion_val[0][xy + 1 + wrap][1] = motion_y;
00655 }
00656
00657 if(s->encoding){
00658 if (s->mv_type == MV_TYPE_8X8)
00659 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_8x8;
00660 else if(s->mb_intra)
00661 s->current_picture.mb_type[mb_xy]= MB_TYPE_INTRA;
00662 else
00663 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_16x16;
00664 }
00665 }
00666
00667 #ifdef CONFIG_ENCODERS
00668
00669 static inline int h263_get_motion_length(MpegEncContext * s, int val, int f_code){
00670 int l, bit_size, code;
00671
00672 if (val == 0) {
00673 return mvtab[0][1];
00674 } else {
00675 bit_size = f_code - 1;
00676
00677 l= INT_BIT - 6 - bit_size;
00678 val = (val<<l)>>l;
00679 val--;
00680 code = (val >> bit_size) + 1;
00681
00682 return mvtab[code][1] + 1 + bit_size;
00683 }
00684 }
00685
00686 static inline void ff_h263_encode_motion_vector(MpegEncContext * s, int x, int y, int f_code){
00687 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
00688 skip_put_bits(&s->pb,
00689 h263_get_motion_length(s, x, f_code)
00690 +h263_get_motion_length(s, y, f_code));
00691 }else{
00692 ff_h263_encode_motion(s, x, f_code);
00693 ff_h263_encode_motion(s, y, f_code);
00694 }
00695 }
00696
00697 static inline int get_p_cbp(MpegEncContext * s,
00698 DCTELEM block[6][64],
00699 int motion_x, int motion_y){
00700 int cbp, i;
00701
00702 if(s->flags & CODEC_FLAG_CBP_RD){
00703 int best_cbpy_score= INT_MAX;
00704 int best_cbpc_score= INT_MAX;
00705 int cbpc = (-1), cbpy= (-1);
00706 const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0);
00707 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
00708
00709 for(i=0; i<4; i++){
00710 int score= inter_MCBPC_bits[i + offset] * lambda;
00711 if(i&1) score += s->coded_score[5];
00712 if(i&2) score += s->coded_score[4];
00713
00714 if(score < best_cbpc_score){
00715 best_cbpc_score= score;
00716 cbpc= i;
00717 }
00718 }
00719
00720 for(i=0; i<16; i++){
00721 int score= cbpy_tab[i ^ 0xF][1] * lambda;
00722 if(i&1) score += s->coded_score[3];
00723 if(i&2) score += s->coded_score[2];
00724 if(i&4) score += s->coded_score[1];
00725 if(i&8) score += s->coded_score[0];
00726
00727 if(score < best_cbpy_score){
00728 best_cbpy_score= score;
00729 cbpy= i;
00730 }
00731 }
00732 cbp= cbpc + 4*cbpy;
00733 if ((motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16){
00734 if(best_cbpy_score + best_cbpc_score + 2*lambda >= 0)
00735 cbp= 0;
00736 }
00737
00738 for (i = 0; i < 6; i++) {
00739 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
00740 s->block_last_index[i]= -1;
00741 memset(s->block[i], 0, sizeof(DCTELEM)*64);
00742 }
00743 }
00744 }else{
00745 cbp= 0;
00746 for (i = 0; i < 6; i++) {
00747 if (s->block_last_index[i] >= 0)
00748 cbp |= 1 << (5 - i);
00749 }
00750 }
00751 return cbp;
00752 }
00753
00754 static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64],
00755 int motion_x, int motion_y, int mb_type){
00756 int cbp=0, i;
00757
00758 if(s->flags & CODEC_FLAG_CBP_RD){
00759 int score=0;
00760 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
00761
00762 for(i=0; i<6; i++){
00763 if(s->coded_score[i] < 0){
00764 score += s->coded_score[i];
00765 cbp |= 1 << (5 - i);
00766 }
00767 }
00768
00769 if(cbp){
00770 int zero_score= -6;
00771 if ((motion_x | motion_y | s->dquant | mb_type) == 0){
00772 zero_score-= 4;
00773 }
00774
00775 zero_score*= lambda;
00776 if(zero_score <= score){
00777 cbp=0;
00778 }
00779 }
00780
00781 for (i = 0; i < 6; i++) {
00782 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
00783 s->block_last_index[i]= -1;
00784 memset(s->block[i], 0, sizeof(DCTELEM)*64);
00785 }
00786 }
00787 }else{
00788 for (i = 0; i < 6; i++) {
00789 if (s->block_last_index[i] >= 0)
00790 cbp |= 1 << (5 - i);
00791 }
00792 }
00793 return cbp;
00794 }
00795
00796 static inline void mpeg4_encode_blocks(MpegEncContext * s, DCTELEM block[6][64], int intra_dc[6],
00797 uint8_t **scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb){
00798 int i;
00799
00800 if(scan_table){
00801 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
00802 for (i = 0; i < 6; i++) {
00803 skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, intra_dc[i], scan_table[i]));
00804 }
00805 }else{
00806
00807 for (i = 0; i < 6; i++) {
00808 mpeg4_encode_block(s, block[i], i, intra_dc[i], scan_table[i], dc_pb, ac_pb);
00809 }
00810 }
00811 }else{
00812 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
00813 for (i = 0; i < 6; i++) {
00814 skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, 0, s->intra_scantable.permutated));
00815 }
00816 }else{
00817
00818 for (i = 0; i < 6; i++) {
00819 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, dc_pb, ac_pb);
00820 }
00821 }
00822 }
00823 }
00824
00825 void mpeg4_encode_mb(MpegEncContext * s,
00826 DCTELEM block[6][64],
00827 int motion_x, int motion_y)
00828 {
00829 int cbpc, cbpy, pred_x, pred_y;
00830 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
00831 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=B_TYPE ? &s->tex_pb : &s->pb;
00832 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=I_TYPE ? &s->pb2 : &s->pb;
00833 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
00834 const int dquant_code[5]= {1,0,9,2,3};
00835
00836
00837 if (!s->mb_intra) {
00838 int i, cbp;
00839
00840 if(s->pict_type==B_TYPE){
00841 static const int mb_type_table[8]= {-1, 2, 3, 1,-1,-1,-1, 0};
00842 int mb_type= mb_type_table[s->mv_dir];
00843
00844 if(s->mb_x==0){
00845 for(i=0; i<2; i++){
00846 s->last_mv[i][0][0]=
00847 s->last_mv[i][0][1]=
00848 s->last_mv[i][1][0]=
00849 s->last_mv[i][1][1]= 0;
00850 }
00851 }
00852
00853 assert(s->dquant>=-2 && s->dquant<=2);
00854 assert((s->dquant&1)==0);
00855 assert(mb_type>=0);
00856
00857
00858 if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){
00859 s->skip_count++;
00860 s->mv[0][0][0]=
00861 s->mv[0][0][1]=
00862 s->mv[1][0][0]=
00863 s->mv[1][0][1]= 0;
00864 s->mv_dir= MV_DIR_FORWARD;
00865 s->qscale -= s->dquant;
00866
00867
00868 return;
00869 }
00870
00871 cbp= get_b_cbp(s, block, motion_x, motion_y, mb_type);
00872
00873 if ((cbp | motion_x | motion_y | mb_type) ==0) {
00874
00875 assert(s->dquant==0);
00876
00877 put_bits(&s->pb, 1, 1);
00878
00879 if(interleaved_stats){
00880 s->misc_bits++;
00881 s->last_bits++;
00882 }
00883 s->skip_count++;
00884 return;
00885 }
00886
00887 put_bits(&s->pb, 1, 0);
00888 put_bits(&s->pb, 1, cbp ? 0 : 1);
00889 put_bits(&s->pb, mb_type+1, 1);
00890 if(cbp) put_bits(&s->pb, 6, cbp);
00891
00892 if(cbp && mb_type){
00893 if(s->dquant)
00894 put_bits(&s->pb, 2, (s->dquant>>2)+3);
00895 else
00896 put_bits(&s->pb, 1, 0);
00897 }else
00898 s->qscale -= s->dquant;
00899
00900 if(!s->progressive_sequence){
00901 if(cbp)
00902 put_bits(&s->pb, 1, s->interlaced_dct);
00903 if(mb_type)
00904 put_bits(&s->pb, 1, s->mv_type == MV_TYPE_FIELD);
00905 }
00906
00907 if(interleaved_stats){
00908 s->misc_bits+= get_bits_diff(s);
00909 }
00910
00911 if(mb_type == 0){
00912 assert(s->mv_dir & MV_DIRECT);
00913 ff_h263_encode_motion_vector(s, motion_x, motion_y, 1);
00914 s->b_count++;
00915 s->f_count++;
00916 }else{
00917 assert(mb_type > 0 && mb_type < 4);
00918 if(s->mv_type != MV_TYPE_FIELD){
00919 if(s->mv_dir & MV_DIR_FORWARD){
00920 ff_h263_encode_motion_vector(s, s->mv[0][0][0] - s->last_mv[0][0][0],
00921 s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
00922 s->last_mv[0][0][0]= s->last_mv[0][1][0]= s->mv[0][0][0];
00923 s->last_mv[0][0][1]= s->last_mv[0][1][1]= s->mv[0][0][1];
00924 s->f_count++;
00925 }
00926 if(s->mv_dir & MV_DIR_BACKWARD){
00927 ff_h263_encode_motion_vector(s, s->mv[1][0][0] - s->last_mv[1][0][0],
00928 s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
00929 s->last_mv[1][0][0]= s->last_mv[1][1][0]= s->mv[1][0][0];
00930 s->last_mv[1][0][1]= s->last_mv[1][1][1]= s->mv[1][0][1];
00931 s->b_count++;
00932 }
00933 }else{
00934 if(s->mv_dir & MV_DIR_FORWARD){
00935 put_bits(&s->pb, 1, s->field_select[0][0]);
00936 put_bits(&s->pb, 1, s->field_select[0][1]);
00937 }
00938 if(s->mv_dir & MV_DIR_BACKWARD){
00939 put_bits(&s->pb, 1, s->field_select[1][0]);
00940 put_bits(&s->pb, 1, s->field_select[1][1]);
00941 }
00942 if(s->mv_dir & MV_DIR_FORWARD){
00943 for(i=0; i<2; i++){
00944 ff_h263_encode_motion_vector(s, s->mv[0][i][0] - s->last_mv[0][i][0] ,
00945 s->mv[0][i][1] - s->last_mv[0][i][1]/2, s->f_code);
00946 s->last_mv[0][i][0]= s->mv[0][i][0];
00947 s->last_mv[0][i][1]= s->mv[0][i][1]*2;
00948 }
00949 s->f_count++;
00950 }
00951 if(s->mv_dir & MV_DIR_BACKWARD){
00952 for(i=0; i<2; i++){
00953 ff_h263_encode_motion_vector(s, s->mv[1][i][0] - s->last_mv[1][i][0] ,
00954 s->mv[1][i][1] - s->last_mv[1][i][1]/2, s->b_code);
00955 s->last_mv[1][i][0]= s->mv[1][i][0];
00956 s->last_mv[1][i][1]= s->mv[1][i][1]*2;
00957 }
00958 s->b_count++;
00959 }
00960 }
00961 }
00962
00963 if(interleaved_stats){
00964 s->mv_bits+= get_bits_diff(s);
00965 }
00966
00967 mpeg4_encode_blocks(s, block, NULL, NULL, NULL, &s->pb);
00968
00969 if(interleaved_stats){
00970 s->p_tex_bits+= get_bits_diff(s);
00971 }
00972
00973 }else{
00974 cbp= get_p_cbp(s, block, motion_x, motion_y);
00975
00976 if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
00977
00978
00979 if(s->max_b_frames>0){
00980 int i;
00981 int x,y, offset;
00982 uint8_t *p_pic;
00983
00984 x= s->mb_x*16;
00985 y= s->mb_y*16;
00986 if(x+16 > s->width) x= s->width-16;
00987 if(y+16 > s->height) y= s->height-16;
00988
00989 offset= x + y*s->linesize;
00990 p_pic= s->new_picture.data[0] + offset;
00991
00992 s->mb_skipped=1;
00993 for(i=0; i<s->max_b_frames; i++){
00994 uint8_t *b_pic;
00995 int diff;
00996 Picture *pic= s->reordered_input_picture[i+1];
00997
00998 if(pic==NULL || pic->pict_type!=B_TYPE) break;
00999
01000 b_pic= pic->data[0] + offset + 16;
01001 diff= s->dsp.sad[0](NULL, p_pic, b_pic, s->linesize, 16);
01002 if(diff>s->qscale*70){
01003 s->mb_skipped=0;
01004 break;
01005 }
01006 }
01007 }else
01008 s->mb_skipped=1;
01009
01010 if(s->mb_skipped==1){
01011
01012 put_bits(&s->pb, 1, 1);
01013
01014 if(interleaved_stats){
01015 s->misc_bits++;
01016 s->last_bits++;
01017 }
01018 s->skip_count++;
01019
01020 return;
01021 }
01022 }
01023
01024 put_bits(&s->pb, 1, 0);
01025 cbpc = cbp & 3;
01026 cbpy = cbp >> 2;
01027 cbpy ^= 0xf;
01028 if(s->mv_type==MV_TYPE_16X16){
01029 if(s->dquant) cbpc+= 8;
01030 put_bits(&s->pb,
01031 inter_MCBPC_bits[cbpc],
01032 inter_MCBPC_code[cbpc]);
01033
01034 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
01035 if(s->dquant)
01036 put_bits(pb2, 2, dquant_code[s->dquant+2]);
01037
01038 if(!s->progressive_sequence){
01039 if(cbp)
01040 put_bits(pb2, 1, s->interlaced_dct);
01041 put_bits(pb2, 1, 0);
01042 }
01043
01044 if(interleaved_stats){
01045 s->misc_bits+= get_bits_diff(s);
01046 }
01047
01048
01049 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
01050
01051 ff_h263_encode_motion_vector(s, motion_x - pred_x,
01052 motion_y - pred_y, s->f_code);
01053 }else if(s->mv_type==MV_TYPE_FIELD){
01054 if(s->dquant) cbpc+= 8;
01055 put_bits(&s->pb,
01056 inter_MCBPC_bits[cbpc],
01057 inter_MCBPC_code[cbpc]);
01058
01059 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
01060 if(s->dquant)
01061 put_bits(pb2, 2, dquant_code[s->dquant+2]);
01062
01063 assert(!s->progressive_sequence);
01064 if(cbp)
01065 put_bits(pb2, 1, s->interlaced_dct);
01066 put_bits(pb2, 1, 1);
01067
01068 if(interleaved_stats){
01069 s->misc_bits+= get_bits_diff(s);
01070 }
01071
01072
01073 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
01074 pred_y /=2;
01075
01076 put_bits(&s->pb, 1, s->field_select[0][0]);
01077 put_bits(&s->pb, 1, s->field_select[0][1]);
01078
01079 ff_h263_encode_motion_vector(s, s->mv[0][0][0] - pred_x,
01080 s->mv[0][0][1] - pred_y, s->f_code);
01081 ff_h263_encode_motion_vector(s, s->mv[0][1][0] - pred_x,
01082 s->mv[0][1][1] - pred_y, s->f_code);
01083 }else{
01084 assert(s->mv_type==MV_TYPE_8X8);
01085 put_bits(&s->pb,
01086 inter_MCBPC_bits[cbpc+16],
01087 inter_MCBPC_code[cbpc+16]);
01088 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
01089
01090 if(!s->progressive_sequence){
01091 if(cbp)
01092 put_bits(pb2, 1, s->interlaced_dct);
01093 }
01094
01095 if(interleaved_stats){
01096 s->misc_bits+= get_bits_diff(s);
01097 }
01098
01099 for(i=0; i<4; i++){
01100
01101 h263_pred_motion(s, i, 0, &pred_x, &pred_y);
01102
01103 ff_h263_encode_motion_vector(s, s->current_picture.motion_val[0][ s->block_index[i] ][0] - pred_x,
01104 s->current_picture.motion_val[0][ s->block_index[i] ][1] - pred_y, s->f_code);
01105 }
01106 }
01107
01108 if(interleaved_stats){
01109 s->mv_bits+= get_bits_diff(s);
01110 }
01111
01112 mpeg4_encode_blocks(s, block, NULL, NULL, NULL, tex_pb);
01113
01114 if(interleaved_stats){
01115 s->p_tex_bits+= get_bits_diff(s);
01116 }
01117 s->f_count++;
01118 }
01119 } else {
01120 int cbp;
01121 int dc_diff[6];
01122 int dir[6];
01123 int zigzag_last_index[6];
01124 uint8_t *scan_table[6];
01125 int i;
01126
01127 for(i=0; i<6; i++){
01128 dc_diff[i]= ff_mpeg4_pred_dc(s, i, block[i][0], &dir[i], 1);
01129 }
01130
01131 if(s->flags & CODEC_FLAG_AC_PRED){
01132 s->ac_pred= decide_ac_pred(s, block, dir, scan_table, zigzag_last_index);
01133 if(!s->ac_pred)
01134 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
01135 }else{
01136 for(i=0; i<6; i++)
01137 scan_table[i]= s->intra_scantable.permutated;
01138 }
01139
01140
01141 cbp = 0;
01142 for (i = 0; i < 6; i++) {
01143 if (s->block_last_index[i] >= 1)
01144 cbp |= 1 << (5 - i);
01145 }
01146
01147 cbpc = cbp & 3;
01148 if (s->pict_type == I_TYPE) {
01149 if(s->dquant) cbpc+=4;
01150 put_bits(&s->pb,
01151 intra_MCBPC_bits[cbpc],
01152 intra_MCBPC_code[cbpc]);
01153 } else {
01154 if(s->dquant) cbpc+=8;
01155 put_bits(&s->pb, 1, 0);
01156 put_bits(&s->pb,
01157 inter_MCBPC_bits[cbpc + 4],
01158 inter_MCBPC_code[cbpc + 4]);
01159 }
01160 put_bits(pb2, 1, s->ac_pred);
01161 cbpy = cbp >> 2;
01162 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
01163 if(s->dquant)
01164 put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
01165
01166 if(!s->progressive_sequence){
01167 put_bits(dc_pb, 1, s->interlaced_dct);
01168 }
01169
01170 if(interleaved_stats){
01171 s->misc_bits+= get_bits_diff(s);
01172 }
01173
01174 mpeg4_encode_blocks(s, block, dc_diff, scan_table, dc_pb, tex_pb);
01175
01176 if(interleaved_stats){
01177 s->i_tex_bits+= get_bits_diff(s);
01178 }
01179 s->i_count++;
01180
01181
01182 if(s->ac_pred)
01183 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
01184 }
01185 }
01186
01187 void h263_encode_mb(MpegEncContext * s,
01188 DCTELEM block[6][64],
01189 int motion_x, int motion_y)
01190 {
01191 int cbpc, cbpy, i, cbp, pred_x, pred_y;
01192 int16_t pred_dc;
01193 int16_t rec_intradc[6];
01194 uint16_t *dc_ptr[6];
01195 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1);
01196 const int dquant_code[5]= {1,0,9,2,3};
01197
01198
01199 if (!s->mb_intra) {
01200
01201 cbp= get_p_cbp(s, block, motion_x, motion_y);
01202
01203 if ((cbp | motion_x | motion_y | s->dquant | (s->mv_type - MV_TYPE_16X16)) == 0) {
01204
01205 put_bits(&s->pb, 1, 1);
01206 if(interleaved_stats){
01207 s->misc_bits++;
01208 s->last_bits++;
01209 }
01210 s->skip_count++;
01211
01212 return;
01213 }
01214 put_bits(&s->pb, 1, 0);
01215
01216 cbpc = cbp & 3;
01217 cbpy = cbp >> 2;
01218 if(s->alt_inter_vlc==0 || cbpc!=3)
01219 cbpy ^= 0xF;
01220 if(s->dquant) cbpc+= 8;
01221 if(s->mv_type==MV_TYPE_16X16){
01222 put_bits(&s->pb,
01223 inter_MCBPC_bits[cbpc],
01224 inter_MCBPC_code[cbpc]);
01225
01226 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
01227 if(s->dquant)
01228 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
01229
01230 if(interleaved_stats){
01231 s->misc_bits+= get_bits_diff(s);
01232 }
01233
01234
01235 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
01236
01237 if (!s->umvplus) {
01238 ff_h263_encode_motion_vector(s, motion_x - pred_x,
01239 motion_y - pred_y, 1);
01240 }
01241 else {
01242 h263p_encode_umotion(s, motion_x - pred_x);
01243 h263p_encode_umotion(s, motion_y - pred_y);
01244 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
01245
01246 put_bits(&s->pb,1,1);
01247 }
01248 }else{
01249 put_bits(&s->pb,
01250 inter_MCBPC_bits[cbpc+16],
01251 inter_MCBPC_code[cbpc+16]);
01252 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
01253 if(s->dquant)
01254 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
01255
01256 if(interleaved_stats){
01257 s->misc_bits+= get_bits_diff(s);
01258 }
01259
01260 for(i=0; i<4; i++){
01261
01262 h263_pred_motion(s, i, 0, &pred_x, &pred_y);
01263
01264 motion_x= s->current_picture.motion_val[0][ s->block_index[i] ][0];
01265 motion_y= s->current_picture.motion_val[0][ s->block_index[i] ][1];
01266 if (!s->umvplus) {
01267 ff_h263_encode_motion_vector(s, motion_x - pred_x,
01268 motion_y - pred_y, 1);
01269 }
01270 else {
01271 h263p_encode_umotion(s, motion_x - pred_x);
01272 h263p_encode_umotion(s, motion_y - pred_y);
01273 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
01274
01275 put_bits(&s->pb,1,1);
01276 }
01277 }
01278 }
01279
01280 if(interleaved_stats){
01281 s->mv_bits+= get_bits_diff(s);
01282 }
01283 } else {
01284 assert(s->mb_intra);
01285
01286 cbp = 0;
01287 if (s->h263_aic) {
01288
01289 for(i=0; i<6; i++) {
01290 int16_t level = block[i][0];
01291 int scale;
01292
01293 if(i<4) scale= s->y_dc_scale;
01294 else scale= s->c_dc_scale;
01295
01296 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
01297 level -= pred_dc;
01298
01299 if (level >= 0)
01300 level = (level + (scale>>1))/scale;
01301 else
01302 level = (level - (scale>>1))/scale;
01303
01304
01305 if (level == 0 && s->block_last_index[i] == 0)
01306 s->block_last_index[i] = -1;
01307
01308 if(!s->modified_quant){
01309 if (level < -127)
01310 level = -127;
01311 else if (level > 127)
01312 level = 127;
01313 }
01314
01315 block[i][0] = level;
01316
01317 rec_intradc[i] = scale*level + pred_dc;
01318
01319 rec_intradc[i] |= 1;
01320
01321
01322
01323 if (rec_intradc[i] < 0)
01324 rec_intradc[i] = 0;
01325 else if (rec_intradc[i] > 2047)
01326 rec_intradc[i] = 2047;
01327
01328
01329 *dc_ptr[i] = rec_intradc[i];
01330 if (s->block_last_index[i] >= 0)
01331 cbp |= 1 << (5 - i);
01332 }
01333 }else{
01334 for(i=0; i<6; i++) {
01335
01336 if (s->block_last_index[i] >= 1)
01337 cbp |= 1 << (5 - i);
01338 }
01339 }
01340
01341 cbpc = cbp & 3;
01342 if (s->pict_type == I_TYPE) {
01343 if(s->dquant) cbpc+=4;
01344 put_bits(&s->pb,
01345 intra_MCBPC_bits[cbpc],
01346 intra_MCBPC_code[cbpc]);
01347 } else {
01348 if(s->dquant) cbpc+=8;
01349 put_bits(&s->pb, 1, 0);
01350 put_bits(&s->pb,
01351 inter_MCBPC_bits[cbpc + 4],
01352 inter_MCBPC_code[cbpc + 4]);
01353 }
01354 if (s->h263_aic) {
01355
01356 put_bits(&s->pb, 1, 0);
01357 }
01358 cbpy = cbp >> 2;
01359 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
01360 if(s->dquant)
01361 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
01362
01363 if(interleaved_stats){
01364 s->misc_bits+= get_bits_diff(s);
01365 }
01366 }
01367
01368 for(i=0; i<6; i++) {
01369
01370 h263_encode_block(s, block[i], i);
01371
01372
01373 if (s->h263_aic && s->mb_intra) {
01374 block[i][0] = rec_intradc[i];
01375
01376 }
01377 }
01378
01379 if(interleaved_stats){
01380 if (!s->mb_intra) {
01381 s->p_tex_bits+= get_bits_diff(s);
01382 s->f_count++;
01383 }else{
01384 s->i_tex_bits+= get_bits_diff(s);
01385 s->i_count++;
01386 }
01387 }
01388 }
01389 #endif
01390
01391 void ff_h263_loop_filter(MpegEncContext * s){
01392 int qp_c;
01393 const int linesize = s->linesize;
01394 const int uvlinesize= s->uvlinesize;
01395 const int xy = s->mb_y * s->mb_stride + s->mb_x;
01396 uint8_t *dest_y = s->dest[0];
01397 uint8_t *dest_cb= s->dest[1];
01398 uint8_t *dest_cr= s->dest[2];
01399
01400
01401
01402
01403
01404
01405
01406 if(!IS_SKIP(s->current_picture.mb_type[xy])){
01407 qp_c= s->qscale;
01408 s->dsp.h263_v_loop_filter(dest_y+8*linesize , linesize, qp_c);
01409 s->dsp.h263_v_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
01410 }else
01411 qp_c= 0;
01412
01413 if(s->mb_y){
01414 int qp_dt, qp_t, qp_tc;
01415
01416 if(IS_SKIP(s->current_picture.mb_type[xy-s->mb_stride]))
01417 qp_t=0;
01418 else
01419 qp_t= s->current_picture.qscale_table[xy-s->mb_stride];
01420
01421 if(qp_c)
01422 qp_tc= qp_c;
01423 else
01424 qp_tc= qp_t;
01425
01426 if(qp_tc){
01427 const int chroma_qp= s->chroma_qscale_table[qp_tc];
01428 s->dsp.h263_v_loop_filter(dest_y , linesize, qp_tc);
01429 s->dsp.h263_v_loop_filter(dest_y+8, linesize, qp_tc);
01430
01431 s->dsp.h263_v_loop_filter(dest_cb , uvlinesize, chroma_qp);
01432 s->dsp.h263_v_loop_filter(dest_cr , uvlinesize, chroma_qp);
01433 }
01434
01435 if(qp_t)
01436 s->dsp.h263_h_loop_filter(dest_y-8*linesize+8 , linesize, qp_t);
01437
01438 if(s->mb_x){
01439 if(qp_t || IS_SKIP(s->current_picture.mb_type[xy-1-s->mb_stride]))
01440 qp_dt= qp_t;
01441 else
01442 qp_dt= s->current_picture.qscale_table[xy-1-s->mb_stride];
01443
01444 if(qp_dt){
01445 const int chroma_qp= s->chroma_qscale_table[qp_dt];
01446 s->dsp.h263_h_loop_filter(dest_y -8*linesize , linesize, qp_dt);
01447 s->dsp.h263_h_loop_filter(dest_cb-8*uvlinesize, uvlinesize, chroma_qp);
01448 s->dsp.h263_h_loop_filter(dest_cr-8*uvlinesize, uvlinesize, chroma_qp);
01449 }
01450 }
01451 }
01452
01453 if(qp_c){
01454 s->dsp.h263_h_loop_filter(dest_y +8, linesize, qp_c);
01455 if(s->mb_y + 1 == s->mb_height)
01456 s->dsp.h263_h_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
01457 }
01458
01459 if(s->mb_x){
01460 int qp_lc;
01461 if(qp_c || IS_SKIP(s->current_picture.mb_type[xy-1]))
01462 qp_lc= qp_c;
01463 else
01464 qp_lc= s->current_picture.qscale_table[xy-1];
01465
01466 if(qp_lc){
01467 s->dsp.h263_h_loop_filter(dest_y, linesize, qp_lc);
01468 if(s->mb_y + 1 == s->mb_height){
01469 const int chroma_qp= s->chroma_qscale_table[qp_lc];
01470 s->dsp.h263_h_loop_filter(dest_y +8* linesize, linesize, qp_lc);
01471 s->dsp.h263_h_loop_filter(dest_cb , uvlinesize, chroma_qp);
01472 s->dsp.h263_h_loop_filter(dest_cr , uvlinesize, chroma_qp);
01473 }
01474 }
01475 }
01476 }
01477
01478 static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr)
01479 {
01480 int x, y, wrap, a, c, pred_dc, scale;
01481 int16_t *dc_val, *ac_val;
01482
01483
01484 if (n < 4) {
01485 x = 2 * s->mb_x + (n & 1);
01486 y = 2 * s->mb_y + ((n & 2) >> 1);
01487 wrap = s->b8_stride;
01488 dc_val = s->dc_val[0];
01489 ac_val = s->ac_val[0][0];
01490 scale = s->y_dc_scale;
01491 } else {
01492 x = s->mb_x;
01493 y = s->mb_y;
01494 wrap = s->mb_stride;
01495 dc_val = s->dc_val[n - 4 + 1];
01496 ac_val = s->ac_val[n - 4 + 1][0];
01497 scale = s->c_dc_scale;
01498 }
01499
01500
01501
01502 a = dc_val[(x - 1) + (y) * wrap];
01503 c = dc_val[(x) + (y - 1) * wrap];
01504
01505
01506 if(s->first_slice_line && n!=3){
01507 if(n!=2) c= 1024;
01508 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
01509 }
01510 pred_dc = 1024;
01511
01512 if (a != 1024 && c != 1024)
01513 pred_dc = (a + c) >> 1;
01514 else if (a != 1024)
01515 pred_dc = a;
01516 else
01517 pred_dc = c;
01518
01519
01520
01521 *dc_val_ptr = &dc_val[x + y * wrap];
01522 return pred_dc;
01523 }
01524
01525 static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n)
01526 {
01527 int x, y, wrap, a, c, pred_dc, scale, i;
01528 int16_t *dc_val, *ac_val, *ac_val1;
01529
01530
01531 if (n < 4) {
01532 x = 2 * s->mb_x + (n & 1);
01533 y = 2 * s->mb_y + (n>> 1);
01534 wrap = s->b8_stride;
01535 dc_val = s->dc_val[0];
01536 ac_val = s->ac_val[0][0];
01537 scale = s->y_dc_scale;
01538 } else {
01539 x = s->mb_x;
01540 y = s->mb_y;
01541 wrap = s->mb_stride;
01542 dc_val = s->dc_val[n - 4 + 1];
01543 ac_val = s->ac_val[n - 4 + 1][0];
01544 scale = s->c_dc_scale;
01545 }
01546
01547 ac_val += ((y) * wrap + (x)) * 16;
01548 ac_val1 = ac_val;
01549
01550
01551
01552
01553 a = dc_val[(x - 1) + (y) * wrap];
01554 c = dc_val[(x) + (y - 1) * wrap];
01555
01556
01557 if(s->first_slice_line && n!=3){
01558 if(n!=2) c= 1024;
01559 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
01560 }
01561
01562 if (s->ac_pred) {
01563 pred_dc = 1024;
01564 if (s->h263_aic_dir) {
01565
01566 if (a != 1024) {
01567 ac_val -= 16;
01568 for(i=1;i<8;i++) {
01569 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
01570 }
01571 pred_dc = a;
01572 }
01573 } else {
01574
01575 if (c != 1024) {
01576 ac_val -= 16 * wrap;
01577 for(i=1;i<8;i++) {
01578 block[s->dsp.idct_permutation[i ]] += ac_val[i + 8];
01579 }
01580 pred_dc = c;
01581 }
01582 }
01583 } else {
01584
01585 if (a != 1024 && c != 1024)
01586 pred_dc = (a + c) >> 1;
01587 else if (a != 1024)
01588 pred_dc = a;
01589 else
01590 pred_dc = c;
01591 }
01592
01593
01594 block[0]=block[0]*scale + pred_dc;
01595
01596 if (block[0] < 0)
01597 block[0] = 0;
01598 else
01599 block[0] |= 1;
01600
01601
01602 dc_val[(x) + (y) * wrap] = block[0];
01603
01604
01605 for(i=1;i<8;i++)
01606 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
01607
01608 for(i=1;i<8;i++)
01609 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
01610 }
01611
01612 int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir,
01613 int *px, int *py)
01614 {
01615 int wrap;
01616 int16_t *A, *B, *C, (*mot_val)[2];
01617 static const int off[4]= {2, 1, 1, -1};
01618
01619 wrap = s->b8_stride;
01620 mot_val = s->current_picture.motion_val[dir] + s->block_index[block];
01621
01622 A = mot_val[ - 1];
01623
01624 if (s->first_slice_line && block<3) {
01625
01626
01627 if(block==0){
01628 if(s->mb_x == s->resync_mb_x){
01629 *px= *py = 0;
01630 }else if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){
01631 C = mot_val[off[block] - wrap];
01632 if(s->mb_x==0){
01633 *px = C[0];
01634 *py = C[1];
01635 }else{
01636 *px = mid_pred(A[0], 0, C[0]);
01637 *py = mid_pred(A[1], 0, C[1]);
01638 }
01639 }else{
01640 *px = A[0];
01641 *py = A[1];
01642 }
01643 }else if(block==1){
01644 if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){
01645 C = mot_val[off[block] - wrap];
01646 *px = mid_pred(A[0], 0, C[0]);
01647 *py = mid_pred(A[1], 0, C[1]);
01648 }else{
01649 *px = A[0];
01650 *py = A[1];
01651 }
01652 }else{
01653 B = mot_val[ - wrap];
01654 C = mot_val[off[block] - wrap];
01655 if(s->mb_x == s->resync_mb_x)
01656 A[0]=A[1]=0;
01657
01658 *px = mid_pred(A[0], B[0], C[0]);
01659 *py = mid_pred(A[1], B[1], C[1]);
01660 }
01661 } else {
01662 B = mot_val[ - wrap];
01663 C = mot_val[off[block] - wrap];
01664 *px = mid_pred(A[0], B[0], C[0]);
01665 *py = mid_pred(A[1], B[1], C[1]);
01666 }
01667 return *mot_val;
01668 }
01669
01670 #ifdef CONFIG_ENCODERS
01671 void ff_h263_encode_motion(MpegEncContext * s, int val, int f_code)
01672 {
01673 int range, l, bit_size, sign, code, bits;
01674
01675 if (val == 0) {
01676
01677 code = 0;
01678 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
01679 } else {
01680 bit_size = f_code - 1;
01681 range = 1 << bit_size;
01682
01683 l= INT_BIT - 6 - bit_size;
01684 val = (val<<l)>>l;
01685 sign = val>>31;
01686 val= (val^sign)-sign;
01687 sign&=1;
01688
01689 val--;
01690 code = (val >> bit_size) + 1;
01691 bits = val & (range - 1);
01692
01693 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
01694 if (bit_size > 0) {
01695 put_bits(&s->pb, bit_size, bits);
01696 }
01697 }
01698 }
01699
01700
01701 static void h263p_encode_umotion(MpegEncContext * s, int val)
01702 {
01703 short sval = 0;
01704 short i = 0;
01705 short n_bits = 0;
01706 short temp_val;
01707 int code = 0;
01708 int tcode;
01709
01710 if ( val == 0)
01711 put_bits(&s->pb, 1, 1);
01712 else if (val == 1)
01713 put_bits(&s->pb, 3, 0);
01714 else if (val == -1)
01715 put_bits(&s->pb, 3, 2);
01716 else {
01717
01718 sval = ((val < 0) ? (short)(-val):(short)val);
01719 temp_val = sval;
01720
01721 while (temp_val != 0) {
01722 temp_val = temp_val >> 1;
01723 n_bits++;
01724 }
01725
01726 i = n_bits - 1;
01727 while (i > 0) {
01728 tcode = (sval & (1 << (i-1))) >> (i-1);
01729 tcode = (tcode << 1) | 1;
01730 code = (code << 2) | tcode;
01731 i--;
01732 }
01733 code = ((code << 1) | (val < 0)) << 1;
01734 put_bits(&s->pb, (2*n_bits)+1, code);
01735
01736 }
01737 }
01738
01739 static void init_mv_penalty_and_fcode(MpegEncContext *s)
01740 {
01741 int f_code;
01742 int mv;
01743
01744 if(mv_penalty==NULL)
01745 mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
01746
01747 for(f_code=1; f_code<=MAX_FCODE; f_code++){
01748 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
01749 int len;
01750
01751 if(mv==0) len= mvtab[0][1];
01752 else{
01753 int val, bit_size, range, code;
01754
01755 bit_size = f_code - 1;
01756 range = 1 << bit_size;
01757
01758 val=mv;
01759 if (val < 0)
01760 val = -val;
01761 val--;
01762 code = (val >> bit_size) + 1;
01763 if(code<33){
01764 len= mvtab[code][1] + 1 + bit_size;
01765 }else{
01766 len= mvtab[32][1] + 2 + bit_size;
01767 }
01768 }
01769
01770 mv_penalty[f_code][mv+MAX_MV]= len;
01771 }
01772 }
01773
01774 for(f_code=MAX_FCODE; f_code>0; f_code--){
01775 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
01776 fcode_tab[mv+MAX_MV]= f_code;
01777 }
01778 }
01779
01780 for(mv=0; mv<MAX_MV*2+1; mv++){
01781 umv_fcode_tab[mv]= 1;
01782 }
01783 }
01784 #endif
01785
01786 #ifdef CONFIG_ENCODERS
01787
01788 static void init_uni_dc_tab(void)
01789 {
01790 int level, uni_code, uni_len;
01791
01792 for(level=-256; level<256; level++){
01793 int size, v, l;
01794
01795 size = 0;
01796 v = abs(level);
01797 while (v) {
01798 v >>= 1;
01799 size++;
01800 }
01801
01802 if (level < 0)
01803 l= (-level) ^ ((1 << size) - 1);
01804 else
01805 l= level;
01806
01807
01808 uni_code= DCtab_lum[size][0];
01809 uni_len = DCtab_lum[size][1];
01810
01811 if (size > 0) {
01812 uni_code<<=size; uni_code|=l;
01813 uni_len+=size;
01814 if (size > 8){
01815 uni_code<<=1; uni_code|=1;
01816 uni_len++;
01817 }
01818 }
01819 uni_DCtab_lum_bits[level+256]= uni_code;
01820 uni_DCtab_lum_len [level+256]= uni_len;
01821
01822
01823 uni_code= DCtab_chrom[size][0];
01824 uni_len = DCtab_chrom[size][1];
01825
01826 if (size > 0) {
01827 uni_code<<=size; uni_code|=l;
01828 uni_len+=size;
01829 if (size > 8){
01830 uni_code<<=1; uni_code|=1;
01831 uni_len++;
01832 }
01833 }
01834 uni_DCtab_chrom_bits[level+256]= uni_code;
01835 uni_DCtab_chrom_len [level+256]= uni_len;
01836
01837 }
01838 }
01839
01840 #endif //CONFIG_ENCODERS
01841
01842 #ifdef CONFIG_ENCODERS
01843 static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
01844 int slevel, run, last;
01845
01846 assert(MAX_LEVEL >= 64);
01847 assert(MAX_RUN >= 63);
01848
01849 for(slevel=-64; slevel<64; slevel++){
01850 if(slevel==0) continue;
01851 for(run=0; run<64; run++){
01852 for(last=0; last<=1; last++){
01853 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
01854 int level= slevel < 0 ? -slevel : slevel;
01855 int sign= slevel < 0 ? 1 : 0;
01856 int bits, len, code;
01857 int level1, run1;
01858
01859 len_tab[index]= 100;
01860
01861
01862 code= get_rl_index(rl, last, run, level);
01863 bits= rl->table_vlc[code][0];
01864 len= rl->table_vlc[code][1];
01865 bits=bits*2+sign; len++;
01866
01867 if(code!=rl->n && len < len_tab[index]){
01868 bits_tab[index]= bits;
01869 len_tab [index]= len;
01870 }
01871 #if 1
01872
01873 bits= rl->table_vlc[rl->n][0];
01874 len= rl->table_vlc[rl->n][1];
01875 bits=bits*2; len++;
01876 level1= level - rl->max_level[last][run];
01877 if(level1>0){
01878 code= get_rl_index(rl, last, run, level1);
01879 bits<<= rl->table_vlc[code][1];
01880 len += rl->table_vlc[code][1];
01881 bits += rl->table_vlc[code][0];
01882 bits=bits*2+sign; len++;
01883
01884 if(code!=rl->n && len < len_tab[index]){
01885 bits_tab[index]= bits;
01886 len_tab [index]= len;
01887 }
01888 }
01889 #endif
01890 #if 1
01891
01892 bits= rl->table_vlc[rl->n][0];
01893 len= rl->table_vlc[rl->n][1];
01894 bits=bits*4+2; len+=2;
01895 run1 = run - rl->max_run[last][level] - 1;
01896 if(run1>=0){
01897 code= get_rl_index(rl, last, run1, level);
01898 bits<<= rl->table_vlc[code][1];
01899 len += rl->table_vlc[code][1];
01900 bits += rl->table_vlc[code][0];
01901 bits=bits*2+sign; len++;
01902
01903 if(code!=rl->n && len < len_tab[index]){
01904 bits_tab[index]= bits;
01905 len_tab [index]= len;
01906 }
01907 }
01908 #endif
01909
01910 bits= rl->table_vlc[rl->n][0];
01911 len = rl->table_vlc[rl->n][1];
01912 bits=bits*4+3; len+=2;
01913 bits=bits*2+last; len++;
01914 bits=bits*64+run; len+=6;
01915 bits=bits*2+1; len++;
01916 bits=bits*4096+(slevel&0xfff); len+=12;
01917 bits=bits*2+1; len++;
01918
01919 if(len < len_tab[index]){
01920 bits_tab[index]= bits;
01921 len_tab [index]= len;
01922 }
01923 }
01924 }
01925 }
01926 }
01927
01928 static void init_uni_h263_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
01929 int slevel, run, last;
01930
01931 assert(MAX_LEVEL >= 64);
01932 assert(MAX_RUN >= 63);
01933
01934 for(slevel=-64; slevel<64; slevel++){
01935 if(slevel==0) continue;
01936 for(run=0; run<64; run++){
01937 for(last=0; last<=1; last++){
01938 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
01939 int level= slevel < 0 ? -slevel : slevel;
01940 int sign= slevel < 0 ? 1 : 0;
01941 int bits, len, code;
01942
01943 len_tab[index]= 100;
01944
01945
01946 code= get_rl_index(rl, last, run, level);
01947 bits= rl->table_vlc[code][0];
01948 len= rl->table_vlc[code][1];
01949 bits=bits*2+sign; len++;
01950
01951 if(code!=rl->n && len < len_tab[index]){
01952 if(bits_tab) bits_tab[index]= bits;
01953 len_tab [index]= len;
01954 }
01955
01956 bits= rl->table_vlc[rl->n][0];
01957 len = rl->table_vlc[rl->n][1];
01958 bits=bits*2+last; len++;
01959 bits=bits*64+run; len+=6;
01960 bits=bits*256+(level&0xff); len+=8;
01961
01962 if(len < len_tab[index]){
01963 if(bits_tab) bits_tab[index]= bits;
01964 len_tab [index]= len;
01965 }
01966 }
01967 }
01968 }
01969 }
01970
01971 void h263_encode_init(MpegEncContext *s)
01972 {
01973 static int done = 0;
01974
01975 if (!done) {
01976 done = 1;
01977
01978 init_uni_dc_tab();
01979
01980 init_rl(&rl_inter, 1);
01981 init_rl(&rl_intra, 1);
01982 init_rl(&rl_intra_aic, 1);
01983
01984 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
01985 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
01986
01987 init_uni_h263_rl_tab(&rl_intra_aic, NULL, uni_h263_intra_aic_rl_len);
01988 init_uni_h263_rl_tab(&rl_inter , NULL, uni_h263_inter_rl_len);
01989
01990 init_mv_penalty_and_fcode(s);
01991 }
01992 s->me.mv_penalty= mv_penalty;
01993
01994 s->intra_ac_vlc_length =s->inter_ac_vlc_length = uni_h263_inter_rl_len;
01995 s->intra_ac_vlc_last_length=s->inter_ac_vlc_last_length= uni_h263_inter_rl_len + 128*64;
01996 if(s->h263_aic){
01997 s->intra_ac_vlc_length = uni_h263_intra_aic_rl_len;
01998 s->intra_ac_vlc_last_length= uni_h263_intra_aic_rl_len + 128*64;
01999 }
02000 s->ac_esc_length= 7+1+6+8;
02001
02002
02003 switch(s->codec_id){
02004 case CODEC_ID_MPEG4:
02005 s->fcode_tab= fcode_tab;
02006 s->min_qcoeff= -2048;
02007 s->max_qcoeff= 2047;
02008 s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len;
02009 s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64;
02010 s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len;
02011 s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64;
02012 s->luma_dc_vlc_length= uni_DCtab_lum_len;
02013 s->chroma_dc_vlc_length= uni_DCtab_chrom_len;
02014 s->ac_esc_length= 7+2+1+6+1+12+1;
02015 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
02016 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
02017
02018 if(s->flags & CODEC_FLAG_GLOBAL_HEADER){
02019
02020 s->avctx->extradata= av_malloc(1024);
02021 init_put_bits(&s->pb, s->avctx->extradata, 1024);
02022
02023 if(!(s->workaround_bugs & FF_BUG_MS))
02024 mpeg4_encode_visual_object_header(s);
02025 mpeg4_encode_vol_header(s, 0, 0);
02026
02027
02028 flush_put_bits(&s->pb);
02029 s->avctx->extradata_size= (put_bits_count(&s->pb)+7)>>3;
02030 }
02031
02032 break;
02033 case CODEC_ID_H263P:
02034 if(s->umvplus)
02035 s->fcode_tab= umv_fcode_tab;
02036 if(s->modified_quant){
02037 s->min_qcoeff= -2047;
02038 s->max_qcoeff= 2047;
02039 }else{
02040 s->min_qcoeff= -127;
02041 s->max_qcoeff= 127;
02042 }
02043 break;
02044
02045 case CODEC_ID_FLV1:
02046 if (s->h263_flv > 1) {
02047 s->min_qcoeff= -1023;
02048 s->max_qcoeff= 1023;
02049 } else {
02050 s->min_qcoeff= -127;
02051 s->max_qcoeff= 127;
02052 }
02053 s->y_dc_scale_table=
02054 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
02055 break;
02056 default:
02057 s->min_qcoeff= -127;
02058 s->max_qcoeff= 127;
02059 s->y_dc_scale_table=
02060 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
02061 }
02062 }
02063
02069 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
02070 {
02071 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
02072 RLTable *rl;
02073
02074 rl = &rl_inter;
02075 if (s->mb_intra && !s->h263_aic) {
02076
02077 level = block[0];
02078
02079 if (level > 254) {
02080 level = 254;
02081 block[0] = 254;
02082 }
02083
02084 else if (level < 1) {
02085 level = 1;
02086 block[0] = 1;
02087 }
02088 if (level == 128)
02089 put_bits(&s->pb, 8, 0xff);
02090 else
02091 put_bits(&s->pb, 8, level);
02092 i = 1;
02093 } else {
02094 i = 0;
02095 if (s->h263_aic && s->mb_intra)
02096 rl = &rl_intra_aic;
02097
02098 if(s->alt_inter_vlc && !s->mb_intra){
02099 int aic_vlc_bits=0;
02100 int inter_vlc_bits=0;
02101 int wrong_pos=-1;
02102 int aic_code;
02103
02104 last_index = s->block_last_index[n];
02105 last_non_zero = i - 1;
02106 for (; i <= last_index; i++) {
02107 j = s->intra_scantable.permutated[i];
02108 level = block[j];
02109 if (level) {
02110 run = i - last_non_zero - 1;
02111 last = (i == last_index);
02112
02113 if(level<0) level= -level;
02114
02115 code = get_rl_index(rl, last, run, level);
02116 aic_code = get_rl_index(&rl_intra_aic, last, run, level);
02117 inter_vlc_bits += rl->table_vlc[code][1]+1;
02118 aic_vlc_bits += rl_intra_aic.table_vlc[aic_code][1]+1;
02119
02120 if (code == rl->n) {
02121 inter_vlc_bits += 1+6+8-1;
02122 }
02123 if (aic_code == rl_intra_aic.n) {
02124 aic_vlc_bits += 1+6+8-1;
02125 wrong_pos += run + 1;
02126 }else
02127 wrong_pos += wrong_run[aic_code];
02128 last_non_zero = i;
02129 }
02130 }
02131 i = 0;
02132 if(aic_vlc_bits < inter_vlc_bits && wrong_pos > 63)
02133 rl = &rl_intra_aic;
02134 }
02135 }
02136
02137
02138 last_index = s->block_last_index[n];
02139 last_non_zero = i - 1;
02140 for (; i <= last_index; i++) {
02141 j = s->intra_scantable.permutated[i];
02142 level = block[j];
02143 if (level) {
02144 run = i - last_non_zero - 1;
02145 last = (i == last_index);
02146 sign = 0;
02147 slevel = level;
02148 if (level < 0) {
02149 sign = 1;
02150 level = -level;
02151 }
02152 code = get_rl_index(rl, last, run, level);
02153 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
02154 if (code == rl->n) {
02155 if(s->h263_flv <= 1){
02156 put_bits(&s->pb, 1, last);
02157 put_bits(&s->pb, 6, run);
02158
02159 assert(slevel != 0);
02160
02161 if(level < 128)
02162 put_bits(&s->pb, 8, slevel & 0xff);
02163 else{
02164 put_bits(&s->pb, 8, 128);
02165 put_bits(&s->pb, 5, slevel & 0x1f);
02166 put_bits(&s->pb, 6, (slevel>>5)&0x3f);
02167 }
02168 }else{
02169 if(level < 64) {
02170 put_bits(&s->pb, 1, 0);
02171 put_bits(&s->pb, 1, last);
02172 put_bits(&s->pb, 6, run);
02173
02174 put_bits(&s->pb, 7, slevel & 0x7f);
02175 } else {
02176
02177 put_bits(&s->pb, 1, 1);
02178 put_bits(&s->pb, 1, last);
02179 put_bits(&s->pb, 6, run);
02180
02181 put_bits(&s->pb, 11, slevel & 0x7ff);
02182 }
02183 }
02184 } else {
02185 put_bits(&s->pb, 1, sign);
02186 }
02187 last_non_zero = i;
02188 }
02189 }
02190 }
02191 #endif
02192
02193 #ifdef CONFIG_ENCODERS
02194
02195
02199 void ff_mpeg4_stuffing(PutBitContext * pbc)
02200 {
02201 int length;
02202 put_bits(pbc, 1, 0);
02203 length= (-put_bits_count(pbc))&7;
02204 if(length) put_bits(pbc, length, (1<<length)-1);
02205 }
02206
02207
02208 void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){
02209 int time_div, time_mod;
02210
02211 assert(s->current_picture_ptr->pts != AV_NOPTS_VALUE);
02212 s->time= s->current_picture_ptr->pts*s->avctx->time_base.num;
02213
02214 time_div= s->time/s->avctx->time_base.den;
02215 time_mod= s->time%s->avctx->time_base.den;
02216
02217 if(s->pict_type==B_TYPE){
02218 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
02219 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
02220 }else{
02221 s->last_time_base= s->time_base;
02222 s->time_base= time_div;
02223 s->pp_time= s->time - s->last_non_b_time;
02224 s->last_non_b_time= s->time;
02225 assert(picture_number==0 || s->pp_time > 0);
02226 }
02227 }
02228
02229 static void mpeg4_encode_gop_header(MpegEncContext * s){
02230 int hours, minutes, seconds;
02231 int64_t time;
02232
02233 put_bits(&s->pb, 16, 0);
02234 put_bits(&s->pb, 16, GOP_STARTCODE);
02235
02236 time= s->current_picture_ptr->pts;
02237 if(s->reordered_input_picture[1])
02238 time= FFMIN(time, s->reordered_input_picture[1]->pts);
02239 time= time*s->avctx->time_base.num;
02240
02241 seconds= time/s->avctx->time_base.den;
02242 minutes= seconds/60; seconds %= 60;
02243 hours= minutes/60; minutes %= 60;
02244 hours%=24;
02245
02246 put_bits(&s->pb, 5, hours);
02247 put_bits(&s->pb, 6, minutes);
02248 put_bits(&s->pb, 1, 1);
02249 put_bits(&s->pb, 6, seconds);
02250
02251 put_bits(&s->pb, 1, !!(s->flags&CODEC_FLAG_CLOSED_GOP));
02252 put_bits(&s->pb, 1, 0);
02253
02254 s->last_time_base= time / s->avctx->time_base.den;
02255
02256 ff_mpeg4_stuffing(&s->pb);
02257 }
02258
02259 static void mpeg4_encode_visual_object_header(MpegEncContext * s){
02260 int profile_and_level_indication;
02261 int vo_ver_id;
02262
02263 if(s->avctx->profile != FF_PROFILE_UNKNOWN){
02264 profile_and_level_indication = s->avctx->profile << 4;
02265 }else if(s->max_b_frames || s->quarter_sample){
02266 profile_and_level_indication= 0xF0;
02267 }else{
02268 profile_and_level_indication= 0x00;
02269 }
02270
02271 if(s->avctx->level != FF_LEVEL_UNKNOWN){
02272 profile_and_level_indication |= s->avctx->level;
02273 }else{
02274 profile_and_level_indication |= 1;
02275 }
02276
02277 if(profile_and_level_indication>>4 == 0xF){
02278 vo_ver_id= 5;
02279 }else{
02280 vo_ver_id= 1;
02281 }
02282
02283
02284
02285 put_bits(&s->pb, 16, 0);
02286 put_bits(&s->pb, 16, VOS_STARTCODE);
02287
02288 put_bits(&s->pb, 8, profile_and_level_indication);
02289
02290 put_bits(&s->pb, 16, 0);
02291 put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);
02292
02293 put_bits(&s->pb, 1, 1);
02294 put_bits(&s->pb, 4, vo_ver_id);
02295 put_bits(&s->pb, 3, 1);
02296
02297 put_bits(&s->pb, 4, 1);
02298
02299 put_bits(&s->pb, 1, 0);
02300
02301 ff_mpeg4_stuffing(&s->pb);
02302 }
02303
02304 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number)
02305 {
02306 int vo_ver_id;
02307
02308 if(s->max_b_frames || s->quarter_sample){
02309 vo_ver_id= 5;
02310 s->vo_type= ADV_SIMPLE_VO_TYPE;
02311 }else{
02312 vo_ver_id= 1;
02313 s->vo_type= SIMPLE_VO_TYPE;
02314 }
02315
02316 put_bits(&s->pb, 16, 0);
02317 put_bits(&s->pb, 16, 0x100 + vo_number);
02318 put_bits(&s->pb, 16, 0);
02319 put_bits(&s->pb, 16, 0x120 + vol_number);
02320
02321 put_bits(&s->pb, 1, 0);
02322 put_bits(&s->pb, 8, s->vo_type);
02323 if(s->workaround_bugs & FF_BUG_MS) {
02324 put_bits(&s->pb, 1, 0);
02325 } else {
02326 put_bits(&s->pb, 1, 1);
02327 put_bits(&s->pb, 4, vo_ver_id);
02328 put_bits(&s->pb, 3, 1);
02329 }
02330
02331 aspect_to_info(s, s->avctx->sample_aspect_ratio);
02332
02333 put_bits(&s->pb, 4, s->aspect_ratio_info);
02334 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
02335 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
02336 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
02337 }
02338
02339 if(s->workaround_bugs & FF_BUG_MS) {
02340 put_bits(&s->pb, 1, 0);
02341 } else {
02342 put_bits(&s->pb, 1, 1);
02343 put_bits(&s->pb, 2, 1);
02344 put_bits(&s->pb, 1, s->low_delay);
02345 put_bits(&s->pb, 1, 0);
02346 }
02347
02348 put_bits(&s->pb, 2, RECT_SHAPE);
02349 put_bits(&s->pb, 1, 1);
02350
02351 put_bits(&s->pb, 16, s->avctx->time_base.den);
02352 if (s->time_increment_bits < 1)
02353 s->time_increment_bits = 1;
02354 put_bits(&s->pb, 1, 1);
02355 put_bits(&s->pb, 1, 0);
02356 put_bits(&s->pb, 1, 1);
02357 put_bits(&s->pb, 13, s->width);
02358 put_bits(&s->pb, 1, 1);
02359 put_bits(&s->pb, 13, s->height);
02360 put_bits(&s->pb, 1, 1);
02361 put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
02362 put_bits(&s->pb, 1, 1);
02363 if (vo_ver_id == 1) {
02364 put_bits(&s->pb, 1, s->vol_sprite_usage);
02365 }else{
02366 put_bits(&s->pb, 2, s->vol_sprite_usage);
02367 }
02368
02369 put_bits(&s->pb, 1, 0);
02370 put_bits(&s->pb, 1, s->mpeg_quant);
02371
02372 if(s->mpeg_quant){
02373 ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix);
02374 ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix);
02375 }
02376
02377 if (vo_ver_id != 1)
02378 put_bits(&s->pb, 1, s->quarter_sample);
02379 put_bits(&s->pb, 1, 1);
02380 s->resync_marker= s->rtp_mode;
02381 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);
02382 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
02383 if(s->data_partitioning){
02384 put_bits(&s->pb, 1, 0);
02385 }
02386
02387 if (vo_ver_id != 1){
02388 put_bits(&s->pb, 1, 0);
02389 put_bits(&s->pb, 1, 0);
02390 }
02391 put_bits(&s->pb, 1, 0);
02392
02393 ff_mpeg4_stuffing(&s->pb);
02394
02395
02396 if(!(s->flags & CODEC_FLAG_BITEXACT)){
02397 put_bits(&s->pb, 16, 0);
02398 put_bits(&s->pb, 16, 0x1B2);
02399 put_string(&s->pb, LIBAVCODEC_IDENT, 0);
02400 }
02401 }
02402
02403
02404 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
02405 {
02406 int time_incr;
02407 int time_div, time_mod;
02408
02409 if(s->pict_type==I_TYPE){
02410 if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
02411 if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT)
02412 mpeg4_encode_visual_object_header(s);
02413 if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT || picture_number==0)
02414 mpeg4_encode_vol_header(s, 0, 0);
02415 }
02416 if(!(s->workaround_bugs & FF_BUG_MS))
02417 mpeg4_encode_gop_header(s);
02418 }
02419
02420 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
02421
02422
02423
02424 put_bits(&s->pb, 16, 0);
02425 put_bits(&s->pb, 16, VOP_STARTCODE);
02426 put_bits(&s->pb, 2, s->pict_type - 1);
02427
02428 assert(s->time>=0);
02429 time_div= s->time/s->avctx->time_base.den;
02430 time_mod= s->time%s->avctx->time_base.den;
02431 time_incr= time_div - s->last_time_base;
02432 assert(time_incr >= 0);
02433 while(time_incr--)
02434 put_bits(&s->pb, 1, 1);
02435
02436 put_bits(&s->pb, 1, 0);
02437
02438 put_bits(&s->pb, 1, 1);
02439 put_bits(&s->pb, s->time_increment_bits, time_mod);
02440 put_bits(&s->pb, 1, 1);
02441 put_bits(&s->pb, 1, 1);
02442 if ( s->pict_type == P_TYPE
02443 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
02444 put_bits(&s->pb, 1, s->no_rounding);
02445 }
02446 put_bits(&s->pb, 3, 0);
02447 if(!s->progressive_sequence){
02448 put_bits(&s->pb, 1, s->current_picture_ptr->top_field_first);
02449 put_bits(&s->pb, 1, s->alternate_scan);
02450 }
02451
02452
02453 put_bits(&s->pb, 5, s->qscale);
02454
02455 if (s->pict_type != I_TYPE)
02456 put_bits(&s->pb, 3, s->f_code);
02457 if (s->pict_type == B_TYPE)
02458 put_bits(&s->pb, 3, s->b_code);
02459
02460 }
02461
02462 #endif //CONFIG_ENCODERS
02463
02467 void ff_set_qscale(MpegEncContext * s, int qscale)
02468 {
02469 if (qscale < 1)
02470 qscale = 1;
02471 else if (qscale > 31)
02472 qscale = 31;
02473
02474 s->qscale = qscale;
02475 s->chroma_qscale= s->chroma_qscale_table[qscale];
02476
02477 s->y_dc_scale= s->y_dc_scale_table[ qscale ];
02478 s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
02479 }
02480
02488 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding)
02489 {
02490 int a, b, c, wrap, pred, scale, ret;
02491 uint16_t *dc_val;
02492
02493
02494 if (n < 4) {
02495 scale = s->y_dc_scale;
02496 } else {
02497 scale = s->c_dc_scale;
02498 }
02499 if(IS_3IV1)
02500 scale= 8;
02501
02502 wrap= s->block_wrap[n];
02503 dc_val = s->dc_val[0] + s->block_index[n];
02504
02505
02506
02507
02508 a = dc_val[ - 1];
02509 b = dc_val[ - 1 - wrap];
02510 c = dc_val[ - wrap];
02511
02512
02513 if(s->first_slice_line && n!=3){
02514 if(n!=2) b=c= 1024;
02515 if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
02516 }
02517 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
02518 if(n==0 || n==4 || n==5)
02519 b=1024;
02520 }
02521
02522 if (abs(a - b) < abs(b - c)) {
02523 pred = c;
02524 *dir_ptr = 1;
02525 } else {
02526 pred = a;
02527 *dir_ptr = 0;
02528 }
02529
02530 pred = FASTDIV((pred + (scale >> 1)), scale);
02531
02532 if(encoding){
02533 ret = level - pred;
02534 }else{
02535 level += pred;
02536 ret= level;
02537 if(s->error_resilience>=3){
02538 if(level<0){
02539 av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
02540 return -1;
02541 }
02542 if(level*scale > 2048 + scale){
02543 av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
02544 return -1;
02545 }
02546 }
02547 }
02548 level *=scale;
02549 if(level&(~2047)){
02550 if(level<0)
02551 level=0;
02552 else if(!(s->workaround_bugs&FF_BUG_DC_CLIP))
02553 level=2047;
02554 }
02555 dc_val[0]= level;
02556
02557 return ret;
02558 }
02559
02565 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
02566 int dir)
02567 {
02568 int i;
02569 int16_t *ac_val, *ac_val1;
02570 int8_t * const qscale_table= s->current_picture.qscale_table;
02571
02572
02573 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
02574 ac_val1 = ac_val;
02575 if (s->ac_pred) {
02576 if (dir == 0) {
02577 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
02578
02579 ac_val -= 16;
02580
02581 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
02582
02583 for(i=1;i<8;i++) {
02584 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
02585 }
02586 }else{
02587
02588 for(i=1;i<8;i++) {
02589 block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
02590 }
02591 }
02592 } else {
02593 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
02594
02595 ac_val -= 16 * s->block_wrap[n];
02596
02597 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
02598
02599 for(i=1;i<8;i++) {
02600 block[s->dsp.idct_permutation[i]] += ac_val[i + 8];
02601 }
02602 }else{
02603
02604 for(i=1;i<8;i++) {
02605 block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
02606 }
02607 }
02608 }
02609 }
02610
02611 for(i=1;i<8;i++)
02612 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
02613
02614
02615 for(i=1;i<8;i++)
02616 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
02617
02618 }
02619
02620 #ifdef CONFIG_ENCODERS
02621
02626 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
02627 {
02628 #if 1
02629
02630 level+=256;
02631 if (n < 4) {
02632
02633 put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]);
02634 } else {
02635
02636 put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]);
02637 }
02638 #else
02639 int size, v;
02640
02641 size = 0;
02642 v = abs(level);
02643 while (v) {
02644 v >>= 1;
02645 size++;
02646 }
02647
02648 if (n < 4) {
02649
02650 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
02651 } else {
02652
02653 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
02654 }
02655
02656
02657 if (size > 0) {
02658 if (level < 0)
02659 level = (-level) ^ ((1 << size) - 1);
02660 put_bits(&s->pb, size, level);
02661 if (size > 8)
02662 put_bits(&s->pb, 1, 1);
02663 }
02664 #endif
02665 }
02666
02667 static inline int mpeg4_get_dc_length(int level, int n){
02668 if (n < 4) {
02669 return uni_DCtab_lum_len[level + 256];
02670 } else {
02671 return uni_DCtab_chrom_len[level + 256];
02672 }
02673 }
02674
02679 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
02680 uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
02681 {
02682 int i, last_non_zero;
02683 #if 0 //variables for the outcommented version
02684 int code, sign, last;
02685 #endif
02686 const RLTable *rl;
02687 uint32_t *bits_tab;
02688 uint8_t *len_tab;
02689 const int last_index = s->block_last_index[n];
02690
02691 if (s->mb_intra) {
02692
02693 mpeg4_encode_dc(dc_pb, intra_dc, n);
02694 if(last_index<1) return;
02695 i = 1;
02696 rl = &rl_intra;
02697 bits_tab= uni_mpeg4_intra_rl_bits;
02698 len_tab = uni_mpeg4_intra_rl_len;
02699 } else {
02700 if(last_index<0) return;
02701 i = 0;
02702 rl = &rl_inter;
02703 bits_tab= uni_mpeg4_inter_rl_bits;
02704 len_tab = uni_mpeg4_inter_rl_len;
02705 }
02706
02707
02708 last_non_zero = i - 1;
02709 #if 1
02710 for (; i < last_index; i++) {
02711 int level = block[ scan_table[i] ];
02712 if (level) {
02713 int run = i - last_non_zero - 1;
02714 level+=64;
02715 if((level&(~127)) == 0){
02716 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
02717 put_bits(ac_pb, len_tab[index], bits_tab[index]);
02718 }else{
02719 put_bits(ac_pb, 7+2+1+6+1+12+1, (3<<23)+(3<<21)+(0<<20)+(run<<14)+(1<<13)+(((level-64)&0xfff)<<1)+1);
02720 }
02721 last_non_zero = i;
02722 }
02723 }
02724 {
02725 int level = block[ scan_table[i] ];
02726 int run = i - last_non_zero - 1;
02727 level+=64;
02728 if((level&(~127)) == 0){
02729 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
02730 put_bits(ac_pb, len_tab[index], bits_tab[index]);
02731 }else{
02732 put_bits(ac_pb, 7+2+1+6+1+12+1, (3<<23)+(3<<21)+(1<<20)+(run<<14)+(1<<13)+(((level-64)&0xfff)<<1)+1);
02733 }
02734 }
02735 #else
02736 for (; i <= last_index; i++) {
02737 const int slevel = block[ scan_table[i] ];
02738 if (slevel) {
02739 int level;
02740 int run = i - last_non_zero - 1;
02741 last = (i == last_index);
02742 sign = 0;
02743 level = slevel;
02744 if (level < 0) {
02745 sign = 1;
02746 level = -level;
02747 }
02748 code = get_rl_index(rl, last, run, level);
02749 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
02750 if (code == rl->n) {
02751 int level1, run1;
02752 level1 = level - rl->max_level[last][run];
02753 if (level1 < 1)
02754 goto esc2;
02755 code = get_rl_index(rl, last, run, level1);
02756 if (code == rl->n) {
02757 esc2:
02758 put_bits(ac_pb, 1, 1);
02759 if (level > MAX_LEVEL)
02760 goto esc3;
02761 run1 = run - rl->max_run[last][level] - 1;
02762 if (run1 < 0)
02763 goto esc3;
02764 code = get_rl_index(rl, last, run1, level);
02765 if (code == rl->n) {
02766 esc3:
02767
02768 put_bits(ac_pb, 1, 1);
02769 put_bits(ac_pb, 1, last);
02770 put_bits(ac_pb, 6, run);
02771 put_bits(ac_pb, 1, 1);
02772 put_bits(ac_pb, 12, slevel & 0xfff);
02773 put_bits(ac_pb, 1, 1);
02774 } else {
02775
02776 put_bits(ac_pb, 1, 0);
02777 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
02778 put_bits(ac_pb, 1, sign);
02779 }
02780 } else {
02781
02782 put_bits(ac_pb, 1, 0);
02783 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
02784 put_bits(ac_pb, 1, sign);
02785 }
02786 } else {
02787 put_bits(ac_pb, 1, sign);
02788 }
02789 last_non_zero = i;
02790 }
02791 }
02792 #endif
02793 }
02794
02795 static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
02796 uint8_t *scan_table)
02797 {
02798 int i, last_non_zero;
02799 const RLTable *rl;
02800 uint8_t *len_tab;
02801 const int last_index = s->block_last_index[n];
02802 int len=0;
02803
02804 if (s->mb_intra) {
02805
02806 len += mpeg4_get_dc_length(intra_dc, n);
02807 if(last_index<1) return len;
02808 i = 1;
02809 rl = &rl_intra;
02810 len_tab = uni_mpeg4_intra_rl_len;
02811 } else {
02812 if(last_index<0) return 0;
02813 i = 0;
02814 rl = &rl_inter;
02815 len_tab = uni_mpeg4_inter_rl_len;
02816 }
02817
02818
02819 last_non_zero = i - 1;
02820 for (; i < last_index; i++) {
02821 int level = block[ scan_table[i] ];
02822 if (level) {
02823 int run = i - last_non_zero - 1;
02824 level+=64;
02825 if((level&(~127)) == 0){
02826 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
02827 len += len_tab[index];
02828 }else{
02829 len += 7+2+1+6+1+12+1;
02830 }
02831 last_non_zero = i;
02832 }
02833 }
02834 {
02835 int level = block[ scan_table[i] ];
02836 int run = i - last_non_zero - 1;
02837 level+=64;
02838 if((level&(~127)) == 0){
02839 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
02840 len += len_tab[index];
02841 }else{
02842 len += 7+2+1+6+1+12+1;
02843 }
02844 }
02845
02846 return len;
02847 }
02848
02849 #endif
02850
02851
02852
02853
02854
02855 static VLC intra_MCBPC_vlc;
02856 static VLC inter_MCBPC_vlc;
02857 static VLC cbpy_vlc;
02858 static VLC mv_vlc;
02859 static VLC dc_lum, dc_chrom;
02860 static VLC sprite_trajectory;
02861 static VLC mb_type_b_vlc;
02862 static VLC h263_mbtype_b_vlc;
02863 static VLC cbpc_b_vlc;
02864
02865 void init_vlc_rl(RLTable *rl, int use_static)
02866 {
02867 int i, q;
02868
02869
02870 if(use_static && rl->rl_vlc[0])
02871 return;
02872
02873 init_vlc(&rl->vlc, 9, rl->n + 1,
02874 &rl->table_vlc[0][1], 4, 2,
02875 &rl->table_vlc[0][0], 4, 2, use_static);
02876
02877
02878 for(q=0; q<32; q++){
02879 int qmul= q*2;
02880 int qadd= (q-1)|1;
02881
02882 if(q==0){
02883 qmul=1;
02884 qadd=0;
02885 }
02886 if(use_static)
02887 rl->rl_vlc[q]= av_mallocz_static(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
02888 else
02889 rl->rl_vlc[q]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
02890 for(i=0; i<rl->vlc.table_size; i++){
02891 int code= rl->vlc.table[i][0];
02892 int len = rl->vlc.table[i][1];
02893 int level, run;
02894
02895 if(len==0){
02896 run= 66;
02897 level= MAX_LEVEL;
02898 }else if(len<0){
02899 run= 0;
02900 level= code;
02901 }else{
02902 if(code==rl->n){
02903 run= 66;
02904 level= 0;
02905 }else{
02906 run= rl->table_run [code] + 1;
02907 level= rl->table_level[code] * qmul + qadd;
02908 if(code >= rl->last) run+=192;
02909 }
02910 }
02911 rl->rl_vlc[q][i].len= len;
02912 rl->rl_vlc[q][i].level= level;
02913 rl->rl_vlc[q][i].run= run;
02914 }
02915 }
02916 }
02917
02918
02919
02920
02921 void h263_decode_init_vlc(MpegEncContext *s)
02922 {
02923 static int done = 0;
02924
02925 if (!done) {
02926 done = 1;
02927
02928 init_vlc(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 9,
02929 intra_MCBPC_bits, 1, 1,
02930 intra_MCBPC_code, 1, 1, 1);
02931 init_vlc(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 28,
02932 inter_MCBPC_bits, 1, 1,
02933 inter_MCBPC_code, 1, 1, 1);
02934 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
02935 &cbpy_tab[0][1], 2, 1,
02936 &cbpy_tab[0][0], 2, 1, 1);
02937 init_vlc(&mv_vlc, MV_VLC_BITS, 33,
02938 &mvtab[0][1], 2, 1,
02939 &mvtab[0][0], 2, 1, 1);
02940 init_rl(&rl_inter, 1);
02941 init_rl(&rl_intra, 1);
02942 init_rl(&rvlc_rl_inter, 1);
02943 init_rl(&rvlc_rl_intra, 1);
02944 init_rl(&rl_intra_aic, 1);
02945 init_vlc_rl(&rl_inter, 1);
02946 init_vlc_rl(&rl_intra, 1);
02947 init_vlc_rl(&rvlc_rl_inter, 1);
02948 init_vlc_rl(&rvlc_rl_intra, 1);
02949 init_vlc_rl(&rl_intra_aic, 1);
02950 init_vlc(&dc_lum, DC_VLC_BITS, 10 ,
02951 &DCtab_lum[0][1], 2, 1,
02952 &DCtab_lum[0][0], 2, 1, 1);
02953 init_vlc(&dc_chrom, DC_VLC_BITS, 10 ,
02954 &DCtab_chrom[0][1], 2, 1,
02955 &DCtab_chrom[0][0], 2, 1, 1);
02956 init_vlc(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
02957 &sprite_trajectory_tab[0][1], 4, 2,
02958 &sprite_trajectory_tab[0][0], 4, 2, 1);
02959 init_vlc(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
02960 &mb_type_b_tab[0][1], 2, 1,
02961 &mb_type_b_tab[0][0], 2, 1, 1);
02962 init_vlc(&h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15,
02963 &h263_mbtype_b_tab[0][1], 2, 1,
02964 &h263_mbtype_b_tab[0][0], 2, 1, 1);
02965 init_vlc(&cbpc_b_vlc, CBPC_B_VLC_BITS, 4,
02966 &cbpc_b_tab[0][1], 2, 1,
02967 &cbpc_b_tab[0][0], 2, 1, 1);
02968 }
02969 }
02970
02974 int ff_h263_get_gob_height(MpegEncContext *s){
02975 if (s->height <= 400)
02976 return 1;
02977 else if (s->height <= 800)
02978 return 2;
02979 else
02980 return 4;
02981 }
02982
02983 int ff_h263_decode_mba(MpegEncContext *s)
02984 {
02985 int i, mb_pos;
02986
02987 for(i=0; i<6; i++){
02988 if(s->mb_num-1 <= ff_mba_max[i]) break;
02989 }
02990 mb_pos= get_bits(&s->gb, ff_mba_length[i]);
02991 s->mb_x= mb_pos % s->mb_width;
02992 s->mb_y= mb_pos / s->mb_width;
02993
02994 return mb_pos;
02995 }
02996
02997 void ff_h263_encode_mba(MpegEncContext *s)
02998 {
02999 int i, mb_pos;
03000
03001 for(i=0; i<6; i++){
03002 if(s->mb_num-1 <= ff_mba_max[i]) break;
03003 }
03004 mb_pos= s->mb_x + s->mb_width*s->mb_y;
03005 put_bits(&s->pb, ff_mba_length[i], mb_pos);
03006 }
03007
03012 static int h263_decode_gob_header(MpegEncContext *s)
03013 {
03014 unsigned int val, gfid, gob_number;
03015 int left;
03016
03017
03018 val = show_bits(&s->gb, 16);
03019 if(val)
03020 return -1;
03021
03022
03023 skip_bits(&s->gb, 16);
03024 left= s->gb.size_in_bits - get_bits_count(&s->gb);
03025
03026 for(;left>13; left--){
03027 if(get_bits1(&s->gb)) break;
03028 }
03029 if(left<=13)
03030 return -1;
03031
03032 if(s->h263_slice_structured){
03033 if(get_bits1(&s->gb)==0)
03034 return -1;
03035
03036 ff_h263_decode_mba(s);
03037
03038 if(s->mb_num > 1583)
03039 if(get_bits1(&s->gb)==0)
03040 return -1;
03041
03042 s->qscale = get_bits(&s->gb, 5);
03043 if(get_bits1(&s->gb)==0)
03044 return -1;
03045 gfid = get_bits(&s->gb, 2);
03046 }else{
03047 gob_number = get_bits(&s->gb, 5);
03048 s->mb_x= 0;
03049 s->mb_y= s->gob_index* gob_number;
03050 gfid = get_bits(&s->gb, 2);
03051 s->qscale = get_bits(&s->gb, 5);
03052 }
03053
03054 if(s->mb_y >= s->mb_height)
03055 return -1;
03056
03057 if(s->qscale==0)
03058 return -1;
03059
03060 return 0;
03061 }
03062
03063 static inline void memsetw(short *tab, int val, int n)
03064 {
03065 int i;
03066 for(i=0;i<n;i++)
03067 tab[i] = val;
03068 }
03069
03070 #ifdef CONFIG_ENCODERS
03071
03072 void ff_mpeg4_init_partitions(MpegEncContext *s)
03073 {
03074 uint8_t *start= pbBufPtr(&s->pb);
03075 uint8_t *end= s->pb.buf_end;
03076 int size= end - start;
03077 int pb_size = (((long)start + size/3)&(~3)) - (long)start;
03078 int tex_size= (size - 2*pb_size)&(~3);
03079
03080 set_put_bits_buffer_size(&s->pb, pb_size);
03081 init_put_bits(&s->tex_pb, start + pb_size , tex_size);
03082 init_put_bits(&s->pb2 , start + pb_size + tex_size, pb_size);
03083 }
03084
03085 void ff_mpeg4_merge_partitions(MpegEncContext *s)
03086 {
03087 const int pb2_len = put_bits_count(&s->pb2 );
03088 const int tex_pb_len= put_bits_count(&s->tex_pb);
03089 const int bits= put_bits_count(&s->pb);
03090
03091 if(s->pict_type==I_TYPE){
03092 put_bits(&s->pb, 19, DC_MARKER);
03093 s->misc_bits+=19 + pb2_len + bits - s->last_bits;
03094 s->i_tex_bits+= tex_pb_len;
03095 }else{
03096 put_bits(&s->pb, 17, MOTION_MARKER);
03097 s->misc_bits+=17 + pb2_len;
03098 s->mv_bits+= bits - s->last_bits;
03099 s->p_tex_bits+= tex_pb_len;
03100 }
03101
03102 flush_put_bits(&s->pb2);
03103 flush_put_bits(&s->tex_pb);
03104
03105 set_put_bits_buffer_size(&s->pb, s->pb2.buf_end - s->pb.buf);
03106 ff_copy_bits(&s->pb, s->pb2.buf , pb2_len);
03107 ff_copy_bits(&s->pb, s->tex_pb.buf, tex_pb_len);
03108 s->last_bits= put_bits_count(&s->pb);
03109 }
03110
03111 #endif //CONFIG_ENCODERS
03112
03113 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
03114 switch(s->pict_type){
03115 case I_TYPE:
03116 return 16;
03117 case P_TYPE:
03118 case S_TYPE:
03119 return s->f_code+15;
03120 case B_TYPE:
03121 return FFMAX(FFMAX(s->f_code, s->b_code)+15, 17);
03122 default:
03123 return -1;
03124 }
03125 }
03126
03127 #ifdef CONFIG_ENCODERS
03128
03129 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
03130 {
03131 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
03132
03133 put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0);
03134 put_bits(&s->pb, 1, 1);
03135
03136 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
03137 put_bits(&s->pb, s->quant_precision, s->qscale);
03138 put_bits(&s->pb, 1, 0);
03139 }
03140
03141 #endif //CONFIG_ENCODERS
03142
03147 static inline int mpeg4_is_resync(MpegEncContext *s){
03148 const int bits_count= get_bits_count(&s->gb);
03149
03150 if(s->workaround_bugs&FF_BUG_NO_PADDING){
03151 return 0;
03152 }
03153
03154 if(bits_count + 8 >= s->gb.size_in_bits){
03155 int v= show_bits(&s->gb, 8);
03156 v|= 0x7F >> (7-(bits_count&7));
03157
03158 if(v==0x7F)
03159 return 1;
03160 }else{
03161 if(show_bits(&s->gb, 16) == ff_mpeg4_resync_prefix[bits_count&7]){
03162 int len;
03163 GetBitContext gb= s->gb;
03164
03165 skip_bits(&s->gb, 1);
03166 align_get_bits(&s->gb);
03167
03168 for(len=0; len<32; len++){
03169 if(get_bits1(&s->gb)) break;
03170 }
03171
03172 s->gb= gb;
03173
03174 if(len>=ff_mpeg4_get_video_packet_prefix_length(s))
03175 return 1;
03176 }
03177 }
03178 return 0;
03179 }
03180
03185 static int mpeg4_decode_video_packet_header(MpegEncContext *s)
03186 {
03187 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
03188 int header_extension=0, mb_num, len;
03189
03190
03191 if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1;
03192
03193 for(len=0; len<32; len++){
03194 if(get_bits1(&s->gb)) break;
03195 }
03196
03197 if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
03198 av_log(s->avctx, AV_LOG_ERROR, "marker does not match f_code\n");
03199 return -1;
03200 }
03201
03202 if(s->shape != RECT_SHAPE){
03203 header_extension= get_bits1(&s->gb);
03204
03205 }
03206
03207 mb_num= get_bits(&s->gb, mb_num_bits);
03208 if(mb_num>=s->mb_num){
03209 av_log(s->avctx, AV_LOG_ERROR, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);
03210 return -1;
03211 }
03212 if(s->pict_type == B_TYPE){
03213 while(s->next_picture.mbskip_table[ s->mb_index2xy[ mb_num ] ]) mb_num++;
03214 if(mb_num >= s->mb_num) return -1;
03215 }
03216
03217 s->mb_x= mb_num % s->mb_width;
03218 s->mb_y= mb_num / s->mb_width;
03219
03220 if(s->shape != BIN_ONLY_SHAPE){
03221 int qscale= get_bits(&s->gb, s->quant_precision);
03222 if(qscale)
03223 s->chroma_qscale=s->qscale= qscale;
03224 }
03225
03226 if(s->shape == RECT_SHAPE){
03227 header_extension= get_bits1(&s->gb);
03228 }
03229 if(header_extension){
03230 int time_increment;
03231 int time_incr=0;
03232
03233 while (get_bits1(&s->gb) != 0)
03234 time_incr++;
03235
03236 check_marker(&s->gb, "before time_increment in video packed header");
03237 time_increment= get_bits(&s->gb, s->time_increment_bits);
03238 check_marker(&s->gb, "before vop_coding_type in video packed header");
03239
03240 skip_bits(&s->gb, 2);
03241
03242
03243 if(s->shape != BIN_ONLY_SHAPE){
03244 skip_bits(&s->gb, 3);
03245
03246 if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
03247 mpeg4_decode_sprite_trajectory(s, &s->gb);
03248 av_log(s->avctx, AV_LOG_ERROR, "untested\n");
03249 }
03250
03251
03252
03253 if (s->pict_type != I_TYPE) {
03254 int f_code = get_bits(&s->gb, 3);
03255 if(f_code==0){
03256 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (f_code=0)\n");
03257 }
03258 }
03259 if (s->pict_type == B_TYPE) {
03260 int b_code = get_bits(&s->gb, 3);
03261 if(b_code==0){
03262 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (b_code=0)\n");
03263 }
03264 }
03265 }
03266 }
03267
03268
03269
03270
03271 return 0;
03272 }
03273
03274 void ff_mpeg4_clean_buffers(MpegEncContext *s)
03275 {
03276 int c_wrap, c_xy, l_wrap, l_xy;
03277
03278 l_wrap= s->b8_stride;
03279 l_xy= (2*s->mb_y-1)*l_wrap + s->mb_x*2 - 1;
03280 c_wrap= s->mb_stride;
03281 c_xy= (s->mb_y-1)*c_wrap + s->mb_x - 1;
03282
03283 #if 0
03284
03285 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
03286 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
03287 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
03288 #endif
03289
03290
03291 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t));
03292 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
03293 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
03294
03295
03296
03297
03298
03299 s->last_mv[0][0][0]=
03300 s->last_mv[0][0][1]=
03301 s->last_mv[1][0][0]=
03302 s->last_mv[1][0][1]= 0;
03303 }
03304
03309 int ff_h263_resync(MpegEncContext *s){
03310 int left, ret;
03311
03312 if(s->codec_id==CODEC_ID_MPEG4){
03313 skip_bits1(&s->gb);
03314 align_get_bits(&s->gb);
03315 }
03316
03317 if(show_bits(&s->gb, 16)==0){
03318 if(s->codec_id==CODEC_ID_MPEG4)
03319 ret= mpeg4_decode_video_packet_header(s);
03320 else
03321 ret= h263_decode_gob_header(s);
03322 if(ret>=0)
03323 return 0;
03324 }
03325
03326 s->gb= s->last_resync_gb;
03327 align_get_bits(&s->gb);
03328 left= s->gb.size_in_bits - get_bits_count(&s->gb);
03329
03330 for(;left>16+1+5+5; left-=8){
03331 if(show_bits(&s->gb, 16)==0){
03332 GetBitContext bak= s->gb;
03333
03334 if(s->codec_id==CODEC_ID_MPEG4)
03335 ret= mpeg4_decode_video_packet_header(s);
03336 else
03337 ret= h263_decode_gob_header(s);
03338 if(ret>=0)
03339 return 0;
03340
03341 s->gb= bak;
03342 }
03343 skip_bits(&s->gb, 8);
03344 }
03345
03346 return -1;
03347 }
03348
03354 static inline int get_amv(MpegEncContext *s, int n){
03355 int x, y, mb_v, sum, dx, dy, shift;
03356 int len = 1 << (s->f_code + 4);
03357 const int a= s->sprite_warping_accuracy;
03358
03359 if(s->workaround_bugs & FF_BUG_AMV)
03360 len >>= s->quarter_sample;
03361
03362 if(s->real_sprite_warping_points==1){
03363 if(s->divx_version==500 && s->divx_build==413)
03364 sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample));
03365 else
03366 sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a);
03367 }else{
03368 dx= s->sprite_delta[n][0];
03369 dy= s->sprite_delta[n][1];
03370 shift= s->sprite_shift[0];
03371 if(n) dy -= 1<<(shift + a + 1);
03372 else dx -= 1<<(shift + a + 1);
03373 mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16;
03374
03375 sum=0;
03376 for(y=0; y<16; y++){
03377 int v;
03378
03379 v= mb_v + dy*y;
03380
03381 for(x=0; x<16; x++){
03382 sum+= v>>shift;
03383 v+= dx;
03384 }
03385 }
03386 sum= RSHIFT(sum, a+8-s->quarter_sample);
03387 }
03388
03389 if (sum < -len) sum= -len;
03390 else if (sum >= len) sum= len-1;
03391
03392 return sum;
03393 }
03394
03399 static int mpeg4_decode_partition_a(MpegEncContext *s){
03400 int mb_num;
03401 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
03402
03403
03404 mb_num=0;
03405 s->first_slice_line=1;
03406 for(; s->mb_y<s->mb_height; s->mb_y++){
03407 ff_init_block_index(s);
03408 for(; s->mb_x<s->mb_width; s->mb_x++){
03409 const int xy= s->mb_x + s->mb_y*s->mb_stride;
03410 int cbpc;
03411 int dir=0;
03412
03413 mb_num++;
03414 ff_update_block_index(s);
03415 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
03416 s->first_slice_line=0;
03417
03418 if(s->pict_type==I_TYPE){
03419 int i;
03420
03421 do{
03422 if(show_bits_long(&s->gb, 19)==DC_MARKER){
03423 return mb_num-1;
03424 }
03425
03426 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
03427 if (cbpc < 0){
03428 av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
03429 return -1;
03430 }
03431 }while(cbpc == 8);
03432
03433 s->cbp_table[xy]= cbpc & 3;
03434 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
03435 s->mb_intra = 1;
03436
03437 if(cbpc & 4) {
03438 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
03439 }
03440 s->current_picture.qscale_table[xy]= s->qscale;
03441
03442 s->mbintra_table[xy]= 1;
03443 for(i=0; i<6; i++){
03444 int dc_pred_dir;
03445 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
03446 if(dc < 0){
03447 av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
03448 return -1;
03449 }
03450 dir<<=1;
03451 if(dc_pred_dir) dir|=1;
03452 }
03453 s->pred_dir_table[xy]= dir;
03454 }else{
03455 int mx, my, pred_x, pred_y, bits;
03456 int16_t * const mot_val= s->current_picture.motion_val[0][s->block_index[0]];
03457 const int stride= s->b8_stride*2;
03458
03459 try_again:
03460 bits= show_bits(&s->gb, 17);
03461 if(bits==MOTION_MARKER){
03462 return mb_num-1;
03463 }
03464 skip_bits1(&s->gb);
03465 if(bits&0x10000){
03466
03467 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
03468 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
03469 mx= get_amv(s, 0);
03470 my= get_amv(s, 1);
03471 }else{
03472 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
03473 mx=my=0;
03474 }
03475 mot_val[0 ]= mot_val[2 ]=
03476 mot_val[0+stride]= mot_val[2+stride]= mx;
03477 mot_val[1 ]= mot_val[3 ]=
03478 mot_val[1+stride]= mot_val[3+stride]= my;
03479
03480 if(s->mbintra_table[xy])
03481 ff_clean_intra_table_entries(s);
03482 continue;
03483 }
03484
03485 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
03486 if (cbpc < 0){
03487 av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
03488 return -1;
03489 }
03490 if(cbpc == 20)
03491 goto try_again;
03492
03493 s->cbp_table[xy]= cbpc&(8+3);
03494
03495 s->