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 void h263_encode_block(MpegEncContext * s, DCTELEM * block,
61 static void h263p_encode_umotion(MpegEncContext * s, int val);
62 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block,
63 int n, int dc, uint8_t *scan_table,
64 PutBitContext *dc_pb, PutBitContext *ac_pb);
65 static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
68 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode);
69 static int h263p_decode_umotion(MpegEncContext * s, int pred);
70 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
72 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
73 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
74 int n, int coded, int intra, int rvlc);
76 static int h263_pred_dc(MpegEncContext * s, int n, int16_t **dc_val_ptr);
77 static void mpeg4_encode_visual_object_header(MpegEncContext * s);
78 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number);
80 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb);
81 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding);
84 static uint8_t uni_DCtab_lum_len[512];
85 static uint8_t uni_DCtab_chrom_len[512];
86 static uint16_t uni_DCtab_lum_bits[512];
87 static uint16_t uni_DCtab_chrom_bits[512];
89 static uint8_t mv_penalty[MAX_FCODE+1][MAX_MV*2+1];
90 static uint8_t fcode_tab[MAX_MV*2+1];
91 static uint8_t umv_fcode_tab[MAX_MV*2+1];
93 static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2];
94 static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2];
95 static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2];
96 static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2];
97 static uint8_t uni_h263_intra_aic_rl_len [64*64*2*2];
98 static uint8_t uni_h263_inter_rl_len [64*64*2*2];
99 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
100 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
101 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
114 static uint8_t static_rl_table_store[5][2][2*MAX_RUN + MAX_LEVEL + 3];
116 #if 0 //3IV1 is quite rare and it slows things down a tiny bit
117 #define IS_3IV1 s->codec_tag == AV_RL32("3IV1")
122 int h263_get_picture_format(int width, int height)
126 if (width == 128 && height == 96)
128 else if (width == 176 && height == 144)
130 else if (width == 352 && height == 288)
132 else if (width == 704 && height == 576)
134 else if (width == 1408 && height == 1152)
141 static void show_pict_info(MpegEncContext *s){
142 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",
143 s->qscale, av_get_pict_type_char(s->pict_type),
144 s->gb.size_in_bits, 1-s->no_rounding,
145 s->obmc ? " AP" : "",
146 s->umvplus ? " UMV" : "",
147 s->h263_long_vectors ? " LONG" : "",
148 s->h263_plus ? " +" : "",
149 s->h263_aic ? " AIC" : "",
150 s->alt_inter_vlc ? " AIV" : "",
151 s->modified_quant ? " MQ" : "",
152 s->loop_filter ? " LOOP" : "",
153 s->h263_slice_structured ? " SS" : "",
154 s->avctx->time_base.den, s->avctx->time_base.num
160 static void aspect_to_info(MpegEncContext * s, AVRational aspect){
163 if(aspect.num==0) aspect= (AVRational){1,1};
166 if(av_cmp_q(pixel_aspect[i], aspect) == 0){
167 s->aspect_ratio_info=i;
172 s->aspect_ratio_info= FF_ASPECT_EXTENDED;
175 void ff_flv_encode_picture_header(MpegEncContext * s, int picture_number)
179 align_put_bits(&s->pb);
181 put_bits(&s->pb, 17, 1);
182 put_bits(&s->pb, 5, (s->h263_flv-1)); /* 0: h263 escape codes 1: 11-bit escape codes */
183 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->time_base.num) / //FIXME use timestamp
184 s->avctx->time_base.den) & 0xff); /* TemporalReference */
185 if (s->width == 352 && s->height == 288)
187 else if (s->width == 176 && s->height == 144)
189 else if (s->width == 128 && s->height == 96)
191 else if (s->width == 320 && s->height == 240)
193 else if (s->width == 160 && s->height == 120)
195 else if (s->width <= 255 && s->height <= 255)
196 format = 0; /* use 1 byte width & height */
198 format = 1; /* use 2 bytes width & height */
199 put_bits(&s->pb, 3, format); /* PictureSize */
201 put_bits(&s->pb, 8, s->width);
202 put_bits(&s->pb, 8, s->height);
203 } else if (format == 1) {
204 put_bits(&s->pb, 16, s->width);
205 put_bits(&s->pb, 16, s->height);
207 put_bits(&s->pb, 2, s->pict_type == FF_P_TYPE); /* PictureType */
208 put_bits(&s->pb, 1, 1); /* DeblockingFlag: on */
209 put_bits(&s->pb, 5, s->qscale); /* Quantizer */
210 put_bits(&s->pb, 1, 0); /* ExtraInformation */
214 s->c_dc_scale_table= ff_aic_dc_scale_table;
217 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
221 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
223 int format, coded_frame_rate, coded_frame_rate_base, i, temp_ref;
224 int best_clock_code=1;
226 int best_error= INT_MAX;
231 div= (s->avctx->time_base.num*1800000LL + 500LL*s->avctx->time_base.den) / ((1000LL+i)*s->avctx->time_base.den);
232 div= av_clip(div, 1, 127);
233 error= FFABS(s->avctx->time_base.num*1800000LL - (1000LL+i)*s->avctx->time_base.den*div);
234 if(error < best_error){
241 s->custom_pcf= best_clock_code!=1 || best_divisor!=60;
242 coded_frame_rate= 1800000;
243 coded_frame_rate_base= (1000+best_clock_code)*best_divisor;
245 align_put_bits(&s->pb);
247 /* Update the pointer to last GOB */
248 s->ptr_lastgob = put_bits_ptr(&s->pb);
249 put_bits(&s->pb, 22, 0x20); /* PSC */
250 temp_ref= s->picture_number * (int64_t)coded_frame_rate * s->avctx->time_base.num / //FIXME use timestamp
251 (coded_frame_rate_base * (int64_t)s->avctx->time_base.den);
252 put_sbits(&s->pb, 8, temp_ref); /* TemporalReference */
254 put_bits(&s->pb, 1, 1); /* marker */
255 put_bits(&s->pb, 1, 0); /* h263 id */
256 put_bits(&s->pb, 1, 0); /* split screen off */
257 put_bits(&s->pb, 1, 0); /* camera off */
258 put_bits(&s->pb, 1, 0); /* freeze picture release off */
260 format = h263_get_picture_format(s->width, s->height);
263 put_bits(&s->pb, 3, format);
264 put_bits(&s->pb, 1, (s->pict_type == FF_P_TYPE));
265 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
266 of H.263v1 UMV implies to check the predicted MV after
267 calculation of the current MB to see if we're on the limits */
268 put_bits(&s->pb, 1, 0); /* Unrestricted Motion Vector: off */
269 put_bits(&s->pb, 1, 0); /* SAC: off */
270 put_bits(&s->pb, 1, s->obmc); /* Advanced Prediction */
271 put_bits(&s->pb, 1, 0); /* only I/P frames, no PB frame */
272 put_bits(&s->pb, 5, s->qscale);
273 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
277 /* H.263 Plus PTYPE */
279 put_bits(&s->pb, 3, 7);
280 put_bits(&s->pb,3,ufep); /* Update Full Extended PTYPE */
282 put_bits(&s->pb,3,6); /* Custom Source Format */
284 put_bits(&s->pb, 3, format);
286 put_bits(&s->pb,1, s->custom_pcf);
287 put_bits(&s->pb,1, s->umvplus); /* Unrestricted Motion Vector */
288 put_bits(&s->pb,1,0); /* SAC: off */
289 put_bits(&s->pb,1,s->obmc); /* Advanced Prediction Mode */
290 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
291 put_bits(&s->pb,1,s->loop_filter); /* Deblocking Filter */
292 put_bits(&s->pb,1,s->h263_slice_structured); /* Slice Structured */
293 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
294 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
295 put_bits(&s->pb,1,s->alt_inter_vlc); /* Alternative Inter VLC */
296 put_bits(&s->pb,1,s->modified_quant); /* Modified Quantization: */
297 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
298 put_bits(&s->pb,3,0); /* Reserved */
300 put_bits(&s->pb, 3, s->pict_type == FF_P_TYPE);
302 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
303 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
304 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
305 put_bits(&s->pb,2,0); /* Reserved */
306 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
308 /* This should be here if PLUSPTYPE */
309 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
312 /* Custom Picture Format (CPFMT) */
313 aspect_to_info(s, s->avctx->sample_aspect_ratio);
315 put_bits(&s->pb,4,s->aspect_ratio_info);
316 put_bits(&s->pb,9,(s->width >> 2) - 1);
317 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
318 put_bits(&s->pb,9,(s->height >> 2));
319 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
320 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
321 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
326 put_bits(&s->pb, 1, best_clock_code);
327 put_bits(&s->pb, 7, best_divisor);
329 put_sbits(&s->pb, 2, temp_ref>>8);
332 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
334 // put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
335 //FIXME check actual requested range
336 put_bits(&s->pb,2,1); /* unlimited */
337 if(s->h263_slice_structured)
338 put_bits(&s->pb,2,0); /* no weird submodes */
340 put_bits(&s->pb, 5, s->qscale);
343 put_bits(&s->pb, 1, 0); /* no PEI */
345 if(s->h263_slice_structured){
346 put_bits(&s->pb, 1, 1);
348 assert(s->mb_x == 0 && s->mb_y == 0);
349 ff_h263_encode_mba(s);
351 put_bits(&s->pb, 1, 1);
356 s->c_dc_scale_table= ff_aic_dc_scale_table;
359 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
364 * Encodes a group of blocks header.
366 void h263_encode_gob_header(MpegEncContext * s, int mb_line)
368 put_bits(&s->pb, 17, 1); /* GBSC */
370 if(s->h263_slice_structured){
371 put_bits(&s->pb, 1, 1);
373 ff_h263_encode_mba(s);
376 put_bits(&s->pb, 1, 1);
377 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
378 put_bits(&s->pb, 1, 1);
379 put_bits(&s->pb, 2, s->pict_type == FF_I_TYPE); /* GFID */
381 int gob_number= mb_line / s->gob_index;
383 put_bits(&s->pb, 5, gob_number); /* GN */
384 put_bits(&s->pb, 2, s->pict_type == FF_I_TYPE); /* GFID */
385 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
389 static inline int get_block_rate(MpegEncContext * s, DCTELEM block[64], int block_last_index, uint8_t scantable[64]){
394 for(j=1; j<=block_last_index; j++){
395 const int index= scantable[j];
396 int level= block[index];
399 if((level&(~127)) == 0){
400 if(j<block_last_index) rate+= s->intra_ac_vlc_length [UNI_AC_ENC_INDEX(j-last-1, level)];
401 else rate+= s->intra_ac_vlc_last_length[UNI_AC_ENC_INDEX(j-last-1, level)];
403 rate += s->ac_esc_length;
412 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
416 int8_t * const qscale_table= s->current_picture.qscale_table;
418 memcpy(zigzag_last_index, s->block_last_index, sizeof(int)*6);
421 int16_t *ac_val, *ac_val1;
423 score -= get_block_rate(s, block[n], s->block_last_index[n], s->intra_scantable.permutated);
425 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
428 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
430 ac_val-= s->block_wrap[n]*16;
431 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
434 const int level= block[n][s->dsp.idct_permutation[i ]];
435 block[n][s->dsp.idct_permutation[i ]] = level - ac_val[i+8];
436 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
440 /* different qscale, we must rescale */
442 const int level= block[n][s->dsp.idct_permutation[i ]];
443 block[n][s->dsp.idct_permutation[i ]] = level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
444 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
448 st[n]= s->intra_h_scantable.permutated;
450 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
451 /* left prediction */
453 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
456 const int level= block[n][s->dsp.idct_permutation[i<<3]];
457 block[n][s->dsp.idct_permutation[i<<3]]= level - ac_val[i];
459 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
462 /* different qscale, we must rescale */
464 const int level= block[n][s->dsp.idct_permutation[i<<3]];
465 block[n][s->dsp.idct_permutation[i<<3]]= level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
467 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
470 st[n]= s->intra_v_scantable.permutated;
473 for(i=63; i>0; i--) //FIXME optimize
474 if(block[n][ st[n][i] ]) break;
475 s->block_last_index[n]= i;
477 score += get_block_rate(s, block[n], s->block_last_index[n], st[n]);
483 static inline void restore_ac_coeffs(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
486 memcpy(s->block_last_index, zigzag_last_index, sizeof(int)*6);
489 int16_t *ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
491 st[n]= s->intra_scantable.permutated;
495 block[n][s->dsp.idct_permutation[i ]] = ac_val[i+8];
498 /* left prediction */
500 block[n][s->dsp.idct_permutation[i<<3]]= ac_val[i ];
507 * modify qscale so that encoding is acually possible in h263 (limit difference to -2..2)
509 void ff_clean_h263_qscales(MpegEncContext *s){
511 int8_t * const qscale_table= s->current_picture.qscale_table;
513 ff_init_qscale_tab(s);
515 for(i=1; i<s->mb_num; i++){
516 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i-1] ] >2)
517 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i-1] ]+2;
519 for(i=s->mb_num-2; i>=0; i--){
520 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i+1] ] >2)
521 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i+1] ]+2;
524 if(s->codec_id != CODEC_ID_H263P){
525 for(i=1; i<s->mb_num; i++){
526 int mb_xy= s->mb_index2xy[i];
528 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_INTER4V)){
529 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_INTER;
536 * modify mb_type & qscale so that encoding is acually possible in mpeg4
538 void ff_clean_mpeg4_qscales(MpegEncContext *s){
540 int8_t * const qscale_table= s->current_picture.qscale_table;
542 ff_clean_h263_qscales(s);
544 if(s->pict_type== FF_B_TYPE){
546 /* ok, come on, this isn't funny anymore, there's more code for handling this mpeg4 mess than for the actual adaptive quantization */
548 for(i=0; i<s->mb_num; i++){
549 int mb_xy= s->mb_index2xy[i];
550 odd += qscale_table[mb_xy]&1;
553 if(2*odd > s->mb_num) odd=1;
556 for(i=0; i<s->mb_num; i++){
557 int mb_xy= s->mb_index2xy[i];
558 if((qscale_table[mb_xy]&1) != odd)
559 qscale_table[mb_xy]++;
560 if(qscale_table[mb_xy] > 31)
561 qscale_table[mb_xy]= 31;
564 for(i=1; i<s->mb_num; i++){
565 int mb_xy= s->mb_index2xy[i];
566 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_DIRECT)){
567 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_BIDIR;
573 #endif //CONFIG_ENCODERS
575 #define tab_size ((signed)FF_ARRAY_ELEMS(s->direct_scale_mv[0]))
576 #define tab_bias (tab_size/2)
578 void ff_mpeg4_init_direct_mv(MpegEncContext *s){
580 for(i=0; i<tab_size; i++){
581 s->direct_scale_mv[0][i] = (i-tab_bias)*s->pb_time/s->pp_time;
582 s->direct_scale_mv[1][i] = (i-tab_bias)*(s->pb_time-s->pp_time)/s->pp_time;
586 static inline void ff_mpeg4_set_one_direct_mv(MpegEncContext *s, int mx, int my, int i){
587 int xy= s->block_index[i];
588 uint16_t time_pp= s->pp_time;
589 uint16_t time_pb= s->pb_time;
592 p_mx= s->next_picture.motion_val[0][xy][0];
593 if((unsigned)(p_mx + tab_bias) < tab_size){
594 s->mv[0][i][0] = s->direct_scale_mv[0][p_mx + tab_bias] + mx;
595 s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx
596 : s->direct_scale_mv[1][p_mx + tab_bias];
598 s->mv[0][i][0] = p_mx*time_pb/time_pp + mx;
599 s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx
600 : p_mx*(time_pb - time_pp)/time_pp;
602 p_my= s->next_picture.motion_val[0][xy][1];
603 if((unsigned)(p_my + tab_bias) < tab_size){
604 s->mv[0][i][1] = s->direct_scale_mv[0][p_my + tab_bias] + my;
605 s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my
606 : s->direct_scale_mv[1][p_my + tab_bias];
608 s->mv[0][i][1] = p_my*time_pb/time_pp + my;
609 s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my
610 : p_my*(time_pb - time_pp)/time_pp;
619 * @return the mb_type
621 int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){
622 const int mb_index= s->mb_x + s->mb_y*s->mb_stride;
623 const int colocated_mb_type= s->next_picture.mb_type[mb_index];
628 //FIXME avoid divides
629 // try special case with shifts for 1 and 3 B-frames?
631 if(IS_8X8(colocated_mb_type)){
632 s->mv_type = MV_TYPE_8X8;
634 ff_mpeg4_set_one_direct_mv(s, mx, my, i);
636 return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_L0L1;
637 } else if(IS_INTERLACED(colocated_mb_type)){
638 s->mv_type = MV_TYPE_FIELD;
640 int field_select= s->next_picture.ref_index[0][s->block_index[2*i]];
641 s->field_select[0][i]= field_select;
642 s->field_select[1][i]= i;
643 if(s->top_field_first){
644 time_pp= s->pp_field_time - field_select + i;
645 time_pb= s->pb_field_time - field_select + i;
647 time_pp= s->pp_field_time + field_select - i;
648 time_pb= s->pb_field_time + field_select - i;
650 s->mv[0][i][0] = s->p_field_mv_table[i][0][mb_index][0]*time_pb/time_pp + mx;
651 s->mv[0][i][1] = s->p_field_mv_table[i][0][mb_index][1]*time_pb/time_pp + my;
652 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->p_field_mv_table[i][0][mb_index][0]
653 : s->p_field_mv_table[i][0][mb_index][0]*(time_pb - time_pp)/time_pp;
654 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->p_field_mv_table[i][0][mb_index][1]
655 : s->p_field_mv_table[i][0][mb_index][1]*(time_pb - time_pp)/time_pp;
657 return MB_TYPE_DIRECT2 | MB_TYPE_16x8 | MB_TYPE_L0L1 | MB_TYPE_INTERLACED;
659 ff_mpeg4_set_one_direct_mv(s, mx, my, 0);
660 s->mv[0][1][0] = s->mv[0][2][0] = s->mv[0][3][0] = s->mv[0][0][0];
661 s->mv[0][1][1] = s->mv[0][2][1] = s->mv[0][3][1] = s->mv[0][0][1];
662 s->mv[1][1][0] = s->mv[1][2][0] = s->mv[1][3][0] = s->mv[1][0][0];
663 s->mv[1][1][1] = s->mv[1][2][1] = s->mv[1][3][1] = s->mv[1][0][1];
664 if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample)
665 s->mv_type= MV_TYPE_16X16;
667 s->mv_type= MV_TYPE_8X8;
668 return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_L0L1; //Note see prev line
672 void ff_h263_update_motion_val(MpegEncContext * s){
673 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
674 //FIXME a lot of that is only needed for !low_delay
675 const int wrap = s->b8_stride;
676 const int xy = s->block_index[0];
678 s->current_picture.mbskip_table[mb_xy]= s->mb_skipped;
680 if(s->mv_type != MV_TYPE_8X8){
681 int motion_x, motion_y;
685 } else if (s->mv_type == MV_TYPE_16X16) {
686 motion_x = s->mv[0][0][0];
687 motion_y = s->mv[0][0][1];
688 } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {
690 motion_x = s->mv[0][0][0] + s->mv[0][1][0];
691 motion_y = s->mv[0][0][1] + s->mv[0][1][1];
692 motion_x = (motion_x>>1) | (motion_x&1);
694 s->p_field_mv_table[i][0][mb_xy][0]= s->mv[0][i][0];
695 s->p_field_mv_table[i][0][mb_xy][1]= s->mv[0][i][1];
697 s->current_picture.ref_index[0][xy ]=
698 s->current_picture.ref_index[0][xy + 1]= s->field_select[0][0];
699 s->current_picture.ref_index[0][xy + wrap ]=
700 s->current_picture.ref_index[0][xy + wrap + 1]= s->field_select[0][1];
703 /* no update if 8X8 because it has been done during parsing */
704 s->current_picture.motion_val[0][xy][0] = motion_x;
705 s->current_picture.motion_val[0][xy][1] = motion_y;
706 s->current_picture.motion_val[0][xy + 1][0] = motion_x;
707 s->current_picture.motion_val[0][xy + 1][1] = motion_y;
708 s->current_picture.motion_val[0][xy + wrap][0] = motion_x;
709 s->current_picture.motion_val[0][xy + wrap][1] = motion_y;
710 s->current_picture.motion_val[0][xy + 1 + wrap][0] = motion_x;
711 s->current_picture.motion_val[0][xy + 1 + wrap][1] = motion_y;
714 if(s->encoding){ //FIXME encoding MUST be cleaned up
715 if (s->mv_type == MV_TYPE_8X8)
716 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_8x8;
718 s->current_picture.mb_type[mb_xy]= MB_TYPE_INTRA;
720 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_16x16;
726 static inline int h263_get_motion_length(MpegEncContext * s, int val, int f_code){
727 int l, bit_size, code;
732 bit_size = f_code - 1;
733 /* modulo encoding */
734 l= INT_BIT - 6 - bit_size;
737 code = (val >> bit_size) + 1;
739 return mvtab[code][1] + 1 + bit_size;
743 static inline void ff_h263_encode_motion_vector(MpegEncContext * s, int x, int y, int f_code){
744 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
745 skip_put_bits(&s->pb,
746 h263_get_motion_length(s, x, f_code)
747 +h263_get_motion_length(s, y, f_code));
749 ff_h263_encode_motion(s, x, f_code);
750 ff_h263_encode_motion(s, y, f_code);
754 static inline int get_p_cbp(MpegEncContext * s,
755 DCTELEM block[6][64],
756 int motion_x, int motion_y){
759 if(s->flags & CODEC_FLAG_CBP_RD){
760 int best_cbpy_score= INT_MAX;
761 int best_cbpc_score= INT_MAX;
762 int cbpc = (-1), cbpy= (-1);
763 const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0);
764 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
767 int score= inter_MCBPC_bits[i + offset] * lambda;
768 if(i&1) score += s->coded_score[5];
769 if(i&2) score += s->coded_score[4];
771 if(score < best_cbpc_score){
772 best_cbpc_score= score;
778 int score= cbpy_tab[i ^ 0xF][1] * lambda;
779 if(i&1) score += s->coded_score[3];
780 if(i&2) score += s->coded_score[2];
781 if(i&4) score += s->coded_score[1];
782 if(i&8) score += s->coded_score[0];
784 if(score < best_cbpy_score){
785 best_cbpy_score= score;
790 if ((motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16){
791 if(best_cbpy_score + best_cbpc_score + 2*lambda >= 0)
795 for (i = 0; i < 6; i++) {
796 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
797 s->block_last_index[i]= -1;
798 s->dsp.clear_block(s->block[i]);
803 for (i = 0; i < 6; i++) {
804 if (s->block_last_index[i] >= 0)
811 static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64],
812 int motion_x, int motion_y, int mb_type){
815 if(s->flags & CODEC_FLAG_CBP_RD){
817 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
820 if(s->coded_score[i] < 0){
821 score += s->coded_score[i];
828 if ((motion_x | motion_y | s->dquant | mb_type) == 0){
829 zero_score-= 4; //2*MV + mb_type + cbp bit
833 if(zero_score <= score){
838 for (i = 0; i < 6; i++) {
839 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
840 s->block_last_index[i]= -1;
841 s->dsp.clear_block(s->block[i]);
845 for (i = 0; i < 6; i++) {
846 if (s->block_last_index[i] >= 0)
853 static inline void mpeg4_encode_blocks(MpegEncContext * s, DCTELEM block[6][64], int intra_dc[6],
854 uint8_t **scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb){
858 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
859 for (i = 0; i < 6; i++) {
860 skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, intra_dc[i], scan_table[i]));
863 /* encode each block */
864 for (i = 0; i < 6; i++) {
865 mpeg4_encode_block(s, block[i], i, intra_dc[i], scan_table[i], dc_pb, ac_pb);
869 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
870 for (i = 0; i < 6; i++) {
871 skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, 0, s->intra_scantable.permutated));
874 /* encode each block */
875 for (i = 0; i < 6; i++) {
876 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, dc_pb, ac_pb);
882 static const int dquant_code[5]= {1,0,9,2,3};
884 void mpeg4_encode_mb(MpegEncContext * s,
885 DCTELEM block[6][64],
886 int motion_x, int motion_y)
888 int cbpc, cbpy, pred_x, pred_y;
889 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
890 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=FF_B_TYPE ? &s->tex_pb : &s->pb;
891 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=FF_I_TYPE ? &s->pb2 : &s->pb;
892 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
894 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
898 if(s->pict_type==FF_B_TYPE){
899 static const int mb_type_table[8]= {-1, 3, 2, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
900 int mb_type= mb_type_table[s->mv_dir];
907 s->last_mv[i][1][1]= 0;
911 assert(s->dquant>=-2 && s->dquant<=2);
912 assert((s->dquant&1)==0);
915 /* nothing to do if this MB was skipped in the next P Frame */
916 if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){ //FIXME avoid DCT & ...
922 s->mv_dir= MV_DIR_FORWARD; //doesn't matter
923 s->qscale -= s->dquant;
929 cbp= get_b_cbp(s, block, motion_x, motion_y, mb_type);
931 if ((cbp | motion_x | motion_y | mb_type) ==0) {
932 /* direct MB with MV={0,0} */
933 assert(s->dquant==0);
935 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
937 if(interleaved_stats){
945 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
946 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
947 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we don't need it :)
948 if(cbp) put_bits(&s->pb, 6, cbp);
952 put_bits(&s->pb, 2, (s->dquant>>2)+3);
954 put_bits(&s->pb, 1, 0);
956 s->qscale -= s->dquant;
958 if(!s->progressive_sequence){
960 put_bits(&s->pb, 1, s->interlaced_dct);
961 if(mb_type) // not direct mode
962 put_bits(&s->pb, 1, s->mv_type == MV_TYPE_FIELD);
965 if(interleaved_stats){
966 s->misc_bits+= get_bits_diff(s);
970 assert(s->mv_dir & MV_DIRECT);
971 ff_h263_encode_motion_vector(s, motion_x, motion_y, 1);
975 assert(mb_type > 0 && mb_type < 4);
976 if(s->mv_type != MV_TYPE_FIELD){
977 if(s->mv_dir & MV_DIR_FORWARD){
978 ff_h263_encode_motion_vector(s, s->mv[0][0][0] - s->last_mv[0][0][0],
979 s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
980 s->last_mv[0][0][0]= s->last_mv[0][1][0]= s->mv[0][0][0];
981 s->last_mv[0][0][1]= s->last_mv[0][1][1]= s->mv[0][0][1];
984 if(s->mv_dir & MV_DIR_BACKWARD){
985 ff_h263_encode_motion_vector(s, s->mv[1][0][0] - s->last_mv[1][0][0],
986 s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
987 s->last_mv[1][0][0]= s->last_mv[1][1][0]= s->mv[1][0][0];
988 s->last_mv[1][0][1]= s->last_mv[1][1][1]= s->mv[1][0][1];
992 if(s->mv_dir & MV_DIR_FORWARD){
993 put_bits(&s->pb, 1, s->field_select[0][0]);
994 put_bits(&s->pb, 1, s->field_select[0][1]);
996 if(s->mv_dir & MV_DIR_BACKWARD){
997 put_bits(&s->pb, 1, s->field_select[1][0]);
998 put_bits(&s->pb, 1, s->field_select[1][1]);
1000 if(s->mv_dir & MV_DIR_FORWARD){
1002 ff_h263_encode_motion_vector(s, s->mv[0][i][0] - s->last_mv[0][i][0] ,
1003 s->mv[0][i][1] - s->last_mv[0][i][1]/2, s->f_code);
1004 s->last_mv[0][i][0]= s->mv[0][i][0];
1005 s->last_mv[0][i][1]= s->mv[0][i][1]*2;
1009 if(s->mv_dir & MV_DIR_BACKWARD){
1011 ff_h263_encode_motion_vector(s, s->mv[1][i][0] - s->last_mv[1][i][0] ,
1012 s->mv[1][i][1] - s->last_mv[1][i][1]/2, s->b_code);
1013 s->last_mv[1][i][0]= s->mv[1][i][0];
1014 s->last_mv[1][i][1]= s->mv[1][i][1]*2;
1021 if(interleaved_stats){
1022 s->mv_bits+= get_bits_diff(s);
1025 mpeg4_encode_blocks(s, block, NULL, NULL, NULL, &s->pb);
1027 if(interleaved_stats){
1028 s->p_tex_bits+= get_bits_diff(s);
1031 }else{ /* s->pict_type==FF_B_TYPE */
1032 cbp= get_p_cbp(s, block, motion_x, motion_y);
1034 if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
1035 /* check if the B frames can skip it too, as we must skip it if we skip here
1036 why didn't they just compress the skip-mb bits instead of reusing them ?! */
1037 if(s->max_b_frames>0){
1044 if(x+16 > s->width) x= s->width-16;
1045 if(y+16 > s->height) y= s->height-16;
1047 offset= x + y*s->linesize;
1048 p_pic= s->new_picture.data[0] + offset;
1051 for(i=0; i<s->max_b_frames; i++){
1054 Picture *pic= s->reordered_input_picture[i+1];
1056 if(pic==NULL || pic->pict_type!=FF_B_TYPE) break;
1058 b_pic= pic->data[0] + offset;
1059 if(pic->type != FF_BUFFER_TYPE_SHARED)
1060 b_pic+= INPLACE_OFFSET;
1061 diff= s->dsp.sad[0](NULL, p_pic, b_pic, s->linesize, 16);
1062 if(diff>s->qscale*70){ //FIXME check that 70 is optimal
1070 if(s->mb_skipped==1){
1071 /* skip macroblock */
1072 put_bits(&s->pb, 1, 1);
1074 if(interleaved_stats){
1084 put_bits(&s->pb, 1, 0); /* mb coded */
1088 if(s->mv_type==MV_TYPE_16X16){
1089 if(s->dquant) cbpc+= 8;
1091 inter_MCBPC_bits[cbpc],
1092 inter_MCBPC_code[cbpc]);
1094 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1096 put_bits(pb2, 2, dquant_code[s->dquant+2]);
1098 if(!s->progressive_sequence){
1100 put_bits(pb2, 1, s->interlaced_dct);
1101 put_bits(pb2, 1, 0);
1104 if(interleaved_stats){
1105 s->misc_bits+= get_bits_diff(s);
1108 /* motion vectors: 16x16 mode */
1109 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1111 ff_h263_encode_motion_vector(s, motion_x - pred_x,
1112 motion_y - pred_y, s->f_code);
1113 }else if(s->mv_type==MV_TYPE_FIELD){
1114 if(s->dquant) cbpc+= 8;
1116 inter_MCBPC_bits[cbpc],
1117 inter_MCBPC_code[cbpc]);
1119 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1121 put_bits(pb2, 2, dquant_code[s->dquant+2]);
1123 assert(!s->progressive_sequence);
1125 put_bits(pb2, 1, s->interlaced_dct);
1126 put_bits(pb2, 1, 1);
1128 if(interleaved_stats){
1129 s->misc_bits+= get_bits_diff(s);
1132 /* motion vectors: 16x8 interlaced mode */
1133 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1136 put_bits(&s->pb, 1, s->field_select[0][0]);
1137 put_bits(&s->pb, 1, s->field_select[0][1]);
1139 ff_h263_encode_motion_vector(s, s->mv[0][0][0] - pred_x,
1140 s->mv[0][0][1] - pred_y, s->f_code);
1141 ff_h263_encode_motion_vector(s, s->mv[0][1][0] - pred_x,
1142 s->mv[0][1][1] - pred_y, s->f_code);
1144 assert(s->mv_type==MV_TYPE_8X8);
1146 inter_MCBPC_bits[cbpc+16],
1147 inter_MCBPC_code[cbpc+16]);
1148 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1150 if(!s->progressive_sequence){
1152 put_bits(pb2, 1, s->interlaced_dct);
1155 if(interleaved_stats){
1156 s->misc_bits+= get_bits_diff(s);
1160 /* motion vectors: 8x8 mode*/
1161 h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1163 ff_h263_encode_motion_vector(s, s->current_picture.motion_val[0][ s->block_index[i] ][0] - pred_x,
1164 s->current_picture.motion_val[0][ s->block_index[i] ][1] - pred_y, s->f_code);
1168 if(interleaved_stats){
1169 s->mv_bits+= get_bits_diff(s);
1172 mpeg4_encode_blocks(s, block, NULL, NULL, NULL, tex_pb);
1174 if(interleaved_stats){
1175 s->p_tex_bits+= get_bits_diff(s);
1181 int dc_diff[6]; //dc values with the dc prediction subtracted
1182 int dir[6]; //prediction direction
1183 int zigzag_last_index[6];
1184 uint8_t *scan_table[6];
1188 dc_diff[i]= ff_mpeg4_pred_dc(s, i, block[i][0], &dir[i], 1);
1191 if(s->flags & CODEC_FLAG_AC_PRED){
1192 s->ac_pred= decide_ac_pred(s, block, dir, scan_table, zigzag_last_index);
1194 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1197 scan_table[i]= s->intra_scantable.permutated;
1202 for (i = 0; i < 6; i++) {
1203 if (s->block_last_index[i] >= 1)
1204 cbp |= 1 << (5 - i);
1208 if (s->pict_type == FF_I_TYPE) {
1209 if(s->dquant) cbpc+=4;
1211 intra_MCBPC_bits[cbpc],
1212 intra_MCBPC_code[cbpc]);
1214 if(s->dquant) cbpc+=8;
1215 put_bits(&s->pb, 1, 0); /* mb coded */
1217 inter_MCBPC_bits[cbpc + 4],
1218 inter_MCBPC_code[cbpc + 4]);
1220 put_bits(pb2, 1, s->ac_pred);
1222 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1224 put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
1226 if(!s->progressive_sequence){
1227 put_bits(dc_pb, 1, s->interlaced_dct);
1230 if(interleaved_stats){
1231 s->misc_bits+= get_bits_diff(s);
1234 mpeg4_encode_blocks(s, block, dc_diff, scan_table, dc_pb, tex_pb);
1236 if(interleaved_stats){
1237 s->i_tex_bits+= get_bits_diff(s);
1241 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
1243 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1247 void h263_encode_mb(MpegEncContext * s,
1248 DCTELEM block[6][64],
1249 int motion_x, int motion_y)
1251 int cbpc, cbpy, i, cbp, pred_x, pred_y;
1253 int16_t rec_intradc[6];
1255 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1);
1257 //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
1260 cbp= get_p_cbp(s, block, motion_x, motion_y);
1262 if ((cbp | motion_x | motion_y | s->dquant | (s->mv_type - MV_TYPE_16X16)) == 0) {
1263 /* skip macroblock */
1264 put_bits(&s->pb, 1, 1);
1265 if(interleaved_stats){
1273 put_bits(&s->pb, 1, 0); /* mb coded */
1277 if(s->alt_inter_vlc==0 || cbpc!=3)
1279 if(s->dquant) cbpc+= 8;
1280 if(s->mv_type==MV_TYPE_16X16){
1282 inter_MCBPC_bits[cbpc],
1283 inter_MCBPC_code[cbpc]);
1285 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1287 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1289 if(interleaved_stats){
1290 s->misc_bits+= get_bits_diff(s);
1293 /* motion vectors: 16x16 mode */
1294 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1297 ff_h263_encode_motion_vector(s, motion_x - pred_x,
1298 motion_y - pred_y, 1);
1301 h263p_encode_umotion(s, motion_x - pred_x);
1302 h263p_encode_umotion(s, motion_y - pred_y);
1303 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
1304 /* To prevent Start Code emulation */
1305 put_bits(&s->pb,1,1);
1309 inter_MCBPC_bits[cbpc+16],
1310 inter_MCBPC_code[cbpc+16]);
1311 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1313 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1315 if(interleaved_stats){
1316 s->misc_bits+= get_bits_diff(s);
1320 /* motion vectors: 8x8 mode*/
1321 h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1323 motion_x= s->current_picture.motion_val[0][ s->block_index[i] ][0];
1324 motion_y= s->current_picture.motion_val[0][ s->block_index[i] ][1];
1326 ff_h263_encode_motion_vector(s, motion_x - pred_x,
1327 motion_y - pred_y, 1);
1330 h263p_encode_umotion(s, motion_x - pred_x);
1331 h263p_encode_umotion(s, motion_y - pred_y);
1332 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
1333 /* To prevent Start Code emulation */
1334 put_bits(&s->pb,1,1);
1339 if(interleaved_stats){
1340 s->mv_bits+= get_bits_diff(s);
1343 assert(s->mb_intra);
1348 for(i=0; i<6; i++) {
1349 int16_t level = block[i][0];
1352 if(i<4) scale= s->y_dc_scale;
1353 else scale= s->c_dc_scale;
1355 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
1359 level = (level + (scale>>1))/scale;
1361 level = (level - (scale>>1))/scale;
1363 /* AIC can change CBP */
1364 if (level == 0 && s->block_last_index[i] == 0)
1365 s->block_last_index[i] = -1;
1367 if(!s->modified_quant){
1370 else if (level > 127)
1374 block[i][0] = level;
1375 /* Reconstruction */
1376 rec_intradc[i] = scale*level + pred_dc;
1378 rec_intradc[i] |= 1;
1379 //if ((rec_intradc[i] % 2) == 0)
1380 // rec_intradc[i]++;
1382 if (rec_intradc[i] < 0)
1384 else if (rec_intradc[i] > 2047)
1385 rec_intradc[i] = 2047;
1387 /* Update AC/DC tables */
1388 *dc_ptr[i] = rec_intradc[i];
1389 if (s->block_last_index[i] >= 0)
1390 cbp |= 1 << (5 - i);
1393 for(i=0; i<6; i++) {
1395 if (s->block_last_index[i] >= 1)
1396 cbp |= 1 << (5 - i);
1401 if (s->pict_type == FF_I_TYPE) {
1402 if(s->dquant) cbpc+=4;
1404 intra_MCBPC_bits[cbpc],
1405 intra_MCBPC_code[cbpc]);
1407 if(s->dquant) cbpc+=8;
1408 put_bits(&s->pb, 1, 0); /* mb coded */
1410 inter_MCBPC_bits[cbpc + 4],
1411 inter_MCBPC_code[cbpc + 4]);
1414 /* XXX: currently, we do not try to use ac prediction */
1415 put_bits(&s->pb, 1, 0); /* no AC prediction */
1418 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1420 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1422 if(interleaved_stats){
1423 s->misc_bits+= get_bits_diff(s);
1427 for(i=0; i<6; i++) {
1428 /* encode each block */
1429 h263_encode_block(s, block[i], i);
1431 /* Update INTRADC for decoding */
1432 if (s->h263_aic && s->mb_intra) {
1433 block[i][0] = rec_intradc[i];
1438 if(interleaved_stats){
1440 s->p_tex_bits+= get_bits_diff(s);
1443 s->i_tex_bits+= get_bits_diff(s);
1450 void ff_h263_loop_filter(MpegEncContext * s){
1452 const int linesize = s->linesize;
1453 const int uvlinesize= s->uvlinesize;
1454 const int xy = s->mb_y * s->mb_stride + s->mb_x;
1455 uint8_t *dest_y = s->dest[0];
1456 uint8_t *dest_cb= s->dest[1];
1457 uint8_t *dest_cr= s->dest[2];
1459 // if(s->pict_type==FF_B_TYPE && !s->readable) return;
1465 if(!IS_SKIP(s->current_picture.mb_type[xy])){
1467 s->dsp.h263_v_loop_filter(dest_y+8*linesize , linesize, qp_c);
1468 s->dsp.h263_v_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
1473 int qp_dt, qp_tt, qp_tc;
1475 if(IS_SKIP(s->current_picture.mb_type[xy-s->mb_stride]))
1478 qp_tt= s->current_picture.qscale_table[xy-s->mb_stride];
1486 const int chroma_qp= s->chroma_qscale_table[qp_tc];
1487 s->dsp.h263_v_loop_filter(dest_y , linesize, qp_tc);
1488 s->dsp.h263_v_loop_filter(dest_y+8, linesize, qp_tc);
1490 s->dsp.h263_v_loop_filter(dest_cb , uvlinesize, chroma_qp);
1491 s->dsp.h263_v_loop_filter(dest_cr , uvlinesize, chroma_qp);
1495 s->dsp.h263_h_loop_filter(dest_y-8*linesize+8 , linesize, qp_tt);
1498 if(qp_tt || IS_SKIP(s->current_picture.mb_type[xy-1-s->mb_stride]))
1501 qp_dt= s->current_picture.qscale_table[xy-1-s->mb_stride];
1504 const int chroma_qp= s->chroma_qscale_table[qp_dt];
1505 s->dsp.h263_h_loop_filter(dest_y -8*linesize , linesize, qp_dt);
1506 s->dsp.h263_h_loop_filter(dest_cb-8*uvlinesize, uvlinesize, chroma_qp);
1507 s->dsp.h263_h_loop_filter(dest_cr-8*uvlinesize, uvlinesize, chroma_qp);
1513 s->dsp.h263_h_loop_filter(dest_y +8, linesize, qp_c);
1514 if(s->mb_y + 1 == s->mb_height)
1515 s->dsp.h263_h_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
1520 if(qp_c || IS_SKIP(s->current_picture.mb_type[xy-1]))
1523 qp_lc= s->current_picture.qscale_table[xy-1];
1526 s->dsp.h263_h_loop_filter(dest_y, linesize, qp_lc);
1527 if(s->mb_y + 1 == s->mb_height){
1528 const int chroma_qp= s->chroma_qscale_table[qp_lc];
1529 s->dsp.h263_h_loop_filter(dest_y +8* linesize, linesize, qp_lc);
1530 s->dsp.h263_h_loop_filter(dest_cb , uvlinesize, chroma_qp);
1531 s->dsp.h263_h_loop_filter(dest_cr , uvlinesize, chroma_qp);
1538 static int h263_pred_dc(MpegEncContext * s, int n, int16_t **dc_val_ptr)
1540 int x, y, wrap, a, c, pred_dc;
1543 /* find prediction */
1545 x = 2 * s->mb_x + (n & 1);
1546 y = 2 * s->mb_y + ((n & 2) >> 1);
1547 wrap = s->b8_stride;
1548 dc_val = s->dc_val[0];
1552 wrap = s->mb_stride;
1553 dc_val = s->dc_val[n - 4 + 1];
1558 a = dc_val[(x - 1) + (y) * wrap];
1559 c = dc_val[(x) + (y - 1) * wrap];
1561 /* No prediction outside GOB boundary */
1562 if(s->first_slice_line && n!=3){
1564 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
1566 /* just DC prediction */
1567 if (a != 1024 && c != 1024)
1568 pred_dc = (a + c) >> 1;
1574 /* we assume pred is positive */
1575 *dc_val_ptr = &dc_val[x + y * wrap];
1578 #endif /* CONFIG_ENCODERS */
1580 static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n)
1582 int x, y, wrap, a, c, pred_dc, scale, i;
1583 int16_t *dc_val, *ac_val, *ac_val1;
1585 /* find prediction */
1587 x = 2 * s->mb_x + (n & 1);
1588 y = 2 * s->mb_y + (n>> 1);
1589 wrap = s->b8_stride;
1590 dc_val = s->dc_val[0];
1591 ac_val = s->ac_val[0][0];
1592 scale = s->y_dc_scale;
1596 wrap = s->mb_stride;
1597 dc_val = s->dc_val[n - 4 + 1];
1598 ac_val = s->ac_val[n - 4 + 1][0];
1599 scale = s->c_dc_scale;
1602 ac_val += ((y) * wrap + (x)) * 16;
1608 a = dc_val[(x - 1) + (y) * wrap];
1609 c = dc_val[(x) + (y - 1) * wrap];
1611 /* No prediction outside GOB boundary */
1612 if(s->first_slice_line && n!=3){
1614 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
1619 if (s->h263_aic_dir) {
1620 /* left prediction */
1624 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
1629 /* top prediction */
1631 ac_val -= 16 * wrap;
1633 block[s->dsp.idct_permutation[i ]] += ac_val[i + 8];
1639 /* just DC prediction */
1640 if (a != 1024 && c != 1024)
1641 pred_dc = (a + c) >> 1;
1648 /* we assume pred is positive */
1649 block[0]=block[0]*scale + pred_dc;
1656 /* Update AC/DC tables */
1657 dc_val[(x) + (y) * wrap] = block[0];
1661 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
1664 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
1667 int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir,
1671 int16_t *A, *B, *C, (*mot_val)[2];
1672 static const int off[4]= {2, 1, 1, -1};
1674 wrap = s->b8_stride;
1675 mot_val = s->current_picture.motion_val[dir] + s->block_index[block];
1678 /* special case for first (slice) line */
1679 if (s->first_slice_line && block<3) {
1680 // we can't just change some MVs to simulate that as we need them for the B frames (and ME)
1681 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
1682 if(block==0){ //most common case
1683 if(s->mb_x == s->resync_mb_x){ //rare
1685 }else if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
1686 C = mot_val[off[block] - wrap];
1691 *px = mid_pred(A[0], 0, C[0]);
1692 *py = mid_pred(A[1], 0, C[1]);
1699 if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
1700 C = mot_val[off[block] - wrap];
1701 *px = mid_pred(A[0], 0, C[0]);
1702 *py = mid_pred(A[1], 0, C[1]);
1707 }else{ /* block==2*/
1708 B = mot_val[ - wrap];
1709 C = mot_val[off[block] - wrap];
1710 if(s->mb_x == s->resync_mb_x) //rare
1713 *px = mid_pred(A[0], B[0], C[0]);
1714 *py = mid_pred(A[1], B[1], C[1]);
1717 B = mot_val[ - wrap];
1718 C = mot_val[off[block] - wrap];
1719 *px = mid_pred(A[0], B[0], C[0]);
1720 *py = mid_pred(A[1], B[1], C[1]);
1726 void ff_h263_encode_motion(MpegEncContext * s, int val, int f_code)
1728 int range, l, bit_size, sign, code, bits;
1733 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1735 bit_size = f_code - 1;
1736 range = 1 << bit_size;
1737 /* modulo encoding */
1738 l= INT_BIT - 6 - bit_size;
1741 val= (val^sign)-sign;
1745 code = (val >> bit_size) + 1;
1746 bits = val & (range - 1);
1748 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1750 put_bits(&s->pb, bit_size, bits);
1755 /* Encode MV differences on H.263+ with Unrestricted MV mode */
1756 static void h263p_encode_umotion(MpegEncContext * s, int val)
1766 put_bits(&s->pb, 1, 1);
1768 put_bits(&s->pb, 3, 0);
1770 put_bits(&s->pb, 3, 2);
1773 sval = ((val < 0) ? (short)(-val):(short)val);
1776 while (temp_val != 0) {
1777 temp_val = temp_val >> 1;
1783 tcode = (sval & (1 << (i-1))) >> (i-1);
1784 tcode = (tcode << 1) | 1;
1785 code = (code << 2) | tcode;
1788 code = ((code << 1) | (val < 0)) << 1;
1789 put_bits(&s->pb, (2*n_bits)+1, code);
1790 //printf("\nVal = %d\tCode = %d", sval, code);
1794 static void init_mv_penalty_and_fcode(MpegEncContext *s)
1799 for(f_code=1; f_code<=MAX_FCODE; f_code++){
1800 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
1803 if(mv==0) len= mvtab[0][1];
1805 int val, bit_size, code;
1807 bit_size = f_code - 1;
1813 code = (val >> bit_size) + 1;
1815 len= mvtab[code][1] + 1 + bit_size;
1817 len= mvtab[32][1] + av_log2(code>>5) + 2 + bit_size;
1821 mv_penalty[f_code][mv+MAX_MV]= len;
1825 for(f_code=MAX_FCODE; f_code>0; f_code--){
1826 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
1827 fcode_tab[mv+MAX_MV]= f_code;
1831 for(mv=0; mv<MAX_MV*2+1; mv++){
1832 umv_fcode_tab[mv]= 1;
1836 static void init_uni_dc_tab(void)
1838 int level, uni_code, uni_len;
1840 for(level=-256; level<256; level++){
1842 /* find number of bits */
1851 l= (-level) ^ ((1 << size) - 1);
1856 uni_code= DCtab_lum[size][0];
1857 uni_len = DCtab_lum[size][1];
1860 uni_code<<=size; uni_code|=l;
1863 uni_code<<=1; uni_code|=1;
1867 uni_DCtab_lum_bits[level+256]= uni_code;
1868 uni_DCtab_lum_len [level+256]= uni_len;
1871 uni_code= DCtab_chrom[size][0];
1872 uni_len = DCtab_chrom[size][1];
1875 uni_code<<=size; uni_code|=l;
1878 uni_code<<=1; uni_code|=1;
1882 uni_DCtab_chrom_bits[level+256]= uni_code;
1883 uni_DCtab_chrom_len [level+256]= uni_len;
1888 static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1889 int slevel, run, last;
1891 assert(MAX_LEVEL >= 64);
1892 assert(MAX_RUN >= 63);
1894 for(slevel=-64; slevel<64; slevel++){
1895 if(slevel==0) continue;
1896 for(run=0; run<64; run++){
1897 for(last=0; last<=1; last++){
1898 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1899 int level= slevel < 0 ? -slevel : slevel;
1900 int sign= slevel < 0 ? 1 : 0;
1901 int bits, len, code;
1904 len_tab[index]= 100;
1907 code= get_rl_index(rl, last, run, level);
1908 bits= rl->table_vlc[code][0];
1909 len= rl->table_vlc[code][1];
1910 bits=bits*2+sign; len++;
1912 if(code!=rl->n && len < len_tab[index]){
1913 bits_tab[index]= bits;
1914 len_tab [index]= len;
1918 bits= rl->table_vlc[rl->n][0];
1919 len= rl->table_vlc[rl->n][1];
1920 bits=bits*2; len++; //esc1
1921 level1= level - rl->max_level[last][run];
1923 code= get_rl_index(rl, last, run, level1);
1924 bits<<= rl->table_vlc[code][1];
1925 len += rl->table_vlc[code][1];
1926 bits += rl->table_vlc[code][0];
1927 bits=bits*2+sign; len++;
1929 if(code!=rl->n && len < len_tab[index]){
1930 bits_tab[index]= bits;
1931 len_tab [index]= len;
1937 bits= rl->table_vlc[rl->n][0];
1938 len= rl->table_vlc[rl->n][1];
1939 bits=bits*4+2; len+=2; //esc2
1940 run1 = run - rl->max_run[last][level] - 1;
1942 code= get_rl_index(rl, last, run1, level);
1943 bits<<= rl->table_vlc[code][1];
1944 len += rl->table_vlc[code][1];
1945 bits += rl->table_vlc[code][0];
1946 bits=bits*2+sign; len++;
1948 if(code!=rl->n && len < len_tab[index]){
1949 bits_tab[index]= bits;
1950 len_tab [index]= len;
1955 bits= rl->table_vlc[rl->n][0];
1956 len = rl->table_vlc[rl->n][1];
1957 bits=bits*4+3; len+=2; //esc3
1958 bits=bits*2+last; len++;
1959 bits=bits*64+run; len+=6;
1960 bits=bits*2+1; len++; //marker
1961 bits=bits*4096+(slevel&0xfff); len+=12;
1962 bits=bits*2+1; len++; //marker
1964 if(len < len_tab[index]){
1965 bits_tab[index]= bits;
1966 len_tab [index]= len;
1973 static void init_uni_h263_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1974 int slevel, run, last;
1976 assert(MAX_LEVEL >= 64);
1977 assert(MAX_RUN >= 63);
1979 for(slevel=-64; slevel<64; slevel++){
1980 if(slevel==0) continue;
1981 for(run=0; run<64; run++){
1982 for(last=0; last<=1; last++){
1983 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1984 int level= slevel < 0 ? -slevel : slevel;
1985 int sign= slevel < 0 ? 1 : 0;
1986 int bits, len, code;
1988 len_tab[index]= 100;
1991 code= get_rl_index(rl, last, run, level);
1992 bits= rl->table_vlc[code][0];
1993 len= rl->table_vlc[code][1];
1994 bits=bits*2+sign; len++;
1996 if(code!=rl->n && len < len_tab[index]){
1997 if(bits_tab) bits_tab[index]= bits;
1998 len_tab [index]= len;
2001 bits= rl->table_vlc[rl->n][0];
2002 len = rl->table_vlc[rl->n][1];
2003 bits=bits*2+last; len++;
2004 bits=bits*64+run; len+=6;
2005 bits=bits*256+(level&0xff); len+=8;
2007 if(len < len_tab[index]){
2008 if(bits_tab) bits_tab[index]= bits;
2009 len_tab [index]= len;
2016 void h263_encode_init(MpegEncContext *s)
2018 static int done = 0;
2025 init_rl(&rl_inter, static_rl_table_store[0]);
2026 init_rl(&rl_intra, static_rl_table_store[1]);
2027 init_rl(&rl_intra_aic, static_rl_table_store[2]);
2029 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
2030 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
2032 init_uni_h263_rl_tab(&rl_intra_aic, NULL, uni_h263_intra_aic_rl_len);
2033 init_uni_h263_rl_tab(&rl_inter , NULL, uni_h263_inter_rl_len);
2035 init_mv_penalty_and_fcode(s);
2037 s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
2039 s->intra_ac_vlc_length =s->inter_ac_vlc_length = uni_h263_inter_rl_len;
2040 s->intra_ac_vlc_last_length=s->inter_ac_vlc_last_length= uni_h263_inter_rl_len + 128*64;
2042 s->intra_ac_vlc_length = uni_h263_intra_aic_rl_len;
2043 s->intra_ac_vlc_last_length= uni_h263_intra_aic_rl_len + 128*64;
2045 s->ac_esc_length= 7+1+6+8;
2047 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
2048 switch(s->codec_id){
2049 case CODEC_ID_MPEG4:
2050 s->fcode_tab= fcode_tab;
2051 s->min_qcoeff= -2048;
2052 s->max_qcoeff= 2047;
2053 s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len;
2054 s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64;
2055 s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len;
2056 s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64;
2057 s->luma_dc_vlc_length= uni_DCtab_lum_len;
2058 s->chroma_dc_vlc_length= uni_DCtab_chrom_len;
2059 s->ac_esc_length= 7+2+1+6+1+12+1;
2060 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
2061 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
2063 if(s->flags & CODEC_FLAG_GLOBAL_HEADER){
2065 s->avctx->extradata= av_malloc(1024);
2066 init_put_bits(&s->pb, s->avctx->extradata, 1024);
2068 if(!(s->workaround_bugs & FF_BUG_MS))
2069 mpeg4_encode_visual_object_header(s);
2070 mpeg4_encode_vol_header(s, 0, 0);
2072 // ff_mpeg4_stuffing(&s->pb); ?
2073 flush_put_bits(&s->pb);
2074 s->avctx->extradata_size= (put_bits_count(&s->pb)+7)>>3;
2078 case CODEC_ID_H263P:
2080 s->fcode_tab= umv_fcode_tab;
2081 if(s->modified_quant){
2082 s->min_qcoeff= -2047;
2083 s->max_qcoeff= 2047;
2085 s->min_qcoeff= -127;
2089 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
2091 if (s->h263_flv > 1) {
2092 s->min_qcoeff= -1023;
2093 s->max_qcoeff= 1023;
2095 s->min_qcoeff= -127;
2098 s->y_dc_scale_table=
2099 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
2101 default: //nothing needed - default table already set in mpegvideo.c
2102 s->min_qcoeff= -127;
2104 s->y_dc_scale_table=
2105 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
2110 * encodes a 8x8 block.
2111 * @param block the 8x8 block
2112 * @param n block index (0-3 are luma, 4-5 are chroma)
2114 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
2116 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
2120 if (s->mb_intra && !s->h263_aic) {
2123 /* 255 cannot be represented, so we clamp */
2128 /* 0 cannot be represented also */
2129 else if (level < 1) {
2133 if (level == 128) //FIXME check rv10
2134 put_bits(&s->pb, 8, 0xff);
2136 put_bits(&s->pb, 8, level);
2140 if (s->h263_aic && s->mb_intra)
2143 if(s->alt_inter_vlc && !s->mb_intra){
2145 int inter_vlc_bits=0;
2149 last_index = s->block_last_index[n];
2150 last_non_zero = i - 1;
2151 for (; i <= last_index; i++) {
2152 j = s->intra_scantable.permutated[i];
2155 run = i - last_non_zero - 1;
2156 last = (i == last_index);
2158 if(level<0) level= -level;
2160 code = get_rl_index(rl, last, run, level);
2161 aic_code = get_rl_index(&rl_intra_aic, last, run, level);
2162 inter_vlc_bits += rl->table_vlc[code][1]+1;
2163 aic_vlc_bits += rl_intra_aic.table_vlc[aic_code][1]+1;
2165 if (code == rl->n) {
2166 inter_vlc_bits += 1+6+8-1;
2168 if (aic_code == rl_intra_aic.n) {
2169 aic_vlc_bits += 1+6+8-1;
2170 wrong_pos += run + 1;
2172 wrong_pos += wrong_run[aic_code];
2177 if(aic_vlc_bits < inter_vlc_bits && wrong_pos > 63)
2183 last_index = s->block_last_index[n];
2184 last_non_zero = i - 1;
2185 for (; i <= last_index; i++) {
2186 j = s->intra_scantable.permutated[i];
2189 run = i - last_non_zero - 1;
2190 last = (i == last_index);
2197 code = get_rl_index(rl, last, run, level);
2198 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2199 if (code == rl->n) {
2200 if(s->h263_flv <= 1){
2201 put_bits(&s->pb, 1, last);
2202 put_bits(&s->pb, 6, run);
2204 assert(slevel != 0);
2207 put_sbits(&s->pb, 8, slevel);
2209 put_bits(&s->pb, 8, 128);
2210 put_sbits(&s->pb, 5, slevel);
2211 put_sbits(&s->pb, 6, slevel>>5);
2214 if(level < 64) { // 7-bit level
2215 put_bits(&s->pb, 1, 0);
2216 put_bits(&s->pb, 1, last);
2217 put_bits(&s->pb, 6, run);
2219 put_sbits(&s->pb, 7, slevel);
2222 put_bits(&s->pb, 1, 1);
2223 put_bits(&s->pb, 1, last);
2224 put_bits(&s->pb, 6, run);
2226 put_sbits(&s->pb, 11, slevel);
2230 put_bits(&s->pb, 1, sign);
2237 /***************************************************/
2239 * add mpeg4 stuffing bits (01...1)
2241 void ff_mpeg4_stuffing(PutBitContext * pbc)
2244 put_bits(pbc, 1, 0);
2245 length= (-put_bits_count(pbc))&7;
2246 if(length) put_bits(pbc, length, (1<<length)-1);
2249 /* must be called before writing the header */
2250 void ff_set_mpeg4_time(MpegEncContext * s){
2251 if(s->pict_type==FF_B_TYPE){
2252 ff_mpeg4_init_direct_mv(s);
2254 s->last_time_base= s->time_base;
2255 s->time_base= s->time/s->avctx->time_base.den;
2259 static void mpeg4_encode_gop_header(MpegEncContext * s){
2260 int hours, minutes, seconds;
2263 put_bits(&s->pb, 16, 0);
2264 put_bits(&s->pb, 16, GOP_STARTCODE);
2266 time= s->current_picture_ptr->pts;
2267 if(s->reordered_input_picture[1])
2268 time= FFMIN(time, s->reordered_input_picture[1]->pts);
2269 time= time*s->avctx->time_base.num;
2271 seconds= time/s->avctx->time_base.den;
2272 minutes= seconds/60; seconds %= 60;
2273 hours= minutes/60; minutes %= 60;
2276 put_bits(&s->pb, 5, hours);
2277 put_bits(&s->pb, 6, minutes);
2278 put_bits(&s->pb, 1, 1);
2279 put_bits(&s->pb, 6, seconds);
2281 put_bits(&s->pb, 1, !!(s->flags&CODEC_FLAG_CLOSED_GOP));
2282 put_bits(&s->pb, 1, 0); //broken link == NO
2284 s->last_time_base= time / s->avctx->time_base.den;
2286 ff_mpeg4_stuffing(&s->pb);
2289 static void mpeg4_encode_visual_object_header(MpegEncContext * s){
2290 int profile_and_level_indication;
2293 if(s->avctx->profile != FF_PROFILE_UNKNOWN){
2294 profile_and_level_indication = s->avctx->profile << 4;
2295 }else if(s->max_b_frames || s->quarter_sample){
2296 profile_and_level_indication= 0xF0; // adv simple
2298 profile_and_level_indication= 0x00; // simple
2301 if(s->avctx->level != FF_LEVEL_UNKNOWN){
2302 profile_and_level_indication |= s->avctx->level;
2304 profile_and_level_indication |= 1; //level 1
2307 if(profile_and_level_indication>>4 == 0xF){
2315 put_bits(&s->pb, 16, 0);
2316 put_bits(&s->pb, 16, VOS_STARTCODE);
2318 put_bits(&s->pb, 8, profile_and_level_indication);
2320 put_bits(&s->pb, 16, 0);
2321 put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);
2323 put_bits(&s->pb, 1, 1);
2324 put_bits(&s->pb, 4, vo_ver_id);
2325 put_bits(&s->pb, 3, 1); //priority
2327 put_bits(&s->pb, 4, 1); //visual obj type== video obj
2329 put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME
2331 ff_mpeg4_stuffing(&s->pb);
2334 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number)
2338 if (!CONFIG_MPEG4_ENCODER) return;
2340 if(s->max_b_frames || s->quarter_sample){
2342 s->vo_type= ADV_SIMPLE_VO_TYPE;
2345 s->vo_type= SIMPLE_VO_TYPE;
2348 put_bits(&s->pb, 16, 0);
2349 put_bits(&s->pb, 16, 0x100 + vo_number); /* video obj */
2350 put_bits(&s->pb, 16, 0);
2351 put_bits(&s->pb, 16, 0x120 + vol_number); /* video obj layer */
2353 put_bits(&s->pb, 1, 0); /* random access vol */
2354 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
2355 if(s->workaround_bugs & FF_BUG_MS) {
2356 put_bits(&s->pb, 1, 0); /* is obj layer id= no */
2358 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
2359 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
2360 put_bits(&s->pb, 3, 1); /* is obj layer priority */
2363 aspect_to_info(s, s->avctx->sample_aspect_ratio);
2365 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
2366 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
2367 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
2368 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
2371 if(s->workaround_bugs & FF_BUG_MS) { //
2372 put_bits(&s->pb, 1, 0); /* vol control parameters= no @@@ */
2374 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
2375 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
2376 put_bits(&s->pb, 1, s->low_delay);
2377 put_bits(&s->pb, 1, 0); /* vbv parameters= no */
2380 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
2381 put_bits(&s->pb, 1, 1); /* marker bit */
2383 put_bits(&s->pb, 16, s->avctx->time_base.den);
2384 if (s->time_increment_bits < 1)
2385 s->time_increment_bits = 1;
2386 put_bits(&s->pb, 1, 1); /* marker bit */
2387 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
2388 put_bits(&s->pb, 1, 1); /* marker bit */
2389 put_bits(&s->pb, 13, s->width); /* vol width */
2390 put_bits(&s->pb, 1, 1); /* marker bit */
2391 put_bits(&s->pb, 13, s->height); /* vol height */
2392 put_bits(&s->pb, 1, 1); /* marker bit */
2393 put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
2394 put_bits(&s->pb, 1, 1); /* obmc disable */
2395 if (vo_ver_id == 1) {
2396 put_bits(&s->pb, 1, s->vol_sprite_usage); /* sprite enable */
2398 put_bits(&s->pb, 2, s->vol_sprite_usage); /* sprite enable */
2401 put_bits(&s->pb, 1, 0); /* not 8 bit == false */
2402 put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
2405 ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix);
2406 ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix);
2410 put_bits(&s->pb, 1, s->quarter_sample);
2411 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
2412 s->resync_marker= s->rtp_mode;
2413 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
2414 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
2415 if(s->data_partitioning){
2416 put_bits(&s->pb, 1, 0); /* no rvlc */
2419 if (vo_ver_id != 1){
2420 put_bits(&s->pb, 1, 0); /* newpred */
2421 put_bits(&s->pb, 1, 0); /* reduced res vop */
2423 put_bits(&s->pb, 1, 0); /* scalability */
2425 ff_mpeg4_stuffing(&s->pb);
2428 if(!(s->flags & CODEC_FLAG_BITEXACT)){
2429 put_bits(&s->pb, 16, 0);
2430 put_bits(&s->pb, 16, 0x1B2); /* user_data */
2431 ff_put_string(&s->pb, LIBAVCODEC_IDENT, 0);
2435 /* write mpeg4 VOP header */
2436 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
2439 int time_div, time_mod;
2441 if(s->pict_type==FF_I_TYPE){
2442 if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
2443 if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT) //HACK, the reference sw is buggy
2444 mpeg4_encode_visual_object_header(s);
2445 if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT || picture_number==0) //HACK, the reference sw is buggy
2446 mpeg4_encode_vol_header(s, 0, 0);
2448 if(!(s->workaround_bugs & FF_BUG_MS))
2449 mpeg4_encode_gop_header(s);
2452 s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE;
2454 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->time_base.den, FRAME_RATE_BASE);
2456 put_bits(&s->pb, 16, 0); /* vop header */
2457 put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */
2458 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
2461 time_div= s->time/s->avctx->time_base.den;
2462 time_mod= s->time%s->avctx->time_base.den;
2463 time_incr= time_div - s->last_time_base;
2464 assert(time_incr >= 0);
2466 put_bits(&s->pb, 1, 1);
2468 put_bits(&s->pb, 1, 0);
2470 put_bits(&s->pb, 1, 1); /* marker */
2471 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
2472 put_bits(&s->pb, 1, 1); /* marker */
2473 put_bits(&s->pb, 1, 1); /* vop coded */
2474 if ( s->pict_type == FF_P_TYPE
2475 || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
2476 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
2478 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
2479 if(!s->progressive_sequence){
2480 put_bits(&s->pb, 1, s->current_picture_ptr->top_field_first);
2481 put_bits(&s->pb, 1, s->alternate_scan);
2483 //FIXME sprite stuff
2485 put_bits(&s->pb, 5, s->qscale);
2487 if (s->pict_type != FF_I_TYPE)
2488 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
2489 if (s->pict_type == FF_B_TYPE)
2490 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
2491 // printf("****frame %d\n", picture_number);
2494 #endif //CONFIG_ENCODERS
2498 * encoding quantized level -> quantized diff
2499 * decoding quantized diff -> quantized level
2500 * @param n block index (0-3 are luma, 4-5 are chroma)
2501 * @param dir_ptr pointer to an integer where the prediction direction will be stored
2503 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding)
2505 int a, b, c, wrap, pred, scale, ret;
2508 /* find prediction */
2510 scale = s->y_dc_scale;
2512 scale = s->c_dc_scale;
2517 wrap= s->block_wrap[n];
2518 dc_val = s->dc_val[0] + s->block_index[n];
2524 b = dc_val[ - 1 - wrap];
2525 c = dc_val[ - wrap];
2527 /* outside slice handling (we can't do that by memset as we need the dc for error resilience) */
2528 if(s->first_slice_line && n!=3){
2530 if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
2532 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
2533 if(n==0 || n==4 || n==5)
2537 if (abs(a - b) < abs(b - c)) {
2539 *dir_ptr = 1; /* top */
2542 *dir_ptr = 0; /* left */
2544 /* we assume pred is positive */
2545 pred = FASTDIV((pred + (scale >> 1)), scale);
2552 if(s->error_recognition>=3){
2554 av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
2557 if(level*scale > 2048 + scale){
2558 av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
2567 else if(!(s->workaround_bugs&FF_BUG_DC_CLIP))
2577 * @param n block index (0-3 are luma, 4-5 are chroma)
2578 * @param dir the ac prediction direction
2580 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
2584 int16_t *ac_val, *ac_val1;
2585 int8_t * const qscale_table= s->current_picture.qscale_table;
2587 /* find prediction */
2588 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2592 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
2593 /* left prediction */
2596 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
2599 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
2602 /* different qscale, we must rescale */
2604 block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
2608 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
2609 /* top prediction */
2610 ac_val -= 16 * s->block_wrap[n];
2612 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
2615 block[s->dsp.idct_permutation[i]] += ac_val[i + 8];
2618 /* different qscale, we must rescale */
2620 block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
2627 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
2631 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
2638 * encodes the dc value.
2639 * @param n block index (0-3 are luma, 4-5 are chroma)
2641 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
2644 // if(level<-255 || level>255) printf("dc overflow\n");
2648 put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]);
2651 put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]);
2655 /* find number of bits */
2665 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
2668 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
2671 /* encode remaining bits */
2674 level = (-level) ^ ((1 << size) - 1);
2675 put_bits(&s->pb, size, level);
2677 put_bits(&s->pb, 1, 1);
2682 static inline int mpeg4_get_dc_length(int level, int n){
2684 return uni_DCtab_lum_len[level + 256];
2686 return uni_DCtab_chrom_len[level + 256];
2691 * encodes a 8x8 block
2692 * @param n block index (0-3 are luma, 4-5 are chroma)
2694 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2695 uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
2697 int i, last_non_zero;
2698 #if 0 //variables for the outcommented version
2699 int code, sign, last;
2704 const int last_index = s->block_last_index[n];
2706 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2707 /* mpeg4 based DC predictor */
2708 mpeg4_encode_dc(dc_pb, intra_dc, n);
2709 if(last_index<1) return;
2712 bits_tab= uni_mpeg4_intra_rl_bits;
2713 len_tab = uni_mpeg4_intra_rl_len;
2715 if(last_index<0) return;
2718 bits_tab= uni_mpeg4_inter_rl_bits;
2719 len_tab = uni_mpeg4_inter_rl_len;
2723 last_non_zero = i - 1;
2725 for (; i < last_index; i++) {
2726 int level = block[ scan_table[i] ];
2728 int run = i - last_non_zero - 1;
2730 if((level&(~127)) == 0){
2731 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2732 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2734 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);
2739 /*if(i<=last_index)*/{
2740 int level = block[ scan_table[i] ];
2741 int run = i - last_non_zero - 1;
2743 if((level&(~127)) == 0){
2744 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2745 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2747 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);
2751 for (; i <= last_index; i++) {
2752 const int slevel = block[ scan_table[i] ];
2755 int run = i - last_non_zero - 1;
2756 last = (i == last_index);
2763 code = get_rl_index(rl, last, run, level);
2764 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2765 if (code == rl->n) {
2767 level1 = level - rl->max_level[last][run];
2770 code = get_rl_index(rl, last, run, level1);
2771 if (code == rl->n) {
2773 put_bits(ac_pb, 1, 1);
2774 if (level > MAX_LEVEL)
2776 run1 = run - rl->max_run[last][level] - 1;
2779 code = get_rl_index(rl, last, run1, level);
2780 if (code == rl->n) {
2783 put_bits(ac_pb, 1, 1);
2784 put_bits(ac_pb, 1, last);
2785 put_bits(ac_pb, 6, run);
2786 put_bits(ac_pb, 1, 1);
2787 put_sbits(ac_pb, 12, slevel);
2788 put_bits(ac_pb, 1, 1);
2791 put_bits(ac_pb, 1, 0);
2792 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2793 put_bits(ac_pb, 1, sign);
2797 put_bits(ac_pb, 1, 0);
2798 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2799 put_bits(ac_pb, 1, sign);
2802 put_bits(ac_pb, 1, sign);
2810 static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2811 uint8_t *scan_table)
2813 int i, last_non_zero;
2815 const int last_index = s->block_last_index[n];
2818 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2819 /* mpeg4 based DC predictor */
2820 len += mpeg4_get_dc_length(intra_dc, n);
2821 if(last_index<1) return len;
2823 len_tab = uni_mpeg4_intra_rl_len;
2825 if(last_index<0) return 0;
2827 len_tab = uni_mpeg4_inter_rl_len;
2831 last_non_zero = i - 1;
2832 for (; i < last_index; i++) {
2833 int level = block[ scan_table[i] ];
2835 int run = i - last_non_zero - 1;
2837 if((level&(~127)) == 0){
2838 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2839 len += len_tab[index];
2841 len += 7+2+1+6+1+12+1;
2846 /*if(i<=last_index)*/{
2847 int level = block[ scan_table[i] ];
2848 int run = i - last_non_zero - 1;
2850 if((level&(~127)) == 0){
2851 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2852 len += len_tab[index];
2854 len += 7+2+1+6+1+12+1;
2864 /***********************************************/
2867 static VLC intra_MCBPC_vlc;
2868 static VLC inter_MCBPC_vlc;
2869 static VLC cbpy_vlc;
2871 static VLC dc_lum, dc_chrom;
2872 static VLC sprite_trajectory;
2873 static VLC mb_type_b_vlc;
2874 static VLC h263_mbtype_b_vlc;
2875 static VLC cbpc_b_vlc;
2879 /* XXX: find a better solution to handle static init */
2880 void h263_decode_init_vlc(MpegEncContext *s)
2882 static int done = 0;
2887 INIT_VLC_STATIC(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 9,
2888 intra_MCBPC_bits, 1, 1,
2889 intra_MCBPC_code, 1, 1, 72);
2890 INIT_VLC_STATIC(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 28,
2891 inter_MCBPC_bits, 1, 1,
2892 inter_MCBPC_code, 1, 1, 198);
2893 INIT_VLC_STATIC(&cbpy_vlc, CBPY_VLC_BITS, 16,
2894 &cbpy_tab[0][1], 2, 1,
2895 &cbpy_tab[0][0], 2, 1, 64);
2896 INIT_VLC_STATIC(&mv_vlc, MV_VLC_BITS, 33,
2898 &mvtab[0][0], 2, 1, 538);
2899 init_rl(&rl_inter, static_rl_table_store[0]);
2900 init_rl(&rl_intra, static_rl_table_store[1]);
2901 init_rl(&rvlc_rl_inter, static_rl_table_store[3]);
2902 init_rl(&rvlc_rl_intra, static_rl_table_store[4]);
2903 init_rl(&rl_intra_aic, static_rl_table_store[2]);
2904 INIT_VLC_RL(rl_inter, 554);
2905 INIT_VLC_RL(rl_intra, 554);
2906 INIT_VLC_RL(rvlc_rl_inter, 1072);
2907 INIT_VLC_RL(rvlc_rl_intra, 1072);
2908 INIT_VLC_RL(rl_intra_aic, 554);
2909 INIT_VLC_STATIC(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
2910 &DCtab_lum[0][1], 2, 1,
2911 &DCtab_lum[0][0], 2, 1, 512);
2912 INIT_VLC_STATIC(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
2913 &DCtab_chrom[0][1], 2, 1,
2914 &DCtab_chrom[0][0], 2, 1, 512);
2915 INIT_VLC_STATIC(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
2916 &sprite_trajectory_tab[0][1], 4, 2,
2917 &sprite_trajectory_tab[0][0], 4, 2, 128);
2918 INIT_VLC_STATIC(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
2919 &mb_type_b_tab[0][1], 2, 1,
2920 &mb_type_b_tab[0][0], 2, 1, 16);
2921 INIT_VLC_STATIC(&h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15,
2922 &h263_mbtype_b_tab[0][1], 2, 1,
2923 &h263_mbtype_b_tab[0][0], 2, 1, 80);
2924 INIT_VLC_STATIC(&cbpc_b_vlc, CBPC_B_VLC_BITS, 4,
2925 &cbpc_b_tab[0][1], 2, 1,
2926 &cbpc_b_tab[0][0], 2, 1, 8);
2931 * Get the GOB height based on picture height.
2933 int ff_h263_get_gob_height(MpegEncContext *s){
2934 if (s->height <= 400)
2936 else if (s->height <= 800)
2942 int ff_h263_decode_mba(MpegEncContext *s)
2947 if(s->mb_num-1 <= ff_mba_max[i]) break;
2949 mb_pos= get_bits(&s->gb, ff_mba_length[i]);
2950 s->mb_x= mb_pos % s->mb_width;
2951 s->mb_y= mb_pos / s->mb_width;
2956 void ff_h263_encode_mba(MpegEncContext *s)
2961 if(s->mb_num-1 <= ff_mba_max[i]) break;
2963 mb_pos= s->mb_x + s->mb_width*s->mb_y;
2964 put_bits(&s->pb, ff_mba_length[i], mb_pos);
2968 * decodes the group of blocks header or slice header.
2969 * @return <0 if an error occurred
2971 static int h263_decode_gob_header(MpegEncContext *s)
2973 unsigned int val, gfid, gob_number;
2976 /* Check for GOB Start Code */
2977 val = show_bits(&s->gb, 16);
2981 /* We have a GBSC probably with GSTUFF */
2982 skip_bits(&s->gb, 16); /* Drop the zeros */
2983 left= get_bits_left(&s->gb);
2984 //MN: we must check the bits left or we might end in a infinite loop (or segfault)
2985 for(;left>13; left--){
2986 if(get_bits1(&s->gb)) break; /* Seek the '1' bit */
2991 if(s->h263_slice_structured){
2992 if(get_bits1(&s->gb)==0)
2995 ff_h263_decode_mba(s);
2997 if(s->mb_num > 1583)
2998 if(get_bits1(&s->gb)==0)
3001 s->qscale = get_bits(&s->gb, 5); /* SQUANT */
3002 if(get_bits1(&s->gb)==0)
3004 gfid = get_bits(&s->gb, 2); /* GFID */
3006 gob_number = get_bits(&s->gb, 5); /* GN */
3008 s->mb_y= s->gob_index* gob_number;
3009 gfid = get_bits(&s->gb, 2); /* GFID */
3010 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
3013 if(s->mb_y >= s->mb_height)
3022 static inline void memsetw(short *tab, int val, int n)
3031 void ff_mpeg4_init_partitions(MpegEncContext *s)
3033 uint8_t *start= put_bits_ptr(&s->pb);
3034 uint8_t *end= s->pb.buf_end;
3035 int size= end - start;
3036 int pb_size = (((intptr_t)start + size/3)&(~3)) - (intptr_t)start;
3037 int tex_size= (size - 2*pb_size)&(~3);
3039 set_put_bits_buffer_size(&s->pb, pb_size);
3040 init_put_bits(&s->tex_pb, start + pb_size , tex_size);
3041 init_put_bits(&s->pb2 , start + pb_size + tex_size, pb_size);
3044 void ff_mpeg4_merge_partitions(MpegEncContext *s)
3046 const int pb2_len = put_bits_count(&s->pb2 );
3047 const int tex_pb_len= put_bits_count(&s->tex_pb);
3048 const int bits= put_bits_count(&s->pb);
3050 if(s->pict_type==FF_I_TYPE){
3051 put_bits(&s->pb, 19, DC_MARKER);
3052 s->misc_bits+=19 + pb2_len + bits - s->last_bits;
3053 s->i_tex_bits+= tex_pb_len;
3055 put_bits(&s->pb, 17, MOTION_MARKER);
3056 s->misc_bits+=17 + pb2_len;
3057 s->mv_bits+= bits - s->last_bits;
3058 s->p_tex_bits+= tex_pb_len;
3061 flush_put_bits(&s->pb2);
3062 flush_put_bits(&s->tex_pb);
3064 set_put_bits_buffer_size(&s->pb, s->pb2.buf_end - s->pb.buf);
3065 ff_copy_bits(&s->pb, s->pb2.buf , pb2_len);
3066 ff_copy_bits(&s->pb, s->tex_pb.buf, tex_pb_len);
3067 s->last_bits= put_bits_count(&s->pb);
3070 #endif //CONFIG_ENCODERS
3072 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
3073 switch(s->pict_type){
3078 return s->f_code+15;
3080 return FFMAX3(s->f_code, s->b_code, 2) + 15;
3088 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
3090 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
3092 put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0);
3093 put_bits(&s->pb, 1, 1);
3095 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
3096 put_bits(&s->pb, s->quant_precision, s->qscale);
3097 put_bits(&s->pb, 1, 0); /* no HEC */
3100 #endif //CONFIG_ENCODERS
3103 * check if the next stuff is a resync marker or the end.
3106 static inline int mpeg4_is_resync(MpegEncContext *s){
3107 int bits_count= get_bits_count(&s->gb);
3108 int v= show_bits(&s->gb, 16);
3110 if(s->workaround_bugs&FF_BUG_NO_PADDING){
3115 if(s->pict_type==FF_B_TYPE || (v>>(8-s->pict_type)!=1) || s->partitioned_frame)
3117 skip_bits(&s->gb, 8+s->pict_type);
3118 bits_count+= 8+s->pict_type;
3119 v= show_bits(&s->gb, 16);
3122 if(bits_count + 8 >= s->gb.size_in_bits){
3124 v|= 0x7F >> (7-(bits_count&7));
3129 if(v == ff_mpeg4_resync_prefix[bits_count&7]){
3131 GetBitContext gb= s->gb;
3133 skip_bits(&s->gb, 1);
3134 align_get_bits(&s->gb);
3136 for(len=0; len<32; len++){
3137 if(get_bits1(&s->gb)) break;
3142 if(len>=ff_mpeg4_get_video_packet_prefix_length(s))
3150 * decodes the next video packet.
3151 * @return <0 if something went wrong
3153 static int mpeg4_decode_video_packet_header(MpegEncContext *s)
3155 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
3156 int header_extension=0, mb_num, len;
3158 /* is there enough space left for a video packet + header */
3159 if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1;
3161 for(len=0; len<32; len++){
3162 if(get_bits1(&s->gb)) break;
3165 if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
3166 av_log(s->avctx, AV_LOG_ERROR, "marker does not match f_code\n");
3170 if(s->shape != RECT_SHAPE){
3171 header_extension= get_bits1(&s->gb);
3172 //FIXME more stuff here
3175 mb_num= get_bits(&s->gb, mb_num_bits);
3176 if(mb_num>=s->mb_num){
3177 av_log(s->avctx, AV_LOG_ERROR, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);
3180 if(s->pict_type == FF_B_TYPE){
3181 while(s->next_picture.mbskip_table[ s->mb_index2xy[ mb_num ] ]) mb_num++;
3182 if(mb_num >= s->mb_num) return -1; // slice contains just skipped MBs which where already decoded
3185 s->mb_x= mb_num % s->mb_width;
3186 s->mb_y= mb_num / s->mb_width;
3188 if(s->shape != BIN_ONLY_SHAPE){
3189 int qscale= get_bits(&s->gb, s->quant_precision);
3191 s->chroma_qscale=s->qscale= qscale;
3194 if(s->shape == RECT_SHAPE){
3195 header_extension= get_bits1(&s->gb);
3197 if(header_extension){
3201 while (get_bits1(&s->gb) != 0)
3204 check_marker(&s->gb, "before time_increment in video packed header");
3205 time_increment= get_bits(&s->gb, s->time_increment_bits);
3206 check_marker(&s->gb, "before vop_coding_type in video packed header");
3208 skip_bits(&s->gb, 2); /* vop coding type */
3209 //FIXME not rect stuff here
3211 if(s->shape != BIN_ONLY_SHAPE){
3212 skip_bits(&s->gb, 3); /* intra dc vlc threshold */
3213 //FIXME don't just ignore everything
3214 if(s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3215 mpeg4_decode_sprite_trajectory(s, &s->gb);
3216 av_log(s->avctx, AV_LOG_ERROR, "untested\n");
3219 //FIXME reduced res stuff here
3221 if (s->pict_type != FF_I_TYPE) {
3222 int f_code = get_bits(&s->gb, 3); /* fcode_for */
3224 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (f_code=0)\n");
3227 if (s->pict_type == FF_B_TYPE) {
3228 int b_code = get_bits(&s->gb, 3);
3230 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (b_code=0)\n");
3235 //FIXME new-pred stuff
3237 //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));
3242 void ff_mpeg4_clean_buffers(MpegEncContext *s)
3244 int c_wrap, c_xy, l_wrap, l_xy;
3246 l_wrap= s->b8_stride;
3247 l_xy= (2*s->mb_y-1)*l_wrap + s->mb_x*2 - 1;
3248 c_wrap= s->mb_stride;
3249 c_xy= (s->mb_y-1)*c_wrap + s->mb_x - 1;
3253 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
3254 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
3255 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
3259 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t));
3260 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
3261 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
3264 // we can't clear the MVs as they might be needed by a b frame
3265 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t));
3266 // memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
3267 s->last_mv[0][0][0]=
3268 s->last_mv[0][0][1]=
3269 s->last_mv[1][0][0]=
3270 s->last_mv[1][0][1]= 0;
3274 * finds the next resync_marker
3275 * @param p pointer to buffer to scan
3276 * @param end pointer to the end of the buffer
3277 * @return pointer to the next resync_marker, or \p end if none was found
3279 const uint8_t *ff_h263_find_resync_marker(const uint8_t *restrict p, const uint8_t * restrict end)
3287 if (!p[-1] && p[1]) return p - 1;
3288 else if(!p[ 1] && p[2]) return p;
3295 * decodes the group of blocks / video packet header.
3296 * @return bit position of the resync_marker, or <0 if none was found
3298 int ff_h263_resync(MpegEncContext *s){
3301 if(s->codec_id==CODEC_ID_MPEG4){
3303 align_get_bits(&s->gb);
3306 if(show_bits(&s->gb, 16)==0){
3307 pos= get_bits_count(&s->gb);
3308 if(s->codec_id==CODEC_ID_MPEG4)
3309 ret= mpeg4_decode_video_packet_header(s);
3311 ret= h263_decode_gob_header(s);
3315 //OK, it's not where it is supposed to be ...
3316 s->gb= s->last_resync_gb;
3317 align_get_bits(&s->gb);
3318 left= get_bits_left(&s->gb);
3320 for(;left>16+1+5+5; left-=8){
3321 if(show_bits(&s->gb, 16)==0){
3322 GetBitContext bak= s->gb;
3324 pos= get_bits_count(&s->gb);
3325 if(s->codec_id==CODEC_ID_MPEG4)
3326 ret= mpeg4_decode_video_packet_header(s);
3328 ret= h263_decode_gob_header(s);
3334 skip_bits(&s->gb, 8);
3341 * gets the average motion vector for a GMC MB.
3342 * @param n either 0 for the x component or 1 for y
3343 * @returns the average MV for a GMC MB
3345 static inline int get_amv(MpegEncContext *s, int n){
3346 int x, y, mb_v, sum, dx, dy, shift;
3347 int len = 1 << (s->f_code + 4);
3348 const int a= s->sprite_warping_accuracy;
3350 if(s->workaround_bugs & FF_BUG_AMV)
3351 len >>= s->quarter_sample;
3353 if(s->real_sprite_warping_points==1){
3354 if(s->divx_version==500 && s->divx_build==413)
3355 sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample));
3357 sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a);
3359 dx= s->sprite_delta[n][0];
3360 dy= s->sprite_delta[n][1];
3361 shift= s->sprite_shift[0];
3362 if(n) dy -= 1<<(shift + a + 1);
3363 else dx -= 1<<(shift + a + 1);
3364 mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16;
3367 for(y=0; y<16; y++){
3371 //XXX FIXME optimize
3372 for(x=0; x<16; x++){
3377 sum= RSHIFT(sum, a+8-s->quarter_sample);
3380 if (sum < -len) sum= -len;
3381 else if (sum >= len) sum= len-1;
3387 * decodes first partition.
3388 * @return number of MBs decoded or <0 if an error occurred
3390 static int mpeg4_decode_partition_a(MpegEncContext *s){
3392 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3394 /* decode first partition */
3396 s->first_slice_line=1;
3397 for(; s->mb_y<s->mb_height; s->mb_y++){
3398 ff_init_block_index(s);
3399 for(; s->mb_x<s->mb_width; s->mb_x++){
3400 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3405 ff_update_block_index(s);
3406 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3407 s->first_slice_line=0;
3409 if(s->pict_type==FF_I_TYPE){
3413 if(show_bits_long(&s->gb, 19)==DC_MARKER){
3417 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
3419 av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
3424 s->cbp_table[xy]= cbpc & 3;
3425 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3429 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3431 s->current_picture.qscale_table[xy]= s->qscale;
3433 s->mbintra_table[xy]= 1;
3436 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3438 av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3442 if(dc_pred_dir) dir|=1;
3444 s->pred_dir_table[xy]= dir;
3445 }else{ /* P/S_TYPE */
3446 int mx, my, pred_x, pred_y, bits;
3447 int16_t * const mot_val= s->current_picture.motion_val[0][s->block_index[0]];
3448 const int stride= s->b8_stride*2;
3451 bits= show_bits(&s->gb, 17);
3452 if(bits==MOTION_MARKER){
3458 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3459 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
3463 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3466 mot_val[0 ]= mot_val[2 ]=
3467 mot_val[0+stride]= mot_val[2+stride]= mx;
3468 mot_val[1 ]= mot_val[3 ]=
3469 mot_val[1+stride]= mot_val[3+stride]= my;
3471 if(s->mbintra_table[xy])
3472 ff_clean_intra_table_entries(s);
3476 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3478 av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
3484 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
3486 s->mb_intra = ((cbpc & 4) != 0);
3489 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3490 s->mbintra_table[xy]= 1;
3491 mot_val[0 ]= mot_val[2 ]=
3492 mot_val[0+stride]= mot_val[2+stride]= 0;
3493 mot_val[1 ]= mot_val[3 ]=
3494 mot_val[1+stride]= mot_val[3+stride]= 0;
3496 if(s->mbintra_table[xy])
3497 ff_clean_intra_table_entries(s);
3499 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
3500 s->mcsel= get_bits1(&s->gb);
3503 if ((cbpc & 16) == 0) {
3504 /* 16x16 motion prediction */
3506 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3508 mx = h263_decode_motion(s, pred_x, s->f_code);
3512 my = h263_decode_motion(s, pred_y, s->f_code);
3515 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3519 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
3522 mot_val[0 ]= mot_val[2 ] =
3523 mot_val[0+stride]= mot_val[2+stride]= mx;
3524 mot_val[1 ]= mot_val[3 ]=
3525 mot_val[1+stride]= mot_val[3+stride]= my;
3528 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3530 int16_t *mot_val= h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3531 mx = h263_decode_motion(s, pred_x, s->f_code);
3535 my = h263_decode_motion(s, pred_y, s->f_code);
3552 * decode second partition.
3553 * @return <0 if an error occurred
3555 static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
3557 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3559 s->mb_x= s->resync_mb_x;
3560 s->first_slice_line=1;
3561 for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
3562 ff_init_block_index(s);
3563 for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
3564 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3567 ff_update_block_index(s);
3568 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3569 s->first_slice_line=0;
3571 if(s->pict_type==FF_I_TYPE){
3572 int ac_pred= get_bits1(&s->gb);
3573 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3575 av_log(s->avctx, AV_LOG_ERROR, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3579 s->cbp_table[xy]|= cbpy<<2;
3580 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3581 }else{ /* P || S_TYPE */
3582 if(IS_INTRA(s->current_picture.mb_type[xy])){
3584 int ac_pred = get_bits1(&s->gb);
3585 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3588 av_log(s->avctx, AV_LOG_ERROR, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3592 if(s->cbp_table[xy] & 8) {
3593 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3595 s->current_picture.qscale_table[xy]= s->qscale;
3599 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3601 av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3605 if(dc_pred_dir) dir|=1;
3607 s->cbp_table[xy]&= 3; //remove dquant
3608 s->cbp_table[xy]|= cbpy<<2;
3609 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3610 s->pred_dir_table[xy]= dir;
3611 }else if(IS_SKIP(s->current_picture.mb_type[xy])){
3612 s->current_picture.qscale_table[xy]= s->qscale;
3613 s->cbp_table[xy]= 0;
3615 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3618 av_log(s->avctx, AV_LOG_ERROR, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3622 if(s->cbp_table[xy] & 8) {
3623 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3625 s->current_picture.qscale_table[xy]= s->qscale;
3627 s->cbp_table[xy]&= 3; //remove dquant
3628 s->cbp_table[xy]|= (cbpy^0xf)<<2;
3632 if(mb_num >= mb_count) return 0;
3639 * decodes the first & second partition
3640 * @return <0 if error (and sets error type in the error_status_table)
3642 int ff_mpeg4_decode_partitions(MpegEncContext *s)
3645 const int part_a_error= s->pict_type==FF_I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR;
3646 const int part_a_end = s->pict_type==FF_I_TYPE ? (DC_END |MV_END) : MV_END;
3648 mb_num= mpeg4_decode_partition_a(s);
3650 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3654 if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
3655 av_log(s->avctx, AV_LOG_ERROR, "slice below monitor ...\n");
3656 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3660 s->mb_num_left= mb_num;
3662 if(s->pict_type==FF_I_TYPE){
3663 while(show_bits(&s->gb, 9) == 1)
3664 skip_bits(&s->gb, 9);
3665 if(get_bits_long(&s->gb, 19)!=DC_MARKER){
3666 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
3670 while(show_bits(&s->gb, 10) == 1)
3671 skip_bits(&s->gb, 10);
3672 if(get_bits(&s->gb, 17)!=MOTION_MARKER){
3673 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
3677 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end);
3679 if( mpeg4_decode_partition_b(s, mb_num) < 0){
3680 if(s->pict_type==FF_P_TYPE)
3681 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR);
3684 if(s->pict_type==FF_P_TYPE)
3685 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END);
3692 * decode partition C of one MB.
3693 * @return <0 if an error occurred
3695 static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64])
3698 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3700 mb_type= s->current_picture.mb_type[xy];
3701 cbp = s->cbp_table[xy];
3703 s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold;
3705 if(s->current_picture.qscale_table[xy] != s->qscale){
3706 ff_set_qscale(s, s->current_picture.qscale_table[xy] );
3709 if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
3712 s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0];
3713 s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1];
3715 s->mb_intra = IS_INTRA(mb_type);
3717 if (IS_SKIP(mb_type)) {
3720 s->block_last_index[i] = -1;
3721 s->mv_dir = MV_DIR_FORWARD;
3722 s->mv_type = MV_TYPE_16X16;
3723 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3730 }else if(s->mb_intra){
3731 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3732 }else if(!s->mb_intra){
3733 // s->mcsel= 0; //FIXME do we need to init that
3735 s->mv_dir = MV_DIR_FORWARD;
3736 if (IS_8X8(mb_type)) {
3737 s->mv_type = MV_TYPE_8X8;
3739 s->mv_type = MV_TYPE_16X16;
3742 } else { /* I-Frame */
3744 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3747 if (!IS_SKIP(mb_type)) {
3749 s->dsp.clear_blocks(s->block[0]);
3750 /* decode each block */
3751 for (i = 0; i < 6; i++) {
3752 if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){
3753 av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra);
3760 /* per-MB end of slice check */
3762 if(--s->mb_num_left <= 0){
3763 //printf("%06X %d\n", show_bits(&s->gb, 24), get_bits_left(&s->gb));
3764 if(mpeg4_is_resync(s))
3769 if(mpeg4_is_resync(s)){
3770 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
3771 if(s->cbp_table[xy+delta])
3779 * read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :)
3781 static void preview_obmc(MpegEncContext *s){
3782 GetBitContext gb= s->gb;
3784 int cbpc, i, pred_x, pred_y, mx, my;
3786 const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
3787 const int stride= s->b8_stride*2;
3790 s->block_index[i]+= 2;
3792 s->block_index[i]+= 1;
3795 assert(s->pict_type == FF_P_TYPE);
3798 if (get_bits1(&s->gb)) {
3800 mot_val = s->current_picture.motion_val[0][ s->block_index[0] ];
3801 mot_val[0 ]= mot_val[2 ]=
3802 mot_val[0+stride]= mot_val[2+stride]= 0;
3803 mot_val[1 ]= mot_val[3 ]=
3804 mot_val[1+stride]= mot_val[3+stride]= 0;
3806 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3809 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3813 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3815 get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3817 if(s->modified_quant){
3818 if(get_bits1(&s->gb)) skip_bits(&s->gb, 1);
3819 else skip_bits(&s->gb, 5);
3821 skip_bits(&s->gb, 2);
3824 if ((cbpc & 16) == 0) {
3825 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3826 /* 16x16 motion prediction */
3827 mot_val= h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3829 mx = h263p_decode_umotion(s, pred_x);
3831 mx = h263_decode_motion(s, pred_x, 1);
3834 my = h263p_decode_umotion(s, pred_y);
3836 my = h263_decode_motion(s, pred_y, 1);
3838 mot_val[0 ]= mot_val[2 ]=
3839 mot_val[0+stride]= mot_val[2+stride]= mx;
3840 mot_val[1 ]= mot_val[3 ]=
3841 mot_val[1+stride]= mot_val[3+stride]= my;
3843 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3845 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3847 mx = h263p_decode_umotion(s, pred_x);
3849 mx = h263_decode_motion(s, pred_x, 1);
3852 my = h263p_decode_umotion(s, pred_y);
3854 my = h263_decode_motion(s, pred_y, 1);
3855 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3856 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3865 s->block_index[i]-= 2;
3867 s->block_index[i]-= 1;
3873 static void h263_decode_dquant(MpegEncContext *s){
3874 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3876 if(s->modified_quant){
3877 if(get_bits1(&s->gb))
3878 s->qscale= modified_quant_tab[get_bits1(&s->gb)][ s->qscale ];
3880 s->qscale= get_bits(&s->gb, 5);
3882 s->qscale += quant_tab[get_bits(&s->gb, 2)];
3883 ff_set_qscale(s, s->qscale);
3886 static int h263_skip_b_part(MpegEncContext *s, int cbp)
3888 DECLARE_ALIGNED(16, DCTELEM, dblock[64]);
3891 /* we have to set s->mb_intra to zero to decode B-part of PB-frame correctly
3892 * but real value should be restored in order to be used later (in OBMC condition)
3896 for (i = 0; i < 6; i++) {
3897 if (h263_decode_block(s, dblock, i, cbp&32) < 0)
3905 static int h263_get_modb(GetBitContext *gb, int pb_frame, int *cbpb)
3909 if (pb_frame < 3) { // h.263 Annex G and i263 PB-frame
3911 if (pb_frame == 2 && c)
3912 mv = !get_bits1(gb);
3913 } else { // h.263 Annex M improved PB-frame
3914 mv = get_unary(gb, 0, 4) + 1;
3919 *cbpb = get_bits(gb, 6);
3923 int ff_h263_decode_mb(MpegEncContext *s,
3924 DCTELEM block[6][64])
3926 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
3928 const int xy= s->mb_x + s->mb_y * s->mb_stride;
3929 int cbpb = 0, pb_mv_count = 0;
3931 assert(!s->h263_pred);
3933 if (s->pict_type == FF_P_TYPE) {
3935 if (get_bits1(&s->gb)) {
3939 s->block_last_index[i] = -1;
3940 s->mv_dir = MV_DIR_FORWARD;
3941 s->mv_type = MV_TYPE_16X16;
3942 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3945 s->mb_skipped = !(s->obmc | s->loop_filter);
3948 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3949 //fprintf(stderr, "\tCBPC: %d", cbpc);
3951 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
3956 s->dsp.clear_blocks(s->block[0]);
3959 s->mb_intra = ((cbpc & 4) != 0);
3960 if (s->mb_intra) goto intra;
3962 if(s->pb_frame && get_bits1(&s->gb))
3963 pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb);
3964 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3966 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
3969 cbp = (cbpc & 3) | (cbpy << 2);
3971 h263_decode_dquant(s);
3974 s->mv_dir = MV_DIR_FORWARD;
3975 if ((cbpc & 16) == 0) {
3976 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3977 /* 16x16 motion prediction */
3978 s->mv_type = MV_TYPE_16X16;
3979 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3981 mx = h263p_decode_umotion(s, pred_x);
3983 mx = h263_decode_motion(s, pred_x, 1);
3989 my = h263p_decode_umotion(s, pred_y);
3991 my = h263_decode_motion(s, pred_y, 1);
3995 s->mv[0][0][0] = mx;
3996 s->mv[0][0][1] = my;
3998 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3999 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
4001 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
4002 s->mv_type = MV_TYPE_8X8;
4004 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
4006 mx = h263p_decode_umotion(s, pred_x);
4008 mx = h263_decode_motion(s, pred_x, 1);
4013 my = h263p_decode_umotion(s, pred_y);
4015 my = h263_decode_motion(s, pred_y, 1);
4018 s->mv[0][i][0] = mx;
4019 s->mv[0][i][1] = my;
4020 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
4021 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
4026 } else if(s->pict_type==FF_B_TYPE) {
4028 const int stride= s->b8_stride;
4029 int16_t *mot_val0 = s->current_picture.motion_val[0][ 2*(s->mb_x + s->mb_y*stride) ];
4030 int16_t *mot_val1 = s->current_picture.motion_val[1][ 2*(s->mb_x + s->mb_y*stride) ];
4031 // const int mv_xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
4034 mot_val0[0 ]= mot_val0[2 ]= mot_val0[0+2*stride]= mot_val0[2+2*stride]=
4035 mot_val0[1 ]= mot_val0[3 ]= mot_val0[1+2*stride]= mot_val0[3+2*stride]=
4036 mot_val1[0 ]= mot_val1[2 ]= mot_val1[0+2*stride]= mot_val1[2+2*stride]=
4037 mot_val1[1 ]= mot_val1[3 ]= mot_val1[1+2*stride]= mot_val1[3+2*stride]= 0;
4040 mb_type= get_vlc2(&s->gb, h263_mbtype_b_vlc.table, H263_MBTYPE_B_VLC_BITS, 2);
4042 av_log(s->avctx, AV_LOG_ERROR, "b mb_type damaged at %d %d\n", s->mb_x, s->mb_y);
4046 mb_type= h263_mb_type_b_map[ mb_type ];
4049 s->mb_intra = IS_INTRA(mb_type);
4050 if(HAS_CBP(mb_type)){
4051 s->dsp.clear_blocks(s->block[0]);
4052 cbpc = get_vlc2(&s->gb, cbpc_b_vlc.table, CBPC_B_VLC_BITS, 1);
4054 dquant = IS_QUANT(mb_type);
4058 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4061 av_log(s->avctx, AV_LOG_ERROR, "b cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4065 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
4068 cbp = (cbpc & 3) | (cbpy << 2);
4072 assert(!s->mb_intra);
4074 if(IS_QUANT(mb_type)){
4075 h263_decode_dquant(s);
4078 if(IS_DIRECT(mb_type)){
4079 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4080 mb_type |= ff_mpeg4_set_direct_mv(s, 0, 0);
4083 s->mv_type= MV_TYPE_16X16;
4086 if(USES_LIST(mb_type, 0)){
4087 int16_t *mot_val= h263_pred_motion(s, 0, 0, &mx, &my);
4088 s->mv_dir = MV_DIR_FORWARD;
4090 mx = h263_decode_motion(s, mx, 1);
4091 my = h263_decode_motion(s, my, 1);
4093 s->mv[0][0][0] = mx;
4094 s->mv[0][0][1] = my;
4095 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
4096 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
4099 if(USES_LIST(mb_type, 1)){
4100 int16_t *mot_val= h263_pred_motion(s, 0, 1, &mx, &my);
4101 s->mv_dir |= MV_DIR_BACKWARD;
4103 mx = h263_decode_motion(s, mx, 1);
4104 my = h263_decode_motion(s, my, 1);
4106 s->mv[1][0][0] = mx;
4107 s->mv[1][0][1] = my;
4108 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
4109 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
4113 s->current_picture.mb_type[xy]= mb_type;
4114 } else { /* I-Frame */
4116 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
4118 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4123 s->dsp.clear_blocks(s->block[0]);
4128 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
4130 s->ac_pred = get_bits1(&s->gb);
4132 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
4134 s->h263_aic_dir = get_bits1(&s->gb);
4139 if(s->pb_frame && get_bits1(&s->gb))
4140 pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb);
4141 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4143 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4146 cbp = (cbpc & 3) | (cbpy << 2);
4148 h263_decode_dquant(s);
4151 pb_mv_count += !!s->pb_frame;
4154 while(pb_mv_count--){
4155 h263_decode_motion(s, 0, 1);
4156 h263_decode_motion(s, 0, 1);
4159 /* decode each block */
4160 for (i = 0; i < 6; i++) {
4161 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
4166 if(s->pb_frame && h263_skip_b_part(s, cbpb) < 0)
4168 if(s->obmc && !s->mb_intra){
4169 if(s->pict_type == FF_P_TYPE && s->mb_x+1<s->mb_width && s->mb_num_left != 1)
4174 /* per-MB end of slice check */
4176 int v= show_bits(&s->gb, 16);
4178 if(get_bits_count(&s->gb) + 16 > s->gb.size_in_bits){
4179 v>>= get_bits_count(&s->gb) + 16 - s->gb.size_in_bits;
4189 int ff_mpeg4_decode_mb(MpegEncContext *s,
4190 DCTELEM block[6][64])
4192 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
4194 static int8_t quant_tab[4] = { -1, -2, 1, 2 };
4195 const int xy= s->mb_x + s->mb_y * s->mb_stride;
4197 assert(s->h263_pred);
4199 if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
4201 if (get_bits1(&s->gb)) {
4205 s->block_last_index[i] = -1;
4206 s->mv_dir = MV_DIR_FORWARD;
4207 s->mv_type = MV_TYPE_16X16;
4208 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
4209 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
4211 s->mv[0][0][0]= get_amv(s, 0);
4212 s->mv[0][0][1]= get_amv(s, 1);
4216 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4224 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
4225 //fprintf(stderr, "\tCBPC: %d", cbpc);
4227 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4232 s->dsp.clear_blocks(s->block[0]);
4234 s->mb_intra = ((cbpc & 4) != 0);
4235 if (s->mb_intra) goto intra;
4237 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
4238 s->mcsel= get_bits1(&s->gb);
4240 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1) ^ 0x0F;
4242 cbp = (cbpc & 3) | (cbpy << 2);
4244 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
4246 if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE)))
4247 s->interlaced_dct= get_bits1(&s->gb);
4249 s->mv_dir = MV_DIR_FORWARD;
4250 if ((cbpc & 16) == 0) {
4252 s->current_picture.mb_type[xy]= MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
4253 /* 16x16 global motion prediction */
4254 s->mv_type = MV_TYPE_16X16;
4257 s->mv[0][0][0] = mx;
4258 s->mv[0][0][1] = my;
4259 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
4260 s->current_picture.mb_type[xy]= MB_TYPE_16x8 | MB_TYPE_L0 | MB_TYPE_INTERLACED;
4261 /* 16x8 field motion prediction */
4262 s->mv_type= MV_TYPE_FIELD;
4264 s->field_select[0][0]= get_bits1(&s->gb);
4265 s->field_select[0][1]= get_bits1(&s->gb);
4267 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4270 mx = h263_decode_motion(s, pred_x, s->f_code);
4274 my = h263_decode_motion(s, pred_y/2, s->f_code);
4278 s->mv[0][i][0] = mx;
4279 s->mv[0][i][1] = my;
4282 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
4283 /* 16x16 motion prediction */
4284 s->mv_type = MV_TYPE_16X16;
4285 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4286 mx = h263_decode_motion(s, pred_x, s->f_code);
4291 my = h263_decode_motion(s, pred_y, s->f_code);
4295 s->mv[0][0][0] = mx;
4296 s->mv[0][0][1] = my;
4299 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
4300 s->mv_type = MV_TYPE_8X8;
4302 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
4303 mx = h263_decode_motion(s, pred_x, s->f_code);
4307 my = h263_decode_motion(s, pred_y, s->f_code);
4310 s->mv[0][i][0] = mx;
4311 s->mv[0][i][1] = my;
4316 } else if(s->pict_type==FF_B_TYPE) {
4317 int modb1; // first bit of modb
4318 int modb2; // second bit of modb
4321 s->mb_intra = 0; //B-frames never contain intra blocks
4322 s->mcsel=0; // ... true gmc blocks
4326 s->last_mv[i][0][0]=
4327 s->last_mv[i][0][1]=
4328 s->last_mv[i][1][0]=
4329 s->last_mv[i][1][1]= 0;
4333 /* if we skipped it in the future P Frame than skip it now too */
4334 s->mb_skipped= s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]; // Note, skiptab=0 if last was GMC
4339 s->block_last_index[i] = -1;
4341 s->mv_dir = MV_DIR_FORWARD;
4342 s->mv_type = MV_TYPE_16X16;
4347 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4351 modb1= get_bits1(&s->gb);
4353 mb_type= MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1; //like MB_TYPE_B_DIRECT but no vectors coded
4356 modb2= get_bits1(&s->gb);
4357 mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
4359 av_log(s->avctx, AV_LOG_ERROR, "illegal MB_type\n");
4362 mb_type= mb_type_b_map[ mb_type ];
4365 s->dsp.clear_blocks(s->block[0]);
4366 cbp= get_bits(&s->gb, 6);
4369 if ((!IS_DIRECT(mb_type)) && cbp) {
4370 if(get_bits1(&s->gb)){
4371 ff_set_qscale(s, s->qscale + get_bits1(&s->gb)*4 - 2);
4375 if(!s->progressive_sequence){
4377 s->interlaced_dct= get_bits1(&s->gb);
4379 if(!IS_DIRECT(mb_type) && get_bits1(&s->gb)){
4380 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
4381 mb_type &= ~MB_TYPE_16x16;
4383 if(USES_LIST(mb_type, 0)){
4384 s->field_select[0][0]= get_bits1(&s->gb);
4385 s->field_select[0][1]= get_bits1(&s->gb);
4387 if(USES_LIST(mb_type, 1)){
4388 s->field_select[1][0]= get_bits1(&s->gb);
4389 s->field_select[1][1]= get_bits1(&s->gb);
4395 if((mb_type & (MB_TYPE_DIRECT2|MB_TYPE_INTERLACED)) == 0){
4396 s->mv_type= MV_TYPE_16X16;
4398 if(USES_LIST(mb_type, 0)){
4399 s->mv_dir = MV_DIR_FORWARD;
4401 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
4402 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
4403 s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
4404 s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
4407 if(USES_LIST(mb_type, 1)){
4408 s->mv_dir |= MV_DIR_BACKWARD;
4410 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
4411 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
4412 s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
4413 s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
4415 }else if(!IS_DIRECT(mb_type)){
4416 s->mv_type= MV_TYPE_FIELD;
4418 if(USES_LIST(mb_type, 0)){
4419 s->mv_dir = MV_DIR_FORWARD;
4422 mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code);
4423 my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
4424 s->last_mv[0][i][0]= s->mv[0][i][0] = mx;
4425 s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
4429 if(USES_LIST(mb_type, 1)){
4430 s->mv_dir |= MV_DIR_BACKWARD;
4433 mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code);
4434 my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
4435 s->last_mv[1][i][0]= s->mv[1][i][0] = mx;
4436 s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
4442 if(IS_DIRECT(mb_type)){
4443 if(IS_SKIP(mb_type))
4446 mx = h263_decode_motion(s, 0, 1);
4447 my = h263_decode_motion(s, 0, 1);
4450 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4451 mb_type |= ff_mpeg4_set_direct_mv(s, mx, my);
4453 s->current_picture.mb_type[xy]= mb_type;
4454 } else { /* I-Frame */
4456 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
4458 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4466 s->ac_pred = get_bits1(&s->gb);
4468 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
4470 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
4472 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4474 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4477 cbp = (cbpc & 3) | (cbpy << 2);
4479 s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold;
4482 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
4485 if(!s->progressive_sequence)
4486 s->interlaced_dct= get_bits1(&s->gb);
4488 s->dsp.clear_blocks(s->block[0]);
4489 /* decode each block */
4490 for (i = 0; i < 6; i++) {
4491 if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0)
4498 /* decode each block */
4499 for (i = 0; i < 6; i++) {
4500 if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0)
4506 /* per-MB end of slice check */
4507 if(s->codec_id==CODEC_ID_MPEG4){
4508 if(mpeg4_is_resync(s)){
4509 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
4510 if(s->pict_type==FF_B_TYPE && s->next_picture.mbskip_table[xy + delta])
4519 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
4521 int code, val, sign, shift, l;
4522 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
4529 sign = get_bits1(&s->gb);
4533 val = (val - 1) << shift;
4534 val |= get_bits(&s->gb, shift);
4541 /* modulo decoding */
4542 if (!s->h263_long_vectors) {
4543 l = INT_BIT - 5 - f_code;
4546 /* horrible h263 long vector mode */
4547 if (pred < -31 && val < -63)
4549 if (pred > 32 && val > 63)
4556 /* Decodes RVLC of H.263+ UMV */
4557 static int h263p_decode_umotion(MpegEncContext * s, int pred)
4561 if (get_bits1(&s->gb)) /* Motion difference = 0 */
4564 code = 2 + get_bits1(&s->gb);
4566 while (get_bits1(&s->gb))
4569 code += get_bits1(&s->gb);
4574 code = (sign) ? (pred - code) : (pred + code);
4575 dprintf(s->avctx,"H.263+ UMV Motion = %d\n", code);
4580 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
4583 int code, level, i, j, last, run;
4584 RLTable *rl = &rl_inter;
4585 const uint8_t *scan_table;
4586 GetBitContext gb= s->gb;
4588 scan_table = s->intra_scantable.permutated;
4589 if (s->h263_aic && s->mb_intra) {
4593 if (s->h263_aic_dir)
4594 scan_table = s->intra_v_scantable.permutated; /* left */
4596 scan_table = s->intra_h_scantable.permutated; /* top */
4598 } else if (s->mb_intra) {
4600 if(s->codec_id == CODEC_ID_RV10){
4601 #if CONFIG_RV10_DECODER
4602 if (s->rv10_version == 3 && s->pict_type == FF_I_TYPE) {
4603 int component, diff;
4604 component = (n <= 3 ? 0 : n - 4 + 1);
4605 level = s->last_dc[component];
4606 if (s->rv10_first_dc_coded[component]) {
4607 diff = rv_decode_dc(s, n);
4611 level = level & 0xff; /* handle wrap round */
4612 s->last_dc[component] = level;
4614 s->rv10_first_dc_coded[component] = 1;
4617 level = get_bits(&s->gb, 8);
4623 level = get_bits(&s->gb, 8);
4624 if((level&0x7F) == 0){
4625 av_log(s->avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y);
4626 if(s->error_recognition >= FF_ER_COMPLIANT)
4638 if (s->mb_intra && s->h263_aic)
4640 s->block_last_index[n] = i - 1;
4645 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
4647 av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
4650 if (code == rl->n) {
4652 if (s->h263_flv > 1) {
4653 int is11 = get_bits1(&s->gb);
4654 last = get_bits1(&s->gb);
4655 run = get_bits(&s->gb, 6);
4657 level = get_sbits(&s->gb, 11);
4659 level = get_sbits(&s->gb, 7);
4662 last = get_bits1(&s->gb);
4663 run = get_bits(&s->gb, 6);
4664 level = (int8_t)get_bits(&s->gb, 8);
4666 if (s->codec_id == CODEC_ID_RV10) {
4667 /* XXX: should patch encoder too */
4668 level = get_sbits(&s->gb, 12);
4670 level = get_bits(&s->gb, 5);
4671 level |= get_sbits(&s->gb, 6)<<5;
4676 run = rl->table_run[code];
4677 level = rl->table_level[code];
4678 last = code >= rl->last;
4679 if (get_bits1(&s->gb))
4684 if(s->alt_inter_vlc && rl == &rl_inter && !s->mb_intra){
4685 //Looks like a hack but no, it's the way it is supposed to work ...
4689 s->dsp.clear_block(block);
4692 av_log(s->avctx, AV_LOG_ERROR, "run overflow at %dx%d i:%d\n", s->mb_x, s->mb_y, s->mb_intra);
4702 if (s->mb_intra && s->h263_aic) {
4703 h263_pred_acdc(s, block, n);
4706 s->block_last_index[n] = i;
4711 * decodes the dc value.
4712 * @param n block index (0-3 are luma, 4-5 are chroma)
4713 * @param dir_ptr the prediction direction will be stored here
4714 * @return the quantized dc
4716 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
4721 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
4723 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
4724 if (code < 0 || code > 9 /* && s->nbit<9 */){
4725 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
4733 level= 2*get_bits1(&s->gb)-1;
4735 if(get_bits1(&s->gb))
4736 level = get_bits(&s->gb, code-1) + (1<<(code-1));
4738 level = -get_bits(&s->gb, code-1) - (1<<(code-1));
4741 level = get_xbits(&s->gb, code);
4745 if(get_bits1(&s->gb)==0){ /* marker */
4746 if(s->error_recognition>=2){
4747 av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n");
4754 return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0);
4759 * @return <0 if an error occurred
4761 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
4762 int n, int coded, int intra, int rvlc)
4764 int level, i, last, run;
4767 RL_VLC_ELEM * rl_vlc;
4768 const uint8_t * scan_table;
4771 //Note intra & rvlc should be optimized away if this is inlined
4774 if(s->use_intra_dc_vlc){
4776 if(s->partitioned_frame){
4777 level = s->dc_val[0][ s->block_index[n] ];
4778 if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale);
4779 else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale);
4780 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32;
4782 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
4790 ff_mpeg4_pred_dc(s, n, 0, &dc_pred_dir, 0);
4796 rl = &rvlc_rl_intra;
4797 rl_vlc = rvlc_rl_intra.rl_vlc[0];
4800 rl_vlc = rl_intra.rl_vlc[0];
4803 if (dc_pred_dir == 0)
4804 scan_table = s->intra_v_scantable.permutated; /* left */
4806 scan_table = s->intra_h_scantable.permutated; /* top */
4808 scan_table = s->intra_scantable.permutated;
4815 s->block_last_index[n] = i;
4818 if(rvlc) rl = &rvlc_rl_inter;
4819 else rl = &rl_inter;
4821 scan_table = s->intra_scantable.permutated;
4827 rl_vlc = rvlc_rl_inter.rl_vlc[0];
4829 rl_vlc = rl_inter.rl_vlc[0];
4832 qmul = s->qscale << 1;
4833 qadd = (s->qscale - 1) | 1;
4835 rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale];
4837 rl_vlc = rl_inter.rl_vlc[s->qscale];
4842 OPEN_READER(re, &s->gb);
4844 UPDATE_CACHE(re, &s->gb);
4845 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
4849 if(SHOW_UBITS(re, &s->gb, 1)==0){
4850 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n");
4852 }; SKIP_CACHE(re, &s->gb, 1);
4854 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4855 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4856 SKIP_COUNTER(re, &s->gb, 1+1+6);
4857 UPDATE_CACHE(re, &s->gb);
4859 if(SHOW_UBITS(re, &s->gb, 1)==0){
4860 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n");
4862 }; SKIP_CACHE(re, &s->gb, 1);
4864 level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11);
4866 if(SHOW_UBITS(re, &s->gb, 5)!=0x10){
4867 av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n");
4869 }; SKIP_CACHE(re, &s->gb, 5);
4871 level= level * qmul + qadd;
4872 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1);
4873 SKIP_COUNTER(re, &s->gb, 1+11+5+1);
4879 cache= GET_CACHE(re, &s->gb);
4882 cache ^= 0xC0000000;
4884 if (cache&0x80000000) {
4885 if (cache&0x40000000) {
4887 SKIP_CACHE(re, &s->gb, 2);
4888 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4889 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4890 SKIP_COUNTER(re, &s->gb, 2+1+6);
4891 UPDATE_CACHE(re, &s->gb);
4894 level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12);
4896 if(SHOW_UBITS(re, &s->gb, 1)==0){
4897 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n");
4899 }; SKIP_CACHE(re, &s->gb, 1);
4901 level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
4903 if(SHOW_UBITS(re, &s->gb, 1)==0){
4904 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n");
4906 }; LAST_SKIP_CACHE(re, &s->gb, 1);
4908 SKIP_COUNTER(re, &s->gb, 1+12+1);
4912 if(s->error_recognition >= FF_ER_COMPLIANT){
4913 const int abs_level= FFABS(level);
4914 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
4915 const int run1= run - rl->max_run[last][abs_level] - 1;
4916 if(abs_level <= rl->max_level[last][run]){
4917 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
4920 if(s->error_recognition > FF_ER_COMPLIANT){
4921 if(abs_level <= rl->max_level[last][run]*2){
4922 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n");
4925 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
4926 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n");
4933 if (level>0) level= level * qmul + qadd;
4934 else level= level * qmul - qadd;
4936 if((unsigned)(level + 2048) > 4095){
4937 if(s->error_recognition > FF_ER_COMPLIANT){
4938 if(level > 2560 || level<-2560){
4939 av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
4943 level= level<0 ? -2048 : 2047;
4950 #if MIN_CACHE_BITS < 20
4951 LAST_SKIP_BITS(re, &s->gb, 2);
4952 UPDATE_CACHE(re, &s->gb);
4954 SKIP_BITS(re, &s->gb, 2);
4956 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
4957 i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing
4958 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4959 LAST_SKIP_BITS(re, &s->gb, 1);
4963 #if MIN_CACHE_BITS < 19
4964 LAST_SKIP_BITS(re, &s->gb, 1);
4965 UPDATE_CACHE(re, &s->gb);
4967 SKIP_BITS(re, &s->gb, 1);
4969 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
4971 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
4972 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4973 LAST_SKIP_BITS(re, &s->gb, 1);
4978 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4979 LAST_SKIP_BITS(re, &s->gb, 1);
4984 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
4988 block[scan_table[i]] = level;
4992 block[scan_table[i]] = level;
4994 CLOSE_READER(re, &s->gb);
4998 if(!s->use_intra_dc_vlc){
4999 block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0);
5001 i -= i>>31; //if(i == -1) i=0;
5004 mpeg4_pred_ac(s, block, n, dc_pred_dir);
5006 i = 63; /* XXX: not optimal */
5009 s->block_last_index[n] = i;
5013 /* most is hardcoded. should extend to handle all h263 streams */
5014 int h263_decode_picture_header(MpegEncContext *s)
5016 int format, width, height, i;
5019 align_get_bits(&s->gb);
5021 startcode= get_bits(&s->gb, 22-8);
5023 for(i= get_bits_left(&s->gb); i>24; i-=8) {
5024 startcode = ((startcode << 8) | get_bits(&s->gb, 8)) & 0x003FFFFF;
5026 if(startcode == 0x20)
5030 if (startcode != 0x20) {
5031 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
5034 /* temporal reference */
5035 i = get_bits(&s->gb, 8); /* picture timestamp */
5036 if( (s->picture_number&~0xFF)+i < s->picture_number)
5038 s->current_picture_ptr->pts=
5039 s->picture_number= (s->picture_number&~0xFF) + i;
5041 /* PTYPE starts here */
5042 if (get_bits1(&s->gb) != 1) {
5044 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
5047 if (get_bits1(&s->gb) != 0) {
5048 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
5049 return -1; /* h263 id */
5051 skip_bits1(&s->gb); /* split screen off */
5052 skip_bits1(&s->gb); /* camera off */
5053 skip_bits1(&s->gb); /* freeze picture release off */
5055 format = get_bits(&s->gb, 3);
5060 7 extended PTYPE (PLUSPTYPE)
5063 if (format != 7 && format != 6) {
5066 width = h263_format[format][0];
5067 height = h263_format[format][1];
5071 s->pict_type = FF_I_TYPE + get_bits1(&s->gb);
5073 s->h263_long_vectors = get_bits1(&s->gb);
5075 if (get_bits1(&s->gb) != 0) {
5076 av_log(s->avctx, AV_LOG_ERROR, "H263 SAC not supported\n");
5077 return -1; /* SAC: off */
5079 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
5080 s->unrestricted_mv = s->h263_long_vectors || s->obmc;
5082 s->pb_frame = get_bits1(&s->gb);
5083 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
5084 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
5088 s->avctx->sample_aspect_ratio= (AVRational){12,11};
5089 s->avctx->time_base= (AVRational){1001, 30000};
5095 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
5097 /* ufep other than 0 and 1 are reserved */
5100 format = get_bits(&s->gb, 3);
5101 dprintf(s->avctx, "ufep=1, format: %d\n", format);
5102 s->custom_pcf= get_bits1(&s->gb);
5103 s->umvplus = get_bits1(&s->gb); /* Unrestricted Motion Vector */
5104 if (get_bits1(&s->gb) != 0) {
5105 av_log(s->avctx, AV_LOG_ERROR, "Syntax-based Arithmetic Coding (SAC) not supported\n");
5107 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
5108 s->h263_aic = get_bits1(&s->gb); /* Advanced Intra Coding (AIC) */
5109 s->loop_filter= get_bits1(&s->gb);
5110 s->unrestricted_mv = s->umvplus || s->obmc || s->loop_filter;
5112 s->h263_slice_structured= get_bits1(&s->gb);
5113 if (get_bits1(&s->gb) != 0) {
5114 av_log(s->avctx, AV_LOG_ERROR, "Reference Picture Selection not supported\n");
5116 if (get_bits1(&s->gb) != 0) {
5117 av_log(s->avctx, AV_LOG_ERROR, "Independent Segment Decoding not supported\n");
5119 s->alt_inter_vlc= get_bits1(&s->gb);
5120 s->modified_quant= get_bits1(&s->gb);
5121 if(s->modified_quant)
5122 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
5124 skip_bits(&s->gb, 1); /* Prevent start code emulation */
5126 skip_bits(&s->gb, 3); /* Reserved */
5127 } else if (ufep != 0) {
5128 av_log(s->avctx, AV_LOG_ERROR, "Bad UFEP type (%d)\n", ufep);
5133 s->pict_type = get_bits(&s->gb, 3);
5134 switch(s->pict_type){
5135 case 0: s->pict_type= FF_I_TYPE;break;
5136 case 1: s->pict_type= FF_P_TYPE;break;
5137 case 2: s->pict_type= FF_P_TYPE;s->pb_frame = 3;break;
5138 case 3: s->pict_type= FF_B_TYPE;break;
5139 case 7: s->pict_type= FF_I_TYPE;break; //ZYGO
5143 skip_bits(&s->gb, 2);
5144 s->no_rounding = get_bits1(&s->gb);
5145 skip_bits(&s->gb, 4);
5147 /* Get the picture dimensions */
5150 /* Custom Picture Format (CPFMT) */
5151 s->aspect_ratio_info = get_bits(&s->gb, 4);
5152 dprintf(s->avctx, "aspect: %d\n", s->aspect_ratio_info);
5157 3 - 10:11 (525-type 4:3)
5158 4 - 16:11 (CIF 16:9)
5159 5 - 40:33 (525-type 16:9)
5162 width = (get_bits(&s->gb, 9) + 1) * 4;
5164 height = get_bits(&s->gb, 9) * 4;
5165 dprintf(s->avctx, "\nH.263+ Custom picture: %dx%d\n",width,height);
5166 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
5167 /* aspected dimensions */
5168 s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 8);
5169 s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 8);
5171 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
5174 width = h263_format[format][0];
5175 height = h263_format[format][1];
5176 s->avctx->sample_aspect_ratio= (AVRational){12,11};
5178 if ((width == 0) || (height == 0))
5185 s->avctx->time_base.den= 1800000;
5186 s->avctx->time_base.num= 1000 + get_bits1(&s->gb);
5187 s->avctx->time_base.num*= get_bits(&s->gb, 7);
5188 if(s->avctx->time_base.num == 0){
5189 av_log(s, AV_LOG_ERROR, "zero framerate\n");
5192 gcd= av_gcd(s->avctx->time_base.den, s->avctx->time_base.num);
5193 s->avctx->time_base.den /= gcd;
5194 s->avctx->time_base.num /= gcd;
5195 // av_log(s->avctx, AV_LOG_DEBUG, "%d/%d\n", s->avctx->time_base.den, s->avctx->time_base.num);
5197 s->avctx->time_base= (AVRational){1001, 30000};
5202 skip_bits(&s->gb, 2); //extended Temporal reference
5207 if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
5210 if(s->h263_slice_structured){
5211 if (get_bits1(&s->gb) != 0) {
5212 av_log(s->avctx, AV_LOG_ERROR, "rectangular slices not supported\n");
5214 if (get_bits1(&s->gb) != 0) {
5215 av_log(s->avctx, AV_LOG_ERROR, "unordered slices not supported\n");
5220 s->qscale = get_bits(&s->gb, 5);
5223 s->mb_width = (s->width + 15) / 16;
5224 s->mb_height = (s->height + 15) / 16;
5225 s->mb_num = s->mb_width * s->mb_height;
5228 skip_bits(&s->gb, 3); /* Temporal reference for B-pictures */
5230 skip_bits(&s->gb, 2); //extended Temporal reference
5231 skip_bits(&s->gb, 2); /* Quantization information for B-pictures */
5235 while (get_bits1(&s->gb) != 0) {
5236 skip_bits(&s->gb, 8);
5239 if(s->h263_slice_structured){
5240 if (get_bits1(&s->gb) != 1) {
5241 av_log(s->avctx, AV_LOG_ERROR, "SEPB1 marker missing\n");
5245 ff_h263_decode_mba(s);
5247 if (get_bits1(&s->gb) != 1) {
5248 av_log(s->avctx, AV_LOG_ERROR, "SEPB2 marker missing\n");
5255 s->y_dc_scale_table=
5256 s->c_dc_scale_table= ff_aic_dc_scale_table;
5258 s->y_dc_scale_table=
5259 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
5262 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
5266 if (s->pict_type == FF_I_TYPE && s->codec_tag == AV_RL32("ZYGO")){
5268 for(i=0; i<85; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
5269 av_log(s->avctx, AV_LOG_DEBUG, "\n");
5270 for(i=0; i<13; i++){
5272 int v= get_bits(&s->gb, 8);
5273 v |= get_sbits(&s->gb, 8)<<8;
5274 av_log(s->avctx, AV_LOG_DEBUG, " %5d", v);
5276 av_log(s->avctx, AV_LOG_DEBUG, "\n");
5278 for(i=0; i<50; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
5285 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb)
5288 int a= 2<<s->sprite_warping_accuracy;
5289 int rho= 3-s->sprite_warping_accuracy;
5291 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
5292 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
5293 int sprite_ref[4][2];
5294 int virtual_ref[2][2];
5296 int alpha=0, beta=0;
5301 for(i=0; i<s->num_sprite_warping_points; i++){
5305 length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);
5307 x= get_xbits(gb, length);
5309 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(gb); /* marker bit */
5311 length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);
5313 y=get_xbits(gb, length);
5315 skip_bits1(gb); /* marker bit */
5316 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
5317 s->sprite_traj[i][0]= d[i][0]= x;
5318 s->sprite_traj[i][1]= d[i][1]= y;
5321 s->sprite_traj[i][0]= s->sprite_traj[i][1]= 0;
5323 while((1<<alpha)<w) alpha++;
5324 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
5328 // Note, the 4th point isn't used for GMC
5329 if(s->divx_version==500 && s->divx_build==413){
5330 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
5331 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
5332 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
5333 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
5334 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
5335 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
5337 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
5338 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
5339 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
5340 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
5341 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
5342 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
5344 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
5345 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
5347 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
5348 // perhaps it should be reordered to be more readable ...
5349 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
5350 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
5351 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
5352 + 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);
5353 virtual_ref[0][1]= 16*vop_ref[0][1]
5354 + 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);
5355 virtual_ref[1][0]= 16*vop_ref[0][0]
5356 + 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);
5357 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
5358 + 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);
5360 switch(s->num_sprite_warping_points)
5363 s->sprite_offset[0][0]= 0;
5364 s->sprite_offset[0][1]= 0;
5365 s->sprite_offset[1][0]= 0;
5366 s->sprite_offset[1][1]= 0;
5367 s->sprite_delta[0][0]= a;
5368 s->sprite_delta[0][1]= 0;
5369 s->sprite_delta[1][0]= 0;
5370 s->sprite_delta[1][1]= a;
5371 s->sprite_shift[0]= 0;
5372 s->sprite_shift[1]= 0;
5375 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
5376 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
5377 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
5378 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
5379 s->sprite_delta[0][0]= a;
5380 s->sprite_delta[0][1]= 0;
5381 s->sprite_delta[1][0]= 0;
5382 s->sprite_delta[1][1]= a;
5383 s->sprite_shift[0]= 0;
5384 s->sprite_shift[1]= 0;
5387 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
5388 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
5389 + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])
5390 + (1<<(alpha+rho-1));
5391 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
5392 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
5393 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])
5394 + (1<<(alpha+rho-1));
5395 s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
5396 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
5397 +2*w2*r*sprite_ref[0][0]
5399 + (1<<(alpha+rho+1)));
5400 s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
5401 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
5402 +2*w2*r*sprite_ref[0][1]
5404 + (1<<(alpha+rho+1)));
5405 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
5406 s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]);
5407 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
5408 s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
5410 s->sprite_shift[0]= alpha+rho;
5411 s->sprite_shift[1]= alpha+rho+2;
5414 min_ab= FFMIN(alpha, beta);
5417 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
5418 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])
5419 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])
5420 + (1<<(alpha+beta+rho-min_ab-1));
5421 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))
5422 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])
5423 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])
5424 + (1<<(alpha+beta+rho-min_ab-1));
5425 s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)
5426 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)
5427 + 2*w2*h3*r*sprite_ref[0][0]
5429 + (1<<(alpha+beta+rho-min_ab+1));
5430 s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)
5431 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)
5432 + 2*w2*h3*r*sprite_ref[0][1]
5434 + (1<<(alpha+beta+rho-min_ab+1));
5435 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;
5436 s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;
5437 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;
5438 s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;
5440 s->sprite_shift[0]= alpha + beta + rho - min_ab;
5441 s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;
5444 /* try to simplify the situation */
5445 if( s->sprite_delta[0][0] == a<<s->sprite_shift[0]
5446 && s->sprite_delta[0][1] == 0
5447 && s->sprite_delta[1][0] == 0
5448 && s->sprite_delta[1][1] == a<<s->sprite_shift[0])
5450 s->sprite_offset[0][0]>>=s->sprite_shift[0];
5451 s->sprite_offset[0][1]>>=s->sprite_shift[0];
5452 s->sprite_offset[1][0]>>=s->sprite_shift[1];
5453 s->sprite_offset[1][1]>>=s->sprite_shift[1];
5454 s->sprite_delta[0][0]= a;
5455 s->sprite_delta[0][1]= 0;
5456 s->sprite_delta[1][0]= 0;
5457 s->sprite_delta[1][1]= a;
5458 s->sprite_shift[0]= 0;
5459 s->sprite_shift[1]= 0;
5460 s->real_sprite_warping_points=1;
5463 int shift_y= 16 - s->sprite_shift[0];
5464 int shift_c= 16 - s->sprite_shift[1];
5465 //printf("shifts %d %d\n", shift_y, shift_c);
5467 s->sprite_offset[0][i]<<= shift_y;
5468 s->sprite_offset[1][i]<<= shift_c;
5469 s->sprite_delta[0][i]<<= shift_y;
5470 s->sprite_delta[1][i]<<= shift_y;
5471 s->sprite_shift[i]= 16;
5473 s->real_sprite_warping_points= s->num_sprite_warping_points;
5476 printf("vop:%d:%d %d:%d %d:%d, sprite:%d:%d %d:%d %d:%d, virtual: %d:%d %d:%d\n",
5477 vop_ref[0][0], vop_ref[0][1],
5478 vop_ref[1][0], vop_ref[1][1],
5479 vop_ref[2][0], vop_ref[2][1],
5480 sprite_ref[0][0], sprite_ref[0][1],
5481 sprite_ref[1][0], sprite_ref[1][1],
5482 sprite_ref[2][0], sprite_ref[2][1],
5483 virtual_ref[0][0], virtual_ref[0][1],
5484 virtual_ref[1][0], virtual_ref[1][1]
5487 printf("offset: %d:%d , delta: %d %d %d %d, shift %d\n",
5488 s->sprite_offset[0][0], s->sprite_offset[0][1],
5489 s->sprite_delta[0][0], s->sprite_delta[0][1],
5490 s->sprite_delta[1][0], s->sprite_delta[1][1],
5496 static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
5497 int hours, minutes, seconds;
5499 hours= get_bits(gb, 5);
5500 minutes= get_bits(gb, 6);
5502 seconds= get_bits(gb, 6);
5504 s->time_base= seconds + 60*(minutes + 60*hours);
5512 static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
5513 int width, height, vo_ver_id;
5516 skip_bits(gb, 1); /* random access */
5517 s->vo_type= get_bits(gb, 8);
5518 if (get_bits1(gb) != 0) { /* is_ol_id */
5519 vo_ver_id = get_bits(gb, 4); /* vo_ver_id */
5520 skip_bits(gb, 3); /* vo_priority */
5524 //printf("vo type:%d\n",s->vo_type);
5525 s->aspect_ratio_info= get_bits(gb, 4);
5526 if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
5527 s->avctx->sample_aspect_ratio.num= get_bits(gb, 8); // par_width
5528 s->avctx->sample_aspect_ratio.den= get_bits(gb, 8); // par_height
5530 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
5533 if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
5534 int chroma_format= get_bits(gb, 2);
5535 if(chroma_format!=CHROMA_420){
5536 av_log(s->avctx, AV_LOG_ERROR, "illegal chroma format\n");
5538 s->low_delay= get_bits1(gb);
5539 if(get_bits1(gb)){ /* vbv parameters */
5540 get_bits(gb, 15); /* first_half_bitrate */
5541 skip_bits1(gb); /* marker */
5542 get_bits(gb, 15); /* latter_half_bitrate */
5543 skip_bits1(gb); /* marker */
5544 get_bits(gb, 15); /* first_half_vbv_buffer_size */
5545 skip_bits1(gb); /* marker */
5546 get_bits(gb, 3); /* latter_half_vbv_buffer_size */
5547 get_bits(gb, 11); /* first_half_vbv_occupancy */
5548 skip_bits1(gb); /* marker */
5549 get_bits(gb, 15); /* latter_half_vbv_occupancy */
5550 skip_bits1(gb); /* marker */
5553 // set low delay flag only once the smartest? low delay detection won't be overriden
5554 if(s->picture_number==0)
5558 s->shape = get_bits(gb, 2); /* vol shape */
5559 if(s->shape != RECT_SHAPE) av_log(s->avctx, AV_LOG_ERROR, "only rectangular vol supported\n");
5560 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
5561 av_log(s->avctx, AV_LOG_ERROR, "Gray shape not supported\n");
5562 skip_bits(gb, 4); //video_object_layer_shape_extension
5565 check_marker(gb, "before time_increment_resolution");
5567 s->avctx->time_base.den = get_bits(gb, 16);
5568 if(!s->avctx->time_base.den){
5569 av_log(s->avctx, AV_LOG_ERROR, "time_base.den==0\n");
5573 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
5574 if (s->time_increment_bits < 1)
5575 s->time_increment_bits = 1;
5577 check_marker(gb, "before fixed_vop_rate");
5579 if (get_bits1(gb) != 0) { /* fixed_vop_rate */
5580 s->avctx->time_base.num = get_bits(gb, s->time_increment_bits);
5582 s->avctx->time_base.num = 1;
5586 if (s->shape != BIN_ONLY_SHAPE) {
5587 if (s->shape == RECT_SHAPE) {
5588 skip_bits1(gb); /* marker */
5589 width = get_bits(gb, 13);
5590 skip_bits1(gb); /* marker */
5591 height = get_bits(gb, 13);
5592 skip_bits1(gb); /* marker */
5593 if(width && height && !(s->width && s->codec_tag == AV_RL32("MP4S"))){ /* they should be non zero but who knows ... */
5596 // printf("width/height: %d %d\n", width, height);
5600 s->progressive_sequence=
5601 s->progressive_frame= get_bits1(gb)^1;
5602 s->interlaced_dct=0;
5603 if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO))
5604 av_log(s->avctx, AV_LOG_INFO, "MPEG4 OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */
5605 if (vo_ver_id == 1) {
5606 s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */
5608 s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */
5610 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "Static Sprites not supported\n");
5611 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
5612 if(s->vol_sprite_usage==STATIC_SPRITE){
5613 s->sprite_width = get_bits(gb, 13);
5614 skip_bits1(gb); /* marker */
5615 s->sprite_height= get_bits(gb, 13);
5616 skip_bits1(gb); /* marker */
5617 s->sprite_left = get_bits(gb, 13);
5618 skip_bits1(gb); /* marker */
5619 s->sprite_top = get_bits(gb, 13);
5620 skip_bits1(gb); /* marker */
5622 s->num_sprite_warping_points= get_bits(gb, 6);
5623 if(s->num_sprite_warping_points > 3){
5624 av_log(s->avctx, AV_LOG_ERROR, "%d sprite_warping_points\n", s->num_sprite_warping_points);
5625 s->num_sprite_warping_points= 0;
5628 s->sprite_warping_accuracy = get_bits(gb, 2);
5629 s->sprite_brightness_change= get_bits1(gb);
5630 if(s->vol_sprite_usage==STATIC_SPRITE)
5631 s->low_latency_sprite= get_bits1(gb);
5633 // FIXME sadct disable bit if verid!=1 && shape not rect
5635 if (get_bits1(gb) == 1) { /* not_8_bit */
5636 s->quant_precision = get_bits(gb, 4); /* quant_precision */
5637 if(get_bits(gb, 4)!=8) av_log(s->avctx, AV_LOG_ERROR, "N-bit not supported\n"); /* bits_per_pixel */
5638 if(s->quant_precision!=5) av_log(s->avctx, AV_LOG_ERROR, "quant precision %d\n", s->quant_precision);
5640 s->quant_precision = 5;
5643 // FIXME a bunch of grayscale shape things
5645 if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */
5648 /* load default matrixes */
5649 for(i=0; i<64; i++){
5650 int j= s->dsp.idct_permutation[i];
5651 v= ff_mpeg4_default_intra_matrix[i];
5652 s->intra_matrix[j]= v;
5653 s->chroma_intra_matrix[j]= v;
5655 v= ff_mpeg4_default_non_intra_matrix[i];
5656 s->inter_matrix[j]= v;
5657 s->chroma_inter_matrix[j]= v;
5660 /* load custom intra matrix */
5663 for(i=0; i<64; i++){
5669 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5670 s->intra_matrix[j]= v;
5671 s->chroma_intra_matrix[j]= v;
5674 /* replicate last value */
5676 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5677 s->intra_matrix[j]= last;
5678 s->chroma_intra_matrix[j]= last;
5682 /* load custom non intra matrix */
5685 for(i=0; i<64; i++){
5691 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5692 s->inter_matrix[j]= v;
5693 s->chroma_inter_matrix[j]= v;
5696 /* replicate last value */
5698 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5699 s->inter_matrix[j]= last;
5700 s->chroma_inter_matrix[j]= last;
5704 // FIXME a bunch of grayscale shape things
5708 s->quarter_sample= get_bits1(gb);
5709 else s->quarter_sample=0;
5712 int pos= get_bits_count(gb);
5713 int estimation_method= get_bits(gb, 2);
5714 if(estimation_method<2){
5716 s->cplx_estimation_trash_i += 8*get_bits1(gb); //opaque
5717 s->cplx_estimation_trash_i += 8*get_bits1(gb); //transparent
5718 s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_cae
5719 s->cplx_estimation_trash_i += 8*get_bits1(gb); //inter_cae
5720 s->cplx_estimation_trash_i += 8*get_bits1(gb); //no_update
5721 s->cplx_estimation_trash_i += 8*get_bits1(gb); //upampling
5724 s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_blocks
5725 s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter_blocks
5726 s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter4v_blocks
5727 s->cplx_estimation_trash_i += 8*get_bits1(gb); //not coded blocks
5729 if(!check_marker(gb, "in complexity estimation part 1")){
5730 skip_bits_long(gb, pos - get_bits_count(gb));
5734 s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_coeffs
5735 s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_lines
5736 s->cplx_estimation_trash_i += 8*get_bits1(gb); //vlc_syms
5737 s->cplx_estimation_trash_i += 4*get_bits1(gb); //vlc_bits
5740 s->cplx_estimation_trash_p += 8*get_bits1(gb); //apm
5741 s->cplx_estimation_trash_p += 8*get_bits1(gb); //npm
5742 s->cplx_estimation_trash_b += 8*get_bits1(gb); //interpolate_mc_q
5743 s->cplx_estimation_trash_p += 8*get_bits1(gb); //forwback_mc_q
5744 s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel2
5745 s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel4
5747 if(!check_marker(gb, "in complexity estimation part 2")){
5748 skip_bits_long(gb, pos - get_bits_count(gb));
5751 if(estimation_method==1){
5752 s->cplx_estimation_trash_i += 8*get_bits1(gb); //sadct
5753 s->cplx_estimation_trash_p += 8*get_bits1(gb); //qpel
5756 av_log(s->avctx, AV_LOG_ERROR, "Invalid Complexity estimation method %d\n", estimation_method);
5759 s->cplx_estimation_trash_i=
5760 s->cplx_estimation_trash_p=
5761 s->cplx_estimation_trash_b= 0;
5764 s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */
5766 s->data_partitioning= get_bits1(gb);
5767 if(s->data_partitioning){
5768 s->rvlc= get_bits1(gb);
5771 if(vo_ver_id != 1) {
5772 s->new_pred= get_bits1(gb);
5774 av_log(s->avctx, AV_LOG_ERROR, "new pred not supported\n");
5775 skip_bits(gb, 2); /* requested upstream message type */
5776 skip_bits1(gb); /* newpred segment type */
5778 s->reduced_res_vop= get_bits1(gb);
5779 if(s->reduced_res_vop) av_log(s->avctx, AV_LOG_ERROR, "reduced resolution VOP not supported\n");
5783 s->reduced_res_vop= 0;
5786 s->scalability= get_bits1(gb);
5788 if (s->scalability) {
5789 GetBitContext bak= *gb;
5791 int ref_layer_sampling_dir;
5792 int h_sampling_factor_n;
5793 int h_sampling_factor_m;
5794 int v_sampling_factor_n;
5795 int v_sampling_factor_m;
5797 s->hierachy_type= get_bits1(gb);
5798 ref_layer_id= get_bits(gb, 4);
5799 ref_layer_sampling_dir= get_bits1(gb);
5800 h_sampling_factor_n= get_bits(gb, 5);
5801 h_sampling_factor_m= get_bits(gb, 5);
5802 v_sampling_factor_n= get_bits(gb, 5);
5803 v_sampling_factor_m= get_bits(gb, 5);
5804 s->enhancement_type= get_bits1(gb);
5806 if( h_sampling_factor_n==0 || h_sampling_factor_m==0
5807 || v_sampling_factor_n==0 || v_sampling_factor_m==0){
5809 // fprintf(stderr, "illegal scalability header (VERY broken encoder), trying to workaround\n");
5814 av_log(s->avctx, AV_LOG_ERROR, "scalability not supported\n");
5816 // bin shape stuff FIXME
5823 * decodes the user data stuff in the header.
5824 * Also initializes divx/xvid/lavc_version/build.
5826 static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
5830 int ver = 0, build = 0, ver2 = 0, ver3 = 0;
5833 for(i=0; i<255 && get_bits_count(gb) < gb->size_in_bits; i++){
5834 if(show_bits(gb, 23) == 0) break;
5835 buf[i]= get_bits(gb, 8);
5839 /* divx detection */
5840 e=sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last);
5842 e=sscanf(buf, "DivX%db%d%c", &ver, &build, &last);
5844 s->divx_version= ver;
5845 s->divx_build= build;
5846 s->divx_packed= e==3 && last=='p';
5847 if(s->divx_packed && !s->showed_packed_warning) {
5848 av_log(s->avctx, AV_LOG_WARNING, "Invalid and inefficient vfw-avi packed B frames detected\n");
5849 s->showed_packed_warning=1;
5853 /* ffmpeg detection */
5854 e=sscanf(buf, "FFmpe%*[^b]b%d", &build)+3;
5856 e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
5858 e=sscanf(buf, "Lavc%d.%d.%d", &ver, &ver2, &ver3)+1;
5860 build= (ver<<16) + (ver2<<8) + ver3;
5863 if(strcmp(buf, "ffmpeg")==0){
5864 s->lavc_build= 4600;
5868 s->lavc_build= build;
5871 /* Xvid detection */
5872 e=sscanf(buf, "XviD%d", &build);
5874 s->xvid_build= build;
5877 //printf("User Data: %s\n", buf);
5881 static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
5882 int time_incr, time_increment;
5884 s->pict_type = get_bits(gb, 2) + FF_I_TYPE; /* pict type: I = 0 , P = 1 */
5885 if(s->pict_type==FF_B_TYPE && s->low_delay && s->vol_control_parameters==0 && !(s->flags & CODEC_FLAG_LOW_DELAY)){
5886 av_log(s->avctx, AV_LOG_ERROR, "low_delay flag incorrectly, clearing it\n");
5890 s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE;
5891 if(s->partitioned_frame)
5892 s->decode_mb= mpeg4_decode_partitioned_mb;
5894 s->decode_mb= ff_mpeg4_decode_mb;
5897 while (get_bits1(gb) != 0)
5900 check_marker(gb, "before time_increment");
5902 if(s->time_increment_bits==0 || !(show_bits(gb, s->time_increment_bits+1)&1)){
5903 av_log(s->avctx, AV_LOG_ERROR, "hmm, seems the headers are not complete, trying to guess time_increment_bits\n");
5905 for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){
5906 if ( s->pict_type == FF_P_TYPE
5907 || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
5908 if((show_bits(gb, s->time_increment_bits+6)&0x37) == 0x30) break;
5910 if((show_bits(gb, s->time_increment_bits+5)&0x1F) == 0x18) break;
5913 av_log(s->avctx, AV_LOG_ERROR, "my guess is %d bits ;)\n",s->time_increment_bits);
5916 if(IS_3IV1) time_increment= get_bits1(gb); //FIXME investigate further
5917 else time_increment= get_bits(gb, s->time_increment_bits);
5919 // printf("%d %X\n", s->time_increment_bits, time_increment);
5920 //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);
5921 if(s->pict_type!=FF_B_TYPE){
5922 s->last_time_base= s->time_base;
5923 s->time_base+= time_incr;
5924 s->time= s->time_base*s->avctx->time_base.den + time_increment;
5925 if(s->workaround_bugs&FF_BUG_UMP4){
5926 if(s->time < s->last_non_b_time){
5927 // fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaround\n");
5929 s->time+= s->avctx->time_base.den;
5932 s->pp_time= s->time - s->last_non_b_time;
5933 s->last_non_b_time= s->time;
5935 s->time= (s->last_time_base + time_incr)*s->avctx->time_base.den + time_increment;
5936 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
5937 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
5938 // printf("messed up order, maybe after seeking? skipping current b frame\n");
5939 return FRAME_SKIPPED;
5941 ff_mpeg4_init_direct_mv(s);
5943 if(s->t_frame==0) s->t_frame= s->pb_time;
5944 if(s->t_frame==0) s->t_frame=1; // 1/0 protection
5945 s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame)
5946 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
5947 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame)
5948 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
5949 if(!s->progressive_sequence){
5950 if(s->pp_field_time <= s->pb_field_time || s->pb_field_time <= 1)
5951 return FRAME_SKIPPED;
5954 //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);
5956 if(s->avctx->time_base.num)
5957 s->current_picture_ptr->pts= (s->time + s->avctx->time_base.num/2) / s->avctx->time_base.num;
5959 s->current_picture_ptr->pts= AV_NOPTS_VALUE;
5960 if(s->avctx->debug&FF_DEBUG_PTS)
5961 av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %"PRId64"\n", s->current_picture_ptr->pts);
5963 check_marker(gb, "before vop_coded");
5966 if (get_bits1(gb) != 1){
5967 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
5968 av_log(s->avctx, AV_LOG_ERROR, "vop not coded\n");
5969 return FRAME_SKIPPED;
5971 //printf("time %d %d %d || %"PRId64" %"PRId64" %"PRId64"\n", s->time_increment_bits, s->avctx->time_base.den, s->time_base,
5972 //s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time);
5973 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == FF_P_TYPE
5974 || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
5975 /* rounding type for motion estimation */
5976 s->no_rounding = get_bits1(gb);
5980 //FIXME reduced res stuff
5982 if (s->shape != RECT_SHAPE) {
5983 if (s->vol_sprite_usage != 1 || s->pict_type != FF_I_TYPE) {
5984 int width, height, hor_spat_ref, ver_spat_ref;
5986 width = get_bits(gb, 13);
5987 skip_bits1(gb); /* marker */
5988 height = get_bits(gb, 13);
5989 skip_bits1(gb); /* marker */
5990 hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */
5991 skip_bits1(gb); /* marker */
5992 ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */
5994 skip_bits1(gb); /* change_CR_disable */
5996 if (get_bits1(gb) != 0) {
5997 skip_bits(gb, 8); /* constant_alpha_value */
6000 //FIXME complexity estimation stuff
6002 if (s->shape != BIN_ONLY_SHAPE) {
6003 skip_bits_long(gb, s->cplx_estimation_trash_i);
6004 if(s->pict_type != FF_I_TYPE)
6005 skip_bits_long(gb, s->cplx_estimation_trash_p);
6006 if(s->pict_type == FF_B_TYPE)
6007 skip_bits_long(gb, s->cplx_estimation_trash_b);
6009 s->intra_dc_threshold= mpeg4_dc_threshold[ get_bits(gb, 3) ];
6010 if(!s->progressive_sequence){
6011 s->top_field_first= get_bits1(gb);
6012 s->alternate_scan= get_bits1(gb);
6014 s->alternate_scan= 0;
6017 if(s->alternate_scan){
6018 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
6019 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
6020 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
6021 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
6023 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
6024 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
6025 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
6026 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
6029 if(s->pict_type == FF_S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
6030 mpeg4_decode_sprite_trajectory(s, gb);
6031 if(s->sprite_brightness_change) av_log(s->avctx, AV_LOG_ERROR, "sprite_brightness_change not supported\n");
6032 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "static sprite not supported\n");
6035 if (s->shape != BIN_ONLY_SHAPE) {
6036 s->chroma_qscale= s->qscale = get_bits(gb, s->quant_precision);
6038 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (qscale=0)\n");
6039 return -1; // makes no sense to continue, as there is nothing left from the image then
6042 if (s->pict_type != FF_I_TYPE) {
6043 s->f_code = get_bits(gb, 3); /* fcode_for */
6045 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (f_code=0)\n");
6046 return -1; // makes no sense to continue, as the MV decoding will break very quickly
6051 if (s->pict_type == FF_B_TYPE) {
6052 s->b_code = get_bits(gb, 3);
6056 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
6057 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",
6058 s->qscale, s->f_code, s->b_code,
6059 s->pict_type == FF_I_TYPE ? "I" : (s->pict_type == FF_P_TYPE ? "P" : (s->pict_type == FF_B_TYPE ? "B" : "S")),
6060 gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first,
6061 s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,
6062 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);
6065 if(!s->scalability){
6066 if (s->shape!=RECT_SHAPE && s->pict_type!=FF_I_TYPE) {
6067 skip_bits1(gb); // vop shape coding type
6070 if(s->enhancement_type){
6071 int load_backward_shape= get_bits1(gb);
6072 if(load_backward_shape){
6073 av_log(s->avctx, AV_LOG_ERROR, "load backward shape isn't supported\n");
6076 skip_bits(gb, 2); //ref_select_code
6079 /* detect buggy encoders which don't set the low_delay flag (divx4/xvid/opendivx)*/
6080 // note we cannot detect divx5 without b-frames easily (although it's buggy too)
6081 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
6082 av_log(s->avctx, AV_LOG_ERROR, "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
6086 s->picture_number++; // better than pic number==0 always ;)
6088 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
6089 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
6091 if(s->workaround_bugs&FF_BUG_EDGE){
6092 s->h_edge_pos= s->width;
6093 s->v_edge_pos= s->height;
6099 * decode mpeg4 headers
6100 * @return <0 if no VOP found (or a damaged one)
6101 * FRAME_SKIPPED if a not coded VOP is found
6102 * 0 if a VOP is found
6104 int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb)
6108 /* search next start code */
6111 if(s->codec_tag == AV_RL32("WV1F") && show_bits(gb, 24) == 0x575630){
6113 if(get_bits(gb, 8) == 0xF0)
6119 if(get_bits_count(gb) >= gb->size_in_bits){
6120 if(gb->size_in_bits==8 && (s->divx_version || s->xvid_build)){
6121 av_log(s->avctx, AV_LOG_ERROR, "frame skip %d\n", gb->size_in_bits);
6122 return FRAME_SKIPPED; //divx bug
6124 return -1; //end of stream
6127 /* use the bits after the test */
6128 v = get_bits(gb, 8);
6129 startcode = ((startcode << 8) | v) & 0xffffffff;
6131 if((startcode&0xFFFFFF00) != 0x100)
6132 continue; //no startcode
6134 if(s->avctx->debug&FF_DEBUG_STARTCODE){
6135 av_log(s->avctx, AV_LOG_DEBUG, "startcode: %3X ", startcode);
6136 if (startcode<=0x11F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Start");
6137 else if(startcode<=0x12F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Layer Start");
6138 else if(startcode<=0x13F) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
6139 else if(startcode<=0x15F) av_log(s->avctx, AV_LOG_DEBUG, "FGS bp start");
6140 else if(startcode<=0x1AF) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
6141 else if(startcode==0x1B0) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq Start");
6142 else if(startcode==0x1B1) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq End");
6143 else if(startcode==0x1B2) av_log(s->avctx, AV_LOG_DEBUG, "User Data");
6144 else if(startcode==0x1B3) av_log(s->avctx, AV_LOG_DEBUG, "Group of VOP start");
6145 else if(startcode==0x1B4) av_log(s->avctx, AV_LOG_DEBUG, "Video Session Error");
6146 else if(startcode==0x1B5) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Start");
6147 else if(startcode==0x1B6) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Plane start");
6148 else if(startcode==0x1B7) av_log(s->avctx, AV_LOG_DEBUG, "slice start");
6149 else if(startcode==0x1B8) av_log(s->avctx, AV_LOG_DEBUG, "extension start");
6150 else if(startcode==0x1B9) av_log(s->avctx, AV_LOG_DEBUG, "fgs start");
6151 else if(startcode==0x1BA) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object start");
6152 else if(startcode==0x1BB) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object Plane start");
6153 else if(startcode==0x1BC) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object start");
6154 else if(startcode==0x1BD) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object Plane start");
6155 else if(startcode==0x1BE) av_log(s->avctx, AV_LOG_DEBUG, "Still Texture Object start");
6156 else if(startcode==0x1BF) av_log(s->avctx, AV_LOG_DEBUG, "Texture Spatial Layer start");
6157 else if(startcode==0x1C0) av_log(s->avctx, AV_LOG_DEBUG, "Texture SNR Layer start");
6158 else if(startcode==0x1C1) av_log(s->avctx, AV_LOG_DEBUG, "Texture Tile start");
6159 else if(startcode==0x1C2) av_log(s->avctx, AV_LOG_DEBUG, "Texture Shape Layer start");
6160 else if(startcode==0x1C3) av_log(s->avctx, AV_LOG_DEBUG, "stuffing start");
6161 else if(startcode<=0x1C5) av_log(s->avctx, AV_LOG_DEBUG, "reserved");
6162 else if(startcode<=0x1FF) av_log(s->avctx, AV_LOG_DEBUG, "System start");
6163 av_log(s->avctx, AV_LOG_DEBUG, " at %d\n", get_bits_count(gb));
6166 if(startcode >= 0x120 && startcode <= 0x12F){
6167 if(decode_vol_header(s, gb) < 0)
6170 else if(startcode == USER_DATA_STARTCODE){
6171 decode_user_data(s, gb);
6173 else if(startcode == GOP_STARTCODE){
6174 mpeg4_decode_gop_header(s, gb);
6176 else if(startcode == VOP_STARTCODE){
6184 if(s->flags& CODEC_FLAG_LOW_DELAY)
6186 s->avctx->has_b_frames= !s->low_delay;
6187 return decode_vop_header(s, gb);
6190 /* don't understand why they choose a different header ! */
6191 int intel_h263_decode_picture_header(MpegEncContext *s)
6195 /* picture header */
6196 if (get_bits_long(&s->gb, 22) != 0x20) {
6197 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
6200 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
6202 if (get_bits1(&s->gb) != 1) {
6203 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
6204 return -1; /* marker */
6206 if (get_bits1(&s->gb) != 0) {
6207 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
6208 return -1; /* h263 id */
6210 skip_bits1(&s->gb); /* split screen off */
6211 skip_bits1(&s->gb); /* camera off */
6212 skip_bits1(&s->gb); /* freeze picture release off */
6214 format = get_bits(&s->gb, 3);
6216 av_log(s->avctx, AV_LOG_ERROR, "Intel H263 free format not supported\n");
6221 s->pict_type = FF_I_TYPE + get_bits1(&s->gb);
6223 s->unrestricted_mv = get_bits1(&s->gb);
6224 s->h263_long_vectors = s->unrestricted_mv;
6226 if (get_bits1(&s->gb) != 0) {
6227 av_log(s->avctx, AV_LOG_ERROR, "SAC not supported\n");
6228 return -1; /* SAC: off */
6230 s->obmc= get_bits1(&s->gb);
6231 s->pb_frame = get_bits1(&s->gb);
6234 format = get_bits(&s->gb, 3);
6235 if(format == 0 || format == 7){
6236 av_log(s->avctx, AV_LOG_ERROR, "Wrong Intel H263 format\n");
6239 if(get_bits(&s->gb, 2))
6240 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
6241 s->loop_filter = get_bits1(&s->gb);
6242 if(get_bits1(&s->gb))
6243 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
6244 if(get_bits1(&s->gb))
6246 if(get_bits(&s->gb, 5))
6247 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
6248 if(get_bits(&s->gb, 5) != 1)
6249 av_log(s->avctx, AV_LOG_ERROR, "Invalid marker\n");
6252 int ar = get_bits(&s->gb, 4);
6253 skip_bits(&s->gb, 9); // display width
6255 skip_bits(&s->gb, 9); // display height
6257 skip_bits(&s->gb, 8); // aspect ratio - width
6258 skip_bits(&s->gb, 8); // aspect ratio - height
6262 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
6263 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
6266 skip_bits(&s->gb, 3); //temporal reference for B-frame
6267 skip_bits(&s->gb, 2); //dbquant
6271 while (get_bits1(&s->gb) != 0) {
6272 skip_bits(&s->gb, 8);
6276 s->y_dc_scale_table=
6277 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
6279 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
6285 int flv_h263_decode_picture_header(MpegEncContext *s)
6287 int format, width, height;
6289 /* picture header */
6290 if (get_bits_long(&s->gb, 17) != 1) {
6291 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
6294 format = get_bits(&s->gb, 5);
6295 if (format != 0 && format != 1) {
6296 av_log(s->avctx, AV_LOG_ERROR, "Bad picture format\n");
6299 s->h263_flv = format+1;
6300 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
6301 format = get_bits(&s->gb, 3);
6304 width = get_bits(&s->gb, 8);
6305 height = get_bits(&s->gb, 8);
6308 width = get_bits(&s->gb, 16);
6309 height = get_bits(&s->gb, 16);
6335 if(avcodec_check_dimensions(s->avctx, width, height))
6340 s->pict_type = FF_I_TYPE + get_bits(&s->gb, 2);
6341 s->dropable= s->pict_type > FF_P_TYPE;
6343 s->pict_type = FF_P_TYPE;
6345 skip_bits1(&s->gb); /* deblocking flag */
6346 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
6350 s->unrestricted_mv = 1;
6351 s->h263_long_vectors = 0;
6354 while (get_bits1(&s->gb) != 0) {
6355 skip_bits(&s->gb, 8);
6359 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
6360 av_log(s->avctx, AV_LOG_DEBUG, "%c esc_type:%d, qp:%d num:%d\n",
6361 s->dropable ? 'D' : av_get_pict_type_char(s->pict_type), s->h263_flv-1, s->qscale, s->picture_number);
6364 s->y_dc_scale_table=
6365 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;