2 * H263/MPEG4 backend for ffmpeg encoder and decoder
3 * Copyright (c) 2000,2001 Fabrice Bellard
5 * Copyright (c) 2001 Juan J. Sierralta P
6 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
8 * ac prediction encoding, B-frame support, error resilience, optimizations,
9 * qpel decoding, gmc decoding, interlaced decoding
10 * by Michael Niedermayer <michaelni@gmx.at>
12 * This file is part of FFmpeg.
14 * FFmpeg is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU Lesser General Public
16 * License as published by the Free Software Foundation; either
17 * version 2.1 of the License, or (at your option) any later version.
19 * FFmpeg is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 * Lesser General Public License for more details.
24 * You should have received a copy of the GNU Lesser General Public
25 * License along with FFmpeg; if not, write to the Free Software
26 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30 * @file libavcodec/h263.c
39 #include "mpegvideo.h"
41 #include "mpeg4data.h"
48 #define INTRA_MCBPC_VLC_BITS 6
49 #define INTER_MCBPC_VLC_BITS 7
50 #define CBPY_VLC_BITS 6
53 #define SPRITE_TRAJ_VLC_BITS 6
54 #define MB_TYPE_B_VLC_BITS 4
55 #define TEX_VLC_BITS 9
56 #define H263_MBTYPE_B_VLC_BITS 6
57 #define CBPC_B_VLC_BITS 3
59 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode);
60 static int h263p_decode_umotion(MpegEncContext * s, int pred);
61 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
63 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
64 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
65 int n, int coded, int intra, int rvlc);
67 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb);
68 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding);
71 static void h263_encode_block(MpegEncContext *s, DCTELEM *block, int n);
72 static void h263p_encode_umotion(MpegEncContext *s, int val);
73 static int h263_pred_dc(MpegEncContext *s, int n, int16_t **dc_val_ptr);
75 static void mpeg4_encode_visual_object_header(MpegEncContext *s);
76 static void mpeg4_encode_vol_header(MpegEncContext *s, int vo_number,
78 static inline void mpeg4_encode_block(MpegEncContext *s, DCTELEM *block,
79 int n, int dc, uint8_t *scan_table,
81 PutBitContext *ac_pb);
82 static int mpeg4_get_block_length(MpegEncContext *s, DCTELEM *block, int n,
83 int intra_dc, uint8_t *scan_table);
85 static uint8_t uni_DCtab_lum_len[512];
86 static uint8_t uni_DCtab_chrom_len[512];
87 static uint16_t uni_DCtab_lum_bits[512];
88 static uint16_t uni_DCtab_chrom_bits[512];
90 static uint8_t mv_penalty[MAX_FCODE+1][MAX_MV*2+1];
91 static uint8_t fcode_tab[MAX_MV*2+1];
92 static uint8_t umv_fcode_tab[MAX_MV*2+1];
94 static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2];
95 static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2];
96 static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2];
97 static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2];
98 static uint8_t uni_h263_intra_aic_rl_len [64*64*2*2];
99 static uint8_t uni_h263_inter_rl_len [64*64*2*2];
100 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
101 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
102 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
115 static uint8_t static_rl_table_store[5][2][2*MAX_RUN + MAX_LEVEL + 3];
117 #if 0 //3IV1 is quite rare and it slows things down a tiny bit
118 #define IS_3IV1 s->codec_tag == AV_RL32("3IV1")
123 int h263_get_picture_format(int width, int height)
127 if (width == 128 && height == 96)
129 else if (width == 176 && height == 144)
131 else if (width == 352 && height == 288)
133 else if (width == 704 && height == 576)
135 else if (width == 1408 && height == 1152)
142 static void show_pict_info(MpegEncContext *s){
143 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",
144 s->qscale, av_get_pict_type_char(s->pict_type),
145 s->gb.size_in_bits, 1-s->no_rounding,
146 s->obmc ? " AP" : "",
147 s->umvplus ? " UMV" : "",
148 s->h263_long_vectors ? " LONG" : "",
149 s->h263_plus ? " +" : "",
150 s->h263_aic ? " AIC" : "",
151 s->alt_inter_vlc ? " AIV" : "",
152 s->modified_quant ? " MQ" : "",
153 s->loop_filter ? " LOOP" : "",
154 s->h263_slice_structured ? " SS" : "",
155 s->avctx->time_base.den, s->avctx->time_base.num
161 static void aspect_to_info(MpegEncContext * s, AVRational aspect){
164 if(aspect.num==0) aspect= (AVRational){1,1};
167 if(av_cmp_q(pixel_aspect[i], aspect) == 0){
168 s->aspect_ratio_info=i;
173 s->aspect_ratio_info= FF_ASPECT_EXTENDED;
176 void ff_flv_encode_picture_header(MpegEncContext * s, int picture_number)
180 align_put_bits(&s->pb);
182 put_bits(&s->pb, 17, 1);
183 put_bits(&s->pb, 5, (s->h263_flv-1)); /* 0: h263 escape codes 1: 11-bit escape codes */
184 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->time_base.num) / //FIXME use timestamp
185 s->avctx->time_base.den) & 0xff); /* TemporalReference */
186 if (s->width == 352 && s->height == 288)
188 else if (s->width == 176 && s->height == 144)
190 else if (s->width == 128 && s->height == 96)
192 else if (s->width == 320 && s->height == 240)
194 else if (s->width == 160 && s->height == 120)
196 else if (s->width <= 255 && s->height <= 255)
197 format = 0; /* use 1 byte width & height */
199 format = 1; /* use 2 bytes width & height */
200 put_bits(&s->pb, 3, format); /* PictureSize */
202 put_bits(&s->pb, 8, s->width);
203 put_bits(&s->pb, 8, s->height);
204 } else if (format == 1) {
205 put_bits(&s->pb, 16, s->width);
206 put_bits(&s->pb, 16, s->height);
208 put_bits(&s->pb, 2, s->pict_type == FF_P_TYPE); /* PictureType */
209 put_bits(&s->pb, 1, 1); /* DeblockingFlag: on */
210 put_bits(&s->pb, 5, s->qscale); /* Quantizer */
211 put_bits(&s->pb, 1, 0); /* ExtraInformation */
215 s->c_dc_scale_table= ff_aic_dc_scale_table;
218 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
222 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
224 int format, coded_frame_rate, coded_frame_rate_base, i, temp_ref;
225 int best_clock_code=1;
227 int best_error= INT_MAX;
232 div= (s->avctx->time_base.num*1800000LL + 500LL*s->avctx->time_base.den) / ((1000LL+i)*s->avctx->time_base.den);
233 div= av_clip(div, 1, 127);
234 error= FFABS(s->avctx->time_base.num*1800000LL - (1000LL+i)*s->avctx->time_base.den*div);
235 if(error < best_error){
242 s->custom_pcf= best_clock_code!=1 || best_divisor!=60;
243 coded_frame_rate= 1800000;
244 coded_frame_rate_base= (1000+best_clock_code)*best_divisor;
246 align_put_bits(&s->pb);
248 /* Update the pointer to last GOB */
249 s->ptr_lastgob = put_bits_ptr(&s->pb);
250 put_bits(&s->pb, 22, 0x20); /* PSC */
251 temp_ref= s->picture_number * (int64_t)coded_frame_rate * s->avctx->time_base.num / //FIXME use timestamp
252 (coded_frame_rate_base * (int64_t)s->avctx->time_base.den);
253 put_sbits(&s->pb, 8, temp_ref); /* TemporalReference */
255 put_bits(&s->pb, 1, 1); /* marker */
256 put_bits(&s->pb, 1, 0); /* h263 id */
257 put_bits(&s->pb, 1, 0); /* split screen off */
258 put_bits(&s->pb, 1, 0); /* camera off */
259 put_bits(&s->pb, 1, 0); /* freeze picture release off */
261 format = h263_get_picture_format(s->width, s->height);
264 put_bits(&s->pb, 3, format);
265 put_bits(&s->pb, 1, (s->pict_type == FF_P_TYPE));
266 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
267 of H.263v1 UMV implies to check the predicted MV after
268 calculation of the current MB to see if we're on the limits */
269 put_bits(&s->pb, 1, 0); /* Unrestricted Motion Vector: off */
270 put_bits(&s->pb, 1, 0); /* SAC: off */
271 put_bits(&s->pb, 1, s->obmc); /* Advanced Prediction */
272 put_bits(&s->pb, 1, 0); /* only I/P frames, no PB frame */
273 put_bits(&s->pb, 5, s->qscale);
274 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
278 /* H.263 Plus PTYPE */
280 put_bits(&s->pb, 3, 7);
281 put_bits(&s->pb,3,ufep); /* Update Full Extended PTYPE */
283 put_bits(&s->pb,3,6); /* Custom Source Format */
285 put_bits(&s->pb, 3, format);
287 put_bits(&s->pb,1, s->custom_pcf);
288 put_bits(&s->pb,1, s->umvplus); /* Unrestricted Motion Vector */
289 put_bits(&s->pb,1,0); /* SAC: off */
290 put_bits(&s->pb,1,s->obmc); /* Advanced Prediction Mode */
291 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
292 put_bits(&s->pb,1,s->loop_filter); /* Deblocking Filter */
293 put_bits(&s->pb,1,s->h263_slice_structured); /* Slice Structured */
294 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
295 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
296 put_bits(&s->pb,1,s->alt_inter_vlc); /* Alternative Inter VLC */
297 put_bits(&s->pb,1,s->modified_quant); /* Modified Quantization: */
298 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
299 put_bits(&s->pb,3,0); /* Reserved */
301 put_bits(&s->pb, 3, s->pict_type == FF_P_TYPE);
303 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
304 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
305 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
306 put_bits(&s->pb,2,0); /* Reserved */
307 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
309 /* This should be here if PLUSPTYPE */
310 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
313 /* Custom Picture Format (CPFMT) */
314 aspect_to_info(s, s->avctx->sample_aspect_ratio);
316 put_bits(&s->pb,4,s->aspect_ratio_info);
317 put_bits(&s->pb,9,(s->width >> 2) - 1);
318 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
319 put_bits(&s->pb,9,(s->height >> 2));
320 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
321 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
322 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
327 put_bits(&s->pb, 1, best_clock_code);
328 put_bits(&s->pb, 7, best_divisor);
330 put_sbits(&s->pb, 2, temp_ref>>8);
333 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
335 // put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
336 //FIXME check actual requested range
337 put_bits(&s->pb,2,1); /* unlimited */
338 if(s->h263_slice_structured)
339 put_bits(&s->pb,2,0); /* no weird submodes */
341 put_bits(&s->pb, 5, s->qscale);
344 put_bits(&s->pb, 1, 0); /* no PEI */
346 if(s->h263_slice_structured){
347 put_bits(&s->pb, 1, 1);
349 assert(s->mb_x == 0 && s->mb_y == 0);
350 ff_h263_encode_mba(s);
352 put_bits(&s->pb, 1, 1);
357 s->c_dc_scale_table= ff_aic_dc_scale_table;
360 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
365 * Encodes a group of blocks header.
367 void h263_encode_gob_header(MpegEncContext * s, int mb_line)
369 put_bits(&s->pb, 17, 1); /* GBSC */
371 if(s->h263_slice_structured){
372 put_bits(&s->pb, 1, 1);
374 ff_h263_encode_mba(s);
377 put_bits(&s->pb, 1, 1);
378 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
379 put_bits(&s->pb, 1, 1);
380 put_bits(&s->pb, 2, s->pict_type == FF_I_TYPE); /* GFID */
382 int gob_number= mb_line / s->gob_index;
384 put_bits(&s->pb, 5, gob_number); /* GN */
385 put_bits(&s->pb, 2, s->pict_type == FF_I_TYPE); /* GFID */
386 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
390 static inline int get_block_rate(MpegEncContext * s, DCTELEM block[64], int block_last_index, uint8_t scantable[64]){
395 for(j=1; j<=block_last_index; j++){
396 const int index= scantable[j];
397 int level= block[index];
400 if((level&(~127)) == 0){
401 if(j<block_last_index) rate+= s->intra_ac_vlc_length [UNI_AC_ENC_INDEX(j-last-1, level)];
402 else rate+= s->intra_ac_vlc_last_length[UNI_AC_ENC_INDEX(j-last-1, level)];
404 rate += s->ac_esc_length;
413 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
417 int8_t * const qscale_table= s->current_picture.qscale_table;
419 memcpy(zigzag_last_index, s->block_last_index, sizeof(int)*6);
422 int16_t *ac_val, *ac_val1;
424 score -= get_block_rate(s, block[n], s->block_last_index[n], s->intra_scantable.permutated);
426 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
429 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
431 ac_val-= s->block_wrap[n]*16;
432 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
435 const int level= block[n][s->dsp.idct_permutation[i ]];
436 block[n][s->dsp.idct_permutation[i ]] = level - ac_val[i+8];
437 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
441 /* different qscale, we must rescale */
443 const int level= block[n][s->dsp.idct_permutation[i ]];
444 block[n][s->dsp.idct_permutation[i ]] = level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
445 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
449 st[n]= s->intra_h_scantable.permutated;
451 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
452 /* left prediction */
454 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
457 const int level= block[n][s->dsp.idct_permutation[i<<3]];
458 block[n][s->dsp.idct_permutation[i<<3]]= level - ac_val[i];
460 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
463 /* different qscale, we must rescale */
465 const int level= block[n][s->dsp.idct_permutation[i<<3]];
466 block[n][s->dsp.idct_permutation[i<<3]]= level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
468 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
471 st[n]= s->intra_v_scantable.permutated;
474 for(i=63; i>0; i--) //FIXME optimize
475 if(block[n][ st[n][i] ]) break;
476 s->block_last_index[n]= i;
478 score += get_block_rate(s, block[n], s->block_last_index[n], st[n]);
484 static inline void restore_ac_coeffs(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
487 memcpy(s->block_last_index, zigzag_last_index, sizeof(int)*6);
490 int16_t *ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
492 st[n]= s->intra_scantable.permutated;
496 block[n][s->dsp.idct_permutation[i ]] = ac_val[i+8];
499 /* left prediction */
501 block[n][s->dsp.idct_permutation[i<<3]]= ac_val[i ];
508 * modify qscale so that encoding is acually possible in h263 (limit difference to -2..2)
510 void ff_clean_h263_qscales(MpegEncContext *s){
512 int8_t * const qscale_table= s->current_picture.qscale_table;
514 ff_init_qscale_tab(s);
516 for(i=1; i<s->mb_num; i++){
517 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i-1] ] >2)
518 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i-1] ]+2;
520 for(i=s->mb_num-2; i>=0; i--){
521 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i+1] ] >2)
522 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i+1] ]+2;
525 if(s->codec_id != CODEC_ID_H263P){
526 for(i=1; i<s->mb_num; i++){
527 int mb_xy= s->mb_index2xy[i];
529 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_INTER4V)){
530 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_INTER;
537 * modify mb_type & qscale so that encoding is acually possible in mpeg4
539 void ff_clean_mpeg4_qscales(MpegEncContext *s){
541 int8_t * const qscale_table= s->current_picture.qscale_table;
543 ff_clean_h263_qscales(s);
545 if(s->pict_type== FF_B_TYPE){
547 /* ok, come on, this isn't funny anymore, there's more code for handling this mpeg4 mess than for the actual adaptive quantization */
549 for(i=0; i<s->mb_num; i++){
550 int mb_xy= s->mb_index2xy[i];
551 odd += qscale_table[mb_xy]&1;
554 if(2*odd > s->mb_num) odd=1;
557 for(i=0; i<s->mb_num; i++){
558 int mb_xy= s->mb_index2xy[i];
559 if((qscale_table[mb_xy]&1) != odd)
560 qscale_table[mb_xy]++;
561 if(qscale_table[mb_xy] > 31)
562 qscale_table[mb_xy]= 31;
565 for(i=1; i<s->mb_num; i++){
566 int mb_xy= s->mb_index2xy[i];
567 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_DIRECT)){
568 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_BIDIR;
574 #endif //CONFIG_ENCODERS
576 #define tab_size ((signed)FF_ARRAY_ELEMS(s->direct_scale_mv[0]))
577 #define tab_bias (tab_size/2)
579 void ff_mpeg4_init_direct_mv(MpegEncContext *s){
581 for(i=0; i<tab_size; i++){
582 s->direct_scale_mv[0][i] = (i-tab_bias)*s->pb_time/s->pp_time;
583 s->direct_scale_mv[1][i] = (i-tab_bias)*(s->pb_time-s->pp_time)/s->pp_time;
587 static inline void ff_mpeg4_set_one_direct_mv(MpegEncContext *s, int mx, int my, int i){
588 int xy= s->block_index[i];
589 uint16_t time_pp= s->pp_time;
590 uint16_t time_pb= s->pb_time;
593 p_mx= s->next_picture.motion_val[0][xy][0];
594 if((unsigned)(p_mx + tab_bias) < tab_size){
595 s->mv[0][i][0] = s->direct_scale_mv[0][p_mx + tab_bias] + mx;
596 s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx
597 : s->direct_scale_mv[1][p_mx + tab_bias];
599 s->mv[0][i][0] = p_mx*time_pb/time_pp + mx;
600 s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx
601 : p_mx*(time_pb - time_pp)/time_pp;
603 p_my= s->next_picture.motion_val[0][xy][1];
604 if((unsigned)(p_my + tab_bias) < tab_size){
605 s->mv[0][i][1] = s->direct_scale_mv[0][p_my + tab_bias] + my;
606 s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my
607 : s->direct_scale_mv[1][p_my + tab_bias];
609 s->mv[0][i][1] = p_my*time_pb/time_pp + my;
610 s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my
611 : p_my*(time_pb - time_pp)/time_pp;
620 * @return the mb_type
622 int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){
623 const int mb_index= s->mb_x + s->mb_y*s->mb_stride;
624 const int colocated_mb_type= s->next_picture.mb_type[mb_index];
629 //FIXME avoid divides
630 // try special case with shifts for 1 and 3 B-frames?
632 if(IS_8X8(colocated_mb_type)){
633 s->mv_type = MV_TYPE_8X8;
635 ff_mpeg4_set_one_direct_mv(s, mx, my, i);
637 return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_L0L1;
638 } else if(IS_INTERLACED(colocated_mb_type)){
639 s->mv_type = MV_TYPE_FIELD;
641 int field_select= s->next_picture.ref_index[0][s->block_index[2*i]];
642 s->field_select[0][i]= field_select;
643 s->field_select[1][i]= i;
644 if(s->top_field_first){
645 time_pp= s->pp_field_time - field_select + i;
646 time_pb= s->pb_field_time - field_select + i;
648 time_pp= s->pp_field_time + field_select - i;
649 time_pb= s->pb_field_time + field_select - i;
651 s->mv[0][i][0] = s->p_field_mv_table[i][0][mb_index][0]*time_pb/time_pp + mx;
652 s->mv[0][i][1] = s->p_field_mv_table[i][0][mb_index][1]*time_pb/time_pp + my;
653 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->p_field_mv_table[i][0][mb_index][0]
654 : s->p_field_mv_table[i][0][mb_index][0]*(time_pb - time_pp)/time_pp;
655 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->p_field_mv_table[i][0][mb_index][1]
656 : s->p_field_mv_table[i][0][mb_index][1]*(time_pb - time_pp)/time_pp;
658 return MB_TYPE_DIRECT2 | MB_TYPE_16x8 | MB_TYPE_L0L1 | MB_TYPE_INTERLACED;
660 ff_mpeg4_set_one_direct_mv(s, mx, my, 0);
661 s->mv[0][1][0] = s->mv[0][2][0] = s->mv[0][3][0] = s->mv[0][0][0];
662 s->mv[0][1][1] = s->mv[0][2][1] = s->mv[0][3][1] = s->mv[0][0][1];
663 s->mv[1][1][0] = s->mv[1][2][0] = s->mv[1][3][0] = s->mv[1][0][0];
664 s->mv[1][1][1] = s->mv[1][2][1] = s->mv[1][3][1] = s->mv[1][0][1];
665 if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample)
666 s->mv_type= MV_TYPE_16X16;
668 s->mv_type= MV_TYPE_8X8;
669 return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_L0L1; //Note see prev line
673 void ff_h263_update_motion_val(MpegEncContext * s){
674 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
675 //FIXME a lot of that is only needed for !low_delay
676 const int wrap = s->b8_stride;
677 const int xy = s->block_index[0];
679 s->current_picture.mbskip_table[mb_xy]= s->mb_skipped;
681 if(s->mv_type != MV_TYPE_8X8){
682 int motion_x, motion_y;
686 } else if (s->mv_type == MV_TYPE_16X16) {
687 motion_x = s->mv[0][0][0];
688 motion_y = s->mv[0][0][1];
689 } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {
691 motion_x = s->mv[0][0][0] + s->mv[0][1][0];
692 motion_y = s->mv[0][0][1] + s->mv[0][1][1];
693 motion_x = (motion_x>>1) | (motion_x&1);
695 s->p_field_mv_table[i][0][mb_xy][0]= s->mv[0][i][0];
696 s->p_field_mv_table[i][0][mb_xy][1]= s->mv[0][i][1];
698 s->current_picture.ref_index[0][xy ]=
699 s->current_picture.ref_index[0][xy + 1]= s->field_select[0][0];
700 s->current_picture.ref_index[0][xy + wrap ]=
701 s->current_picture.ref_index[0][xy + wrap + 1]= s->field_select[0][1];
704 /* no update if 8X8 because it has been done during parsing */
705 s->current_picture.motion_val[0][xy][0] = motion_x;
706 s->current_picture.motion_val[0][xy][1] = motion_y;
707 s->current_picture.motion_val[0][xy + 1][0] = motion_x;
708 s->current_picture.motion_val[0][xy + 1][1] = motion_y;
709 s->current_picture.motion_val[0][xy + wrap][0] = motion_x;
710 s->current_picture.motion_val[0][xy + wrap][1] = motion_y;
711 s->current_picture.motion_val[0][xy + 1 + wrap][0] = motion_x;
712 s->current_picture.motion_val[0][xy + 1 + wrap][1] = motion_y;
715 if(s->encoding){ //FIXME encoding MUST be cleaned up
716 if (s->mv_type == MV_TYPE_8X8)
717 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_8x8;
719 s->current_picture.mb_type[mb_xy]= MB_TYPE_INTRA;
721 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_16x16;
727 static inline int h263_get_motion_length(MpegEncContext * s, int val, int f_code){
728 int l, bit_size, code;
733 bit_size = f_code - 1;
734 /* modulo encoding */
735 l= INT_BIT - 6 - bit_size;
738 code = (val >> bit_size) + 1;
740 return mvtab[code][1] + 1 + bit_size;
744 static inline void ff_h263_encode_motion_vector(MpegEncContext * s, int x, int y, int f_code){
745 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
746 skip_put_bits(&s->pb,
747 h263_get_motion_length(s, x, f_code)
748 +h263_get_motion_length(s, y, f_code));
750 ff_h263_encode_motion(s, x, f_code);
751 ff_h263_encode_motion(s, y, f_code);
755 static inline int get_p_cbp(MpegEncContext * s,
756 DCTELEM block[6][64],
757 int motion_x, int motion_y){
760 if(s->flags & CODEC_FLAG_CBP_RD){
761 int best_cbpy_score= INT_MAX;
762 int best_cbpc_score= INT_MAX;
763 int cbpc = (-1), cbpy= (-1);
764 const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0);
765 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
768 int score= inter_MCBPC_bits[i + offset] * lambda;
769 if(i&1) score += s->coded_score[5];
770 if(i&2) score += s->coded_score[4];
772 if(score < best_cbpc_score){
773 best_cbpc_score= score;
779 int score= cbpy_tab[i ^ 0xF][1] * lambda;
780 if(i&1) score += s->coded_score[3];
781 if(i&2) score += s->coded_score[2];
782 if(i&4) score += s->coded_score[1];
783 if(i&8) score += s->coded_score[0];
785 if(score < best_cbpy_score){
786 best_cbpy_score= score;
791 if ((motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16){
792 if(best_cbpy_score + best_cbpc_score + 2*lambda >= 0)
796 for (i = 0; i < 6; i++) {
797 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
798 s->block_last_index[i]= -1;
799 s->dsp.clear_block(s->block[i]);
804 for (i = 0; i < 6; i++) {
805 if (s->block_last_index[i] >= 0)
812 static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64],
813 int motion_x, int motion_y, int mb_type){
816 if(s->flags & CODEC_FLAG_CBP_RD){
818 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
821 if(s->coded_score[i] < 0){
822 score += s->coded_score[i];
829 if ((motion_x | motion_y | s->dquant | mb_type) == 0){
830 zero_score-= 4; //2*MV + mb_type + cbp bit
834 if(zero_score <= score){
839 for (i = 0; i < 6; i++) {
840 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
841 s->block_last_index[i]= -1;
842 s->dsp.clear_block(s->block[i]);
846 for (i = 0; i < 6; i++) {
847 if (s->block_last_index[i] >= 0)
854 static inline void mpeg4_encode_blocks(MpegEncContext * s, DCTELEM block[6][64], int intra_dc[6],
855 uint8_t **scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb){
859 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
860 for (i = 0; i < 6; i++) {
861 skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, intra_dc[i], scan_table[i]));
864 /* encode each block */
865 for (i = 0; i < 6; i++) {
866 mpeg4_encode_block(s, block[i], i, intra_dc[i], scan_table[i], dc_pb, ac_pb);
870 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
871 for (i = 0; i < 6; i++) {
872 skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, 0, s->intra_scantable.permutated));
875 /* encode each block */
876 for (i = 0; i < 6; i++) {
877 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, dc_pb, ac_pb);
883 static const int dquant_code[5]= {1,0,9,2,3};
885 void mpeg4_encode_mb(MpegEncContext * s,
886 DCTELEM block[6][64],
887 int motion_x, int motion_y)
889 int cbpc, cbpy, pred_x, pred_y;
890 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
891 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=FF_B_TYPE ? &s->tex_pb : &s->pb;
892 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=FF_I_TYPE ? &s->pb2 : &s->pb;
893 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
895 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
899 if(s->pict_type==FF_B_TYPE){
900 static const int mb_type_table[8]= {-1, 3, 2, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
901 int mb_type= mb_type_table[s->mv_dir];
908 s->last_mv[i][1][1]= 0;
912 assert(s->dquant>=-2 && s->dquant<=2);
913 assert((s->dquant&1)==0);
916 /* nothing to do if this MB was skipped in the next P Frame */
917 if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){ //FIXME avoid DCT & ...
923 s->mv_dir= MV_DIR_FORWARD; //doesn't matter
924 s->qscale -= s->dquant;
930 cbp= get_b_cbp(s, block, motion_x, motion_y, mb_type);
932 if ((cbp | motion_x | motion_y | mb_type) ==0) {
933 /* direct MB with MV={0,0} */
934 assert(s->dquant==0);
936 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
938 if(interleaved_stats){
946 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
947 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
948 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we don't need it :)
949 if(cbp) put_bits(&s->pb, 6, cbp);
953 put_bits(&s->pb, 2, (s->dquant>>2)+3);
955 put_bits(&s->pb, 1, 0);
957 s->qscale -= s->dquant;
959 if(!s->progressive_sequence){
961 put_bits(&s->pb, 1, s->interlaced_dct);
962 if(mb_type) // not direct mode
963 put_bits(&s->pb, 1, s->mv_type == MV_TYPE_FIELD);
966 if(interleaved_stats){
967 s->misc_bits+= get_bits_diff(s);
971 assert(s->mv_dir & MV_DIRECT);
972 ff_h263_encode_motion_vector(s, motion_x, motion_y, 1);
976 assert(mb_type > 0 && mb_type < 4);
977 if(s->mv_type != MV_TYPE_FIELD){
978 if(s->mv_dir & MV_DIR_FORWARD){
979 ff_h263_encode_motion_vector(s, s->mv[0][0][0] - s->last_mv[0][0][0],
980 s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
981 s->last_mv[0][0][0]= s->last_mv[0][1][0]= s->mv[0][0][0];
982 s->last_mv[0][0][1]= s->last_mv[0][1][1]= s->mv[0][0][1];
985 if(s->mv_dir & MV_DIR_BACKWARD){
986 ff_h263_encode_motion_vector(s, s->mv[1][0][0] - s->last_mv[1][0][0],
987 s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
988 s->last_mv[1][0][0]= s->last_mv[1][1][0]= s->mv[1][0][0];
989 s->last_mv[1][0][1]= s->last_mv[1][1][1]= s->mv[1][0][1];
993 if(s->mv_dir & MV_DIR_FORWARD){
994 put_bits(&s->pb, 1, s->field_select[0][0]);
995 put_bits(&s->pb, 1, s->field_select[0][1]);
997 if(s->mv_dir & MV_DIR_BACKWARD){
998 put_bits(&s->pb, 1, s->field_select[1][0]);
999 put_bits(&s->pb, 1, s->field_select[1][1]);
1001 if(s->mv_dir & MV_DIR_FORWARD){
1003 ff_h263_encode_motion_vector(s, s->mv[0][i][0] - s->last_mv[0][i][0] ,
1004 s->mv[0][i][1] - s->last_mv[0][i][1]/2, s->f_code);
1005 s->last_mv[0][i][0]= s->mv[0][i][0];
1006 s->last_mv[0][i][1]= s->mv[0][i][1]*2;
1010 if(s->mv_dir & MV_DIR_BACKWARD){
1012 ff_h263_encode_motion_vector(s, s->mv[1][i][0] - s->last_mv[1][i][0] ,
1013 s->mv[1][i][1] - s->last_mv[1][i][1]/2, s->b_code);
1014 s->last_mv[1][i][0]= s->mv[1][i][0];
1015 s->last_mv[1][i][1]= s->mv[1][i][1]*2;
1022 if(interleaved_stats){
1023 s->mv_bits+= get_bits_diff(s);
1026 mpeg4_encode_blocks(s, block, NULL, NULL, NULL, &s->pb);
1028 if(interleaved_stats){
1029 s->p_tex_bits+= get_bits_diff(s);
1032 }else{ /* s->pict_type==FF_B_TYPE */
1033 cbp= get_p_cbp(s, block, motion_x, motion_y);
1035 if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
1036 /* check if the B frames can skip it too, as we must skip it if we skip here
1037 why didn't they just compress the skip-mb bits instead of reusing them ?! */
1038 if(s->max_b_frames>0){
1045 if(x+16 > s->width) x= s->width-16;
1046 if(y+16 > s->height) y= s->height-16;
1048 offset= x + y*s->linesize;
1049 p_pic= s->new_picture.data[0] + offset;
1052 for(i=0; i<s->max_b_frames; i++){
1055 Picture *pic= s->reordered_input_picture[i+1];
1057 if(pic==NULL || pic->pict_type!=FF_B_TYPE) break;
1059 b_pic= pic->data[0] + offset;
1060 if(pic->type != FF_BUFFER_TYPE_SHARED)
1061 b_pic+= INPLACE_OFFSET;
1062 diff= s->dsp.sad[0](NULL, p_pic, b_pic, s->linesize, 16);
1063 if(diff>s->qscale*70){ //FIXME check that 70 is optimal
1071 if(s->mb_skipped==1){
1072 /* skip macroblock */
1073 put_bits(&s->pb, 1, 1);
1075 if(interleaved_stats){
1085 put_bits(&s->pb, 1, 0); /* mb coded */
1089 if(s->mv_type==MV_TYPE_16X16){
1090 if(s->dquant) cbpc+= 8;
1092 inter_MCBPC_bits[cbpc],
1093 inter_MCBPC_code[cbpc]);
1095 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1097 put_bits(pb2, 2, dquant_code[s->dquant+2]);
1099 if(!s->progressive_sequence){
1101 put_bits(pb2, 1, s->interlaced_dct);
1102 put_bits(pb2, 1, 0);
1105 if(interleaved_stats){
1106 s->misc_bits+= get_bits_diff(s);
1109 /* motion vectors: 16x16 mode */
1110 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1112 ff_h263_encode_motion_vector(s, motion_x - pred_x,
1113 motion_y - pred_y, s->f_code);
1114 }else if(s->mv_type==MV_TYPE_FIELD){
1115 if(s->dquant) cbpc+= 8;
1117 inter_MCBPC_bits[cbpc],
1118 inter_MCBPC_code[cbpc]);
1120 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1122 put_bits(pb2, 2, dquant_code[s->dquant+2]);
1124 assert(!s->progressive_sequence);
1126 put_bits(pb2, 1, s->interlaced_dct);
1127 put_bits(pb2, 1, 1);
1129 if(interleaved_stats){
1130 s->misc_bits+= get_bits_diff(s);
1133 /* motion vectors: 16x8 interlaced mode */
1134 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1137 put_bits(&s->pb, 1, s->field_select[0][0]);
1138 put_bits(&s->pb, 1, s->field_select[0][1]);
1140 ff_h263_encode_motion_vector(s, s->mv[0][0][0] - pred_x,
1141 s->mv[0][0][1] - pred_y, s->f_code);
1142 ff_h263_encode_motion_vector(s, s->mv[0][1][0] - pred_x,
1143 s->mv[0][1][1] - pred_y, s->f_code);
1145 assert(s->mv_type==MV_TYPE_8X8);
1147 inter_MCBPC_bits[cbpc+16],
1148 inter_MCBPC_code[cbpc+16]);
1149 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1151 if(!s->progressive_sequence){
1153 put_bits(pb2, 1, s->interlaced_dct);
1156 if(interleaved_stats){
1157 s->misc_bits+= get_bits_diff(s);
1161 /* motion vectors: 8x8 mode*/
1162 h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1164 ff_h263_encode_motion_vector(s, s->current_picture.motion_val[0][ s->block_index[i] ][0] - pred_x,
1165 s->current_picture.motion_val[0][ s->block_index[i] ][1] - pred_y, s->f_code);
1169 if(interleaved_stats){
1170 s->mv_bits+= get_bits_diff(s);
1173 mpeg4_encode_blocks(s, block, NULL, NULL, NULL, tex_pb);
1175 if(interleaved_stats){
1176 s->p_tex_bits+= get_bits_diff(s);
1182 int dc_diff[6]; //dc values with the dc prediction subtracted
1183 int dir[6]; //prediction direction
1184 int zigzag_last_index[6];
1185 uint8_t *scan_table[6];
1189 dc_diff[i]= ff_mpeg4_pred_dc(s, i, block[i][0], &dir[i], 1);
1192 if(s->flags & CODEC_FLAG_AC_PRED){
1193 s->ac_pred= decide_ac_pred(s, block, dir, scan_table, zigzag_last_index);
1195 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1198 scan_table[i]= s->intra_scantable.permutated;
1203 for (i = 0; i < 6; i++) {
1204 if (s->block_last_index[i] >= 1)
1205 cbp |= 1 << (5 - i);
1209 if (s->pict_type == FF_I_TYPE) {
1210 if(s->dquant) cbpc+=4;
1212 intra_MCBPC_bits[cbpc],
1213 intra_MCBPC_code[cbpc]);
1215 if(s->dquant) cbpc+=8;
1216 put_bits(&s->pb, 1, 0); /* mb coded */
1218 inter_MCBPC_bits[cbpc + 4],
1219 inter_MCBPC_code[cbpc + 4]);
1221 put_bits(pb2, 1, s->ac_pred);
1223 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1225 put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
1227 if(!s->progressive_sequence){
1228 put_bits(dc_pb, 1, s->interlaced_dct);
1231 if(interleaved_stats){
1232 s->misc_bits+= get_bits_diff(s);
1235 mpeg4_encode_blocks(s, block, dc_diff, scan_table, dc_pb, tex_pb);
1237 if(interleaved_stats){
1238 s->i_tex_bits+= get_bits_diff(s);
1242 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
1244 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1248 void h263_encode_mb(MpegEncContext * s,
1249 DCTELEM block[6][64],
1250 int motion_x, int motion_y)
1252 int cbpc, cbpy, i, cbp, pred_x, pred_y;
1254 int16_t rec_intradc[6];
1256 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1);
1258 //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
1261 cbp= get_p_cbp(s, block, motion_x, motion_y);
1263 if ((cbp | motion_x | motion_y | s->dquant | (s->mv_type - MV_TYPE_16X16)) == 0) {
1264 /* skip macroblock */
1265 put_bits(&s->pb, 1, 1);
1266 if(interleaved_stats){
1274 put_bits(&s->pb, 1, 0); /* mb coded */
1278 if(s->alt_inter_vlc==0 || cbpc!=3)
1280 if(s->dquant) cbpc+= 8;
1281 if(s->mv_type==MV_TYPE_16X16){
1283 inter_MCBPC_bits[cbpc],
1284 inter_MCBPC_code[cbpc]);
1286 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1288 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1290 if(interleaved_stats){
1291 s->misc_bits+= get_bits_diff(s);
1294 /* motion vectors: 16x16 mode */
1295 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1298 ff_h263_encode_motion_vector(s, motion_x - pred_x,
1299 motion_y - pred_y, 1);
1302 h263p_encode_umotion(s, motion_x - pred_x);
1303 h263p_encode_umotion(s, motion_y - pred_y);
1304 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
1305 /* To prevent Start Code emulation */
1306 put_bits(&s->pb,1,1);
1310 inter_MCBPC_bits[cbpc+16],
1311 inter_MCBPC_code[cbpc+16]);
1312 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1314 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1316 if(interleaved_stats){
1317 s->misc_bits+= get_bits_diff(s);
1321 /* motion vectors: 8x8 mode*/
1322 h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1324 motion_x= s->current_picture.motion_val[0][ s->block_index[i] ][0];
1325 motion_y= s->current_picture.motion_val[0][ s->block_index[i] ][1];
1327 ff_h263_encode_motion_vector(s, motion_x - pred_x,
1328 motion_y - pred_y, 1);
1331 h263p_encode_umotion(s, motion_x - pred_x);
1332 h263p_encode_umotion(s, motion_y - pred_y);
1333 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
1334 /* To prevent Start Code emulation */
1335 put_bits(&s->pb,1,1);
1340 if(interleaved_stats){
1341 s->mv_bits+= get_bits_diff(s);
1344 assert(s->mb_intra);
1349 for(i=0; i<6; i++) {
1350 int16_t level = block[i][0];
1353 if(i<4) scale= s->y_dc_scale;
1354 else scale= s->c_dc_scale;
1356 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
1360 level = (level + (scale>>1))/scale;
1362 level = (level - (scale>>1))/scale;
1364 /* AIC can change CBP */
1365 if (level == 0 && s->block_last_index[i] == 0)
1366 s->block_last_index[i] = -1;
1368 if(!s->modified_quant){
1371 else if (level > 127)
1375 block[i][0] = level;
1376 /* Reconstruction */
1377 rec_intradc[i] = scale*level + pred_dc;
1379 rec_intradc[i] |= 1;
1380 //if ((rec_intradc[i] % 2) == 0)
1381 // rec_intradc[i]++;
1383 if (rec_intradc[i] < 0)
1385 else if (rec_intradc[i] > 2047)
1386 rec_intradc[i] = 2047;
1388 /* Update AC/DC tables */
1389 *dc_ptr[i] = rec_intradc[i];
1390 if (s->block_last_index[i] >= 0)
1391 cbp |= 1 << (5 - i);
1394 for(i=0; i<6; i++) {
1396 if (s->block_last_index[i] >= 1)
1397 cbp |= 1 << (5 - i);
1402 if (s->pict_type == FF_I_TYPE) {
1403 if(s->dquant) cbpc+=4;
1405 intra_MCBPC_bits[cbpc],
1406 intra_MCBPC_code[cbpc]);
1408 if(s->dquant) cbpc+=8;
1409 put_bits(&s->pb, 1, 0); /* mb coded */
1411 inter_MCBPC_bits[cbpc + 4],
1412 inter_MCBPC_code[cbpc + 4]);
1415 /* XXX: currently, we do not try to use ac prediction */
1416 put_bits(&s->pb, 1, 0); /* no AC prediction */
1419 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1421 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1423 if(interleaved_stats){
1424 s->misc_bits+= get_bits_diff(s);
1428 for(i=0; i<6; i++) {
1429 /* encode each block */
1430 h263_encode_block(s, block[i], i);
1432 /* Update INTRADC for decoding */
1433 if (s->h263_aic && s->mb_intra) {
1434 block[i][0] = rec_intradc[i];
1439 if(interleaved_stats){
1441 s->p_tex_bits+= get_bits_diff(s);
1444 s->i_tex_bits+= get_bits_diff(s);
1451 void ff_h263_loop_filter(MpegEncContext * s){
1453 const int linesize = s->linesize;
1454 const int uvlinesize= s->uvlinesize;
1455 const int xy = s->mb_y * s->mb_stride + s->mb_x;
1456 uint8_t *dest_y = s->dest[0];
1457 uint8_t *dest_cb= s->dest[1];
1458 uint8_t *dest_cr= s->dest[2];
1460 // if(s->pict_type==FF_B_TYPE && !s->readable) return;
1466 if(!IS_SKIP(s->current_picture.mb_type[xy])){
1468 s->dsp.h263_v_loop_filter(dest_y+8*linesize , linesize, qp_c);
1469 s->dsp.h263_v_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
1474 int qp_dt, qp_tt, qp_tc;
1476 if(IS_SKIP(s->current_picture.mb_type[xy-s->mb_stride]))
1479 qp_tt= s->current_picture.qscale_table[xy-s->mb_stride];
1487 const int chroma_qp= s->chroma_qscale_table[qp_tc];
1488 s->dsp.h263_v_loop_filter(dest_y , linesize, qp_tc);
1489 s->dsp.h263_v_loop_filter(dest_y+8, linesize, qp_tc);
1491 s->dsp.h263_v_loop_filter(dest_cb , uvlinesize, chroma_qp);
1492 s->dsp.h263_v_loop_filter(dest_cr , uvlinesize, chroma_qp);
1496 s->dsp.h263_h_loop_filter(dest_y-8*linesize+8 , linesize, qp_tt);
1499 if(qp_tt || IS_SKIP(s->current_picture.mb_type[xy-1-s->mb_stride]))
1502 qp_dt= s->current_picture.qscale_table[xy-1-s->mb_stride];
1505 const int chroma_qp= s->chroma_qscale_table[qp_dt];
1506 s->dsp.h263_h_loop_filter(dest_y -8*linesize , linesize, qp_dt);
1507 s->dsp.h263_h_loop_filter(dest_cb-8*uvlinesize, uvlinesize, chroma_qp);
1508 s->dsp.h263_h_loop_filter(dest_cr-8*uvlinesize, uvlinesize, chroma_qp);
1514 s->dsp.h263_h_loop_filter(dest_y +8, linesize, qp_c);
1515 if(s->mb_y + 1 == s->mb_height)
1516 s->dsp.h263_h_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
1521 if(qp_c || IS_SKIP(s->current_picture.mb_type[xy-1]))
1524 qp_lc= s->current_picture.qscale_table[xy-1];
1527 s->dsp.h263_h_loop_filter(dest_y, linesize, qp_lc);
1528 if(s->mb_y + 1 == s->mb_height){
1529 const int chroma_qp= s->chroma_qscale_table[qp_lc];
1530 s->dsp.h263_h_loop_filter(dest_y +8* linesize, linesize, qp_lc);
1531 s->dsp.h263_h_loop_filter(dest_cb , uvlinesize, chroma_qp);
1532 s->dsp.h263_h_loop_filter(dest_cr , uvlinesize, chroma_qp);
1539 static int h263_pred_dc(MpegEncContext * s, int n, int16_t **dc_val_ptr)
1541 int x, y, wrap, a, c, pred_dc;
1544 /* find prediction */
1546 x = 2 * s->mb_x + (n & 1);
1547 y = 2 * s->mb_y + ((n & 2) >> 1);
1548 wrap = s->b8_stride;
1549 dc_val = s->dc_val[0];
1553 wrap = s->mb_stride;
1554 dc_val = s->dc_val[n - 4 + 1];
1559 a = dc_val[(x - 1) + (y) * wrap];
1560 c = dc_val[(x) + (y - 1) * wrap];
1562 /* No prediction outside GOB boundary */
1563 if(s->first_slice_line && n!=3){
1565 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
1567 /* just DC prediction */
1568 if (a != 1024 && c != 1024)
1569 pred_dc = (a + c) >> 1;
1575 /* we assume pred is positive */
1576 *dc_val_ptr = &dc_val[x + y * wrap];
1579 #endif /* CONFIG_ENCODERS */
1581 static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n)
1583 int x, y, wrap, a, c, pred_dc, scale, i;
1584 int16_t *dc_val, *ac_val, *ac_val1;
1586 /* find prediction */
1588 x = 2 * s->mb_x + (n & 1);
1589 y = 2 * s->mb_y + (n>> 1);
1590 wrap = s->b8_stride;
1591 dc_val = s->dc_val[0];
1592 ac_val = s->ac_val[0][0];
1593 scale = s->y_dc_scale;
1597 wrap = s->mb_stride;
1598 dc_val = s->dc_val[n - 4 + 1];
1599 ac_val = s->ac_val[n - 4 + 1][0];
1600 scale = s->c_dc_scale;
1603 ac_val += ((y) * wrap + (x)) * 16;
1609 a = dc_val[(x - 1) + (y) * wrap];
1610 c = dc_val[(x) + (y - 1) * wrap];
1612 /* No prediction outside GOB boundary */
1613 if(s->first_slice_line && n!=3){
1615 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
1620 if (s->h263_aic_dir) {
1621 /* left prediction */
1625 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
1630 /* top prediction */
1632 ac_val -= 16 * wrap;
1634 block[s->dsp.idct_permutation[i ]] += ac_val[i + 8];
1640 /* just DC prediction */
1641 if (a != 1024 && c != 1024)
1642 pred_dc = (a + c) >> 1;
1649 /* we assume pred is positive */
1650 block[0]=block[0]*scale + pred_dc;
1657 /* Update AC/DC tables */
1658 dc_val[(x) + (y) * wrap] = block[0];
1662 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
1665 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
1668 int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir,
1672 int16_t *A, *B, *C, (*mot_val)[2];
1673 static const int off[4]= {2, 1, 1, -1};
1675 wrap = s->b8_stride;
1676 mot_val = s->current_picture.motion_val[dir] + s->block_index[block];
1679 /* special case for first (slice) line */
1680 if (s->first_slice_line && block<3) {
1681 // we can't just change some MVs to simulate that as we need them for the B frames (and ME)
1682 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
1683 if(block==0){ //most common case
1684 if(s->mb_x == s->resync_mb_x){ //rare
1686 }else if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
1687 C = mot_val[off[block] - wrap];
1692 *px = mid_pred(A[0], 0, C[0]);
1693 *py = mid_pred(A[1], 0, C[1]);
1700 if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
1701 C = mot_val[off[block] - wrap];
1702 *px = mid_pred(A[0], 0, C[0]);
1703 *py = mid_pred(A[1], 0, C[1]);
1708 }else{ /* block==2*/
1709 B = mot_val[ - wrap];
1710 C = mot_val[off[block] - wrap];
1711 if(s->mb_x == s->resync_mb_x) //rare
1714 *px = mid_pred(A[0], B[0], C[0]);
1715 *py = mid_pred(A[1], B[1], C[1]);
1718 B = mot_val[ - wrap];
1719 C = mot_val[off[block] - wrap];
1720 *px = mid_pred(A[0], B[0], C[0]);
1721 *py = mid_pred(A[1], B[1], C[1]);
1727 void ff_h263_encode_motion(MpegEncContext * s, int val, int f_code)
1729 int range, l, bit_size, sign, code, bits;
1734 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1736 bit_size = f_code - 1;
1737 range = 1 << bit_size;
1738 /* modulo encoding */
1739 l= INT_BIT - 6 - bit_size;
1742 val= (val^sign)-sign;
1746 code = (val >> bit_size) + 1;
1747 bits = val & (range - 1);
1749 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1751 put_bits(&s->pb, bit_size, bits);
1756 /* Encode MV differences on H.263+ with Unrestricted MV mode */
1757 static void h263p_encode_umotion(MpegEncContext * s, int val)
1767 put_bits(&s->pb, 1, 1);
1769 put_bits(&s->pb, 3, 0);
1771 put_bits(&s->pb, 3, 2);
1774 sval = ((val < 0) ? (short)(-val):(short)val);
1777 while (temp_val != 0) {
1778 temp_val = temp_val >> 1;
1784 tcode = (sval & (1 << (i-1))) >> (i-1);
1785 tcode = (tcode << 1) | 1;
1786 code = (code << 2) | tcode;
1789 code = ((code << 1) | (val < 0)) << 1;
1790 put_bits(&s->pb, (2*n_bits)+1, code);
1791 //printf("\nVal = %d\tCode = %d", sval, code);
1795 static void init_mv_penalty_and_fcode(MpegEncContext *s)
1800 for(f_code=1; f_code<=MAX_FCODE; f_code++){
1801 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
1804 if(mv==0) len= mvtab[0][1];
1806 int val, bit_size, code;
1808 bit_size = f_code - 1;
1814 code = (val >> bit_size) + 1;
1816 len= mvtab[code][1] + 1 + bit_size;
1818 len= mvtab[32][1] + av_log2(code>>5) + 2 + bit_size;
1822 mv_penalty[f_code][mv+MAX_MV]= len;
1826 for(f_code=MAX_FCODE; f_code>0; f_code--){
1827 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
1828 fcode_tab[mv+MAX_MV]= f_code;
1832 for(mv=0; mv<MAX_MV*2+1; mv++){
1833 umv_fcode_tab[mv]= 1;
1837 static void init_uni_dc_tab(void)
1839 int level, uni_code, uni_len;
1841 for(level=-256; level<256; level++){
1843 /* find number of bits */
1852 l= (-level) ^ ((1 << size) - 1);
1857 uni_code= DCtab_lum[size][0];
1858 uni_len = DCtab_lum[size][1];
1861 uni_code<<=size; uni_code|=l;
1864 uni_code<<=1; uni_code|=1;
1868 uni_DCtab_lum_bits[level+256]= uni_code;
1869 uni_DCtab_lum_len [level+256]= uni_len;
1872 uni_code= DCtab_chrom[size][0];
1873 uni_len = DCtab_chrom[size][1];
1876 uni_code<<=size; uni_code|=l;
1879 uni_code<<=1; uni_code|=1;
1883 uni_DCtab_chrom_bits[level+256]= uni_code;
1884 uni_DCtab_chrom_len [level+256]= uni_len;
1889 static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1890 int slevel, run, last;
1892 assert(MAX_LEVEL >= 64);
1893 assert(MAX_RUN >= 63);
1895 for(slevel=-64; slevel<64; slevel++){
1896 if(slevel==0) continue;
1897 for(run=0; run<64; run++){
1898 for(last=0; last<=1; last++){
1899 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1900 int level= slevel < 0 ? -slevel : slevel;
1901 int sign= slevel < 0 ? 1 : 0;
1902 int bits, len, code;
1905 len_tab[index]= 100;
1908 code= get_rl_index(rl, last, run, level);
1909 bits= rl->table_vlc[code][0];
1910 len= rl->table_vlc[code][1];
1911 bits=bits*2+sign; len++;
1913 if(code!=rl->n && len < len_tab[index]){
1914 bits_tab[index]= bits;
1915 len_tab [index]= len;
1919 bits= rl->table_vlc[rl->n][0];
1920 len= rl->table_vlc[rl->n][1];
1921 bits=bits*2; len++; //esc1
1922 level1= level - rl->max_level[last][run];
1924 code= get_rl_index(rl, last, run, level1);
1925 bits<<= rl->table_vlc[code][1];
1926 len += rl->table_vlc[code][1];
1927 bits += rl->table_vlc[code][0];
1928 bits=bits*2+sign; len++;
1930 if(code!=rl->n && len < len_tab[index]){
1931 bits_tab[index]= bits;
1932 len_tab [index]= len;
1938 bits= rl->table_vlc[rl->n][0];
1939 len= rl->table_vlc[rl->n][1];
1940 bits=bits*4+2; len+=2; //esc2
1941 run1 = run - rl->max_run[last][level] - 1;
1943 code= get_rl_index(rl, last, run1, level);
1944 bits<<= rl->table_vlc[code][1];
1945 len += rl->table_vlc[code][1];
1946 bits += rl->table_vlc[code][0];
1947 bits=bits*2+sign; len++;
1949 if(code!=rl->n && len < len_tab[index]){
1950 bits_tab[index]= bits;
1951 len_tab [index]= len;
1956 bits= rl->table_vlc[rl->n][0];
1957 len = rl->table_vlc[rl->n][1];
1958 bits=bits*4+3; len+=2; //esc3
1959 bits=bits*2+last; len++;
1960 bits=bits*64+run; len+=6;
1961 bits=bits*2+1; len++; //marker
1962 bits=bits*4096+(slevel&0xfff); len+=12;
1963 bits=bits*2+1; len++; //marker
1965 if(len < len_tab[index]){
1966 bits_tab[index]= bits;
1967 len_tab [index]= len;
1974 static void init_uni_h263_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1975 int slevel, run, last;
1977 assert(MAX_LEVEL >= 64);
1978 assert(MAX_RUN >= 63);
1980 for(slevel=-64; slevel<64; slevel++){
1981 if(slevel==0) continue;
1982 for(run=0; run<64; run++){
1983 for(last=0; last<=1; last++){
1984 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1985 int level= slevel < 0 ? -slevel : slevel;
1986 int sign= slevel < 0 ? 1 : 0;
1987 int bits, len, code;
1989 len_tab[index]= 100;
1992 code= get_rl_index(rl, last, run, level);
1993 bits= rl->table_vlc[code][0];
1994 len= rl->table_vlc[code][1];
1995 bits=bits*2+sign; len++;
1997 if(code!=rl->n && len < len_tab[index]){
1998 if(bits_tab) bits_tab[index]= bits;
1999 len_tab [index]= len;
2002 bits= rl->table_vlc[rl->n][0];
2003 len = rl->table_vlc[rl->n][1];
2004 bits=bits*2+last; len++;
2005 bits=bits*64+run; len+=6;
2006 bits=bits*256+(level&0xff); len+=8;
2008 if(len < len_tab[index]){
2009 if(bits_tab) bits_tab[index]= bits;
2010 len_tab [index]= len;
2017 void h263_encode_init(MpegEncContext *s)
2019 static int done = 0;
2026 init_rl(&rl_inter, static_rl_table_store[0]);
2027 init_rl(&rl_intra, static_rl_table_store[1]);
2028 init_rl(&rl_intra_aic, static_rl_table_store[2]);
2030 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
2031 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
2033 init_uni_h263_rl_tab(&rl_intra_aic, NULL, uni_h263_intra_aic_rl_len);
2034 init_uni_h263_rl_tab(&rl_inter , NULL, uni_h263_inter_rl_len);
2036 init_mv_penalty_and_fcode(s);
2038 s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
2040 s->intra_ac_vlc_length =s->inter_ac_vlc_length = uni_h263_inter_rl_len;
2041 s->intra_ac_vlc_last_length=s->inter_ac_vlc_last_length= uni_h263_inter_rl_len + 128*64;
2043 s->intra_ac_vlc_length = uni_h263_intra_aic_rl_len;
2044 s->intra_ac_vlc_last_length= uni_h263_intra_aic_rl_len + 128*64;
2046 s->ac_esc_length= 7+1+6+8;
2048 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
2049 switch(s->codec_id){
2050 case CODEC_ID_MPEG4:
2051 s->fcode_tab= fcode_tab;
2052 s->min_qcoeff= -2048;
2053 s->max_qcoeff= 2047;
2054 s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len;
2055 s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64;
2056 s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len;
2057 s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64;
2058 s->luma_dc_vlc_length= uni_DCtab_lum_len;
2059 s->chroma_dc_vlc_length= uni_DCtab_chrom_len;
2060 s->ac_esc_length= 7+2+1+6+1+12+1;
2061 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
2062 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
2064 if(s->flags & CODEC_FLAG_GLOBAL_HEADER){
2066 s->avctx->extradata= av_malloc(1024);
2067 init_put_bits(&s->pb, s->avctx->extradata, 1024);
2069 if(!(s->workaround_bugs & FF_BUG_MS))
2070 mpeg4_encode_visual_object_header(s);
2071 mpeg4_encode_vol_header(s, 0, 0);
2073 // ff_mpeg4_stuffing(&s->pb); ?
2074 flush_put_bits(&s->pb);
2075 s->avctx->extradata_size= (put_bits_count(&s->pb)+7)>>3;
2079 case CODEC_ID_H263P:
2081 s->fcode_tab= umv_fcode_tab;
2082 if(s->modified_quant){
2083 s->min_qcoeff= -2047;
2084 s->max_qcoeff= 2047;
2086 s->min_qcoeff= -127;
2090 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
2092 if (s->h263_flv > 1) {
2093 s->min_qcoeff= -1023;
2094 s->max_qcoeff= 1023;
2096 s->min_qcoeff= -127;
2099 s->y_dc_scale_table=
2100 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
2102 default: //nothing needed - default table already set in mpegvideo.c
2103 s->min_qcoeff= -127;
2105 s->y_dc_scale_table=
2106 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
2111 * encodes a 8x8 block.
2112 * @param block the 8x8 block
2113 * @param n block index (0-3 are luma, 4-5 are chroma)
2115 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
2117 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
2121 if (s->mb_intra && !s->h263_aic) {
2124 /* 255 cannot be represented, so we clamp */
2129 /* 0 cannot be represented also */
2130 else if (level < 1) {
2134 if (level == 128) //FIXME check rv10
2135 put_bits(&s->pb, 8, 0xff);
2137 put_bits(&s->pb, 8, level);
2141 if (s->h263_aic && s->mb_intra)
2144 if(s->alt_inter_vlc && !s->mb_intra){
2146 int inter_vlc_bits=0;
2150 last_index = s->block_last_index[n];
2151 last_non_zero = i - 1;
2152 for (; i <= last_index; i++) {
2153 j = s->intra_scantable.permutated[i];
2156 run = i - last_non_zero - 1;
2157 last = (i == last_index);
2159 if(level<0) level= -level;
2161 code = get_rl_index(rl, last, run, level);
2162 aic_code = get_rl_index(&rl_intra_aic, last, run, level);
2163 inter_vlc_bits += rl->table_vlc[code][1]+1;
2164 aic_vlc_bits += rl_intra_aic.table_vlc[aic_code][1]+1;
2166 if (code == rl->n) {
2167 inter_vlc_bits += 1+6+8-1;
2169 if (aic_code == rl_intra_aic.n) {
2170 aic_vlc_bits += 1+6+8-1;
2171 wrong_pos += run + 1;
2173 wrong_pos += wrong_run[aic_code];
2178 if(aic_vlc_bits < inter_vlc_bits && wrong_pos > 63)
2184 last_index = s->block_last_index[n];
2185 last_non_zero = i - 1;
2186 for (; i <= last_index; i++) {
2187 j = s->intra_scantable.permutated[i];
2190 run = i - last_non_zero - 1;
2191 last = (i == last_index);
2198 code = get_rl_index(rl, last, run, level);
2199 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2200 if (code == rl->n) {
2201 if(s->h263_flv <= 1){
2202 put_bits(&s->pb, 1, last);
2203 put_bits(&s->pb, 6, run);
2205 assert(slevel != 0);
2208 put_sbits(&s->pb, 8, slevel);
2210 put_bits(&s->pb, 8, 128);
2211 put_sbits(&s->pb, 5, slevel);
2212 put_sbits(&s->pb, 6, slevel>>5);
2215 if(level < 64) { // 7-bit level
2216 put_bits(&s->pb, 1, 0);
2217 put_bits(&s->pb, 1, last);
2218 put_bits(&s->pb, 6, run);
2220 put_sbits(&s->pb, 7, slevel);
2223 put_bits(&s->pb, 1, 1);
2224 put_bits(&s->pb, 1, last);
2225 put_bits(&s->pb, 6, run);
2227 put_sbits(&s->pb, 11, slevel);
2231 put_bits(&s->pb, 1, sign);
2238 /***************************************************/
2240 * add mpeg4 stuffing bits (01...1)
2242 void ff_mpeg4_stuffing(PutBitContext * pbc)
2245 put_bits(pbc, 1, 0);
2246 length= (-put_bits_count(pbc))&7;
2247 if(length) put_bits(pbc, length, (1<<length)-1);
2250 /* must be called before writing the header */
2251 void ff_set_mpeg4_time(MpegEncContext * s){
2252 if(s->pict_type==FF_B_TYPE){
2253 ff_mpeg4_init_direct_mv(s);
2255 s->last_time_base= s->time_base;
2256 s->time_base= s->time/s->avctx->time_base.den;
2260 static void mpeg4_encode_gop_header(MpegEncContext * s){
2261 int hours, minutes, seconds;
2264 put_bits(&s->pb, 16, 0);
2265 put_bits(&s->pb, 16, GOP_STARTCODE);
2267 time= s->current_picture_ptr->pts;
2268 if(s->reordered_input_picture[1])
2269 time= FFMIN(time, s->reordered_input_picture[1]->pts);
2270 time= time*s->avctx->time_base.num;
2272 seconds= time/s->avctx->time_base.den;
2273 minutes= seconds/60; seconds %= 60;
2274 hours= minutes/60; minutes %= 60;
2277 put_bits(&s->pb, 5, hours);
2278 put_bits(&s->pb, 6, minutes);
2279 put_bits(&s->pb, 1, 1);
2280 put_bits(&s->pb, 6, seconds);
2282 put_bits(&s->pb, 1, !!(s->flags&CODEC_FLAG_CLOSED_GOP));
2283 put_bits(&s->pb, 1, 0); //broken link == NO
2285 s->last_time_base= time / s->avctx->time_base.den;
2287 ff_mpeg4_stuffing(&s->pb);
2290 static void mpeg4_encode_visual_object_header(MpegEncContext * s){
2291 int profile_and_level_indication;
2294 if(s->avctx->profile != FF_PROFILE_UNKNOWN){
2295 profile_and_level_indication = s->avctx->profile << 4;
2296 }else if(s->max_b_frames || s->quarter_sample){
2297 profile_and_level_indication= 0xF0; // adv simple
2299 profile_and_level_indication= 0x00; // simple
2302 if(s->avctx->level != FF_LEVEL_UNKNOWN){
2303 profile_and_level_indication |= s->avctx->level;
2305 profile_and_level_indication |= 1; //level 1
2308 if(profile_and_level_indication>>4 == 0xF){
2316 put_bits(&s->pb, 16, 0);
2317 put_bits(&s->pb, 16, VOS_STARTCODE);
2319 put_bits(&s->pb, 8, profile_and_level_indication);
2321 put_bits(&s->pb, 16, 0);
2322 put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);
2324 put_bits(&s->pb, 1, 1);
2325 put_bits(&s->pb, 4, vo_ver_id);
2326 put_bits(&s->pb, 3, 1); //priority
2328 put_bits(&s->pb, 4, 1); //visual obj type== video obj
2330 put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME
2332 ff_mpeg4_stuffing(&s->pb);
2335 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number)
2339 if (!CONFIG_MPEG4_ENCODER) return;
2341 if(s->max_b_frames || s->quarter_sample){
2343 s->vo_type= ADV_SIMPLE_VO_TYPE;
2346 s->vo_type= SIMPLE_VO_TYPE;
2349 put_bits(&s->pb, 16, 0);
2350 put_bits(&s->pb, 16, 0x100 + vo_number); /* video obj */
2351 put_bits(&s->pb, 16, 0);
2352 put_bits(&s->pb, 16, 0x120 + vol_number); /* video obj layer */
2354 put_bits(&s->pb, 1, 0); /* random access vol */
2355 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
2356 if(s->workaround_bugs & FF_BUG_MS) {
2357 put_bits(&s->pb, 1, 0); /* is obj layer id= no */
2359 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
2360 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
2361 put_bits(&s->pb, 3, 1); /* is obj layer priority */
2364 aspect_to_info(s, s->avctx->sample_aspect_ratio);
2366 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
2367 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
2368 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
2369 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
2372 if(s->workaround_bugs & FF_BUG_MS) { //
2373 put_bits(&s->pb, 1, 0); /* vol control parameters= no @@@ */
2375 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
2376 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
2377 put_bits(&s->pb, 1, s->low_delay);
2378 put_bits(&s->pb, 1, 0); /* vbv parameters= no */
2381 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
2382 put_bits(&s->pb, 1, 1); /* marker bit */
2384 put_bits(&s->pb, 16, s->avctx->time_base.den);
2385 if (s->time_increment_bits < 1)
2386 s->time_increment_bits = 1;
2387 put_bits(&s->pb, 1, 1); /* marker bit */
2388 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
2389 put_bits(&s->pb, 1, 1); /* marker bit */
2390 put_bits(&s->pb, 13, s->width); /* vol width */
2391 put_bits(&s->pb, 1, 1); /* marker bit */
2392 put_bits(&s->pb, 13, s->height); /* vol height */
2393 put_bits(&s->pb, 1, 1); /* marker bit */
2394 put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
2395 put_bits(&s->pb, 1, 1); /* obmc disable */
2396 if (vo_ver_id == 1) {
2397 put_bits(&s->pb, 1, s->vol_sprite_usage); /* sprite enable */
2399 put_bits(&s->pb, 2, s->vol_sprite_usage); /* sprite enable */
2402 put_bits(&s->pb, 1, 0); /* not 8 bit == false */
2403 put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
2406 ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix);
2407 ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix);
2411 put_bits(&s->pb, 1, s->quarter_sample);
2412 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
2413 s->resync_marker= s->rtp_mode;
2414 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
2415 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
2416 if(s->data_partitioning){
2417 put_bits(&s->pb, 1, 0); /* no rvlc */
2420 if (vo_ver_id != 1){
2421 put_bits(&s->pb, 1, 0); /* newpred */
2422 put_bits(&s->pb, 1, 0); /* reduced res vop */
2424 put_bits(&s->pb, 1, 0); /* scalability */
2426 ff_mpeg4_stuffing(&s->pb);
2429 if(!(s->flags & CODEC_FLAG_BITEXACT)){
2430 put_bits(&s->pb, 16, 0);
2431 put_bits(&s->pb, 16, 0x1B2); /* user_data */
2432 ff_put_string(&s->pb, LIBAVCODEC_IDENT, 0);
2436 /* write mpeg4 VOP header */
2437 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
2440 int time_div, time_mod;
2442 if(s->pict_type==FF_I_TYPE){
2443 if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
2444 if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT) //HACK, the reference sw is buggy
2445 mpeg4_encode_visual_object_header(s);
2446 if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT || picture_number==0) //HACK, the reference sw is buggy
2447 mpeg4_encode_vol_header(s, 0, 0);
2449 if(!(s->workaround_bugs & FF_BUG_MS))
2450 mpeg4_encode_gop_header(s);
2453 s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE;
2455 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->time_base.den, FRAME_RATE_BASE);
2457 put_bits(&s->pb, 16, 0); /* vop header */
2458 put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */
2459 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
2462 time_div= s->time/s->avctx->time_base.den;
2463 time_mod= s->time%s->avctx->time_base.den;
2464 time_incr= time_div - s->last_time_base;
2465 assert(time_incr >= 0);
2467 put_bits(&s->pb, 1, 1);
2469 put_bits(&s->pb, 1, 0);
2471 put_bits(&s->pb, 1, 1); /* marker */
2472 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
2473 put_bits(&s->pb, 1, 1); /* marker */
2474 put_bits(&s->pb, 1, 1); /* vop coded */
2475 if ( s->pict_type == FF_P_TYPE
2476 || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
2477 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
2479 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
2480 if(!s->progressive_sequence){
2481 put_bits(&s->pb, 1, s->current_picture_ptr->top_field_first);
2482 put_bits(&s->pb, 1, s->alternate_scan);
2484 //FIXME sprite stuff
2486 put_bits(&s->pb, 5, s->qscale);
2488 if (s->pict_type != FF_I_TYPE)
2489 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
2490 if (s->pict_type == FF_B_TYPE)
2491 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
2492 // printf("****frame %d\n", picture_number);
2495 #endif //CONFIG_ENCODERS
2499 * encoding quantized level -> quantized diff
2500 * decoding quantized diff -> quantized level
2501 * @param n block index (0-3 are luma, 4-5 are chroma)
2502 * @param dir_ptr pointer to an integer where the prediction direction will be stored
2504 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding)
2506 int a, b, c, wrap, pred, scale, ret;
2509 /* find prediction */
2511 scale = s->y_dc_scale;
2513 scale = s->c_dc_scale;
2518 wrap= s->block_wrap[n];
2519 dc_val = s->dc_val[0] + s->block_index[n];
2525 b = dc_val[ - 1 - wrap];
2526 c = dc_val[ - wrap];
2528 /* outside slice handling (we can't do that by memset as we need the dc for error resilience) */
2529 if(s->first_slice_line && n!=3){
2531 if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
2533 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
2534 if(n==0 || n==4 || n==5)
2538 if (abs(a - b) < abs(b - c)) {
2540 *dir_ptr = 1; /* top */
2543 *dir_ptr = 0; /* left */
2545 /* we assume pred is positive */
2546 pred = FASTDIV((pred + (scale >> 1)), scale);
2553 if(s->error_recognition>=3){
2555 av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
2558 if(level*scale > 2048 + scale){
2559 av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
2568 else if(!(s->workaround_bugs&FF_BUG_DC_CLIP))
2578 * @param n block index (0-3 are luma, 4-5 are chroma)
2579 * @param dir the ac prediction direction
2581 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
2585 int16_t *ac_val, *ac_val1;
2586 int8_t * const qscale_table= s->current_picture.qscale_table;
2588 /* find prediction */
2589 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2593 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
2594 /* left prediction */
2597 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
2600 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
2603 /* different qscale, we must rescale */
2605 block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
2609 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
2610 /* top prediction */
2611 ac_val -= 16 * s->block_wrap[n];
2613 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
2616 block[s->dsp.idct_permutation[i]] += ac_val[i + 8];
2619 /* different qscale, we must rescale */
2621 block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
2628 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
2632 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
2639 * encodes the dc value.
2640 * @param n block index (0-3 are luma, 4-5 are chroma)
2642 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
2645 // if(level<-255 || level>255) printf("dc overflow\n");
2649 put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]);
2652 put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]);
2656 /* find number of bits */
2666 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
2669 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
2672 /* encode remaining bits */
2675 level = (-level) ^ ((1 << size) - 1);
2676 put_bits(&s->pb, size, level);
2678 put_bits(&s->pb, 1, 1);
2683 static inline int mpeg4_get_dc_length(int level, int n){
2685 return uni_DCtab_lum_len[level + 256];
2687 return uni_DCtab_chrom_len[level + 256];
2692 * encodes a 8x8 block
2693 * @param n block index (0-3 are luma, 4-5 are chroma)
2695 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2696 uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
2698 int i, last_non_zero;
2699 #if 0 //variables for the outcommented version
2700 int code, sign, last;
2705 const int last_index = s->block_last_index[n];
2707 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2708 /* mpeg4 based DC predictor */
2709 mpeg4_encode_dc(dc_pb, intra_dc, n);
2710 if(last_index<1) return;
2713 bits_tab= uni_mpeg4_intra_rl_bits;
2714 len_tab = uni_mpeg4_intra_rl_len;
2716 if(last_index<0) return;
2719 bits_tab= uni_mpeg4_inter_rl_bits;
2720 len_tab = uni_mpeg4_inter_rl_len;
2724 last_non_zero = i - 1;
2726 for (; i < last_index; i++) {
2727 int level = block[ scan_table[i] ];
2729 int run = i - last_non_zero - 1;
2731 if((level&(~127)) == 0){
2732 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2733 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2735 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);
2740 /*if(i<=last_index)*/{
2741 int level = block[ scan_table[i] ];
2742 int run = i - last_non_zero - 1;
2744 if((level&(~127)) == 0){
2745 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2746 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2748 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);
2752 for (; i <= last_index; i++) {
2753 const int slevel = block[ scan_table[i] ];
2756 int run = i - last_non_zero - 1;
2757 last = (i == last_index);
2764 code = get_rl_index(rl, last, run, level);
2765 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2766 if (code == rl->n) {
2768 level1 = level - rl->max_level[last][run];
2771 code = get_rl_index(rl, last, run, level1);
2772 if (code == rl->n) {
2774 put_bits(ac_pb, 1, 1);
2775 if (level > MAX_LEVEL)
2777 run1 = run - rl->max_run[last][level] - 1;
2780 code = get_rl_index(rl, last, run1, level);
2781 if (code == rl->n) {
2784 put_bits(ac_pb, 1, 1);
2785 put_bits(ac_pb, 1, last);
2786 put_bits(ac_pb, 6, run);
2787 put_bits(ac_pb, 1, 1);
2788 put_sbits(ac_pb, 12, slevel);
2789 put_bits(ac_pb, 1, 1);
2792 put_bits(ac_pb, 1, 0);
2793 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2794 put_bits(ac_pb, 1, sign);
2798 put_bits(ac_pb, 1, 0);
2799 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2800 put_bits(ac_pb, 1, sign);
2803 put_bits(ac_pb, 1, sign);
2811 static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2812 uint8_t *scan_table)
2814 int i, last_non_zero;
2816 const int last_index = s->block_last_index[n];
2819 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2820 /* mpeg4 based DC predictor */
2821 len += mpeg4_get_dc_length(intra_dc, n);
2822 if(last_index<1) return len;
2824 len_tab = uni_mpeg4_intra_rl_len;
2826 if(last_index<0) return 0;
2828 len_tab = uni_mpeg4_inter_rl_len;
2832 last_non_zero = i - 1;
2833 for (; i < last_index; i++) {
2834 int level = block[ scan_table[i] ];
2836 int run = i - last_non_zero - 1;
2838 if((level&(~127)) == 0){
2839 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2840 len += len_tab[index];
2842 len += 7+2+1+6+1+12+1;
2847 /*if(i<=last_index)*/{
2848 int level = block[ scan_table[i] ];
2849 int run = i - last_non_zero - 1;
2851 if((level&(~127)) == 0){
2852 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2853 len += len_tab[index];
2855 len += 7+2+1+6+1+12+1;
2865 /***********************************************/
2868 static VLC intra_MCBPC_vlc;
2869 static VLC inter_MCBPC_vlc;
2870 static VLC cbpy_vlc;
2872 static VLC dc_lum, dc_chrom;
2873 static VLC sprite_trajectory;
2874 static VLC mb_type_b_vlc;
2875 static VLC h263_mbtype_b_vlc;
2876 static VLC cbpc_b_vlc;
2880 /* XXX: find a better solution to handle static init */
2881 void h263_decode_init_vlc(MpegEncContext *s)
2883 static int done = 0;
2888 INIT_VLC_STATIC(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 9,
2889 intra_MCBPC_bits, 1, 1,
2890 intra_MCBPC_code, 1, 1, 72);
2891 INIT_VLC_STATIC(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 28,
2892 inter_MCBPC_bits, 1, 1,
2893 inter_MCBPC_code, 1, 1, 198);
2894 INIT_VLC_STATIC(&cbpy_vlc, CBPY_VLC_BITS, 16,
2895 &cbpy_tab[0][1], 2, 1,
2896 &cbpy_tab[0][0], 2, 1, 64);
2897 INIT_VLC_STATIC(&mv_vlc, MV_VLC_BITS, 33,
2899 &mvtab[0][0], 2, 1, 538);
2900 init_rl(&rl_inter, static_rl_table_store[0]);
2901 init_rl(&rl_intra, static_rl_table_store[1]);
2902 init_rl(&rvlc_rl_inter, static_rl_table_store[3]);
2903 init_rl(&rvlc_rl_intra, static_rl_table_store[4]);
2904 init_rl(&rl_intra_aic, static_rl_table_store[2]);
2905 INIT_VLC_RL(rl_inter, 554);
2906 INIT_VLC_RL(rl_intra, 554);
2907 INIT_VLC_RL(rvlc_rl_inter, 1072);
2908 INIT_VLC_RL(rvlc_rl_intra, 1072);
2909 INIT_VLC_RL(rl_intra_aic, 554);
2910 INIT_VLC_STATIC(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
2911 &DCtab_lum[0][1], 2, 1,
2912 &DCtab_lum[0][0], 2, 1, 512);
2913 INIT_VLC_STATIC(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
2914 &DCtab_chrom[0][1], 2, 1,
2915 &DCtab_chrom[0][0], 2, 1, 512);
2916 INIT_VLC_STATIC(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
2917 &sprite_trajectory_tab[0][1], 4, 2,
2918 &sprite_trajectory_tab[0][0], 4, 2, 128);
2919 INIT_VLC_STATIC(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
2920 &mb_type_b_tab[0][1], 2, 1,
2921 &mb_type_b_tab[0][0], 2, 1, 16);
2922 INIT_VLC_STATIC(&h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15,
2923 &h263_mbtype_b_tab[0][1], 2, 1,
2924 &h263_mbtype_b_tab[0][0], 2, 1, 80);
2925 INIT_VLC_STATIC(&cbpc_b_vlc, CBPC_B_VLC_BITS, 4,
2926 &cbpc_b_tab[0][1], 2, 1,
2927 &cbpc_b_tab[0][0], 2, 1, 8);
2932 * Get the GOB height based on picture height.
2934 int ff_h263_get_gob_height(MpegEncContext *s){
2935 if (s->height <= 400)
2937 else if (s->height <= 800)
2943 int ff_h263_decode_mba(MpegEncContext *s)
2948 if(s->mb_num-1 <= ff_mba_max[i]) break;
2950 mb_pos= get_bits(&s->gb, ff_mba_length[i]);
2951 s->mb_x= mb_pos % s->mb_width;
2952 s->mb_y= mb_pos / s->mb_width;
2957 void ff_h263_encode_mba(MpegEncContext *s)
2962 if(s->mb_num-1 <= ff_mba_max[i]) break;
2964 mb_pos= s->mb_x + s->mb_width*s->mb_y;
2965 put_bits(&s->pb, ff_mba_length[i], mb_pos);
2969 * decodes the group of blocks header or slice header.
2970 * @return <0 if an error occurred
2972 static int h263_decode_gob_header(MpegEncContext *s)
2974 unsigned int val, gfid, gob_number;
2977 /* Check for GOB Start Code */
2978 val = show_bits(&s->gb, 16);
2982 /* We have a GBSC probably with GSTUFF */
2983 skip_bits(&s->gb, 16); /* Drop the zeros */
2984 left= get_bits_left(&s->gb);
2985 //MN: we must check the bits left or we might end in a infinite loop (or segfault)
2986 for(;left>13; left--){
2987 if(get_bits1(&s->gb)) break; /* Seek the '1' bit */
2992 if(s->h263_slice_structured){
2993 if(get_bits1(&s->gb)==0)
2996 ff_h263_decode_mba(s);
2998 if(s->mb_num > 1583)
2999 if(get_bits1(&s->gb)==0)
3002 s->qscale = get_bits(&s->gb, 5); /* SQUANT */
3003 if(get_bits1(&s->gb)==0)
3005 gfid = get_bits(&s->gb, 2); /* GFID */
3007 gob_number = get_bits(&s->gb, 5); /* GN */
3009 s->mb_y= s->gob_index* gob_number;
3010 gfid = get_bits(&s->gb, 2); /* GFID */
3011 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
3014 if(s->mb_y >= s->mb_height)
3023 static inline void memsetw(short *tab, int val, int n)
3032 void ff_mpeg4_init_partitions(MpegEncContext *s)
3034 uint8_t *start= put_bits_ptr(&s->pb);
3035 uint8_t *end= s->pb.buf_end;
3036 int size= end - start;
3037 int pb_size = (((intptr_t)start + size/3)&(~3)) - (intptr_t)start;
3038 int tex_size= (size - 2*pb_size)&(~3);
3040 set_put_bits_buffer_size(&s->pb, pb_size);
3041 init_put_bits(&s->tex_pb, start + pb_size , tex_size);
3042 init_put_bits(&s->pb2 , start + pb_size + tex_size, pb_size);
3045 void ff_mpeg4_merge_partitions(MpegEncContext *s)
3047 const int pb2_len = put_bits_count(&s->pb2 );
3048 const int tex_pb_len= put_bits_count(&s->tex_pb);
3049 const int bits= put_bits_count(&s->pb);
3051 if(s->pict_type==FF_I_TYPE){
3052 put_bits(&s->pb, 19, DC_MARKER);
3053 s->misc_bits+=19 + pb2_len + bits - s->last_bits;
3054 s->i_tex_bits+= tex_pb_len;
3056 put_bits(&s->pb, 17, MOTION_MARKER);
3057 s->misc_bits+=17 + pb2_len;
3058 s->mv_bits+= bits - s->last_bits;
3059 s->p_tex_bits+= tex_pb_len;
3062 flush_put_bits(&s->pb2);
3063 flush_put_bits(&s->tex_pb);
3065 set_put_bits_buffer_size(&s->pb, s->pb2.buf_end - s->pb.buf);
3066 ff_copy_bits(&s->pb, s->pb2.buf , pb2_len);
3067 ff_copy_bits(&s->pb, s->tex_pb.buf, tex_pb_len);
3068 s->last_bits= put_bits_count(&s->pb);
3071 #endif //CONFIG_ENCODERS
3073 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
3074 switch(s->pict_type){
3079 return s->f_code+15;
3081 return FFMAX3(s->f_code, s->b_code, 2) + 15;
3089 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
3091 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
3093 put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0);
3094 put_bits(&s->pb, 1, 1);
3096 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
3097 put_bits(&s->pb, s->quant_precision, s->qscale);
3098 put_bits(&s->pb, 1, 0); /* no HEC */
3101 #endif //CONFIG_ENCODERS
3104 * check if the next stuff is a resync marker or the end.
3107 static inline int mpeg4_is_resync(MpegEncContext *s){
3108 int bits_count= get_bits_count(&s->gb);
3109 int v= show_bits(&s->gb, 16);
3111 if(s->workaround_bugs&FF_BUG_NO_PADDING){
3116 if(s->pict_type==FF_B_TYPE || (v>>(8-s->pict_type)!=1) || s->partitioned_frame)
3118 skip_bits(&s->gb, 8+s->pict_type);
3119 bits_count+= 8+s->pict_type;
3120 v= show_bits(&s->gb, 16);
3123 if(bits_count + 8 >= s->gb.size_in_bits){
3125 v|= 0x7F >> (7-(bits_count&7));
3130 if(v == ff_mpeg4_resync_prefix[bits_count&7]){
3132 GetBitContext gb= s->gb;
3134 skip_bits(&s->gb, 1);
3135 align_get_bits(&s->gb);
3137 for(len=0; len<32; len++){
3138 if(get_bits1(&s->gb)) break;
3143 if(len>=ff_mpeg4_get_video_packet_prefix_length(s))
3151 * decodes the next video packet.
3152 * @return <0 if something went wrong
3154 static int mpeg4_decode_video_packet_header(MpegEncContext *s)
3156 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
3157 int header_extension=0, mb_num, len;
3159 /* is there enough space left for a video packet + header */
3160 if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1;
3162 for(len=0; len<32; len++){
3163 if(get_bits1(&s->gb)) break;
3166 if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
3167 av_log(s->avctx, AV_LOG_ERROR, "marker does not match f_code\n");
3171 if(s->shape != RECT_SHAPE){
3172 header_extension= get_bits1(&s->gb);
3173 //FIXME more stuff here
3176 mb_num= get_bits(&s->gb, mb_num_bits);
3177 if(mb_num>=s->mb_num){
3178 av_log(s->avctx, AV_LOG_ERROR, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);
3181 if(s->pict_type == FF_B_TYPE){
3182 while(s->next_picture.mbskip_table[ s->mb_index2xy[ mb_num ] ]) mb_num++;
3183 if(mb_num >= s->mb_num) return -1; // slice contains just skipped MBs which where already decoded
3186 s->mb_x= mb_num % s->mb_width;
3187 s->mb_y= mb_num / s->mb_width;
3189 if(s->shape != BIN_ONLY_SHAPE){
3190 int qscale= get_bits(&s->gb, s->quant_precision);
3192 s->chroma_qscale=s->qscale= qscale;
3195 if(s->shape == RECT_SHAPE){
3196 header_extension= get_bits1(&s->gb);
3198 if(header_extension){
3202 while (get_bits1(&s->gb) != 0)
3205 check_marker(&s->gb, "before time_increment in video packed header");
3206 time_increment= get_bits(&s->gb, s->time_increment_bits);
3207 check_marker(&s->gb, "before vop_coding_type in video packed header");
3209 skip_bits(&s->gb, 2); /* vop coding type */
3210 //FIXME not rect stuff here
3212 if(s->shape != BIN_ONLY_SHAPE){
3213 skip_bits(&s->gb, 3); /* intra dc vlc threshold */
3214 //FIXME don't just ignore everything
3215 if(s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3216 mpeg4_decode_sprite_trajectory(s, &s->gb);
3217 av_log(s->avctx, AV_LOG_ERROR, "untested\n");
3220 //FIXME reduced res stuff here
3222 if (s->pict_type != FF_I_TYPE) {
3223 int f_code = get_bits(&s->gb, 3); /* fcode_for */
3225 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (f_code=0)\n");
3228 if (s->pict_type == FF_B_TYPE) {
3229 int b_code = get_bits(&s->gb, 3);
3231 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (b_code=0)\n");
3236 //FIXME new-pred stuff
3238 //printf("parse ok %d %d %d %d\n", mb_num, s->mb_x + s->mb_y*s->mb_width, get_bits_count(gb), get_bits_count(&s->gb));
3243 void ff_mpeg4_clean_buffers(MpegEncContext *s)
3245 int c_wrap, c_xy, l_wrap, l_xy;
3247 l_wrap= s->b8_stride;
3248 l_xy= (2*s->mb_y-1)*l_wrap + s->mb_x*2 - 1;
3249 c_wrap= s->mb_stride;
3250 c_xy= (s->mb_y-1)*c_wrap + s->mb_x - 1;
3254 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
3255 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
3256 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
3260 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t));
3261 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
3262 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
3265 // we can't clear the MVs as they might be needed by a b frame
3266 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t));
3267 // memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
3268 s->last_mv[0][0][0]=
3269 s->last_mv[0][0][1]=
3270 s->last_mv[1][0][0]=
3271 s->last_mv[1][0][1]= 0;
3275 * finds the next resync_marker
3276 * @param p pointer to buffer to scan
3277 * @param end pointer to the end of the buffer
3278 * @return pointer to the next resync_marker, or \p end if none was found
3280 const uint8_t *ff_h263_find_resync_marker(const uint8_t *restrict p, const uint8_t * restrict end)
3288 if (!p[-1] && p[1]) return p - 1;
3289 else if(!p[ 1] && p[2]) return p;
3296 * decodes the group of blocks / video packet header.
3297 * @return bit position of the resync_marker, or <0 if none was found
3299 int ff_h263_resync(MpegEncContext *s){
3302 if(s->codec_id==CODEC_ID_MPEG4){
3304 align_get_bits(&s->gb);
3307 if(show_bits(&s->gb, 16)==0){
3308 pos= get_bits_count(&s->gb);
3309 if(s->codec_id==CODEC_ID_MPEG4)
3310 ret= mpeg4_decode_video_packet_header(s);
3312 ret= h263_decode_gob_header(s);
3316 //OK, it's not where it is supposed to be ...
3317 s->gb= s->last_resync_gb;
3318 align_get_bits(&s->gb);
3319 left= get_bits_left(&s->gb);
3321 for(;left>16+1+5+5; left-=8){
3322 if(show_bits(&s->gb, 16)==0){
3323 GetBitContext bak= s->gb;
3325 pos= get_bits_count(&s->gb);
3326 if(s->codec_id==CODEC_ID_MPEG4)
3327 ret= mpeg4_decode_video_packet_header(s);
3329 ret= h263_decode_gob_header(s);
3335 skip_bits(&s->gb, 8);
3342 * gets the average motion vector for a GMC MB.
3343 * @param n either 0 for the x component or 1 for y
3344 * @returns the average MV for a GMC MB
3346 static inline int get_amv(MpegEncContext *s, int n){
3347 int x, y, mb_v, sum, dx, dy, shift;
3348 int len = 1 << (s->f_code + 4);
3349 const int a= s->sprite_warping_accuracy;
3351 if(s->workaround_bugs & FF_BUG_AMV)
3352 len >>= s->quarter_sample;
3354 if(s->real_sprite_warping_points==1){
3355 if(s->divx_version==500 && s->divx_build==413)
3356 sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample));
3358 sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a);
3360 dx= s->sprite_delta[n][0];
3361 dy= s->sprite_delta[n][1];
3362 shift= s->sprite_shift[0];
3363 if(n) dy -= 1<<(shift + a + 1);
3364 else dx -= 1<<(shift + a + 1);
3365 mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16;
3368 for(y=0; y<16; y++){
3372 //XXX FIXME optimize
3373 for(x=0; x<16; x++){
3378 sum= RSHIFT(sum, a+8-s->quarter_sample);
3381 if (sum < -len) sum= -len;
3382 else if (sum >= len) sum= len-1;
3388 * decodes first partition.
3389 * @return number of MBs decoded or <0 if an error occurred
3391 static int mpeg4_decode_partition_a(MpegEncContext *s){
3393 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3395 /* decode first partition */
3397 s->first_slice_line=1;
3398 for(; s->mb_y<s->mb_height; s->mb_y++){
3399 ff_init_block_index(s);
3400 for(; s->mb_x<s->mb_width; s->mb_x++){
3401 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3406 ff_update_block_index(s);
3407 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3408 s->first_slice_line=0;
3410 if(s->pict_type==FF_I_TYPE){
3414 if(show_bits_long(&s->gb, 19)==DC_MARKER){
3418 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
3420 av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
3425 s->cbp_table[xy]= cbpc & 3;
3426 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3430 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3432 s->current_picture.qscale_table[xy]= s->qscale;
3434 s->mbintra_table[xy]= 1;
3437 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3439 av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3443 if(dc_pred_dir) dir|=1;
3445 s->pred_dir_table[xy]= dir;
3446 }else{ /* P/S_TYPE */
3447 int mx, my, pred_x, pred_y, bits;
3448 int16_t * const mot_val= s->current_picture.motion_val[0][s->block_index[0]];
3449 const int stride= s->b8_stride*2;
3452 bits= show_bits(&s->gb, 17);
3453 if(bits==MOTION_MARKER){
3459 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3460 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
3464 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3467 mot_val[0 ]= mot_val[2 ]=
3468 mot_val[0+stride]= mot_val[2+stride]= mx;
3469 mot_val[1 ]= mot_val[3 ]=
3470 mot_val[1+stride]= mot_val[3+stride]= my;
3472 if(s->mbintra_table[xy])
3473 ff_clean_intra_table_entries(s);
3477 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3479 av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
3485 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
3487 s->mb_intra = ((cbpc & 4) != 0);
3490 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3491 s->mbintra_table[xy]= 1;
3492 mot_val[0 ]= mot_val[2 ]=
3493 mot_val[0+stride]= mot_val[2+stride]= 0;
3494 mot_val[1 ]= mot_val[3 ]=
3495 mot_val[1+stride]= mot_val[3+stride]= 0;
3497 if(s->mbintra_table[xy])
3498 ff_clean_intra_table_entries(s);
3500 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
3501 s->mcsel= get_bits1(&s->gb);
3504 if ((cbpc & 16) == 0) {
3505 /* 16x16 motion prediction */
3507 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3509 mx = h263_decode_motion(s, pred_x, s->f_code);
3513 my = h263_decode_motion(s, pred_y, s->f_code);
3516 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3520 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
3523 mot_val[0 ]= mot_val[2 ] =
3524 mot_val[0+stride]= mot_val[2+stride]= mx;
3525 mot_val[1 ]= mot_val[3 ]=
3526 mot_val[1+stride]= mot_val[3+stride]= my;
3529 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3531 int16_t *mot_val= h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3532 mx = h263_decode_motion(s, pred_x, s->f_code);
3536 my = h263_decode_motion(s, pred_y, s->f_code);
3553 * decode second partition.
3554 * @return <0 if an error occurred
3556 static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
3558 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3560 s->mb_x= s->resync_mb_x;
3561 s->first_slice_line=1;
3562 for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
3563 ff_init_block_index(s);
3564 for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
3565 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3568 ff_update_block_index(s);
3569 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3570 s->first_slice_line=0;
3572 if(s->pict_type==FF_I_TYPE){
3573 int ac_pred= get_bits1(&s->gb);
3574 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3576 av_log(s->avctx, AV_LOG_ERROR, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3580 s->cbp_table[xy]|= cbpy<<2;
3581 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3582 }else{ /* P || S_TYPE */
3583 if(IS_INTRA(s->current_picture.mb_type[xy])){
3585 int ac_pred = get_bits1(&s->gb);
3586 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3589 av_log(s->avctx, AV_LOG_ERROR, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3593 if(s->cbp_table[xy] & 8) {
3594 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3596 s->current_picture.qscale_table[xy]= s->qscale;
3600 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3602 av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3606 if(dc_pred_dir) dir|=1;
3608 s->cbp_table[xy]&= 3; //remove dquant
3609 s->cbp_table[xy]|= cbpy<<2;
3610 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3611 s->pred_dir_table[xy]= dir;
3612 }else if(IS_SKIP(s->current_picture.mb_type[xy])){
3613 s->current_picture.qscale_table[xy]= s->qscale;
3614 s->cbp_table[xy]= 0;
3616 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3619 av_log(s->avctx, AV_LOG_ERROR, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3623 if(s->cbp_table[xy] & 8) {
3624 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3626 s->current_picture.qscale_table[xy]= s->qscale;
3628 s->cbp_table[xy]&= 3; //remove dquant
3629 s->cbp_table[xy]|= (cbpy^0xf)<<2;
3633 if(mb_num >= mb_count) return 0;
3640 * decodes the first & second partition
3641 * @return <0 if error (and sets error type in the error_status_table)
3643 int ff_mpeg4_decode_partitions(MpegEncContext *s)
3646 const int part_a_error= s->pict_type==FF_I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR;
3647 const int part_a_end = s->pict_type==FF_I_TYPE ? (DC_END |MV_END) : MV_END;
3649 mb_num= mpeg4_decode_partition_a(s);
3651 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3655 if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
3656 av_log(s->avctx, AV_LOG_ERROR, "slice below monitor ...\n");
3657 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3661 s->mb_num_left= mb_num;
3663 if(s->pict_type==FF_I_TYPE){
3664 while(show_bits(&s->gb, 9) == 1)
3665 skip_bits(&s->gb, 9);
3666 if(get_bits_long(&s->gb, 19)!=DC_MARKER){
3667 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
3671 while(show_bits(&s->gb, 10) == 1)
3672 skip_bits(&s->gb, 10);
3673 if(get_bits(&s->gb, 17)!=MOTION_MARKER){
3674 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
3678 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end);
3680 if( mpeg4_decode_partition_b(s, mb_num) < 0){
3681 if(s->pict_type==FF_P_TYPE)
3682 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR);
3685 if(s->pict_type==FF_P_TYPE)
3686 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END);
3693 * decode partition C of one MB.
3694 * @return <0 if an error occurred
3696 static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64])
3699 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3701 mb_type= s->current_picture.mb_type[xy];
3702 cbp = s->cbp_table[xy];
3704 s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold;
3706 if(s->current_picture.qscale_table[xy] != s->qscale){
3707 ff_set_qscale(s, s->current_picture.qscale_table[xy] );
3710 if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
3713 s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0];
3714 s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1];
3716 s->mb_intra = IS_INTRA(mb_type);
3718 if (IS_SKIP(mb_type)) {
3721 s->block_last_index[i] = -1;
3722 s->mv_dir = MV_DIR_FORWARD;
3723 s->mv_type = MV_TYPE_16X16;
3724 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3731 }else if(s->mb_intra){
3732 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3733 }else if(!s->mb_intra){
3734 // s->mcsel= 0; //FIXME do we need to init that
3736 s->mv_dir = MV_DIR_FORWARD;
3737 if (IS_8X8(mb_type)) {
3738 s->mv_type = MV_TYPE_8X8;
3740 s->mv_type = MV_TYPE_16X16;
3743 } else { /* I-Frame */
3745 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3748 if (!IS_SKIP(mb_type)) {
3750 s->dsp.clear_blocks(s->block[0]);
3751 /* decode each block */
3752 for (i = 0; i < 6; i++) {
3753 if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){
3754 av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra);
3761 /* per-MB end of slice check */
3763 if(--s->mb_num_left <= 0){
3764 //printf("%06X %d\n", show_bits(&s->gb, 24), get_bits_left(&s->gb));
3765 if(mpeg4_is_resync(s))
3770 if(mpeg4_is_resync(s)){
3771 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
3772 if(s->cbp_table[xy+delta])
3780 * read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :)
3782 static void preview_obmc(MpegEncContext *s){
3783 GetBitContext gb= s->gb;
3785 int cbpc, i, pred_x, pred_y, mx, my;
3787 const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
3788 const int stride= s->b8_stride*2;
3791 s->block_index[i]+= 2;
3793 s->block_index[i]+= 1;
3796 assert(s->pict_type == FF_P_TYPE);
3799 if (get_bits1(&s->gb)) {
3801 mot_val = s->current_picture.motion_val[0][ s->block_index[0] ];
3802 mot_val[0 ]= mot_val[2 ]=
3803 mot_val[0+stride]= mot_val[2+stride]= 0;
3804 mot_val[1 ]= mot_val[3 ]=
3805 mot_val[1+stride]= mot_val[3+stride]= 0;
3807 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3810 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3814 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3816 get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3818 if(s->modified_quant){
3819 if(get_bits1(&s->gb)) skip_bits(&s->gb, 1);
3820 else skip_bits(&s->gb, 5);
3822 skip_bits(&s->gb, 2);
3825 if ((cbpc & 16) == 0) {
3826 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3827 /* 16x16 motion prediction */
3828 mot_val= h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3830 mx = h263p_decode_umotion(s, pred_x);
3832 mx = h263_decode_motion(s, pred_x, 1);
3835 my = h263p_decode_umotion(s, pred_y);
3837 my = h263_decode_motion(s, pred_y, 1);
3839 mot_val[0 ]= mot_val[2 ]=
3840 mot_val[0+stride]= mot_val[2+stride]= mx;
3841 mot_val[1 ]= mot_val[3 ]=
3842 mot_val[1+stride]= mot_val[3+stride]= my;
3844 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3846 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3848 mx = h263p_decode_umotion(s, pred_x);
3850 mx = h263_decode_motion(s, pred_x, 1);
3853 my = h263p_decode_umotion(s, pred_y);
3855 my = h263_decode_motion(s, pred_y, 1);
3856 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3857 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3866 s->block_index[i]-= 2;
3868 s->block_index[i]-= 1;
3874 static void h263_decode_dquant(MpegEncContext *s){
3875 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3877 if(s->modified_quant){
3878 if(get_bits1(&s->gb))
3879 s->qscale= modified_quant_tab[get_bits1(&s->gb)][ s->qscale ];
3881 s->qscale= get_bits(&s->gb, 5);
3883 s->qscale += quant_tab[get_bits(&s->gb, 2)];
3884 ff_set_qscale(s, s->qscale);
3887 static int h263_skip_b_part(MpegEncContext *s, int cbp)
3889 DECLARE_ALIGNED(16, DCTELEM, dblock[64]);
3892 /* we have to set s->mb_intra to zero to decode B-part of PB-frame correctly
3893 * but real value should be restored in order to be used later (in OBMC condition)
3897 for (i = 0; i < 6; i++) {
3898 if (h263_decode_block(s, dblock, i, cbp&32) < 0)
3906 static int h263_get_modb(GetBitContext *gb, int pb_frame, int *cbpb)
3910 if (pb_frame < 3) { // h.263 Annex G and i263 PB-frame
3912 if (pb_frame == 2 && c)
3913 mv = !get_bits1(gb);
3914 } else { // h.263 Annex M improved PB-frame
3915 mv = get_unary(gb, 0, 4) + 1;
3920 *cbpb = get_bits(gb, 6);
3924 int ff_h263_decode_mb(MpegEncContext *s,
3925 DCTELEM block[6][64])
3927 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
3929 const int xy= s->mb_x + s->mb_y * s->mb_stride;
3930 int cbpb = 0, pb_mv_count = 0;
3932 assert(!s->h263_pred);
3934 if (s->pict_type == FF_P_TYPE) {
3936 if (get_bits1(&s->gb)) {
3940 s->block_last_index[i] = -1;
3941 s->mv_dir = MV_DIR_FORWARD;
3942 s->mv_type = MV_TYPE_16X16;
3943 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3946 s->mb_skipped = !(s->obmc | s->loop_filter);
3949 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3950 //fprintf(stderr, "\tCBPC: %d", cbpc);
3952 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
3957 s->dsp.clear_blocks(s->block[0]);
3960 s->mb_intra = ((cbpc & 4) != 0);
3961 if (s->mb_intra) goto intra;
3963 if(s->pb_frame && get_bits1(&s->gb))
3964 pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb);
3965 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3967 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
3970 cbp = (cbpc & 3) | (cbpy << 2);
3972 h263_decode_dquant(s);
3975 s->mv_dir = MV_DIR_FORWARD;
3976 if ((cbpc & 16) == 0) {
3977 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3978 /* 16x16 motion prediction */
3979 s->mv_type = MV_TYPE_16X16;
3980 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3982 mx = h263p_decode_umotion(s, pred_x);
3984 mx = h263_decode_motion(s, pred_x, 1);
3990 my = h263p_decode_umotion(s, pred_y);
3992 my = h263_decode_motion(s, pred_y, 1);
3996 s->mv[0][0][0] = mx;
3997 s->mv[0][0][1] = my;
3999 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
4000 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
4002 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
4003 s->mv_type = MV_TYPE_8X8;
4005 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
4007 mx = h263p_decode_umotion(s, pred_x);
4009 mx = h263_decode_motion(s, pred_x, 1);
4014 my = h263p_decode_umotion(s, pred_y);
4016 my = h263_decode_motion(s, pred_y, 1);
4019 s->mv[0][i][0] = mx;
4020 s->mv[0][i][1] = my;
4021 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
4022 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
4027 } else if(s->pict_type==FF_B_TYPE) {
4029 const int stride= s->b8_stride;
4030 int16_t *mot_val0 = s->current_picture.motion_val[0][ 2*(s->mb_x + s->mb_y*stride) ];
4031 int16_t *mot_val1 = s->current_picture.motion_val[1][ 2*(s->mb_x + s->mb_y*stride) ];
4032 // const int mv_xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
4035 mot_val0[0 ]= mot_val0[2 ]= mot_val0[0+2*stride]= mot_val0[2+2*stride]=
4036 mot_val0[1 ]= mot_val0[3 ]= mot_val0[1+2*stride]= mot_val0[3+2*stride]=
4037 mot_val1[0 ]= mot_val1[2 ]= mot_val1[0+2*stride]= mot_val1[2+2*stride]=
4038 mot_val1[1 ]= mot_val1[3 ]= mot_val1[1+2*stride]= mot_val1[3+2*stride]= 0;
4041 mb_type= get_vlc2(&s->gb, h263_mbtype_b_vlc.table, H263_MBTYPE_B_VLC_BITS, 2);
4043 av_log(s->avctx, AV_LOG_ERROR, "b mb_type damaged at %d %d\n", s->mb_x, s->mb_y);
4047 mb_type= h263_mb_type_b_map[ mb_type ];
4050 s->mb_intra = IS_INTRA(mb_type);
4051 if(HAS_CBP(mb_type)){
4052 s->dsp.clear_blocks(s->block[0]);
4053 cbpc = get_vlc2(&s->gb, cbpc_b_vlc.table, CBPC_B_VLC_BITS, 1);
4055 dquant = IS_QUANT(mb_type);
4059 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4062 av_log(s->avctx, AV_LOG_ERROR, "b cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4066 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
4069 cbp = (cbpc & 3) | (cbpy << 2);
4073 assert(!s->mb_intra);
4075 if(IS_QUANT(mb_type)){
4076 h263_decode_dquant(s);
4079 if(IS_DIRECT(mb_type)){
4080 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4081 mb_type |= ff_mpeg4_set_direct_mv(s, 0, 0);
4084 s->mv_type= MV_TYPE_16X16;
4087 if(USES_LIST(mb_type, 0)){
4088 int16_t *mot_val= h263_pred_motion(s, 0, 0, &mx, &my);
4089 s->mv_dir = MV_DIR_FORWARD;
4091 mx = h263_decode_motion(s, mx, 1);
4092 my = h263_decode_motion(s, my, 1);
4094 s->mv[0][0][0] = mx;
4095 s->mv[0][0][1] = my;
4096 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
4097 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
4100 if(USES_LIST(mb_type, 1)){
4101 int16_t *mot_val= h263_pred_motion(s, 0, 1, &mx, &my);
4102 s->mv_dir |= MV_DIR_BACKWARD;
4104 mx = h263_decode_motion(s, mx, 1);
4105 my = h263_decode_motion(s, my, 1);
4107 s->mv[1][0][0] = mx;
4108 s->mv[1][0][1] = my;
4109 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
4110 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
4114 s->current_picture.mb_type[xy]= mb_type;
4115 } else { /* I-Frame */
4117 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
4119 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4124 s->dsp.clear_blocks(s->block[0]);
4129 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
4131 s->ac_pred = get_bits1(&s->gb);
4133 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
4135 s->h263_aic_dir = get_bits1(&s->gb);
4140 if(s->pb_frame && get_bits1(&s->gb))
4141 pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb);
4142 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4144 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4147 cbp = (cbpc & 3) | (cbpy << 2);
4149 h263_decode_dquant(s);
4152 pb_mv_count += !!s->pb_frame;
4155 while(pb_mv_count--){
4156 h263_decode_motion(s, 0, 1);
4157 h263_decode_motion(s, 0, 1);
4160 /* decode each block */
4161 for (i = 0; i < 6; i++) {
4162 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
4167 if(s->pb_frame && h263_skip_b_part(s, cbpb) < 0)
4169 if(s->obmc && !s->mb_intra){
4170 if(s->pict_type == FF_P_TYPE && s->mb_x+1<s->mb_width && s->mb_num_left != 1)
4175 /* per-MB end of slice check */
4177 int v= show_bits(&s->gb, 16);
4179 if(get_bits_count(&s->gb) + 16 > s->gb.size_in_bits){
4180 v>>= get_bits_count(&s->gb) + 16 - s->gb.size_in_bits;
4190 int ff_mpeg4_decode_mb(MpegEncContext *s,
4191 DCTELEM block[6][64])
4193 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
4195 static int8_t quant_tab[4] = { -1, -2, 1, 2 };
4196 const int xy= s->mb_x + s->mb_y * s->mb_stride;
4198 assert(s->h263_pred);
4200 if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
4202 if (get_bits1(&s->gb)) {
4206 s->block_last_index[i] = -1;
4207 s->mv_dir = MV_DIR_FORWARD;
4208 s->mv_type = MV_TYPE_16X16;
4209 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
4210 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
4212 s->mv[0][0][0]= get_amv(s, 0);
4213 s->mv[0][0][1]= get_amv(s, 1);
4217 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4225 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
4226 //fprintf(stderr, "\tCBPC: %d", cbpc);
4228 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4233 s->dsp.clear_blocks(s->block[0]);
4235 s->mb_intra = ((cbpc & 4) != 0);
4236 if (s->mb_intra) goto intra;
4238 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
4239 s->mcsel= get_bits1(&s->gb);
4241 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1) ^ 0x0F;
4243 cbp = (cbpc & 3) | (cbpy << 2);
4245 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
4247 if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE)))
4248 s->interlaced_dct= get_bits1(&s->gb);
4250 s->mv_dir = MV_DIR_FORWARD;
4251 if ((cbpc & 16) == 0) {
4253 s->current_picture.mb_type[xy]= MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
4254 /* 16x16 global motion prediction */
4255 s->mv_type = MV_TYPE_16X16;
4258 s->mv[0][0][0] = mx;
4259 s->mv[0][0][1] = my;
4260 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
4261 s->current_picture.mb_type[xy]= MB_TYPE_16x8 | MB_TYPE_L0 | MB_TYPE_INTERLACED;
4262 /* 16x8 field motion prediction */
4263 s->mv_type= MV_TYPE_FIELD;
4265 s->field_select[0][0]= get_bits1(&s->gb);
4266 s->field_select[0][1]= get_bits1(&s->gb);
4268 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4271 mx = h263_decode_motion(s, pred_x, s->f_code);
4275 my = h263_decode_motion(s, pred_y/2, s->f_code);
4279 s->mv[0][i][0] = mx;
4280 s->mv[0][i][1] = my;
4283 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
4284 /* 16x16 motion prediction */
4285 s->mv_type = MV_TYPE_16X16;
4286 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4287 mx = h263_decode_motion(s, pred_x, s->f_code);
4292 my = h263_decode_motion(s, pred_y, s->f_code);
4296 s->mv[0][0][0] = mx;
4297 s->mv[0][0][1] = my;
4300 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
4301 s->mv_type = MV_TYPE_8X8;
4303 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
4304 mx = h263_decode_motion(s, pred_x, s->f_code);
4308 my = h263_decode_motion(s, pred_y, s->f_code);
4311 s->mv[0][i][0] = mx;
4312 s->mv[0][i][1] = my;
4317 } else if(s->pict_type==FF_B_TYPE) {
4318 int modb1; // first bit of modb
4319 int modb2; // second bit of modb
4322 s->mb_intra = 0; //B-frames never contain intra blocks
4323 s->mcsel=0; // ... true gmc blocks
4327 s->last_mv[i][0][0]=
4328 s->last_mv[i][0][1]=
4329 s->last_mv[i][1][0]=
4330 s->last_mv[i][1][1]= 0;
4334 /* if we skipped it in the future P Frame than skip it now too */
4335 s->mb_skipped= s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]; // Note, skiptab=0 if last was GMC
4340 s->block_last_index[i] = -1;
4342 s->mv_dir = MV_DIR_FORWARD;
4343 s->mv_type = MV_TYPE_16X16;
4348 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4352 modb1= get_bits1(&s->gb);
4354 mb_type= MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1; //like MB_TYPE_B_DIRECT but no vectors coded
4357 modb2= get_bits1(&s->gb);
4358 mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
4360 av_log(s->avctx, AV_LOG_ERROR, "illegal MB_type\n");
4363 mb_type= mb_type_b_map[ mb_type ];
4366 s->dsp.clear_blocks(s->block[0]);
4367 cbp= get_bits(&s->gb, 6);
4370 if ((!IS_DIRECT(mb_type)) && cbp) {
4371 if(get_bits1(&s->gb)){
4372 ff_set_qscale(s, s->qscale + get_bits1(&s->gb)*4 - 2);
4376 if(!s->progressive_sequence){
4378 s->interlaced_dct= get_bits1(&s->gb);
4380 if(!IS_DIRECT(mb_type) && get_bits1(&s->gb)){
4381 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
4382 mb_type &= ~MB_TYPE_16x16;
4384 if(USES_LIST(mb_type, 0)){
4385 s->field_select[0][0]= get_bits1(&s->gb);
4386 s->field_select[0][1]= get_bits1(&s->gb);
4388 if(USES_LIST(mb_type, 1)){
4389 s->field_select[1][0]= get_bits1(&s->gb);
4390 s->field_select[1][1]= get_bits1(&s->gb);
4396 if((mb_type & (MB_TYPE_DIRECT2|MB_TYPE_INTERLACED)) == 0){
4397 s->mv_type= MV_TYPE_16X16;
4399 if(USES_LIST(mb_type, 0)){
4400 s->mv_dir = MV_DIR_FORWARD;
4402 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
4403 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
4404 s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
4405 s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
4408 if(USES_LIST(mb_type, 1)){
4409 s->mv_dir |= MV_DIR_BACKWARD;
4411 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
4412 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
4413 s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
4414 s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
4416 }else if(!IS_DIRECT(mb_type)){
4417 s->mv_type= MV_TYPE_FIELD;
4419 if(USES_LIST(mb_type, 0)){
4420 s->mv_dir = MV_DIR_FORWARD;
4423 mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code);
4424 my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
4425 s->last_mv[0][i][0]= s->mv[0][i][0] = mx;
4426 s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
4430 if(USES_LIST(mb_type, 1)){
4431 s->mv_dir |= MV_DIR_BACKWARD;
4434 mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code);
4435 my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
4436 s->last_mv[1][i][0]= s->mv[1][i][0] = mx;
4437 s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
4443 if(IS_DIRECT(mb_type)){
4444 if(IS_SKIP(mb_type))
4447 mx = h263_decode_motion(s, 0, 1);
4448 my = h263_decode_motion(s, 0, 1);
4451 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4452 mb_type |= ff_mpeg4_set_direct_mv(s, mx, my);
4454 s->current_picture.mb_type[xy]= mb_type;
4455 } else { /* I-Frame */
4457 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
4459 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4467 s->ac_pred = get_bits1(&s->gb);
4469 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
4471 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
4473 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4475 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4478 cbp = (cbpc & 3) | (cbpy << 2);
4480 s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold;
4483 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
4486 if(!s->progressive_sequence)
4487 s->interlaced_dct= get_bits1(&s->gb);
4489 s->dsp.clear_blocks(s->block[0]);
4490 /* decode each block */
4491 for (i = 0; i < 6; i++) {
4492 if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0)
4499 /* decode each block */
4500 for (i = 0; i < 6; i++) {
4501 if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0)
4507 /* per-MB end of slice check */
4508 if(s->codec_id==CODEC_ID_MPEG4){
4509 if(mpeg4_is_resync(s)){
4510 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
4511 if(s->pict_type==FF_B_TYPE && s->next_picture.mbskip_table[xy + delta])
4520 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
4522 int code, val, sign, shift, l;
4523 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
4530 sign = get_bits1(&s->gb);
4534 val = (val - 1) << shift;
4535 val |= get_bits(&s->gb, shift);
4542 /* modulo decoding */
4543 if (!s->h263_long_vectors) {
4544 l = INT_BIT - 5 - f_code;
4547 /* horrible h263 long vector mode */
4548 if (pred < -31 && val < -63)
4550 if (pred > 32 && val > 63)
4557 /* Decodes RVLC of H.263+ UMV */
4558 static int h263p_decode_umotion(MpegEncContext * s, int pred)
4562 if (get_bits1(&s->gb)) /* Motion difference = 0 */
4565 code = 2 + get_bits1(&s->gb);
4567 while (get_bits1(&s->gb))
4570 code += get_bits1(&s->gb);
4575 code = (sign) ? (pred - code) : (pred + code);
4576 dprintf(s->avctx,"H.263+ UMV Motion = %d\n", code);
4581 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
4584 int code, level, i, j, last, run;
4585 RLTable *rl = &rl_inter;
4586 const uint8_t *scan_table;
4587 GetBitContext gb= s->gb;
4589 scan_table = s->intra_scantable.permutated;
4590 if (s->h263_aic && s->mb_intra) {
4594 if (s->h263_aic_dir)
4595 scan_table = s->intra_v_scantable.permutated; /* left */
4597 scan_table = s->intra_h_scantable.permutated; /* top */
4599 } else if (s->mb_intra) {
4601 if(s->codec_id == CODEC_ID_RV10){
4602 #if CONFIG_RV10_DECODER
4603 if (s->rv10_version == 3 && s->pict_type == FF_I_TYPE) {
4604 int component, diff;
4605 component = (n <= 3 ? 0 : n - 4 + 1);
4606 level = s->last_dc[component];
4607 if (s->rv10_first_dc_coded[component]) {
4608 diff = rv_decode_dc(s, n);
4612 level = level & 0xff; /* handle wrap round */
4613 s->last_dc[component] = level;
4615 s->rv10_first_dc_coded[component] = 1;
4618 level = get_bits(&s->gb, 8);
4624 level = get_bits(&s->gb, 8);
4625 if((level&0x7F) == 0){
4626 av_log(s->avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y);
4627 if(s->error_recognition >= FF_ER_COMPLIANT)
4639 if (s->mb_intra && s->h263_aic)
4641 s->block_last_index[n] = i - 1;
4646 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
4648 av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
4651 if (code == rl->n) {
4653 if (s->h263_flv > 1) {
4654 int is11 = get_bits1(&s->gb);
4655 last = get_bits1(&s->gb);
4656 run = get_bits(&s->gb, 6);
4658 level = get_sbits(&s->gb, 11);
4660 level = get_sbits(&s->gb, 7);
4663 last = get_bits1(&s->gb);
4664 run = get_bits(&s->gb, 6);
4665 level = (int8_t)get_bits(&s->gb, 8);
4667 if (s->codec_id == CODEC_ID_RV10) {
4668 /* XXX: should patch encoder too */
4669 level = get_sbits(&s->gb, 12);
4671 level = get_bits(&s->gb, 5);
4672 level |= get_sbits(&s->gb, 6)<<5;
4677 run = rl->table_run[code];
4678 level = rl->table_level[code];
4679 last = code >= rl->last;
4680 if (get_bits1(&s->gb))
4685 if(s->alt_inter_vlc && rl == &rl_inter && !s->mb_intra){
4686 //Looks like a hack but no, it's the way it is supposed to work ...
4690 s->dsp.clear_block(block);
4693 av_log(s->avctx, AV_LOG_ERROR, "run overflow at %dx%d i:%d\n", s->mb_x, s->mb_y, s->mb_intra);
4703 if (s->mb_intra && s->h263_aic) {
4704 h263_pred_acdc(s, block, n);
4707 s->block_last_index[n] = i;
4712 * decodes the dc value.
4713 * @param n block index (0-3 are luma, 4-5 are chroma)
4714 * @param dir_ptr the prediction direction will be stored here
4715 * @return the quantized dc
4717 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
4722 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
4724 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
4725 if (code < 0 || code > 9 /* && s->nbit<9 */){
4726 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
4734 level= 2*get_bits1(&s->gb)-1;
4736 if(get_bits1(&s->gb))
4737 level = get_bits(&s->gb, code-1) + (1<<(code-1));
4739 level = -get_bits(&s->gb, code-1) - (1<<(code-1));
4742 level = get_xbits(&s->gb, code);
4746 if(get_bits1(&s->gb)==0){ /* marker */
4747 if(s->error_recognition>=2){
4748 av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n");
4755 return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0);
4760 * @return <0 if an error occurred
4762 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
4763 int n, int coded, int intra, int rvlc)
4765 int level, i, last, run;
4768 RL_VLC_ELEM * rl_vlc;
4769 const uint8_t * scan_table;
4772 //Note intra & rvlc should be optimized away if this is inlined
4775 if(s->use_intra_dc_vlc){
4777 if(s->partitioned_frame){
4778 level = s->dc_val[0][ s->block_index[n] ];
4779 if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale);
4780 else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale);
4781 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32;
4783 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
4791 ff_mpeg4_pred_dc(s, n, 0, &dc_pred_dir, 0);
4797 rl = &rvlc_rl_intra;
4798 rl_vlc = rvlc_rl_intra.rl_vlc[0];
4801 rl_vlc = rl_intra.rl_vlc[0];
4804 if (dc_pred_dir == 0)
4805 scan_table = s->intra_v_scantable.permutated; /* left */
4807 scan_table = s->intra_h_scantable.permutated; /* top */
4809 scan_table = s->intra_scantable.permutated;
4816 s->block_last_index[n] = i;
4819 if(rvlc) rl = &rvlc_rl_inter;
4820 else rl = &rl_inter;
4822 scan_table = s->intra_scantable.permutated;
4828 rl_vlc = rvlc_rl_inter.rl_vlc[0];
4830 rl_vlc = rl_inter.rl_vlc[0];
4833 qmul = s->qscale << 1;
4834 qadd = (s->qscale - 1) | 1;
4836 rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale];
4838 rl_vlc = rl_inter.rl_vlc[s->qscale];
4843 OPEN_READER(re, &s->gb);
4845 UPDATE_CACHE(re, &s->gb);
4846 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
4850 if(SHOW_UBITS(re, &s->gb, 1)==0){
4851 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n");
4853 }; SKIP_CACHE(re, &s->gb, 1);
4855 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4856 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4857 SKIP_COUNTER(re, &s->gb, 1+1+6);
4858 UPDATE_CACHE(re, &s->gb);
4860 if(SHOW_UBITS(re, &s->gb, 1)==0){
4861 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n");
4863 }; SKIP_CACHE(re, &s->gb, 1);
4865 level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11);
4867 if(SHOW_UBITS(re, &s->gb, 5)!=0x10){
4868 av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n");
4870 }; SKIP_CACHE(re, &s->gb, 5);
4872 level= level * qmul + qadd;
4873 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1);
4874 SKIP_COUNTER(re, &s->gb, 1+11+5+1);
4880 cache= GET_CACHE(re, &s->gb);
4883 cache ^= 0xC0000000;
4885 if (cache&0x80000000) {
4886 if (cache&0x40000000) {
4888 SKIP_CACHE(re, &s->gb, 2);
4889 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4890 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4891 SKIP_COUNTER(re, &s->gb, 2+1+6);
4892 UPDATE_CACHE(re, &s->gb);
4895 level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12);
4897 if(SHOW_UBITS(re, &s->gb, 1)==0){
4898 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n");
4900 }; SKIP_CACHE(re, &s->gb, 1);
4902 level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
4904 if(SHOW_UBITS(re, &s->gb, 1)==0){
4905 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n");
4907 }; LAST_SKIP_CACHE(re, &s->gb, 1);
4909 SKIP_COUNTER(re, &s->gb, 1+12+1);
4913 if(s->error_recognition >= FF_ER_COMPLIANT){
4914 const int abs_level= FFABS(level);
4915 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
4916 const int run1= run - rl->max_run[last][abs_level] - 1;
4917 if(abs_level <= rl->max_level[last][run]){
4918 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
4921 if(s->error_recognition > FF_ER_COMPLIANT){
4922 if(abs_level <= rl->max_level[last][run]*2){
4923 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n");
4926 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
4927 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n");
4934 if (level>0) level= level * qmul + qadd;
4935 else level= level * qmul - qadd;
4937 if((unsigned)(level + 2048) > 4095){
4938 if(s->error_recognition > FF_ER_COMPLIANT){
4939 if(level > 2560 || level<-2560){
4940 av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
4944 level= level<0 ? -2048 : 2047;
4951 #if MIN_CACHE_BITS < 20
4952 LAST_SKIP_BITS(re, &s->gb, 2);
4953 UPDATE_CACHE(re, &s->gb);
4955 SKIP_BITS(re, &s->gb, 2);
4957 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
4958 i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing
4959 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4960 LAST_SKIP_BITS(re, &s->gb, 1);
4964 #if MIN_CACHE_BITS < 19
4965 LAST_SKIP_BITS(re, &s->gb, 1);
4966 UPDATE_CACHE(re, &s->gb);
4968 SKIP_BITS(re, &s->gb, 1);
4970 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
4972 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
4973 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4974 LAST_SKIP_BITS(re, &s->gb, 1);
4979 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4980 LAST_SKIP_BITS(re, &s->gb, 1);
4985 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
4989 block[scan_table[i]] = level;
4993 block[scan_table[i]] = level;
4995 CLOSE_READER(re, &s->gb);
4999 if(!s->use_intra_dc_vlc){
5000 block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0);
5002 i -= i>>31; //if(i == -1) i=0;
5005 mpeg4_pred_ac(s, block, n, dc_pred_dir);
5007 i = 63; /* XXX: not optimal */
5010 s->block_last_index[n] = i;
5014 /* most is hardcoded. should extend to handle all h263 streams */
5015 int h263_decode_picture_header(MpegEncContext *s)
5017 int format, width, height, i;
5020 align_get_bits(&s->gb);
5022 startcode= get_bits(&s->gb, 22-8);
5024 for(i= get_bits_left(&s->gb); i>24; i-=8) {
5025 startcode = ((startcode << 8) | get_bits(&s->gb, 8)) & 0x003FFFFF;
5027 if(startcode == 0x20)
5031 if (startcode != 0x20) {
5032 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
5035 /* temporal reference */
5036 i = get_bits(&s->gb, 8); /* picture timestamp */
5037 if( (s->picture_number&~0xFF)+i < s->picture_number)
5039 s->current_picture_ptr->pts=
5040 s->picture_number= (s->picture_number&~0xFF) + i;
5042 /* PTYPE starts here */
5043 if (get_bits1(&s->gb) != 1) {
5045 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
5048 if (get_bits1(&s->gb) != 0) {
5049 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
5050 return -1; /* h263 id */
5052 skip_bits1(&s->gb); /* split screen off */
5053 skip_bits1(&s->gb); /* camera off */
5054 skip_bits1(&s->gb); /* freeze picture release off */
5056 format = get_bits(&s->gb, 3);
5061 7 extended PTYPE (PLUSPTYPE)
5064 if (format != 7 && format != 6) {
5067 width = h263_format[format][0];
5068 height = h263_format[format][1];
5072 s->pict_type = FF_I_TYPE + get_bits1(&s->gb);
5074 s->h263_long_vectors = get_bits1(&s->gb);
5076 if (get_bits1(&s->gb) != 0) {
5077 av_log(s->avctx, AV_LOG_ERROR, "H263 SAC not supported\n");
5078 return -1; /* SAC: off */
5080 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
5081 s->unrestricted_mv = s->h263_long_vectors || s->obmc;
5083 s->pb_frame = get_bits1(&s->gb);
5084 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
5085 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
5089 s->avctx->sample_aspect_ratio= (AVRational){12,11};
5090 s->avctx->time_base= (AVRational){1001, 30000};
5096 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
5098 /* ufep other than 0 and 1 are reserved */
5101 format = get_bits(&s->gb, 3);
5102 dprintf(s->avctx, "ufep=1, format: %d\n", format);
5103 s->custom_pcf= get_bits1(&s->gb);
5104 s->umvplus = get_bits1(&s->gb); /* Unrestricted Motion Vector */
5105 if (get_bits1(&s->gb) != 0) {
5106 av_log(s->avctx, AV_LOG_ERROR, "Syntax-based Arithmetic Coding (SAC) not supported\n");
5108 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
5109 s->h263_aic = get_bits1(&s->gb); /* Advanced Intra Coding (AIC) */
5110 s->loop_filter= get_bits1(&s->gb);
5111 s->unrestricted_mv = s->umvplus || s->obmc || s->loop_filter;
5113 s->h263_slice_structured= get_bits1(&s->gb);
5114 if (get_bits1(&s->gb) != 0) {
5115 av_log(s->avctx, AV_LOG_ERROR, "Reference Picture Selection not supported\n");
5117 if (get_bits1(&s->gb) != 0) {
5118 av_log(s->avctx, AV_LOG_ERROR, "Independent Segment Decoding not supported\n");
5120 s->alt_inter_vlc= get_bits1(&s->gb);
5121 s->modified_quant= get_bits1(&s->gb);
5122 if(s->modified_quant)
5123 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
5125 skip_bits(&s->gb, 1); /* Prevent start code emulation */
5127 skip_bits(&s->gb, 3); /* Reserved */
5128 } else if (ufep != 0) {
5129 av_log(s->avctx, AV_LOG_ERROR, "Bad UFEP type (%d)\n", ufep);
5134 s->pict_type = get_bits(&s->gb, 3);
5135 switch(s->pict_type){
5136 case 0: s->pict_type= FF_I_TYPE;break;
5137 case 1: s->pict_type= FF_P_TYPE;break;
5138 case 2: s->pict_type= FF_P_TYPE;s->pb_frame = 3;break;
5139 case 3: s->pict_type= FF_B_TYPE;break;
5140 case 7: s->pict_type= FF_I_TYPE;break; //ZYGO
5144 skip_bits(&s->gb, 2);
5145 s->no_rounding = get_bits1(&s->gb);
5146 skip_bits(&s->gb, 4);
5148 /* Get the picture dimensions */
5151 /* Custom Picture Format (CPFMT) */
5152 s->aspect_ratio_info = get_bits(&s->gb, 4);
5153 dprintf(s->avctx, "aspect: %d\n", s->aspect_ratio_info);
5158 3 - 10:11 (525-type 4:3)
5159 4 - 16:11 (CIF 16:9)
5160 5 - 40:33 (525-type 16:9)
5163 width = (get_bits(&s->gb, 9) + 1) * 4;
5165 height = get_bits(&s->gb, 9) * 4;
5166 dprintf(s->avctx, "\nH.263+ Custom picture: %dx%d\n",width,height);
5167 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
5168 /* aspected dimensions */
5169 s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 8);
5170 s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 8);
5172 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
5175 width = h263_format[format][0];
5176 height = h263_format[format][1];
5177 s->avctx->sample_aspect_ratio= (AVRational){12,11};
5179 if ((width == 0) || (height == 0))
5186 s->avctx->time_base.den= 1800000;
5187 s->avctx->time_base.num= 1000 + get_bits1(&s->gb);
5188 s->avctx->time_base.num*= get_bits(&s->gb, 7);
5189 if(s->avctx->time_base.num == 0){
5190 av_log(s, AV_LOG_ERROR, "zero framerate\n");
5193 gcd= av_gcd(s->avctx->time_base.den, s->avctx->time_base.num);
5194 s->avctx->time_base.den /= gcd;
5195 s->avctx->time_base.num /= gcd;
5196 // av_log(s->avctx, AV_LOG_DEBUG, "%d/%d\n", s->avctx->time_base.den, s->avctx->time_base.num);
5198 s->avctx->time_base= (AVRational){1001, 30000};
5203 skip_bits(&s->gb, 2); //extended Temporal reference
5208 if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
5211 if(s->h263_slice_structured){
5212 if (get_bits1(&s->gb) != 0) {
5213 av_log(s->avctx, AV_LOG_ERROR, "rectangular slices not supported\n");
5215 if (get_bits1(&s->gb) != 0) {
5216 av_log(s->avctx, AV_LOG_ERROR, "unordered slices not supported\n");
5221 s->qscale = get_bits(&s->gb, 5);
5224 s->mb_width = (s->width + 15) / 16;
5225 s->mb_height = (s->height + 15) / 16;
5226 s->mb_num = s->mb_width * s->mb_height;
5229 skip_bits(&s->gb, 3); /* Temporal reference for B-pictures */
5231 skip_bits(&s->gb, 2); //extended Temporal reference
5232 skip_bits(&s->gb, 2); /* Quantization information for B-pictures */
5236 while (get_bits1(&s->gb) != 0) {
5237 skip_bits(&s->gb, 8);
5240 if(s->h263_slice_structured){
5241 if (get_bits1(&s->gb) != 1) {
5242 av_log(s->avctx, AV_LOG_ERROR, "SEPB1 marker missing\n");
5246 ff_h263_decode_mba(s);
5248 if (get_bits1(&s->gb) != 1) {
5249 av_log(s->avctx, AV_LOG_ERROR, "SEPB2 marker missing\n");
5256 s->y_dc_scale_table=
5257 s->c_dc_scale_table= ff_aic_dc_scale_table;
5259 s->y_dc_scale_table=
5260 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
5263 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
5267 if (s->pict_type == FF_I_TYPE && s->codec_tag == AV_RL32("ZYGO")){
5269 for(i=0; i<85; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
5270 av_log(s->avctx, AV_LOG_DEBUG, "\n");
5271 for(i=0; i<13; i++){
5273 int v= get_bits(&s->gb, 8);
5274 v |= get_sbits(&s->gb, 8)<<8;
5275 av_log(s->avctx, AV_LOG_DEBUG, " %5d", v);
5277 av_log(s->avctx, AV_LOG_DEBUG, "\n");
5279 for(i=0; i<50; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
5286 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb)
5289 int a= 2<<s->sprite_warping_accuracy;
5290 int rho= 3-s->sprite_warping_accuracy;
5292 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
5293 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
5294 int sprite_ref[4][2];
5295 int virtual_ref[2][2];
5297 int alpha=0, beta=0;
5302 for(i=0; i<s->num_sprite_warping_points; i++){
5306 length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);
5308 x= get_xbits(gb, length);
5310 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(gb); /* marker bit */
5312 length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);
5314 y=get_xbits(gb, length);
5316 skip_bits1(gb); /* marker bit */
5317 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
5318 s->sprite_traj[i][0]= d[i][0]= x;
5319 s->sprite_traj[i][1]= d[i][1]= y;
5322 s->sprite_traj[i][0]= s->sprite_traj[i][1]= 0;
5324 while((1<<alpha)<w) alpha++;
5325 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
5329 // Note, the 4th point isn't used for GMC
5330 if(s->divx_version==500 && s->divx_build==413){
5331 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
5332 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
5333 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
5334 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
5335 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
5336 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
5338 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
5339 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
5340 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
5341 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
5342 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
5343 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
5345 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
5346 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
5348 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
5349 // perhaps it should be reordered to be more readable ...
5350 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
5351 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
5352 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
5353 + 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);
5354 virtual_ref[0][1]= 16*vop_ref[0][1]
5355 + 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);
5356 virtual_ref[1][0]= 16*vop_ref[0][0]
5357 + 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);
5358 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
5359 + 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);
5361 switch(s->num_sprite_warping_points)
5364 s->sprite_offset[0][0]= 0;
5365 s->sprite_offset[0][1]= 0;
5366 s->sprite_offset[1][0]= 0;
5367 s->sprite_offset[1][1]= 0;
5368 s->sprite_delta[0][0]= a;
5369 s->sprite_delta[0][1]= 0;
5370 s->sprite_delta[1][0]= 0;
5371 s->sprite_delta[1][1]= a;
5372 s->sprite_shift[0]= 0;
5373 s->sprite_shift[1]= 0;
5376 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
5377 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
5378 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
5379 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
5380 s->sprite_delta[0][0]= a;
5381 s->sprite_delta[0][1]= 0;
5382 s->sprite_delta[1][0]= 0;
5383 s->sprite_delta[1][1]= a;
5384 s->sprite_shift[0]= 0;
5385 s->sprite_shift[1]= 0;
5388 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
5389 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
5390 + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])
5391 + (1<<(alpha+rho-1));
5392 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
5393 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
5394 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])
5395 + (1<<(alpha+rho-1));
5396 s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
5397 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
5398 +2*w2*r*sprite_ref[0][0]
5400 + (1<<(alpha+rho+1)));
5401 s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
5402 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
5403 +2*w2*r*sprite_ref[0][1]
5405 + (1<<(alpha+rho+1)));
5406 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
5407 s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]);
5408 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
5409 s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
5411 s->sprite_shift[0]= alpha+rho;
5412 s->sprite_shift[1]= alpha+rho+2;
5415 min_ab= FFMIN(alpha, beta);
5418 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
5419 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])
5420 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])
5421 + (1<<(alpha+beta+rho-min_ab-1));
5422 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))
5423 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])
5424 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])
5425 + (1<<(alpha+beta+rho-min_ab-1));
5426 s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)
5427 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)
5428 + 2*w2*h3*r*sprite_ref[0][0]
5430 + (1<<(alpha+beta+rho-min_ab+1));
5431 s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)
5432 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)
5433 + 2*w2*h3*r*sprite_ref[0][1]
5435 + (1<<(alpha+beta+rho-min_ab+1));
5436 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;
5437 s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;
5438 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;
5439 s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;
5441 s->sprite_shift[0]= alpha + beta + rho - min_ab;
5442 s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;
5445 /* try to simplify the situation */
5446 if( s->sprite_delta[0][0] == a<<s->sprite_shift[0]
5447 && s->sprite_delta[0][1] == 0
5448 && s->sprite_delta[1][0] == 0
5449 && s->sprite_delta[1][1] == a<<s->sprite_shift[0])
5451 s->sprite_offset[0][0]>>=s->sprite_shift[0];
5452 s->sprite_offset[0][1]>>=s->sprite_shift[0];
5453 s->sprite_offset[1][0]>>=s->sprite_shift[1];
5454 s->sprite_offset[1][1]>>=s->sprite_shift[1];
5455 s->sprite_delta[0][0]= a;
5456 s->sprite_delta[0][1]= 0;
5457 s->sprite_delta[1][0]= 0;
5458 s->sprite_delta[1][1]= a;
5459 s->sprite_shift[0]= 0;
5460 s->sprite_shift[1]= 0;
5461 s->real_sprite_warping_points=1;
5464 int shift_y= 16 - s->sprite_shift[0];
5465 int shift_c= 16 - s->sprite_shift[1];
5466 //printf("shifts %d %d\n", shift_y, shift_c);
5468 s->sprite_offset[0][i]<<= shift_y;
5469 s->sprite_offset[1][i]<<= shift_c;
5470 s->sprite_delta[0][i]<<= shift_y;
5471 s->sprite_delta[1][i]<<= shift_y;
5472 s->sprite_shift[i]= 16;
5474 s->real_sprite_warping_points= s->num_sprite_warping_points;
5477 printf("vop:%d:%d %d:%d %d:%d, sprite:%d:%d %d:%d %d:%d, virtual: %d:%d %d:%d\n",
5478 vop_ref[0][0], vop_ref[0][1],
5479 vop_ref[1][0], vop_ref[1][1],
5480 vop_ref[2][0], vop_ref[2][1],
5481 sprite_ref[0][0], sprite_ref[0][1],
5482 sprite_ref[1][0], sprite_ref[1][1],
5483 sprite_ref[2][0], sprite_ref[2][1],
5484 virtual_ref[0][0], virtual_ref[0][1],
5485 virtual_ref[1][0], virtual_ref[1][1]
5488 printf("offset: %d:%d , delta: %d %d %d %d, shift %d\n",
5489 s->sprite_offset[0][0], s->sprite_offset[0][1],
5490 s->sprite_delta[0][0], s->sprite_delta[0][1],
5491 s->sprite_delta[1][0], s->sprite_delta[1][1],
5497 static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
5498 int hours, minutes, seconds;
5500 hours= get_bits(gb, 5);
5501 minutes= get_bits(gb, 6);
5503 seconds= get_bits(gb, 6);
5505 s->time_base= seconds + 60*(minutes + 60*hours);
5513 static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
5514 int width, height, vo_ver_id;
5517 skip_bits(gb, 1); /* random access */
5518 s->vo_type= get_bits(gb, 8);
5519 if (get_bits1(gb) != 0) { /* is_ol_id */
5520 vo_ver_id = get_bits(gb, 4); /* vo_ver_id */
5521 skip_bits(gb, 3); /* vo_priority */
5525 //printf("vo type:%d\n",s->vo_type);
5526 s->aspect_ratio_info= get_bits(gb, 4);
5527 if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
5528 s->avctx->sample_aspect_ratio.num= get_bits(gb, 8); // par_width
5529 s->avctx->sample_aspect_ratio.den= get_bits(gb, 8); // par_height
5531 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
5534 if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
5535 int chroma_format= get_bits(gb, 2);
5536 if(chroma_format!=CHROMA_420){
5537 av_log(s->avctx, AV_LOG_ERROR, "illegal chroma format\n");
5539 s->low_delay= get_bits1(gb);
5540 if(get_bits1(gb)){ /* vbv parameters */
5541 get_bits(gb, 15); /* first_half_bitrate */
5542 skip_bits1(gb); /* marker */
5543 get_bits(gb, 15); /* latter_half_bitrate */
5544 skip_bits1(gb); /* marker */
5545 get_bits(gb, 15); /* first_half_vbv_buffer_size */
5546 skip_bits1(gb); /* marker */
5547 get_bits(gb, 3); /* latter_half_vbv_buffer_size */
5548 get_bits(gb, 11); /* first_half_vbv_occupancy */
5549 skip_bits1(gb); /* marker */
5550 get_bits(gb, 15); /* latter_half_vbv_occupancy */
5551 skip_bits1(gb); /* marker */
5554 // set low delay flag only once the smartest? low delay detection won't be overriden
5555 if(s->picture_number==0)
5559 s->shape = get_bits(gb, 2); /* vol shape */
5560 if(s->shape != RECT_SHAPE) av_log(s->avctx, AV_LOG_ERROR, "only rectangular vol supported\n");
5561 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
5562 av_log(s->avctx, AV_LOG_ERROR, "Gray shape not supported\n");
5563 skip_bits(gb, 4); //video_object_layer_shape_extension
5566 check_marker(gb, "before time_increment_resolution");
5568 s->avctx->time_base.den = get_bits(gb, 16);
5569 if(!s->avctx->time_base.den){
5570 av_log(s->avctx, AV_LOG_ERROR, "time_base.den==0\n");
5574 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
5575 if (s->time_increment_bits < 1)
5576 s->time_increment_bits = 1;
5578 check_marker(gb, "before fixed_vop_rate");
5580 if (get_bits1(gb) != 0) { /* fixed_vop_rate */
5581 s->avctx->time_base.num = get_bits(gb, s->time_increment_bits);
5583 s->avctx->time_base.num = 1;
5587 if (s->shape != BIN_ONLY_SHAPE) {
5588 if (s->shape == RECT_SHAPE) {
5589 skip_bits1(gb); /* marker */
5590 width = get_bits(gb, 13);
5591 skip_bits1(gb); /* marker */
5592 height = get_bits(gb, 13);
5593 skip_bits1(gb); /* marker */
5594 if(width && height && !(s->width && s->codec_tag == AV_RL32("MP4S"))){ /* they should be non zero but who knows ... */
5597 // printf("width/height: %d %d\n", width, height);
5601 s->progressive_sequence=
5602 s->progressive_frame= get_bits1(gb)^1;
5603 s->interlaced_dct=0;
5604 if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO))
5605 av_log(s->avctx, AV_LOG_INFO, "MPEG4 OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */
5606 if (vo_ver_id == 1) {
5607 s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */
5609 s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */
5611 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "Static Sprites not supported\n");
5612 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
5613 if(s->vol_sprite_usage==STATIC_SPRITE){
5614 s->sprite_width = get_bits(gb, 13);
5615 skip_bits1(gb); /* marker */
5616 s->sprite_height= get_bits(gb, 13);
5617 skip_bits1(gb); /* marker */
5618 s->sprite_left = get_bits(gb, 13);
5619 skip_bits1(gb); /* marker */
5620 s->sprite_top = get_bits(gb, 13);
5621 skip_bits1(gb); /* marker */
5623 s->num_sprite_warping_points= get_bits(gb, 6);
5624 if(s->num_sprite_warping_points > 3){
5625 av_log(s->avctx, AV_LOG_ERROR, "%d sprite_warping_points\n", s->num_sprite_warping_points);
5626 s->num_sprite_warping_points= 0;
5629 s->sprite_warping_accuracy = get_bits(gb, 2);
5630 s->sprite_brightness_change= get_bits1(gb);
5631 if(s->vol_sprite_usage==STATIC_SPRITE)
5632 s->low_latency_sprite= get_bits1(gb);
5634 // FIXME sadct disable bit if verid!=1 && shape not rect
5636 if (get_bits1(gb) == 1) { /* not_8_bit */
5637 s->quant_precision = get_bits(gb, 4); /* quant_precision */
5638 if(get_bits(gb, 4)!=8) av_log(s->avctx, AV_LOG_ERROR, "N-bit not supported\n"); /* bits_per_pixel */
5639 if(s->quant_precision!=5) av_log(s->avctx, AV_LOG_ERROR, "quant precision %d\n", s->quant_precision);
5641 s->quant_precision = 5;
5644 // FIXME a bunch of grayscale shape things
5646 if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */
5649 /* load default matrixes */
5650 for(i=0; i<64; i++){
5651 int j= s->dsp.idct_permutation[i];
5652 v= ff_mpeg4_default_intra_matrix[i];
5653 s->intra_matrix[j]= v;
5654 s->chroma_intra_matrix[j]= v;
5656 v= ff_mpeg4_default_non_intra_matrix[i];
5657 s->inter_matrix[j]= v;
5658 s->chroma_inter_matrix[j]= v;
5661 /* load custom intra matrix */
5664 for(i=0; i<64; i++){
5670 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5671 s->intra_matrix[j]= v;
5672 s->chroma_intra_matrix[j]= v;
5675 /* replicate last value */
5677 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5678 s->intra_matrix[j]= last;
5679 s->chroma_intra_matrix[j]= last;
5683 /* load custom non intra matrix */
5686 for(i=0; i<64; i++){
5692 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5693 s->inter_matrix[j]= v;
5694 s->chroma_inter_matrix[j]= v;
5697 /* replicate last value */
5699 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5700 s->inter_matrix[j]= last;
5701 s->chroma_inter_matrix[j]= last;
5705 // FIXME a bunch of grayscale shape things
5709 s->quarter_sample= get_bits1(gb);
5710 else s->quarter_sample=0;
5713 int pos= get_bits_count(gb);
5714 int estimation_method= get_bits(gb, 2);
5715 if(estimation_method<2){
5717 s->cplx_estimation_trash_i += 8*get_bits1(gb); //opaque
5718 s->cplx_estimation_trash_i += 8*get_bits1(gb); //transparent
5719 s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_cae
5720 s->cplx_estimation_trash_i += 8*get_bits1(gb); //inter_cae
5721 s->cplx_estimation_trash_i += 8*get_bits1(gb); //no_update
5722 s->cplx_estimation_trash_i += 8*get_bits1(gb); //upampling
5725 s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_blocks
5726 s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter_blocks
5727 s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter4v_blocks
5728 s->cplx_estimation_trash_i += 8*get_bits1(gb); //not coded blocks
5730 if(!check_marker(gb, "in complexity estimation part 1")){
5731 skip_bits_long(gb, pos - get_bits_count(gb));
5735 s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_coeffs
5736 s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_lines
5737 s->cplx_estimation_trash_i += 8*get_bits1(gb); //vlc_syms
5738 s->cplx_estimation_trash_i += 4*get_bits1(gb); //vlc_bits
5741 s->cplx_estimation_trash_p += 8*get_bits1(gb); //apm
5742 s->cplx_estimation_trash_p += 8*get_bits1(gb); //npm
5743 s->cplx_estimation_trash_b += 8*get_bits1(gb); //interpolate_mc_q
5744 s->cplx_estimation_trash_p += 8*get_bits1(gb); //forwback_mc_q
5745 s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel2
5746 s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel4
5748 if(!check_marker(gb, "in complexity estimation part 2")){
5749 skip_bits_long(gb, pos - get_bits_count(gb));
5752 if(estimation_method==1){
5753 s->cplx_estimation_trash_i += 8*get_bits1(gb); //sadct
5754 s->cplx_estimation_trash_p += 8*get_bits1(gb); //qpel
5757 av_log(s->avctx, AV_LOG_ERROR, "Invalid Complexity estimation method %d\n", estimation_method);
5760 s->cplx_estimation_trash_i=
5761 s->cplx_estimation_trash_p=
5762 s->cplx_estimation_trash_b= 0;
5765 s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */
5767 s->data_partitioning= get_bits1(gb);
5768 if(s->data_partitioning){
5769 s->rvlc= get_bits1(gb);
5772 if(vo_ver_id != 1) {
5773 s->new_pred= get_bits1(gb);
5775 av_log(s->avctx, AV_LOG_ERROR, "new pred not supported\n");
5776 skip_bits(gb, 2); /* requested upstream message type */
5777 skip_bits1(gb); /* newpred segment type */
5779 s->reduced_res_vop= get_bits1(gb);
5780 if(s->reduced_res_vop) av_log(s->avctx, AV_LOG_ERROR, "reduced resolution VOP not supported\n");
5784 s->reduced_res_vop= 0;
5787 s->scalability= get_bits1(gb);
5789 if (s->scalability) {
5790 GetBitContext bak= *gb;
5792 int ref_layer_sampling_dir;
5793 int h_sampling_factor_n;
5794 int h_sampling_factor_m;
5795 int v_sampling_factor_n;
5796 int v_sampling_factor_m;
5798 s->hierachy_type= get_bits1(gb);
5799 ref_layer_id= get_bits(gb, 4);
5800 ref_layer_sampling_dir= get_bits1(gb);
5801 h_sampling_factor_n= get_bits(gb, 5);
5802 h_sampling_factor_m= get_bits(gb, 5);
5803 v_sampling_factor_n= get_bits(gb, 5);
5804 v_sampling_factor_m= get_bits(gb, 5);
5805 s->enhancement_type= get_bits1(gb);
5807 if( h_sampling_factor_n==0 || h_sampling_factor_m==0
5808 || v_sampling_factor_n==0 || v_sampling_factor_m==0){
5810 // fprintf(stderr, "illegal scalability header (VERY broken encoder), trying to workaround\n");
5815 av_log(s->avctx, AV_LOG_ERROR, "scalability not supported\n");
5817 // bin shape stuff FIXME
5824 * decodes the user data stuff in the header.
5825 * Also initializes divx/xvid/lavc_version/build.
5827 static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
5831 int ver = 0, build = 0, ver2 = 0, ver3 = 0;
5834 for(i=0; i<255 && get_bits_count(gb) < gb->size_in_bits; i++){
5835 if(show_bits(gb, 23) == 0) break;
5836 buf[i]= get_bits(gb, 8);
5840 /* divx detection */
5841 e=sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last);
5843 e=sscanf(buf, "DivX%db%d%c", &ver, &build, &last);
5845 s->divx_version= ver;
5846 s->divx_build= build;
5847 s->divx_packed= e==3 && last=='p';
5848 if(s->divx_packed && !s->showed_packed_warning) {
5849 av_log(s->avctx, AV_LOG_WARNING, "Invalid and inefficient vfw-avi packed B frames detected\n");
5850 s->showed_packed_warning=1;
5854 /* ffmpeg detection */
5855 e=sscanf(buf, "FFmpe%*[^b]b%d", &build)+3;
5857 e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
5859 e=sscanf(buf, "Lavc%d.%d.%d", &ver, &ver2, &ver3)+1;
5861 build= (ver<<16) + (ver2<<8) + ver3;
5864 if(strcmp(buf, "ffmpeg")==0){
5865 s->lavc_build= 4600;
5869 s->lavc_build= build;
5872 /* Xvid detection */
5873 e=sscanf(buf, "XviD%d", &build);
5875 s->xvid_build= build;
5878 //printf("User Data: %s\n", buf);
5882 static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
5883 int time_incr, time_increment;
5885 s->pict_type = get_bits(gb, 2) + FF_I_TYPE; /* pict type: I = 0 , P = 1 */
5886 if(s->pict_type==FF_B_TYPE && s->low_delay && s->vol_control_parameters==0 && !(s->flags & CODEC_FLAG_LOW_DELAY)){
5887 av_log(s->avctx, AV_LOG_ERROR, "low_delay flag incorrectly, clearing it\n");
5891 s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE;
5892 if(s->partitioned_frame)
5893 s->decode_mb= mpeg4_decode_partitioned_mb;
5895 s->decode_mb= ff_mpeg4_decode_mb;
5898 while (get_bits1(gb) != 0)
5901 check_marker(gb, "before time_increment");
5903 if(s->time_increment_bits==0 || !(show_bits(gb, s->time_increment_bits+1)&1)){
5904 av_log(s->avctx, AV_LOG_ERROR, "hmm, seems the headers are not complete, trying to guess time_increment_bits\n");
5906 for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){
5907 if ( s->pict_type == FF_P_TYPE
5908 || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
5909 if((show_bits(gb, s->time_increment_bits+6)&0x37) == 0x30) break;
5911 if((show_bits(gb, s->time_increment_bits+5)&0x1F) == 0x18) break;
5914 av_log(s->avctx, AV_LOG_ERROR, "my guess is %d bits ;)\n",s->time_increment_bits);
5917 if(IS_3IV1) time_increment= get_bits1(gb); //FIXME investigate further
5918 else time_increment= get_bits(gb, s->time_increment_bits);
5920 // printf("%d %X\n", s->time_increment_bits, time_increment);
5921 //av_log(s->avctx, AV_LOG_DEBUG, " type:%d modulo_time_base:%d increment:%d t_frame %d\n", s->pict_type, time_incr, time_increment, s->t_frame);
5922 if(s->pict_type!=FF_B_TYPE){
5923 s->last_time_base= s->time_base;
5924 s->time_base+= time_incr;
5925 s->time= s->time_base*s->avctx->time_base.den + time_increment;
5926 if(s->workaround_bugs&FF_BUG_UMP4){
5927 if(s->time < s->last_non_b_time){
5928 // fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaround\n");
5930 s->time+= s->avctx->time_base.den;
5933 s->pp_time= s->time - s->last_non_b_time;
5934 s->last_non_b_time= s->time;
5936 s->time= (s->last_time_base + time_incr)*s->avctx->time_base.den + time_increment;
5937 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
5938 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
5939 // printf("messed up order, maybe after seeking? skipping current b frame\n");
5940 return FRAME_SKIPPED;
5942 ff_mpeg4_init_direct_mv(s);
5944 if(s->t_frame==0) s->t_frame= s->pb_time;
5945 if(s->t_frame==0) s->t_frame=1; // 1/0 protection
5946 s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame)
5947 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
5948 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame)
5949 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
5950 if(!s->progressive_sequence){
5951 if(s->pp_field_time <= s->pb_field_time || s->pb_field_time <= 1)
5952 return FRAME_SKIPPED;
5955 //av_log(s->avctx, AV_LOG_DEBUG, "last nonb %"PRId64" last_base %d time %"PRId64" pp %d pb %d t %d ppf %d pbf %d\n", s->last_non_b_time, s->last_time_base, s->time, s->pp_time, s->pb_time, s->t_frame, s->pp_field_time, s->pb_field_time);
5957 if(s->avctx->time_base.num)
5958 s->current_picture_ptr->pts= (s->time + s->avctx->time_base.num/2) / s->avctx->time_base.num;
5960 s->current_picture_ptr->pts= AV_NOPTS_VALUE;
5961 if(s->avctx->debug&FF_DEBUG_PTS)
5962 av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %"PRId64"\n", s->current_picture_ptr->pts);
5964 check_marker(gb, "before vop_coded");
5967 if (get_bits1(gb) != 1){
5968 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
5969 av_log(s->avctx, AV_LOG_ERROR, "vop not coded\n");
5970 return FRAME_SKIPPED;
5972 //printf("time %d %d %d || %"PRId64" %"PRId64" %"PRId64"\n", s->time_increment_bits, s->avctx->time_base.den, s->time_base,
5973 //s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time);
5974 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == FF_P_TYPE
5975 || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
5976 /* rounding type for motion estimation */
5977 s->no_rounding = get_bits1(gb);
5981 //FIXME reduced res stuff
5983 if (s->shape != RECT_SHAPE) {
5984 if (s->vol_sprite_usage != 1 || s->pict_type != FF_I_TYPE) {
5985 int width, height, hor_spat_ref, ver_spat_ref;
5987 width = get_bits(gb, 13);
5988 skip_bits1(gb); /* marker */
5989 height = get_bits(gb, 13);
5990 skip_bits1(gb); /* marker */
5991 hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */
5992 skip_bits1(gb); /* marker */
5993 ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */
5995 skip_bits1(gb); /* change_CR_disable */
5997 if (get_bits1(gb) != 0) {
5998 skip_bits(gb, 8); /* constant_alpha_value */
6001 //FIXME complexity estimation stuff
6003 if (s->shape != BIN_ONLY_SHAPE) {
6004 skip_bits_long(gb, s->cplx_estimation_trash_i);
6005 if(s->pict_type != FF_I_TYPE)
6006 skip_bits_long(gb, s->cplx_estimation_trash_p);
6007 if(s->pict_type == FF_B_TYPE)
6008 skip_bits_long(gb, s->cplx_estimation_trash_b);
6010 s->intra_dc_threshold= mpeg4_dc_threshold[ get_bits(gb, 3) ];
6011 if(!s->progressive_sequence){
6012 s->top_field_first= get_bits1(gb);
6013 s->alternate_scan= get_bits1(gb);
6015 s->alternate_scan= 0;
6018 if(s->alternate_scan){
6019 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
6020 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
6021 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
6022 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
6024 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
6025 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
6026 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
6027 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
6030 if(s->pict_type == FF_S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
6031 mpeg4_decode_sprite_trajectory(s, gb);
6032 if(s->sprite_brightness_change) av_log(s->avctx, AV_LOG_ERROR, "sprite_brightness_change not supported\n");
6033 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "static sprite not supported\n");
6036 if (s->shape != BIN_ONLY_SHAPE) {
6037 s->chroma_qscale= s->qscale = get_bits(gb, s->quant_precision);
6039 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (qscale=0)\n");
6040 return -1; // makes no sense to continue, as there is nothing left from the image then
6043 if (s->pict_type != FF_I_TYPE) {
6044 s->f_code = get_bits(gb, 3); /* fcode_for */
6046 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (f_code=0)\n");
6047 return -1; // makes no sense to continue, as the MV decoding will break very quickly
6052 if (s->pict_type == FF_B_TYPE) {
6053 s->b_code = get_bits(gb, 3);
6057 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
6058 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 ce:%d/%d/%d\n",
6059 s->qscale, s->f_code, s->b_code,
6060 s->pict_type == FF_I_TYPE ? "I" : (s->pict_type == FF_P_TYPE ? "P" : (s->pict_type == FF_B_TYPE ? "B" : "S")),
6061 gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first,
6062 s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,
6063 s->sprite_warping_accuracy, 1-s->no_rounding, s->vo_type, s->vol_control_parameters ? " VOLC" : " ", s->intra_dc_threshold, s->cplx_estimation_trash_i, s->cplx_estimation_trash_p, s->cplx_estimation_trash_b);
6066 if(!s->scalability){
6067 if (s->shape!=RECT_SHAPE && s->pict_type!=FF_I_TYPE) {
6068 skip_bits1(gb); // vop shape coding type
6071 if(s->enhancement_type){
6072 int load_backward_shape= get_bits1(gb);
6073 if(load_backward_shape){
6074 av_log(s->avctx, AV_LOG_ERROR, "load backward shape isn't supported\n");
6077 skip_bits(gb, 2); //ref_select_code
6080 /* detect buggy encoders which don't set the low_delay flag (divx4/xvid/opendivx)*/
6081 // note we cannot detect divx5 without b-frames easily (although it's buggy too)
6082 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
6083 av_log(s->avctx, AV_LOG_ERROR, "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
6087 s->picture_number++; // better than pic number==0 always ;)
6089 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
6090 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
6092 if(s->workaround_bugs&FF_BUG_EDGE){
6093 s->h_edge_pos= s->width;
6094 s->v_edge_pos= s->height;
6100 * decode mpeg4 headers
6101 * @return <0 if no VOP found (or a damaged one)
6102 * FRAME_SKIPPED if a not coded VOP is found
6103 * 0 if a VOP is found
6105 int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb)
6109 /* search next start code */
6112 if(s->codec_tag == AV_RL32("WV1F") && show_bits(gb, 24) == 0x575630){
6114 if(get_bits(gb, 8) == 0xF0)
6120 if(get_bits_count(gb) >= gb->size_in_bits){
6121 if(gb->size_in_bits==8 && (s->divx_version || s->xvid_build)){
6122 av_log(s->avctx, AV_LOG_ERROR, "frame skip %d\n", gb->size_in_bits);
6123 return FRAME_SKIPPED; //divx bug
6125 return -1; //end of stream
6128 /* use the bits after the test */
6129 v = get_bits(gb, 8);
6130 startcode = ((startcode << 8) | v) & 0xffffffff;
6132 if((startcode&0xFFFFFF00) != 0x100)
6133 continue; //no startcode
6135 if(s->avctx->debug&FF_DEBUG_STARTCODE){
6136 av_log(s->avctx, AV_LOG_DEBUG, "startcode: %3X ", startcode);
6137 if (startcode<=0x11F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Start");
6138 else if(startcode<=0x12F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Layer Start");
6139 else if(startcode<=0x13F) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
6140 else if(startcode<=0x15F) av_log(s->avctx, AV_LOG_DEBUG, "FGS bp start");
6141 else if(startcode<=0x1AF) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
6142 else if(startcode==0x1B0) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq Start");
6143 else if(startcode==0x1B1) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq End");
6144 else if(startcode==0x1B2) av_log(s->avctx, AV_LOG_DEBUG, "User Data");
6145 else if(startcode==0x1B3) av_log(s->avctx, AV_LOG_DEBUG, "Group of VOP start");
6146 else if(startcode==0x1B4) av_log(s->avctx, AV_LOG_DEBUG, "Video Session Error");
6147 else if(startcode==0x1B5) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Start");
6148 else if(startcode==0x1B6) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Plane start");
6149 else if(startcode==0x1B7) av_log(s->avctx, AV_LOG_DEBUG, "slice start");
6150 else if(startcode==0x1B8) av_log(s->avctx, AV_LOG_DEBUG, "extension start");
6151 else if(startcode==0x1B9) av_log(s->avctx, AV_LOG_DEBUG, "fgs start");
6152 else if(startcode==0x1BA) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object start");
6153 else if(startcode==0x1BB) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object Plane start");
6154 else if(startcode==0x1BC) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object start");
6155 else if(startcode==0x1BD) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object Plane start");
6156 else if(startcode==0x1BE) av_log(s->avctx, AV_LOG_DEBUG, "Still Texture Object start");
6157 else if(startcode==0x1BF) av_log(s->avctx, AV_LOG_DEBUG, "Texture Spatial Layer start");
6158 else if(startcode==0x1C0) av_log(s->avctx, AV_LOG_DEBUG, "Texture SNR Layer start");
6159 else if(startcode==0x1C1) av_log(s->avctx, AV_LOG_DEBUG, "Texture Tile start");
6160 else if(startcode==0x1C2) av_log(s->avctx, AV_LOG_DEBUG, "Texture Shape Layer start");
6161 else if(startcode==0x1C3) av_log(s->avctx, AV_LOG_DEBUG, "stuffing start");
6162 else if(startcode<=0x1C5) av_log(s->avctx, AV_LOG_DEBUG, "reserved");
6163 else if(startcode<=0x1FF) av_log(s->avctx, AV_LOG_DEBUG, "System start");
6164 av_log(s->avctx, AV_LOG_DEBUG, " at %d\n", get_bits_count(gb));
6167 if(startcode >= 0x120 && startcode <= 0x12F){
6168 if(decode_vol_header(s, gb) < 0)
6171 else if(startcode == USER_DATA_STARTCODE){
6172 decode_user_data(s, gb);
6174 else if(startcode == GOP_STARTCODE){
6175 mpeg4_decode_gop_header(s, gb);
6177 else if(startcode == VOP_STARTCODE){
6185 if(s->flags& CODEC_FLAG_LOW_DELAY)
6187 s->avctx->has_b_frames= !s->low_delay;
6188 return decode_vop_header(s, gb);
6191 /* don't understand why they choose a different header ! */
6192 int intel_h263_decode_picture_header(MpegEncContext *s)
6196 /* picture header */
6197 if (get_bits_long(&s->gb, 22) != 0x20) {
6198 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
6201 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
6203 if (get_bits1(&s->gb) != 1) {
6204 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
6205 return -1; /* marker */
6207 if (get_bits1(&s->gb) != 0) {
6208 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
6209 return -1; /* h263 id */
6211 skip_bits1(&s->gb); /* split screen off */
6212 skip_bits1(&s->gb); /* camera off */
6213 skip_bits1(&s->gb); /* freeze picture release off */
6215 format = get_bits(&s->gb, 3);
6217 av_log(s->avctx, AV_LOG_ERROR, "Intel H263 free format not supported\n");
6222 s->pict_type = FF_I_TYPE + get_bits1(&s->gb);
6224 s->unrestricted_mv = get_bits1(&s->gb);
6225 s->h263_long_vectors = s->unrestricted_mv;
6227 if (get_bits1(&s->gb) != 0) {
6228 av_log(s->avctx, AV_LOG_ERROR, "SAC not supported\n");
6229 return -1; /* SAC: off */
6231 s->obmc= get_bits1(&s->gb);
6232 s->pb_frame = get_bits1(&s->gb);
6235 format = get_bits(&s->gb, 3);
6236 if(format == 0 || format == 7){
6237 av_log(s->avctx, AV_LOG_ERROR, "Wrong Intel H263 format\n");
6240 if(get_bits(&s->gb, 2))
6241 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
6242 s->loop_filter = get_bits1(&s->gb);
6243 if(get_bits1(&s->gb))
6244 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
6245 if(get_bits1(&s->gb))
6247 if(get_bits(&s->gb, 5))
6248 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
6249 if(get_bits(&s->gb, 5) != 1)
6250 av_log(s->avctx, AV_LOG_ERROR, "Invalid marker\n");
6253 int ar = get_bits(&s->gb, 4);
6254 skip_bits(&s->gb, 9); // display width
6256 skip_bits(&s->gb, 9); // display height
6258 skip_bits(&s->gb, 8); // aspect ratio - width
6259 skip_bits(&s->gb, 8); // aspect ratio - height
6263 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
6264 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
6267 skip_bits(&s->gb, 3); //temporal reference for B-frame
6268 skip_bits(&s->gb, 2); //dbquant
6272 while (get_bits1(&s->gb) != 0) {
6273 skip_bits(&s->gb, 8);
6277 s->y_dc_scale_table=
6278 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
6280 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
6286 int flv_h263_decode_picture_header(MpegEncContext *s)
6288 int format, width, height;
6290 /* picture header */
6291 if (get_bits_long(&s->gb, 17) != 1) {
6292 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
6295 format = get_bits(&s->gb, 5);
6296 if (format != 0 && format != 1) {
6297 av_log(s->avctx, AV_LOG_ERROR, "Bad picture format\n");
6300 s->h263_flv = format+1;
6301 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
6302 format = get_bits(&s->gb, 3);
6305 width = get_bits(&s->gb, 8);
6306 height = get_bits(&s->gb, 8);
6309 width = get_bits(&s->gb, 16);
6310 height = get_bits(&s->gb, 16);
6336 if(avcodec_check_dimensions(s->avctx, width, height))
6341 s->pict_type = FF_I_TYPE + get_bits(&s->gb, 2);
6342 s->dropable= s->pict_type > FF_P_TYPE;
6344 s->pict_type = FF_P_TYPE;
6346 skip_bits1(&s->gb); /* deblocking flag */
6347 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
6351 s->unrestricted_mv = 1;
6352 s->h263_long_vectors = 0;
6355 while (get_bits1(&s->gb) != 0) {
6356 skip_bits(&s->gb, 8);
6360 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
6361 av_log(s->avctx, AV_LOG_DEBUG, "%c esc_type:%d, qp:%d num:%d\n",
6362 s->dropable ? 'D' : av_get_pict_type_char(s->pict_type), s->h263_flv-1, s->qscale, s->picture_number);
6365 s->y_dc_scale_table=
6366 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;