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->mb_intra = ((cbpc & 4) != 0);
03496
03497 if(s->mb_intra){
03498 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
03499 s->mbintra_table[xy]= 1;
03500 mot_val[0 ]= mot_val[2 ]=
03501 mot_val[0+stride]= mot_val[2+stride]= 0;
03502 mot_val[1 ]= mot_val[3 ]=
03503 mot_val[1+stride]= mot_val[3+stride]= 0;
03504 }else{
03505 if(s->mbintra_table[xy])
03506 ff_clean_intra_table_entries(s);
03507
03508 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
03509 s->mcsel= get_bits1(&s->gb);
03510 else s->mcsel= 0;
03511
03512 if ((cbpc & 16) == 0) {
03513
03514
03515 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
03516 if(!s->mcsel){
03517 mx = h263_decode_motion(s, pred_x, s->f_code);
03518 if (mx >= 0xffff)
03519 return -1;
03520
03521 my = h263_decode_motion(s, pred_y, s->f_code);
03522 if (my >= 0xffff)
03523 return -1;
03524 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
03525 } else {
03526 mx = get_amv(s, 0);
03527 my = get_amv(s, 1);
03528 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
03529 }
03530
03531 mot_val[0 ]= mot_val[2 ] =
03532 mot_val[0+stride]= mot_val[2+stride]= mx;
03533 mot_val[1 ]= mot_val[3 ]=
03534 mot_val[1+stride]= mot_val[3+stride]= my;
03535 } else {
03536 int i;
03537 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
03538 for(i=0;i<4;i++) {
03539 int16_t *mot_val= h263_pred_motion(s, i, 0, &pred_x, &pred_y);
03540 mx = h263_decode_motion(s, pred_x, s->f_code);
03541 if (mx >= 0xffff)
03542 return -1;
03543
03544 my = h263_decode_motion(s, pred_y, s->f_code);
03545 if (my >= 0xffff)
03546 return -1;
03547 mot_val[0] = mx;
03548 mot_val[1] = my;
03549 }
03550 }
03551 }
03552 }
03553 }
03554 s->mb_x= 0;
03555 }
03556
03557 return mb_num;
03558 }
03559
03564 static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
03565 int mb_num=0;
03566 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
03567
03568 s->mb_x= s->resync_mb_x;
03569 s->first_slice_line=1;
03570 for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
03571 ff_init_block_index(s);
03572 for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
03573 const int xy= s->mb_x + s->mb_y*s->mb_stride;
03574
03575 mb_num++;
03576 ff_update_block_index(s);
03577 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
03578 s->first_slice_line=0;
03579
03580 if(s->pict_type==I_TYPE){
03581 int ac_pred= get_bits1(&s->gb);
03582 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
03583 if(cbpy<0){
03584 av_log(s->avctx, AV_LOG_ERROR, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
03585 return -1;
03586 }
03587
03588 s->cbp_table[xy]|= cbpy<<2;
03589 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
03590 }else{
03591 if(IS_INTRA(s->current_picture.mb_type[xy])){
03592 int dir=0,i;
03593 int ac_pred = get_bits1(&s->gb);
03594 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
03595
03596 if(cbpy<0){
03597 av_log(s->avctx, AV_LOG_ERROR, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
03598 return -1;
03599 }
03600
03601 if(s->cbp_table[xy] & 8) {
03602 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
03603 }
03604 s->current_picture.qscale_table[xy]= s->qscale;
03605
03606 for(i=0; i<6; i++){
03607 int dc_pred_dir;
03608 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
03609 if(dc < 0){
03610 av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
03611 return -1;
03612 }
03613 dir<<=1;
03614 if(dc_pred_dir) dir|=1;
03615 }
03616 s->cbp_table[xy]&= 3;
03617 s->cbp_table[xy]|= cbpy<<2;
03618 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
03619 s->pred_dir_table[xy]= dir;
03620 }else if(IS_SKIP(s->current_picture.mb_type[xy])){
03621 s->current_picture.qscale_table[xy]= s->qscale;
03622 s->cbp_table[xy]= 0;
03623 }else{
03624 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
03625
03626 if(cbpy<0){
03627 av_log(s->avctx, AV_LOG_ERROR, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
03628 return -1;
03629 }
03630
03631 if(s->cbp_table[xy] & 8) {
03632 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
03633 }
03634 s->current_picture.qscale_table[xy]= s->qscale;
03635
03636 s->cbp_table[xy]&= 3;
03637 s->cbp_table[xy]|= (cbpy^0xf)<<2;
03638 }
03639 }
03640 }
03641 if(mb_num >= mb_count) return 0;
03642 s->mb_x= 0;
03643 }
03644 return 0;
03645 }
03646
03651 int ff_mpeg4_decode_partitions(MpegEncContext *s)
03652 {
03653 int mb_num;
03654 const int part_a_error= s->pict_type==I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR;
03655 const int part_a_end = s->pict_type==I_TYPE ? (DC_END |MV_END) : MV_END;
03656
03657 mb_num= mpeg4_decode_partition_a(s);
03658 if(mb_num<0){
03659 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
03660 return -1;
03661 }
03662
03663 if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
03664 av_log(s->avctx, AV_LOG_ERROR, "slice below monitor ...\n");
03665 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
03666 return -1;
03667 }
03668
03669 s->mb_num_left= mb_num;
03670
03671 if(s->pict_type==I_TYPE){
03672 while(show_bits(&s->gb, 9) == 1)
03673 skip_bits(&s->gb, 9);
03674 if(get_bits_long(&s->gb, 19)!=DC_MARKER){
03675 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
03676 return -1;
03677 }
03678 }else{
03679 while(show_bits(&s->gb, 10) == 1)
03680 skip_bits(&s->gb, 10);
03681 if(get_bits(&s->gb, 17)!=MOTION_MARKER){
03682 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
03683 return -1;
03684 }
03685 }
03686 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end);
03687
03688 if( mpeg4_decode_partition_b(s, mb_num) < 0){
03689 if(s->pict_type==P_TYPE)
03690 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR);
03691 return -1;
03692 }else{
03693 if(s->pict_type==P_TYPE)
03694 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END);
03695 }
03696
03697 return 0;
03698 }
03699
03704 static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64])
03705 {
03706 int cbp, mb_type;
03707 const int xy= s->mb_x + s->mb_y*s->mb_stride;
03708
03709 mb_type= s->current_picture.mb_type[xy];
03710 cbp = s->cbp_table[xy];
03711
03712 if(s->current_picture.qscale_table[xy] != s->qscale){
03713 ff_set_qscale(s, s->current_picture.qscale_table[xy] );
03714 }
03715
03716 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
03717 int i;
03718 for(i=0; i<4; i++){
03719 s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0];
03720 s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1];
03721 }
03722 s->mb_intra = IS_INTRA(mb_type);
03723
03724 if (IS_SKIP(mb_type)) {
03725
03726 for(i=0;i<6;i++)
03727 s->block_last_index[i] = -1;
03728 s->mv_dir = MV_DIR_FORWARD;
03729 s->mv_type = MV_TYPE_16X16;
03730 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
03731 s->mcsel=1;
03732 s->mb_skipped = 0;
03733 }else{
03734 s->mcsel=0;
03735 s->mb_skipped = 1;
03736 }
03737 }else if(s->mb_intra){
03738 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
03739 }else if(!s->mb_intra){
03740
03741
03742 s->mv_dir = MV_DIR_FORWARD;
03743 if (IS_8X8(mb_type)) {
03744 s->mv_type = MV_TYPE_8X8;
03745 } else {
03746 s->mv_type = MV_TYPE_16X16;
03747 }
03748 }
03749 } else {
03750 s->mb_intra = 1;
03751 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
03752 }
03753
03754 if (!IS_SKIP(mb_type)) {
03755 int i;
03756 s->dsp.clear_blocks(s->block[0]);
03757
03758 for (i = 0; i < 6; i++) {
03759 if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){
03760 av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra);
03761 return -1;
03762 }
03763 cbp+=cbp;
03764 }
03765 }
03766
03767
03768
03769 if(--s->mb_num_left <= 0){
03770
03771 if(mpeg4_is_resync(s))
03772 return SLICE_END;
03773 else
03774 return SLICE_NOEND;
03775 }else{
03776 if(mpeg4_is_resync(s)){
03777 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
03778 if(s->cbp_table[xy+delta])
03779 return SLICE_END;
03780 }
03781 return SLICE_OK;
03782 }
03783 }
03784
03788 static void preview_obmc(MpegEncContext *s){
03789 GetBitContext gb= s->gb;
03790
03791 int cbpc, i, pred_x, pred_y, mx, my;
03792 int16_t *mot_val;
03793 const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
03794 const int stride= s->b8_stride*2;
03795
03796 for(i=0; i<4; i++)
03797 s->block_index[i]+= 2;
03798 for(i=4; i<6; i++)
03799 s->block_index[i]+= 1;
03800 s->mb_x++;
03801
03802 assert(s->pict_type == P_TYPE);
03803
03804 do{
03805 if (get_bits1(&s->gb)) {
03806
03807 mot_val = s->current_picture.motion_val[0][ s->block_index[0] ];
03808 mot_val[0 ]= mot_val[2 ]=
03809 mot_val[0+stride]= mot_val[2+stride]= 0;
03810 mot_val[1 ]= mot_val[3 ]=
03811 mot_val[1+stride]= mot_val[3+stride]= 0;
03812
03813 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
03814 goto end;
03815 }
03816 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
03817 }while(cbpc == 20);
03818
03819 if(cbpc & 4){
03820 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
03821 }else{
03822 get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
03823 if (cbpc & 8) {
03824 if(s->modified_quant){
03825 if(get_bits1(&s->gb)) skip_bits(&s->gb, 1);
03826 else skip_bits(&s->gb, 5);
03827 }else
03828 skip_bits(&s->gb, 2);
03829 }
03830
03831 if ((cbpc & 16) == 0) {
03832 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
03833
03834 mot_val= h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
03835 if (s->umvplus)
03836 mx = h263p_decode_umotion(s, pred_x);
03837 else
03838 mx = h263_decode_motion(s, pred_x, 1);
03839
03840 if (s->umvplus)
03841 my = h263p_decode_umotion(s, pred_y);
03842 else
03843 my = h263_decode_motion(s, pred_y, 1);
03844
03845 mot_val[0 ]= mot_val[2 ]=
03846 mot_val[0+stride]= mot_val[2+stride]= mx;
03847 mot_val[1 ]= mot_val[3 ]=
03848 mot_val[1+stride]= mot_val[3+stride]= my;
03849 } else {
03850 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
03851 for(i=0;i<4;i++) {
03852 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
03853 if (s->umvplus)
03854 mx = h263p_decode_umotion(s, pred_x);
03855 else
03856 mx = h263_decode_motion(s, pred_x, 1);
03857
03858 if (s->umvplus)
03859 my = h263p_decode_umotion(s, pred_y);
03860 else
03861 my = h263_decode_motion(s, pred_y, 1);
03862 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
03863 skip_bits1(&s->gb);
03864 mot_val[0] = mx;
03865 mot_val[1] = my;
03866 }
03867 }
03868 }
03869 end:
03870
03871 for(i=0; i<4; i++)
03872 s->block_index[i]-= 2;
03873 for(i=4; i<6; i++)
03874 s->block_index[i]-= 1;
03875 s->mb_x--;
03876
03877 s->gb= gb;
03878 }
03879
03880 static void h263_decode_dquant(MpegEncContext *s){
03881 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
03882
03883 if(s->modified_quant){
03884 if(get_bits1(&s->gb))
03885 s->qscale= modified_quant_tab[get_bits1(&s->gb)][ s->qscale ];
03886 else
03887 s->qscale= get_bits(&s->gb, 5);
03888 }else
03889 s->qscale += quant_tab[get_bits(&s->gb, 2)];
03890 ff_set_qscale(s, s->qscale);
03891 }
03892
03893 int ff_h263_decode_mb(MpegEncContext *s,
03894 DCTELEM block[6][64])
03895 {
03896 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
03897 int16_t *mot_val;
03898 const int xy= s->mb_x + s->mb_y * s->mb_stride;
03899
03900 assert(!s->h263_pred);
03901
03902 if (s->pict_type == P_TYPE) {
03903 do{
03904 if (get_bits1(&s->gb)) {
03905
03906 s->mb_intra = 0;
03907 for(i=0;i<6;i++)
03908 s->block_last_index[i] = -1;
03909 s->mv_dir = MV_DIR_FORWARD;
03910 s->mv_type = MV_TYPE_16X16;
03911 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
03912 s->mv[0][0][0] = 0;
03913 s->mv[0][0][1] = 0;
03914 s->mb_skipped = !(s->obmc | s->loop_filter);
03915 goto end;
03916 }
03917 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
03918
03919 if (cbpc < 0){
03920 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
03921 return -1;
03922 }
03923 }while(cbpc == 20);
03924
03925 s->dsp.clear_blocks(s->block[0]);
03926
03927 dquant = cbpc & 8;
03928 s->mb_intra = ((cbpc & 4) != 0);
03929 if (s->mb_intra) goto intra;
03930
03931 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
03932
03933 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
03934 cbpy ^= 0xF;
03935
03936 cbp = (cbpc & 3) | (cbpy << 2);
03937 if (dquant) {
03938 h263_decode_dquant(s);
03939 }
03940
03941 s->mv_dir = MV_DIR_FORWARD;
03942 if ((cbpc & 16) == 0) {
03943 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
03944
03945 s->mv_type = MV_TYPE_16X16;
03946 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
03947 if (s->umvplus)
03948 mx = h263p_decode_umotion(s, pred_x);
03949 else
03950 mx = h263_decode_motion(s, pred_x, 1);
03951
03952 if (mx >= 0xffff)
03953 return -1;
03954
03955 if (s->umvplus)
03956 my = h263p_decode_umotion(s, pred_y);
03957 else
03958 my = h263_decode_motion(s, pred_y, 1);
03959
03960 if (my >= 0xffff)
03961 return -1;
03962 s->mv[0][0][0] = mx;
03963 s->mv[0][0][1] = my;
03964
03965 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
03966 skip_bits1(&s->gb);
03967 } else {
03968 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
03969 s->mv_type = MV_TYPE_8X8;
03970 for(i=0;i<4;i++) {
03971 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
03972 if (s->umvplus)
03973 mx = h263p_decode_umotion(s, pred_x);
03974 else
03975 mx = h263_decode_motion(s, pred_x, 1);
03976 if (mx >= 0xffff)
03977 return -1;
03978
03979 if (s->umvplus)
03980 my = h263p_decode_umotion(s, pred_y);
03981 else
03982 my = h263_decode_motion(s, pred_y, 1);
03983 if (my >= 0xffff)
03984 return -1;
03985 s->mv[0][i][0] = mx;
03986 s->mv[0][i][1] = my;
03987 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
03988 skip_bits1(&s->gb);
03989 mot_val[0] = mx;
03990 mot_val[1] = my;
03991 }
03992 }
03993
03994
03995 for (i = 0; i < 6; i++) {
03996 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
03997 return -1;
03998 cbp+=cbp;
03999 }
04000
04001 if(s->obmc){
04002 if(s->pict_type == P_TYPE && s->mb_x+1<s->mb_width && s->mb_num_left != 1)
04003 preview_obmc(s);
04004 }
04005 } else if(s->pict_type==B_TYPE) {
04006 int mb_type;
04007 const int stride= s->b8_stride;
04008 int16_t *mot_val0 = s->current_picture.motion_val[0][ 2*(s->mb_x + s->mb_y*stride) ];
04009 int16_t *mot_val1 = s->current_picture.motion_val[1][ 2*(s->mb_x + s->mb_y*stride) ];
04010
04011
04012
04013 mot_val0[0 ]= mot_val0[2 ]= mot_val0[0+2*stride]= mot_val0[2+2*stride]=
04014 mot_val0[1 ]= mot_val0[3 ]= mot_val0[1+2*stride]= mot_val0[3+2*stride]=
04015 mot_val1[0 ]= mot_val1[2 ]= mot_val1[0+2*stride]= mot_val1[2+2*stride]=
04016 mot_val1[1 ]= mot_val1[3 ]= mot_val1[1+2*stride]= mot_val1[3+2*stride]= 0;
04017
04018 do{
04019 mb_type= get_vlc2(&s->gb, h263_mbtype_b_vlc.table, H263_MBTYPE_B_VLC_BITS, 2);
04020 if (mb_type < 0){
04021 av_log(s->avctx, AV_LOG_ERROR, "b mb_type damaged at %d %d\n", s->mb_x, s->mb_y);
04022 return -1;
04023 }
04024
04025 mb_type= h263_mb_type_b_map[ mb_type ];
04026 }while(!mb_type);
04027
04028 s->mb_intra = IS_INTRA(mb_type);
04029 if(HAS_CBP(mb_type)){
04030 s->dsp.clear_blocks(s->block[0]);
04031 cbpc = get_vlc2(&s->gb, cbpc_b_vlc.table, CBPC_B_VLC_BITS, 1);
04032 if(s->mb_intra){
04033 dquant = IS_QUANT(mb_type);
04034 goto intra;
04035 }
04036
04037 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
04038
04039 if (cbpy < 0){
04040 av_log(s->avctx, AV_LOG_ERROR, "b cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
04041 return -1;
04042 }
04043
04044 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
04045 cbpy ^= 0xF;
04046
04047 cbp = (cbpc & 3) | (cbpy << 2);
04048 }else
04049 cbp=0;
04050
04051 assert(!s->mb_intra);
04052
04053 if(IS_QUANT(mb_type)){
04054 h263_decode_dquant(s);
04055 }
04056
04057 if(IS_DIRECT(mb_type)){
04058 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
04059 mb_type |= ff_mpeg4_set_direct_mv(s, 0, 0);
04060 }else{
04061 s->mv_dir = 0;
04062 s->mv_type= MV_TYPE_16X16;
04063
04064
04065 if(USES_LIST(mb_type, 0)){
04066 int16_t *mot_val= h263_pred_motion(s, 0, 0, &mx, &my);
04067 s->mv_dir = MV_DIR_FORWARD;
04068
04069 mx = h263_decode_motion(s, mx, 1);
04070 my = h263_decode_motion(s, my, 1);
04071
04072 s->mv[0][0][0] = mx;
04073 s->mv[0][0][1] = my;
04074 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
04075 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
04076 }
04077
04078 if(USES_LIST(mb_type, 1)){
04079 int16_t *mot_val= h263_pred_motion(s, 0, 1, &mx, &my);
04080 s->mv_dir |= MV_DIR_BACKWARD;
04081
04082 mx = h263_decode_motion(s, mx, 1);
04083 my = h263_decode_motion(s, my, 1);
04084
04085 s->mv[1][0][0] = mx;
04086 s->mv[1][0][1] = my;
04087 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
04088 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
04089 }
04090 }
04091
04092 s->current_picture.mb_type[xy]= mb_type;
04093
04094
04095 for (i = 0; i < 6; i++) {
04096 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
04097 return -1;
04098 cbp+=cbp;
04099 }
04100 } else {
04101 do{
04102 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
04103 if (cbpc < 0){
04104 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
04105 return -1;
04106 }
04107 }while(cbpc == 8);
04108
04109 s->dsp.clear_blocks(s->block[0]);
04110
04111 dquant = cbpc & 4;
04112 s->mb_intra = 1;
04113 intra:
04114 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
04115 if (s->h263_aic) {
04116 s->ac_pred = get_bits1(&s->gb);
04117 if(s->ac_pred){
04118 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
04119
04120 s->h263_aic_dir = get_bits1(&s->gb);
04121 }
04122 }else
04123 s->ac_pred = 0;
04124
04125 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
04126 if(cbpy<0){
04127 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
04128 return -1;
04129 }
04130 cbp = (cbpc & 3) | (cbpy << 2);
04131 if (dquant) {
04132 h263_decode_dquant(s);
04133 }
04134
04135
04136 for (i = 0; i < 6; i++) {
04137 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
04138 return -1;
04139 cbp+=cbp;
04140 }
04141 }
04142 end:
04143
04144
04145 {
04146 int v= show_bits(&s->gb, 16);
04147
04148 if(get_bits_count(&s->gb) + 16 > s->gb.size_in_bits){
04149 v>>= get_bits_count(&s->gb) + 16 - s->gb.size_in_bits;
04150 }
04151
04152 if(v==0)
04153 return SLICE_END;
04154 }
04155
04156 return SLICE_OK;
04157 }
04158
04159 int ff_mpeg4_decode_mb(MpegEncContext *s,
04160 DCTELEM block[6][64])
04161 {
04162 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
04163 int16_t *mot_val;
04164 static int8_t quant_tab[4] = { -1, -2, 1, 2 };
04165 const int xy= s->mb_x + s->mb_y * s->mb_stride;
04166
04167 assert(s->h263_pred);
04168
04169 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
04170 do{
04171 if (get_bits1(&s->gb)) {
04172
04173 s->mb_intra = 0;
04174 for(i=0;i<6;i++)
04175 s->block_last_index[i] = -1;
04176 s->mv_dir = MV_DIR_FORWARD;
04177 s->mv_type = MV_TYPE_16X16;
04178 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
04179 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
04180 s->mcsel=1;
04181 s->mv[0][0][0]= get_amv(s, 0);
04182 s->mv[0][0][1]= get_amv(s, 1);
04183
04184 s->mb_skipped = 0;
04185 }else{
04186 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
04187 s->mcsel=0;
04188 s->mv[0][0][0] = 0;
04189 s->mv[0][0][1] = 0;
04190 s->mb_skipped = 1;
04191 }
04192 goto end;
04193 }
04194 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
04195
04196 if (cbpc < 0){
04197 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
04198 return -1;
04199 }
04200 }while(cbpc == 20);
04201
04202 s->dsp.clear_blocks(s->block[0]);
04203 dquant = cbpc & 8;
04204 s->mb_intra = ((cbpc & 4) != 0);
04205 if (s->mb_intra) goto intra;
04206
04207 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
04208 s->mcsel= get_bits1(&s->gb);
04209 else s->mcsel= 0;
04210 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1) ^ 0x0F;
04211
04212 cbp = (cbpc & 3) | (cbpy << 2);
04213 if (dquant) {
04214 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
04215 }
04216 if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE)))
04217 s->interlaced_dct= get_bits1(&s->gb);
04218
04219 s->mv_dir = MV_DIR_FORWARD;
04220 if ((cbpc & 16) == 0) {
04221 if(s->mcsel){
04222 s->current_picture.mb_type[xy]= MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
04223
04224 s->mv_type = MV_TYPE_16X16;
04225 mx= get_amv(s, 0);
04226 my= get_amv(s, 1);
04227 s->mv[0][0][0] = mx;
04228 s->mv[0][0][1] = my;
04229 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
04230 s->current_picture.mb_type[xy]= MB_TYPE_16x8 | MB_TYPE_L0 | MB_TYPE_INTERLACED;
04231
04232 s->mv_type= MV_TYPE_FIELD;
04233
04234 s->field_select[0][0]= get_bits1(&s->gb);
04235 s->field_select[0][1]= get_bits1(&s->gb);
04236
04237 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
04238
04239 for(i=0; i<2; i++){
04240 mx = h263_decode_motion(s, pred_x, s->f_code);
04241 if (mx >= 0xffff)
04242 return -1;
04243
04244 my = h263_decode_motion(s, pred_y/2, s->f_code);
04245 if (my >= 0xffff)
04246 return -1;
04247
04248 s->mv[0][i][0] = mx;
04249 s->mv[0][i][1] = my;
04250 }
04251 }else{
04252 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
04253
04254 s->mv_type = MV_TYPE_16X16;
04255 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
04256 mx = h263_decode_motion(s, pred_x, s->f_code);
04257
04258 if (mx >= 0xffff)
04259 return -1;
04260
04261 my = h263_decode_motion(s, pred_y, s->f_code);
04262
04263 if (my >= 0xffff)
04264 return -1;
04265 s->mv[0][0][0] = mx;
04266 s->mv[0][0][1] = my;
04267 }
04268 } else {
04269 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
04270 s->mv_type = MV_TYPE_8X8;
04271 for(i=0;i<4;i++) {
04272 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
04273 mx = h263_decode_motion(s, pred_x, s->f_code);
04274 if (mx >= 0xffff)
04275 return -1;
04276
04277 my = h263_decode_motion(s, pred_y, s->f_code);
04278 if (my >= 0xffff)
04279 return -1;
04280 s->mv[0][i][0] = mx;
04281 s->mv[0][i][1] = my;
04282 mot_val[0] = mx;
04283 mot_val[1] = my;
04284 }
04285 }
04286 } else if(s->pict_type==B_TYPE) {
04287 int modb1;
04288 int modb2;
04289 int mb_type;
04290
04291 s->mb_intra = 0;
04292 s->mcsel=0;
04293
04294 if(s->mb_x==0){
04295 for(i=0; i<2; i++){
04296 s->last_mv[i][0][0]=
04297 s->last_mv[i][0][1]=
04298 s->last_mv[i][1][0]=
04299 s->last_mv[i][1][1]= 0;
04300 }
04301 }
04302
04303
04304 s->mb_skipped= s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x];
04305
04306 if(s->mb_skipped){
04307
04308 for(i=0;i<6;i++)
04309 s->block_last_index[i] = -1;
04310
04311 s->mv_dir = MV_DIR_FORWARD;
04312 s->mv_type = MV_TYPE_16X16;
04313 s->mv[0][0][0] = 0;
04314 s->mv[0][0][1] = 0;
04315 s->mv[1][0][0] = 0;
04316 s->mv[1][0][1] = 0;
04317 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
04318 goto end;
04319 }
04320
04321 modb1= get_bits1(&s->gb);
04322 if(modb1){
04323 mb_type= MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1;
04324 cbp=0;
04325 }else{
04326 modb2= get_bits1(&s->gb);
04327 mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
04328 if(mb_type<0){
04329 av_log(s->avctx, AV_LOG_ERROR, "illegal MB_type\n");
04330 return -1;
04331 }
04332 mb_type= mb_type_b_map[ mb_type ];
04333 if(modb2) cbp= 0;
04334 else{
04335 s->dsp.clear_blocks(s->block[0]);
04336 cbp= get_bits(&s->gb, 6);
04337 }
04338
04339 if ((!IS_DIRECT(mb_type)) && cbp) {
04340 if(get_bits1(&s->gb)){
04341 ff_set_qscale(s, s->qscale + get_bits1(&s->gb)*4 - 2);
04342 }
04343 }
04344
04345 if(!s->progressive_sequence){
04346 if(cbp)
04347 s->interlaced_dct= get_bits1(&s->gb);
04348
04349 if(!IS_DIRECT(mb_type) && get_bits1(&s->gb)){
04350 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
04351 mb_type &= ~MB_TYPE_16x16;
04352
04353 if(USES_LIST(mb_type, 0)){
04354 s->field_select[0][0]= get_bits1(&s->gb);
04355 s->field_select[0][1]= get_bits1(&s->gb);
04356 }
04357 if(USES_LIST(mb_type, 1)){
04358 s->field_select[1][0]= get_bits1(&s->gb);
04359 s->field_select[1][1]= get_bits1(&s->gb);
04360 }
04361 }
04362 }
04363
04364 s->mv_dir = 0;
04365 if((mb_type & (MB_TYPE_DIRECT2|MB_TYPE_INTERLACED)) == 0){
04366 s->mv_type= MV_TYPE_16X16;
04367
04368 if(USES_LIST(mb_type, 0)){
04369 s->mv_dir = MV_DIR_FORWARD;
04370
04371 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
04372 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
04373 s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
04374 s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
04375 }
04376
04377 if(USES_LIST(mb_type, 1)){
04378 s->mv_dir |= MV_DIR_BACKWARD;
04379
04380 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
04381 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
04382 s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
04383 s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
04384 }
04385 }else if(!IS_DIRECT(mb_type)){
04386 s->mv_type= MV_TYPE_FIELD;
04387
04388 if(USES_LIST(mb_type, 0)){
04389 s->mv_dir = MV_DIR_FORWARD;
04390
04391 for(i=0; i<2; i++){
04392 mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code);
04393 my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
04394 s->last_mv[0][i][0]= s->mv[0][i][0] = mx;
04395 s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
04396 }
04397 }
04398
04399 if(USES_LIST(mb_type, 1)){
04400 s->mv_dir |= MV_DIR_BACKWARD;
04401
04402 for(i=0; i<2; i++){
04403 mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code);
04404 my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
04405 s->last_mv[1][i][0]= s->mv[1][i][0] = mx;
04406 s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
04407 }
04408 }
04409 }
04410 }
04411
04412 if(IS_DIRECT(mb_type)){
04413 if(IS_SKIP(mb_type))
04414 mx=my=0;
04415 else{
04416 mx = h263_decode_motion(s, 0, 1);
04417 my = h263_decode_motion(s, 0, 1);
04418 }
04419
04420 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
04421 mb_type |= ff_mpeg4_set_direct_mv(s, mx, my);
04422 }
04423 s->current_picture.mb_type[xy]= mb_type;
04424 } else {
04425 do{
04426 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
04427 if (cbpc < 0){
04428 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
04429 return -1;
04430 }
04431 }while(cbpc == 8);
04432
04433 dquant = cbpc & 4;
04434 s->mb_intra = 1;
04435 intra:
04436 s->ac_pred = get_bits1(&s->gb);
04437 if(s->ac_pred)
04438 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
04439 else
04440 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
04441
04442 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
04443 if(cbpy<0){
04444 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
04445 return -1;
04446 }
04447 cbp = (cbpc & 3) | (cbpy << 2);
04448 if (dquant) {
04449 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
04450 }
04451
04452 if(!s->progressive_sequence)
04453 s->interlaced_dct= get_bits1(&s->gb);
04454
04455 s->dsp.clear_blocks(s->block[0]);
04456
04457 for (i = 0; i < 6; i++) {
04458 if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0)
04459 return -1;
04460 cbp+=cbp;
04461 }
04462 goto end;
04463 }
04464
04465
04466 for (i = 0; i < 6; i++) {
04467 if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0)
04468 return -1;
04469 cbp+=cbp;
04470 }
04471 end:
04472
04473
04474 if(s->codec_id==CODEC_ID_MPEG4){
04475 if(mpeg4_is_resync(s)){
04476 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
04477 if(s->pict_type==B_TYPE && s->next_picture.mbskip_table[xy + delta])
04478 return SLICE_OK;
04479 return SLICE_END;
04480 }
04481 }
04482
04483 return SLICE_OK;
04484 }
04485
04486 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
04487 {
04488 int code, val, sign, shift, l;
04489 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
04490
04491 if (code == 0)
04492 return pred;
04493 if (code < 0)
04494 return 0xffff;
04495
04496 sign = get_bits1(&s->gb);
04497 shift = f_code - 1;
04498 val = code;
04499 if (shift) {
04500 val = (val - 1) << shift;
04501 val |= get_bits(&s->gb, shift);
04502 val++;
04503 }
04504 if (sign)
04505 val = -val;
04506 val += pred;
04507
04508
04509 if (!s->h263_long_vectors) {
04510 l = INT_BIT - 5 - f_code;
04511 val = (val<<l)>>l;
04512 } else {
04513
04514 if (pred < -31 && val < -63)
04515 val += 64;
04516 if (pred > 32 && val > 63)
04517 val -= 64;
04518
04519 }
04520 return val;
04521 }
04522
04523
04524 static int h263p_decode_umotion(MpegEncContext * s, int pred)
04525 {
04526 int code = 0, sign;
04527
04528 if (get_bits1(&s->gb))
04529 return pred;
04530
04531 code = 2 + get_bits1(&s->gb);
04532
04533 while (get_bits1(&s->gb))
04534 {
04535 code <<= 1;
04536 code += get_bits1(&s->gb);
04537 }
04538 sign = code & 1;
04539 code >>= 1;
04540
04541 code = (sign) ? (pred - code) : (pred + code);
04542 #ifdef DEBUG
04543 fprintf(stderr,"H.263+ UMV Motion = %d\n", code);
04544 #endif
04545 return code;
04546
04547 }
04548
04549 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
04550 int n, int coded)
04551 {
04552 int code, level, i, j, last, run;
04553 RLTable *rl = &rl_inter;
04554 const uint8_t *scan_table;
04555 GetBitContext gb= s->gb;
04556
04557 scan_table = s->intra_scantable.permutated;
04558 if (s->h263_aic && s->mb_intra) {
04559 rl = &rl_intra_aic;
04560 i = 0;
04561 if (s->ac_pred) {
04562 if (s->h263_aic_dir)
04563 scan_table = s->intra_v_scantable.permutated;
04564 else
04565 scan_table = s->intra_h_scantable.permutated;
04566 }
04567 } else if (s->mb_intra) {
04568
04569 if(s->codec_id == CODEC_ID_RV10){
04570 #ifdef CONFIG_RV10_DECODER
04571 if (s->rv10_version == 3 && s->pict_type == I_TYPE) {
04572 int component, diff;
04573 component = (n <= 3 ? 0 : n - 4 + 1);
04574 level = s->last_dc[component];
04575 if (s->rv10_first_dc_coded[component]) {
04576 diff = rv_decode_dc(s, n);
04577 if (diff == 0xffff)
04578 return -1;
04579 level += diff;
04580 level = level & 0xff;
04581 s->last_dc[component] = level;
04582 } else {
04583 s->rv10_first_dc_coded[component] = 1;
04584 }
04585 } else {
04586 level = get_bits(&s->gb, 8);
04587 if (level == 255)
04588 level = 128;
04589 }
04590 #endif
04591 }else{
04592 level = get_bits(&s->gb, 8);
04593 if((level&0x7F) == 0){
04594 av_log(s->avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y);
04595 if(s->error_resilience >= FF_ER_COMPLIANT)
04596 return -1;
04597 }
04598 if (level == 255)
04599 level = 128;
04600 }
04601 block[0] = level;
04602 i = 1;
04603 } else {
04604 i = 0;
04605 }
04606 if (!coded) {
04607 if (s->mb_intra && s->h263_aic)
04608 goto not_coded;
04609 s->block_last_index[n] = i - 1;
04610 return 0;
04611 }
04612 retry:
04613 for(;;) {
04614 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
04615 if (code < 0){
04616 av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
04617 return -1;
04618 }
04619 if (code == rl->n) {
04620
04621 if (s->h263_flv > 1) {
04622 int is11 = get_bits1(&s->gb);
04623 last = get_bits1(&s->gb);
04624 run = get_bits(&s->gb, 6);
04625 if(is11){
04626 level = get_sbits(&s->gb, 11);
04627 } else {
04628 level = get_sbits(&s->gb, 7);
04629 }
04630 } else {
04631 last = get_bits1(&s->gb);
04632 run = get_bits(&s->gb, 6);
04633 level = (int8_t)get_bits(&s->gb, 8);
04634 if(level == -128){
04635 if (s->codec_id == CODEC_ID_RV10) {
04636
04637 level = get_sbits(&s->gb, 12);
04638 }else{
04639 level = get_bits(&s->gb, 5);
04640 level |= get_sbits(&s->gb, 6)<<5;
04641 }
04642 }
04643 }
04644 } else {
04645 run = rl->table_run[code];
04646 level = rl->table_level[code];
04647 last = code >= rl->last;
04648 if (get_bits1(&s->gb))
04649 level = -level;
04650 }
04651 i += run;
04652 if (i >= 64){
04653 if(s->alt_inter_vlc && rl == &rl_inter && !s->mb_intra){
04654
04655 rl = &rl_intra_aic;
04656 i = 0;
04657 s->gb= gb;
04658 memset(block, 0, sizeof(DCTELEM)*64);
04659 goto retry;
04660 }
04661 av_log(s->avctx, AV_LOG_ERROR, "run overflow at %dx%d i:%d\n", s->mb_x, s->mb_y, s->mb_intra);
04662 return -1;
04663 }
04664 j = scan_table[i];
04665 block[j] = level;
04666 if (last)
04667 break;
04668 i++;
04669 }
04670 not_coded:
04671 if (s->mb_intra && s->h263_aic) {
04672 h263_pred_acdc(s, block, n);
04673 i = 63;
04674 }
04675 s->block_last_index[n] = i;
04676 return 0;
04677 }
04678
04685 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
04686 {
04687 int level, code;
04688
04689 if (n < 4)
04690 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
04691 else
04692 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
04693 if (code < 0 || code > 9 ){
04694 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
04695 return -1;
04696 }
04697 if (code == 0) {
04698 level = 0;
04699 } else {
04700 if(IS_3IV1){
04701 if(code==1)
04702 level= 2*get_bits1(&s->gb)-1;
04703 else{
04704 if(get_bits1(&s->gb))
04705 level = get_bits(&s->gb, code-1) + (1<<(code-1));
04706 else
04707 level = -get_bits(&s->gb, code-1) - (1<<(code-1));
04708 }
04709 }else{
04710 level = get_xbits(&s->gb, code);
04711 }
04712
04713 if (code > 8){
04714 if(get_bits1(&s->gb)==0){
04715 if(s->error_resilience>=2){
04716 av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n");
04717 return -1;
04718 }
04719 }
04720 }
04721 }
04722
04723 return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0);
04724 }
04725
04730 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
04731 int n, int coded, int intra, int rvlc)
04732 {
04733 int level, i, last, run;
04734 int dc_pred_dir;
04735 RLTable * rl;
04736 RL_VLC_ELEM * rl_vlc;
04737 const uint8_t * scan_table;
04738 int qmul, qadd;
04739
04740
04741
04742 if(intra) {
04743 if(s->qscale < s->intra_dc_threshold){
04744
04745 if(s->partitioned_frame){
04746 level = s->dc_val[0][ s->block_index[n] ];
04747 if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale);
04748 else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale);
04749 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32;
04750 }else{
04751 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
04752 if (level < 0)
04753 return -1;
04754 }
04755 block[0] = level;
04756 i = 0;
04757 }else{
04758 i = -1;
04759 }
04760 if (!coded)
04761 goto not_coded;
04762
04763 if(rvlc){
04764 rl = &rvlc_rl_intra;
04765 rl_vlc = rvlc_rl_intra.rl_vlc[0];
04766 }else{
04767 rl = &rl_intra;
04768 rl_vlc = rl_intra.rl_vlc[0];
04769 }
04770 if (s->ac_pred) {
04771 if (dc_pred_dir == 0)
04772 scan_table = s->intra_v_scantable.permutated;
04773 else
04774 scan_table = s->intra_h_scantable.permutated;
04775 } else {
04776 scan_table = s->intra_scantable.permutated;
04777 }
04778 qmul=1;
04779 qadd=0;
04780 } else {
04781 i = -1;
04782 if (!coded) {
04783 s->block_last_index[n] = i;
04784 return 0;
04785 }
04786 if(rvlc) rl = &rvlc_rl_inter;
04787 else rl = &rl_inter;
04788
04789 scan_table = s->intra_scantable.permutated;
04790
04791 if(s->mpeg_quant){
04792 qmul=1;
04793 qadd=0;
04794 if(rvlc){
04795 rl_vlc = rvlc_rl_inter.rl_vlc[0];
04796 }else{
04797 rl_vlc = rl_inter.rl_vlc[0];
04798 }
04799 }else{
04800 qmul = s->qscale << 1;
04801 qadd = (s->qscale - 1) | 1;
04802 if(rvlc){
04803 rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale];
04804 }else{
04805 rl_vlc = rl_inter.rl_vlc[s->qscale];
04806 }
04807 }
04808 }
04809 {
04810 OPEN_READER(re, &s->gb);
04811 for(;;) {
04812 UPDATE_CACHE(re, &s->gb);
04813 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
04814 if (level==0) {
04815
04816 if(rvlc){
04817 if(SHOW_UBITS(re, &s->gb, 1)==0){
04818 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n");
04819 return -1;
04820 }; SKIP_CACHE(re, &s->gb, 1);
04821
04822 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
04823 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
04824 SKIP_COUNTER(re, &s->gb, 1+1+6);
04825 UPDATE_CACHE(re, &s->gb);
04826
04827 if(SHOW_UBITS(re, &s->gb, 1)==0){
04828 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n");
04829 return -1;
04830 }; SKIP_CACHE(re, &s->gb, 1);
04831
04832 level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11);
04833
04834 if(SHOW_UBITS(re, &s->gb, 5)!=0x10){
04835 av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n");
04836 return -1;
04837 }; SKIP_CACHE(re, &s->gb, 5);
04838
04839 level= level * qmul + qadd;
04840 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1);
04841 SKIP_COUNTER(re, &s->gb, 1+11+5+1);
04842
04843 i+= run + 1;
04844 if(last) i+=192;
04845 }else{
04846 int cache;
04847 cache= GET_CACHE(re, &s->gb);
04848
04849 if(IS_3IV1)
04850 cache ^= 0xC0000000;
04851
04852 if (cache&0x80000000) {
04853 if (cache&0x40000000) {
04854
04855 SKIP_CACHE(re, &s->gb, 2);
04856 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
04857 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
04858 SKIP_COUNTER(re, &s->gb, 2+1+6);
04859 UPDATE_CACHE(re, &s->gb);
04860
04861 if(IS_3IV1){
04862 level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12);
04863 }else{
04864 if(SHOW_UBITS(re, &s->gb, 1)==0){
04865 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n");
04866 return -1;
04867 }; SKIP_CACHE(re, &s->gb, 1);
04868
04869 level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
04870
04871 if(SHOW_UBITS(re, &s->gb, 1)==0){
04872 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n");
04873 return -1;
04874 }; LAST_SKIP_CACHE(re, &s->gb, 1);
04875
04876 SKIP_COUNTER(re, &s->gb, 1+12+1);
04877 }
04878
04879 #if 0
04880 if(s->error_resilience >= FF_ER_COMPLIANT){
04881 const int abs_level= ABS(level);
04882 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
04883 const int run1= run - rl->max_run[last][abs_level] - 1;
04884 if(abs_level <= rl->max_level[last][run]){
04885 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
04886 return -1;
04887 }
04888 if(s->error_resilience > FF_ER_COMPLIANT){
04889 if(abs_level <= rl->max_level[last][run]*2){
04890 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
04891 return -1;
04892 }
04893 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
04894 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
04895 return -1;
04896 }
04897 }
04898 }
04899 }
04900 #endif
04901 if (level>0) level= level * qmul + qadd;
04902 else level= level * qmul - qadd;
04903
04904 if((unsigned)(level + 2048) > 4095){
04905 if(s->error_resilience > FF_ER_COMPLIANT){
04906 if(level > 2560 || level<-2560){
04907 av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
04908 return -1;
04909 }
04910 }
04911 level= level<0 ? -2048 : 2047;
04912 }
04913
04914 i+= run + 1;
04915 if(last) i+=192;
04916 } else {
04917
04918 #if MIN_CACHE_BITS < 20
04919 LAST_SKIP_BITS(re, &s->gb, 2);
04920 UPDATE_CACHE(re, &s->gb);
04921 #else
04922 SKIP_BITS(re, &s->gb, 2);
04923 #endif
04924 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
04925 i+= run + rl->max_run[run>>7][level/qmul] +1;
04926 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
04927 LAST_SKIP_BITS(re, &s->gb, 1);
04928 }
04929 } else {
04930
04931 #if MIN_CACHE_BITS < 19
04932 LAST_SKIP_BITS(re, &s->gb, 1);
04933 UPDATE_CACHE(re, &s->gb);
04934 #else
04935 SKIP_BITS(re, &s->gb, 1);
04936 #endif
04937 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
04938 i+= run;
04939 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;
04940 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
04941 LAST_SKIP_BITS(re, &s->gb, 1);
04942 }
04943 }
04944 } else {
04945 i+= run;
04946 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
04947 LAST_SKIP_BITS(re, &s->gb, 1);
04948 }
04949 if (i > 62){
04950 i-= 192;
04951 if(i&(~63)){
04952 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
04953 return -1;
04954 }
04955
04956 block[scan_table[i]] = level;
04957 break;
04958 }
04959
04960 block[scan_table[i]] = level;
04961 }
04962 CLOSE_READER(re, &s->gb);
04963 }
04964 not_coded:
04965 if (intra) {
04966 if(s->qscale >= s->intra_dc_threshold){
04967 block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0);
04968
04969 if(i == -1) i=0;
04970 }
04971
04972 mpeg4_pred_ac(s, block, n, dc_pred_dir);
04973 if (s->ac_pred) {
04974 i = 63;
04975 }
04976 }
04977 s->block_last_index[n] = i;
04978 return 0;
04979 }
04980
04981
04982 int h263_decode_picture_header(MpegEncContext *s)
04983 {
04984 int format, width, height, i;
04985 uint32_t startcode;
04986
04987 align_get_bits(&s->gb);
04988
04989 startcode= get_bits(&s->gb, 22-8);
04990
04991 for(i= s->gb.size_in_bits - get_bits_count(&s->gb); i>24; i-=8) {
04992 startcode = ((startcode << 8) | get_bits(&s->gb, 8)) & 0x003FFFFF;
04993
04994 if(startcode == 0x20)
04995 break;
04996 }
04997
04998 if (startcode != 0x20) {
04999 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
05000 return -1;
05001 }
05002
05003 i = get_bits(&s->gb, 8);
05004 if( (s->picture_number&~0xFF)+i < s->picture_number)
05005 i+= 256;
05006 s->picture_number= (s->picture_number&~0xFF) + i;
05007
05008
05009 if (get_bits1(&s->gb) != 1) {
05010
05011 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
05012 return -1;
05013 }
05014 if (get_bits1(&s->gb) != 0) {
05015 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
05016 return -1;
05017 }
05018 skip_bits1(&s->gb);
05019 skip_bits1(&s->gb);
05020 skip_bits1(&s->gb);
05021
05022 format = get_bits(&s->gb, 3);
05023
05024
05025
05026
05027
05028
05029
05030 if (format != 7 && format != 6) {
05031 s->h263_plus = 0;
05032
05033 width = h263_format[format][0];
05034 height = h263_format[format][1];
05035 if (!width)
05036 return -1;
05037
05038 s->pict_type = I_TYPE + get_bits1(&s->gb);
05039
05040 s->h263_long_vectors = get_bits1(&s->gb);
05041
05042 if (get_bits1(&s->gb) != 0) {
05043 av_log(s->avctx, AV_LOG_ERROR, "H263 SAC not supported\n");
05044 return -1;
05045 }
05046 s->obmc= get_bits1(&s->gb);
05047 s->unrestricted_mv = s->h263_long_vectors || s->obmc;
05048
05049 if (get_bits1(&s->gb) != 0) {
05050 av_log(s->avctx, AV_LOG_ERROR, "H263 PB frame not supported\n");
05051 return -1;
05052 }
05053 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
05054 skip_bits1(&s->gb);
05055
05056 s->width = width;
05057 s->height = height;
05058 s->avctx->sample_aspect_ratio= (AVRational){12,11};
05059 s->avctx->time_base= (AVRational){1001, 30000};
05060 } else {
05061 int ufep;
05062
05063
05064 s->h263_plus = 1;
05065 ufep = get_bits(&s->gb, 3);
05066
05067
05068 if (ufep == 1) {
05069
05070 format = get_bits(&s->gb, 3);
05071 dprintf("ufep=1, format: %d\n", format);
05072 s->custom_pcf= get_bits1(&s->gb);
05073 s->umvplus = get_bits(&s->gb, 1);
05074 if (get_bits1(&s->gb) != 0) {
05075 av_log(s->avctx, AV_LOG_ERROR, "Syntax-based Arithmetic Coding (SAC) not supported\n");
05076 }
05077 s->obmc= get_bits1(&s->gb);
05078 s->h263_aic = get_bits1(&s->gb);
05079 s->loop_filter= get_bits1(&s->gb);
05080 s->unrestricted_mv = s->umvplus || s->obmc || s->loop_filter;
05081
05082 s->h263_slice_structured= get_bits1(&s->gb);
05083 if (get_bits1(&s->gb) != 0) {
05084 av_log(s->avctx, AV_LOG_ERROR, "Reference Picture Selection not supported\n");
05085 }
05086 if (get_bits1(&s->gb) != 0) {
05087 av_log(s->avctx, AV_LOG_ERROR, "Independent Segment Decoding not supported\n");
05088 }
05089 s->alt_inter_vlc= get_bits1(&s->gb);
05090 s->modified_quant= get_bits1(&s->gb);
05091 if(s->modified_quant)
05092 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
05093
05094 skip_bits(&s->gb, 1);
05095
05096 skip_bits(&s->gb, 3);
05097 } else if (ufep != 0) {
05098 av_log(s->avctx, AV_LOG_ERROR, "Bad UFEP type (%d)\n", ufep);
05099 return -1;
05100 }
05101
05102
05103 s->pict_type = get_bits(&s->gb, 3);
05104 switch(s->pict_type){
05105 case 0: s->pict_type= I_TYPE;break;
05106 case 1: s->pict_type= P_TYPE;break;
05107 case 3: s->pict_type= B_TYPE;break;
05108 case 7: s->pict_type= I_TYPE;break;
05109 default:
05110 return -1;
05111 }
05112 skip_bits(&s->gb, 2);
05113 s->no_rounding = get_bits1(&s->gb);
05114 skip_bits(&s->gb, 4);
05115
05116
05117 if (ufep) {
05118 if (format == 6) {
05119
05120 s->aspect_ratio_info = get_bits(&s->gb, 4);
05121 dprintf("aspect: %d\n", s->aspect_ratio_info);
05122
05123
05124
05125
05126
05127
05128
05129
05130
05131 width = (get_bits(&s->gb, 9) + 1) * 4;
05132 skip_bits1(&s->gb);
05133 height = get_bits(&s->gb, 9) * 4;
05134 dprintf("\nH.263+ Custom picture: %dx%d\n",width,height);
05135 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
05136
05137 s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 8);
05138 s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 8);
05139 }else{
05140 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
05141 }
05142 } else {
05143 width = h263_format[format][0];
05144 height = h263_format[format][1];
05145 s->avctx->sample_aspect_ratio= (AVRational){12,11};
05146 }
05147 if ((width == 0) || (height == 0))
05148 return -1;
05149 s->width = width;
05150 s->height = height;
05151
05152 if(s->custom_pcf){
05153 int gcd;
05154 s->avctx->time_base.den= 1800000;
05155 s->avctx->time_base.num= 1000 + get_bits1(&s->gb);
05156 s->avctx->time_base.num*= get_bits(&s->gb, 7);
05157 if(s->avctx->time_base.num == 0){
05158 av_log(s, AV_LOG_ERROR, "zero framerate\n");
05159 return -1;
05160 }
05161 gcd= ff_gcd(s->avctx->time_base.den, s->avctx->time_base.num);
05162 s->avctx->time_base.den /= gcd;
05163 s->avctx->time_base.num /= gcd;
05164
05165 }else{
05166 s->avctx->time_base= (AVRational){1001, 30000};
05167 }
05168 }
05169
05170 if(s->custom_pcf){
05171 skip_bits(&s->gb, 2);
05172 }
05173
05174 if (ufep) {
05175 if (s->umvplus) {
05176 if(get_bits1(&s->gb)==0)
05177 skip_bits1(&s->gb);
05178 }
05179 if(s->h263_slice_structured){
05180 if (get_bits1(&s->gb) != 0) {
05181 av_log(s->avctx, AV_LOG_ERROR, "rectangular slices not supported\n");
05182 }
05183 if (get_bits1(&s->gb) != 0) {
05184 av_log(s->avctx, AV_LOG_ERROR, "unordered slices not supported\n");
05185 }
05186 }
05187 }
05188
05189 s->qscale = get_bits(&s->gb, 5);
05190 }
05191
05192 s->mb_width = (s->width + 15) / 16;
05193 s->mb_height = (s->height + 15) / 16;
05194 s->mb_num = s->mb_width * s->mb_height;
05195
05196
05197 while (get_bits1(&s->gb) != 0) {
05198 skip_bits(&s->gb, 8);
05199 }
05200
05201 if(s->h263_slice_structured){
05202 if (get_bits1(&s->gb) != 1) {
05203 av_log(s->avctx, AV_LOG_ERROR, "SEPB1 marker missing\n");
05204 return -1;
05205 }
05206
05207 ff_h263_decode_mba(s);
05208
05209 if (get_bits1(&s->gb) != 1) {
05210 av_log(s->avctx, AV_LOG_ERROR, "SEPB2 marker missing\n");
05211 return -1;
05212 }
05213 }
05214 s->f_code = 1;
05215
05216 if(s->h263_aic){
05217 s->y_dc_scale_table=
05218 s->c_dc_scale_table= ff_aic_dc_scale_table;
05219 }else{
05220 s->y_dc_scale_table=
05221 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
05222 }
05223
05224 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
05225 av_log(s->avctx, AV_LOG_DEBUG, "qp:%d %c size:%d rnd:%d%s%s%s%s%s%s%s%s%s %d/%d\n",
05226 s->qscale, av_get_pict_type_char(s->pict_type),
05227 s->gb.size_in_bits, 1-s->no_rounding,
05228 s->obmc ? " AP" : "",
05229 s->umvplus ? " UMV" : "",
05230 s->h263_long_vectors ? " LONG" : "",
05231 s->h263_plus ? " +" : "",
05232 s->h263_aic ? " AIC" : "",
05233 s->alt_inter_vlc ? " AIV" : "",
05234 s->modified_quant ? " MQ" : "",
05235 s->loop_filter ? " LOOP" : "",
05236 s->h263_slice_structured ? " SS" : "",
05237 s->avctx->time_base.den, s->avctx->time_base.num
05238 );
05239 }
05240 #if 1
05241 if (s->pict_type == I_TYPE && s->avctx->codec_tag == ff_get_fourcc("ZYGO")){
05242 int i,j;
05243 for(i=0; i<85; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
05244 av_log(s->avctx, AV_LOG_DEBUG, "\n");
05245 for(i=0; i<13; i++){
05246 for(j=0; j<3; j++){
05247 int v= get_bits(&s->gb, 8);
05248 v |= get_sbits(&s->gb, 8)<<8;
05249 av_log(s->avctx, AV_LOG_DEBUG, " %5d", v);
05250 }
05251 av_log(s->avctx, AV_LOG_DEBUG, "\n");
05252 }
05253 for(i=0; i<50; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
05254 }
05255 #endif
05256
05257 return 0;
05258 }
05259
05260 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb)
05261 {
05262 int i;
05263 int a= 2<<s->sprite_warping_accuracy;
05264 int rho= 3-s->sprite_warping_accuracy;
05265 int r=16/a;
05266 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}};
05267 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
05268 int sprite_ref[4][2];
05269 int virtual_ref[2][2];
05270 int w2, h2, w3, h3;
05271 int alpha=0, beta=0;
05272 int w= s->width;
05273 int h= s->height;
05274 int min_ab;
05275
05276 for(i=0; i<s->num_sprite_warping_points; i++){
05277 int length;
05278 int x=0, y=0;
05279
05280 length= get_vlc(gb, &sprite_trajectory);
05281 if(length){
05282 x= get_xbits(gb, length);
05283 }
05284 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(gb);
05285
05286 length= get_vlc(gb, &sprite_trajectory);
05287 if(length){
05288 y=get_xbits(gb, length);
05289 }
05290 skip_bits1(gb);
05291
05292 d[i][0]= x;
05293 d[i][1]= y;
05294 }
05295
05296 while((1<<alpha)<w) alpha++;
05297 while((1<<beta )<h) beta++;
05298 w2= 1<<alpha;
05299 h2= 1<<beta;
05300
05301
05302 if(s->divx_version==500 && s->divx_build==413){
05303 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
05304 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
05305 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
05306 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
05307 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
05308 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
05309 } else {
05310 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
05311 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
05312 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
05313 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
05314 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
05315 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
05316 }
05317
05318
05319
05320
05321
05322
05323
05324 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
05325 + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + w2*(r*sprite_ref[1][0] - 16*vop_ref[1][0])),w);
05326 virtual_ref[0][1]= 16*vop_ref[0][1]
05327 + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + w2*(r*sprite_ref[1][1] - 16*vop_ref[1][1])),w);
05328 virtual_ref[1][0]= 16*vop_ref[0][0]
05329 + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + h2*(r*sprite_ref[2][0] - 16*vop_ref[2][0])),h);
05330 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
05331 + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + h2*(r*sprite_ref[2][1] - 16*vop_ref[2][1])),h);
05332
05333 switch(s->num_sprite_warping_points)
05334 {
05335 case 0:
05336 s->sprite_offset[0][0]= 0;
05337 s->sprite_offset[0][1]= 0;
05338 s->sprite_offset[1][0]= 0;
05339 s->sprite_offset[1][1]= 0;
05340 s->sprite_delta[0][0]= a;
05341 s->sprite_delta[0][1]= 0;
05342 s->sprite_delta[1][0]= 0;
05343 s->sprite_delta[1][1]= a;
05344 s->sprite_shift[0]= 0;
05345 s->sprite_shift[1]= 0;
05346 break;
05347 case 1:
05348 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
05349 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
05350 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
05351 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
05352 s->sprite_delta[0][0]= a;
05353 s->sprite_delta[0][1]= 0;
05354 s->sprite_delta[1][0]= 0;
05355 s->sprite_delta[1][1]= a;
05356 s->sprite_shift[0]= 0;
05357 s->sprite_shift[1]= 0;
05358 break;
05359 case 2:
05360 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
05361 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
05362 + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])
05363 + (1<<(alpha+rho-1));
05364 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
05365 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
05366 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])
05367 + (1<<(alpha+rho-1));
05368 s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
05369 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
05370 +2*w2*r*sprite_ref[0][0]
05371 - 16*w2
05372 + (1<<(alpha+rho+1)));
05373 s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
05374 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
05375 +2*w2*r*sprite_ref[0][1]
05376 - 16*w2
05377 + (1<<(alpha+rho+1)));
05378 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
05379 s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]);
05380 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
05381 s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
05382
05383 s->sprite_shift[0]= alpha+rho;
05384 s->sprite_shift[1]= alpha+rho+2;
05385 break;
05386 case 3:
05387 min_ab= FFMIN(alpha, beta);
05388 w3= w2>>min_ab;
05389 h3= h2>>min_ab;
05390 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
05391 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])
05392 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])
05393 + (1<<(alpha+beta+rho-min_ab-1));
05394 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))
05395 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])
05396 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])
05397 + (1<<(alpha+beta+rho-min_ab-1));
05398 s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)
05399 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)
05400 + 2*w2*h3*r*sprite_ref[0][0]
05401 - 16*w2*h3
05402 + (1<<(alpha+beta+rho-min_ab+1));
05403 s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)
05404 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)
05405 + 2*w2*h3*r*sprite_ref[0][1]
05406 - 16*w2*h3
05407 + (1<<(alpha+beta+rho-min_ab+1));
05408 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;
05409 s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;
05410 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;
05411 s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;
05412
05413 s->sprite_shift[0]= alpha + beta + rho - min_ab;
05414 s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;
05415 break;
05416 }
05417
05418 if( s->sprite_delta[0][0] == a<<s->sprite_shift[0]
05419 && s->sprite_delta[0][1] == 0
05420 && s->sprite_delta[1][0] == 0
05421 && s->sprite_delta[1][1] == a<<s->sprite_shift[0])
05422 {
05423 s->sprite_offset[0][0]>>=s->sprite_shift[0];
05424 s->sprite_offset[0][1]>>=s->sprite_shift[0];
05425 s->sprite_offset[1][0]>>=s->sprite_shift[1];
05426 s->sprite_offset[1][1]>>=s->sprite_shift[1];
05427 s->sprite_delta[0][0]= a;
05428 s->sprite_delta[0][1]= 0;
05429 s->sprite_delta[1][0]= 0;
05430 s->sprite_delta[1][1]= a;
05431 s->sprite_shift[0]= 0;
05432 s->sprite_shift[1]= 0;
05433 s->real_sprite_warping_points=1;
05434 }
05435 else{
05436 int shift_y= 16 - s->sprite_shift[0];
05437 int shift_c= 16 - s->sprite_shift[1];
05438
05439 for(i=0; i<2; i++){
05440 s->sprite_offset[0][i]<<= shift_y;
05441 s->sprite_offset[1][i]<<= shift_c;
05442 s->sprite_delta[0][i]<<= shift_y;
05443 s->sprite_delta[1][i]<<= shift_y;
05444 s->sprite_shift[i]= 16;
05445 }
05446 s->real_sprite_warping_points= s->num_sprite_warping_points;
05447 }
05448 #if 0
05449 printf("vop:%d:%d %d:%d %d:%d, sprite:%d:%d %d:%d %d:%d, virtual: %d:%d %d:%d\n",
05450 vop_ref[0][0], vop_ref[0][1],
05451 vop_ref[1][0], vop_ref[1][1],
05452 vop_ref[2][0], vop_ref[2][1],
05453 sprite_ref[0][0], sprite_ref[0][1],
05454 sprite_ref[1][0], sprite_ref[1][1],
05455 sprite_ref[2][0], sprite_ref[2][1],
05456 virtual_ref[0][0], virtual_ref[0][1],
05457 virtual_ref[1][0], virtual_ref[1][1]
05458 );
05459
05460 printf("offset: %d:%d , delta: %d %d %d %d, shift %d\n",
05461 s->sprite_offset[0][0], s->sprite_offset[0][1],
05462 s->sprite_delta[0][0], s->sprite_delta[0][1],
05463 s->sprite_delta[1][0], s->sprite_delta[1][1],
05464 s->sprite_shift[0]
05465 );
05466 #endif
05467 }
05468
05469 static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
05470 int hours, minutes, seconds;
05471
05472 hours= get_bits(gb, 5);
05473 minutes= get_bits(gb, 6);
05474 skip_bits1(gb);
05475 seconds= get_bits(gb, 6);
05476
05477 s->time_base= seconds + 60*(minutes + 60*hours);
05478
05479 skip_bits1(gb);
05480 skip_bits1(gb);
05481
05482 return 0;
05483 }
05484
05485 static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
05486 int width, height, vo_ver_id;
05487
05488
05489 skip_bits(gb, 1);
05490 s->vo_type= get_bits(gb, 8);
05491 if (get_bits1(gb) != 0) {
05492 vo_ver_id = get_bits(gb, 4);
05493 skip_bits(gb, 3);
05494 } else {
05495 vo_ver_id = 1;
05496 }
05497
05498 s->aspect_ratio_info= get_bits(gb, 4);
05499 if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
05500 s->avctx->sample_aspect_ratio.num= get_bits(gb, 8);
05501 s->avctx->sample_aspect_ratio.den= get_bits(gb, 8);
05502 }else{
05503 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
05504 }
05505
05506 if ((s->vol_control_parameters=get_bits1(gb))) {
05507 int chroma_format= get_bits(gb, 2);
05508 if(chroma_format!=1){
05509 av_log(s->avctx, AV_LOG_ERROR, "illegal chroma format\n");
05510 }
05511 s->low_delay= get_bits1(gb);
05512 if(get_bits1(gb)){
05513 get_bits(gb, 15);
05514 skip_bits1(gb);
05515 get_bits(gb, 15);
05516 skip_bits1(gb);
05517 get_bits(gb, 15);
05518 skip_bits1(gb);
05519 get_bits(gb, 3);
05520 get_bits(gb, 11);
05521 skip_bits1(gb);
05522 get_bits(gb, 15);
05523 skip_bits1(gb);
05524 }
05525 }else{
05526
05527 if(s->picture_number==0)
05528 s->low_delay=0;
05529 }
05530
05531 s->shape = get_bits(gb, 2);
05532 if(s->shape != RECT_SHAPE) av_log(s->avctx, AV_LOG_ERROR, "only rectangular vol supported\n");
05533 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
05534 av_log(s->avctx, AV_LOG_ERROR, "Gray shape not supported\n");
05535 skip_bits(gb, 4);
05536 }
05537
05538 check_marker(gb, "before time_increment_resolution");
05539
05540 s->avctx->time_base.den = get_bits(gb, 16);
05541
05542 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
05543 if (s->time_increment_bits < 1)
05544 s->time_increment_bits = 1;
05545
05546 check_marker(gb, "before fixed_vop_rate");
05547
05548 if (get_bits1(gb) != 0) {
05549 s->avctx->time_base.num = get_bits(gb, s->time_increment_bits);
05550 }else
05551 s->avctx->time_base.num = 1;
05552
05553 s->t_frame=0;
05554
05555 if (s->shape != BIN_ONLY_SHAPE) {
05556 if (s->shape == RECT_SHAPE) {
05557 skip_bits1(gb);
05558 width = get_bits(gb, 13);
05559 skip_bits1(gb);
05560 height = get_bits(gb, 13);
05561 skip_bits1(gb);
05562 if(width && height && !(s->width && s->avctx->codec_tag == ff_get_fourcc("MP4S"))){
05563 s->width = width;
05564 s->height = height;
05565
05566 }
05567 }
05568
05569 s->progressive_sequence=
05570 s->progressive_frame= get_bits1(gb)^1;
05571 if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO))
05572 av_log(s->avctx, AV_LOG_INFO, "MPEG4 OBMC not supported (very likely buggy encoder)\n");
05573 if (vo_ver_id == 1) {
05574 s->vol_sprite_usage = get_bits1(gb);
05575 } else {
05576 s->vol_sprite_usage = get_bits(gb, 2);
05577 }
05578 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "Static Sprites not supported\n");
05579 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
05580 if(s->vol_sprite_usage==STATIC_SPRITE){
05581 s->sprite_width = get_bits(gb, 13);
05582 skip_bits1(gb);
05583 s->sprite_height= get_bits(gb, 13);
05584 skip_bits1(gb);
05585 s->sprite_left = get_bits(gb, 13);
05586 skip_bits1(gb);
05587 s->sprite_top = get_bits(gb, 13);
05588 skip_bits1(gb);
05589 }
05590 s->num_sprite_warping_points= get_bits(gb, 6);
05591 s->sprite_warping_accuracy = get_bits(gb, 2);
05592 s->sprite_brightness_change= get_bits1(gb);
05593 if(s->vol_sprite_usage==STATIC_SPRITE)
05594 s->low_latency_sprite= get_bits1(gb);
05595 }
05596
05597
05598 if (get_bits1(gb) == 1) {
05599 s->quant_precision = get_bits(gb, 4);
05600 if(get_bits(gb, 4)!=8) av_log(s->avctx, AV_LOG_ERROR, "N-bit not supported\n");
05601 if(s->quant_precision!=5) av_log(s->avctx, AV_LOG_ERROR, "quant precision %d\n", s->quant_precision);
05602 } else {
05603 s->quant_precision = 5;
05604 }
05605
05606
05607
05608 if((s->mpeg_quant=get_bits1(gb))){
05609 int i, v;
05610
05611
05612 for(i=0; i<64; i++){
05613 int j= s->dsp.idct_permutation[i];
05614 v= ff_mpeg4_default_intra_matrix[i];
05615 s->intra_matrix[j]= v;
05616 s->chroma_intra_matrix[j]= v;
05617
05618 v= ff_mpeg4_default_non_intra_matrix[i];
05619 s->inter_matrix[j]= v;
05620 s->chroma_inter_matrix[j]= v;
05621 }
05622
05623
05624 if(get_bits1(gb)){
05625 int last=0;
05626 for(i=0; i<64; i++){
05627 int j;
05628 v= get_bits(gb, 8);
05629 if(v==0) break;
05630
05631 last= v;
05632 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
05633 s->intra_matrix[j]= v;
05634 s->chroma_intra_matrix[j]= v;
05635 }
05636
05637
05638 for(; i<64; i++){
05639 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
05640 s->intra_matrix[j]= last;
05641 s->chroma_intra_matrix[j]= last;
05642 }
05643 }
05644
05645
05646 if(get_bits1(gb)){
05647 int last=0;
05648 for(i=0; i<64; i++){
05649 int j;
05650 v= get_bits(gb, 8);
05651 if(v==0) break;
05652
05653 last= v;
05654 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
05655 s->inter_matrix[j]= v;
05656 s->chroma_inter_matrix[j]= v;
05657 }
05658
05659
05660 for(; i<64; i++){
05661 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
05662 s->inter_matrix[j]= last;
05663 s->chroma_inter_matrix[j]= last;
05664 }
05665 }
05666
05667
05668 }
05669
05670 if(vo_ver_id != 1)
05671 s->quarter_sample= get_bits1(gb);
05672 else s->quarter_sample=0;
05673
05674 if(!get_bits1(gb)) av_log(s->avctx, AV_LOG_ERROR, "Complexity estimation not supported\n");
05675
05676 s->resync_marker= !get_bits1(gb);
05677
05678 s->data_partitioning= get_bits1(gb);
05679 if(s->data_partitioning){
05680 s->rvlc= get_bits1(gb);
05681 }
05682
05683 if(vo_ver_id != 1) {
05684 s->new_pred= get_bits1(gb);
05685 if(s->new_pred){
05686 av_log(s->avctx, AV_LOG_ERROR, "new pred not supported\n");
05687 skip_bits(gb, 2);
05688 skip_bits1(gb);
05689 }
05690 s->reduced_res_vop= get_bits1(gb);
05691 if(s->reduced_res_vop) av_log(s->avctx, AV_LOG_ERROR, "reduced resolution VOP not supported\n");
05692 }
05693 else{
05694 s->new_pred=0;
05695 s->reduced_res_vop= 0;
05696 }
05697
05698 s->scalability= get_bits1(gb);
05699
05700 if (s->scalability) {
05701 GetBitContext bak= *gb;
05702 int ref_layer_id;
05703 int ref_layer_sampling_dir;
05704 int h_sampling_factor_n;
05705 int h_sampling_factor_m;
05706 int v_sampling_factor_n;
05707 int v_sampling_factor_m;
05708
05709 s->hierachy_type= get_bits1(gb);
05710 ref_layer_id= get_bits(gb, 4);
05711 ref_layer_sampling_dir= get_bits1(gb);
05712 h_sampling_factor_n= get_bits(gb, 5);
05713 h_sampling_factor_m= get_bits(gb, 5);
05714 v_sampling_factor_n= get_bits(gb, 5);
05715 v_sampling_factor_m= get_bits(gb, 5);
05716 s->enhancement_type= get_bits1(gb);
05717
05718 if( h_sampling_factor_n==0 || h_sampling_factor_m==0
05719 || v_sampling_factor_n==0 || v_sampling_factor_m==0){
05720
05721
05722 s->scalability=0;
05723
05724 *gb= bak;
05725 }else
05726 av_log(s->avctx, AV_LOG_ERROR, "scalability not supported\n");
05727
05728
05729 }
05730 }
05731 return 0;
05732 }
05733
05738 static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
05739 char buf[256];
05740 int i;
05741 int e;
05742 int ver, build, ver2, ver3;
05743 char last;
05744
05745 for(i=0; i<255; i++){
05746 if(show_bits(gb, 23) == 0) break;
05747 buf[i]= get_bits(gb, 8);
05748 }
05749 buf[i]=0;
05750
05751
05752 e=sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last);
05753 if(e<2)
05754 e=sscanf(buf, "DivX%db%d%c", &ver, &build, &last);
05755 if(e>=2){
05756 s->divx_version= ver;
05757 s->divx_build= build;
05758 s->divx_packed= e==3 && last=='p';
05759 }
05760
05761
05762 e=sscanf(buf, "FFmpe%*[^b]b%d", &build)+3;
05763 if(e!=4)
05764 e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
05765 if(e!=4){
05766 if(strcmp(buf, "ffmpeg")==0){
05767 s->lavc_build= 4600;
05768 }
05769 }
05770 if(e==4){
05771 s->lavc_build= build;
05772 }
05773
05774
05775 e=sscanf(buf, "XviD%d", &build);
05776 if(e==1){
05777 s->xvid_build= build;
05778 }
05779
05780
05781 return 0;
05782 }
05783
05784 static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
05785 int time_incr, time_increment;
05786
05787 s->pict_type = get_bits(gb, 2) + I_TYPE;
05788 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0 && !(s->flags & CODEC_FLAG_LOW_DELAY)){
05789 av_log(s->avctx, AV_LOG_ERROR, "low_delay flag incorrectly, clearing it\n");
05790 s->low_delay=0;
05791 }
05792
05793 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
05794 if(s->partitioned_frame)
05795 s->decode_mb= mpeg4_decode_partitioned_mb;
05796 else
05797 s->decode_mb= ff_mpeg4_decode_mb;
05798
05799 if(s->avctx->time_base.den==0){
05800 s->avctx->time_base.den=1;
05801
05802 }
05803 time_incr=0;
05804 while (get_bits1(gb) != 0)
05805 time_incr++;
05806
05807 check_marker(gb, "before time_increment");
05808
05809 if(s->time_increment_bits==0 || !(show_bits(gb, s->time_increment_bits+1)&1)){
05810 av_log(s->avctx, AV_LOG_ERROR, "hmm, seems the headers are not complete, trying to guess time_increment_bits\n");
05811
05812 for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){
05813 if(show_bits(gb, s->time_increment_bits+1)&1) break;
05814 }
05815
05816 av_log(s->avctx, AV_LOG_ERROR, "my guess is %d bits ;)\n",s->time_increment_bits);
05817 }
05818
05819 if(IS_3IV1) time_increment= get_bits1(gb);
05820 else time_increment= get_bits(gb, s->time_increment_bits);
05821
05822
05823
05824 if(s->pict_type!=B_TYPE){
05825 s->last_time_base= s->time_base;
05826 s->time_base+= time_incr;
05827 s->time= s->time_base*s->avctx->time_base.den + time_increment;
05828 if(s->workaround_bugs&FF_BUG_UMP4){
05829 if(s->time < s->last_non_b_time){
05830
05831 s->time_base++;
05832 s->time+= s->avctx->time_base.den;
05833 }
05834 }
05835 s->pp_time= s->time - s->last_non_b_time;
05836 s->last_non_b_time= s->time;
05837 }else{
05838 s->time= (s->last_time_base + time_incr)*s->avctx->time_base.den + time_increment;
05839 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
05840 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
05841
05842 return FRAME_SKIPPED;
05843 }
05844
05845 if(s->t_frame==0) s->t_frame= s->pb_time;
05846 if(s->t_frame==0) s->t_frame=1;
05847 s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame)
05848 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
05849 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame)
05850 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
05851 }
05852
05853
05854 s->current_picture_ptr->pts= (s->time + s->avctx->time_base.num/2) / s->avctx->time_base.num;
05855 if(s->avctx->debug&FF_DEBUG_PTS)
05856 av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %Ld\n", s->current_picture_ptr->pts);
05857
05858 check_marker(gb, "before vop_coded");
05859
05860
05861 if (get_bits1(gb) != 1){
05862 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
05863 av_log(s->avctx, AV_LOG_ERROR, "vop not coded\n");
05864 return FRAME_SKIPPED;
05865 }
05866
05867
05868 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE
05869 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
05870
05871 s->no_rounding = get_bits1(gb);
05872 } else {
05873 s->no_rounding = 0;
05874 }
05875
05876
05877 if (s->shape != RECT_SHAPE) {
05878 if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) {
05879 int width, height, hor_spat_ref, ver_spat_ref;
05880
05881 width = get_bits(gb, 13);
05882 skip_bits1(gb);
05883 height = get_bits(gb, 13);
05884 skip_bits1(gb);
05885 hor_spat_ref = get_bits(gb, 13);
05886 skip_bits1(gb);
05887 ver_spat_ref = get_bits(gb, 13);
05888 }
05889 skip_bits1(gb);
05890
05891 if (get_bits1(gb) != 0) {
05892 skip_bits(gb, 8);
05893 }
05894 }
05895
05896
05897 if (s->shape != BIN_ONLY_SHAPE) {
05898 s->intra_dc_threshold= mpeg4_dc_threshold[ get_bits(gb, 3) ];
05899 if(!s->progressive_sequence){
05900 s->top_field_first= get_bits1(gb);
05901 s->alternate_scan= get_bits1(gb);
05902 }else
05903 s->alternate_scan= 0;
05904 }
05905
05906 if(s->alternate_scan){
05907 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
05908 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
05909 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
05910 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
05911 } else{
05912 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
05913 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
05914 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
05915 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
05916 }
05917
05918 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
05919 mpeg4_decode_sprite_trajectory(s, gb);
05920 if(s->sprite_brightness_change) av_log(s->avctx, AV_LOG_ERROR, "sprite_brightness_change not supported\n");
05921 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "static sprite not supported\n");
05922 }
05923
05924 if (s->shape != BIN_ONLY_SHAPE) {
05925 s->chroma_qscale= s->qscale = get_bits(gb, s->quant_precision);
05926 if(s->qscale==0){
05927 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (qscale=0)\n");
05928 return -1;
05929 }
05930
05931 if (s->pict_type != I_TYPE) {
05932 s->f_code = get_bits(gb, 3);
05933 if(s->f_code==0){
05934 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (f_code=0)\n");
05935 return -1;
05936 }
05937 }else
05938 s->f_code=1;
05939
05940 if (s->pict_type == B_TYPE) {
05941 s->b_code = get_bits(gb, 3);
05942 }else
05943 s->b_code=1;
05944
05945 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
05946 av_log(s->avctx, AV_LOG_DEBUG, "qp:%d fc:%d,%d %s size:%d pro:%d alt:%d top:%d %spel part:%d resync:%d w:%d a:%d rnd:%d vot:%d%s dc:%d\n",
05947 s->qscale, s->f_code, s->b_code,
05948 s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")),
05949 gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first,
05950 s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,
05951 s->sprite_warping_accuracy, 1-s->no_rounding, s->vo_type, s->vol_control_parameters ? " VOLC" : " ", s->intra_dc_threshold);
05952 }
05953
05954 if(!s->scalability){
05955 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {
05956 skip_bits1(gb);
05957 }
05958 }else{
05959 if(s->enhancement_type){
05960 int load_backward_shape= get_bits1(gb);
05961 if(load_backward_shape){
05962 av_log(s->avctx, AV_LOG_ERROR, "load backward shape isn't supported\n");
05963 }
05964 }
05965 skip_bits(gb, 2);
05966 }
05967 }
05968
05969
05970 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
05971 av_log(s->avctx, AV_LOG_ERROR, "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
05972 s->low_delay=1;
05973 }
05974
05975 s->picture_number++;
05976
05977 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
05978 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
05979
05980 if(s->workaround_bugs&FF_BUG_EDGE){
05981 s->h_edge_pos= s->width;
05982 s->v_edge_pos= s->height;
05983 }
05984 return 0;
05985 }
05986
05993 int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb)
05994 {
05995 int startcode, v;
05996
05997
05998 align_get_bits(gb);
05999
06000 if(s->avctx->codec_tag == ff_get_fourcc("WV1F") && show_bits(gb, 24) == 0x575630){
06001 skip_bits(gb, 24);
06002 if(get_bits(gb, 8) == 0xF0)
06003 return decode_vop_header(s, gb);
06004 }
06005
06006 startcode = 0xff;
06007 for(;;) {
06008 v = get_bits(gb, 8);
06009 startcode = ((startcode << 8) | v) & 0xffffffff;
06010
06011 if(get_bits_count(gb) >= gb->size_in_bits){
06012 if(gb->size_in_bits==8 && (s->divx_version || s->xvid_build)){
06013 av_log(s->avctx, AV_LOG_ERROR, "frame skip %d\n", gb->size_in_bits);
06014 return FRAME_SKIPPED;
06015 }else
06016 return -1;
06017 }
06018
06019 if((startcode&0xFFFFFF00) != 0x100)
06020 continue;
06021
06022 if(s->avctx->debug&FF_DEBUG_STARTCODE){
06023 av_log(s->avctx, AV_LOG_DEBUG, "startcode: %3X ", startcode);
06024 if (startcode<=0x11F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Start");
06025 else if(startcode<=0x12F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Layer Start");
06026 else if(startcode<=0x13F) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
06027 else if(startcode<=0x15F) av_log(s->avctx, AV_LOG_DEBUG, "FGS bp start");
06028 else if(startcode<=0x1AF) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
06029 else if(startcode==0x1B0) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq Start");
06030 else if(startcode==0x1B1) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq End");
06031 else if(startcode==0x1B2) av_log(s->avctx, AV_LOG_DEBUG, "User Data");
06032 else if(startcode==0x1B3) av_log(s->avctx, AV_LOG_DEBUG, "Group of VOP start");
06033 else if(startcode==0x1B4) av_log(s->avctx, AV_LOG_DEBUG, "Video Session Error");
06034 else if(startcode==0x1B5) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Start");
06035 else if(startcode==0x1B6) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Plane start");
06036 else if(startcode==0x1B7) av_log(s->avctx, AV_LOG_DEBUG, "slice start");
06037 else if(startcode==0x1B8) av_log(s->avctx, AV_LOG_DEBUG, "extension start");
06038 else if(startcode==0x1B9) av_log(s->avctx, AV_LOG_DEBUG, "fgs start");
06039 else if(startcode==0x1BA) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object start");
06040 else if(startcode==0x1BB) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object Plane start");
06041 else if(startcode==0x1BC) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object start");
06042 else if(startcode==0x1BD) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object Plane start");
06043 else if(startcode==0x1BE) av_log(s->avctx, AV_LOG_DEBUG, "Still Texture Object start");
06044 else if(startcode==0x1BF) av_log(s->avctx, AV_LOG_DEBUG, "Texture Spatial Layer start");
06045 else if(startcode==0x1C0) av_log(s->avctx, AV_LOG_DEBUG, "Texture SNR Layer start");
06046 else if(startcode==0x1C1) av_log(s->avctx, AV_LOG_DEBUG, "Texture Tile start");
06047 else if(startcode==0x1C2) av_log(s->avctx, AV_LOG_DEBUG, "Texture Shape Layer start");
06048 else if(startcode==0x1C3) av_log(s->avctx, AV_LOG_DEBUG, "stuffing start");
06049 else if(startcode<=0x1C5) av_log(s->avctx, AV_LOG_DEBUG, "reserved");
06050 else if(startcode<=0x1FF) av_log(s->avctx, AV_LOG_DEBUG, "System start");
06051 av_log(s->avctx, AV_LOG_DEBUG, " at %d\n", get_bits_count(gb));
06052 }
06053
06054 if(startcode >= 0x120 && startcode <= 0x12F){
06055 if(decode_vol_header(s, gb) < 0)
06056 return -1;
06057 }
06058 else if(startcode == USER_DATA_STARTCODE){
06059 decode_user_data(s, gb);
06060 }
06061 else if(startcode == GOP_STARTCODE){
06062 mpeg4_decode_gop_header(s, gb);
06063 }
06064 else if(startcode == VOP_STARTCODE){
06065 return decode_vop_header(s, gb);
06066 }
06067
06068 align_get_bits(gb);
06069 startcode = 0xff;
06070 }
06071 }
06072
06073
06074 int intel_h263_decode_picture_header(MpegEncContext *s)
06075 {
06076 int format;
06077
06078
06079 if (get_bits_long(&s->gb, 22) != 0x20) {
06080 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
06081 return -1;
06082 }
06083 s->picture_number = get_bits(&s->gb, 8);
06084
06085 if (get_bits1(&s->gb) != 1) {
06086 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
06087 return -1;
06088 }
06089 if (get_bits1(&s->gb) != 0) {
06090 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
06091 return -1;
06092 }
06093 skip_bits1(&s->gb);
06094 skip_bits1(&s->gb);
06095 skip_bits1(&s->gb);
06096
06097 format = get_bits(&s->gb, 3);
06098 if (format != 7) {
06099 av_log(s->avctx, AV_LOG_ERROR, "Intel H263 free format not supported\n");
06100 return -1;
06101 }
06102 s->h263_plus = 0;
06103
06104 s->pict_type = I_TYPE + get_bits1(&s->gb);
06105
06106 s->unrestricted_mv = get_bits1(&s->gb);
06107 s->h263_long_vectors = s->unrestricted_mv;
06108
06109 if (get_bits1(&s->gb) != 0) {
06110 av_log(s->avctx, AV_LOG_ERROR, "SAC not supported\n");
06111 return -1;
06112 }
06113 if (get_bits1(&s->gb) != 0) {
06114 s->obmc= 1;
06115 av_log(s->avctx, AV_LOG_ERROR, "Advanced Prediction Mode not supported\n");
06116
06117 }
06118 if (get_bits1(&s->gb) != 0) {
06119 av_log(s->avctx, AV_LOG_ERROR, "PB frame mode no supported\n");
06120 return -1;
06121 }
06122
06123
06124 skip_bits(&s->gb, 41);
06125
06126 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
06127 skip_bits1(&s->gb);
06128
06129
06130 while (get_bits1(&s->gb) != 0) {
06131 skip_bits(&s->gb, 8);
06132 }
06133 s->f_code = 1;
06134
06135 s->y_dc_scale_table=
06136 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
06137
06138 return 0;
06139 }
06140
06141 int flv_h263_decode_picture_header(MpegEncContext *s)
06142 {
06143 int format, width, height;
06144
06145
06146 if (get_bits_long(&s->gb, 17) != 1) {
06147 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
06148 return -1;
06149 }
06150 format = get_bits(&s->gb, 5);
06151 if (format != 0 && format != 1) {
06152 av_log(s->avctx, AV_LOG_ERROR, "Bad picture format\n");
06153 return -1;
06154 }
06155 s->h263_flv = format+1;
06156 s->picture_number = get_bits(&s->gb, 8);
06157 format = get_bits(&s->gb, 3);
06158 switch (format) {
06159 case 0:
06160 width = get_bits(&s->gb, 8);
06161 height = get_bits(&s->gb, 8);
06162 break;
06163 case 1:
06164 width = get_bits(&s->gb, 16);
06165 height = get_bits(&s->gb, 16);
06166 break;
06167 case 2:
06168 width = 352;
06169 height = 288;
06170 break;
06171 case 3:
06172 width = 176;
06173 height = 144;
06174 break;
06175 case 4:
06176 width = 128;
06177 height = 96;
06178 break;
06179 case 5:
06180 width = 320;
06181 height = 240;
06182 break;
06183 case 6:
06184 width = 160;
06185 height = 120;
06186 break;
06187 default:
06188 width = height = 0;
06189 break;
06190 }
06191 if(avcodec_check_dimensions(s->avctx, width, height))
06192 return -1;
06193 s->width = width;
06194 s->height = height;
06195
06196 s->pict_type = I_TYPE + get_bits(&s->gb, 2);
06197 s->dropable= s->pict_type > P_TYPE;
06198 if (s->dropable)
06199 s->pict_type = P_TYPE;
06200
06201 skip_bits1(&s->gb);
06202 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
06203
06204 s->h263_plus = 0;
06205
06206 s->unrestricted_mv = 1;
06207 s->h263_long_vectors = 0;
06208
06209
06210 while (get_bits1(&s->gb) != 0) {
06211 skip_bits(&s->gb, 8);
06212 }
06213 s->f_code = 1;
06214
06215 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
06216 av_log(s->avctx, AV_LOG_DEBUG, "%c esc_type:%d, qp:%d num:%d\n",
06217 s->dropable ? 'D' : av_get_pict_type_char(s->pict_type), s->h263_flv-1, s->qscale, s->picture_number);
06218 }
06219
06220 s->y_dc_scale_table=
06221 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
06222
06223 return 0;
06224 }