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;
413 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
417 int8_t * const qscale_table= s->current_picture.qscale_table;
419 memcpy(zigzag_last_index, s->block_last_index, sizeof(int)*6);
422 int16_t *ac_val, *ac_val1;
424 score -= get_block_rate(s, block[n], s->block_last_index[n], s->intra_scantable.permutated);
426 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
429 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
431 ac_val-= s->block_wrap[n]*16;
432 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
435 const int level= block[n][s->dsp.idct_permutation[i ]];
436 block[n][s->dsp.idct_permutation[i ]] = level - ac_val[i+8];
437 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
441 /* different qscale, we must rescale */
443 const int level= block[n][s->dsp.idct_permutation[i ]];
444 block[n][s->dsp.idct_permutation[i ]] = level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
445 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
449 st[n]= s->intra_h_scantable.permutated;
451 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
452 /* left prediction */
454 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
457 const int level= block[n][s->dsp.idct_permutation[i<<3]];
458 block[n][s->dsp.idct_permutation[i<<3]]= level - ac_val[i];
460 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
463 /* different qscale, we must rescale */
465 const int level= block[n][s->dsp.idct_permutation[i<<3]];
466 block[n][s->dsp.idct_permutation[i<<3]]= level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
468 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
471 st[n]= s->intra_v_scantable.permutated;
474 for(i=63; i>0; i--) //FIXME optimize
475 if(block[n][ st[n][i] ]) break;
476 s->block_last_index[n]= i;
478 score += get_block_rate(s, block[n], s->block_last_index[n], st[n]);
484 static inline void restore_ac_coeffs(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
487 memcpy(s->block_last_index, zigzag_last_index, sizeof(int)*6);
490 int16_t *ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
492 st[n]= s->intra_scantable.permutated;
496 block[n][s->dsp.idct_permutation[i ]] = ac_val[i+8];
499 /* left prediction */
501 block[n][s->dsp.idct_permutation[i<<3]]= ac_val[i ];
508 * init s->current_picture.qscale_table from s->lambda_table
510 static void ff_init_qscale_tab(MpegEncContext *s){
511 int8_t * const qscale_table= s->current_picture.qscale_table;
514 for(i=0; i<s->mb_num; i++){
515 unsigned int lam= s->lambda_table[ s->mb_index2xy[i] ];
516 int qp= (lam*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
517 qscale_table[ s->mb_index2xy[i] ]= av_clip(qp, s->avctx->qmin, s->avctx->qmax);
522 * modify qscale so that encoding is acually possible in h263 (limit difference to -2..2)
524 void ff_clean_h263_qscales(MpegEncContext *s){
526 int8_t * const qscale_table= s->current_picture.qscale_table;
528 ff_init_qscale_tab(s);
530 for(i=1; i<s->mb_num; i++){
531 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i-1] ] >2)
532 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i-1] ]+2;
534 for(i=s->mb_num-2; i>=0; i--){
535 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i+1] ] >2)
536 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i+1] ]+2;
539 if(s->codec_id != CODEC_ID_H263P){
540 for(i=1; i<s->mb_num; i++){
541 int mb_xy= s->mb_index2xy[i];
543 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_INTER4V)){
544 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_INTER;
551 * modify mb_type & qscale so that encoding is acually possible in mpeg4
553 void ff_clean_mpeg4_qscales(MpegEncContext *s){
555 int8_t * const qscale_table= s->current_picture.qscale_table;
557 ff_clean_h263_qscales(s);
559 if(s->pict_type== FF_B_TYPE){
561 /* ok, come on, this isn't funny anymore, there's more code for handling this mpeg4 mess than for the actual adaptive quantization */
563 for(i=0; i<s->mb_num; i++){
564 int mb_xy= s->mb_index2xy[i];
565 odd += qscale_table[mb_xy]&1;
568 if(2*odd > s->mb_num) odd=1;
571 for(i=0; i<s->mb_num; i++){
572 int mb_xy= s->mb_index2xy[i];
573 if((qscale_table[mb_xy]&1) != odd)
574 qscale_table[mb_xy]++;
575 if(qscale_table[mb_xy] > 31)
576 qscale_table[mb_xy]= 31;
579 for(i=1; i<s->mb_num; i++){
580 int mb_xy= s->mb_index2xy[i];
581 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_DIRECT)){
582 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_BIDIR;
588 #endif //CONFIG_ENCODERS
590 #define tab_size ((signed)FF_ARRAY_ELEMS(s->direct_scale_mv[0]))
591 #define tab_bias (tab_size/2)
593 void ff_mpeg4_init_direct_mv(MpegEncContext *s){
595 for(i=0; i<tab_size; i++){
596 s->direct_scale_mv[0][i] = (i-tab_bias)*s->pb_time/s->pp_time;
597 s->direct_scale_mv[1][i] = (i-tab_bias)*(s->pb_time-s->pp_time)/s->pp_time;
601 static inline void ff_mpeg4_set_one_direct_mv(MpegEncContext *s, int mx, int my, int i){
602 int xy= s->block_index[i];
603 uint16_t time_pp= s->pp_time;
604 uint16_t time_pb= s->pb_time;
607 p_mx= s->next_picture.motion_val[0][xy][0];
608 if((unsigned)(p_mx + tab_bias) < tab_size){
609 s->mv[0][i][0] = s->direct_scale_mv[0][p_mx + tab_bias] + mx;
610 s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx
611 : s->direct_scale_mv[1][p_mx + tab_bias];
613 s->mv[0][i][0] = p_mx*time_pb/time_pp + mx;
614 s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx
615 : p_mx*(time_pb - time_pp)/time_pp;
617 p_my= s->next_picture.motion_val[0][xy][1];
618 if((unsigned)(p_my + tab_bias) < tab_size){
619 s->mv[0][i][1] = s->direct_scale_mv[0][p_my + tab_bias] + my;
620 s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my
621 : s->direct_scale_mv[1][p_my + tab_bias];
623 s->mv[0][i][1] = p_my*time_pb/time_pp + my;
624 s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my
625 : p_my*(time_pb - time_pp)/time_pp;
634 * @return the mb_type
636 int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){
637 const int mb_index= s->mb_x + s->mb_y*s->mb_stride;
638 const int colocated_mb_type= s->next_picture.mb_type[mb_index];
639 uint16_t time_pp= s->pp_time;
640 uint16_t time_pb= s->pb_time;
643 //FIXME avoid divides
644 // try special case with shifts for 1 and 3 B-frames?
646 if(IS_8X8(colocated_mb_type)){
647 s->mv_type = MV_TYPE_8X8;
649 ff_mpeg4_set_one_direct_mv(s, mx, my, i);
651 return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_L0L1;
652 } else if(IS_INTERLACED(colocated_mb_type)){
653 s->mv_type = MV_TYPE_FIELD;
655 int field_select= s->next_picture.ref_index[0][s->block_index[2*i]];
656 s->field_select[0][i]= field_select;
657 s->field_select[1][i]= i;
658 if(s->top_field_first){
659 time_pp= s->pp_field_time - field_select + i;
660 time_pb= s->pb_field_time - field_select + i;
662 time_pp= s->pp_field_time + field_select - i;
663 time_pb= s->pb_field_time + field_select - i;
665 s->mv[0][i][0] = s->p_field_mv_table[i][0][mb_index][0]*time_pb/time_pp + mx;
666 s->mv[0][i][1] = s->p_field_mv_table[i][0][mb_index][1]*time_pb/time_pp + my;
667 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->p_field_mv_table[i][0][mb_index][0]
668 : s->p_field_mv_table[i][0][mb_index][0]*(time_pb - time_pp)/time_pp;
669 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->p_field_mv_table[i][0][mb_index][1]
670 : s->p_field_mv_table[i][0][mb_index][1]*(time_pb - time_pp)/time_pp;
672 return MB_TYPE_DIRECT2 | MB_TYPE_16x8 | MB_TYPE_L0L1 | MB_TYPE_INTERLACED;
674 ff_mpeg4_set_one_direct_mv(s, mx, my, 0);
675 s->mv[0][1][0] = s->mv[0][2][0] = s->mv[0][3][0] = s->mv[0][0][0];
676 s->mv[0][1][1] = s->mv[0][2][1] = s->mv[0][3][1] = s->mv[0][0][1];
677 s->mv[1][1][0] = s->mv[1][2][0] = s->mv[1][3][0] = s->mv[1][0][0];
678 s->mv[1][1][1] = s->mv[1][2][1] = s->mv[1][3][1] = s->mv[1][0][1];
679 if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample)
680 s->mv_type= MV_TYPE_16X16;
682 s->mv_type= MV_TYPE_8X8;
683 return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_L0L1; //Note see prev line
687 void ff_h263_update_motion_val(MpegEncContext * s){
688 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
689 //FIXME a lot of that is only needed for !low_delay
690 const int wrap = s->b8_stride;
691 const int xy = s->block_index[0];
693 s->current_picture.mbskip_table[mb_xy]= s->mb_skipped;
695 if(s->mv_type != MV_TYPE_8X8){
696 int motion_x, motion_y;
700 } else if (s->mv_type == MV_TYPE_16X16) {
701 motion_x = s->mv[0][0][0];
702 motion_y = s->mv[0][0][1];
703 } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {
705 motion_x = s->mv[0][0][0] + s->mv[0][1][0];
706 motion_y = s->mv[0][0][1] + s->mv[0][1][1];
707 motion_x = (motion_x>>1) | (motion_x&1);
709 s->p_field_mv_table[i][0][mb_xy][0]= s->mv[0][i][0];
710 s->p_field_mv_table[i][0][mb_xy][1]= s->mv[0][i][1];
712 s->current_picture.ref_index[0][xy ]=
713 s->current_picture.ref_index[0][xy + 1]= s->field_select[0][0];
714 s->current_picture.ref_index[0][xy + wrap ]=
715 s->current_picture.ref_index[0][xy + wrap + 1]= s->field_select[0][1];
718 /* no update if 8X8 because it has been done during parsing */
719 s->current_picture.motion_val[0][xy][0] = motion_x;
720 s->current_picture.motion_val[0][xy][1] = motion_y;
721 s->current_picture.motion_val[0][xy + 1][0] = motion_x;
722 s->current_picture.motion_val[0][xy + 1][1] = motion_y;
723 s->current_picture.motion_val[0][xy + wrap][0] = motion_x;
724 s->current_picture.motion_val[0][xy + wrap][1] = motion_y;
725 s->current_picture.motion_val[0][xy + 1 + wrap][0] = motion_x;
726 s->current_picture.motion_val[0][xy + 1 + wrap][1] = motion_y;
729 if(s->encoding){ //FIXME encoding MUST be cleaned up
730 if (s->mv_type == MV_TYPE_8X8)
731 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_8x8;
733 s->current_picture.mb_type[mb_xy]= MB_TYPE_INTRA;
735 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_16x16;
741 static inline int h263_get_motion_length(MpegEncContext * s, int val, int f_code){
742 int l, bit_size, code;
747 bit_size = f_code - 1;
748 /* modulo encoding */
749 l= INT_BIT - 6 - bit_size;
752 code = (val >> bit_size) + 1;
754 return mvtab[code][1] + 1 + bit_size;
758 static inline void ff_h263_encode_motion_vector(MpegEncContext * s, int x, int y, int f_code){
759 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
760 skip_put_bits(&s->pb,
761 h263_get_motion_length(s, x, f_code)
762 +h263_get_motion_length(s, y, f_code));
764 ff_h263_encode_motion(s, x, f_code);
765 ff_h263_encode_motion(s, y, f_code);
769 static inline int get_p_cbp(MpegEncContext * s,
770 DCTELEM block[6][64],
771 int motion_x, int motion_y){
774 if(s->flags & CODEC_FLAG_CBP_RD){
775 int best_cbpy_score= INT_MAX;
776 int best_cbpc_score= INT_MAX;
777 int cbpc = (-1), cbpy= (-1);
778 const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0);
779 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
782 int score= inter_MCBPC_bits[i + offset] * lambda;
783 if(i&1) score += s->coded_score[5];
784 if(i&2) score += s->coded_score[4];
786 if(score < best_cbpc_score){
787 best_cbpc_score= score;
793 int score= cbpy_tab[i ^ 0xF][1] * lambda;
794 if(i&1) score += s->coded_score[3];
795 if(i&2) score += s->coded_score[2];
796 if(i&4) score += s->coded_score[1];
797 if(i&8) score += s->coded_score[0];
799 if(score < best_cbpy_score){
800 best_cbpy_score= score;
805 if ((motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16){
806 if(best_cbpy_score + best_cbpc_score + 2*lambda >= 0)
810 for (i = 0; i < 6; i++) {
811 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
812 s->block_last_index[i]= -1;
813 s->dsp.clear_block(s->block[i]);
818 for (i = 0; i < 6; i++) {
819 if (s->block_last_index[i] >= 0)
826 static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64],
827 int motion_x, int motion_y, int mb_type){
830 if(s->flags & CODEC_FLAG_CBP_RD){
832 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
835 if(s->coded_score[i] < 0){
836 score += s->coded_score[i];
843 if ((motion_x | motion_y | s->dquant | mb_type) == 0){
844 zero_score-= 4; //2*MV + mb_type + cbp bit
848 if(zero_score <= score){
853 for (i = 0; i < 6; i++) {
854 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
855 s->block_last_index[i]= -1;
856 s->dsp.clear_block(s->block[i]);
860 for (i = 0; i < 6; i++) {
861 if (s->block_last_index[i] >= 0)
868 static inline void mpeg4_encode_blocks(MpegEncContext * s, DCTELEM block[6][64], int intra_dc[6],
869 uint8_t **scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb){
873 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
874 for (i = 0; i < 6; i++) {
875 skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, intra_dc[i], scan_table[i]));
878 /* encode each block */
879 for (i = 0; i < 6; i++) {
880 mpeg4_encode_block(s, block[i], i, intra_dc[i], scan_table[i], dc_pb, ac_pb);
884 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
885 for (i = 0; i < 6; i++) {
886 skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, 0, s->intra_scantable.permutated));
889 /* encode each block */
890 for (i = 0; i < 6; i++) {
891 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, dc_pb, ac_pb);
897 static const int dquant_code[5]= {1,0,9,2,3};
899 void mpeg4_encode_mb(MpegEncContext * s,
900 DCTELEM block[6][64],
901 int motion_x, int motion_y)
903 int cbpc, cbpy, pred_x, pred_y;
904 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
905 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=FF_B_TYPE ? &s->tex_pb : &s->pb;
906 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=FF_I_TYPE ? &s->pb2 : &s->pb;
907 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
909 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
913 if(s->pict_type==FF_B_TYPE){
914 static const int mb_type_table[8]= {-1, 3, 2, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
915 int mb_type= mb_type_table[s->mv_dir];
922 s->last_mv[i][1][1]= 0;
926 assert(s->dquant>=-2 && s->dquant<=2);
927 assert((s->dquant&1)==0);
930 /* nothing to do if this MB was skipped in the next P Frame */
931 if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){ //FIXME avoid DCT & ...
937 s->mv_dir= MV_DIR_FORWARD; //doesn't matter
938 s->qscale -= s->dquant;
944 cbp= get_b_cbp(s, block, motion_x, motion_y, mb_type);
946 if ((cbp | motion_x | motion_y | mb_type) ==0) {
947 /* direct MB with MV={0,0} */
948 assert(s->dquant==0);
950 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
952 if(interleaved_stats){
960 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
961 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
962 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we don't need it :)
963 if(cbp) put_bits(&s->pb, 6, cbp);
967 put_bits(&s->pb, 2, (s->dquant>>2)+3);
969 put_bits(&s->pb, 1, 0);
971 s->qscale -= s->dquant;
973 if(!s->progressive_sequence){
975 put_bits(&s->pb, 1, s->interlaced_dct);
976 if(mb_type) // not direct mode
977 put_bits(&s->pb, 1, s->mv_type == MV_TYPE_FIELD);
980 if(interleaved_stats){
981 s->misc_bits+= get_bits_diff(s);
985 assert(s->mv_dir & MV_DIRECT);
986 ff_h263_encode_motion_vector(s, motion_x, motion_y, 1);
990 assert(mb_type > 0 && mb_type < 4);
991 if(s->mv_type != MV_TYPE_FIELD){
992 if(s->mv_dir & MV_DIR_FORWARD){
993 ff_h263_encode_motion_vector(s, s->mv[0][0][0] - s->last_mv[0][0][0],
994 s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
995 s->last_mv[0][0][0]= s->last_mv[0][1][0]= s->mv[0][0][0];
996 s->last_mv[0][0][1]= s->last_mv[0][1][1]= s->mv[0][0][1];
999 if(s->mv_dir & MV_DIR_BACKWARD){
1000 ff_h263_encode_motion_vector(s, s->mv[1][0][0] - s->last_mv[1][0][0],
1001 s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
1002 s->last_mv[1][0][0]= s->last_mv[1][1][0]= s->mv[1][0][0];
1003 s->last_mv[1][0][1]= s->last_mv[1][1][1]= s->mv[1][0][1];
1007 if(s->mv_dir & MV_DIR_FORWARD){
1008 put_bits(&s->pb, 1, s->field_select[0][0]);
1009 put_bits(&s->pb, 1, s->field_select[0][1]);
1011 if(s->mv_dir & MV_DIR_BACKWARD){
1012 put_bits(&s->pb, 1, s->field_select[1][0]);
1013 put_bits(&s->pb, 1, s->field_select[1][1]);
1015 if(s->mv_dir & MV_DIR_FORWARD){
1017 ff_h263_encode_motion_vector(s, s->mv[0][i][0] - s->last_mv[0][i][0] ,
1018 s->mv[0][i][1] - s->last_mv[0][i][1]/2, s->f_code);
1019 s->last_mv[0][i][0]= s->mv[0][i][0];
1020 s->last_mv[0][i][1]= s->mv[0][i][1]*2;
1024 if(s->mv_dir & MV_DIR_BACKWARD){
1026 ff_h263_encode_motion_vector(s, s->mv[1][i][0] - s->last_mv[1][i][0] ,
1027 s->mv[1][i][1] - s->last_mv[1][i][1]/2, s->b_code);
1028 s->last_mv[1][i][0]= s->mv[1][i][0];
1029 s->last_mv[1][i][1]= s->mv[1][i][1]*2;
1036 if(interleaved_stats){
1037 s->mv_bits+= get_bits_diff(s);
1040 mpeg4_encode_blocks(s, block, NULL, NULL, NULL, &s->pb);
1042 if(interleaved_stats){
1043 s->p_tex_bits+= get_bits_diff(s);
1046 }else{ /* s->pict_type==FF_B_TYPE */
1047 cbp= get_p_cbp(s, block, motion_x, motion_y);
1049 if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
1050 /* check if the B frames can skip it too, as we must skip it if we skip here
1051 why didn't they just compress the skip-mb bits instead of reusing them ?! */
1052 if(s->max_b_frames>0){
1059 if(x+16 > s->width) x= s->width-16;
1060 if(y+16 > s->height) y= s->height-16;
1062 offset= x + y*s->linesize;
1063 p_pic= s->new_picture.data[0] + offset;
1066 for(i=0; i<s->max_b_frames; i++){
1069 Picture *pic= s->reordered_input_picture[i+1];
1071 if(pic==NULL || pic->pict_type!=FF_B_TYPE) break;
1073 b_pic= pic->data[0] + offset;
1074 if(pic->type != FF_BUFFER_TYPE_SHARED)
1075 b_pic+= INPLACE_OFFSET;
1076 diff= s->dsp.sad[0](NULL, p_pic, b_pic, s->linesize, 16);
1077 if(diff>s->qscale*70){ //FIXME check that 70 is optimal
1085 if(s->mb_skipped==1){
1086 /* skip macroblock */
1087 put_bits(&s->pb, 1, 1);
1089 if(interleaved_stats){
1099 put_bits(&s->pb, 1, 0); /* mb coded */
1103 if(s->mv_type==MV_TYPE_16X16){
1104 if(s->dquant) cbpc+= 8;
1106 inter_MCBPC_bits[cbpc],
1107 inter_MCBPC_code[cbpc]);
1109 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1111 put_bits(pb2, 2, dquant_code[s->dquant+2]);
1113 if(!s->progressive_sequence){
1115 put_bits(pb2, 1, s->interlaced_dct);
1116 put_bits(pb2, 1, 0);
1119 if(interleaved_stats){
1120 s->misc_bits+= get_bits_diff(s);
1123 /* motion vectors: 16x16 mode */
1124 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1126 ff_h263_encode_motion_vector(s, motion_x - pred_x,
1127 motion_y - pred_y, s->f_code);
1128 }else if(s->mv_type==MV_TYPE_FIELD){
1129 if(s->dquant) cbpc+= 8;
1131 inter_MCBPC_bits[cbpc],
1132 inter_MCBPC_code[cbpc]);
1134 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1136 put_bits(pb2, 2, dquant_code[s->dquant+2]);
1138 assert(!s->progressive_sequence);
1140 put_bits(pb2, 1, s->interlaced_dct);
1141 put_bits(pb2, 1, 1);
1143 if(interleaved_stats){
1144 s->misc_bits+= get_bits_diff(s);
1147 /* motion vectors: 16x8 interlaced mode */
1148 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1151 put_bits(&s->pb, 1, s->field_select[0][0]);
1152 put_bits(&s->pb, 1, s->field_select[0][1]);
1154 ff_h263_encode_motion_vector(s, s->mv[0][0][0] - pred_x,
1155 s->mv[0][0][1] - pred_y, s->f_code);
1156 ff_h263_encode_motion_vector(s, s->mv[0][1][0] - pred_x,
1157 s->mv[0][1][1] - pred_y, s->f_code);
1159 assert(s->mv_type==MV_TYPE_8X8);
1161 inter_MCBPC_bits[cbpc+16],
1162 inter_MCBPC_code[cbpc+16]);
1163 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1165 if(!s->progressive_sequence){
1167 put_bits(pb2, 1, s->interlaced_dct);
1170 if(interleaved_stats){
1171 s->misc_bits+= get_bits_diff(s);
1175 /* motion vectors: 8x8 mode*/
1176 h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1178 ff_h263_encode_motion_vector(s, s->current_picture.motion_val[0][ s->block_index[i] ][0] - pred_x,
1179 s->current_picture.motion_val[0][ s->block_index[i] ][1] - pred_y, s->f_code);
1183 if(interleaved_stats){
1184 s->mv_bits+= get_bits_diff(s);
1187 mpeg4_encode_blocks(s, block, NULL, NULL, NULL, tex_pb);
1189 if(interleaved_stats){
1190 s->p_tex_bits+= get_bits_diff(s);
1196 int dc_diff[6]; //dc values with the dc prediction subtracted
1197 int dir[6]; //prediction direction
1198 int zigzag_last_index[6];
1199 uint8_t *scan_table[6];
1203 dc_diff[i]= ff_mpeg4_pred_dc(s, i, block[i][0], &dir[i], 1);
1206 if(s->flags & CODEC_FLAG_AC_PRED){
1207 s->ac_pred= decide_ac_pred(s, block, dir, scan_table, zigzag_last_index);
1209 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1212 scan_table[i]= s->intra_scantable.permutated;
1217 for (i = 0; i < 6; i++) {
1218 if (s->block_last_index[i] >= 1)
1219 cbp |= 1 << (5 - i);
1223 if (s->pict_type == FF_I_TYPE) {
1224 if(s->dquant) cbpc+=4;
1226 intra_MCBPC_bits[cbpc],
1227 intra_MCBPC_code[cbpc]);
1229 if(s->dquant) cbpc+=8;
1230 put_bits(&s->pb, 1, 0); /* mb coded */
1232 inter_MCBPC_bits[cbpc + 4],
1233 inter_MCBPC_code[cbpc + 4]);
1235 put_bits(pb2, 1, s->ac_pred);
1237 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1239 put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
1241 if(!s->progressive_sequence){
1242 put_bits(dc_pb, 1, s->interlaced_dct);
1245 if(interleaved_stats){
1246 s->misc_bits+= get_bits_diff(s);
1249 mpeg4_encode_blocks(s, block, dc_diff, scan_table, dc_pb, tex_pb);
1251 if(interleaved_stats){
1252 s->i_tex_bits+= get_bits_diff(s);
1256 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
1258 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1262 void h263_encode_mb(MpegEncContext * s,
1263 DCTELEM block[6][64],
1264 int motion_x, int motion_y)
1266 int cbpc, cbpy, i, cbp, pred_x, pred_y;
1268 int16_t rec_intradc[6];
1270 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1);
1272 //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
1275 cbp= get_p_cbp(s, block, motion_x, motion_y);
1277 if ((cbp | motion_x | motion_y | s->dquant | (s->mv_type - MV_TYPE_16X16)) == 0) {
1278 /* skip macroblock */
1279 put_bits(&s->pb, 1, 1);
1280 if(interleaved_stats){
1288 put_bits(&s->pb, 1, 0); /* mb coded */
1292 if(s->alt_inter_vlc==0 || cbpc!=3)
1294 if(s->dquant) cbpc+= 8;
1295 if(s->mv_type==MV_TYPE_16X16){
1297 inter_MCBPC_bits[cbpc],
1298 inter_MCBPC_code[cbpc]);
1300 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1302 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1304 if(interleaved_stats){
1305 s->misc_bits+= get_bits_diff(s);
1308 /* motion vectors: 16x16 mode */
1309 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1312 ff_h263_encode_motion_vector(s, motion_x - pred_x,
1313 motion_y - pred_y, 1);
1316 h263p_encode_umotion(s, motion_x - pred_x);
1317 h263p_encode_umotion(s, motion_y - pred_y);
1318 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
1319 /* To prevent Start Code emulation */
1320 put_bits(&s->pb,1,1);
1324 inter_MCBPC_bits[cbpc+16],
1325 inter_MCBPC_code[cbpc+16]);
1326 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1328 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1330 if(interleaved_stats){
1331 s->misc_bits+= get_bits_diff(s);
1335 /* motion vectors: 8x8 mode*/
1336 h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1338 motion_x= s->current_picture.motion_val[0][ s->block_index[i] ][0];
1339 motion_y= s->current_picture.motion_val[0][ s->block_index[i] ][1];
1341 ff_h263_encode_motion_vector(s, motion_x - pred_x,
1342 motion_y - pred_y, 1);
1345 h263p_encode_umotion(s, motion_x - pred_x);
1346 h263p_encode_umotion(s, motion_y - pred_y);
1347 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
1348 /* To prevent Start Code emulation */
1349 put_bits(&s->pb,1,1);
1354 if(interleaved_stats){
1355 s->mv_bits+= get_bits_diff(s);
1358 assert(s->mb_intra);
1363 for(i=0; i<6; i++) {
1364 int16_t level = block[i][0];
1367 if(i<4) scale= s->y_dc_scale;
1368 else scale= s->c_dc_scale;
1370 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
1374 level = (level + (scale>>1))/scale;
1376 level = (level - (scale>>1))/scale;
1378 /* AIC can change CBP */
1379 if (level == 0 && s->block_last_index[i] == 0)
1380 s->block_last_index[i] = -1;
1382 if(!s->modified_quant){
1385 else if (level > 127)
1389 block[i][0] = level;
1390 /* Reconstruction */
1391 rec_intradc[i] = scale*level + pred_dc;
1393 rec_intradc[i] |= 1;
1394 //if ((rec_intradc[i] % 2) == 0)
1395 // rec_intradc[i]++;
1397 if (rec_intradc[i] < 0)
1399 else if (rec_intradc[i] > 2047)
1400 rec_intradc[i] = 2047;
1402 /* Update AC/DC tables */
1403 *dc_ptr[i] = rec_intradc[i];
1404 if (s->block_last_index[i] >= 0)
1405 cbp |= 1 << (5 - i);
1408 for(i=0; i<6; i++) {
1410 if (s->block_last_index[i] >= 1)
1411 cbp |= 1 << (5 - i);
1416 if (s->pict_type == FF_I_TYPE) {
1417 if(s->dquant) cbpc+=4;
1419 intra_MCBPC_bits[cbpc],
1420 intra_MCBPC_code[cbpc]);
1422 if(s->dquant) cbpc+=8;
1423 put_bits(&s->pb, 1, 0); /* mb coded */
1425 inter_MCBPC_bits[cbpc + 4],
1426 inter_MCBPC_code[cbpc + 4]);
1429 /* XXX: currently, we do not try to use ac prediction */
1430 put_bits(&s->pb, 1, 0); /* no AC prediction */
1433 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1435 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1437 if(interleaved_stats){
1438 s->misc_bits+= get_bits_diff(s);
1442 for(i=0; i<6; i++) {
1443 /* encode each block */
1444 h263_encode_block(s, block[i], i);
1446 /* Update INTRADC for decoding */
1447 if (s->h263_aic && s->mb_intra) {
1448 block[i][0] = rec_intradc[i];
1453 if(interleaved_stats){
1455 s->p_tex_bits+= get_bits_diff(s);
1458 s->i_tex_bits+= get_bits_diff(s);
1465 void ff_h263_loop_filter(MpegEncContext * s){
1467 const int linesize = s->linesize;
1468 const int uvlinesize= s->uvlinesize;
1469 const int xy = s->mb_y * s->mb_stride + s->mb_x;
1470 uint8_t *dest_y = s->dest[0];
1471 uint8_t *dest_cb= s->dest[1];
1472 uint8_t *dest_cr= s->dest[2];
1474 // if(s->pict_type==FF_B_TYPE && !s->readable) return;
1480 if(!IS_SKIP(s->current_picture.mb_type[xy])){
1482 s->dsp.h263_v_loop_filter(dest_y+8*linesize , linesize, qp_c);
1483 s->dsp.h263_v_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
1488 int qp_dt, qp_tt, qp_tc;
1490 if(IS_SKIP(s->current_picture.mb_type[xy-s->mb_stride]))
1493 qp_tt= s->current_picture.qscale_table[xy-s->mb_stride];
1501 const int chroma_qp= s->chroma_qscale_table[qp_tc];
1502 s->dsp.h263_v_loop_filter(dest_y , linesize, qp_tc);
1503 s->dsp.h263_v_loop_filter(dest_y+8, linesize, qp_tc);
1505 s->dsp.h263_v_loop_filter(dest_cb , uvlinesize, chroma_qp);
1506 s->dsp.h263_v_loop_filter(dest_cr , uvlinesize, chroma_qp);
1510 s->dsp.h263_h_loop_filter(dest_y-8*linesize+8 , linesize, qp_tt);
1513 if(qp_tt || IS_SKIP(s->current_picture.mb_type[xy-1-s->mb_stride]))
1516 qp_dt= s->current_picture.qscale_table[xy-1-s->mb_stride];
1519 const int chroma_qp= s->chroma_qscale_table[qp_dt];
1520 s->dsp.h263_h_loop_filter(dest_y -8*linesize , linesize, qp_dt);
1521 s->dsp.h263_h_loop_filter(dest_cb-8*uvlinesize, uvlinesize, chroma_qp);
1522 s->dsp.h263_h_loop_filter(dest_cr-8*uvlinesize, uvlinesize, chroma_qp);
1528 s->dsp.h263_h_loop_filter(dest_y +8, linesize, qp_c);
1529 if(s->mb_y + 1 == s->mb_height)
1530 s->dsp.h263_h_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
1535 if(qp_c || IS_SKIP(s->current_picture.mb_type[xy-1]))
1538 qp_lc= s->current_picture.qscale_table[xy-1];
1541 s->dsp.h263_h_loop_filter(dest_y, linesize, qp_lc);
1542 if(s->mb_y + 1 == s->mb_height){
1543 const int chroma_qp= s->chroma_qscale_table[qp_lc];
1544 s->dsp.h263_h_loop_filter(dest_y +8* linesize, linesize, qp_lc);
1545 s->dsp.h263_h_loop_filter(dest_cb , uvlinesize, chroma_qp);
1546 s->dsp.h263_h_loop_filter(dest_cr , uvlinesize, chroma_qp);
1553 static int h263_pred_dc(MpegEncContext * s, int n, int16_t **dc_val_ptr)
1555 int x, y, wrap, a, c, pred_dc, scale;
1558 /* find prediction */
1560 x = 2 * s->mb_x + (n & 1);
1561 y = 2 * s->mb_y + ((n & 2) >> 1);
1562 wrap = s->b8_stride;
1563 dc_val = s->dc_val[0];
1564 scale = s->y_dc_scale;
1568 wrap = s->mb_stride;
1569 dc_val = s->dc_val[n - 4 + 1];
1570 scale = s->c_dc_scale;
1575 a = dc_val[(x - 1) + (y) * wrap];
1576 c = dc_val[(x) + (y - 1) * wrap];
1578 /* No prediction outside GOB boundary */
1579 if(s->first_slice_line && n!=3){
1581 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
1583 /* just DC prediction */
1584 if (a != 1024 && c != 1024)
1585 pred_dc = (a + c) >> 1;
1591 /* we assume pred is positive */
1592 //pred_dc = (pred_dc + (scale >> 1)) / scale;
1593 *dc_val_ptr = &dc_val[x + y * wrap];
1596 #endif /* CONFIG_ENCODERS */
1598 static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n)
1600 int x, y, wrap, a, c, pred_dc, scale, i;
1601 int16_t *dc_val, *ac_val, *ac_val1;
1603 /* find prediction */
1605 x = 2 * s->mb_x + (n & 1);
1606 y = 2 * s->mb_y + (n>> 1);
1607 wrap = s->b8_stride;
1608 dc_val = s->dc_val[0];
1609 ac_val = s->ac_val[0][0];
1610 scale = s->y_dc_scale;
1614 wrap = s->mb_stride;
1615 dc_val = s->dc_val[n - 4 + 1];
1616 ac_val = s->ac_val[n - 4 + 1][0];
1617 scale = s->c_dc_scale;
1620 ac_val += ((y) * wrap + (x)) * 16;
1626 a = dc_val[(x - 1) + (y) * wrap];
1627 c = dc_val[(x) + (y - 1) * wrap];
1629 /* No prediction outside GOB boundary */
1630 if(s->first_slice_line && n!=3){
1632 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
1637 if (s->h263_aic_dir) {
1638 /* left prediction */
1642 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
1647 /* top prediction */
1649 ac_val -= 16 * wrap;
1651 block[s->dsp.idct_permutation[i ]] += ac_val[i + 8];
1657 /* just DC prediction */
1658 if (a != 1024 && c != 1024)
1659 pred_dc = (a + c) >> 1;
1666 /* we assume pred is positive */
1667 block[0]=block[0]*scale + pred_dc;
1674 /* Update AC/DC tables */
1675 dc_val[(x) + (y) * wrap] = block[0];
1679 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
1682 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
1685 int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir,
1689 int16_t *A, *B, *C, (*mot_val)[2];
1690 static const int off[4]= {2, 1, 1, -1};
1692 wrap = s->b8_stride;
1693 mot_val = s->current_picture.motion_val[dir] + s->block_index[block];
1696 /* special case for first (slice) line */
1697 if (s->first_slice_line && block<3) {
1698 // we can't just change some MVs to simulate that as we need them for the B frames (and ME)
1699 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
1700 if(block==0){ //most common case
1701 if(s->mb_x == s->resync_mb_x){ //rare
1703 }else if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
1704 C = mot_val[off[block] - wrap];
1709 *px = mid_pred(A[0], 0, C[0]);
1710 *py = mid_pred(A[1], 0, C[1]);
1717 if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
1718 C = mot_val[off[block] - wrap];
1719 *px = mid_pred(A[0], 0, C[0]);
1720 *py = mid_pred(A[1], 0, C[1]);
1725 }else{ /* block==2*/
1726 B = mot_val[ - wrap];
1727 C = mot_val[off[block] - wrap];
1728 if(s->mb_x == s->resync_mb_x) //rare
1731 *px = mid_pred(A[0], B[0], C[0]);
1732 *py = mid_pred(A[1], B[1], C[1]);
1735 B = mot_val[ - wrap];
1736 C = mot_val[off[block] - wrap];
1737 *px = mid_pred(A[0], B[0], C[0]);
1738 *py = mid_pred(A[1], B[1], C[1]);
1744 void ff_h263_encode_motion(MpegEncContext * s, int val, int f_code)
1746 int range, l, bit_size, sign, code, bits;
1751 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1753 bit_size = f_code - 1;
1754 range = 1 << bit_size;
1755 /* modulo encoding */
1756 l= INT_BIT - 6 - bit_size;
1759 val= (val^sign)-sign;
1763 code = (val >> bit_size) + 1;
1764 bits = val & (range - 1);
1766 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1768 put_bits(&s->pb, bit_size, bits);
1773 /* Encode MV differences on H.263+ with Unrestricted MV mode */
1774 static void h263p_encode_umotion(MpegEncContext * s, int val)
1784 put_bits(&s->pb, 1, 1);
1786 put_bits(&s->pb, 3, 0);
1788 put_bits(&s->pb, 3, 2);
1791 sval = ((val < 0) ? (short)(-val):(short)val);
1794 while (temp_val != 0) {
1795 temp_val = temp_val >> 1;
1801 tcode = (sval & (1 << (i-1))) >> (i-1);
1802 tcode = (tcode << 1) | 1;
1803 code = (code << 2) | tcode;
1806 code = ((code << 1) | (val < 0)) << 1;
1807 put_bits(&s->pb, (2*n_bits)+1, code);
1808 //printf("\nVal = %d\tCode = %d", sval, code);
1812 static void init_mv_penalty_and_fcode(MpegEncContext *s)
1817 for(f_code=1; f_code<=MAX_FCODE; f_code++){
1818 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
1821 if(mv==0) len= mvtab[0][1];
1823 int val, bit_size, code;
1825 bit_size = f_code - 1;
1831 code = (val >> bit_size) + 1;
1833 len= mvtab[code][1] + 1 + bit_size;
1835 len= mvtab[32][1] + av_log2(code>>5) + 2 + bit_size;
1839 mv_penalty[f_code][mv+MAX_MV]= len;
1843 for(f_code=MAX_FCODE; f_code>0; f_code--){
1844 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
1845 fcode_tab[mv+MAX_MV]= f_code;
1849 for(mv=0; mv<MAX_MV*2+1; mv++){
1850 umv_fcode_tab[mv]= 1;
1854 static void init_uni_dc_tab(void)
1856 int level, uni_code, uni_len;
1858 for(level=-256; level<256; level++){
1860 /* find number of bits */
1869 l= (-level) ^ ((1 << size) - 1);
1874 uni_code= DCtab_lum[size][0];
1875 uni_len = DCtab_lum[size][1];
1878 uni_code<<=size; uni_code|=l;
1881 uni_code<<=1; uni_code|=1;
1885 uni_DCtab_lum_bits[level+256]= uni_code;
1886 uni_DCtab_lum_len [level+256]= uni_len;
1889 uni_code= DCtab_chrom[size][0];
1890 uni_len = DCtab_chrom[size][1];
1893 uni_code<<=size; uni_code|=l;
1896 uni_code<<=1; uni_code|=1;
1900 uni_DCtab_chrom_bits[level+256]= uni_code;
1901 uni_DCtab_chrom_len [level+256]= uni_len;
1906 static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1907 int slevel, run, last;
1909 assert(MAX_LEVEL >= 64);
1910 assert(MAX_RUN >= 63);
1912 for(slevel=-64; slevel<64; slevel++){
1913 if(slevel==0) continue;
1914 for(run=0; run<64; run++){
1915 for(last=0; last<=1; last++){
1916 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1917 int level= slevel < 0 ? -slevel : slevel;
1918 int sign= slevel < 0 ? 1 : 0;
1919 int bits, len, code;
1922 len_tab[index]= 100;
1925 code= get_rl_index(rl, last, run, level);
1926 bits= rl->table_vlc[code][0];
1927 len= rl->table_vlc[code][1];
1928 bits=bits*2+sign; len++;
1930 if(code!=rl->n && len < len_tab[index]){
1931 bits_tab[index]= bits;
1932 len_tab [index]= len;
1936 bits= rl->table_vlc[rl->n][0];
1937 len= rl->table_vlc[rl->n][1];
1938 bits=bits*2; len++; //esc1
1939 level1= level - rl->max_level[last][run];
1941 code= get_rl_index(rl, last, run, level1);
1942 bits<<= rl->table_vlc[code][1];
1943 len += rl->table_vlc[code][1];
1944 bits += rl->table_vlc[code][0];
1945 bits=bits*2+sign; len++;
1947 if(code!=rl->n && len < len_tab[index]){
1948 bits_tab[index]= bits;
1949 len_tab [index]= len;
1955 bits= rl->table_vlc[rl->n][0];
1956 len= rl->table_vlc[rl->n][1];
1957 bits=bits*4+2; len+=2; //esc2
1958 run1 = run - rl->max_run[last][level] - 1;
1960 code= get_rl_index(rl, last, run1, level);
1961 bits<<= rl->table_vlc[code][1];
1962 len += rl->table_vlc[code][1];
1963 bits += rl->table_vlc[code][0];
1964 bits=bits*2+sign; len++;
1966 if(code!=rl->n && len < len_tab[index]){
1967 bits_tab[index]= bits;
1968 len_tab [index]= len;
1973 bits= rl->table_vlc[rl->n][0];
1974 len = rl->table_vlc[rl->n][1];
1975 bits=bits*4+3; len+=2; //esc3
1976 bits=bits*2+last; len++;
1977 bits=bits*64+run; len+=6;
1978 bits=bits*2+1; len++; //marker
1979 bits=bits*4096+(slevel&0xfff); len+=12;
1980 bits=bits*2+1; len++; //marker
1982 if(len < len_tab[index]){
1983 bits_tab[index]= bits;
1984 len_tab [index]= len;
1991 static void init_uni_h263_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1992 int slevel, run, last;
1994 assert(MAX_LEVEL >= 64);
1995 assert(MAX_RUN >= 63);
1997 for(slevel=-64; slevel<64; slevel++){
1998 if(slevel==0) continue;
1999 for(run=0; run<64; run++){
2000 for(last=0; last<=1; last++){
2001 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
2002 int level= slevel < 0 ? -slevel : slevel;
2003 int sign= slevel < 0 ? 1 : 0;
2004 int bits, len, code;
2006 len_tab[index]= 100;
2009 code= get_rl_index(rl, last, run, level);
2010 bits= rl->table_vlc[code][0];
2011 len= rl->table_vlc[code][1];
2012 bits=bits*2+sign; len++;
2014 if(code!=rl->n && len < len_tab[index]){
2015 if(bits_tab) bits_tab[index]= bits;
2016 len_tab [index]= len;
2019 bits= rl->table_vlc[rl->n][0];
2020 len = rl->table_vlc[rl->n][1];
2021 bits=bits*2+last; len++;
2022 bits=bits*64+run; len+=6;
2023 bits=bits*256+(level&0xff); len+=8;
2025 if(len < len_tab[index]){
2026 if(bits_tab) bits_tab[index]= bits;
2027 len_tab [index]= len;
2034 void h263_encode_init(MpegEncContext *s)
2036 static int done = 0;
2043 init_rl(&rl_inter, static_rl_table_store[0]);
2044 init_rl(&rl_intra, static_rl_table_store[1]);
2045 init_rl(&rl_intra_aic, static_rl_table_store[2]);
2047 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
2048 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
2050 init_uni_h263_rl_tab(&rl_intra_aic, NULL, uni_h263_intra_aic_rl_len);
2051 init_uni_h263_rl_tab(&rl_inter , NULL, uni_h263_inter_rl_len);
2053 init_mv_penalty_and_fcode(s);
2055 s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
2057 s->intra_ac_vlc_length =s->inter_ac_vlc_length = uni_h263_inter_rl_len;
2058 s->intra_ac_vlc_last_length=s->inter_ac_vlc_last_length= uni_h263_inter_rl_len + 128*64;
2060 s->intra_ac_vlc_length = uni_h263_intra_aic_rl_len;
2061 s->intra_ac_vlc_last_length= uni_h263_intra_aic_rl_len + 128*64;
2063 s->ac_esc_length= 7+1+6+8;
2065 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
2066 switch(s->codec_id){
2067 case CODEC_ID_MPEG4:
2068 s->fcode_tab= fcode_tab;
2069 s->min_qcoeff= -2048;
2070 s->max_qcoeff= 2047;
2071 s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len;
2072 s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64;
2073 s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len;
2074 s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64;
2075 s->luma_dc_vlc_length= uni_DCtab_lum_len;
2076 s->chroma_dc_vlc_length= uni_DCtab_chrom_len;
2077 s->ac_esc_length= 7+2+1+6+1+12+1;
2078 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
2079 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
2081 if(s->flags & CODEC_FLAG_GLOBAL_HEADER){
2083 s->avctx->extradata= av_malloc(1024);
2084 init_put_bits(&s->pb, s->avctx->extradata, 1024);
2086 if(!(s->workaround_bugs & FF_BUG_MS))
2087 mpeg4_encode_visual_object_header(s);
2088 mpeg4_encode_vol_header(s, 0, 0);
2090 // ff_mpeg4_stuffing(&s->pb); ?
2091 flush_put_bits(&s->pb);
2092 s->avctx->extradata_size= (put_bits_count(&s->pb)+7)>>3;
2096 case CODEC_ID_H263P:
2098 s->fcode_tab= umv_fcode_tab;
2099 if(s->modified_quant){
2100 s->min_qcoeff= -2047;
2101 s->max_qcoeff= 2047;
2103 s->min_qcoeff= -127;
2107 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
2109 if (s->h263_flv > 1) {
2110 s->min_qcoeff= -1023;
2111 s->max_qcoeff= 1023;
2113 s->min_qcoeff= -127;
2116 s->y_dc_scale_table=
2117 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
2119 default: //nothing needed - default table already set in mpegvideo.c
2120 s->min_qcoeff= -127;
2122 s->y_dc_scale_table=
2123 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
2128 * encodes a 8x8 block.
2129 * @param block the 8x8 block
2130 * @param n block index (0-3 are luma, 4-5 are chroma)
2132 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
2134 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
2138 if (s->mb_intra && !s->h263_aic) {
2141 /* 255 cannot be represented, so we clamp */
2146 /* 0 cannot be represented also */
2147 else if (level < 1) {
2151 if (level == 128) //FIXME check rv10
2152 put_bits(&s->pb, 8, 0xff);
2154 put_bits(&s->pb, 8, level);
2158 if (s->h263_aic && s->mb_intra)
2161 if(s->alt_inter_vlc && !s->mb_intra){
2163 int inter_vlc_bits=0;
2167 last_index = s->block_last_index[n];
2168 last_non_zero = i - 1;
2169 for (; i <= last_index; i++) {
2170 j = s->intra_scantable.permutated[i];
2173 run = i - last_non_zero - 1;
2174 last = (i == last_index);
2176 if(level<0) level= -level;
2178 code = get_rl_index(rl, last, run, level);
2179 aic_code = get_rl_index(&rl_intra_aic, last, run, level);
2180 inter_vlc_bits += rl->table_vlc[code][1]+1;
2181 aic_vlc_bits += rl_intra_aic.table_vlc[aic_code][1]+1;
2183 if (code == rl->n) {
2184 inter_vlc_bits += 1+6+8-1;
2186 if (aic_code == rl_intra_aic.n) {
2187 aic_vlc_bits += 1+6+8-1;
2188 wrong_pos += run + 1;
2190 wrong_pos += wrong_run[aic_code];
2195 if(aic_vlc_bits < inter_vlc_bits && wrong_pos > 63)
2201 last_index = s->block_last_index[n];
2202 last_non_zero = i - 1;
2203 for (; i <= last_index; i++) {
2204 j = s->intra_scantable.permutated[i];
2207 run = i - last_non_zero - 1;
2208 last = (i == last_index);
2215 code = get_rl_index(rl, last, run, level);
2216 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2217 if (code == rl->n) {
2218 if(s->h263_flv <= 1){
2219 put_bits(&s->pb, 1, last);
2220 put_bits(&s->pb, 6, run);
2222 assert(slevel != 0);
2225 put_sbits(&s->pb, 8, slevel);
2227 put_bits(&s->pb, 8, 128);
2228 put_sbits(&s->pb, 5, slevel);
2229 put_sbits(&s->pb, 6, slevel>>5);
2232 if(level < 64) { // 7-bit level
2233 put_bits(&s->pb, 1, 0);
2234 put_bits(&s->pb, 1, last);
2235 put_bits(&s->pb, 6, run);
2237 put_sbits(&s->pb, 7, slevel);
2240 put_bits(&s->pb, 1, 1);
2241 put_bits(&s->pb, 1, last);
2242 put_bits(&s->pb, 6, run);
2244 put_sbits(&s->pb, 11, slevel);
2248 put_bits(&s->pb, 1, sign);
2255 /***************************************************/
2257 * add mpeg4 stuffing bits (01...1)
2259 void ff_mpeg4_stuffing(PutBitContext * pbc)
2262 put_bits(pbc, 1, 0);
2263 length= (-put_bits_count(pbc))&7;
2264 if(length) put_bits(pbc, length, (1<<length)-1);
2267 /* must be called before writing the header */
2268 void ff_set_mpeg4_time(MpegEncContext * s){
2269 if(s->pict_type==FF_B_TYPE){
2270 ff_mpeg4_init_direct_mv(s);
2272 s->last_time_base= s->time_base;
2273 s->time_base= s->time/s->avctx->time_base.den;
2277 static void mpeg4_encode_gop_header(MpegEncContext * s){
2278 int hours, minutes, seconds;
2281 put_bits(&s->pb, 16, 0);
2282 put_bits(&s->pb, 16, GOP_STARTCODE);
2284 time= s->current_picture_ptr->pts;
2285 if(s->reordered_input_picture[1])
2286 time= FFMIN(time, s->reordered_input_picture[1]->pts);
2287 time= time*s->avctx->time_base.num;
2289 seconds= time/s->avctx->time_base.den;
2290 minutes= seconds/60; seconds %= 60;
2291 hours= minutes/60; minutes %= 60;
2294 put_bits(&s->pb, 5, hours);
2295 put_bits(&s->pb, 6, minutes);
2296 put_bits(&s->pb, 1, 1);
2297 put_bits(&s->pb, 6, seconds);
2299 put_bits(&s->pb, 1, !!(s->flags&CODEC_FLAG_CLOSED_GOP));
2300 put_bits(&s->pb, 1, 0); //broken link == NO
2302 s->last_time_base= time / s->avctx->time_base.den;
2304 ff_mpeg4_stuffing(&s->pb);
2307 static void mpeg4_encode_visual_object_header(MpegEncContext * s){
2308 int profile_and_level_indication;
2311 if(s->avctx->profile != FF_PROFILE_UNKNOWN){
2312 profile_and_level_indication = s->avctx->profile << 4;
2313 }else if(s->max_b_frames || s->quarter_sample){
2314 profile_and_level_indication= 0xF0; // adv simple
2316 profile_and_level_indication= 0x00; // simple
2319 if(s->avctx->level != FF_LEVEL_UNKNOWN){
2320 profile_and_level_indication |= s->avctx->level;
2322 profile_and_level_indication |= 1; //level 1
2325 if(profile_and_level_indication>>4 == 0xF){
2333 put_bits(&s->pb, 16, 0);
2334 put_bits(&s->pb, 16, VOS_STARTCODE);
2336 put_bits(&s->pb, 8, profile_and_level_indication);
2338 put_bits(&s->pb, 16, 0);
2339 put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);
2341 put_bits(&s->pb, 1, 1);
2342 put_bits(&s->pb, 4, vo_ver_id);
2343 put_bits(&s->pb, 3, 1); //priority
2345 put_bits(&s->pb, 4, 1); //visual obj type== video obj
2347 put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME
2349 ff_mpeg4_stuffing(&s->pb);
2352 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number)
2356 if (!CONFIG_MPEG4_ENCODER) return;
2358 if(s->max_b_frames || s->quarter_sample){
2360 s->vo_type= ADV_SIMPLE_VO_TYPE;
2363 s->vo_type= SIMPLE_VO_TYPE;
2366 put_bits(&s->pb, 16, 0);
2367 put_bits(&s->pb, 16, 0x100 + vo_number); /* video obj */
2368 put_bits(&s->pb, 16, 0);
2369 put_bits(&s->pb, 16, 0x120 + vol_number); /* video obj layer */
2371 put_bits(&s->pb, 1, 0); /* random access vol */
2372 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
2373 if(s->workaround_bugs & FF_BUG_MS) {
2374 put_bits(&s->pb, 1, 0); /* is obj layer id= no */
2376 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
2377 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
2378 put_bits(&s->pb, 3, 1); /* is obj layer priority */
2381 aspect_to_info(s, s->avctx->sample_aspect_ratio);
2383 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
2384 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
2385 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
2386 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
2389 if(s->workaround_bugs & FF_BUG_MS) { //
2390 put_bits(&s->pb, 1, 0); /* vol control parameters= no @@@ */
2392 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
2393 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
2394 put_bits(&s->pb, 1, s->low_delay);
2395 put_bits(&s->pb, 1, 0); /* vbv parameters= no */
2398 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
2399 put_bits(&s->pb, 1, 1); /* marker bit */
2401 put_bits(&s->pb, 16, s->avctx->time_base.den);
2402 if (s->time_increment_bits < 1)
2403 s->time_increment_bits = 1;
2404 put_bits(&s->pb, 1, 1); /* marker bit */
2405 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
2406 put_bits(&s->pb, 1, 1); /* marker bit */
2407 put_bits(&s->pb, 13, s->width); /* vol width */
2408 put_bits(&s->pb, 1, 1); /* marker bit */
2409 put_bits(&s->pb, 13, s->height); /* vol height */
2410 put_bits(&s->pb, 1, 1); /* marker bit */
2411 put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
2412 put_bits(&s->pb, 1, 1); /* obmc disable */
2413 if (vo_ver_id == 1) {
2414 put_bits(&s->pb, 1, s->vol_sprite_usage); /* sprite enable */
2416 put_bits(&s->pb, 2, s->vol_sprite_usage); /* sprite enable */
2419 put_bits(&s->pb, 1, 0); /* not 8 bit == false */
2420 put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
2423 ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix);
2424 ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix);
2428 put_bits(&s->pb, 1, s->quarter_sample);
2429 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
2430 s->resync_marker= s->rtp_mode;
2431 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
2432 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
2433 if(s->data_partitioning){
2434 put_bits(&s->pb, 1, 0); /* no rvlc */
2437 if (vo_ver_id != 1){
2438 put_bits(&s->pb, 1, 0); /* newpred */
2439 put_bits(&s->pb, 1, 0); /* reduced res vop */
2441 put_bits(&s->pb, 1, 0); /* scalability */
2443 ff_mpeg4_stuffing(&s->pb);
2446 if(!(s->flags & CODEC_FLAG_BITEXACT)){
2447 put_bits(&s->pb, 16, 0);
2448 put_bits(&s->pb, 16, 0x1B2); /* user_data */
2449 ff_put_string(&s->pb, LIBAVCODEC_IDENT, 0);
2453 /* write mpeg4 VOP header */
2454 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
2457 int time_div, time_mod;
2459 if(s->pict_type==FF_I_TYPE){
2460 if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
2461 if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT) //HACK, the reference sw is buggy
2462 mpeg4_encode_visual_object_header(s);
2463 if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT || picture_number==0) //HACK, the reference sw is buggy
2464 mpeg4_encode_vol_header(s, 0, 0);
2466 if(!(s->workaround_bugs & FF_BUG_MS))
2467 mpeg4_encode_gop_header(s);
2470 s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE;
2472 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->time_base.den, FRAME_RATE_BASE);
2474 put_bits(&s->pb, 16, 0); /* vop header */
2475 put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */
2476 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
2479 time_div= s->time/s->avctx->time_base.den;
2480 time_mod= s->time%s->avctx->time_base.den;
2481 time_incr= time_div - s->last_time_base;
2482 assert(time_incr >= 0);
2484 put_bits(&s->pb, 1, 1);
2486 put_bits(&s->pb, 1, 0);
2488 put_bits(&s->pb, 1, 1); /* marker */
2489 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
2490 put_bits(&s->pb, 1, 1); /* marker */
2491 put_bits(&s->pb, 1, 1); /* vop coded */
2492 if ( s->pict_type == FF_P_TYPE
2493 || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
2494 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
2496 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
2497 if(!s->progressive_sequence){
2498 put_bits(&s->pb, 1, s->current_picture_ptr->top_field_first);
2499 put_bits(&s->pb, 1, s->alternate_scan);
2501 //FIXME sprite stuff
2503 put_bits(&s->pb, 5, s->qscale);
2505 if (s->pict_type != FF_I_TYPE)
2506 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
2507 if (s->pict_type == FF_B_TYPE)
2508 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
2509 // printf("****frame %d\n", picture_number);
2512 #endif //CONFIG_ENCODERS
2516 * encoding quantized level -> quantized diff
2517 * decoding quantized diff -> quantized level
2518 * @param n block index (0-3 are luma, 4-5 are chroma)
2519 * @param dir_ptr pointer to an integer where the prediction direction will be stored
2521 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding)
2523 int a, b, c, wrap, pred, scale, ret;
2526 /* find prediction */
2528 scale = s->y_dc_scale;
2530 scale = s->c_dc_scale;
2535 wrap= s->block_wrap[n];
2536 dc_val = s->dc_val[0] + s->block_index[n];
2542 b = dc_val[ - 1 - wrap];
2543 c = dc_val[ - wrap];
2545 /* outside slice handling (we can't do that by memset as we need the dc for error resilience) */
2546 if(s->first_slice_line && n!=3){
2548 if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
2550 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
2551 if(n==0 || n==4 || n==5)
2555 if (abs(a - b) < abs(b - c)) {
2557 *dir_ptr = 1; /* top */
2560 *dir_ptr = 0; /* left */
2562 /* we assume pred is positive */
2563 pred = FASTDIV((pred + (scale >> 1)), scale);
2570 if(s->error_recognition>=3){
2572 av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
2575 if(level*scale > 2048 + scale){
2576 av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
2585 else if(!(s->workaround_bugs&FF_BUG_DC_CLIP))
2595 * @param n block index (0-3 are luma, 4-5 are chroma)
2596 * @param dir the ac prediction direction
2598 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
2602 int16_t *ac_val, *ac_val1;
2603 int8_t * const qscale_table= s->current_picture.qscale_table;
2605 /* find prediction */
2606 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2610 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
2611 /* left prediction */
2614 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
2617 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
2620 /* different qscale, we must rescale */
2622 block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
2626 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
2627 /* top prediction */
2628 ac_val -= 16 * s->block_wrap[n];
2630 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
2633 block[s->dsp.idct_permutation[i]] += ac_val[i + 8];
2636 /* different qscale, we must rescale */
2638 block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
2645 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
2649 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
2656 * encodes the dc value.
2657 * @param n block index (0-3 are luma, 4-5 are chroma)
2659 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
2662 // if(level<-255 || level>255) printf("dc overflow\n");
2666 put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]);
2669 put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]);
2673 /* find number of bits */
2683 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
2686 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
2689 /* encode remaining bits */
2692 level = (-level) ^ ((1 << size) - 1);
2693 put_bits(&s->pb, size, level);
2695 put_bits(&s->pb, 1, 1);
2700 static inline int mpeg4_get_dc_length(int level, int n){
2702 return uni_DCtab_lum_len[level + 256];
2704 return uni_DCtab_chrom_len[level + 256];
2709 * encodes a 8x8 block
2710 * @param n block index (0-3 are luma, 4-5 are chroma)
2712 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2713 uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
2715 int i, last_non_zero;
2716 #if 0 //variables for the outcommented version
2717 int code, sign, last;
2722 const int last_index = s->block_last_index[n];
2724 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2725 /* mpeg4 based DC predictor */
2726 mpeg4_encode_dc(dc_pb, intra_dc, n);
2727 if(last_index<1) return;
2730 bits_tab= uni_mpeg4_intra_rl_bits;
2731 len_tab = uni_mpeg4_intra_rl_len;
2733 if(last_index<0) return;
2736 bits_tab= uni_mpeg4_inter_rl_bits;
2737 len_tab = uni_mpeg4_inter_rl_len;
2741 last_non_zero = i - 1;
2743 for (; i < last_index; i++) {
2744 int level = block[ scan_table[i] ];
2746 int run = i - last_non_zero - 1;
2748 if((level&(~127)) == 0){
2749 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2750 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2752 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);
2757 /*if(i<=last_index)*/{
2758 int level = block[ scan_table[i] ];
2759 int run = i - last_non_zero - 1;
2761 if((level&(~127)) == 0){
2762 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2763 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2765 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);
2769 for (; i <= last_index; i++) {
2770 const int slevel = block[ scan_table[i] ];
2773 int run = i - last_non_zero - 1;
2774 last = (i == last_index);
2781 code = get_rl_index(rl, last, run, level);
2782 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2783 if (code == rl->n) {
2785 level1 = level - rl->max_level[last][run];
2788 code = get_rl_index(rl, last, run, level1);
2789 if (code == rl->n) {
2791 put_bits(ac_pb, 1, 1);
2792 if (level > MAX_LEVEL)
2794 run1 = run - rl->max_run[last][level] - 1;
2797 code = get_rl_index(rl, last, run1, level);
2798 if (code == rl->n) {
2801 put_bits(ac_pb, 1, 1);
2802 put_bits(ac_pb, 1, last);
2803 put_bits(ac_pb, 6, run);
2804 put_bits(ac_pb, 1, 1);
2805 put_sbits(ac_pb, 12, slevel);
2806 put_bits(ac_pb, 1, 1);
2809 put_bits(ac_pb, 1, 0);
2810 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2811 put_bits(ac_pb, 1, sign);
2815 put_bits(ac_pb, 1, 0);
2816 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2817 put_bits(ac_pb, 1, sign);
2820 put_bits(ac_pb, 1, sign);
2828 static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2829 uint8_t *scan_table)
2831 int i, last_non_zero;
2834 const int last_index = s->block_last_index[n];
2837 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2838 /* mpeg4 based DC predictor */
2839 len += mpeg4_get_dc_length(intra_dc, n);
2840 if(last_index<1) return len;
2843 len_tab = uni_mpeg4_intra_rl_len;
2845 if(last_index<0) return 0;
2848 len_tab = uni_mpeg4_inter_rl_len;
2852 last_non_zero = i - 1;
2853 for (; i < last_index; i++) {
2854 int level = block[ scan_table[i] ];
2856 int run = i - last_non_zero - 1;
2858 if((level&(~127)) == 0){
2859 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2860 len += len_tab[index];
2862 len += 7+2+1+6+1+12+1;
2867 /*if(i<=last_index)*/{
2868 int level = block[ scan_table[i] ];
2869 int run = i - last_non_zero - 1;
2871 if((level&(~127)) == 0){
2872 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2873 len += len_tab[index];
2875 len += 7+2+1+6+1+12+1;
2885 /***********************************************/
2888 static VLC intra_MCBPC_vlc;
2889 static VLC inter_MCBPC_vlc;
2890 static VLC cbpy_vlc;
2892 static VLC dc_lum, dc_chrom;
2893 static VLC sprite_trajectory;
2894 static VLC mb_type_b_vlc;
2895 static VLC h263_mbtype_b_vlc;
2896 static VLC cbpc_b_vlc;
2900 /* XXX: find a better solution to handle static init */
2901 void h263_decode_init_vlc(MpegEncContext *s)
2903 static int done = 0;
2908 INIT_VLC_STATIC(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 9,
2909 intra_MCBPC_bits, 1, 1,
2910 intra_MCBPC_code, 1, 1, 72);
2911 INIT_VLC_STATIC(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 28,
2912 inter_MCBPC_bits, 1, 1,
2913 inter_MCBPC_code, 1, 1, 198);
2914 INIT_VLC_STATIC(&cbpy_vlc, CBPY_VLC_BITS, 16,
2915 &cbpy_tab[0][1], 2, 1,
2916 &cbpy_tab[0][0], 2, 1, 64);
2917 INIT_VLC_STATIC(&mv_vlc, MV_VLC_BITS, 33,
2919 &mvtab[0][0], 2, 1, 538);
2920 init_rl(&rl_inter, static_rl_table_store[0]);
2921 init_rl(&rl_intra, static_rl_table_store[1]);
2922 init_rl(&rvlc_rl_inter, static_rl_table_store[3]);
2923 init_rl(&rvlc_rl_intra, static_rl_table_store[4]);
2924 init_rl(&rl_intra_aic, static_rl_table_store[2]);
2925 INIT_VLC_RL(rl_inter, 554);
2926 INIT_VLC_RL(rl_intra, 554);
2927 INIT_VLC_RL(rvlc_rl_inter, 1072);
2928 INIT_VLC_RL(rvlc_rl_intra, 1072);
2929 INIT_VLC_RL(rl_intra_aic, 554);
2930 INIT_VLC_STATIC(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
2931 &DCtab_lum[0][1], 2, 1,
2932 &DCtab_lum[0][0], 2, 1, 512);
2933 INIT_VLC_STATIC(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
2934 &DCtab_chrom[0][1], 2, 1,
2935 &DCtab_chrom[0][0], 2, 1, 512);
2936 INIT_VLC_STATIC(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
2937 &sprite_trajectory_tab[0][1], 4, 2,
2938 &sprite_trajectory_tab[0][0], 4, 2, 128);
2939 INIT_VLC_STATIC(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
2940 &mb_type_b_tab[0][1], 2, 1,
2941 &mb_type_b_tab[0][0], 2, 1, 16);
2942 INIT_VLC_STATIC(&h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15,
2943 &h263_mbtype_b_tab[0][1], 2, 1,
2944 &h263_mbtype_b_tab[0][0], 2, 1, 80);
2945 INIT_VLC_STATIC(&cbpc_b_vlc, CBPC_B_VLC_BITS, 4,
2946 &cbpc_b_tab[0][1], 2, 1,
2947 &cbpc_b_tab[0][0], 2, 1, 8);
2952 * Get the GOB height based on picture height.
2954 int ff_h263_get_gob_height(MpegEncContext *s){
2955 if (s->height <= 400)
2957 else if (s->height <= 800)
2963 int ff_h263_decode_mba(MpegEncContext *s)
2968 if(s->mb_num-1 <= ff_mba_max[i]) break;
2970 mb_pos= get_bits(&s->gb, ff_mba_length[i]);
2971 s->mb_x= mb_pos % s->mb_width;
2972 s->mb_y= mb_pos / s->mb_width;
2977 void ff_h263_encode_mba(MpegEncContext *s)
2982 if(s->mb_num-1 <= ff_mba_max[i]) break;
2984 mb_pos= s->mb_x + s->mb_width*s->mb_y;
2985 put_bits(&s->pb, ff_mba_length[i], mb_pos);
2989 * decodes the group of blocks header or slice header.
2990 * @return <0 if an error occurred
2992 static int h263_decode_gob_header(MpegEncContext *s)
2994 unsigned int val, gfid, gob_number;
2997 /* Check for GOB Start Code */
2998 val = show_bits(&s->gb, 16);
3002 /* We have a GBSC probably with GSTUFF */
3003 skip_bits(&s->gb, 16); /* Drop the zeros */
3004 left= s->gb.size_in_bits - get_bits_count(&s->gb);
3005 //MN: we must check the bits left or we might end in a infinite loop (or segfault)
3006 for(;left>13; left--){
3007 if(get_bits1(&s->gb)) break; /* Seek the '1' bit */
3012 if(s->h263_slice_structured){
3013 if(get_bits1(&s->gb)==0)
3016 ff_h263_decode_mba(s);
3018 if(s->mb_num > 1583)
3019 if(get_bits1(&s->gb)==0)
3022 s->qscale = get_bits(&s->gb, 5); /* SQUANT */
3023 if(get_bits1(&s->gb)==0)
3025 gfid = get_bits(&s->gb, 2); /* GFID */
3027 gob_number = get_bits(&s->gb, 5); /* GN */
3029 s->mb_y= s->gob_index* gob_number;
3030 gfid = get_bits(&s->gb, 2); /* GFID */
3031 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
3034 if(s->mb_y >= s->mb_height)
3043 static inline void memsetw(short *tab, int val, int n)
3052 void ff_mpeg4_init_partitions(MpegEncContext *s)
3054 uint8_t *start= put_bits_ptr(&s->pb);
3055 uint8_t *end= s->pb.buf_end;
3056 int size= end - start;
3057 int pb_size = (((intptr_t)start + size/3)&(~3)) - (intptr_t)start;
3058 int tex_size= (size - 2*pb_size)&(~3);
3060 set_put_bits_buffer_size(&s->pb, pb_size);
3061 init_put_bits(&s->tex_pb, start + pb_size , tex_size);
3062 init_put_bits(&s->pb2 , start + pb_size + tex_size, pb_size);
3065 void ff_mpeg4_merge_partitions(MpegEncContext *s)
3067 const int pb2_len = put_bits_count(&s->pb2 );
3068 const int tex_pb_len= put_bits_count(&s->tex_pb);
3069 const int bits= put_bits_count(&s->pb);
3071 if(s->pict_type==FF_I_TYPE){
3072 put_bits(&s->pb, 19, DC_MARKER);
3073 s->misc_bits+=19 + pb2_len + bits - s->last_bits;
3074 s->i_tex_bits+= tex_pb_len;
3076 put_bits(&s->pb, 17, MOTION_MARKER);
3077 s->misc_bits+=17 + pb2_len;
3078 s->mv_bits+= bits - s->last_bits;
3079 s->p_tex_bits+= tex_pb_len;
3082 flush_put_bits(&s->pb2);
3083 flush_put_bits(&s->tex_pb);
3085 set_put_bits_buffer_size(&s->pb, s->pb2.buf_end - s->pb.buf);
3086 ff_copy_bits(&s->pb, s->pb2.buf , pb2_len);
3087 ff_copy_bits(&s->pb, s->tex_pb.buf, tex_pb_len);
3088 s->last_bits= put_bits_count(&s->pb);
3091 #endif //CONFIG_ENCODERS
3093 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
3094 switch(s->pict_type){
3099 return s->f_code+15;
3101 return FFMAX3(s->f_code, s->b_code, 2) + 15;
3109 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
3111 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
3113 put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0);
3114 put_bits(&s->pb, 1, 1);
3116 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
3117 put_bits(&s->pb, s->quant_precision, s->qscale);
3118 put_bits(&s->pb, 1, 0); /* no HEC */
3121 #endif //CONFIG_ENCODERS
3124 * check if the next stuff is a resync marker or the end.
3127 static inline int mpeg4_is_resync(MpegEncContext *s){
3128 int bits_count= get_bits_count(&s->gb);
3129 int v= show_bits(&s->gb, 16);
3131 if(s->workaround_bugs&FF_BUG_NO_PADDING){
3136 if(s->pict_type==FF_B_TYPE || (v>>(8-s->pict_type)!=1) || s->partitioned_frame)
3138 skip_bits(&s->gb, 8+s->pict_type);
3139 bits_count+= 8+s->pict_type;
3140 v= show_bits(&s->gb, 16);
3143 if(bits_count + 8 >= s->gb.size_in_bits){
3145 v|= 0x7F >> (7-(bits_count&7));
3150 if(v == ff_mpeg4_resync_prefix[bits_count&7]){
3152 GetBitContext gb= s->gb;
3154 skip_bits(&s->gb, 1);
3155 align_get_bits(&s->gb);
3157 for(len=0; len<32; len++){
3158 if(get_bits1(&s->gb)) break;
3163 if(len>=ff_mpeg4_get_video_packet_prefix_length(s))
3171 * decodes the next video packet.
3172 * @return <0 if something went wrong
3174 static int mpeg4_decode_video_packet_header(MpegEncContext *s)
3176 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
3177 int header_extension=0, mb_num, len;
3179 /* is there enough space left for a video packet + header */
3180 if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1;
3182 for(len=0; len<32; len++){
3183 if(get_bits1(&s->gb)) break;
3186 if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
3187 av_log(s->avctx, AV_LOG_ERROR, "marker does not match f_code\n");
3191 if(s->shape != RECT_SHAPE){
3192 header_extension= get_bits1(&s->gb);
3193 //FIXME more stuff here
3196 mb_num= get_bits(&s->gb, mb_num_bits);
3197 if(mb_num>=s->mb_num){
3198 av_log(s->avctx, AV_LOG_ERROR, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);
3201 if(s->pict_type == FF_B_TYPE){
3202 while(s->next_picture.mbskip_table[ s->mb_index2xy[ mb_num ] ]) mb_num++;
3203 if(mb_num >= s->mb_num) return -1; // slice contains just skipped MBs which where already decoded
3206 s->mb_x= mb_num % s->mb_width;
3207 s->mb_y= mb_num / s->mb_width;
3209 if(s->shape != BIN_ONLY_SHAPE){
3210 int qscale= get_bits(&s->gb, s->quant_precision);
3212 s->chroma_qscale=s->qscale= qscale;
3215 if(s->shape == RECT_SHAPE){
3216 header_extension= get_bits1(&s->gb);
3218 if(header_extension){
3222 while (get_bits1(&s->gb) != 0)
3225 check_marker(&s->gb, "before time_increment in video packed header");
3226 time_increment= get_bits(&s->gb, s->time_increment_bits);
3227 check_marker(&s->gb, "before vop_coding_type in video packed header");
3229 skip_bits(&s->gb, 2); /* vop coding type */
3230 //FIXME not rect stuff here
3232 if(s->shape != BIN_ONLY_SHAPE){
3233 skip_bits(&s->gb, 3); /* intra dc vlc threshold */
3234 //FIXME don't just ignore everything
3235 if(s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3236 mpeg4_decode_sprite_trajectory(s, &s->gb);
3237 av_log(s->avctx, AV_LOG_ERROR, "untested\n");
3240 //FIXME reduced res stuff here
3242 if (s->pict_type != FF_I_TYPE) {
3243 int f_code = get_bits(&s->gb, 3); /* fcode_for */
3245 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (f_code=0)\n");
3248 if (s->pict_type == FF_B_TYPE) {
3249 int b_code = get_bits(&s->gb, 3);
3251 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (b_code=0)\n");
3256 //FIXME new-pred stuff
3258 //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));
3263 void ff_mpeg4_clean_buffers(MpegEncContext *s)
3265 int c_wrap, c_xy, l_wrap, l_xy;
3267 l_wrap= s->b8_stride;
3268 l_xy= (2*s->mb_y-1)*l_wrap + s->mb_x*2 - 1;
3269 c_wrap= s->mb_stride;
3270 c_xy= (s->mb_y-1)*c_wrap + s->mb_x - 1;
3274 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
3275 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
3276 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
3280 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t));
3281 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
3282 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
3285 // we can't clear the MVs as they might be needed by a b frame
3286 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t));
3287 // memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
3288 s->last_mv[0][0][0]=
3289 s->last_mv[0][0][1]=
3290 s->last_mv[1][0][0]=
3291 s->last_mv[1][0][1]= 0;
3295 * finds the next resync_marker
3296 * @param p pointer to buffer to scan
3297 * @param end pointer to the end of the buffer
3298 * @return pointer to the next resync_marker, or \p end if none was found
3300 const uint8_t *ff_h263_find_resync_marker(const uint8_t *restrict p, const uint8_t * restrict end)
3308 if (!p[-1] && p[1]) return p - 1;
3309 else if(!p[ 1] && p[2]) return p;
3316 * decodes the group of blocks / video packet header.
3317 * @return bit position of the resync_marker, or <0 if none was found
3319 int ff_h263_resync(MpegEncContext *s){
3322 if(s->codec_id==CODEC_ID_MPEG4){
3324 align_get_bits(&s->gb);
3327 if(show_bits(&s->gb, 16)==0){
3328 pos= get_bits_count(&s->gb);
3329 if(s->codec_id==CODEC_ID_MPEG4)
3330 ret= mpeg4_decode_video_packet_header(s);
3332 ret= h263_decode_gob_header(s);
3336 //OK, it's not where it is supposed to be ...
3337 s->gb= s->last_resync_gb;
3338 align_get_bits(&s->gb);
3339 left= s->gb.size_in_bits - get_bits_count(&s->gb);
3341 for(;left>16+1+5+5; left-=8){
3342 if(show_bits(&s->gb, 16)==0){
3343 GetBitContext bak= s->gb;
3345 pos= get_bits_count(&s->gb);
3346 if(s->codec_id==CODEC_ID_MPEG4)
3347 ret= mpeg4_decode_video_packet_header(s);
3349 ret= h263_decode_gob_header(s);
3355 skip_bits(&s->gb, 8);
3362 * gets the average motion vector for a GMC MB.
3363 * @param n either 0 for the x component or 1 for y
3364 * @returns the average MV for a GMC MB
3366 static inline int get_amv(MpegEncContext *s, int n){
3367 int x, y, mb_v, sum, dx, dy, shift;
3368 int len = 1 << (s->f_code + 4);
3369 const int a= s->sprite_warping_accuracy;
3371 if(s->workaround_bugs & FF_BUG_AMV)
3372 len >>= s->quarter_sample;
3374 if(s->real_sprite_warping_points==1){
3375 if(s->divx_version==500 && s->divx_build==413)
3376 sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample));
3378 sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a);
3380 dx= s->sprite_delta[n][0];
3381 dy= s->sprite_delta[n][1];
3382 shift= s->sprite_shift[0];
3383 if(n) dy -= 1<<(shift + a + 1);
3384 else dx -= 1<<(shift + a + 1);
3385 mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16;
3388 for(y=0; y<16; y++){
3392 //XXX FIXME optimize
3393 for(x=0; x<16; x++){
3398 sum= RSHIFT(sum, a+8-s->quarter_sample);
3401 if (sum < -len) sum= -len;
3402 else if (sum >= len) sum= len-1;
3408 * decodes first partition.
3409 * @return number of MBs decoded or <0 if an error occurred
3411 static int mpeg4_decode_partition_a(MpegEncContext *s){
3413 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3415 /* decode first partition */
3417 s->first_slice_line=1;
3418 for(; s->mb_y<s->mb_height; s->mb_y++){
3419 ff_init_block_index(s);
3420 for(; s->mb_x<s->mb_width; s->mb_x++){
3421 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3426 ff_update_block_index(s);
3427 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3428 s->first_slice_line=0;
3430 if(s->pict_type==FF_I_TYPE){
3434 if(show_bits_long(&s->gb, 19)==DC_MARKER){
3438 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
3440 av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
3445 s->cbp_table[xy]= cbpc & 3;
3446 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3450 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3452 s->current_picture.qscale_table[xy]= s->qscale;
3454 s->mbintra_table[xy]= 1;
3457 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3459 av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3463 if(dc_pred_dir) dir|=1;
3465 s->pred_dir_table[xy]= dir;
3466 }else{ /* P/S_TYPE */
3467 int mx, my, pred_x, pred_y, bits;
3468 int16_t * const mot_val= s->current_picture.motion_val[0][s->block_index[0]];
3469 const int stride= s->b8_stride*2;
3472 bits= show_bits(&s->gb, 17);
3473 if(bits==MOTION_MARKER){
3479 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3480 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
3484 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3487 mot_val[0 ]= mot_val[2 ]=
3488 mot_val[0+stride]= mot_val[2+stride]= mx;
3489 mot_val[1 ]= mot_val[3 ]=
3490 mot_val[1+stride]= mot_val[3+stride]= my;
3492 if(s->mbintra_table[xy])
3493 ff_clean_intra_table_entries(s);
3497 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3499 av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
3505 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
3507 s->mb_intra = ((cbpc & 4) != 0);
3510 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3511 s->mbintra_table[xy]= 1;
3512 mot_val[0 ]= mot_val[2 ]=
3513 mot_val[0+stride]= mot_val[2+stride]= 0;
3514 mot_val[1 ]= mot_val[3 ]=
3515 mot_val[1+stride]= mot_val[3+stride]= 0;
3517 if(s->mbintra_table[xy])
3518 ff_clean_intra_table_entries(s);
3520 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
3521 s->mcsel= get_bits1(&s->gb);
3524 if ((cbpc & 16) == 0) {
3525 /* 16x16 motion prediction */
3527 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3529 mx = h263_decode_motion(s, pred_x, s->f_code);
3533 my = h263_decode_motion(s, pred_y, s->f_code);
3536 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3540 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
3543 mot_val[0 ]= mot_val[2 ] =
3544 mot_val[0+stride]= mot_val[2+stride]= mx;
3545 mot_val[1 ]= mot_val[3 ]=
3546 mot_val[1+stride]= mot_val[3+stride]= my;
3549 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3551 int16_t *mot_val= h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3552 mx = h263_decode_motion(s, pred_x, s->f_code);
3556 my = h263_decode_motion(s, pred_y, s->f_code);
3573 * decode second partition.
3574 * @return <0 if an error occurred
3576 static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
3578 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3580 s->mb_x= s->resync_mb_x;
3581 s->first_slice_line=1;
3582 for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
3583 ff_init_block_index(s);
3584 for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
3585 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3588 ff_update_block_index(s);
3589 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3590 s->first_slice_line=0;
3592 if(s->pict_type==FF_I_TYPE){
3593 int ac_pred= get_bits1(&s->gb);
3594 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3596 av_log(s->avctx, AV_LOG_ERROR, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3600 s->cbp_table[xy]|= cbpy<<2;
3601 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3602 }else{ /* P || S_TYPE */
3603 if(IS_INTRA(s->current_picture.mb_type[xy])){
3605 int ac_pred = get_bits1(&s->gb);
3606 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3609 av_log(s->avctx, AV_LOG_ERROR, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3613 if(s->cbp_table[xy] & 8) {
3614 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3616 s->current_picture.qscale_table[xy]= s->qscale;
3620 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3622 av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3626 if(dc_pred_dir) dir|=1;
3628 s->cbp_table[xy]&= 3; //remove dquant
3629 s->cbp_table[xy]|= cbpy<<2;
3630 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3631 s->pred_dir_table[xy]= dir;
3632 }else if(IS_SKIP(s->current_picture.mb_type[xy])){
3633 s->current_picture.qscale_table[xy]= s->qscale;
3634 s->cbp_table[xy]= 0;
3636 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3639 av_log(s->avctx, AV_LOG_ERROR, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3643 if(s->cbp_table[xy] & 8) {
3644 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3646 s->current_picture.qscale_table[xy]= s->qscale;
3648 s->cbp_table[xy]&= 3; //remove dquant
3649 s->cbp_table[xy]|= (cbpy^0xf)<<2;
3653 if(mb_num >= mb_count) return 0;
3660 * decodes the first & second partition
3661 * @return <0 if error (and sets error type in the error_status_table)
3663 int ff_mpeg4_decode_partitions(MpegEncContext *s)
3666 const int part_a_error= s->pict_type==FF_I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR;
3667 const int part_a_end = s->pict_type==FF_I_TYPE ? (DC_END |MV_END) : MV_END;
3669 mb_num= mpeg4_decode_partition_a(s);
3671 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3675 if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
3676 av_log(s->avctx, AV_LOG_ERROR, "slice below monitor ...\n");
3677 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3681 s->mb_num_left= mb_num;
3683 if(s->pict_type==FF_I_TYPE){
3684 while(show_bits(&s->gb, 9) == 1)
3685 skip_bits(&s->gb, 9);
3686 if(get_bits_long(&s->gb, 19)!=DC_MARKER){
3687 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
3691 while(show_bits(&s->gb, 10) == 1)
3692 skip_bits(&s->gb, 10);
3693 if(get_bits(&s->gb, 17)!=MOTION_MARKER){
3694 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
3698 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end);
3700 if( mpeg4_decode_partition_b(s, mb_num) < 0){
3701 if(s->pict_type==FF_P_TYPE)
3702 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR);
3705 if(s->pict_type==FF_P_TYPE)
3706 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END);
3713 * decode partition C of one MB.
3714 * @return <0 if an error occurred
3716 static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64])
3719 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3721 mb_type= s->current_picture.mb_type[xy];
3722 cbp = s->cbp_table[xy];
3724 s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold;
3726 if(s->current_picture.qscale_table[xy] != s->qscale){
3727 ff_set_qscale(s, s->current_picture.qscale_table[xy] );
3730 if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
3733 s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0];
3734 s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1];
3736 s->mb_intra = IS_INTRA(mb_type);
3738 if (IS_SKIP(mb_type)) {
3741 s->block_last_index[i] = -1;
3742 s->mv_dir = MV_DIR_FORWARD;
3743 s->mv_type = MV_TYPE_16X16;
3744 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3751 }else if(s->mb_intra){
3752 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3753 }else if(!s->mb_intra){
3754 // s->mcsel= 0; //FIXME do we need to init that
3756 s->mv_dir = MV_DIR_FORWARD;
3757 if (IS_8X8(mb_type)) {
3758 s->mv_type = MV_TYPE_8X8;
3760 s->mv_type = MV_TYPE_16X16;
3763 } else { /* I-Frame */
3765 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3768 if (!IS_SKIP(mb_type)) {
3770 s->dsp.clear_blocks(s->block[0]);
3771 /* decode each block */
3772 for (i = 0; i < 6; i++) {
3773 if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){
3774 av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra);
3781 /* per-MB end of slice check */
3783 if(--s->mb_num_left <= 0){
3784 //printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb));
3785 if(mpeg4_is_resync(s))
3790 if(mpeg4_is_resync(s)){
3791 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
3792 if(s->cbp_table[xy+delta])
3800 * read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :)
3802 static void preview_obmc(MpegEncContext *s){
3803 GetBitContext gb= s->gb;
3805 int cbpc, i, pred_x, pred_y, mx, my;
3807 const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
3808 const int stride= s->b8_stride*2;
3811 s->block_index[i]+= 2;
3813 s->block_index[i]+= 1;
3816 assert(s->pict_type == FF_P_TYPE);
3819 if (get_bits1(&s->gb)) {
3821 mot_val = s->current_picture.motion_val[0][ s->block_index[0] ];
3822 mot_val[0 ]= mot_val[2 ]=
3823 mot_val[0+stride]= mot_val[2+stride]= 0;
3824 mot_val[1 ]= mot_val[3 ]=
3825 mot_val[1+stride]= mot_val[3+stride]= 0;
3827 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3830 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3834 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3836 get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3838 if(s->modified_quant){
3839 if(get_bits1(&s->gb)) skip_bits(&s->gb, 1);
3840 else skip_bits(&s->gb, 5);
3842 skip_bits(&s->gb, 2);
3845 if ((cbpc & 16) == 0) {
3846 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3847 /* 16x16 motion prediction */
3848 mot_val= h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3850 mx = h263p_decode_umotion(s, pred_x);
3852 mx = h263_decode_motion(s, pred_x, 1);
3855 my = h263p_decode_umotion(s, pred_y);
3857 my = h263_decode_motion(s, pred_y, 1);
3859 mot_val[0 ]= mot_val[2 ]=
3860 mot_val[0+stride]= mot_val[2+stride]= mx;
3861 mot_val[1 ]= mot_val[3 ]=
3862 mot_val[1+stride]= mot_val[3+stride]= my;
3864 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3866 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3868 mx = h263p_decode_umotion(s, pred_x);
3870 mx = h263_decode_motion(s, pred_x, 1);
3873 my = h263p_decode_umotion(s, pred_y);
3875 my = h263_decode_motion(s, pred_y, 1);
3876 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3877 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3886 s->block_index[i]-= 2;
3888 s->block_index[i]-= 1;
3894 static void h263_decode_dquant(MpegEncContext *s){
3895 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3897 if(s->modified_quant){
3898 if(get_bits1(&s->gb))
3899 s->qscale= modified_quant_tab[get_bits1(&s->gb)][ s->qscale ];
3901 s->qscale= get_bits(&s->gb, 5);
3903 s->qscale += quant_tab[get_bits(&s->gb, 2)];
3904 ff_set_qscale(s, s->qscale);
3907 static int h263_skip_b_part(MpegEncContext *s, int cbp)
3909 DECLARE_ALIGNED(16, DCTELEM, dblock[64]);
3912 /* we have to set s->mb_intra to zero to decode B-part of PB-frame correctly
3913 * but real value should be restored in order to be used later (in OBMC condition)
3917 for (i = 0; i < 6; i++) {
3918 if (h263_decode_block(s, dblock, i, cbp&32) < 0)
3926 static int h263_get_modb(GetBitContext *gb, int pb_frame, int *cbpb)
3930 if (pb_frame < 3) { // h.263 Annex G and i263 PB-frame
3932 if (pb_frame == 2 && c)
3933 mv = !get_bits1(gb);
3934 } else { // h.263 Annex M improved PB-frame
3935 mv = get_unary(gb, 0, 4) + 1;
3940 *cbpb = get_bits(gb, 6);
3944 int ff_h263_decode_mb(MpegEncContext *s,
3945 DCTELEM block[6][64])
3947 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
3949 const int xy= s->mb_x + s->mb_y * s->mb_stride;
3950 int cbpb = 0, pb_mv_count = 0;
3952 assert(!s->h263_pred);
3954 if (s->pict_type == FF_P_TYPE) {
3956 if (get_bits1(&s->gb)) {
3960 s->block_last_index[i] = -1;
3961 s->mv_dir = MV_DIR_FORWARD;
3962 s->mv_type = MV_TYPE_16X16;
3963 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3966 s->mb_skipped = !(s->obmc | s->loop_filter);
3969 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3970 //fprintf(stderr, "\tCBPC: %d", cbpc);
3972 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
3977 s->dsp.clear_blocks(s->block[0]);
3980 s->mb_intra = ((cbpc & 4) != 0);
3981 if (s->mb_intra) goto intra;
3983 if(s->pb_frame && get_bits1(&s->gb))
3984 pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb);
3985 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3987 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
3990 cbp = (cbpc & 3) | (cbpy << 2);
3992 h263_decode_dquant(s);
3995 s->mv_dir = MV_DIR_FORWARD;
3996 if ((cbpc & 16) == 0) {
3997 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3998 /* 16x16 motion prediction */
3999 s->mv_type = MV_TYPE_16X16;
4000 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4002 mx = h263p_decode_umotion(s, pred_x);
4004 mx = h263_decode_motion(s, pred_x, 1);
4010 my = h263p_decode_umotion(s, pred_y);
4012 my = h263_decode_motion(s, pred_y, 1);
4016 s->mv[0][0][0] = mx;
4017 s->mv[0][0][1] = my;
4019 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
4020 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
4022 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
4023 s->mv_type = MV_TYPE_8X8;
4025 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
4027 mx = h263p_decode_umotion(s, pred_x);
4029 mx = h263_decode_motion(s, pred_x, 1);
4034 my = h263p_decode_umotion(s, pred_y);
4036 my = h263_decode_motion(s, pred_y, 1);
4039 s->mv[0][i][0] = mx;
4040 s->mv[0][i][1] = my;
4041 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
4042 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
4047 } else if(s->pict_type==FF_B_TYPE) {
4049 const int stride= s->b8_stride;
4050 int16_t *mot_val0 = s->current_picture.motion_val[0][ 2*(s->mb_x + s->mb_y*stride) ];
4051 int16_t *mot_val1 = s->current_picture.motion_val[1][ 2*(s->mb_x + s->mb_y*stride) ];
4052 // const int mv_xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
4055 mot_val0[0 ]= mot_val0[2 ]= mot_val0[0+2*stride]= mot_val0[2+2*stride]=
4056 mot_val0[1 ]= mot_val0[3 ]= mot_val0[1+2*stride]= mot_val0[3+2*stride]=
4057 mot_val1[0 ]= mot_val1[2 ]= mot_val1[0+2*stride]= mot_val1[2+2*stride]=
4058 mot_val1[1 ]= mot_val1[3 ]= mot_val1[1+2*stride]= mot_val1[3+2*stride]= 0;
4061 mb_type= get_vlc2(&s->gb, h263_mbtype_b_vlc.table, H263_MBTYPE_B_VLC_BITS, 2);
4063 av_log(s->avctx, AV_LOG_ERROR, "b mb_type damaged at %d %d\n", s->mb_x, s->mb_y);
4067 mb_type= h263_mb_type_b_map[ mb_type ];
4070 s->mb_intra = IS_INTRA(mb_type);
4071 if(HAS_CBP(mb_type)){
4072 s->dsp.clear_blocks(s->block[0]);
4073 cbpc = get_vlc2(&s->gb, cbpc_b_vlc.table, CBPC_B_VLC_BITS, 1);
4075 dquant = IS_QUANT(mb_type);
4079 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4082 av_log(s->avctx, AV_LOG_ERROR, "b cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4086 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
4089 cbp = (cbpc & 3) | (cbpy << 2);
4093 assert(!s->mb_intra);
4095 if(IS_QUANT(mb_type)){
4096 h263_decode_dquant(s);
4099 if(IS_DIRECT(mb_type)){
4100 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4101 mb_type |= ff_mpeg4_set_direct_mv(s, 0, 0);
4104 s->mv_type= MV_TYPE_16X16;
4107 if(USES_LIST(mb_type, 0)){
4108 int16_t *mot_val= h263_pred_motion(s, 0, 0, &mx, &my);
4109 s->mv_dir = MV_DIR_FORWARD;
4111 mx = h263_decode_motion(s, mx, 1);
4112 my = h263_decode_motion(s, my, 1);
4114 s->mv[0][0][0] = mx;
4115 s->mv[0][0][1] = my;
4116 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
4117 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
4120 if(USES_LIST(mb_type, 1)){
4121 int16_t *mot_val= h263_pred_motion(s, 0, 1, &mx, &my);
4122 s->mv_dir |= MV_DIR_BACKWARD;
4124 mx = h263_decode_motion(s, mx, 1);
4125 my = h263_decode_motion(s, my, 1);
4127 s->mv[1][0][0] = mx;
4128 s->mv[1][0][1] = my;
4129 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
4130 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
4134 s->current_picture.mb_type[xy]= mb_type;
4135 } else { /* I-Frame */
4137 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
4139 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4144 s->dsp.clear_blocks(s->block[0]);
4149 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
4151 s->ac_pred = get_bits1(&s->gb);
4153 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
4155 s->h263_aic_dir = get_bits1(&s->gb);
4160 if(s->pb_frame && get_bits1(&s->gb))
4161 pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb);
4162 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4164 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4167 cbp = (cbpc & 3) | (cbpy << 2);
4169 h263_decode_dquant(s);
4172 pb_mv_count += !!s->pb_frame;
4175 while(pb_mv_count--){
4176 h263_decode_motion(s, 0, 1);
4177 h263_decode_motion(s, 0, 1);
4180 /* decode each block */
4181 for (i = 0; i < 6; i++) {
4182 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
4187 if(s->pb_frame && h263_skip_b_part(s, cbpb) < 0)
4189 if(s->obmc && !s->mb_intra){
4190 if(s->pict_type == FF_P_TYPE && s->mb_x+1<s->mb_width && s->mb_num_left != 1)
4195 /* per-MB end of slice check */
4197 int v= show_bits(&s->gb, 16);
4199 if(get_bits_count(&s->gb) + 16 > s->gb.size_in_bits){
4200 v>>= get_bits_count(&s->gb) + 16 - s->gb.size_in_bits;
4210 int ff_mpeg4_decode_mb(MpegEncContext *s,
4211 DCTELEM block[6][64])
4213 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
4215 static int8_t quant_tab[4] = { -1, -2, 1, 2 };
4216 const int xy= s->mb_x + s->mb_y * s->mb_stride;
4218 assert(s->h263_pred);
4220 if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
4222 if (get_bits1(&s->gb)) {
4226 s->block_last_index[i] = -1;
4227 s->mv_dir = MV_DIR_FORWARD;
4228 s->mv_type = MV_TYPE_16X16;
4229 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
4230 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
4232 s->mv[0][0][0]= get_amv(s, 0);
4233 s->mv[0][0][1]= get_amv(s, 1);
4237 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4245 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
4246 //fprintf(stderr, "\tCBPC: %d", cbpc);
4248 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4253 s->dsp.clear_blocks(s->block[0]);
4255 s->mb_intra = ((cbpc & 4) != 0);
4256 if (s->mb_intra) goto intra;
4258 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
4259 s->mcsel= get_bits1(&s->gb);
4261 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1) ^ 0x0F;
4263 cbp = (cbpc & 3) | (cbpy << 2);
4265 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
4267 if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE)))
4268 s->interlaced_dct= get_bits1(&s->gb);
4270 s->mv_dir = MV_DIR_FORWARD;
4271 if ((cbpc & 16) == 0) {
4273 s->current_picture.mb_type[xy]= MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
4274 /* 16x16 global motion prediction */
4275 s->mv_type = MV_TYPE_16X16;
4278 s->mv[0][0][0] = mx;
4279 s->mv[0][0][1] = my;
4280 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
4281 s->current_picture.mb_type[xy]= MB_TYPE_16x8 | MB_TYPE_L0 | MB_TYPE_INTERLACED;
4282 /* 16x8 field motion prediction */
4283 s->mv_type= MV_TYPE_FIELD;
4285 s->field_select[0][0]= get_bits1(&s->gb);
4286 s->field_select[0][1]= get_bits1(&s->gb);
4288 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4291 mx = h263_decode_motion(s, pred_x, s->f_code);
4295 my = h263_decode_motion(s, pred_y/2, s->f_code);
4299 s->mv[0][i][0] = mx;
4300 s->mv[0][i][1] = my;
4303 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
4304 /* 16x16 motion prediction */
4305 s->mv_type = MV_TYPE_16X16;
4306 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4307 mx = h263_decode_motion(s, pred_x, s->f_code);
4312 my = h263_decode_motion(s, pred_y, s->f_code);
4316 s->mv[0][0][0] = mx;
4317 s->mv[0][0][1] = my;
4320 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
4321 s->mv_type = MV_TYPE_8X8;
4323 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
4324 mx = h263_decode_motion(s, pred_x, s->f_code);
4328 my = h263_decode_motion(s, pred_y, s->f_code);
4331 s->mv[0][i][0] = mx;
4332 s->mv[0][i][1] = my;
4337 } else if(s->pict_type==FF_B_TYPE) {
4338 int modb1; // first bit of modb
4339 int modb2; // second bit of modb
4342 s->mb_intra = 0; //B-frames never contain intra blocks
4343 s->mcsel=0; // ... true gmc blocks
4347 s->last_mv[i][0][0]=
4348 s->last_mv[i][0][1]=
4349 s->last_mv[i][1][0]=
4350 s->last_mv[i][1][1]= 0;
4354 /* if we skipped it in the future P Frame than skip it now too */
4355 s->mb_skipped= s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]; // Note, skiptab=0 if last was GMC
4360 s->block_last_index[i] = -1;
4362 s->mv_dir = MV_DIR_FORWARD;
4363 s->mv_type = MV_TYPE_16X16;
4368 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4372 modb1= get_bits1(&s->gb);
4374 mb_type= MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1; //like MB_TYPE_B_DIRECT but no vectors coded
4377 modb2= get_bits1(&s->gb);
4378 mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
4380 av_log(s->avctx, AV_LOG_ERROR, "illegal MB_type\n");
4383 mb_type= mb_type_b_map[ mb_type ];
4386 s->dsp.clear_blocks(s->block[0]);
4387 cbp= get_bits(&s->gb, 6);
4390 if ((!IS_DIRECT(mb_type)) && cbp) {
4391 if(get_bits1(&s->gb)){
4392 ff_set_qscale(s, s->qscale + get_bits1(&s->gb)*4 - 2);
4396 if(!s->progressive_sequence){
4398 s->interlaced_dct= get_bits1(&s->gb);
4400 if(!IS_DIRECT(mb_type) && get_bits1(&s->gb)){
4401 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
4402 mb_type &= ~MB_TYPE_16x16;
4404 if(USES_LIST(mb_type, 0)){
4405 s->field_select[0][0]= get_bits1(&s->gb);
4406 s->field_select[0][1]= get_bits1(&s->gb);
4408 if(USES_LIST(mb_type, 1)){
4409 s->field_select[1][0]= get_bits1(&s->gb);
4410 s->field_select[1][1]= get_bits1(&s->gb);
4416 if((mb_type & (MB_TYPE_DIRECT2|MB_TYPE_INTERLACED)) == 0){
4417 s->mv_type= MV_TYPE_16X16;
4419 if(USES_LIST(mb_type, 0)){
4420 s->mv_dir = MV_DIR_FORWARD;
4422 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
4423 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
4424 s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
4425 s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
4428 if(USES_LIST(mb_type, 1)){
4429 s->mv_dir |= MV_DIR_BACKWARD;
4431 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
4432 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
4433 s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
4434 s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
4436 }else if(!IS_DIRECT(mb_type)){
4437 s->mv_type= MV_TYPE_FIELD;
4439 if(USES_LIST(mb_type, 0)){
4440 s->mv_dir = MV_DIR_FORWARD;
4443 mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code);
4444 my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
4445 s->last_mv[0][i][0]= s->mv[0][i][0] = mx;
4446 s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
4450 if(USES_LIST(mb_type, 1)){
4451 s->mv_dir |= MV_DIR_BACKWARD;
4454 mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code);
4455 my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
4456 s->last_mv[1][i][0]= s->mv[1][i][0] = mx;
4457 s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
4463 if(IS_DIRECT(mb_type)){
4464 if(IS_SKIP(mb_type))
4467 mx = h263_decode_motion(s, 0, 1);
4468 my = h263_decode_motion(s, 0, 1);
4471 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4472 mb_type |= ff_mpeg4_set_direct_mv(s, mx, my);
4474 s->current_picture.mb_type[xy]= mb_type;
4475 } else { /* I-Frame */
4477 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
4479 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4487 s->ac_pred = get_bits1(&s->gb);
4489 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
4491 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
4493 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4495 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4498 cbp = (cbpc & 3) | (cbpy << 2);
4500 s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold;
4503 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
4506 if(!s->progressive_sequence)
4507 s->interlaced_dct= get_bits1(&s->gb);
4509 s->dsp.clear_blocks(s->block[0]);
4510 /* decode each block */
4511 for (i = 0; i < 6; i++) {
4512 if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0)
4519 /* decode each block */
4520 for (i = 0; i < 6; i++) {
4521 if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0)
4527 /* per-MB end of slice check */
4528 if(s->codec_id==CODEC_ID_MPEG4){
4529 if(mpeg4_is_resync(s)){
4530 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
4531 if(s->pict_type==FF_B_TYPE && s->next_picture.mbskip_table[xy + delta])
4540 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
4542 int code, val, sign, shift, l;
4543 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
4550 sign = get_bits1(&s->gb);
4554 val = (val - 1) << shift;
4555 val |= get_bits(&s->gb, shift);
4562 /* modulo decoding */
4563 if (!s->h263_long_vectors) {
4564 l = INT_BIT - 5 - f_code;
4567 /* horrible h263 long vector mode */
4568 if (pred < -31 && val < -63)
4570 if (pred > 32 && val > 63)
4577 /* Decodes RVLC of H.263+ UMV */
4578 static int h263p_decode_umotion(MpegEncContext * s, int pred)
4582 if (get_bits1(&s->gb)) /* Motion difference = 0 */
4585 code = 2 + get_bits1(&s->gb);
4587 while (get_bits1(&s->gb))
4590 code += get_bits1(&s->gb);
4595 code = (sign) ? (pred - code) : (pred + code);
4597 av_log( s->avctx, AV_LOG_DEBUG,"H.263+ UMV Motion = %d\n", code);
4603 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
4606 int code, level, i, j, last, run;
4607 RLTable *rl = &rl_inter;
4608 const uint8_t *scan_table;
4609 GetBitContext gb= s->gb;
4611 scan_table = s->intra_scantable.permutated;
4612 if (s->h263_aic && s->mb_intra) {
4616 if (s->h263_aic_dir)
4617 scan_table = s->intra_v_scantable.permutated; /* left */
4619 scan_table = s->intra_h_scantable.permutated; /* top */
4621 } else if (s->mb_intra) {
4623 if(s->codec_id == CODEC_ID_RV10){
4624 #if CONFIG_RV10_DECODER
4625 if (s->rv10_version == 3 && s->pict_type == FF_I_TYPE) {
4626 int component, diff;
4627 component = (n <= 3 ? 0 : n - 4 + 1);
4628 level = s->last_dc[component];
4629 if (s->rv10_first_dc_coded[component]) {
4630 diff = rv_decode_dc(s, n);
4634 level = level & 0xff; /* handle wrap round */
4635 s->last_dc[component] = level;
4637 s->rv10_first_dc_coded[component] = 1;
4640 level = get_bits(&s->gb, 8);
4646 level = get_bits(&s->gb, 8);
4647 if((level&0x7F) == 0){
4648 av_log(s->avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y);
4649 if(s->error_recognition >= FF_ER_COMPLIANT)
4661 if (s->mb_intra && s->h263_aic)
4663 s->block_last_index[n] = i - 1;
4668 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
4670 av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
4673 if (code == rl->n) {
4675 if (s->h263_flv > 1) {
4676 int is11 = get_bits1(&s->gb);
4677 last = get_bits1(&s->gb);
4678 run = get_bits(&s->gb, 6);
4680 level = get_sbits(&s->gb, 11);
4682 level = get_sbits(&s->gb, 7);
4685 last = get_bits1(&s->gb);
4686 run = get_bits(&s->gb, 6);
4687 level = (int8_t)get_bits(&s->gb, 8);
4689 if (s->codec_id == CODEC_ID_RV10) {
4690 /* XXX: should patch encoder too */
4691 level = get_sbits(&s->gb, 12);
4693 level = get_bits(&s->gb, 5);
4694 level |= get_sbits(&s->gb, 6)<<5;
4699 run = rl->table_run[code];
4700 level = rl->table_level[code];
4701 last = code >= rl->last;
4702 if (get_bits1(&s->gb))
4707 if(s->alt_inter_vlc && rl == &rl_inter && !s->mb_intra){
4708 //Looks like a hack but no, it's the way it is supposed to work ...
4712 s->dsp.clear_block(block);
4715 av_log(s->avctx, AV_LOG_ERROR, "run overflow at %dx%d i:%d\n", s->mb_x, s->mb_y, s->mb_intra);
4725 if (s->mb_intra && s->h263_aic) {
4726 h263_pred_acdc(s, block, n);
4729 s->block_last_index[n] = i;
4734 * decodes the dc value.
4735 * @param n block index (0-3 are luma, 4-5 are chroma)
4736 * @param dir_ptr the prediction direction will be stored here
4737 * @return the quantized dc
4739 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
4744 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
4746 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
4747 if (code < 0 || code > 9 /* && s->nbit<9 */){
4748 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
4756 level= 2*get_bits1(&s->gb)-1;
4758 if(get_bits1(&s->gb))
4759 level = get_bits(&s->gb, code-1) + (1<<(code-1));
4761 level = -get_bits(&s->gb, code-1) - (1<<(code-1));
4764 level = get_xbits(&s->gb, code);
4768 if(get_bits1(&s->gb)==0){ /* marker */
4769 if(s->error_recognition>=2){
4770 av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n");
4777 return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0);
4782 * @return <0 if an error occurred
4784 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
4785 int n, int coded, int intra, int rvlc)
4787 int level, i, last, run;
4790 RL_VLC_ELEM * rl_vlc;
4791 const uint8_t * scan_table;
4794 //Note intra & rvlc should be optimized away if this is inlined
4797 if(s->use_intra_dc_vlc){
4799 if(s->partitioned_frame){
4800 level = s->dc_val[0][ s->block_index[n] ];
4801 if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale);
4802 else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale);
4803 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32;
4805 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
4813 ff_mpeg4_pred_dc(s, n, 0, &dc_pred_dir, 0);
4819 rl = &rvlc_rl_intra;
4820 rl_vlc = rvlc_rl_intra.rl_vlc[0];
4823 rl_vlc = rl_intra.rl_vlc[0];
4826 if (dc_pred_dir == 0)
4827 scan_table = s->intra_v_scantable.permutated; /* left */
4829 scan_table = s->intra_h_scantable.permutated; /* top */
4831 scan_table = s->intra_scantable.permutated;
4838 s->block_last_index[n] = i;
4841 if(rvlc) rl = &rvlc_rl_inter;
4842 else rl = &rl_inter;
4844 scan_table = s->intra_scantable.permutated;
4850 rl_vlc = rvlc_rl_inter.rl_vlc[0];
4852 rl_vlc = rl_inter.rl_vlc[0];
4855 qmul = s->qscale << 1;
4856 qadd = (s->qscale - 1) | 1;
4858 rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale];
4860 rl_vlc = rl_inter.rl_vlc[s->qscale];
4865 OPEN_READER(re, &s->gb);
4867 UPDATE_CACHE(re, &s->gb);
4868 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
4872 if(SHOW_UBITS(re, &s->gb, 1)==0){
4873 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n");
4875 }; SKIP_CACHE(re, &s->gb, 1);
4877 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4878 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4879 SKIP_COUNTER(re, &s->gb, 1+1+6);
4880 UPDATE_CACHE(re, &s->gb);
4882 if(SHOW_UBITS(re, &s->gb, 1)==0){
4883 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n");
4885 }; SKIP_CACHE(re, &s->gb, 1);
4887 level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11);
4889 if(SHOW_UBITS(re, &s->gb, 5)!=0x10){
4890 av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n");
4892 }; SKIP_CACHE(re, &s->gb, 5);
4894 level= level * qmul + qadd;
4895 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1);
4896 SKIP_COUNTER(re, &s->gb, 1+11+5+1);
4902 cache= GET_CACHE(re, &s->gb);
4905 cache ^= 0xC0000000;
4907 if (cache&0x80000000) {
4908 if (cache&0x40000000) {
4910 SKIP_CACHE(re, &s->gb, 2);
4911 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4912 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4913 SKIP_COUNTER(re, &s->gb, 2+1+6);
4914 UPDATE_CACHE(re, &s->gb);
4917 level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12);
4919 if(SHOW_UBITS(re, &s->gb, 1)==0){
4920 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n");
4922 }; SKIP_CACHE(re, &s->gb, 1);
4924 level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
4926 if(SHOW_UBITS(re, &s->gb, 1)==0){
4927 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n");
4929 }; LAST_SKIP_CACHE(re, &s->gb, 1);
4931 SKIP_COUNTER(re, &s->gb, 1+12+1);
4935 if(s->error_recognition >= FF_ER_COMPLIANT){
4936 const int abs_level= FFABS(level);
4937 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
4938 const int run1= run - rl->max_run[last][abs_level] - 1;
4939 if(abs_level <= rl->max_level[last][run]){
4940 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
4943 if(s->error_recognition > FF_ER_COMPLIANT){
4944 if(abs_level <= rl->max_level[last][run]*2){
4945 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n");
4948 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
4949 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n");
4956 if (level>0) level= level * qmul + qadd;
4957 else level= level * qmul - qadd;
4959 if((unsigned)(level + 2048) > 4095){
4960 if(s->error_recognition > FF_ER_COMPLIANT){
4961 if(level > 2560 || level<-2560){
4962 av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
4966 level= level<0 ? -2048 : 2047;
4973 #if MIN_CACHE_BITS < 20
4974 LAST_SKIP_BITS(re, &s->gb, 2);
4975 UPDATE_CACHE(re, &s->gb);
4977 SKIP_BITS(re, &s->gb, 2);
4979 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
4980 i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing
4981 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4982 LAST_SKIP_BITS(re, &s->gb, 1);
4986 #if MIN_CACHE_BITS < 19
4987 LAST_SKIP_BITS(re, &s->gb, 1);
4988 UPDATE_CACHE(re, &s->gb);
4990 SKIP_BITS(re, &s->gb, 1);
4992 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
4994 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
4995 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4996 LAST_SKIP_BITS(re, &s->gb, 1);
5001 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
5002 LAST_SKIP_BITS(re, &s->gb, 1);
5007 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
5011 block[scan_table[i]] = level;
5015 block[scan_table[i]] = level;
5017 CLOSE_READER(re, &s->gb);
5021 if(!s->use_intra_dc_vlc){
5022 block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0);
5024 i -= i>>31; //if(i == -1) i=0;
5027 mpeg4_pred_ac(s, block, n, dc_pred_dir);
5029 i = 63; /* XXX: not optimal */
5032 s->block_last_index[n] = i;
5036 /* most is hardcoded. should extend to handle all h263 streams */
5037 int h263_decode_picture_header(MpegEncContext *s)
5039 int format, width, height, i;
5042 align_get_bits(&s->gb);
5044 startcode= get_bits(&s->gb, 22-8);
5046 for(i= s->gb.size_in_bits - get_bits_count(&s->gb); i>24; i-=8) {
5047 startcode = ((startcode << 8) | get_bits(&s->gb, 8)) & 0x003FFFFF;
5049 if(startcode == 0x20)
5053 if (startcode != 0x20) {
5054 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
5057 /* temporal reference */
5058 i = get_bits(&s->gb, 8); /* picture timestamp */
5059 if( (s->picture_number&~0xFF)+i < s->picture_number)
5061 s->current_picture_ptr->pts=
5062 s->picture_number= (s->picture_number&~0xFF) + i;
5064 /* PTYPE starts here */
5065 if (get_bits1(&s->gb) != 1) {
5067 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
5070 if (get_bits1(&s->gb) != 0) {
5071 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
5072 return -1; /* h263 id */
5074 skip_bits1(&s->gb); /* split screen off */
5075 skip_bits1(&s->gb); /* camera off */
5076 skip_bits1(&s->gb); /* freeze picture release off */
5078 format = get_bits(&s->gb, 3);
5083 7 extended PTYPE (PLUSPTYPE)
5086 if (format != 7 && format != 6) {
5089 width = h263_format[format][0];
5090 height = h263_format[format][1];
5094 s->pict_type = FF_I_TYPE + get_bits1(&s->gb);
5096 s->h263_long_vectors = get_bits1(&s->gb);
5098 if (get_bits1(&s->gb) != 0) {
5099 av_log(s->avctx, AV_LOG_ERROR, "H263 SAC not supported\n");
5100 return -1; /* SAC: off */
5102 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
5103 s->unrestricted_mv = s->h263_long_vectors || s->obmc;
5105 s->pb_frame = get_bits1(&s->gb);
5106 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
5107 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
5111 s->avctx->sample_aspect_ratio= (AVRational){12,11};
5112 s->avctx->time_base= (AVRational){1001, 30000};
5118 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
5120 /* ufep other than 0 and 1 are reserved */
5123 format = get_bits(&s->gb, 3);
5124 dprintf(s->avctx, "ufep=1, format: %d\n", format);
5125 s->custom_pcf= get_bits1(&s->gb);
5126 s->umvplus = get_bits1(&s->gb); /* Unrestricted Motion Vector */
5127 if (get_bits1(&s->gb) != 0) {
5128 av_log(s->avctx, AV_LOG_ERROR, "Syntax-based Arithmetic Coding (SAC) not supported\n");
5130 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
5131 s->h263_aic = get_bits1(&s->gb); /* Advanced Intra Coding (AIC) */
5132 s->loop_filter= get_bits1(&s->gb);
5133 s->unrestricted_mv = s->umvplus || s->obmc || s->loop_filter;
5135 s->h263_slice_structured= get_bits1(&s->gb);
5136 if (get_bits1(&s->gb) != 0) {
5137 av_log(s->avctx, AV_LOG_ERROR, "Reference Picture Selection not supported\n");
5139 if (get_bits1(&s->gb) != 0) {
5140 av_log(s->avctx, AV_LOG_ERROR, "Independent Segment Decoding not supported\n");
5142 s->alt_inter_vlc= get_bits1(&s->gb);
5143 s->modified_quant= get_bits1(&s->gb);
5144 if(s->modified_quant)
5145 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
5147 skip_bits(&s->gb, 1); /* Prevent start code emulation */
5149 skip_bits(&s->gb, 3); /* Reserved */
5150 } else if (ufep != 0) {
5151 av_log(s->avctx, AV_LOG_ERROR, "Bad UFEP type (%d)\n", ufep);
5156 s->pict_type = get_bits(&s->gb, 3);
5157 switch(s->pict_type){
5158 case 0: s->pict_type= FF_I_TYPE;break;
5159 case 1: s->pict_type= FF_P_TYPE;break;
5160 case 2: s->pict_type= FF_P_TYPE;s->pb_frame = 3;break;
5161 case 3: s->pict_type= FF_B_TYPE;break;
5162 case 7: s->pict_type= FF_I_TYPE;break; //ZYGO
5166 skip_bits(&s->gb, 2);
5167 s->no_rounding = get_bits1(&s->gb);
5168 skip_bits(&s->gb, 4);
5170 /* Get the picture dimensions */
5173 /* Custom Picture Format (CPFMT) */
5174 s->aspect_ratio_info = get_bits(&s->gb, 4);
5175 dprintf(s->avctx, "aspect: %d\n", s->aspect_ratio_info);
5180 3 - 10:11 (525-type 4:3)
5181 4 - 16:11 (CIF 16:9)
5182 5 - 40:33 (525-type 16:9)
5185 width = (get_bits(&s->gb, 9) + 1) * 4;
5187 height = get_bits(&s->gb, 9) * 4;
5188 dprintf(s->avctx, "\nH.263+ Custom picture: %dx%d\n",width,height);
5189 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
5190 /* aspected dimensions */
5191 s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 8);
5192 s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 8);
5194 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
5197 width = h263_format[format][0];
5198 height = h263_format[format][1];
5199 s->avctx->sample_aspect_ratio= (AVRational){12,11};
5201 if ((width == 0) || (height == 0))
5208 s->avctx->time_base.den= 1800000;
5209 s->avctx->time_base.num= 1000 + get_bits1(&s->gb);
5210 s->avctx->time_base.num*= get_bits(&s->gb, 7);
5211 if(s->avctx->time_base.num == 0){
5212 av_log(s, AV_LOG_ERROR, "zero framerate\n");
5215 gcd= av_gcd(s->avctx->time_base.den, s->avctx->time_base.num);
5216 s->avctx->time_base.den /= gcd;
5217 s->avctx->time_base.num /= gcd;
5218 // av_log(s->avctx, AV_LOG_DEBUG, "%d/%d\n", s->avctx->time_base.den, s->avctx->time_base.num);
5220 s->avctx->time_base= (AVRational){1001, 30000};
5225 skip_bits(&s->gb, 2); //extended Temporal reference
5230 if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
5233 if(s->h263_slice_structured){
5234 if (get_bits1(&s->gb) != 0) {
5235 av_log(s->avctx, AV_LOG_ERROR, "rectangular slices not supported\n");
5237 if (get_bits1(&s->gb) != 0) {
5238 av_log(s->avctx, AV_LOG_ERROR, "unordered slices not supported\n");
5243 s->qscale = get_bits(&s->gb, 5);
5246 s->mb_width = (s->width + 15) / 16;
5247 s->mb_height = (s->height + 15) / 16;
5248 s->mb_num = s->mb_width * s->mb_height;
5251 skip_bits(&s->gb, 3); /* Temporal reference for B-pictures */
5253 skip_bits(&s->gb, 2); //extended Temporal reference
5254 skip_bits(&s->gb, 2); /* Quantization information for B-pictures */
5258 while (get_bits1(&s->gb) != 0) {
5259 skip_bits(&s->gb, 8);
5262 if(s->h263_slice_structured){
5263 if (get_bits1(&s->gb) != 1) {
5264 av_log(s->avctx, AV_LOG_ERROR, "SEPB1 marker missing\n");
5268 ff_h263_decode_mba(s);
5270 if (get_bits1(&s->gb) != 1) {
5271 av_log(s->avctx, AV_LOG_ERROR, "SEPB2 marker missing\n");
5278 s->y_dc_scale_table=
5279 s->c_dc_scale_table= ff_aic_dc_scale_table;
5281 s->y_dc_scale_table=
5282 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
5285 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
5289 if (s->pict_type == FF_I_TYPE && s->codec_tag == AV_RL32("ZYGO")){
5291 for(i=0; i<85; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
5292 av_log(s->avctx, AV_LOG_DEBUG, "\n");
5293 for(i=0; i<13; i++){
5295 int v= get_bits(&s->gb, 8);
5296 v |= get_sbits(&s->gb, 8)<<8;
5297 av_log(s->avctx, AV_LOG_DEBUG, " %5d", v);
5299 av_log(s->avctx, AV_LOG_DEBUG, "\n");
5301 for(i=0; i<50; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
5308 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb)
5311 int a= 2<<s->sprite_warping_accuracy;
5312 int rho= 3-s->sprite_warping_accuracy;
5314 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
5315 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
5316 int sprite_ref[4][2];
5317 int virtual_ref[2][2];
5319 int alpha=0, beta=0;
5324 for(i=0; i<s->num_sprite_warping_points; i++){
5328 length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);
5330 x= get_xbits(gb, length);
5332 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(gb); /* marker bit */
5334 length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);
5336 y=get_xbits(gb, length);
5338 skip_bits1(gb); /* marker bit */
5339 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
5340 s->sprite_traj[i][0]= d[i][0]= x;
5341 s->sprite_traj[i][1]= d[i][1]= y;
5344 s->sprite_traj[i][0]= s->sprite_traj[i][1]= 0;
5346 while((1<<alpha)<w) alpha++;
5347 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
5351 // Note, the 4th point isn't used for GMC
5352 if(s->divx_version==500 && s->divx_build==413){
5353 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
5354 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
5355 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
5356 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
5357 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
5358 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
5360 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
5361 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
5362 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
5363 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
5364 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
5365 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
5367 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
5368 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
5370 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
5371 // perhaps it should be reordered to be more readable ...
5372 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
5373 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
5374 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
5375 + 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);
5376 virtual_ref[0][1]= 16*vop_ref[0][1]
5377 + 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);
5378 virtual_ref[1][0]= 16*vop_ref[0][0]
5379 + 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);
5380 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
5381 + 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);
5383 switch(s->num_sprite_warping_points)
5386 s->sprite_offset[0][0]= 0;
5387 s->sprite_offset[0][1]= 0;
5388 s->sprite_offset[1][0]= 0;
5389 s->sprite_offset[1][1]= 0;
5390 s->sprite_delta[0][0]= a;
5391 s->sprite_delta[0][1]= 0;
5392 s->sprite_delta[1][0]= 0;
5393 s->sprite_delta[1][1]= a;
5394 s->sprite_shift[0]= 0;
5395 s->sprite_shift[1]= 0;
5398 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
5399 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
5400 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
5401 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
5402 s->sprite_delta[0][0]= a;
5403 s->sprite_delta[0][1]= 0;
5404 s->sprite_delta[1][0]= 0;
5405 s->sprite_delta[1][1]= a;
5406 s->sprite_shift[0]= 0;
5407 s->sprite_shift[1]= 0;
5410 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
5411 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
5412 + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])
5413 + (1<<(alpha+rho-1));
5414 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
5415 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
5416 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])
5417 + (1<<(alpha+rho-1));
5418 s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
5419 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
5420 +2*w2*r*sprite_ref[0][0]
5422 + (1<<(alpha+rho+1)));
5423 s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
5424 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
5425 +2*w2*r*sprite_ref[0][1]
5427 + (1<<(alpha+rho+1)));
5428 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
5429 s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]);
5430 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
5431 s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
5433 s->sprite_shift[0]= alpha+rho;
5434 s->sprite_shift[1]= alpha+rho+2;
5437 min_ab= FFMIN(alpha, beta);
5440 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
5441 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])
5442 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])
5443 + (1<<(alpha+beta+rho-min_ab-1));
5444 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))
5445 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])
5446 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])
5447 + (1<<(alpha+beta+rho-min_ab-1));
5448 s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)
5449 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)
5450 + 2*w2*h3*r*sprite_ref[0][0]
5452 + (1<<(alpha+beta+rho-min_ab+1));
5453 s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)
5454 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)
5455 + 2*w2*h3*r*sprite_ref[0][1]
5457 + (1<<(alpha+beta+rho-min_ab+1));
5458 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;
5459 s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;
5460 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;
5461 s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;
5463 s->sprite_shift[0]= alpha + beta + rho - min_ab;
5464 s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;
5467 /* try to simplify the situation */
5468 if( s->sprite_delta[0][0] == a<<s->sprite_shift[0]
5469 && s->sprite_delta[0][1] == 0
5470 && s->sprite_delta[1][0] == 0
5471 && s->sprite_delta[1][1] == a<<s->sprite_shift[0])
5473 s->sprite_offset[0][0]>>=s->sprite_shift[0];
5474 s->sprite_offset[0][1]>>=s->sprite_shift[0];
5475 s->sprite_offset[1][0]>>=s->sprite_shift[1];
5476 s->sprite_offset[1][1]>>=s->sprite_shift[1];
5477 s->sprite_delta[0][0]= a;
5478 s->sprite_delta[0][1]= 0;
5479 s->sprite_delta[1][0]= 0;
5480 s->sprite_delta[1][1]= a;
5481 s->sprite_shift[0]= 0;
5482 s->sprite_shift[1]= 0;
5483 s->real_sprite_warping_points=1;
5486 int shift_y= 16 - s->sprite_shift[0];
5487 int shift_c= 16 - s->sprite_shift[1];
5488 //printf("shifts %d %d\n", shift_y, shift_c);
5490 s->sprite_offset[0][i]<<= shift_y;
5491 s->sprite_offset[1][i]<<= shift_c;
5492 s->sprite_delta[0][i]<<= shift_y;
5493 s->sprite_delta[1][i]<<= shift_y;
5494 s->sprite_shift[i]= 16;
5496 s->real_sprite_warping_points= s->num_sprite_warping_points;
5499 printf("vop:%d:%d %d:%d %d:%d, sprite:%d:%d %d:%d %d:%d, virtual: %d:%d %d:%d\n",
5500 vop_ref[0][0], vop_ref[0][1],
5501 vop_ref[1][0], vop_ref[1][1],
5502 vop_ref[2][0], vop_ref[2][1],
5503 sprite_ref[0][0], sprite_ref[0][1],
5504 sprite_ref[1][0], sprite_ref[1][1],
5505 sprite_ref[2][0], sprite_ref[2][1],
5506 virtual_ref[0][0], virtual_ref[0][1],
5507 virtual_ref[1][0], virtual_ref[1][1]
5510 printf("offset: %d:%d , delta: %d %d %d %d, shift %d\n",
5511 s->sprite_offset[0][0], s->sprite_offset[0][1],
5512 s->sprite_delta[0][0], s->sprite_delta[0][1],
5513 s->sprite_delta[1][0], s->sprite_delta[1][1],
5519 static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
5520 int hours, minutes, seconds;
5522 hours= get_bits(gb, 5);
5523 minutes= get_bits(gb, 6);
5525 seconds= get_bits(gb, 6);
5527 s->time_base= seconds + 60*(minutes + 60*hours);
5535 static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
5536 int width, height, vo_ver_id;
5539 skip_bits(gb, 1); /* random access */
5540 s->vo_type= get_bits(gb, 8);
5541 if (get_bits1(gb) != 0) { /* is_ol_id */
5542 vo_ver_id = get_bits(gb, 4); /* vo_ver_id */
5543 skip_bits(gb, 3); /* vo_priority */
5547 //printf("vo type:%d\n",s->vo_type);
5548 s->aspect_ratio_info= get_bits(gb, 4);
5549 if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
5550 s->avctx->sample_aspect_ratio.num= get_bits(gb, 8); // par_width
5551 s->avctx->sample_aspect_ratio.den= get_bits(gb, 8); // par_height
5553 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
5556 if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
5557 int chroma_format= get_bits(gb, 2);
5558 if(chroma_format!=CHROMA_420){
5559 av_log(s->avctx, AV_LOG_ERROR, "illegal chroma format\n");
5561 s->low_delay= get_bits1(gb);
5562 if(get_bits1(gb)){ /* vbv parameters */
5563 get_bits(gb, 15); /* first_half_bitrate */
5564 skip_bits1(gb); /* marker */
5565 get_bits(gb, 15); /* latter_half_bitrate */
5566 skip_bits1(gb); /* marker */
5567 get_bits(gb, 15); /* first_half_vbv_buffer_size */
5568 skip_bits1(gb); /* marker */
5569 get_bits(gb, 3); /* latter_half_vbv_buffer_size */
5570 get_bits(gb, 11); /* first_half_vbv_occupancy */
5571 skip_bits1(gb); /* marker */
5572 get_bits(gb, 15); /* latter_half_vbv_occupancy */
5573 skip_bits1(gb); /* marker */
5576 // set low delay flag only once the smartest? low delay detection won't be overriden
5577 if(s->picture_number==0)
5581 s->shape = get_bits(gb, 2); /* vol shape */
5582 if(s->shape != RECT_SHAPE) av_log(s->avctx, AV_LOG_ERROR, "only rectangular vol supported\n");
5583 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
5584 av_log(s->avctx, AV_LOG_ERROR, "Gray shape not supported\n");
5585 skip_bits(gb, 4); //video_object_layer_shape_extension
5588 check_marker(gb, "before time_increment_resolution");
5590 s->avctx->time_base.den = get_bits(gb, 16);
5591 if(!s->avctx->time_base.den){
5592 av_log(s->avctx, AV_LOG_ERROR, "time_base.den==0\n");
5596 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
5597 if (s->time_increment_bits < 1)
5598 s->time_increment_bits = 1;
5600 check_marker(gb, "before fixed_vop_rate");
5602 if (get_bits1(gb) != 0) { /* fixed_vop_rate */
5603 s->avctx->time_base.num = get_bits(gb, s->time_increment_bits);
5605 s->avctx->time_base.num = 1;
5609 if (s->shape != BIN_ONLY_SHAPE) {
5610 if (s->shape == RECT_SHAPE) {
5611 skip_bits1(gb); /* marker */
5612 width = get_bits(gb, 13);
5613 skip_bits1(gb); /* marker */
5614 height = get_bits(gb, 13);
5615 skip_bits1(gb); /* marker */
5616 if(width && height && !(s->width && s->codec_tag == AV_RL32("MP4S"))){ /* they should be non zero but who knows ... */
5619 // printf("width/height: %d %d\n", width, height);
5623 s->progressive_sequence=
5624 s->progressive_frame= get_bits1(gb)^1;
5625 s->interlaced_dct=0;
5626 if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO))
5627 av_log(s->avctx, AV_LOG_INFO, "MPEG4 OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */
5628 if (vo_ver_id == 1) {
5629 s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */
5631 s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */
5633 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "Static Sprites not supported\n");
5634 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
5635 if(s->vol_sprite_usage==STATIC_SPRITE){
5636 s->sprite_width = get_bits(gb, 13);
5637 skip_bits1(gb); /* marker */
5638 s->sprite_height= get_bits(gb, 13);
5639 skip_bits1(gb); /* marker */
5640 s->sprite_left = get_bits(gb, 13);
5641 skip_bits1(gb); /* marker */
5642 s->sprite_top = get_bits(gb, 13);
5643 skip_bits1(gb); /* marker */
5645 s->num_sprite_warping_points= get_bits(gb, 6);
5646 if(s->num_sprite_warping_points > 3){
5647 av_log(s->avctx, AV_LOG_ERROR, "%d sprite_warping_points\n", s->num_sprite_warping_points);
5648 s->num_sprite_warping_points= 0;
5651 s->sprite_warping_accuracy = get_bits(gb, 2);
5652 s->sprite_brightness_change= get_bits1(gb);
5653 if(s->vol_sprite_usage==STATIC_SPRITE)
5654 s->low_latency_sprite= get_bits1(gb);
5656 // FIXME sadct disable bit if verid!=1 && shape not rect
5658 if (get_bits1(gb) == 1) { /* not_8_bit */
5659 s->quant_precision = get_bits(gb, 4); /* quant_precision */
5660 if(get_bits(gb, 4)!=8) av_log(s->avctx, AV_LOG_ERROR, "N-bit not supported\n"); /* bits_per_pixel */
5661 if(s->quant_precision!=5) av_log(s->avctx, AV_LOG_ERROR, "quant precision %d\n", s->quant_precision);
5663 s->quant_precision = 5;
5666 // FIXME a bunch of grayscale shape things
5668 if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */
5671 /* load default matrixes */
5672 for(i=0; i<64; i++){
5673 int j= s->dsp.idct_permutation[i];
5674 v= ff_mpeg4_default_intra_matrix[i];
5675 s->intra_matrix[j]= v;
5676 s->chroma_intra_matrix[j]= v;
5678 v= ff_mpeg4_default_non_intra_matrix[i];
5679 s->inter_matrix[j]= v;
5680 s->chroma_inter_matrix[j]= v;
5683 /* load custom intra matrix */
5686 for(i=0; i<64; i++){
5692 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5693 s->intra_matrix[j]= v;
5694 s->chroma_intra_matrix[j]= v;
5697 /* replicate last value */
5699 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5700 s->intra_matrix[j]= last;
5701 s->chroma_intra_matrix[j]= last;
5705 /* load custom non intra matrix */
5708 for(i=0; i<64; i++){
5714 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5715 s->inter_matrix[j]= v;
5716 s->chroma_inter_matrix[j]= v;
5719 /* replicate last value */
5721 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5722 s->inter_matrix[j]= last;
5723 s->chroma_inter_matrix[j]= last;
5727 // FIXME a bunch of grayscale shape things
5731 s->quarter_sample= get_bits1(gb);
5732 else s->quarter_sample=0;
5735 int pos= get_bits_count(gb);
5736 int estimation_method= get_bits(gb, 2);
5737 if(estimation_method<2){
5739 s->cplx_estimation_trash_i += 8*get_bits1(gb); //opaque
5740 s->cplx_estimation_trash_i += 8*get_bits1(gb); //transparent
5741 s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_cae
5742 s->cplx_estimation_trash_i += 8*get_bits1(gb); //inter_cae
5743 s->cplx_estimation_trash_i += 8*get_bits1(gb); //no_update
5744 s->cplx_estimation_trash_i += 8*get_bits1(gb); //upampling
5747 s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_blocks
5748 s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter_blocks
5749 s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter4v_blocks
5750 s->cplx_estimation_trash_i += 8*get_bits1(gb); //not coded blocks
5752 if(!check_marker(gb, "in complexity estimation part 1")){
5753 skip_bits_long(gb, pos - get_bits_count(gb));
5757 s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_coeffs
5758 s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_lines
5759 s->cplx_estimation_trash_i += 8*get_bits1(gb); //vlc_syms
5760 s->cplx_estimation_trash_i += 4*get_bits1(gb); //vlc_bits
5763 s->cplx_estimation_trash_p += 8*get_bits1(gb); //apm
5764 s->cplx_estimation_trash_p += 8*get_bits1(gb); //npm
5765 s->cplx_estimation_trash_b += 8*get_bits1(gb); //interpolate_mc_q
5766 s->cplx_estimation_trash_p += 8*get_bits1(gb); //forwback_mc_q
5767 s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel2
5768 s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel4
5770 if(!check_marker(gb, "in complexity estimation part 2")){
5771 skip_bits_long(gb, pos - get_bits_count(gb));
5774 if(estimation_method==1){
5775 s->cplx_estimation_trash_i += 8*get_bits1(gb); //sadct
5776 s->cplx_estimation_trash_p += 8*get_bits1(gb); //qpel
5779 av_log(s->avctx, AV_LOG_ERROR, "Invalid Complexity estimation method %d\n", estimation_method);
5782 s->cplx_estimation_trash_i=
5783 s->cplx_estimation_trash_p=
5784 s->cplx_estimation_trash_b= 0;
5787 s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */
5789 s->data_partitioning= get_bits1(gb);
5790 if(s->data_partitioning){
5791 s->rvlc= get_bits1(gb);
5794 if(vo_ver_id != 1) {
5795 s->new_pred= get_bits1(gb);
5797 av_log(s->avctx, AV_LOG_ERROR, "new pred not supported\n");
5798 skip_bits(gb, 2); /* requested upstream message type */
5799 skip_bits1(gb); /* newpred segment type */
5801 s->reduced_res_vop= get_bits1(gb);
5802 if(s->reduced_res_vop) av_log(s->avctx, AV_LOG_ERROR, "reduced resolution VOP not supported\n");
5806 s->reduced_res_vop= 0;
5809 s->scalability= get_bits1(gb);
5811 if (s->scalability) {
5812 GetBitContext bak= *gb;
5814 int ref_layer_sampling_dir;
5815 int h_sampling_factor_n;
5816 int h_sampling_factor_m;
5817 int v_sampling_factor_n;
5818 int v_sampling_factor_m;
5820 s->hierachy_type= get_bits1(gb);
5821 ref_layer_id= get_bits(gb, 4);
5822 ref_layer_sampling_dir= get_bits1(gb);
5823 h_sampling_factor_n= get_bits(gb, 5);
5824 h_sampling_factor_m= get_bits(gb, 5);
5825 v_sampling_factor_n= get_bits(gb, 5);
5826 v_sampling_factor_m= get_bits(gb, 5);
5827 s->enhancement_type= get_bits1(gb);
5829 if( h_sampling_factor_n==0 || h_sampling_factor_m==0
5830 || v_sampling_factor_n==0 || v_sampling_factor_m==0){
5832 // fprintf(stderr, "illegal scalability header (VERY broken encoder), trying to workaround\n");
5837 av_log(s->avctx, AV_LOG_ERROR, "scalability not supported\n");
5839 // bin shape stuff FIXME
5846 * decodes the user data stuff in the header.
5847 * Also initializes divx/xvid/lavc_version/build.
5849 static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
5853 int ver = 0, build = 0, ver2 = 0, ver3 = 0;
5856 for(i=0; i<255 && get_bits_count(gb) < gb->size_in_bits; i++){
5857 if(show_bits(gb, 23) == 0) break;
5858 buf[i]= get_bits(gb, 8);
5862 /* divx detection */
5863 e=sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last);
5865 e=sscanf(buf, "DivX%db%d%c", &ver, &build, &last);
5867 s->divx_version= ver;
5868 s->divx_build= build;
5869 s->divx_packed= e==3 && last=='p';
5870 if(s->divx_packed && !s->showed_packed_warning) {
5871 av_log(s->avctx, AV_LOG_WARNING, "Invalid and inefficient vfw-avi packed B frames detected\n");
5872 s->showed_packed_warning=1;
5876 /* ffmpeg detection */
5877 e=sscanf(buf, "FFmpe%*[^b]b%d", &build)+3;
5879 e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
5881 e=sscanf(buf, "Lavc%d.%d.%d", &ver, &ver2, &ver3)+1;
5883 build= (ver<<16) + (ver2<<8) + ver3;
5886 if(strcmp(buf, "ffmpeg")==0){
5887 s->lavc_build= 4600;
5891 s->lavc_build= build;
5894 /* Xvid detection */
5895 e=sscanf(buf, "XviD%d", &build);
5897 s->xvid_build= build;
5900 //printf("User Data: %s\n", buf);
5904 static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
5905 int time_incr, time_increment;
5907 s->pict_type = get_bits(gb, 2) + FF_I_TYPE; /* pict type: I = 0 , P = 1 */
5908 if(s->pict_type==FF_B_TYPE && s->low_delay && s->vol_control_parameters==0 && !(s->flags & CODEC_FLAG_LOW_DELAY)){
5909 av_log(s->avctx, AV_LOG_ERROR, "low_delay flag incorrectly, clearing it\n");
5913 s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE;
5914 if(s->partitioned_frame)
5915 s->decode_mb= mpeg4_decode_partitioned_mb;
5917 s->decode_mb= ff_mpeg4_decode_mb;
5920 while (get_bits1(gb) != 0)
5923 check_marker(gb, "before time_increment");
5925 if(s->time_increment_bits==0 || !(show_bits(gb, s->time_increment_bits+1)&1)){
5926 av_log(s->avctx, AV_LOG_ERROR, "hmm, seems the headers are not complete, trying to guess time_increment_bits\n");
5928 for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){
5929 if(show_bits(gb, s->time_increment_bits+1)&1) break;
5932 av_log(s->avctx, AV_LOG_ERROR, "my guess is %d bits ;)\n",s->time_increment_bits);
5935 if(IS_3IV1) time_increment= get_bits1(gb); //FIXME investigate further
5936 else time_increment= get_bits(gb, s->time_increment_bits);
5938 // printf("%d %X\n", s->time_increment_bits, time_increment);
5939 //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);
5940 if(s->pict_type!=FF_B_TYPE){
5941 s->last_time_base= s->time_base;
5942 s->time_base+= time_incr;
5943 s->time= s->time_base*s->avctx->time_base.den + time_increment;
5944 if(s->workaround_bugs&FF_BUG_UMP4){
5945 if(s->time < s->last_non_b_time){
5946 // fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaround\n");
5948 s->time+= s->avctx->time_base.den;
5951 s->pp_time= s->time - s->last_non_b_time;
5952 s->last_non_b_time= s->time;
5954 s->time= (s->last_time_base + time_incr)*s->avctx->time_base.den + time_increment;
5955 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
5956 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
5957 // printf("messed up order, maybe after seeking? skipping current b frame\n");
5958 return FRAME_SKIPPED;
5960 ff_mpeg4_init_direct_mv(s);
5962 if(s->t_frame==0) s->t_frame= s->pb_time;
5963 if(s->t_frame==0) s->t_frame=1; // 1/0 protection
5964 s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame)
5965 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
5966 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame)
5967 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
5968 if(!s->progressive_sequence){
5969 if(s->pp_field_time <= s->pb_field_time || s->pb_field_time <= 1)
5970 return FRAME_SKIPPED;
5973 //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);
5975 if(s->avctx->time_base.num)
5976 s->current_picture_ptr->pts= (s->time + s->avctx->time_base.num/2) / s->avctx->time_base.num;
5978 s->current_picture_ptr->pts= AV_NOPTS_VALUE;
5979 if(s->avctx->debug&FF_DEBUG_PTS)
5980 av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %"PRId64"\n", s->current_picture_ptr->pts);
5982 check_marker(gb, "before vop_coded");
5985 if (get_bits1(gb) != 1){
5986 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
5987 av_log(s->avctx, AV_LOG_ERROR, "vop not coded\n");
5988 return FRAME_SKIPPED;
5990 //printf("time %d %d %d || %"PRId64" %"PRId64" %"PRId64"\n", s->time_increment_bits, s->avctx->time_base.den, s->time_base,
5991 //s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time);
5992 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == FF_P_TYPE
5993 || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
5994 /* rounding type for motion estimation */
5995 s->no_rounding = get_bits1(gb);
5999 //FIXME reduced res stuff
6001 if (s->shape != RECT_SHAPE) {
6002 if (s->vol_sprite_usage != 1 || s->pict_type != FF_I_TYPE) {
6003 int width, height, hor_spat_ref, ver_spat_ref;
6005 width = get_bits(gb, 13);
6006 skip_bits1(gb); /* marker */
6007 height = get_bits(gb, 13);
6008 skip_bits1(gb); /* marker */
6009 hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */
6010 skip_bits1(gb); /* marker */
6011 ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */
6013 skip_bits1(gb); /* change_CR_disable */
6015 if (get_bits1(gb) != 0) {
6016 skip_bits(gb, 8); /* constant_alpha_value */
6019 //FIXME complexity estimation stuff
6021 if (s->shape != BIN_ONLY_SHAPE) {
6022 skip_bits_long(gb, s->cplx_estimation_trash_i);
6023 if(s->pict_type != FF_I_TYPE)
6024 skip_bits_long(gb, s->cplx_estimation_trash_p);
6025 if(s->pict_type == FF_B_TYPE)
6026 skip_bits_long(gb, s->cplx_estimation_trash_b);
6028 s->intra_dc_threshold= mpeg4_dc_threshold[ get_bits(gb, 3) ];
6029 if(!s->progressive_sequence){
6030 s->top_field_first= get_bits1(gb);
6031 s->alternate_scan= get_bits1(gb);
6033 s->alternate_scan= 0;
6036 if(s->alternate_scan){
6037 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
6038 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
6039 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
6040 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
6042 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
6043 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
6044 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
6045 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
6048 if(s->pict_type == FF_S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
6049 mpeg4_decode_sprite_trajectory(s, gb);
6050 if(s->sprite_brightness_change) av_log(s->avctx, AV_LOG_ERROR, "sprite_brightness_change not supported\n");
6051 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "static sprite not supported\n");
6054 if (s->shape != BIN_ONLY_SHAPE) {
6055 s->chroma_qscale= s->qscale = get_bits(gb, s->quant_precision);
6057 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (qscale=0)\n");
6058 return -1; // makes no sense to continue, as there is nothing left from the image then
6061 if (s->pict_type != FF_I_TYPE) {
6062 s->f_code = get_bits(gb, 3); /* fcode_for */
6064 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (f_code=0)\n");
6065 return -1; // makes no sense to continue, as the MV decoding will break very quickly
6070 if (s->pict_type == FF_B_TYPE) {
6071 s->b_code = get_bits(gb, 3);
6075 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
6076 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",
6077 s->qscale, s->f_code, s->b_code,
6078 s->pict_type == FF_I_TYPE ? "I" : (s->pict_type == FF_P_TYPE ? "P" : (s->pict_type == FF_B_TYPE ? "B" : "S")),
6079 gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first,
6080 s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,
6081 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);
6084 if(!s->scalability){
6085 if (s->shape!=RECT_SHAPE && s->pict_type!=FF_I_TYPE) {
6086 skip_bits1(gb); // vop shape coding type
6089 if(s->enhancement_type){
6090 int load_backward_shape= get_bits1(gb);
6091 if(load_backward_shape){
6092 av_log(s->avctx, AV_LOG_ERROR, "load backward shape isn't supported\n");
6095 skip_bits(gb, 2); //ref_select_code
6098 /* detect buggy encoders which don't set the low_delay flag (divx4/xvid/opendivx)*/
6099 // note we cannot detect divx5 without b-frames easily (although it's buggy too)
6100 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
6101 av_log(s->avctx, AV_LOG_ERROR, "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
6105 s->picture_number++; // better than pic number==0 always ;)
6107 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
6108 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
6110 if(s->workaround_bugs&FF_BUG_EDGE){
6111 s->h_edge_pos= s->width;
6112 s->v_edge_pos= s->height;
6118 * decode mpeg4 headers
6119 * @return <0 if no VOP found (or a damaged one)
6120 * FRAME_SKIPPED if a not coded VOP is found
6121 * 0 if a VOP is found
6123 int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb)
6127 /* search next start code */
6130 if(s->codec_tag == AV_RL32("WV1F") && show_bits(gb, 24) == 0x575630){
6132 if(get_bits(gb, 8) == 0xF0)
6138 if(get_bits_count(gb) >= gb->size_in_bits){
6139 if(gb->size_in_bits==8 && (s->divx_version || s->xvid_build)){
6140 av_log(s->avctx, AV_LOG_ERROR, "frame skip %d\n", gb->size_in_bits);
6141 return FRAME_SKIPPED; //divx bug
6143 return -1; //end of stream
6146 /* use the bits after the test */
6147 v = get_bits(gb, 8);
6148 startcode = ((startcode << 8) | v) & 0xffffffff;
6150 if((startcode&0xFFFFFF00) != 0x100)
6151 continue; //no startcode
6153 if(s->avctx->debug&FF_DEBUG_STARTCODE){
6154 av_log(s->avctx, AV_LOG_DEBUG, "startcode: %3X ", startcode);
6155 if (startcode<=0x11F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Start");
6156 else if(startcode<=0x12F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Layer Start");
6157 else if(startcode<=0x13F) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
6158 else if(startcode<=0x15F) av_log(s->avctx, AV_LOG_DEBUG, "FGS bp start");
6159 else if(startcode<=0x1AF) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
6160 else if(startcode==0x1B0) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq Start");
6161 else if(startcode==0x1B1) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq End");
6162 else if(startcode==0x1B2) av_log(s->avctx, AV_LOG_DEBUG, "User Data");
6163 else if(startcode==0x1B3) av_log(s->avctx, AV_LOG_DEBUG, "Group of VOP start");
6164 else if(startcode==0x1B4) av_log(s->avctx, AV_LOG_DEBUG, "Video Session Error");
6165 else if(startcode==0x1B5) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Start");
6166 else if(startcode==0x1B6) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Plane start");
6167 else if(startcode==0x1B7) av_log(s->avctx, AV_LOG_DEBUG, "slice start");
6168 else if(startcode==0x1B8) av_log(s->avctx, AV_LOG_DEBUG, "extension start");
6169 else if(startcode==0x1B9) av_log(s->avctx, AV_LOG_DEBUG, "fgs start");
6170 else if(startcode==0x1BA) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object start");
6171 else if(startcode==0x1BB) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object Plane start");
6172 else if(startcode==0x1BC) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object start");
6173 else if(startcode==0x1BD) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object Plane start");
6174 else if(startcode==0x1BE) av_log(s->avctx, AV_LOG_DEBUG, "Still Texture Object start");
6175 else if(startcode==0x1BF) av_log(s->avctx, AV_LOG_DEBUG, "Texture Spatial Layer start");
6176 else if(startcode==0x1C0) av_log(s->avctx, AV_LOG_DEBUG, "Texture SNR Layer start");
6177 else if(startcode==0x1C1) av_log(s->avctx, AV_LOG_DEBUG, "Texture Tile start");
6178 else if(startcode==0x1C2) av_log(s->avctx, AV_LOG_DEBUG, "Texture Shape Layer start");
6179 else if(startcode==0x1C3) av_log(s->avctx, AV_LOG_DEBUG, "stuffing start");
6180 else if(startcode<=0x1C5) av_log(s->avctx, AV_LOG_DEBUG, "reserved");
6181 else if(startcode<=0x1FF) av_log(s->avctx, AV_LOG_DEBUG, "System start");
6182 av_log(s->avctx, AV_LOG_DEBUG, " at %d\n", get_bits_count(gb));
6185 if(startcode >= 0x120 && startcode <= 0x12F){
6186 if(decode_vol_header(s, gb) < 0)
6189 else if(startcode == USER_DATA_STARTCODE){
6190 decode_user_data(s, gb);
6192 else if(startcode == GOP_STARTCODE){
6193 mpeg4_decode_gop_header(s, gb);
6195 else if(startcode == VOP_STARTCODE){
6203 if(s->flags& CODEC_FLAG_LOW_DELAY)
6205 s->avctx->has_b_frames= !s->low_delay;
6206 return decode_vop_header(s, gb);
6209 /* don't understand why they choose a different header ! */
6210 int intel_h263_decode_picture_header(MpegEncContext *s)
6214 /* picture header */
6215 if (get_bits_long(&s->gb, 22) != 0x20) {
6216 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
6219 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
6221 if (get_bits1(&s->gb) != 1) {
6222 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
6223 return -1; /* marker */
6225 if (get_bits1(&s->gb) != 0) {
6226 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
6227 return -1; /* h263 id */
6229 skip_bits1(&s->gb); /* split screen off */
6230 skip_bits1(&s->gb); /* camera off */
6231 skip_bits1(&s->gb); /* freeze picture release off */
6233 format = get_bits(&s->gb, 3);
6235 av_log(s->avctx, AV_LOG_ERROR, "Intel H263 free format not supported\n");
6240 s->pict_type = FF_I_TYPE + get_bits1(&s->gb);
6242 s->unrestricted_mv = get_bits1(&s->gb);
6243 s->h263_long_vectors = s->unrestricted_mv;
6245 if (get_bits1(&s->gb) != 0) {
6246 av_log(s->avctx, AV_LOG_ERROR, "SAC not supported\n");
6247 return -1; /* SAC: off */
6249 s->obmc= get_bits1(&s->gb);
6250 s->pb_frame = get_bits1(&s->gb);
6253 format = get_bits(&s->gb, 3);
6254 if(format == 0 || format == 7){
6255 av_log(s->avctx, AV_LOG_ERROR, "Wrong Intel H263 format\n");
6258 if(get_bits(&s->gb, 2))
6259 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
6260 s->loop_filter = get_bits1(&s->gb);
6261 if(get_bits1(&s->gb))
6262 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
6263 if(get_bits1(&s->gb))
6265 if(get_bits(&s->gb, 5))
6266 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
6267 if(get_bits(&s->gb, 5) != 1)
6268 av_log(s->avctx, AV_LOG_ERROR, "Invalid marker\n");
6271 int ar = get_bits(&s->gb, 4);
6272 skip_bits(&s->gb, 9); // display width
6274 skip_bits(&s->gb, 9); // display height
6276 skip_bits(&s->gb, 8); // aspect ratio - width
6277 skip_bits(&s->gb, 8); // aspect ratio - height
6281 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
6282 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
6285 skip_bits(&s->gb, 3); //temporal reference for B-frame
6286 skip_bits(&s->gb, 2); //dbquant
6290 while (get_bits1(&s->gb) != 0) {
6291 skip_bits(&s->gb, 8);
6295 s->y_dc_scale_table=
6296 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
6298 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
6304 int flv_h263_decode_picture_header(MpegEncContext *s)
6306 int format, width, height;
6308 /* picture header */
6309 if (get_bits_long(&s->gb, 17) != 1) {
6310 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
6313 format = get_bits(&s->gb, 5);
6314 if (format != 0 && format != 1) {
6315 av_log(s->avctx, AV_LOG_ERROR, "Bad picture format\n");
6318 s->h263_flv = format+1;
6319 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
6320 format = get_bits(&s->gb, 3);
6323 width = get_bits(&s->gb, 8);
6324 height = get_bits(&s->gb, 8);
6327 width = get_bits(&s->gb, 16);
6328 height = get_bits(&s->gb, 16);
6354 if(avcodec_check_dimensions(s->avctx, width, height))
6359 s->pict_type = FF_I_TYPE + get_bits(&s->gb, 2);
6360 s->dropable= s->pict_type > FF_P_TYPE;
6362 s->pict_type = FF_P_TYPE;
6364 skip_bits1(&s->gb); /* deblocking flag */
6365 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
6369 s->unrestricted_mv = 1;
6370 s->h263_long_vectors = 0;
6373 while (get_bits1(&s->gb) != 0) {
6374 skip_bits(&s->gb, 8);
6378 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
6379 av_log(s->avctx, AV_LOG_DEBUG, "%c esc_type:%d, qp:%d num:%d\n",
6380 s->dropable ? 'D' : av_get_pict_type_char(s->pict_type), s->h263_flv-1, s->qscale, s->picture_number);
6383 s->y_dc_scale_table=
6384 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;