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
60 static void mpeg4_encode_visual_object_header(MpegEncContext *s);
61 static void mpeg4_encode_vol_header(MpegEncContext *s, int vo_number,
63 static inline void mpeg4_encode_block(MpegEncContext *s, DCTELEM *block,
64 int n, int dc, uint8_t *scan_table,
66 PutBitContext *ac_pb);
67 static int mpeg4_get_block_length(MpegEncContext *s, DCTELEM *block, int n,
68 int intra_dc, uint8_t *scan_table);
70 static uint8_t uni_DCtab_lum_len[512];
71 static uint8_t uni_DCtab_chrom_len[512];
72 static uint16_t uni_DCtab_lum_bits[512];
73 static uint16_t uni_DCtab_chrom_bits[512];
75 static uint8_t mv_penalty[MAX_FCODE+1][MAX_MV*2+1];
76 static uint8_t fcode_tab[MAX_MV*2+1];
77 static uint8_t umv_fcode_tab[MAX_MV*2+1];
79 static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2];
80 static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2];
81 static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2];
82 static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2];
83 static uint8_t uni_h263_intra_aic_rl_len [64*64*2*2];
84 static uint8_t uni_h263_inter_rl_len [64*64*2*2];
85 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
86 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
87 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
100 static uint8_t static_rl_table_store[5][2][2*MAX_RUN + MAX_LEVEL + 3];
102 #if 0 //3IV1 is quite rare and it slows things down a tiny bit
103 #define IS_3IV1 s->codec_tag == AV_RL32("3IV1")
108 int h263_get_picture_format(int width, int height)
112 if (width == 128 && height == 96)
114 else if (width == 176 && height == 144)
116 else if (width == 352 && height == 288)
118 else if (width == 704 && height == 576)
120 else if (width == 1408 && height == 1152)
127 static void show_pict_info(MpegEncContext *s){
128 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",
129 s->qscale, av_get_pict_type_char(s->pict_type),
130 s->gb.size_in_bits, 1-s->no_rounding,
131 s->obmc ? " AP" : "",
132 s->umvplus ? " UMV" : "",
133 s->h263_long_vectors ? " LONG" : "",
134 s->h263_plus ? " +" : "",
135 s->h263_aic ? " AIC" : "",
136 s->alt_inter_vlc ? " AIV" : "",
137 s->modified_quant ? " MQ" : "",
138 s->loop_filter ? " LOOP" : "",
139 s->h263_slice_structured ? " SS" : "",
140 s->avctx->time_base.den, s->avctx->time_base.num
146 static void aspect_to_info(MpegEncContext * s, AVRational aspect){
149 if(aspect.num==0) aspect= (AVRational){1,1};
152 if(av_cmp_q(pixel_aspect[i], aspect) == 0){
153 s->aspect_ratio_info=i;
158 s->aspect_ratio_info= FF_ASPECT_EXTENDED;
161 void ff_flv_encode_picture_header(MpegEncContext * s, int picture_number)
165 align_put_bits(&s->pb);
167 put_bits(&s->pb, 17, 1);
168 put_bits(&s->pb, 5, (s->h263_flv-1)); /* 0: h263 escape codes 1: 11-bit escape codes */
169 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->time_base.num) / //FIXME use timestamp
170 s->avctx->time_base.den) & 0xff); /* TemporalReference */
171 if (s->width == 352 && s->height == 288)
173 else if (s->width == 176 && s->height == 144)
175 else if (s->width == 128 && s->height == 96)
177 else if (s->width == 320 && s->height == 240)
179 else if (s->width == 160 && s->height == 120)
181 else if (s->width <= 255 && s->height <= 255)
182 format = 0; /* use 1 byte width & height */
184 format = 1; /* use 2 bytes width & height */
185 put_bits(&s->pb, 3, format); /* PictureSize */
187 put_bits(&s->pb, 8, s->width);
188 put_bits(&s->pb, 8, s->height);
189 } else if (format == 1) {
190 put_bits(&s->pb, 16, s->width);
191 put_bits(&s->pb, 16, s->height);
193 put_bits(&s->pb, 2, s->pict_type == FF_P_TYPE); /* PictureType */
194 put_bits(&s->pb, 1, 1); /* DeblockingFlag: on */
195 put_bits(&s->pb, 5, s->qscale); /* Quantizer */
196 put_bits(&s->pb, 1, 0); /* ExtraInformation */
200 s->c_dc_scale_table= ff_aic_dc_scale_table;
203 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
207 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
209 int format, coded_frame_rate, coded_frame_rate_base, i, temp_ref;
210 int best_clock_code=1;
212 int best_error= INT_MAX;
217 div= (s->avctx->time_base.num*1800000LL + 500LL*s->avctx->time_base.den) / ((1000LL+i)*s->avctx->time_base.den);
218 div= av_clip(div, 1, 127);
219 error= FFABS(s->avctx->time_base.num*1800000LL - (1000LL+i)*s->avctx->time_base.den*div);
220 if(error < best_error){
227 s->custom_pcf= best_clock_code!=1 || best_divisor!=60;
228 coded_frame_rate= 1800000;
229 coded_frame_rate_base= (1000+best_clock_code)*best_divisor;
231 align_put_bits(&s->pb);
233 /* Update the pointer to last GOB */
234 s->ptr_lastgob = put_bits_ptr(&s->pb);
235 put_bits(&s->pb, 22, 0x20); /* PSC */
236 temp_ref= s->picture_number * (int64_t)coded_frame_rate * s->avctx->time_base.num / //FIXME use timestamp
237 (coded_frame_rate_base * (int64_t)s->avctx->time_base.den);
238 put_sbits(&s->pb, 8, temp_ref); /* TemporalReference */
240 put_bits(&s->pb, 1, 1); /* marker */
241 put_bits(&s->pb, 1, 0); /* h263 id */
242 put_bits(&s->pb, 1, 0); /* split screen off */
243 put_bits(&s->pb, 1, 0); /* camera off */
244 put_bits(&s->pb, 1, 0); /* freeze picture release off */
246 format = h263_get_picture_format(s->width, s->height);
249 put_bits(&s->pb, 3, format);
250 put_bits(&s->pb, 1, (s->pict_type == FF_P_TYPE));
251 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
252 of H.263v1 UMV implies to check the predicted MV after
253 calculation of the current MB to see if we're on the limits */
254 put_bits(&s->pb, 1, 0); /* Unrestricted Motion Vector: off */
255 put_bits(&s->pb, 1, 0); /* SAC: off */
256 put_bits(&s->pb, 1, s->obmc); /* Advanced Prediction */
257 put_bits(&s->pb, 1, 0); /* only I/P frames, no PB frame */
258 put_bits(&s->pb, 5, s->qscale);
259 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
263 /* H.263 Plus PTYPE */
265 put_bits(&s->pb, 3, 7);
266 put_bits(&s->pb,3,ufep); /* Update Full Extended PTYPE */
268 put_bits(&s->pb,3,6); /* Custom Source Format */
270 put_bits(&s->pb, 3, format);
272 put_bits(&s->pb,1, s->custom_pcf);
273 put_bits(&s->pb,1, s->umvplus); /* Unrestricted Motion Vector */
274 put_bits(&s->pb,1,0); /* SAC: off */
275 put_bits(&s->pb,1,s->obmc); /* Advanced Prediction Mode */
276 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
277 put_bits(&s->pb,1,s->loop_filter); /* Deblocking Filter */
278 put_bits(&s->pb,1,s->h263_slice_structured); /* Slice Structured */
279 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
280 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
281 put_bits(&s->pb,1,s->alt_inter_vlc); /* Alternative Inter VLC */
282 put_bits(&s->pb,1,s->modified_quant); /* Modified Quantization: */
283 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
284 put_bits(&s->pb,3,0); /* Reserved */
286 put_bits(&s->pb, 3, s->pict_type == FF_P_TYPE);
288 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
289 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
290 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
291 put_bits(&s->pb,2,0); /* Reserved */
292 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
294 /* This should be here if PLUSPTYPE */
295 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
298 /* Custom Picture Format (CPFMT) */
299 aspect_to_info(s, s->avctx->sample_aspect_ratio);
301 put_bits(&s->pb,4,s->aspect_ratio_info);
302 put_bits(&s->pb,9,(s->width >> 2) - 1);
303 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
304 put_bits(&s->pb,9,(s->height >> 2));
305 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
306 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
307 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
312 put_bits(&s->pb, 1, best_clock_code);
313 put_bits(&s->pb, 7, best_divisor);
315 put_sbits(&s->pb, 2, temp_ref>>8);
318 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
320 // put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
321 //FIXME check actual requested range
322 put_bits(&s->pb,2,1); /* unlimited */
323 if(s->h263_slice_structured)
324 put_bits(&s->pb,2,0); /* no weird submodes */
326 put_bits(&s->pb, 5, s->qscale);
329 put_bits(&s->pb, 1, 0); /* no PEI */
331 if(s->h263_slice_structured){
332 put_bits(&s->pb, 1, 1);
334 assert(s->mb_x == 0 && s->mb_y == 0);
335 ff_h263_encode_mba(s);
337 put_bits(&s->pb, 1, 1);
342 s->c_dc_scale_table= ff_aic_dc_scale_table;
345 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
350 * Encodes a group of blocks header.
352 void h263_encode_gob_header(MpegEncContext * s, int mb_line)
354 put_bits(&s->pb, 17, 1); /* GBSC */
356 if(s->h263_slice_structured){
357 put_bits(&s->pb, 1, 1);
359 ff_h263_encode_mba(s);
362 put_bits(&s->pb, 1, 1);
363 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
364 put_bits(&s->pb, 1, 1);
365 put_bits(&s->pb, 2, s->pict_type == FF_I_TYPE); /* GFID */
367 int gob_number= mb_line / s->gob_index;
369 put_bits(&s->pb, 5, gob_number); /* GN */
370 put_bits(&s->pb, 2, s->pict_type == FF_I_TYPE); /* GFID */
371 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
375 static inline int get_block_rate(MpegEncContext * s, DCTELEM block[64], int block_last_index, uint8_t scantable[64]){
380 for(j=1; j<=block_last_index; j++){
381 const int index= scantable[j];
382 int level= block[index];
385 if((level&(~127)) == 0){
386 if(j<block_last_index) rate+= s->intra_ac_vlc_length [UNI_AC_ENC_INDEX(j-last-1, level)];
387 else rate+= s->intra_ac_vlc_last_length[UNI_AC_ENC_INDEX(j-last-1, level)];
389 rate += s->ac_esc_length;
398 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
402 int8_t * const qscale_table= s->current_picture.qscale_table;
404 memcpy(zigzag_last_index, s->block_last_index, sizeof(int)*6);
407 int16_t *ac_val, *ac_val1;
409 score -= get_block_rate(s, block[n], s->block_last_index[n], s->intra_scantable.permutated);
411 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
414 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
416 ac_val-= s->block_wrap[n]*16;
417 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
420 const int level= block[n][s->dsp.idct_permutation[i ]];
421 block[n][s->dsp.idct_permutation[i ]] = level - ac_val[i+8];
422 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
426 /* different qscale, we must rescale */
428 const int level= block[n][s->dsp.idct_permutation[i ]];
429 block[n][s->dsp.idct_permutation[i ]] = level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
430 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
434 st[n]= s->intra_h_scantable.permutated;
436 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
437 /* left prediction */
439 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
442 const int level= block[n][s->dsp.idct_permutation[i<<3]];
443 block[n][s->dsp.idct_permutation[i<<3]]= level - ac_val[i];
445 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
448 /* different qscale, we must rescale */
450 const int level= block[n][s->dsp.idct_permutation[i<<3]];
451 block[n][s->dsp.idct_permutation[i<<3]]= level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
453 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
456 st[n]= s->intra_v_scantable.permutated;
459 for(i=63; i>0; i--) //FIXME optimize
460 if(block[n][ st[n][i] ]) break;
461 s->block_last_index[n]= i;
463 score += get_block_rate(s, block[n], s->block_last_index[n], st[n]);
469 static inline void restore_ac_coeffs(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
472 memcpy(s->block_last_index, zigzag_last_index, sizeof(int)*6);
475 int16_t *ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
477 st[n]= s->intra_scantable.permutated;
481 block[n][s->dsp.idct_permutation[i ]] = ac_val[i+8];
484 /* left prediction */
486 block[n][s->dsp.idct_permutation[i<<3]]= ac_val[i ];
493 * modify qscale so that encoding is acually possible in h263 (limit difference to -2..2)
495 void ff_clean_h263_qscales(MpegEncContext *s){
497 int8_t * const qscale_table= s->current_picture.qscale_table;
499 ff_init_qscale_tab(s);
501 for(i=1; i<s->mb_num; i++){
502 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i-1] ] >2)
503 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i-1] ]+2;
505 for(i=s->mb_num-2; i>=0; i--){
506 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i+1] ] >2)
507 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i+1] ]+2;
510 if(s->codec_id != CODEC_ID_H263P){
511 for(i=1; i<s->mb_num; i++){
512 int mb_xy= s->mb_index2xy[i];
514 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_INTER4V)){
515 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_INTER;
522 * modify mb_type & qscale so that encoding is acually possible in mpeg4
524 void ff_clean_mpeg4_qscales(MpegEncContext *s){
526 int8_t * const qscale_table= s->current_picture.qscale_table;
528 ff_clean_h263_qscales(s);
530 if(s->pict_type== FF_B_TYPE){
532 /* ok, come on, this isn't funny anymore, there's more code for handling this mpeg4 mess than for the actual adaptive quantization */
534 for(i=0; i<s->mb_num; i++){
535 int mb_xy= s->mb_index2xy[i];
536 odd += qscale_table[mb_xy]&1;
539 if(2*odd > s->mb_num) odd=1;
542 for(i=0; i<s->mb_num; i++){
543 int mb_xy= s->mb_index2xy[i];
544 if((qscale_table[mb_xy]&1) != odd)
545 qscale_table[mb_xy]++;
546 if(qscale_table[mb_xy] > 31)
547 qscale_table[mb_xy]= 31;
550 for(i=1; i<s->mb_num; i++){
551 int mb_xy= s->mb_index2xy[i];
552 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_DIRECT)){
553 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_BIDIR;
559 #endif //CONFIG_ENCODERS
561 #define tab_size ((signed)FF_ARRAY_ELEMS(s->direct_scale_mv[0]))
562 #define tab_bias (tab_size/2)
564 void ff_mpeg4_init_direct_mv(MpegEncContext *s){
566 for(i=0; i<tab_size; i++){
567 s->direct_scale_mv[0][i] = (i-tab_bias)*s->pb_time/s->pp_time;
568 s->direct_scale_mv[1][i] = (i-tab_bias)*(s->pb_time-s->pp_time)/s->pp_time;
572 static inline void ff_mpeg4_set_one_direct_mv(MpegEncContext *s, int mx, int my, int i){
573 int xy= s->block_index[i];
574 uint16_t time_pp= s->pp_time;
575 uint16_t time_pb= s->pb_time;
578 p_mx= s->next_picture.motion_val[0][xy][0];
579 if((unsigned)(p_mx + tab_bias) < tab_size){
580 s->mv[0][i][0] = s->direct_scale_mv[0][p_mx + tab_bias] + mx;
581 s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx
582 : s->direct_scale_mv[1][p_mx + tab_bias];
584 s->mv[0][i][0] = p_mx*time_pb/time_pp + mx;
585 s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx
586 : p_mx*(time_pb - time_pp)/time_pp;
588 p_my= s->next_picture.motion_val[0][xy][1];
589 if((unsigned)(p_my + tab_bias) < tab_size){
590 s->mv[0][i][1] = s->direct_scale_mv[0][p_my + tab_bias] + my;
591 s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my
592 : s->direct_scale_mv[1][p_my + tab_bias];
594 s->mv[0][i][1] = p_my*time_pb/time_pp + my;
595 s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my
596 : p_my*(time_pb - time_pp)/time_pp;
605 * @return the mb_type
607 int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){
608 const int mb_index= s->mb_x + s->mb_y*s->mb_stride;
609 const int colocated_mb_type= s->next_picture.mb_type[mb_index];
614 //FIXME avoid divides
615 // try special case with shifts for 1 and 3 B-frames?
617 if(IS_8X8(colocated_mb_type)){
618 s->mv_type = MV_TYPE_8X8;
620 ff_mpeg4_set_one_direct_mv(s, mx, my, i);
622 return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_L0L1;
623 } else if(IS_INTERLACED(colocated_mb_type)){
624 s->mv_type = MV_TYPE_FIELD;
626 int field_select= s->next_picture.ref_index[0][s->block_index[2*i]];
627 s->field_select[0][i]= field_select;
628 s->field_select[1][i]= i;
629 if(s->top_field_first){
630 time_pp= s->pp_field_time - field_select + i;
631 time_pb= s->pb_field_time - field_select + i;
633 time_pp= s->pp_field_time + field_select - i;
634 time_pb= s->pb_field_time + field_select - i;
636 s->mv[0][i][0] = s->p_field_mv_table[i][0][mb_index][0]*time_pb/time_pp + mx;
637 s->mv[0][i][1] = s->p_field_mv_table[i][0][mb_index][1]*time_pb/time_pp + my;
638 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->p_field_mv_table[i][0][mb_index][0]
639 : s->p_field_mv_table[i][0][mb_index][0]*(time_pb - time_pp)/time_pp;
640 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->p_field_mv_table[i][0][mb_index][1]
641 : s->p_field_mv_table[i][0][mb_index][1]*(time_pb - time_pp)/time_pp;
643 return MB_TYPE_DIRECT2 | MB_TYPE_16x8 | MB_TYPE_L0L1 | MB_TYPE_INTERLACED;
645 ff_mpeg4_set_one_direct_mv(s, mx, my, 0);
646 s->mv[0][1][0] = s->mv[0][2][0] = s->mv[0][3][0] = s->mv[0][0][0];
647 s->mv[0][1][1] = s->mv[0][2][1] = s->mv[0][3][1] = s->mv[0][0][1];
648 s->mv[1][1][0] = s->mv[1][2][0] = s->mv[1][3][0] = s->mv[1][0][0];
649 s->mv[1][1][1] = s->mv[1][2][1] = s->mv[1][3][1] = s->mv[1][0][1];
650 if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample)
651 s->mv_type= MV_TYPE_16X16;
653 s->mv_type= MV_TYPE_8X8;
654 return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_L0L1; //Note see prev line
658 void ff_h263_update_motion_val(MpegEncContext * s){
659 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
660 //FIXME a lot of that is only needed for !low_delay
661 const int wrap = s->b8_stride;
662 const int xy = s->block_index[0];
664 s->current_picture.mbskip_table[mb_xy]= s->mb_skipped;
666 if(s->mv_type != MV_TYPE_8X8){
667 int motion_x, motion_y;
671 } else if (s->mv_type == MV_TYPE_16X16) {
672 motion_x = s->mv[0][0][0];
673 motion_y = s->mv[0][0][1];
674 } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {
676 motion_x = s->mv[0][0][0] + s->mv[0][1][0];
677 motion_y = s->mv[0][0][1] + s->mv[0][1][1];
678 motion_x = (motion_x>>1) | (motion_x&1);
680 s->p_field_mv_table[i][0][mb_xy][0]= s->mv[0][i][0];
681 s->p_field_mv_table[i][0][mb_xy][1]= s->mv[0][i][1];
683 s->current_picture.ref_index[0][xy ]=
684 s->current_picture.ref_index[0][xy + 1]= s->field_select[0][0];
685 s->current_picture.ref_index[0][xy + wrap ]=
686 s->current_picture.ref_index[0][xy + wrap + 1]= s->field_select[0][1];
689 /* no update if 8X8 because it has been done during parsing */
690 s->current_picture.motion_val[0][xy][0] = motion_x;
691 s->current_picture.motion_val[0][xy][1] = motion_y;
692 s->current_picture.motion_val[0][xy + 1][0] = motion_x;
693 s->current_picture.motion_val[0][xy + 1][1] = motion_y;
694 s->current_picture.motion_val[0][xy + wrap][0] = motion_x;
695 s->current_picture.motion_val[0][xy + wrap][1] = motion_y;
696 s->current_picture.motion_val[0][xy + 1 + wrap][0] = motion_x;
697 s->current_picture.motion_val[0][xy + 1 + wrap][1] = motion_y;
700 if(s->encoding){ //FIXME encoding MUST be cleaned up
701 if (s->mv_type == MV_TYPE_8X8)
702 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_8x8;
704 s->current_picture.mb_type[mb_xy]= MB_TYPE_INTRA;
706 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_16x16;
712 static inline int h263_get_motion_length(MpegEncContext * s, int val, int f_code){
713 int l, bit_size, code;
718 bit_size = f_code - 1;
719 /* modulo encoding */
720 l= INT_BIT - 6 - bit_size;
723 code = (val >> bit_size) + 1;
725 return mvtab[code][1] + 1 + bit_size;
729 static inline void ff_h263_encode_motion_vector(MpegEncContext * s, int x, int y, int f_code){
730 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
731 skip_put_bits(&s->pb,
732 h263_get_motion_length(s, x, f_code)
733 +h263_get_motion_length(s, y, f_code));
735 ff_h263_encode_motion(s, x, f_code);
736 ff_h263_encode_motion(s, y, f_code);
740 static inline int get_p_cbp(MpegEncContext * s,
741 DCTELEM block[6][64],
742 int motion_x, int motion_y){
745 if(s->flags & CODEC_FLAG_CBP_RD){
746 int best_cbpy_score= INT_MAX;
747 int best_cbpc_score= INT_MAX;
748 int cbpc = (-1), cbpy= (-1);
749 const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0);
750 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
753 int score= inter_MCBPC_bits[i + offset] * lambda;
754 if(i&1) score += s->coded_score[5];
755 if(i&2) score += s->coded_score[4];
757 if(score < best_cbpc_score){
758 best_cbpc_score= score;
764 int score= cbpy_tab[i ^ 0xF][1] * lambda;
765 if(i&1) score += s->coded_score[3];
766 if(i&2) score += s->coded_score[2];
767 if(i&4) score += s->coded_score[1];
768 if(i&8) score += s->coded_score[0];
770 if(score < best_cbpy_score){
771 best_cbpy_score= score;
776 if ((motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16){
777 if(best_cbpy_score + best_cbpc_score + 2*lambda >= 0)
781 for (i = 0; i < 6; i++) {
782 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
783 s->block_last_index[i]= -1;
784 s->dsp.clear_block(s->block[i]);
789 for (i = 0; i < 6; i++) {
790 if (s->block_last_index[i] >= 0)
797 static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64],
798 int motion_x, int motion_y, int mb_type){
801 if(s->flags & CODEC_FLAG_CBP_RD){
803 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
806 if(s->coded_score[i] < 0){
807 score += s->coded_score[i];
814 if ((motion_x | motion_y | s->dquant | mb_type) == 0){
815 zero_score-= 4; //2*MV + mb_type + cbp bit
819 if(zero_score <= score){
824 for (i = 0; i < 6; i++) {
825 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
826 s->block_last_index[i]= -1;
827 s->dsp.clear_block(s->block[i]);
831 for (i = 0; i < 6; i++) {
832 if (s->block_last_index[i] >= 0)
839 static inline void mpeg4_encode_blocks(MpegEncContext * s, DCTELEM block[6][64], int intra_dc[6],
840 uint8_t **scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb){
844 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
845 for (i = 0; i < 6; i++) {
846 skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, intra_dc[i], scan_table[i]));
849 /* encode each block */
850 for (i = 0; i < 6; i++) {
851 mpeg4_encode_block(s, block[i], i, intra_dc[i], scan_table[i], dc_pb, ac_pb);
855 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
856 for (i = 0; i < 6; i++) {
857 skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, 0, s->intra_scantable.permutated));
860 /* encode each block */
861 for (i = 0; i < 6; i++) {
862 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, dc_pb, ac_pb);
870 * encoding quantized level -> quantized diff
871 * decoding quantized diff -> quantized level
872 * @param n block index (0-3 are luma, 4-5 are chroma)
873 * @param dir_ptr pointer to an integer where the prediction direction will be stored
875 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding)
877 int a, b, c, wrap, pred, scale, ret;
880 /* find prediction */
882 scale = s->y_dc_scale;
884 scale = s->c_dc_scale;
889 wrap= s->block_wrap[n];
890 dc_val = s->dc_val[0] + s->block_index[n];
896 b = dc_val[ - 1 - wrap];
899 /* outside slice handling (we can't do that by memset as we need the dc for error resilience) */
900 if(s->first_slice_line && n!=3){
902 if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
904 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
905 if(n==0 || n==4 || n==5)
909 if (abs(a - b) < abs(b - c)) {
911 *dir_ptr = 1; /* top */
914 *dir_ptr = 0; /* left */
916 /* we assume pred is positive */
917 pred = FASTDIV((pred + (scale >> 1)), scale);
924 if(s->error_recognition>=3){
926 av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
929 if(level*scale > 2048 + scale){
930 av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
939 else if(!(s->workaround_bugs&FF_BUG_DC_CLIP))
947 static const int dquant_code[5]= {1,0,9,2,3};
949 void mpeg4_encode_mb(MpegEncContext * s,
950 DCTELEM block[6][64],
951 int motion_x, int motion_y)
953 int cbpc, cbpy, pred_x, pred_y;
954 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
955 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=FF_B_TYPE ? &s->tex_pb : &s->pb;
956 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=FF_I_TYPE ? &s->pb2 : &s->pb;
957 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
962 if(s->pict_type==FF_B_TYPE){
963 static const int mb_type_table[8]= {-1, 3, 2, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
964 int mb_type= mb_type_table[s->mv_dir];
971 s->last_mv[i][1][1]= 0;
975 assert(s->dquant>=-2 && s->dquant<=2);
976 assert((s->dquant&1)==0);
979 /* nothing to do if this MB was skipped in the next P Frame */
980 if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){ //FIXME avoid DCT & ...
986 s->mv_dir= MV_DIR_FORWARD; //doesn't matter
987 s->qscale -= s->dquant;
993 cbp= get_b_cbp(s, block, motion_x, motion_y, mb_type);
995 if ((cbp | motion_x | motion_y | mb_type) ==0) {
996 /* direct MB with MV={0,0} */
997 assert(s->dquant==0);
999 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
1001 if(interleaved_stats){
1009 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
1010 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
1011 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we don't need it :)
1012 if(cbp) put_bits(&s->pb, 6, cbp);
1016 put_bits(&s->pb, 2, (s->dquant>>2)+3);
1018 put_bits(&s->pb, 1, 0);
1020 s->qscale -= s->dquant;
1022 if(!s->progressive_sequence){
1024 put_bits(&s->pb, 1, s->interlaced_dct);
1025 if(mb_type) // not direct mode
1026 put_bits(&s->pb, 1, s->mv_type == MV_TYPE_FIELD);
1029 if(interleaved_stats){
1030 s->misc_bits+= get_bits_diff(s);
1034 assert(s->mv_dir & MV_DIRECT);
1035 ff_h263_encode_motion_vector(s, motion_x, motion_y, 1);
1039 assert(mb_type > 0 && mb_type < 4);
1040 if(s->mv_type != MV_TYPE_FIELD){
1041 if(s->mv_dir & MV_DIR_FORWARD){
1042 ff_h263_encode_motion_vector(s, s->mv[0][0][0] - s->last_mv[0][0][0],
1043 s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
1044 s->last_mv[0][0][0]= s->last_mv[0][1][0]= s->mv[0][0][0];
1045 s->last_mv[0][0][1]= s->last_mv[0][1][1]= s->mv[0][0][1];
1048 if(s->mv_dir & MV_DIR_BACKWARD){
1049 ff_h263_encode_motion_vector(s, s->mv[1][0][0] - s->last_mv[1][0][0],
1050 s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
1051 s->last_mv[1][0][0]= s->last_mv[1][1][0]= s->mv[1][0][0];
1052 s->last_mv[1][0][1]= s->last_mv[1][1][1]= s->mv[1][0][1];
1056 if(s->mv_dir & MV_DIR_FORWARD){
1057 put_bits(&s->pb, 1, s->field_select[0][0]);
1058 put_bits(&s->pb, 1, s->field_select[0][1]);
1060 if(s->mv_dir & MV_DIR_BACKWARD){
1061 put_bits(&s->pb, 1, s->field_select[1][0]);
1062 put_bits(&s->pb, 1, s->field_select[1][1]);
1064 if(s->mv_dir & MV_DIR_FORWARD){
1066 ff_h263_encode_motion_vector(s, s->mv[0][i][0] - s->last_mv[0][i][0] ,
1067 s->mv[0][i][1] - s->last_mv[0][i][1]/2, s->f_code);
1068 s->last_mv[0][i][0]= s->mv[0][i][0];
1069 s->last_mv[0][i][1]= s->mv[0][i][1]*2;
1073 if(s->mv_dir & MV_DIR_BACKWARD){
1075 ff_h263_encode_motion_vector(s, s->mv[1][i][0] - s->last_mv[1][i][0] ,
1076 s->mv[1][i][1] - s->last_mv[1][i][1]/2, s->b_code);
1077 s->last_mv[1][i][0]= s->mv[1][i][0];
1078 s->last_mv[1][i][1]= s->mv[1][i][1]*2;
1085 if(interleaved_stats){
1086 s->mv_bits+= get_bits_diff(s);
1089 mpeg4_encode_blocks(s, block, NULL, NULL, NULL, &s->pb);
1091 if(interleaved_stats){
1092 s->p_tex_bits+= get_bits_diff(s);
1095 }else{ /* s->pict_type==FF_B_TYPE */
1096 cbp= get_p_cbp(s, block, motion_x, motion_y);
1098 if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
1099 /* check if the B frames can skip it too, as we must skip it if we skip here
1100 why didn't they just compress the skip-mb bits instead of reusing them ?! */
1101 if(s->max_b_frames>0){
1108 if(x+16 > s->width) x= s->width-16;
1109 if(y+16 > s->height) y= s->height-16;
1111 offset= x + y*s->linesize;
1112 p_pic= s->new_picture.data[0] + offset;
1115 for(i=0; i<s->max_b_frames; i++){
1118 Picture *pic= s->reordered_input_picture[i+1];
1120 if(pic==NULL || pic->pict_type!=FF_B_TYPE) break;
1122 b_pic= pic->data[0] + offset;
1123 if(pic->type != FF_BUFFER_TYPE_SHARED)
1124 b_pic+= INPLACE_OFFSET;
1125 diff= s->dsp.sad[0](NULL, p_pic, b_pic, s->linesize, 16);
1126 if(diff>s->qscale*70){ //FIXME check that 70 is optimal
1134 if(s->mb_skipped==1){
1135 /* skip macroblock */
1136 put_bits(&s->pb, 1, 1);
1138 if(interleaved_stats){
1148 put_bits(&s->pb, 1, 0); /* mb coded */
1152 if(s->mv_type==MV_TYPE_16X16){
1153 if(s->dquant) cbpc+= 8;
1155 inter_MCBPC_bits[cbpc],
1156 inter_MCBPC_code[cbpc]);
1158 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1160 put_bits(pb2, 2, dquant_code[s->dquant+2]);
1162 if(!s->progressive_sequence){
1164 put_bits(pb2, 1, s->interlaced_dct);
1165 put_bits(pb2, 1, 0);
1168 if(interleaved_stats){
1169 s->misc_bits+= get_bits_diff(s);
1172 /* motion vectors: 16x16 mode */
1173 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1175 ff_h263_encode_motion_vector(s, motion_x - pred_x,
1176 motion_y - pred_y, s->f_code);
1177 }else if(s->mv_type==MV_TYPE_FIELD){
1178 if(s->dquant) cbpc+= 8;
1180 inter_MCBPC_bits[cbpc],
1181 inter_MCBPC_code[cbpc]);
1183 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1185 put_bits(pb2, 2, dquant_code[s->dquant+2]);
1187 assert(!s->progressive_sequence);
1189 put_bits(pb2, 1, s->interlaced_dct);
1190 put_bits(pb2, 1, 1);
1192 if(interleaved_stats){
1193 s->misc_bits+= get_bits_diff(s);
1196 /* motion vectors: 16x8 interlaced mode */
1197 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1200 put_bits(&s->pb, 1, s->field_select[0][0]);
1201 put_bits(&s->pb, 1, s->field_select[0][1]);
1203 ff_h263_encode_motion_vector(s, s->mv[0][0][0] - pred_x,
1204 s->mv[0][0][1] - pred_y, s->f_code);
1205 ff_h263_encode_motion_vector(s, s->mv[0][1][0] - pred_x,
1206 s->mv[0][1][1] - pred_y, s->f_code);
1208 assert(s->mv_type==MV_TYPE_8X8);
1210 inter_MCBPC_bits[cbpc+16],
1211 inter_MCBPC_code[cbpc+16]);
1212 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1214 if(!s->progressive_sequence){
1216 put_bits(pb2, 1, s->interlaced_dct);
1219 if(interleaved_stats){
1220 s->misc_bits+= get_bits_diff(s);
1224 /* motion vectors: 8x8 mode*/
1225 h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1227 ff_h263_encode_motion_vector(s, s->current_picture.motion_val[0][ s->block_index[i] ][0] - pred_x,
1228 s->current_picture.motion_val[0][ s->block_index[i] ][1] - pred_y, s->f_code);
1232 if(interleaved_stats){
1233 s->mv_bits+= get_bits_diff(s);
1236 mpeg4_encode_blocks(s, block, NULL, NULL, NULL, tex_pb);
1238 if(interleaved_stats){
1239 s->p_tex_bits+= get_bits_diff(s);
1245 int dc_diff[6]; //dc values with the dc prediction subtracted
1246 int dir[6]; //prediction direction
1247 int zigzag_last_index[6];
1248 uint8_t *scan_table[6];
1252 dc_diff[i]= ff_mpeg4_pred_dc(s, i, block[i][0], &dir[i], 1);
1255 if(s->flags & CODEC_FLAG_AC_PRED){
1256 s->ac_pred= decide_ac_pred(s, block, dir, scan_table, zigzag_last_index);
1258 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1261 scan_table[i]= s->intra_scantable.permutated;
1266 for (i = 0; i < 6; i++) {
1267 if (s->block_last_index[i] >= 1)
1268 cbp |= 1 << (5 - i);
1272 if (s->pict_type == FF_I_TYPE) {
1273 if(s->dquant) cbpc+=4;
1275 intra_MCBPC_bits[cbpc],
1276 intra_MCBPC_code[cbpc]);
1278 if(s->dquant) cbpc+=8;
1279 put_bits(&s->pb, 1, 0); /* mb coded */
1281 inter_MCBPC_bits[cbpc + 4],
1282 inter_MCBPC_code[cbpc + 4]);
1284 put_bits(pb2, 1, s->ac_pred);
1286 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1288 put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
1290 if(!s->progressive_sequence){
1291 put_bits(dc_pb, 1, s->interlaced_dct);
1294 if(interleaved_stats){
1295 s->misc_bits+= get_bits_diff(s);
1298 mpeg4_encode_blocks(s, block, dc_diff, scan_table, dc_pb, tex_pb);
1300 if(interleaved_stats){
1301 s->i_tex_bits+= get_bits_diff(s);
1305 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
1307 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1312 * encodes a 8x8 block.
1313 * @param block the 8x8 block
1314 * @param n block index (0-3 are luma, 4-5 are chroma)
1316 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
1318 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
1322 if (s->mb_intra && !s->h263_aic) {
1325 /* 255 cannot be represented, so we clamp */
1330 /* 0 cannot be represented also */
1331 else if (level < 1) {
1335 if (level == 128) //FIXME check rv10
1336 put_bits(&s->pb, 8, 0xff);
1338 put_bits(&s->pb, 8, level);
1342 if (s->h263_aic && s->mb_intra)
1345 if(s->alt_inter_vlc && !s->mb_intra){
1347 int inter_vlc_bits=0;
1351 last_index = s->block_last_index[n];
1352 last_non_zero = i - 1;
1353 for (; i <= last_index; i++) {
1354 j = s->intra_scantable.permutated[i];
1357 run = i - last_non_zero - 1;
1358 last = (i == last_index);
1360 if(level<0) level= -level;
1362 code = get_rl_index(rl, last, run, level);
1363 aic_code = get_rl_index(&rl_intra_aic, last, run, level);
1364 inter_vlc_bits += rl->table_vlc[code][1]+1;
1365 aic_vlc_bits += rl_intra_aic.table_vlc[aic_code][1]+1;
1367 if (code == rl->n) {
1368 inter_vlc_bits += 1+6+8-1;
1370 if (aic_code == rl_intra_aic.n) {
1371 aic_vlc_bits += 1+6+8-1;
1372 wrong_pos += run + 1;
1374 wrong_pos += wrong_run[aic_code];
1379 if(aic_vlc_bits < inter_vlc_bits && wrong_pos > 63)
1385 last_index = s->block_last_index[n];
1386 last_non_zero = i - 1;
1387 for (; i <= last_index; i++) {
1388 j = s->intra_scantable.permutated[i];
1391 run = i - last_non_zero - 1;
1392 last = (i == last_index);
1399 code = get_rl_index(rl, last, run, level);
1400 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1401 if (code == rl->n) {
1402 if(s->h263_flv <= 1){
1403 put_bits(&s->pb, 1, last);
1404 put_bits(&s->pb, 6, run);
1406 assert(slevel != 0);
1409 put_sbits(&s->pb, 8, slevel);
1411 put_bits(&s->pb, 8, 128);
1412 put_sbits(&s->pb, 5, slevel);
1413 put_sbits(&s->pb, 6, slevel>>5);
1416 if(level < 64) { // 7-bit level
1417 put_bits(&s->pb, 1, 0);
1418 put_bits(&s->pb, 1, last);
1419 put_bits(&s->pb, 6, run);
1421 put_sbits(&s->pb, 7, slevel);
1424 put_bits(&s->pb, 1, 1);
1425 put_bits(&s->pb, 1, last);
1426 put_bits(&s->pb, 6, run);
1428 put_sbits(&s->pb, 11, slevel);
1432 put_bits(&s->pb, 1, sign);
1439 /* Encode MV differences on H.263+ with Unrestricted MV mode */
1440 static void h263p_encode_umotion(MpegEncContext * s, int val)
1450 put_bits(&s->pb, 1, 1);
1452 put_bits(&s->pb, 3, 0);
1454 put_bits(&s->pb, 3, 2);
1457 sval = ((val < 0) ? (short)(-val):(short)val);
1460 while (temp_val != 0) {
1461 temp_val = temp_val >> 1;
1467 tcode = (sval & (1 << (i-1))) >> (i-1);
1468 tcode = (tcode << 1) | 1;
1469 code = (code << 2) | tcode;
1472 code = ((code << 1) | (val < 0)) << 1;
1473 put_bits(&s->pb, (2*n_bits)+1, code);
1477 static int h263_pred_dc(MpegEncContext * s, int n, int16_t **dc_val_ptr)
1479 int x, y, wrap, a, c, pred_dc;
1482 /* find prediction */
1484 x = 2 * s->mb_x + (n & 1);
1485 y = 2 * s->mb_y + ((n & 2) >> 1);
1486 wrap = s->b8_stride;
1487 dc_val = s->dc_val[0];
1491 wrap = s->mb_stride;
1492 dc_val = s->dc_val[n - 4 + 1];
1497 a = dc_val[(x - 1) + (y) * wrap];
1498 c = dc_val[(x) + (y - 1) * wrap];
1500 /* No prediction outside GOB boundary */
1501 if(s->first_slice_line && n!=3){
1503 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
1505 /* just DC prediction */
1506 if (a != 1024 && c != 1024)
1507 pred_dc = (a + c) >> 1;
1513 /* we assume pred is positive */
1514 *dc_val_ptr = &dc_val[x + y * wrap];
1518 void h263_encode_mb(MpegEncContext * s,
1519 DCTELEM block[6][64],
1520 int motion_x, int motion_y)
1522 int cbpc, cbpy, i, cbp, pred_x, pred_y;
1524 int16_t rec_intradc[6];
1526 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1);
1530 cbp= get_p_cbp(s, block, motion_x, motion_y);
1532 if ((cbp | motion_x | motion_y | s->dquant | (s->mv_type - MV_TYPE_16X16)) == 0) {
1533 /* skip macroblock */
1534 put_bits(&s->pb, 1, 1);
1535 if(interleaved_stats){
1543 put_bits(&s->pb, 1, 0); /* mb coded */
1547 if(s->alt_inter_vlc==0 || cbpc!=3)
1549 if(s->dquant) cbpc+= 8;
1550 if(s->mv_type==MV_TYPE_16X16){
1552 inter_MCBPC_bits[cbpc],
1553 inter_MCBPC_code[cbpc]);
1555 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1557 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1559 if(interleaved_stats){
1560 s->misc_bits+= get_bits_diff(s);
1563 /* motion vectors: 16x16 mode */
1564 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1567 ff_h263_encode_motion_vector(s, motion_x - pred_x,
1568 motion_y - pred_y, 1);
1571 h263p_encode_umotion(s, motion_x - pred_x);
1572 h263p_encode_umotion(s, motion_y - pred_y);
1573 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
1574 /* To prevent Start Code emulation */
1575 put_bits(&s->pb,1,1);
1579 inter_MCBPC_bits[cbpc+16],
1580 inter_MCBPC_code[cbpc+16]);
1581 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1583 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1585 if(interleaved_stats){
1586 s->misc_bits+= get_bits_diff(s);
1590 /* motion vectors: 8x8 mode*/
1591 h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1593 motion_x= s->current_picture.motion_val[0][ s->block_index[i] ][0];
1594 motion_y= s->current_picture.motion_val[0][ s->block_index[i] ][1];
1596 ff_h263_encode_motion_vector(s, motion_x - pred_x,
1597 motion_y - pred_y, 1);
1600 h263p_encode_umotion(s, motion_x - pred_x);
1601 h263p_encode_umotion(s, motion_y - pred_y);
1602 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
1603 /* To prevent Start Code emulation */
1604 put_bits(&s->pb,1,1);
1609 if(interleaved_stats){
1610 s->mv_bits+= get_bits_diff(s);
1613 assert(s->mb_intra);
1618 for(i=0; i<6; i++) {
1619 int16_t level = block[i][0];
1622 if(i<4) scale= s->y_dc_scale;
1623 else scale= s->c_dc_scale;
1625 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
1629 level = (level + (scale>>1))/scale;
1631 level = (level - (scale>>1))/scale;
1633 /* AIC can change CBP */
1634 if (level == 0 && s->block_last_index[i] == 0)
1635 s->block_last_index[i] = -1;
1637 if(!s->modified_quant){
1640 else if (level > 127)
1644 block[i][0] = level;
1645 /* Reconstruction */
1646 rec_intradc[i] = scale*level + pred_dc;
1648 rec_intradc[i] |= 1;
1649 //if ((rec_intradc[i] % 2) == 0)
1650 // rec_intradc[i]++;
1652 if (rec_intradc[i] < 0)
1654 else if (rec_intradc[i] > 2047)
1655 rec_intradc[i] = 2047;
1657 /* Update AC/DC tables */
1658 *dc_ptr[i] = rec_intradc[i];
1659 if (s->block_last_index[i] >= 0)
1660 cbp |= 1 << (5 - i);
1663 for(i=0; i<6; i++) {
1665 if (s->block_last_index[i] >= 1)
1666 cbp |= 1 << (5 - i);
1671 if (s->pict_type == FF_I_TYPE) {
1672 if(s->dquant) cbpc+=4;
1674 intra_MCBPC_bits[cbpc],
1675 intra_MCBPC_code[cbpc]);
1677 if(s->dquant) cbpc+=8;
1678 put_bits(&s->pb, 1, 0); /* mb coded */
1680 inter_MCBPC_bits[cbpc + 4],
1681 inter_MCBPC_code[cbpc + 4]);
1684 /* XXX: currently, we do not try to use ac prediction */
1685 put_bits(&s->pb, 1, 0); /* no AC prediction */
1688 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1690 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1692 if(interleaved_stats){
1693 s->misc_bits+= get_bits_diff(s);
1697 for(i=0; i<6; i++) {
1698 /* encode each block */
1699 h263_encode_block(s, block[i], i);
1701 /* Update INTRADC for decoding */
1702 if (s->h263_aic && s->mb_intra) {
1703 block[i][0] = rec_intradc[i];
1708 if(interleaved_stats){
1710 s->p_tex_bits+= get_bits_diff(s);
1713 s->i_tex_bits+= get_bits_diff(s);
1720 void ff_h263_loop_filter(MpegEncContext * s){
1722 const int linesize = s->linesize;
1723 const int uvlinesize= s->uvlinesize;
1724 const int xy = s->mb_y * s->mb_stride + s->mb_x;
1725 uint8_t *dest_y = s->dest[0];
1726 uint8_t *dest_cb= s->dest[1];
1727 uint8_t *dest_cr= s->dest[2];
1729 // if(s->pict_type==FF_B_TYPE && !s->readable) return;
1735 if(!IS_SKIP(s->current_picture.mb_type[xy])){
1737 s->dsp.h263_v_loop_filter(dest_y+8*linesize , linesize, qp_c);
1738 s->dsp.h263_v_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
1743 int qp_dt, qp_tt, qp_tc;
1745 if(IS_SKIP(s->current_picture.mb_type[xy-s->mb_stride]))
1748 qp_tt= s->current_picture.qscale_table[xy-s->mb_stride];
1756 const int chroma_qp= s->chroma_qscale_table[qp_tc];
1757 s->dsp.h263_v_loop_filter(dest_y , linesize, qp_tc);
1758 s->dsp.h263_v_loop_filter(dest_y+8, linesize, qp_tc);
1760 s->dsp.h263_v_loop_filter(dest_cb , uvlinesize, chroma_qp);
1761 s->dsp.h263_v_loop_filter(dest_cr , uvlinesize, chroma_qp);
1765 s->dsp.h263_h_loop_filter(dest_y-8*linesize+8 , linesize, qp_tt);
1768 if(qp_tt || IS_SKIP(s->current_picture.mb_type[xy-1-s->mb_stride]))
1771 qp_dt= s->current_picture.qscale_table[xy-1-s->mb_stride];
1774 const int chroma_qp= s->chroma_qscale_table[qp_dt];
1775 s->dsp.h263_h_loop_filter(dest_y -8*linesize , linesize, qp_dt);
1776 s->dsp.h263_h_loop_filter(dest_cb-8*uvlinesize, uvlinesize, chroma_qp);
1777 s->dsp.h263_h_loop_filter(dest_cr-8*uvlinesize, uvlinesize, chroma_qp);
1783 s->dsp.h263_h_loop_filter(dest_y +8, linesize, qp_c);
1784 if(s->mb_y + 1 == s->mb_height)
1785 s->dsp.h263_h_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
1790 if(qp_c || IS_SKIP(s->current_picture.mb_type[xy-1]))
1793 qp_lc= s->current_picture.qscale_table[xy-1];
1796 s->dsp.h263_h_loop_filter(dest_y, linesize, qp_lc);
1797 if(s->mb_y + 1 == s->mb_height){
1798 const int chroma_qp= s->chroma_qscale_table[qp_lc];
1799 s->dsp.h263_h_loop_filter(dest_y +8* linesize, linesize, qp_lc);
1800 s->dsp.h263_h_loop_filter(dest_cb , uvlinesize, chroma_qp);
1801 s->dsp.h263_h_loop_filter(dest_cr , uvlinesize, chroma_qp);
1807 static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n)
1809 int x, y, wrap, a, c, pred_dc, scale, i;
1810 int16_t *dc_val, *ac_val, *ac_val1;
1812 /* find prediction */
1814 x = 2 * s->mb_x + (n & 1);
1815 y = 2 * s->mb_y + (n>> 1);
1816 wrap = s->b8_stride;
1817 dc_val = s->dc_val[0];
1818 ac_val = s->ac_val[0][0];
1819 scale = s->y_dc_scale;
1823 wrap = s->mb_stride;
1824 dc_val = s->dc_val[n - 4 + 1];
1825 ac_val = s->ac_val[n - 4 + 1][0];
1826 scale = s->c_dc_scale;
1829 ac_val += ((y) * wrap + (x)) * 16;
1835 a = dc_val[(x - 1) + (y) * wrap];
1836 c = dc_val[(x) + (y - 1) * wrap];
1838 /* No prediction outside GOB boundary */
1839 if(s->first_slice_line && n!=3){
1841 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
1846 if (s->h263_aic_dir) {
1847 /* left prediction */
1851 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
1856 /* top prediction */
1858 ac_val -= 16 * wrap;
1860 block[s->dsp.idct_permutation[i ]] += ac_val[i + 8];
1866 /* just DC prediction */
1867 if (a != 1024 && c != 1024)
1868 pred_dc = (a + c) >> 1;
1875 /* we assume pred is positive */
1876 block[0]=block[0]*scale + pred_dc;
1883 /* Update AC/DC tables */
1884 dc_val[(x) + (y) * wrap] = block[0];
1888 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
1891 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
1894 int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir,
1898 int16_t *A, *B, *C, (*mot_val)[2];
1899 static const int off[4]= {2, 1, 1, -1};
1901 wrap = s->b8_stride;
1902 mot_val = s->current_picture.motion_val[dir] + s->block_index[block];
1905 /* special case for first (slice) line */
1906 if (s->first_slice_line && block<3) {
1907 // we can't just change some MVs to simulate that as we need them for the B frames (and ME)
1908 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
1909 if(block==0){ //most common case
1910 if(s->mb_x == s->resync_mb_x){ //rare
1912 }else if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
1913 C = mot_val[off[block] - wrap];
1918 *px = mid_pred(A[0], 0, C[0]);
1919 *py = mid_pred(A[1], 0, C[1]);
1926 if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
1927 C = mot_val[off[block] - wrap];
1928 *px = mid_pred(A[0], 0, C[0]);
1929 *py = mid_pred(A[1], 0, C[1]);
1934 }else{ /* block==2*/
1935 B = mot_val[ - wrap];
1936 C = mot_val[off[block] - wrap];
1937 if(s->mb_x == s->resync_mb_x) //rare
1940 *px = mid_pred(A[0], B[0], C[0]);
1941 *py = mid_pred(A[1], B[1], C[1]);
1944 B = mot_val[ - wrap];
1945 C = mot_val[off[block] - wrap];
1946 *px = mid_pred(A[0], B[0], C[0]);
1947 *py = mid_pred(A[1], B[1], C[1]);
1953 void ff_h263_encode_motion(MpegEncContext * s, int val, int f_code)
1955 int range, l, bit_size, sign, code, bits;
1960 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1962 bit_size = f_code - 1;
1963 range = 1 << bit_size;
1964 /* modulo encoding */
1965 l= INT_BIT - 6 - bit_size;
1968 val= (val^sign)-sign;
1972 code = (val >> bit_size) + 1;
1973 bits = val & (range - 1);
1975 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1977 put_bits(&s->pb, bit_size, bits);
1982 static void init_mv_penalty_and_fcode(MpegEncContext *s)
1987 for(f_code=1; f_code<=MAX_FCODE; f_code++){
1988 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
1991 if(mv==0) len= mvtab[0][1];
1993 int val, bit_size, code;
1995 bit_size = f_code - 1;
2001 code = (val >> bit_size) + 1;
2003 len= mvtab[code][1] + 1 + bit_size;
2005 len= mvtab[32][1] + av_log2(code>>5) + 2 + bit_size;
2009 mv_penalty[f_code][mv+MAX_MV]= len;
2013 for(f_code=MAX_FCODE; f_code>0; f_code--){
2014 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
2015 fcode_tab[mv+MAX_MV]= f_code;
2019 for(mv=0; mv<MAX_MV*2+1; mv++){
2020 umv_fcode_tab[mv]= 1;
2024 static void init_uni_dc_tab(void)
2026 int level, uni_code, uni_len;
2028 for(level=-256; level<256; level++){
2030 /* find number of bits */
2039 l= (-level) ^ ((1 << size) - 1);
2044 uni_code= DCtab_lum[size][0];
2045 uni_len = DCtab_lum[size][1];
2048 uni_code<<=size; uni_code|=l;
2051 uni_code<<=1; uni_code|=1;
2055 uni_DCtab_lum_bits[level+256]= uni_code;
2056 uni_DCtab_lum_len [level+256]= uni_len;
2059 uni_code= DCtab_chrom[size][0];
2060 uni_len = DCtab_chrom[size][1];
2063 uni_code<<=size; uni_code|=l;
2066 uni_code<<=1; uni_code|=1;
2070 uni_DCtab_chrom_bits[level+256]= uni_code;
2071 uni_DCtab_chrom_len [level+256]= uni_len;
2076 static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
2077 int slevel, run, last;
2079 assert(MAX_LEVEL >= 64);
2080 assert(MAX_RUN >= 63);
2082 for(slevel=-64; slevel<64; slevel++){
2083 if(slevel==0) continue;
2084 for(run=0; run<64; run++){
2085 for(last=0; last<=1; last++){
2086 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
2087 int level= slevel < 0 ? -slevel : slevel;
2088 int sign= slevel < 0 ? 1 : 0;
2089 int bits, len, code;
2092 len_tab[index]= 100;
2095 code= get_rl_index(rl, last, run, level);
2096 bits= rl->table_vlc[code][0];
2097 len= rl->table_vlc[code][1];
2098 bits=bits*2+sign; len++;
2100 if(code!=rl->n && len < len_tab[index]){
2101 bits_tab[index]= bits;
2102 len_tab [index]= len;
2105 bits= rl->table_vlc[rl->n][0];
2106 len= rl->table_vlc[rl->n][1];
2107 bits=bits*2; len++; //esc1
2108 level1= level - rl->max_level[last][run];
2110 code= get_rl_index(rl, last, run, level1);
2111 bits<<= rl->table_vlc[code][1];
2112 len += rl->table_vlc[code][1];
2113 bits += rl->table_vlc[code][0];
2114 bits=bits*2+sign; len++;
2116 if(code!=rl->n && len < len_tab[index]){
2117 bits_tab[index]= bits;
2118 len_tab [index]= len;
2122 bits= rl->table_vlc[rl->n][0];
2123 len= rl->table_vlc[rl->n][1];
2124 bits=bits*4+2; len+=2; //esc2
2125 run1 = run - rl->max_run[last][level] - 1;
2127 code= get_rl_index(rl, last, run1, level);
2128 bits<<= rl->table_vlc[code][1];
2129 len += rl->table_vlc[code][1];
2130 bits += rl->table_vlc[code][0];
2131 bits=bits*2+sign; len++;
2133 if(code!=rl->n && len < len_tab[index]){
2134 bits_tab[index]= bits;
2135 len_tab [index]= len;
2139 bits= rl->table_vlc[rl->n][0];
2140 len = rl->table_vlc[rl->n][1];
2141 bits=bits*4+3; len+=2; //esc3
2142 bits=bits*2+last; len++;
2143 bits=bits*64+run; len+=6;
2144 bits=bits*2+1; len++; //marker
2145 bits=bits*4096+(slevel&0xfff); len+=12;
2146 bits=bits*2+1; len++; //marker
2148 if(len < len_tab[index]){
2149 bits_tab[index]= bits;
2150 len_tab [index]= len;
2157 static void init_uni_h263_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
2158 int slevel, run, last;
2160 assert(MAX_LEVEL >= 64);
2161 assert(MAX_RUN >= 63);
2163 for(slevel=-64; slevel<64; slevel++){
2164 if(slevel==0) continue;
2165 for(run=0; run<64; run++){
2166 for(last=0; last<=1; last++){
2167 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
2168 int level= slevel < 0 ? -slevel : slevel;
2169 int sign= slevel < 0 ? 1 : 0;
2170 int bits, len, code;
2172 len_tab[index]= 100;
2175 code= get_rl_index(rl, last, run, level);
2176 bits= rl->table_vlc[code][0];
2177 len= rl->table_vlc[code][1];
2178 bits=bits*2+sign; len++;
2180 if(code!=rl->n && len < len_tab[index]){
2181 if(bits_tab) bits_tab[index]= bits;
2182 len_tab [index]= len;
2185 bits= rl->table_vlc[rl->n][0];
2186 len = rl->table_vlc[rl->n][1];
2187 bits=bits*2+last; len++;
2188 bits=bits*64+run; len+=6;
2189 bits=bits*256+(level&0xff); len+=8;
2191 if(len < len_tab[index]){
2192 if(bits_tab) bits_tab[index]= bits;
2193 len_tab [index]= len;
2200 void h263_encode_init(MpegEncContext *s)
2202 static int done = 0;
2209 init_rl(&rl_inter, static_rl_table_store[0]);
2210 init_rl(&rl_intra, static_rl_table_store[1]);
2211 init_rl(&rl_intra_aic, static_rl_table_store[2]);
2213 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
2214 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
2216 init_uni_h263_rl_tab(&rl_intra_aic, NULL, uni_h263_intra_aic_rl_len);
2217 init_uni_h263_rl_tab(&rl_inter , NULL, uni_h263_inter_rl_len);
2219 init_mv_penalty_and_fcode(s);
2221 s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
2223 s->intra_ac_vlc_length =s->inter_ac_vlc_length = uni_h263_inter_rl_len;
2224 s->intra_ac_vlc_last_length=s->inter_ac_vlc_last_length= uni_h263_inter_rl_len + 128*64;
2226 s->intra_ac_vlc_length = uni_h263_intra_aic_rl_len;
2227 s->intra_ac_vlc_last_length= uni_h263_intra_aic_rl_len + 128*64;
2229 s->ac_esc_length= 7+1+6+8;
2231 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
2232 switch(s->codec_id){
2233 case CODEC_ID_MPEG4:
2234 s->fcode_tab= fcode_tab;
2235 s->min_qcoeff= -2048;
2236 s->max_qcoeff= 2047;
2237 s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len;
2238 s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64;
2239 s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len;
2240 s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64;
2241 s->luma_dc_vlc_length= uni_DCtab_lum_len;
2242 s->chroma_dc_vlc_length= uni_DCtab_chrom_len;
2243 s->ac_esc_length= 7+2+1+6+1+12+1;
2244 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
2245 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
2247 if(s->flags & CODEC_FLAG_GLOBAL_HEADER){
2249 s->avctx->extradata= av_malloc(1024);
2250 init_put_bits(&s->pb, s->avctx->extradata, 1024);
2252 if(!(s->workaround_bugs & FF_BUG_MS))
2253 mpeg4_encode_visual_object_header(s);
2254 mpeg4_encode_vol_header(s, 0, 0);
2256 // ff_mpeg4_stuffing(&s->pb); ?
2257 flush_put_bits(&s->pb);
2258 s->avctx->extradata_size= (put_bits_count(&s->pb)+7)>>3;
2262 case CODEC_ID_H263P:
2264 s->fcode_tab= umv_fcode_tab;
2265 if(s->modified_quant){
2266 s->min_qcoeff= -2047;
2267 s->max_qcoeff= 2047;
2269 s->min_qcoeff= -127;
2273 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
2275 if (s->h263_flv > 1) {
2276 s->min_qcoeff= -1023;
2277 s->max_qcoeff= 1023;
2279 s->min_qcoeff= -127;
2282 s->y_dc_scale_table=
2283 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
2285 default: //nothing needed - default table already set in mpegvideo.c
2286 s->min_qcoeff= -127;
2288 s->y_dc_scale_table=
2289 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
2293 /***************************************************/
2295 * add mpeg4 stuffing bits (01...1)
2297 void ff_mpeg4_stuffing(PutBitContext * pbc)
2300 put_bits(pbc, 1, 0);
2301 length= (-put_bits_count(pbc))&7;
2302 if(length) put_bits(pbc, length, (1<<length)-1);
2305 /* must be called before writing the header */
2306 void ff_set_mpeg4_time(MpegEncContext * s){
2307 if(s->pict_type==FF_B_TYPE){
2308 ff_mpeg4_init_direct_mv(s);
2310 s->last_time_base= s->time_base;
2311 s->time_base= s->time/s->avctx->time_base.den;
2315 static void mpeg4_encode_gop_header(MpegEncContext * s){
2316 int hours, minutes, seconds;
2319 put_bits(&s->pb, 16, 0);
2320 put_bits(&s->pb, 16, GOP_STARTCODE);
2322 time= s->current_picture_ptr->pts;
2323 if(s->reordered_input_picture[1])
2324 time= FFMIN(time, s->reordered_input_picture[1]->pts);
2325 time= time*s->avctx->time_base.num;
2327 seconds= time/s->avctx->time_base.den;
2328 minutes= seconds/60; seconds %= 60;
2329 hours= minutes/60; minutes %= 60;
2332 put_bits(&s->pb, 5, hours);
2333 put_bits(&s->pb, 6, minutes);
2334 put_bits(&s->pb, 1, 1);
2335 put_bits(&s->pb, 6, seconds);
2337 put_bits(&s->pb, 1, !!(s->flags&CODEC_FLAG_CLOSED_GOP));
2338 put_bits(&s->pb, 1, 0); //broken link == NO
2340 s->last_time_base= time / s->avctx->time_base.den;
2342 ff_mpeg4_stuffing(&s->pb);
2345 static void mpeg4_encode_visual_object_header(MpegEncContext * s){
2346 int profile_and_level_indication;
2349 if(s->avctx->profile != FF_PROFILE_UNKNOWN){
2350 profile_and_level_indication = s->avctx->profile << 4;
2351 }else if(s->max_b_frames || s->quarter_sample){
2352 profile_and_level_indication= 0xF0; // adv simple
2354 profile_and_level_indication= 0x00; // simple
2357 if(s->avctx->level != FF_LEVEL_UNKNOWN){
2358 profile_and_level_indication |= s->avctx->level;
2360 profile_and_level_indication |= 1; //level 1
2363 if(profile_and_level_indication>>4 == 0xF){
2371 put_bits(&s->pb, 16, 0);
2372 put_bits(&s->pb, 16, VOS_STARTCODE);
2374 put_bits(&s->pb, 8, profile_and_level_indication);
2376 put_bits(&s->pb, 16, 0);
2377 put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);
2379 put_bits(&s->pb, 1, 1);
2380 put_bits(&s->pb, 4, vo_ver_id);
2381 put_bits(&s->pb, 3, 1); //priority
2383 put_bits(&s->pb, 4, 1); //visual obj type== video obj
2385 put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME
2387 ff_mpeg4_stuffing(&s->pb);
2390 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number)
2394 if (!CONFIG_MPEG4_ENCODER) return;
2396 if(s->max_b_frames || s->quarter_sample){
2398 s->vo_type= ADV_SIMPLE_VO_TYPE;
2401 s->vo_type= SIMPLE_VO_TYPE;
2404 put_bits(&s->pb, 16, 0);
2405 put_bits(&s->pb, 16, 0x100 + vo_number); /* video obj */
2406 put_bits(&s->pb, 16, 0);
2407 put_bits(&s->pb, 16, 0x120 + vol_number); /* video obj layer */
2409 put_bits(&s->pb, 1, 0); /* random access vol */
2410 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
2411 if(s->workaround_bugs & FF_BUG_MS) {
2412 put_bits(&s->pb, 1, 0); /* is obj layer id= no */
2414 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
2415 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
2416 put_bits(&s->pb, 3, 1); /* is obj layer priority */
2419 aspect_to_info(s, s->avctx->sample_aspect_ratio);
2421 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
2422 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
2423 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
2424 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
2427 if(s->workaround_bugs & FF_BUG_MS) { //
2428 put_bits(&s->pb, 1, 0); /* vol control parameters= no @@@ */
2430 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
2431 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
2432 put_bits(&s->pb, 1, s->low_delay);
2433 put_bits(&s->pb, 1, 0); /* vbv parameters= no */
2436 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
2437 put_bits(&s->pb, 1, 1); /* marker bit */
2439 put_bits(&s->pb, 16, s->avctx->time_base.den);
2440 if (s->time_increment_bits < 1)
2441 s->time_increment_bits = 1;
2442 put_bits(&s->pb, 1, 1); /* marker bit */
2443 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
2444 put_bits(&s->pb, 1, 1); /* marker bit */
2445 put_bits(&s->pb, 13, s->width); /* vol width */
2446 put_bits(&s->pb, 1, 1); /* marker bit */
2447 put_bits(&s->pb, 13, s->height); /* vol height */
2448 put_bits(&s->pb, 1, 1); /* marker bit */
2449 put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
2450 put_bits(&s->pb, 1, 1); /* obmc disable */
2451 if (vo_ver_id == 1) {
2452 put_bits(&s->pb, 1, s->vol_sprite_usage); /* sprite enable */
2454 put_bits(&s->pb, 2, s->vol_sprite_usage); /* sprite enable */
2457 put_bits(&s->pb, 1, 0); /* not 8 bit == false */
2458 put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
2461 ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix);
2462 ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix);
2466 put_bits(&s->pb, 1, s->quarter_sample);
2467 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
2468 s->resync_marker= s->rtp_mode;
2469 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
2470 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
2471 if(s->data_partitioning){
2472 put_bits(&s->pb, 1, 0); /* no rvlc */
2475 if (vo_ver_id != 1){
2476 put_bits(&s->pb, 1, 0); /* newpred */
2477 put_bits(&s->pb, 1, 0); /* reduced res vop */
2479 put_bits(&s->pb, 1, 0); /* scalability */
2481 ff_mpeg4_stuffing(&s->pb);
2484 if(!(s->flags & CODEC_FLAG_BITEXACT)){
2485 put_bits(&s->pb, 16, 0);
2486 put_bits(&s->pb, 16, 0x1B2); /* user_data */
2487 ff_put_string(&s->pb, LIBAVCODEC_IDENT, 0);
2491 /* write mpeg4 VOP header */
2492 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
2495 int time_div, time_mod;
2497 if(s->pict_type==FF_I_TYPE){
2498 if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
2499 if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT) //HACK, the reference sw is buggy
2500 mpeg4_encode_visual_object_header(s);
2501 if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT || picture_number==0) //HACK, the reference sw is buggy
2502 mpeg4_encode_vol_header(s, 0, 0);
2504 if(!(s->workaround_bugs & FF_BUG_MS))
2505 mpeg4_encode_gop_header(s);
2508 s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE;
2510 put_bits(&s->pb, 16, 0); /* vop header */
2511 put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */
2512 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
2515 time_div= s->time/s->avctx->time_base.den;
2516 time_mod= s->time%s->avctx->time_base.den;
2517 time_incr= time_div - s->last_time_base;
2518 assert(time_incr >= 0);
2520 put_bits(&s->pb, 1, 1);
2522 put_bits(&s->pb, 1, 0);
2524 put_bits(&s->pb, 1, 1); /* marker */
2525 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
2526 put_bits(&s->pb, 1, 1); /* marker */
2527 put_bits(&s->pb, 1, 1); /* vop coded */
2528 if ( s->pict_type == FF_P_TYPE
2529 || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
2530 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
2532 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
2533 if(!s->progressive_sequence){
2534 put_bits(&s->pb, 1, s->current_picture_ptr->top_field_first);
2535 put_bits(&s->pb, 1, s->alternate_scan);
2537 //FIXME sprite stuff
2539 put_bits(&s->pb, 5, s->qscale);
2541 if (s->pict_type != FF_I_TYPE)
2542 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
2543 if (s->pict_type == FF_B_TYPE)
2544 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
2547 #endif //CONFIG_ENCODERS
2551 * @param n block index (0-3 are luma, 4-5 are chroma)
2552 * @param dir the ac prediction direction
2554 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
2558 int16_t *ac_val, *ac_val1;
2559 int8_t * const qscale_table= s->current_picture.qscale_table;
2561 /* find prediction */
2562 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2566 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
2567 /* left prediction */
2570 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
2573 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
2576 /* different qscale, we must rescale */
2578 block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
2582 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
2583 /* top prediction */
2584 ac_val -= 16 * s->block_wrap[n];
2586 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
2589 block[s->dsp.idct_permutation[i]] += ac_val[i + 8];
2592 /* different qscale, we must rescale */
2594 block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
2601 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
2605 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
2612 * encodes the dc value.
2613 * @param n block index (0-3 are luma, 4-5 are chroma)
2615 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
2621 put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]);
2624 put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]);
2628 /* find number of bits */
2638 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
2641 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
2644 /* encode remaining bits */
2647 level = (-level) ^ ((1 << size) - 1);
2648 put_bits(&s->pb, size, level);
2650 put_bits(&s->pb, 1, 1);
2655 static inline int mpeg4_get_dc_length(int level, int n){
2657 return uni_DCtab_lum_len[level + 256];
2659 return uni_DCtab_chrom_len[level + 256];
2664 * encodes a 8x8 block
2665 * @param n block index (0-3 are luma, 4-5 are chroma)
2667 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2668 uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
2670 int i, last_non_zero;
2671 #if 0 //variables for the outcommented version
2672 int code, sign, last;
2677 const int last_index = s->block_last_index[n];
2679 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2680 /* mpeg4 based DC predictor */
2681 mpeg4_encode_dc(dc_pb, intra_dc, n);
2682 if(last_index<1) return;
2685 bits_tab= uni_mpeg4_intra_rl_bits;
2686 len_tab = uni_mpeg4_intra_rl_len;
2688 if(last_index<0) return;
2691 bits_tab= uni_mpeg4_inter_rl_bits;
2692 len_tab = uni_mpeg4_inter_rl_len;
2696 last_non_zero = i - 1;
2698 for (; i < last_index; i++) {
2699 int level = block[ scan_table[i] ];
2701 int run = i - last_non_zero - 1;
2703 if((level&(~127)) == 0){
2704 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2705 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2707 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);
2712 /*if(i<=last_index)*/{
2713 int level = block[ scan_table[i] ];
2714 int run = i - last_non_zero - 1;
2716 if((level&(~127)) == 0){
2717 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2718 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2720 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);
2724 for (; i <= last_index; i++) {
2725 const int slevel = block[ scan_table[i] ];
2728 int run = i - last_non_zero - 1;
2729 last = (i == last_index);
2736 code = get_rl_index(rl, last, run, level);
2737 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2738 if (code == rl->n) {
2740 level1 = level - rl->max_level[last][run];
2743 code = get_rl_index(rl, last, run, level1);
2744 if (code == rl->n) {
2746 put_bits(ac_pb, 1, 1);
2747 if (level > MAX_LEVEL)
2749 run1 = run - rl->max_run[last][level] - 1;
2752 code = get_rl_index(rl, last, run1, level);
2753 if (code == rl->n) {
2756 put_bits(ac_pb, 1, 1);
2757 put_bits(ac_pb, 1, last);
2758 put_bits(ac_pb, 6, run);
2759 put_bits(ac_pb, 1, 1);
2760 put_sbits(ac_pb, 12, slevel);
2761 put_bits(ac_pb, 1, 1);
2764 put_bits(ac_pb, 1, 0);
2765 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2766 put_bits(ac_pb, 1, sign);
2770 put_bits(ac_pb, 1, 0);
2771 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2772 put_bits(ac_pb, 1, sign);
2775 put_bits(ac_pb, 1, sign);
2783 static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2784 uint8_t *scan_table)
2786 int i, last_non_zero;
2788 const int last_index = s->block_last_index[n];
2791 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2792 /* mpeg4 based DC predictor */
2793 len += mpeg4_get_dc_length(intra_dc, n);
2794 if(last_index<1) return len;
2796 len_tab = uni_mpeg4_intra_rl_len;
2798 if(last_index<0) return 0;
2800 len_tab = uni_mpeg4_inter_rl_len;
2804 last_non_zero = i - 1;
2805 for (; i < last_index; i++) {
2806 int level = block[ scan_table[i] ];
2808 int run = i - last_non_zero - 1;
2810 if((level&(~127)) == 0){
2811 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2812 len += len_tab[index];
2814 len += 7+2+1+6+1+12+1;
2819 /*if(i<=last_index)*/{
2820 int level = block[ scan_table[i] ];
2821 int run = i - last_non_zero - 1;
2823 if((level&(~127)) == 0){
2824 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2825 len += len_tab[index];
2827 len += 7+2+1+6+1+12+1;
2837 /***********************************************/
2840 static VLC intra_MCBPC_vlc;
2841 static VLC inter_MCBPC_vlc;
2842 static VLC cbpy_vlc;
2844 static VLC dc_lum, dc_chrom;
2845 static VLC sprite_trajectory;
2846 static VLC mb_type_b_vlc;
2847 static VLC h263_mbtype_b_vlc;
2848 static VLC cbpc_b_vlc;
2852 /* XXX: find a better solution to handle static init */
2853 void h263_decode_init_vlc(MpegEncContext *s)
2855 static int done = 0;
2860 INIT_VLC_STATIC(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 9,
2861 intra_MCBPC_bits, 1, 1,
2862 intra_MCBPC_code, 1, 1, 72);
2863 INIT_VLC_STATIC(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 28,
2864 inter_MCBPC_bits, 1, 1,
2865 inter_MCBPC_code, 1, 1, 198);
2866 INIT_VLC_STATIC(&cbpy_vlc, CBPY_VLC_BITS, 16,
2867 &cbpy_tab[0][1], 2, 1,
2868 &cbpy_tab[0][0], 2, 1, 64);
2869 INIT_VLC_STATIC(&mv_vlc, MV_VLC_BITS, 33,
2871 &mvtab[0][0], 2, 1, 538);
2872 init_rl(&rl_inter, static_rl_table_store[0]);
2873 init_rl(&rl_intra, static_rl_table_store[1]);
2874 init_rl(&rvlc_rl_inter, static_rl_table_store[3]);
2875 init_rl(&rvlc_rl_intra, static_rl_table_store[4]);
2876 init_rl(&rl_intra_aic, static_rl_table_store[2]);
2877 INIT_VLC_RL(rl_inter, 554);
2878 INIT_VLC_RL(rl_intra, 554);
2879 INIT_VLC_RL(rvlc_rl_inter, 1072);
2880 INIT_VLC_RL(rvlc_rl_intra, 1072);
2881 INIT_VLC_RL(rl_intra_aic, 554);
2882 INIT_VLC_STATIC(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
2883 &DCtab_lum[0][1], 2, 1,
2884 &DCtab_lum[0][0], 2, 1, 512);
2885 INIT_VLC_STATIC(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
2886 &DCtab_chrom[0][1], 2, 1,
2887 &DCtab_chrom[0][0], 2, 1, 512);
2888 INIT_VLC_STATIC(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
2889 &sprite_trajectory_tab[0][1], 4, 2,
2890 &sprite_trajectory_tab[0][0], 4, 2, 128);
2891 INIT_VLC_STATIC(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
2892 &mb_type_b_tab[0][1], 2, 1,
2893 &mb_type_b_tab[0][0], 2, 1, 16);
2894 INIT_VLC_STATIC(&h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15,
2895 &h263_mbtype_b_tab[0][1], 2, 1,
2896 &h263_mbtype_b_tab[0][0], 2, 1, 80);
2897 INIT_VLC_STATIC(&cbpc_b_vlc, CBPC_B_VLC_BITS, 4,
2898 &cbpc_b_tab[0][1], 2, 1,
2899 &cbpc_b_tab[0][0], 2, 1, 8);
2904 * Get the GOB height based on picture height.
2906 int ff_h263_get_gob_height(MpegEncContext *s){
2907 if (s->height <= 400)
2909 else if (s->height <= 800)
2915 int ff_h263_decode_mba(MpegEncContext *s)
2920 if(s->mb_num-1 <= ff_mba_max[i]) break;
2922 mb_pos= get_bits(&s->gb, ff_mba_length[i]);
2923 s->mb_x= mb_pos % s->mb_width;
2924 s->mb_y= mb_pos / s->mb_width;
2929 void ff_h263_encode_mba(MpegEncContext *s)
2934 if(s->mb_num-1 <= ff_mba_max[i]) break;
2936 mb_pos= s->mb_x + s->mb_width*s->mb_y;
2937 put_bits(&s->pb, ff_mba_length[i], mb_pos);
2941 * decodes the group of blocks header or slice header.
2942 * @return <0 if an error occurred
2944 static int h263_decode_gob_header(MpegEncContext *s)
2946 unsigned int val, gfid, gob_number;
2949 /* Check for GOB Start Code */
2950 val = show_bits(&s->gb, 16);
2954 /* We have a GBSC probably with GSTUFF */
2955 skip_bits(&s->gb, 16); /* Drop the zeros */
2956 left= get_bits_left(&s->gb);
2957 //MN: we must check the bits left or we might end in a infinite loop (or segfault)
2958 for(;left>13; left--){
2959 if(get_bits1(&s->gb)) break; /* Seek the '1' bit */
2964 if(s->h263_slice_structured){
2965 if(get_bits1(&s->gb)==0)
2968 ff_h263_decode_mba(s);
2970 if(s->mb_num > 1583)
2971 if(get_bits1(&s->gb)==0)
2974 s->qscale = get_bits(&s->gb, 5); /* SQUANT */
2975 if(get_bits1(&s->gb)==0)
2977 gfid = get_bits(&s->gb, 2); /* GFID */
2979 gob_number = get_bits(&s->gb, 5); /* GN */
2981 s->mb_y= s->gob_index* gob_number;
2982 gfid = get_bits(&s->gb, 2); /* GFID */
2983 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
2986 if(s->mb_y >= s->mb_height)
2995 static inline void memsetw(short *tab, int val, int n)
3004 void ff_mpeg4_init_partitions(MpegEncContext *s)
3006 uint8_t *start= put_bits_ptr(&s->pb);
3007 uint8_t *end= s->pb.buf_end;
3008 int size= end - start;
3009 int pb_size = (((intptr_t)start + size/3)&(~3)) - (intptr_t)start;
3010 int tex_size= (size - 2*pb_size)&(~3);
3012 set_put_bits_buffer_size(&s->pb, pb_size);
3013 init_put_bits(&s->tex_pb, start + pb_size , tex_size);
3014 init_put_bits(&s->pb2 , start + pb_size + tex_size, pb_size);
3017 void ff_mpeg4_merge_partitions(MpegEncContext *s)
3019 const int pb2_len = put_bits_count(&s->pb2 );
3020 const int tex_pb_len= put_bits_count(&s->tex_pb);
3021 const int bits= put_bits_count(&s->pb);
3023 if(s->pict_type==FF_I_TYPE){
3024 put_bits(&s->pb, 19, DC_MARKER);
3025 s->misc_bits+=19 + pb2_len + bits - s->last_bits;
3026 s->i_tex_bits+= tex_pb_len;
3028 put_bits(&s->pb, 17, MOTION_MARKER);
3029 s->misc_bits+=17 + pb2_len;
3030 s->mv_bits+= bits - s->last_bits;
3031 s->p_tex_bits+= tex_pb_len;
3034 flush_put_bits(&s->pb2);
3035 flush_put_bits(&s->tex_pb);
3037 set_put_bits_buffer_size(&s->pb, s->pb2.buf_end - s->pb.buf);
3038 ff_copy_bits(&s->pb, s->pb2.buf , pb2_len);
3039 ff_copy_bits(&s->pb, s->tex_pb.buf, tex_pb_len);
3040 s->last_bits= put_bits_count(&s->pb);
3043 #endif //CONFIG_ENCODERS
3045 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
3046 switch(s->pict_type){
3051 return s->f_code+15;
3053 return FFMAX3(s->f_code, s->b_code, 2) + 15;
3061 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
3063 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
3065 put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0);
3066 put_bits(&s->pb, 1, 1);
3068 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
3069 put_bits(&s->pb, s->quant_precision, s->qscale);
3070 put_bits(&s->pb, 1, 0); /* no HEC */
3073 #endif //CONFIG_ENCODERS
3076 * check if the next stuff is a resync marker or the end.
3079 static inline int mpeg4_is_resync(MpegEncContext *s){
3080 int bits_count= get_bits_count(&s->gb);
3081 int v= show_bits(&s->gb, 16);
3083 if(s->workaround_bugs&FF_BUG_NO_PADDING){
3088 if(s->pict_type==FF_B_TYPE || (v>>(8-s->pict_type)!=1) || s->partitioned_frame)
3090 skip_bits(&s->gb, 8+s->pict_type);
3091 bits_count+= 8+s->pict_type;
3092 v= show_bits(&s->gb, 16);
3095 if(bits_count + 8 >= s->gb.size_in_bits){
3097 v|= 0x7F >> (7-(bits_count&7));
3102 if(v == ff_mpeg4_resync_prefix[bits_count&7]){
3104 GetBitContext gb= s->gb;
3106 skip_bits(&s->gb, 1);
3107 align_get_bits(&s->gb);
3109 for(len=0; len<32; len++){
3110 if(get_bits1(&s->gb)) break;
3115 if(len>=ff_mpeg4_get_video_packet_prefix_length(s))
3122 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb)
3125 int a= 2<<s->sprite_warping_accuracy;
3126 int rho= 3-s->sprite_warping_accuracy;
3128 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
3129 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
3130 int sprite_ref[4][2];
3131 int virtual_ref[2][2];
3133 int alpha=0, beta=0;
3138 for(i=0; i<s->num_sprite_warping_points; i++){
3142 length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);
3144 x= get_xbits(gb, length);
3146 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(gb); /* marker bit */
3148 length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);
3150 y=get_xbits(gb, length);
3152 skip_bits1(gb); /* marker bit */
3153 s->sprite_traj[i][0]= d[i][0]= x;
3154 s->sprite_traj[i][1]= d[i][1]= y;
3157 s->sprite_traj[i][0]= s->sprite_traj[i][1]= 0;
3159 while((1<<alpha)<w) alpha++;
3160 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
3164 // Note, the 4th point isn't used for GMC
3165 if(s->divx_version==500 && s->divx_build==413){
3166 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
3167 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
3168 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
3169 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
3170 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
3171 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
3173 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
3174 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
3175 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
3176 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
3177 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
3178 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
3180 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
3181 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
3183 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
3184 // perhaps it should be reordered to be more readable ...
3185 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
3186 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
3187 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
3188 + 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);
3189 virtual_ref[0][1]= 16*vop_ref[0][1]
3190 + 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);
3191 virtual_ref[1][0]= 16*vop_ref[0][0]
3192 + 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);
3193 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
3194 + 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);
3196 switch(s->num_sprite_warping_points)
3199 s->sprite_offset[0][0]= 0;
3200 s->sprite_offset[0][1]= 0;
3201 s->sprite_offset[1][0]= 0;
3202 s->sprite_offset[1][1]= 0;
3203 s->sprite_delta[0][0]= a;
3204 s->sprite_delta[0][1]= 0;
3205 s->sprite_delta[1][0]= 0;
3206 s->sprite_delta[1][1]= a;
3207 s->sprite_shift[0]= 0;
3208 s->sprite_shift[1]= 0;
3211 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
3212 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
3213 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
3214 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
3215 s->sprite_delta[0][0]= a;
3216 s->sprite_delta[0][1]= 0;
3217 s->sprite_delta[1][0]= 0;
3218 s->sprite_delta[1][1]= a;
3219 s->sprite_shift[0]= 0;
3220 s->sprite_shift[1]= 0;
3223 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
3224 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
3225 + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])
3226 + (1<<(alpha+rho-1));
3227 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
3228 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
3229 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])
3230 + (1<<(alpha+rho-1));
3231 s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
3232 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
3233 +2*w2*r*sprite_ref[0][0]
3235 + (1<<(alpha+rho+1)));
3236 s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
3237 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
3238 +2*w2*r*sprite_ref[0][1]
3240 + (1<<(alpha+rho+1)));
3241 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
3242 s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]);
3243 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
3244 s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
3246 s->sprite_shift[0]= alpha+rho;
3247 s->sprite_shift[1]= alpha+rho+2;
3250 min_ab= FFMIN(alpha, beta);
3253 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
3254 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])
3255 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])
3256 + (1<<(alpha+beta+rho-min_ab-1));
3257 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))
3258 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])
3259 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])
3260 + (1<<(alpha+beta+rho-min_ab-1));
3261 s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)
3262 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)
3263 + 2*w2*h3*r*sprite_ref[0][0]
3265 + (1<<(alpha+beta+rho-min_ab+1));
3266 s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)
3267 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)
3268 + 2*w2*h3*r*sprite_ref[0][1]
3270 + (1<<(alpha+beta+rho-min_ab+1));
3271 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;
3272 s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;
3273 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;
3274 s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;
3276 s->sprite_shift[0]= alpha + beta + rho - min_ab;
3277 s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;
3280 /* try to simplify the situation */
3281 if( s->sprite_delta[0][0] == a<<s->sprite_shift[0]
3282 && s->sprite_delta[0][1] == 0
3283 && s->sprite_delta[1][0] == 0
3284 && s->sprite_delta[1][1] == a<<s->sprite_shift[0])
3286 s->sprite_offset[0][0]>>=s->sprite_shift[0];
3287 s->sprite_offset[0][1]>>=s->sprite_shift[0];
3288 s->sprite_offset[1][0]>>=s->sprite_shift[1];
3289 s->sprite_offset[1][1]>>=s->sprite_shift[1];
3290 s->sprite_delta[0][0]= a;
3291 s->sprite_delta[0][1]= 0;
3292 s->sprite_delta[1][0]= 0;
3293 s->sprite_delta[1][1]= a;
3294 s->sprite_shift[0]= 0;
3295 s->sprite_shift[1]= 0;
3296 s->real_sprite_warping_points=1;
3299 int shift_y= 16 - s->sprite_shift[0];
3300 int shift_c= 16 - s->sprite_shift[1];
3302 s->sprite_offset[0][i]<<= shift_y;
3303 s->sprite_offset[1][i]<<= shift_c;
3304 s->sprite_delta[0][i]<<= shift_y;
3305 s->sprite_delta[1][i]<<= shift_y;
3306 s->sprite_shift[i]= 16;
3308 s->real_sprite_warping_points= s->num_sprite_warping_points;
3313 * decodes the next video packet.
3314 * @return <0 if something went wrong
3316 static int mpeg4_decode_video_packet_header(MpegEncContext *s)
3318 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
3319 int header_extension=0, mb_num, len;
3321 /* is there enough space left for a video packet + header */
3322 if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1;
3324 for(len=0; len<32; len++){
3325 if(get_bits1(&s->gb)) break;
3328 if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
3329 av_log(s->avctx, AV_LOG_ERROR, "marker does not match f_code\n");
3333 if(s->shape != RECT_SHAPE){
3334 header_extension= get_bits1(&s->gb);
3335 //FIXME more stuff here
3338 mb_num= get_bits(&s->gb, mb_num_bits);
3339 if(mb_num>=s->mb_num){
3340 av_log(s->avctx, AV_LOG_ERROR, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);
3343 if(s->pict_type == FF_B_TYPE){
3344 while(s->next_picture.mbskip_table[ s->mb_index2xy[ mb_num ] ]) mb_num++;
3345 if(mb_num >= s->mb_num) return -1; // slice contains just skipped MBs which where already decoded
3348 s->mb_x= mb_num % s->mb_width;
3349 s->mb_y= mb_num / s->mb_width;
3351 if(s->shape != BIN_ONLY_SHAPE){
3352 int qscale= get_bits(&s->gb, s->quant_precision);
3354 s->chroma_qscale=s->qscale= qscale;
3357 if(s->shape == RECT_SHAPE){
3358 header_extension= get_bits1(&s->gb);
3360 if(header_extension){
3364 while (get_bits1(&s->gb) != 0)
3367 check_marker(&s->gb, "before time_increment in video packed header");
3368 time_increment= get_bits(&s->gb, s->time_increment_bits);
3369 check_marker(&s->gb, "before vop_coding_type in video packed header");
3371 skip_bits(&s->gb, 2); /* vop coding type */
3372 //FIXME not rect stuff here
3374 if(s->shape != BIN_ONLY_SHAPE){
3375 skip_bits(&s->gb, 3); /* intra dc vlc threshold */
3376 //FIXME don't just ignore everything
3377 if(s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3378 mpeg4_decode_sprite_trajectory(s, &s->gb);
3379 av_log(s->avctx, AV_LOG_ERROR, "untested\n");
3382 //FIXME reduced res stuff here
3384 if (s->pict_type != FF_I_TYPE) {
3385 int f_code = get_bits(&s->gb, 3); /* fcode_for */
3387 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (f_code=0)\n");
3390 if (s->pict_type == FF_B_TYPE) {
3391 int b_code = get_bits(&s->gb, 3);
3393 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (b_code=0)\n");
3398 //FIXME new-pred stuff
3403 void ff_mpeg4_clean_buffers(MpegEncContext *s)
3405 int c_wrap, c_xy, l_wrap, l_xy;
3407 l_wrap= s->b8_stride;
3408 l_xy= (2*s->mb_y-1)*l_wrap + s->mb_x*2 - 1;
3409 c_wrap= s->mb_stride;
3410 c_xy= (s->mb_y-1)*c_wrap + s->mb_x - 1;
3414 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
3415 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
3416 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
3420 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t));
3421 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
3422 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
3425 // we can't clear the MVs as they might be needed by a b frame
3426 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t));
3427 // memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
3428 s->last_mv[0][0][0]=
3429 s->last_mv[0][0][1]=
3430 s->last_mv[1][0][0]=
3431 s->last_mv[1][0][1]= 0;
3435 * finds the next resync_marker
3436 * @param p pointer to buffer to scan
3437 * @param end pointer to the end of the buffer
3438 * @return pointer to the next resync_marker, or \p end if none was found
3440 const uint8_t *ff_h263_find_resync_marker(const uint8_t *restrict p, const uint8_t * restrict end)
3448 if (!p[-1] && p[1]) return p - 1;
3449 else if(!p[ 1] && p[2]) return p;
3456 * decodes the group of blocks / video packet header.
3457 * @return bit position of the resync_marker, or <0 if none was found
3459 int ff_h263_resync(MpegEncContext *s){
3462 if(s->codec_id==CODEC_ID_MPEG4){
3464 align_get_bits(&s->gb);
3467 if(show_bits(&s->gb, 16)==0){
3468 pos= get_bits_count(&s->gb);
3469 if(s->codec_id==CODEC_ID_MPEG4)
3470 ret= mpeg4_decode_video_packet_header(s);
3472 ret= h263_decode_gob_header(s);
3476 //OK, it's not where it is supposed to be ...
3477 s->gb= s->last_resync_gb;
3478 align_get_bits(&s->gb);
3479 left= get_bits_left(&s->gb);
3481 for(;left>16+1+5+5; left-=8){
3482 if(show_bits(&s->gb, 16)==0){
3483 GetBitContext bak= s->gb;
3485 pos= get_bits_count(&s->gb);
3486 if(s->codec_id==CODEC_ID_MPEG4)
3487 ret= mpeg4_decode_video_packet_header(s);
3489 ret= h263_decode_gob_header(s);
3495 skip_bits(&s->gb, 8);
3501 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
3503 int code, val, sign, shift, l;
3504 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
3511 sign = get_bits1(&s->gb);
3515 val = (val - 1) << shift;
3516 val |= get_bits(&s->gb, shift);
3523 /* modulo decoding */
3524 if (!s->h263_long_vectors) {
3525 l = INT_BIT - 5 - f_code;
3528 /* horrible h263 long vector mode */
3529 if (pred < -31 && val < -63)
3531 if (pred > 32 && val > 63)
3539 * gets the average motion vector for a GMC MB.
3540 * @param n either 0 for the x component or 1 for y
3541 * @returns the average MV for a GMC MB
3543 static inline int get_amv(MpegEncContext *s, int n){
3544 int x, y, mb_v, sum, dx, dy, shift;
3545 int len = 1 << (s->f_code + 4);
3546 const int a= s->sprite_warping_accuracy;
3548 if(s->workaround_bugs & FF_BUG_AMV)
3549 len >>= s->quarter_sample;
3551 if(s->real_sprite_warping_points==1){
3552 if(s->divx_version==500 && s->divx_build==413)
3553 sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample));
3555 sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a);
3557 dx= s->sprite_delta[n][0];
3558 dy= s->sprite_delta[n][1];
3559 shift= s->sprite_shift[0];
3560 if(n) dy -= 1<<(shift + a + 1);
3561 else dx -= 1<<(shift + a + 1);
3562 mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16;
3565 for(y=0; y<16; y++){
3569 //XXX FIXME optimize
3570 for(x=0; x<16; x++){
3575 sum= RSHIFT(sum, a+8-s->quarter_sample);
3578 if (sum < -len) sum= -len;
3579 else if (sum >= len) sum= len-1;
3585 * decodes the dc value.
3586 * @param n block index (0-3 are luma, 4-5 are chroma)
3587 * @param dir_ptr the prediction direction will be stored here
3588 * @return the quantized dc
3590 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
3595 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
3597 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
3598 if (code < 0 || code > 9 /* && s->nbit<9 */){
3599 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
3607 level= 2*get_bits1(&s->gb)-1;
3609 if(get_bits1(&s->gb))
3610 level = get_bits(&s->gb, code-1) + (1<<(code-1));
3612 level = -get_bits(&s->gb, code-1) - (1<<(code-1));
3615 level = get_xbits(&s->gb, code);
3619 if(get_bits1(&s->gb)==0){ /* marker */
3620 if(s->error_recognition>=2){
3621 av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n");
3628 return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0);
3632 * decodes first partition.
3633 * @return number of MBs decoded or <0 if an error occurred
3635 static int mpeg4_decode_partition_a(MpegEncContext *s){
3637 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3639 /* decode first partition */
3641 s->first_slice_line=1;
3642 for(; s->mb_y<s->mb_height; s->mb_y++){
3643 ff_init_block_index(s);
3644 for(; s->mb_x<s->mb_width; s->mb_x++){
3645 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3650 ff_update_block_index(s);
3651 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3652 s->first_slice_line=0;
3654 if(s->pict_type==FF_I_TYPE){
3658 if(show_bits_long(&s->gb, 19)==DC_MARKER){
3662 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
3664 av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
3669 s->cbp_table[xy]= cbpc & 3;
3670 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3674 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3676 s->current_picture.qscale_table[xy]= s->qscale;
3678 s->mbintra_table[xy]= 1;
3681 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3683 av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3687 if(dc_pred_dir) dir|=1;
3689 s->pred_dir_table[xy]= dir;
3690 }else{ /* P/S_TYPE */
3691 int mx, my, pred_x, pred_y, bits;
3692 int16_t * const mot_val= s->current_picture.motion_val[0][s->block_index[0]];
3693 const int stride= s->b8_stride*2;
3696 bits= show_bits(&s->gb, 17);
3697 if(bits==MOTION_MARKER){
3703 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3704 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
3708 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3711 mot_val[0 ]= mot_val[2 ]=
3712 mot_val[0+stride]= mot_val[2+stride]= mx;
3713 mot_val[1 ]= mot_val[3 ]=
3714 mot_val[1+stride]= mot_val[3+stride]= my;
3716 if(s->mbintra_table[xy])
3717 ff_clean_intra_table_entries(s);
3721 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3723 av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
3729 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
3731 s->mb_intra = ((cbpc & 4) != 0);
3734 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3735 s->mbintra_table[xy]= 1;
3736 mot_val[0 ]= mot_val[2 ]=
3737 mot_val[0+stride]= mot_val[2+stride]= 0;
3738 mot_val[1 ]= mot_val[3 ]=
3739 mot_val[1+stride]= mot_val[3+stride]= 0;
3741 if(s->mbintra_table[xy])
3742 ff_clean_intra_table_entries(s);
3744 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
3745 s->mcsel= get_bits1(&s->gb);
3748 if ((cbpc & 16) == 0) {
3749 /* 16x16 motion prediction */
3751 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3753 mx = h263_decode_motion(s, pred_x, s->f_code);
3757 my = h263_decode_motion(s, pred_y, s->f_code);
3760 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3764 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
3767 mot_val[0 ]= mot_val[2 ] =
3768 mot_val[0+stride]= mot_val[2+stride]= mx;
3769 mot_val[1 ]= mot_val[3 ]=
3770 mot_val[1+stride]= mot_val[3+stride]= my;
3773 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3775 int16_t *mot_val= h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3776 mx = h263_decode_motion(s, pred_x, s->f_code);
3780 my = h263_decode_motion(s, pred_y, s->f_code);
3797 * decode second partition.
3798 * @return <0 if an error occurred
3800 static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
3802 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3804 s->mb_x= s->resync_mb_x;
3805 s->first_slice_line=1;
3806 for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
3807 ff_init_block_index(s);
3808 for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
3809 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3812 ff_update_block_index(s);
3813 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3814 s->first_slice_line=0;
3816 if(s->pict_type==FF_I_TYPE){
3817 int ac_pred= get_bits1(&s->gb);
3818 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3820 av_log(s->avctx, AV_LOG_ERROR, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3824 s->cbp_table[xy]|= cbpy<<2;
3825 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3826 }else{ /* P || S_TYPE */
3827 if(IS_INTRA(s->current_picture.mb_type[xy])){
3829 int ac_pred = get_bits1(&s->gb);
3830 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3833 av_log(s->avctx, AV_LOG_ERROR, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3837 if(s->cbp_table[xy] & 8) {
3838 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3840 s->current_picture.qscale_table[xy]= s->qscale;
3844 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3846 av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3850 if(dc_pred_dir) dir|=1;
3852 s->cbp_table[xy]&= 3; //remove dquant
3853 s->cbp_table[xy]|= cbpy<<2;
3854 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3855 s->pred_dir_table[xy]= dir;
3856 }else if(IS_SKIP(s->current_picture.mb_type[xy])){
3857 s->current_picture.qscale_table[xy]= s->qscale;
3858 s->cbp_table[xy]= 0;
3860 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3863 av_log(s->avctx, AV_LOG_ERROR, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3867 if(s->cbp_table[xy] & 8) {
3868 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3870 s->current_picture.qscale_table[xy]= s->qscale;
3872 s->cbp_table[xy]&= 3; //remove dquant
3873 s->cbp_table[xy]|= (cbpy^0xf)<<2;
3877 if(mb_num >= mb_count) return 0;
3884 * decodes the first & second partition
3885 * @return <0 if error (and sets error type in the error_status_table)
3887 int ff_mpeg4_decode_partitions(MpegEncContext *s)
3890 const int part_a_error= s->pict_type==FF_I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR;
3891 const int part_a_end = s->pict_type==FF_I_TYPE ? (DC_END |MV_END) : MV_END;
3893 mb_num= mpeg4_decode_partition_a(s);
3895 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3899 if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
3900 av_log(s->avctx, AV_LOG_ERROR, "slice below monitor ...\n");
3901 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3905 s->mb_num_left= mb_num;
3907 if(s->pict_type==FF_I_TYPE){
3908 while(show_bits(&s->gb, 9) == 1)
3909 skip_bits(&s->gb, 9);
3910 if(get_bits_long(&s->gb, 19)!=DC_MARKER){
3911 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
3915 while(show_bits(&s->gb, 10) == 1)
3916 skip_bits(&s->gb, 10);
3917 if(get_bits(&s->gb, 17)!=MOTION_MARKER){
3918 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
3922 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end);
3924 if( mpeg4_decode_partition_b(s, mb_num) < 0){
3925 if(s->pict_type==FF_P_TYPE)
3926 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR);
3929 if(s->pict_type==FF_P_TYPE)
3930 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END);
3938 * @return <0 if an error occurred
3940 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
3941 int n, int coded, int intra, int rvlc)
3943 int level, i, last, run;
3946 RL_VLC_ELEM * rl_vlc;
3947 const uint8_t * scan_table;
3950 //Note intra & rvlc should be optimized away if this is inlined
3953 if(s->use_intra_dc_vlc){
3955 if(s->partitioned_frame){
3956 level = s->dc_val[0][ s->block_index[n] ];
3957 if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale);
3958 else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale);
3959 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32;
3961 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
3969 ff_mpeg4_pred_dc(s, n, 0, &dc_pred_dir, 0);
3975 rl = &rvlc_rl_intra;
3976 rl_vlc = rvlc_rl_intra.rl_vlc[0];
3979 rl_vlc = rl_intra.rl_vlc[0];
3982 if (dc_pred_dir == 0)
3983 scan_table = s->intra_v_scantable.permutated; /* left */
3985 scan_table = s->intra_h_scantable.permutated; /* top */
3987 scan_table = s->intra_scantable.permutated;
3994 s->block_last_index[n] = i;
3997 if(rvlc) rl = &rvlc_rl_inter;
3998 else rl = &rl_inter;
4000 scan_table = s->intra_scantable.permutated;
4006 rl_vlc = rvlc_rl_inter.rl_vlc[0];
4008 rl_vlc = rl_inter.rl_vlc[0];
4011 qmul = s->qscale << 1;
4012 qadd = (s->qscale - 1) | 1;
4014 rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale];
4016 rl_vlc = rl_inter.rl_vlc[s->qscale];
4021 OPEN_READER(re, &s->gb);
4023 UPDATE_CACHE(re, &s->gb);
4024 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
4028 if(SHOW_UBITS(re, &s->gb, 1)==0){
4029 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n");
4031 }; SKIP_CACHE(re, &s->gb, 1);
4033 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4034 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4035 SKIP_COUNTER(re, &s->gb, 1+1+6);
4036 UPDATE_CACHE(re, &s->gb);
4038 if(SHOW_UBITS(re, &s->gb, 1)==0){
4039 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n");
4041 }; SKIP_CACHE(re, &s->gb, 1);
4043 level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11);
4045 if(SHOW_UBITS(re, &s->gb, 5)!=0x10){
4046 av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n");
4048 }; SKIP_CACHE(re, &s->gb, 5);
4050 level= level * qmul + qadd;
4051 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1);
4052 SKIP_COUNTER(re, &s->gb, 1+11+5+1);
4058 cache= GET_CACHE(re, &s->gb);
4061 cache ^= 0xC0000000;
4063 if (cache&0x80000000) {
4064 if (cache&0x40000000) {
4066 SKIP_CACHE(re, &s->gb, 2);
4067 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4068 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4069 SKIP_COUNTER(re, &s->gb, 2+1+6);
4070 UPDATE_CACHE(re, &s->gb);
4073 level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12);
4075 if(SHOW_UBITS(re, &s->gb, 1)==0){
4076 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n");
4078 }; SKIP_CACHE(re, &s->gb, 1);
4080 level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
4082 if(SHOW_UBITS(re, &s->gb, 1)==0){
4083 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n");
4085 }; LAST_SKIP_CACHE(re, &s->gb, 1);
4087 SKIP_COUNTER(re, &s->gb, 1+12+1);
4091 if(s->error_recognition >= FF_ER_COMPLIANT){
4092 const int abs_level= FFABS(level);
4093 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
4094 const int run1= run - rl->max_run[last][abs_level] - 1;
4095 if(abs_level <= rl->max_level[last][run]){
4096 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
4099 if(s->error_recognition > FF_ER_COMPLIANT){
4100 if(abs_level <= rl->max_level[last][run]*2){
4101 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n");
4104 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
4105 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n");
4112 if (level>0) level= level * qmul + qadd;
4113 else level= level * qmul - qadd;
4115 if((unsigned)(level + 2048) > 4095){
4116 if(s->error_recognition > FF_ER_COMPLIANT){
4117 if(level > 2560 || level<-2560){
4118 av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
4122 level= level<0 ? -2048 : 2047;
4129 #if MIN_CACHE_BITS < 20
4130 LAST_SKIP_BITS(re, &s->gb, 2);
4131 UPDATE_CACHE(re, &s->gb);
4133 SKIP_BITS(re, &s->gb, 2);
4135 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
4136 i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing
4137 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4138 LAST_SKIP_BITS(re, &s->gb, 1);
4142 #if MIN_CACHE_BITS < 19
4143 LAST_SKIP_BITS(re, &s->gb, 1);
4144 UPDATE_CACHE(re, &s->gb);
4146 SKIP_BITS(re, &s->gb, 1);
4148 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
4150 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
4151 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4152 LAST_SKIP_BITS(re, &s->gb, 1);
4157 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4158 LAST_SKIP_BITS(re, &s->gb, 1);
4163 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
4167 block[scan_table[i]] = level;
4171 block[scan_table[i]] = level;
4173 CLOSE_READER(re, &s->gb);
4177 if(!s->use_intra_dc_vlc){
4178 block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0);
4180 i -= i>>31; //if(i == -1) i=0;
4183 mpeg4_pred_ac(s, block, n, dc_pred_dir);
4185 i = 63; /* XXX: not optimal */
4188 s->block_last_index[n] = i;
4193 * decode partition C of one MB.
4194 * @return <0 if an error occurred
4196 static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64])
4199 const int xy= s->mb_x + s->mb_y*s->mb_stride;
4201 mb_type= s->current_picture.mb_type[xy];
4202 cbp = s->cbp_table[xy];
4204 s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold;
4206 if(s->current_picture.qscale_table[xy] != s->qscale){
4207 ff_set_qscale(s, s->current_picture.qscale_table[xy] );
4210 if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
4213 s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0];
4214 s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1];
4216 s->mb_intra = IS_INTRA(mb_type);
4218 if (IS_SKIP(mb_type)) {
4221 s->block_last_index[i] = -1;
4222 s->mv_dir = MV_DIR_FORWARD;
4223 s->mv_type = MV_TYPE_16X16;
4224 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
4231 }else if(s->mb_intra){
4232 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
4233 }else if(!s->mb_intra){
4234 // s->mcsel= 0; //FIXME do we need to init that
4236 s->mv_dir = MV_DIR_FORWARD;
4237 if (IS_8X8(mb_type)) {
4238 s->mv_type = MV_TYPE_8X8;
4240 s->mv_type = MV_TYPE_16X16;
4243 } else { /* I-Frame */
4245 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
4248 if (!IS_SKIP(mb_type)) {
4250 s->dsp.clear_blocks(s->block[0]);
4251 /* decode each block */
4252 for (i = 0; i < 6; i++) {
4253 if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){
4254 av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra);
4261 /* per-MB end of slice check */
4263 if(--s->mb_num_left <= 0){
4264 if(mpeg4_is_resync(s))
4269 if(mpeg4_is_resync(s)){
4270 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
4271 if(s->cbp_table[xy+delta])
4278 /* Decodes RVLC of H.263+ UMV */
4279 static int h263p_decode_umotion(MpegEncContext * s, int pred)
4283 if (get_bits1(&s->gb)) /* Motion difference = 0 */
4286 code = 2 + get_bits1(&s->gb);
4288 while (get_bits1(&s->gb))
4291 code += get_bits1(&s->gb);
4296 code = (sign) ? (pred - code) : (pred + code);
4297 dprintf(s->avctx,"H.263+ UMV Motion = %d\n", code);
4303 * read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :)
4305 static void preview_obmc(MpegEncContext *s){
4306 GetBitContext gb= s->gb;
4308 int cbpc, i, pred_x, pred_y, mx, my;
4310 const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
4311 const int stride= s->b8_stride*2;
4314 s->block_index[i]+= 2;
4316 s->block_index[i]+= 1;
4319 assert(s->pict_type == FF_P_TYPE);
4322 if (get_bits1(&s->gb)) {
4324 mot_val = s->current_picture.motion_val[0][ s->block_index[0] ];
4325 mot_val[0 ]= mot_val[2 ]=
4326 mot_val[0+stride]= mot_val[2+stride]= 0;
4327 mot_val[1 ]= mot_val[3 ]=
4328 mot_val[1+stride]= mot_val[3+stride]= 0;
4330 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4333 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
4337 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
4339 get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4341 if(s->modified_quant){
4342 if(get_bits1(&s->gb)) skip_bits(&s->gb, 1);
4343 else skip_bits(&s->gb, 5);
4345 skip_bits(&s->gb, 2);
4348 if ((cbpc & 16) == 0) {
4349 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
4350 /* 16x16 motion prediction */
4351 mot_val= h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4353 mx = h263p_decode_umotion(s, pred_x);
4355 mx = h263_decode_motion(s, pred_x, 1);
4358 my = h263p_decode_umotion(s, pred_y);
4360 my = h263_decode_motion(s, pred_y, 1);
4362 mot_val[0 ]= mot_val[2 ]=
4363 mot_val[0+stride]= mot_val[2+stride]= mx;
4364 mot_val[1 ]= mot_val[3 ]=
4365 mot_val[1+stride]= mot_val[3+stride]= my;
4367 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
4369 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
4371 mx = h263p_decode_umotion(s, pred_x);
4373 mx = h263_decode_motion(s, pred_x, 1);
4376 my = h263p_decode_umotion(s, pred_y);
4378 my = h263_decode_motion(s, pred_y, 1);
4379 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
4380 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
4389 s->block_index[i]-= 2;
4391 s->block_index[i]-= 1;
4397 static void h263_decode_dquant(MpegEncContext *s){
4398 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
4400 if(s->modified_quant){
4401 if(get_bits1(&s->gb))
4402 s->qscale= modified_quant_tab[get_bits1(&s->gb)][ s->qscale ];
4404 s->qscale= get_bits(&s->gb, 5);
4406 s->qscale += quant_tab[get_bits(&s->gb, 2)];
4407 ff_set_qscale(s, s->qscale);
4410 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
4413 int code, level, i, j, last, run;
4414 RLTable *rl = &rl_inter;
4415 const uint8_t *scan_table;
4416 GetBitContext gb= s->gb;
4418 scan_table = s->intra_scantable.permutated;
4419 if (s->h263_aic && s->mb_intra) {
4423 if (s->h263_aic_dir)
4424 scan_table = s->intra_v_scantable.permutated; /* left */
4426 scan_table = s->intra_h_scantable.permutated; /* top */
4428 } else if (s->mb_intra) {
4430 if(s->codec_id == CODEC_ID_RV10){
4431 #if CONFIG_RV10_DECODER
4432 if (s->rv10_version == 3 && s->pict_type == FF_I_TYPE) {
4433 int component, diff;
4434 component = (n <= 3 ? 0 : n - 4 + 1);
4435 level = s->last_dc[component];
4436 if (s->rv10_first_dc_coded[component]) {
4437 diff = rv_decode_dc(s, n);
4441 level = level & 0xff; /* handle wrap round */
4442 s->last_dc[component] = level;
4444 s->rv10_first_dc_coded[component] = 1;
4447 level = get_bits(&s->gb, 8);
4453 level = get_bits(&s->gb, 8);
4454 if((level&0x7F) == 0){
4455 av_log(s->avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y);
4456 if(s->error_recognition >= FF_ER_COMPLIANT)
4468 if (s->mb_intra && s->h263_aic)
4470 s->block_last_index[n] = i - 1;
4475 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
4477 av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
4480 if (code == rl->n) {
4482 if (s->h263_flv > 1) {
4483 int is11 = get_bits1(&s->gb);
4484 last = get_bits1(&s->gb);
4485 run = get_bits(&s->gb, 6);
4487 level = get_sbits(&s->gb, 11);
4489 level = get_sbits(&s->gb, 7);
4492 last = get_bits1(&s->gb);
4493 run = get_bits(&s->gb, 6);
4494 level = (int8_t)get_bits(&s->gb, 8);
4496 if (s->codec_id == CODEC_ID_RV10) {
4497 /* XXX: should patch encoder too */
4498 level = get_sbits(&s->gb, 12);
4500 level = get_bits(&s->gb, 5);
4501 level |= get_sbits(&s->gb, 6)<<5;
4506 run = rl->table_run[code];
4507 level = rl->table_level[code];
4508 last = code >= rl->last;
4509 if (get_bits1(&s->gb))
4514 if(s->alt_inter_vlc && rl == &rl_inter && !s->mb_intra){
4515 //Looks like a hack but no, it's the way it is supposed to work ...
4519 s->dsp.clear_block(block);
4522 av_log(s->avctx, AV_LOG_ERROR, "run overflow at %dx%d i:%d\n", s->mb_x, s->mb_y, s->mb_intra);
4532 if (s->mb_intra && s->h263_aic) {
4533 h263_pred_acdc(s, block, n);
4536 s->block_last_index[n] = i;
4540 static int h263_skip_b_part(MpegEncContext *s, int cbp)
4542 DECLARE_ALIGNED(16, DCTELEM, dblock[64]);
4545 /* we have to set s->mb_intra to zero to decode B-part of PB-frame correctly
4546 * but real value should be restored in order to be used later (in OBMC condition)
4550 for (i = 0; i < 6; i++) {
4551 if (h263_decode_block(s, dblock, i, cbp&32) < 0)
4559 static int h263_get_modb(GetBitContext *gb, int pb_frame, int *cbpb)
4563 if (pb_frame < 3) { // h.263 Annex G and i263 PB-frame
4565 if (pb_frame == 2 && c)
4566 mv = !get_bits1(gb);
4567 } else { // h.263 Annex M improved PB-frame
4568 mv = get_unary(gb, 0, 4) + 1;
4573 *cbpb = get_bits(gb, 6);
4577 int ff_h263_decode_mb(MpegEncContext *s,
4578 DCTELEM block[6][64])
4580 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
4582 const int xy= s->mb_x + s->mb_y * s->mb_stride;
4583 int cbpb = 0, pb_mv_count = 0;
4585 assert(!s->h263_pred);
4587 if (s->pict_type == FF_P_TYPE) {
4589 if (get_bits1(&s->gb)) {
4593 s->block_last_index[i] = -1;
4594 s->mv_dir = MV_DIR_FORWARD;
4595 s->mv_type = MV_TYPE_16X16;
4596 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4599 s->mb_skipped = !(s->obmc | s->loop_filter);
4602 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
4604 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4609 s->dsp.clear_blocks(s->block[0]);
4612 s->mb_intra = ((cbpc & 4) != 0);
4613 if (s->mb_intra) goto intra;
4615 if(s->pb_frame && get_bits1(&s->gb))
4616 pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb);
4617 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4619 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
4622 cbp = (cbpc & 3) | (cbpy << 2);
4624 h263_decode_dquant(s);
4627 s->mv_dir = MV_DIR_FORWARD;
4628 if ((cbpc & 16) == 0) {
4629 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
4630 /* 16x16 motion prediction */
4631 s->mv_type = MV_TYPE_16X16;
4632 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4634 mx = h263p_decode_umotion(s, pred_x);
4636 mx = h263_decode_motion(s, pred_x, 1);
4642 my = h263p_decode_umotion(s, pred_y);
4644 my = h263_decode_motion(s, pred_y, 1);
4648 s->mv[0][0][0] = mx;
4649 s->mv[0][0][1] = my;
4651 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
4652 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
4654 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
4655 s->mv_type = MV_TYPE_8X8;
4657 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
4659 mx = h263p_decode_umotion(s, pred_x);
4661 mx = h263_decode_motion(s, pred_x, 1);
4666 my = h263p_decode_umotion(s, pred_y);
4668 my = h263_decode_motion(s, pred_y, 1);
4671 s->mv[0][i][0] = mx;
4672 s->mv[0][i][1] = my;
4673 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
4674 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
4679 } else if(s->pict_type==FF_B_TYPE) {
4681 const int stride= s->b8_stride;
4682 int16_t *mot_val0 = s->current_picture.motion_val[0][ 2*(s->mb_x + s->mb_y*stride) ];
4683 int16_t *mot_val1 = s->current_picture.motion_val[1][ 2*(s->mb_x + s->mb_y*stride) ];
4684 // const int mv_xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
4687 mot_val0[0 ]= mot_val0[2 ]= mot_val0[0+2*stride]= mot_val0[2+2*stride]=
4688 mot_val0[1 ]= mot_val0[3 ]= mot_val0[1+2*stride]= mot_val0[3+2*stride]=
4689 mot_val1[0 ]= mot_val1[2 ]= mot_val1[0+2*stride]= mot_val1[2+2*stride]=
4690 mot_val1[1 ]= mot_val1[3 ]= mot_val1[1+2*stride]= mot_val1[3+2*stride]= 0;
4693 mb_type= get_vlc2(&s->gb, h263_mbtype_b_vlc.table, H263_MBTYPE_B_VLC_BITS, 2);
4695 av_log(s->avctx, AV_LOG_ERROR, "b mb_type damaged at %d %d\n", s->mb_x, s->mb_y);
4699 mb_type= h263_mb_type_b_map[ mb_type ];
4702 s->mb_intra = IS_INTRA(mb_type);
4703 if(HAS_CBP(mb_type)){
4704 s->dsp.clear_blocks(s->block[0]);
4705 cbpc = get_vlc2(&s->gb, cbpc_b_vlc.table, CBPC_B_VLC_BITS, 1);
4707 dquant = IS_QUANT(mb_type);
4711 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4714 av_log(s->avctx, AV_LOG_ERROR, "b cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4718 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
4721 cbp = (cbpc & 3) | (cbpy << 2);
4725 assert(!s->mb_intra);
4727 if(IS_QUANT(mb_type)){
4728 h263_decode_dquant(s);
4731 if(IS_DIRECT(mb_type)){
4732 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4733 mb_type |= ff_mpeg4_set_direct_mv(s, 0, 0);
4736 s->mv_type= MV_TYPE_16X16;
4739 if(USES_LIST(mb_type, 0)){
4740 int16_t *mot_val= h263_pred_motion(s, 0, 0, &mx, &my);
4741 s->mv_dir = MV_DIR_FORWARD;
4743 mx = h263_decode_motion(s, mx, 1);
4744 my = h263_decode_motion(s, my, 1);
4746 s->mv[0][0][0] = mx;
4747 s->mv[0][0][1] = my;
4748 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
4749 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
4752 if(USES_LIST(mb_type, 1)){
4753 int16_t *mot_val= h263_pred_motion(s, 0, 1, &mx, &my);
4754 s->mv_dir |= MV_DIR_BACKWARD;
4756 mx = h263_decode_motion(s, mx, 1);
4757 my = h263_decode_motion(s, my, 1);
4759 s->mv[1][0][0] = mx;
4760 s->mv[1][0][1] = my;
4761 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
4762 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
4766 s->current_picture.mb_type[xy]= mb_type;
4767 } else { /* I-Frame */
4769 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
4771 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4776 s->dsp.clear_blocks(s->block[0]);
4781 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
4783 s->ac_pred = get_bits1(&s->gb);
4785 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
4787 s->h263_aic_dir = get_bits1(&s->gb);
4792 if(s->pb_frame && get_bits1(&s->gb))
4793 pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb);
4794 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4796 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4799 cbp = (cbpc & 3) | (cbpy << 2);
4801 h263_decode_dquant(s);
4804 pb_mv_count += !!s->pb_frame;
4807 while(pb_mv_count--){
4808 h263_decode_motion(s, 0, 1);
4809 h263_decode_motion(s, 0, 1);
4812 /* decode each block */
4813 for (i = 0; i < 6; i++) {
4814 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
4819 if(s->pb_frame && h263_skip_b_part(s, cbpb) < 0)
4821 if(s->obmc && !s->mb_intra){
4822 if(s->pict_type == FF_P_TYPE && s->mb_x+1<s->mb_width && s->mb_num_left != 1)
4827 /* per-MB end of slice check */
4829 int v= show_bits(&s->gb, 16);
4831 if(get_bits_count(&s->gb) + 16 > s->gb.size_in_bits){
4832 v>>= get_bits_count(&s->gb) + 16 - s->gb.size_in_bits;
4842 int ff_mpeg4_decode_mb(MpegEncContext *s,
4843 DCTELEM block[6][64])
4845 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
4847 static int8_t quant_tab[4] = { -1, -2, 1, 2 };
4848 const int xy= s->mb_x + s->mb_y * s->mb_stride;
4850 assert(s->h263_pred);
4852 if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
4854 if (get_bits1(&s->gb)) {
4858 s->block_last_index[i] = -1;
4859 s->mv_dir = MV_DIR_FORWARD;
4860 s->mv_type = MV_TYPE_16X16;
4861 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
4862 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
4864 s->mv[0][0][0]= get_amv(s, 0);
4865 s->mv[0][0][1]= get_amv(s, 1);
4869 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4877 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
4879 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4884 s->dsp.clear_blocks(s->block[0]);
4886 s->mb_intra = ((cbpc & 4) != 0);
4887 if (s->mb_intra) goto intra;
4889 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
4890 s->mcsel= get_bits1(&s->gb);
4892 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1) ^ 0x0F;
4894 cbp = (cbpc & 3) | (cbpy << 2);
4896 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
4898 if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE)))
4899 s->interlaced_dct= get_bits1(&s->gb);
4901 s->mv_dir = MV_DIR_FORWARD;
4902 if ((cbpc & 16) == 0) {
4904 s->current_picture.mb_type[xy]= MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
4905 /* 16x16 global motion prediction */
4906 s->mv_type = MV_TYPE_16X16;
4909 s->mv[0][0][0] = mx;
4910 s->mv[0][0][1] = my;
4911 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
4912 s->current_picture.mb_type[xy]= MB_TYPE_16x8 | MB_TYPE_L0 | MB_TYPE_INTERLACED;
4913 /* 16x8 field motion prediction */
4914 s->mv_type= MV_TYPE_FIELD;
4916 s->field_select[0][0]= get_bits1(&s->gb);
4917 s->field_select[0][1]= get_bits1(&s->gb);
4919 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4922 mx = h263_decode_motion(s, pred_x, s->f_code);
4926 my = h263_decode_motion(s, pred_y/2, s->f_code);
4930 s->mv[0][i][0] = mx;
4931 s->mv[0][i][1] = my;
4934 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
4935 /* 16x16 motion prediction */
4936 s->mv_type = MV_TYPE_16X16;
4937 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4938 mx = h263_decode_motion(s, pred_x, s->f_code);
4943 my = h263_decode_motion(s, pred_y, s->f_code);
4947 s->mv[0][0][0] = mx;
4948 s->mv[0][0][1] = my;
4951 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
4952 s->mv_type = MV_TYPE_8X8;
4954 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
4955 mx = h263_decode_motion(s, pred_x, s->f_code);
4959 my = h263_decode_motion(s, pred_y, s->f_code);
4962 s->mv[0][i][0] = mx;
4963 s->mv[0][i][1] = my;
4968 } else if(s->pict_type==FF_B_TYPE) {
4969 int modb1; // first bit of modb
4970 int modb2; // second bit of modb
4973 s->mb_intra = 0; //B-frames never contain intra blocks
4974 s->mcsel=0; // ... true gmc blocks
4978 s->last_mv[i][0][0]=
4979 s->last_mv[i][0][1]=
4980 s->last_mv[i][1][0]=
4981 s->last_mv[i][1][1]= 0;
4985 /* if we skipped it in the future P Frame than skip it now too */
4986 s->mb_skipped= s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]; // Note, skiptab=0 if last was GMC
4991 s->block_last_index[i] = -1;
4993 s->mv_dir = MV_DIR_FORWARD;
4994 s->mv_type = MV_TYPE_16X16;
4999 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
5003 modb1= get_bits1(&s->gb);
5005 mb_type= MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1; //like MB_TYPE_B_DIRECT but no vectors coded
5008 modb2= get_bits1(&s->gb);
5009 mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
5011 av_log(s->avctx, AV_LOG_ERROR, "illegal MB_type\n");
5014 mb_type= mb_type_b_map[ mb_type ];
5017 s->dsp.clear_blocks(s->block[0]);
5018 cbp= get_bits(&s->gb, 6);
5021 if ((!IS_DIRECT(mb_type)) && cbp) {
5022 if(get_bits1(&s->gb)){
5023 ff_set_qscale(s, s->qscale + get_bits1(&s->gb)*4 - 2);
5027 if(!s->progressive_sequence){
5029 s->interlaced_dct= get_bits1(&s->gb);
5031 if(!IS_DIRECT(mb_type) && get_bits1(&s->gb)){
5032 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
5033 mb_type &= ~MB_TYPE_16x16;
5035 if(USES_LIST(mb_type, 0)){
5036 s->field_select[0][0]= get_bits1(&s->gb);
5037 s->field_select[0][1]= get_bits1(&s->gb);
5039 if(USES_LIST(mb_type, 1)){
5040 s->field_select[1][0]= get_bits1(&s->gb);
5041 s->field_select[1][1]= get_bits1(&s->gb);
5047 if((mb_type & (MB_TYPE_DIRECT2|MB_TYPE_INTERLACED)) == 0){
5048 s->mv_type= MV_TYPE_16X16;
5050 if(USES_LIST(mb_type, 0)){
5051 s->mv_dir = MV_DIR_FORWARD;
5053 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
5054 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
5055 s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
5056 s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
5059 if(USES_LIST(mb_type, 1)){
5060 s->mv_dir |= MV_DIR_BACKWARD;
5062 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
5063 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
5064 s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
5065 s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
5067 }else if(!IS_DIRECT(mb_type)){
5068 s->mv_type= MV_TYPE_FIELD;
5070 if(USES_LIST(mb_type, 0)){
5071 s->mv_dir = MV_DIR_FORWARD;
5074 mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code);
5075 my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
5076 s->last_mv[0][i][0]= s->mv[0][i][0] = mx;
5077 s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
5081 if(USES_LIST(mb_type, 1)){
5082 s->mv_dir |= MV_DIR_BACKWARD;
5085 mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code);
5086 my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
5087 s->last_mv[1][i][0]= s->mv[1][i][0] = mx;
5088 s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
5094 if(IS_DIRECT(mb_type)){
5095 if(IS_SKIP(mb_type))
5098 mx = h263_decode_motion(s, 0, 1);
5099 my = h263_decode_motion(s, 0, 1);
5102 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
5103 mb_type |= ff_mpeg4_set_direct_mv(s, mx, my);
5105 s->current_picture.mb_type[xy]= mb_type;
5106 } else { /* I-Frame */
5108 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
5110 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
5118 s->ac_pred = get_bits1(&s->gb);
5120 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
5122 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
5124 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
5126 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
5129 cbp = (cbpc & 3) | (cbpy << 2);
5131 s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold;
5134 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
5137 if(!s->progressive_sequence)
5138 s->interlaced_dct= get_bits1(&s->gb);
5140 s->dsp.clear_blocks(s->block[0]);
5141 /* decode each block */
5142 for (i = 0; i < 6; i++) {
5143 if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0)
5150 /* decode each block */
5151 for (i = 0; i < 6; i++) {
5152 if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0)
5158 /* per-MB end of slice check */
5159 if(s->codec_id==CODEC_ID_MPEG4){
5160 if(mpeg4_is_resync(s)){
5161 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
5162 if(s->pict_type==FF_B_TYPE && s->next_picture.mbskip_table[xy + delta])
5171 /* most is hardcoded. should extend to handle all h263 streams */
5172 int h263_decode_picture_header(MpegEncContext *s)
5174 int format, width, height, i;
5177 align_get_bits(&s->gb);
5179 startcode= get_bits(&s->gb, 22-8);
5181 for(i= get_bits_left(&s->gb); i>24; i-=8) {
5182 startcode = ((startcode << 8) | get_bits(&s->gb, 8)) & 0x003FFFFF;
5184 if(startcode == 0x20)
5188 if (startcode != 0x20) {
5189 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
5192 /* temporal reference */
5193 i = get_bits(&s->gb, 8); /* picture timestamp */
5194 if( (s->picture_number&~0xFF)+i < s->picture_number)
5196 s->current_picture_ptr->pts=
5197 s->picture_number= (s->picture_number&~0xFF) + i;
5199 /* PTYPE starts here */
5200 if (get_bits1(&s->gb) != 1) {
5202 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
5205 if (get_bits1(&s->gb) != 0) {
5206 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
5207 return -1; /* h263 id */
5209 skip_bits1(&s->gb); /* split screen off */
5210 skip_bits1(&s->gb); /* camera off */
5211 skip_bits1(&s->gb); /* freeze picture release off */
5213 format = get_bits(&s->gb, 3);
5218 7 extended PTYPE (PLUSPTYPE)
5221 if (format != 7 && format != 6) {
5224 width = h263_format[format][0];
5225 height = h263_format[format][1];
5229 s->pict_type = FF_I_TYPE + get_bits1(&s->gb);
5231 s->h263_long_vectors = get_bits1(&s->gb);
5233 if (get_bits1(&s->gb) != 0) {
5234 av_log(s->avctx, AV_LOG_ERROR, "H263 SAC not supported\n");
5235 return -1; /* SAC: off */
5237 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
5238 s->unrestricted_mv = s->h263_long_vectors || s->obmc;
5240 s->pb_frame = get_bits1(&s->gb);
5241 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
5242 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
5246 s->avctx->sample_aspect_ratio= (AVRational){12,11};
5247 s->avctx->time_base= (AVRational){1001, 30000};
5253 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
5255 /* ufep other than 0 and 1 are reserved */
5258 format = get_bits(&s->gb, 3);
5259 dprintf(s->avctx, "ufep=1, format: %d\n", format);
5260 s->custom_pcf= get_bits1(&s->gb);
5261 s->umvplus = get_bits1(&s->gb); /* Unrestricted Motion Vector */
5262 if (get_bits1(&s->gb) != 0) {
5263 av_log(s->avctx, AV_LOG_ERROR, "Syntax-based Arithmetic Coding (SAC) not supported\n");
5265 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
5266 s->h263_aic = get_bits1(&s->gb); /* Advanced Intra Coding (AIC) */
5267 s->loop_filter= get_bits1(&s->gb);
5268 s->unrestricted_mv = s->umvplus || s->obmc || s->loop_filter;
5270 s->h263_slice_structured= get_bits1(&s->gb);
5271 if (get_bits1(&s->gb) != 0) {
5272 av_log(s->avctx, AV_LOG_ERROR, "Reference Picture Selection not supported\n");
5274 if (get_bits1(&s->gb) != 0) {
5275 av_log(s->avctx, AV_LOG_ERROR, "Independent Segment Decoding not supported\n");
5277 s->alt_inter_vlc= get_bits1(&s->gb);
5278 s->modified_quant= get_bits1(&s->gb);
5279 if(s->modified_quant)
5280 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
5282 skip_bits(&s->gb, 1); /* Prevent start code emulation */
5284 skip_bits(&s->gb, 3); /* Reserved */
5285 } else if (ufep != 0) {
5286 av_log(s->avctx, AV_LOG_ERROR, "Bad UFEP type (%d)\n", ufep);
5291 s->pict_type = get_bits(&s->gb, 3);
5292 switch(s->pict_type){
5293 case 0: s->pict_type= FF_I_TYPE;break;
5294 case 1: s->pict_type= FF_P_TYPE;break;
5295 case 2: s->pict_type= FF_P_TYPE;s->pb_frame = 3;break;
5296 case 3: s->pict_type= FF_B_TYPE;break;
5297 case 7: s->pict_type= FF_I_TYPE;break; //ZYGO
5301 skip_bits(&s->gb, 2);
5302 s->no_rounding = get_bits1(&s->gb);
5303 skip_bits(&s->gb, 4);
5305 /* Get the picture dimensions */
5308 /* Custom Picture Format (CPFMT) */
5309 s->aspect_ratio_info = get_bits(&s->gb, 4);
5310 dprintf(s->avctx, "aspect: %d\n", s->aspect_ratio_info);
5315 3 - 10:11 (525-type 4:3)
5316 4 - 16:11 (CIF 16:9)
5317 5 - 40:33 (525-type 16:9)
5320 width = (get_bits(&s->gb, 9) + 1) * 4;
5322 height = get_bits(&s->gb, 9) * 4;
5323 dprintf(s->avctx, "\nH.263+ Custom picture: %dx%d\n",width,height);
5324 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
5325 /* aspected dimensions */
5326 s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 8);
5327 s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 8);
5329 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
5332 width = h263_format[format][0];
5333 height = h263_format[format][1];
5334 s->avctx->sample_aspect_ratio= (AVRational){12,11};
5336 if ((width == 0) || (height == 0))
5343 s->avctx->time_base.den= 1800000;
5344 s->avctx->time_base.num= 1000 + get_bits1(&s->gb);
5345 s->avctx->time_base.num*= get_bits(&s->gb, 7);
5346 if(s->avctx->time_base.num == 0){
5347 av_log(s, AV_LOG_ERROR, "zero framerate\n");
5350 gcd= av_gcd(s->avctx->time_base.den, s->avctx->time_base.num);
5351 s->avctx->time_base.den /= gcd;
5352 s->avctx->time_base.num /= gcd;
5354 s->avctx->time_base= (AVRational){1001, 30000};
5359 skip_bits(&s->gb, 2); //extended Temporal reference
5364 if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
5367 if(s->h263_slice_structured){
5368 if (get_bits1(&s->gb) != 0) {
5369 av_log(s->avctx, AV_LOG_ERROR, "rectangular slices not supported\n");
5371 if (get_bits1(&s->gb) != 0) {
5372 av_log(s->avctx, AV_LOG_ERROR, "unordered slices not supported\n");
5377 s->qscale = get_bits(&s->gb, 5);
5380 s->mb_width = (s->width + 15) / 16;
5381 s->mb_height = (s->height + 15) / 16;
5382 s->mb_num = s->mb_width * s->mb_height;
5385 skip_bits(&s->gb, 3); /* Temporal reference for B-pictures */
5387 skip_bits(&s->gb, 2); //extended Temporal reference
5388 skip_bits(&s->gb, 2); /* Quantization information for B-pictures */
5392 while (get_bits1(&s->gb) != 0) {
5393 skip_bits(&s->gb, 8);
5396 if(s->h263_slice_structured){
5397 if (get_bits1(&s->gb) != 1) {
5398 av_log(s->avctx, AV_LOG_ERROR, "SEPB1 marker missing\n");
5402 ff_h263_decode_mba(s);
5404 if (get_bits1(&s->gb) != 1) {
5405 av_log(s->avctx, AV_LOG_ERROR, "SEPB2 marker missing\n");
5412 s->y_dc_scale_table=
5413 s->c_dc_scale_table= ff_aic_dc_scale_table;
5415 s->y_dc_scale_table=
5416 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
5419 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
5422 if (s->pict_type == FF_I_TYPE && s->codec_tag == AV_RL32("ZYGO")){
5424 for(i=0; i<85; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
5425 av_log(s->avctx, AV_LOG_DEBUG, "\n");
5426 for(i=0; i<13; i++){
5428 int v= get_bits(&s->gb, 8);
5429 v |= get_sbits(&s->gb, 8)<<8;
5430 av_log(s->avctx, AV_LOG_DEBUG, " %5d", v);
5432 av_log(s->avctx, AV_LOG_DEBUG, "\n");
5434 for(i=0; i<50; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
5440 static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
5441 int hours, minutes, seconds;
5443 hours= get_bits(gb, 5);
5444 minutes= get_bits(gb, 6);
5446 seconds= get_bits(gb, 6);
5448 s->time_base= seconds + 60*(minutes + 60*hours);
5456 static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
5457 int width, height, vo_ver_id;
5460 skip_bits(gb, 1); /* random access */
5461 s->vo_type= get_bits(gb, 8);
5462 if (get_bits1(gb) != 0) { /* is_ol_id */
5463 vo_ver_id = get_bits(gb, 4); /* vo_ver_id */
5464 skip_bits(gb, 3); /* vo_priority */
5468 s->aspect_ratio_info= get_bits(gb, 4);
5469 if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
5470 s->avctx->sample_aspect_ratio.num= get_bits(gb, 8); // par_width
5471 s->avctx->sample_aspect_ratio.den= get_bits(gb, 8); // par_height
5473 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
5476 if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
5477 int chroma_format= get_bits(gb, 2);
5478 if(chroma_format!=CHROMA_420){
5479 av_log(s->avctx, AV_LOG_ERROR, "illegal chroma format\n");
5481 s->low_delay= get_bits1(gb);
5482 if(get_bits1(gb)){ /* vbv parameters */
5483 get_bits(gb, 15); /* first_half_bitrate */
5484 skip_bits1(gb); /* marker */
5485 get_bits(gb, 15); /* latter_half_bitrate */
5486 skip_bits1(gb); /* marker */
5487 get_bits(gb, 15); /* first_half_vbv_buffer_size */
5488 skip_bits1(gb); /* marker */
5489 get_bits(gb, 3); /* latter_half_vbv_buffer_size */
5490 get_bits(gb, 11); /* first_half_vbv_occupancy */
5491 skip_bits1(gb); /* marker */
5492 get_bits(gb, 15); /* latter_half_vbv_occupancy */
5493 skip_bits1(gb); /* marker */
5496 // set low delay flag only once the smartest? low delay detection won't be overriden
5497 if(s->picture_number==0)
5501 s->shape = get_bits(gb, 2); /* vol shape */
5502 if(s->shape != RECT_SHAPE) av_log(s->avctx, AV_LOG_ERROR, "only rectangular vol supported\n");
5503 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
5504 av_log(s->avctx, AV_LOG_ERROR, "Gray shape not supported\n");
5505 skip_bits(gb, 4); //video_object_layer_shape_extension
5508 check_marker(gb, "before time_increment_resolution");
5510 s->avctx->time_base.den = get_bits(gb, 16);
5511 if(!s->avctx->time_base.den){
5512 av_log(s->avctx, AV_LOG_ERROR, "time_base.den==0\n");
5516 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
5517 if (s->time_increment_bits < 1)
5518 s->time_increment_bits = 1;
5520 check_marker(gb, "before fixed_vop_rate");
5522 if (get_bits1(gb) != 0) { /* fixed_vop_rate */
5523 s->avctx->time_base.num = get_bits(gb, s->time_increment_bits);
5525 s->avctx->time_base.num = 1;
5529 if (s->shape != BIN_ONLY_SHAPE) {
5530 if (s->shape == RECT_SHAPE) {
5531 skip_bits1(gb); /* marker */
5532 width = get_bits(gb, 13);
5533 skip_bits1(gb); /* marker */
5534 height = get_bits(gb, 13);
5535 skip_bits1(gb); /* marker */
5536 if(width && height && !(s->width && s->codec_tag == AV_RL32("MP4S"))){ /* they should be non zero but who knows ... */
5542 s->progressive_sequence=
5543 s->progressive_frame= get_bits1(gb)^1;
5544 s->interlaced_dct=0;
5545 if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO))
5546 av_log(s->avctx, AV_LOG_INFO, "MPEG4 OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */
5547 if (vo_ver_id == 1) {
5548 s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */
5550 s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */
5552 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "Static Sprites not supported\n");
5553 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
5554 if(s->vol_sprite_usage==STATIC_SPRITE){
5555 s->sprite_width = get_bits(gb, 13);
5556 skip_bits1(gb); /* marker */
5557 s->sprite_height= get_bits(gb, 13);
5558 skip_bits1(gb); /* marker */
5559 s->sprite_left = get_bits(gb, 13);
5560 skip_bits1(gb); /* marker */
5561 s->sprite_top = get_bits(gb, 13);
5562 skip_bits1(gb); /* marker */
5564 s->num_sprite_warping_points= get_bits(gb, 6);
5565 if(s->num_sprite_warping_points > 3){
5566 av_log(s->avctx, AV_LOG_ERROR, "%d sprite_warping_points\n", s->num_sprite_warping_points);
5567 s->num_sprite_warping_points= 0;
5570 s->sprite_warping_accuracy = get_bits(gb, 2);
5571 s->sprite_brightness_change= get_bits1(gb);
5572 if(s->vol_sprite_usage==STATIC_SPRITE)
5573 s->low_latency_sprite= get_bits1(gb);
5575 // FIXME sadct disable bit if verid!=1 && shape not rect
5577 if (get_bits1(gb) == 1) { /* not_8_bit */
5578 s->quant_precision = get_bits(gb, 4); /* quant_precision */
5579 if(get_bits(gb, 4)!=8) av_log(s->avctx, AV_LOG_ERROR, "N-bit not supported\n"); /* bits_per_pixel */
5580 if(s->quant_precision!=5) av_log(s->avctx, AV_LOG_ERROR, "quant precision %d\n", s->quant_precision);
5582 s->quant_precision = 5;
5585 // FIXME a bunch of grayscale shape things
5587 if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */
5590 /* load default matrixes */
5591 for(i=0; i<64; i++){
5592 int j= s->dsp.idct_permutation[i];
5593 v= ff_mpeg4_default_intra_matrix[i];
5594 s->intra_matrix[j]= v;
5595 s->chroma_intra_matrix[j]= v;
5597 v= ff_mpeg4_default_non_intra_matrix[i];
5598 s->inter_matrix[j]= v;
5599 s->chroma_inter_matrix[j]= v;
5602 /* load custom intra matrix */
5605 for(i=0; i<64; i++){
5611 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5612 s->intra_matrix[j]= v;
5613 s->chroma_intra_matrix[j]= v;
5616 /* replicate last value */
5618 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5619 s->intra_matrix[j]= last;
5620 s->chroma_intra_matrix[j]= last;
5624 /* load custom non intra matrix */
5627 for(i=0; i<64; i++){
5633 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5634 s->inter_matrix[j]= v;
5635 s->chroma_inter_matrix[j]= v;
5638 /* replicate last value */
5640 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5641 s->inter_matrix[j]= last;
5642 s->chroma_inter_matrix[j]= last;
5646 // FIXME a bunch of grayscale shape things
5650 s->quarter_sample= get_bits1(gb);
5651 else s->quarter_sample=0;
5654 int pos= get_bits_count(gb);
5655 int estimation_method= get_bits(gb, 2);
5656 if(estimation_method<2){
5658 s->cplx_estimation_trash_i += 8*get_bits1(gb); //opaque
5659 s->cplx_estimation_trash_i += 8*get_bits1(gb); //transparent
5660 s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_cae
5661 s->cplx_estimation_trash_i += 8*get_bits1(gb); //inter_cae
5662 s->cplx_estimation_trash_i += 8*get_bits1(gb); //no_update
5663 s->cplx_estimation_trash_i += 8*get_bits1(gb); //upampling
5666 s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_blocks
5667 s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter_blocks
5668 s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter4v_blocks
5669 s->cplx_estimation_trash_i += 8*get_bits1(gb); //not coded blocks
5671 if(!check_marker(gb, "in complexity estimation part 1")){
5672 skip_bits_long(gb, pos - get_bits_count(gb));
5676 s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_coeffs
5677 s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_lines
5678 s->cplx_estimation_trash_i += 8*get_bits1(gb); //vlc_syms
5679 s->cplx_estimation_trash_i += 4*get_bits1(gb); //vlc_bits
5682 s->cplx_estimation_trash_p += 8*get_bits1(gb); //apm
5683 s->cplx_estimation_trash_p += 8*get_bits1(gb); //npm
5684 s->cplx_estimation_trash_b += 8*get_bits1(gb); //interpolate_mc_q
5685 s->cplx_estimation_trash_p += 8*get_bits1(gb); //forwback_mc_q
5686 s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel2
5687 s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel4
5689 if(!check_marker(gb, "in complexity estimation part 2")){
5690 skip_bits_long(gb, pos - get_bits_count(gb));
5693 if(estimation_method==1){
5694 s->cplx_estimation_trash_i += 8*get_bits1(gb); //sadct
5695 s->cplx_estimation_trash_p += 8*get_bits1(gb); //qpel
5698 av_log(s->avctx, AV_LOG_ERROR, "Invalid Complexity estimation method %d\n", estimation_method);
5701 s->cplx_estimation_trash_i=
5702 s->cplx_estimation_trash_p=
5703 s->cplx_estimation_trash_b= 0;
5706 s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */
5708 s->data_partitioning= get_bits1(gb);
5709 if(s->data_partitioning){
5710 s->rvlc= get_bits1(gb);
5713 if(vo_ver_id != 1) {
5714 s->new_pred= get_bits1(gb);
5716 av_log(s->avctx, AV_LOG_ERROR, "new pred not supported\n");
5717 skip_bits(gb, 2); /* requested upstream message type */
5718 skip_bits1(gb); /* newpred segment type */
5720 s->reduced_res_vop= get_bits1(gb);
5721 if(s->reduced_res_vop) av_log(s->avctx, AV_LOG_ERROR, "reduced resolution VOP not supported\n");
5725 s->reduced_res_vop= 0;
5728 s->scalability= get_bits1(gb);
5730 if (s->scalability) {
5731 GetBitContext bak= *gb;
5733 int ref_layer_sampling_dir;
5734 int h_sampling_factor_n;
5735 int h_sampling_factor_m;
5736 int v_sampling_factor_n;
5737 int v_sampling_factor_m;
5739 s->hierachy_type= get_bits1(gb);
5740 ref_layer_id= get_bits(gb, 4);
5741 ref_layer_sampling_dir= get_bits1(gb);
5742 h_sampling_factor_n= get_bits(gb, 5);
5743 h_sampling_factor_m= get_bits(gb, 5);
5744 v_sampling_factor_n= get_bits(gb, 5);
5745 v_sampling_factor_m= get_bits(gb, 5);
5746 s->enhancement_type= get_bits1(gb);
5748 if( h_sampling_factor_n==0 || h_sampling_factor_m==0
5749 || v_sampling_factor_n==0 || v_sampling_factor_m==0){
5755 av_log(s->avctx, AV_LOG_ERROR, "scalability not supported\n");
5757 // bin shape stuff FIXME
5764 * decodes the user data stuff in the header.
5765 * Also initializes divx/xvid/lavc_version/build.
5767 static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
5771 int ver = 0, build = 0, ver2 = 0, ver3 = 0;
5774 for(i=0; i<255 && get_bits_count(gb) < gb->size_in_bits; i++){
5775 if(show_bits(gb, 23) == 0) break;
5776 buf[i]= get_bits(gb, 8);
5780 /* divx detection */
5781 e=sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last);
5783 e=sscanf(buf, "DivX%db%d%c", &ver, &build, &last);
5785 s->divx_version= ver;
5786 s->divx_build= build;
5787 s->divx_packed= e==3 && last=='p';
5788 if(s->divx_packed && !s->showed_packed_warning) {
5789 av_log(s->avctx, AV_LOG_WARNING, "Invalid and inefficient vfw-avi packed B frames detected\n");
5790 s->showed_packed_warning=1;
5794 /* ffmpeg detection */
5795 e=sscanf(buf, "FFmpe%*[^b]b%d", &build)+3;
5797 e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
5799 e=sscanf(buf, "Lavc%d.%d.%d", &ver, &ver2, &ver3)+1;
5801 build= (ver<<16) + (ver2<<8) + ver3;
5804 if(strcmp(buf, "ffmpeg")==0){
5805 s->lavc_build= 4600;
5809 s->lavc_build= build;
5812 /* Xvid detection */
5813 e=sscanf(buf, "XviD%d", &build);
5815 s->xvid_build= build;
5821 static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
5822 int time_incr, time_increment;
5824 s->pict_type = get_bits(gb, 2) + FF_I_TYPE; /* pict type: I = 0 , P = 1 */
5825 if(s->pict_type==FF_B_TYPE && s->low_delay && s->vol_control_parameters==0 && !(s->flags & CODEC_FLAG_LOW_DELAY)){
5826 av_log(s->avctx, AV_LOG_ERROR, "low_delay flag incorrectly, clearing it\n");
5830 s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE;
5831 if(s->partitioned_frame)
5832 s->decode_mb= mpeg4_decode_partitioned_mb;
5834 s->decode_mb= ff_mpeg4_decode_mb;
5837 while (get_bits1(gb) != 0)
5840 check_marker(gb, "before time_increment");
5842 if(s->time_increment_bits==0 || !(show_bits(gb, s->time_increment_bits+1)&1)){
5843 av_log(s->avctx, AV_LOG_ERROR, "hmm, seems the headers are not complete, trying to guess time_increment_bits\n");
5845 for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){
5846 if ( s->pict_type == FF_P_TYPE
5847 || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
5848 if((show_bits(gb, s->time_increment_bits+6)&0x37) == 0x30) break;
5850 if((show_bits(gb, s->time_increment_bits+5)&0x1F) == 0x18) break;
5853 av_log(s->avctx, AV_LOG_ERROR, "my guess is %d bits ;)\n",s->time_increment_bits);
5856 if(IS_3IV1) time_increment= get_bits1(gb); //FIXME investigate further
5857 else time_increment= get_bits(gb, s->time_increment_bits);
5859 if(s->pict_type!=FF_B_TYPE){
5860 s->last_time_base= s->time_base;
5861 s->time_base+= time_incr;
5862 s->time= s->time_base*s->avctx->time_base.den + time_increment;
5863 if(s->workaround_bugs&FF_BUG_UMP4){
5864 if(s->time < s->last_non_b_time){
5866 s->time+= s->avctx->time_base.den;
5869 s->pp_time= s->time - s->last_non_b_time;
5870 s->last_non_b_time= s->time;
5872 s->time= (s->last_time_base + time_incr)*s->avctx->time_base.den + time_increment;
5873 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
5874 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
5875 return FRAME_SKIPPED;
5877 ff_mpeg4_init_direct_mv(s);
5879 if(s->t_frame==0) s->t_frame= s->pb_time;
5880 if(s->t_frame==0) s->t_frame=1; // 1/0 protection
5881 s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame)
5882 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
5883 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame)
5884 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
5885 if(!s->progressive_sequence){
5886 if(s->pp_field_time <= s->pb_field_time || s->pb_field_time <= 1)
5887 return FRAME_SKIPPED;
5891 if(s->avctx->time_base.num)
5892 s->current_picture_ptr->pts= (s->time + s->avctx->time_base.num/2) / s->avctx->time_base.num;
5894 s->current_picture_ptr->pts= AV_NOPTS_VALUE;
5895 if(s->avctx->debug&FF_DEBUG_PTS)
5896 av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %"PRId64"\n", s->current_picture_ptr->pts);
5898 check_marker(gb, "before vop_coded");
5901 if (get_bits1(gb) != 1){
5902 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
5903 av_log(s->avctx, AV_LOG_ERROR, "vop not coded\n");
5904 return FRAME_SKIPPED;
5906 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == FF_P_TYPE
5907 || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
5908 /* rounding type for motion estimation */
5909 s->no_rounding = get_bits1(gb);
5913 //FIXME reduced res stuff
5915 if (s->shape != RECT_SHAPE) {
5916 if (s->vol_sprite_usage != 1 || s->pict_type != FF_I_TYPE) {
5917 int width, height, hor_spat_ref, ver_spat_ref;
5919 width = get_bits(gb, 13);
5920 skip_bits1(gb); /* marker */
5921 height = get_bits(gb, 13);
5922 skip_bits1(gb); /* marker */
5923 hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */
5924 skip_bits1(gb); /* marker */
5925 ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */
5927 skip_bits1(gb); /* change_CR_disable */
5929 if (get_bits1(gb) != 0) {
5930 skip_bits(gb, 8); /* constant_alpha_value */
5933 //FIXME complexity estimation stuff
5935 if (s->shape != BIN_ONLY_SHAPE) {
5936 skip_bits_long(gb, s->cplx_estimation_trash_i);
5937 if(s->pict_type != FF_I_TYPE)
5938 skip_bits_long(gb, s->cplx_estimation_trash_p);
5939 if(s->pict_type == FF_B_TYPE)
5940 skip_bits_long(gb, s->cplx_estimation_trash_b);
5942 s->intra_dc_threshold= mpeg4_dc_threshold[ get_bits(gb, 3) ];
5943 if(!s->progressive_sequence){
5944 s->top_field_first= get_bits1(gb);
5945 s->alternate_scan= get_bits1(gb);
5947 s->alternate_scan= 0;
5950 if(s->alternate_scan){
5951 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
5952 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
5953 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
5954 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
5956 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
5957 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
5958 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
5959 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
5962 if(s->pict_type == FF_S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
5963 mpeg4_decode_sprite_trajectory(s, gb);
5964 if(s->sprite_brightness_change) av_log(s->avctx, AV_LOG_ERROR, "sprite_brightness_change not supported\n");
5965 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "static sprite not supported\n");
5968 if (s->shape != BIN_ONLY_SHAPE) {
5969 s->chroma_qscale= s->qscale = get_bits(gb, s->quant_precision);
5971 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (qscale=0)\n");
5972 return -1; // makes no sense to continue, as there is nothing left from the image then
5975 if (s->pict_type != FF_I_TYPE) {
5976 s->f_code = get_bits(gb, 3); /* fcode_for */
5978 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (f_code=0)\n");
5979 return -1; // makes no sense to continue, as the MV decoding will break very quickly
5984 if (s->pict_type == FF_B_TYPE) {
5985 s->b_code = get_bits(gb, 3);
5989 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
5990 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",
5991 s->qscale, s->f_code, s->b_code,
5992 s->pict_type == FF_I_TYPE ? "I" : (s->pict_type == FF_P_TYPE ? "P" : (s->pict_type == FF_B_TYPE ? "B" : "S")),
5993 gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first,
5994 s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,
5995 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);
5998 if(!s->scalability){
5999 if (s->shape!=RECT_SHAPE && s->pict_type!=FF_I_TYPE) {
6000 skip_bits1(gb); // vop shape coding type
6003 if(s->enhancement_type){
6004 int load_backward_shape= get_bits1(gb);
6005 if(load_backward_shape){
6006 av_log(s->avctx, AV_LOG_ERROR, "load backward shape isn't supported\n");
6009 skip_bits(gb, 2); //ref_select_code
6012 /* detect buggy encoders which don't set the low_delay flag (divx4/xvid/opendivx)*/
6013 // note we cannot detect divx5 without b-frames easily (although it's buggy too)
6014 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
6015 av_log(s->avctx, AV_LOG_ERROR, "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
6019 s->picture_number++; // better than pic number==0 always ;)
6021 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
6022 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
6024 if(s->workaround_bugs&FF_BUG_EDGE){
6025 s->h_edge_pos= s->width;
6026 s->v_edge_pos= s->height;
6032 * decode mpeg4 headers
6033 * @return <0 if no VOP found (or a damaged one)
6034 * FRAME_SKIPPED if a not coded VOP is found
6035 * 0 if a VOP is found
6037 int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb)
6041 /* search next start code */
6044 if(s->codec_tag == AV_RL32("WV1F") && show_bits(gb, 24) == 0x575630){
6046 if(get_bits(gb, 8) == 0xF0)
6052 if(get_bits_count(gb) >= gb->size_in_bits){
6053 if(gb->size_in_bits==8 && (s->divx_version || s->xvid_build)){
6054 av_log(s->avctx, AV_LOG_ERROR, "frame skip %d\n", gb->size_in_bits);
6055 return FRAME_SKIPPED; //divx bug
6057 return -1; //end of stream
6060 /* use the bits after the test */
6061 v = get_bits(gb, 8);
6062 startcode = ((startcode << 8) | v) & 0xffffffff;
6064 if((startcode&0xFFFFFF00) != 0x100)
6065 continue; //no startcode
6067 if(s->avctx->debug&FF_DEBUG_STARTCODE){
6068 av_log(s->avctx, AV_LOG_DEBUG, "startcode: %3X ", startcode);
6069 if (startcode<=0x11F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Start");
6070 else if(startcode<=0x12F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Layer Start");
6071 else if(startcode<=0x13F) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
6072 else if(startcode<=0x15F) av_log(s->avctx, AV_LOG_DEBUG, "FGS bp start");
6073 else if(startcode<=0x1AF) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
6074 else if(startcode==0x1B0) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq Start");
6075 else if(startcode==0x1B1) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq End");
6076 else if(startcode==0x1B2) av_log(s->avctx, AV_LOG_DEBUG, "User Data");
6077 else if(startcode==0x1B3) av_log(s->avctx, AV_LOG_DEBUG, "Group of VOP start");
6078 else if(startcode==0x1B4) av_log(s->avctx, AV_LOG_DEBUG, "Video Session Error");
6079 else if(startcode==0x1B5) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Start");
6080 else if(startcode==0x1B6) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Plane start");
6081 else if(startcode==0x1B7) av_log(s->avctx, AV_LOG_DEBUG, "slice start");
6082 else if(startcode==0x1B8) av_log(s->avctx, AV_LOG_DEBUG, "extension start");
6083 else if(startcode==0x1B9) av_log(s->avctx, AV_LOG_DEBUG, "fgs start");
6084 else if(startcode==0x1BA) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object start");
6085 else if(startcode==0x1BB) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object Plane start");
6086 else if(startcode==0x1BC) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object start");
6087 else if(startcode==0x1BD) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object Plane start");
6088 else if(startcode==0x1BE) av_log(s->avctx, AV_LOG_DEBUG, "Still Texture Object start");
6089 else if(startcode==0x1BF) av_log(s->avctx, AV_LOG_DEBUG, "Texture Spatial Layer start");
6090 else if(startcode==0x1C0) av_log(s->avctx, AV_LOG_DEBUG, "Texture SNR Layer start");
6091 else if(startcode==0x1C1) av_log(s->avctx, AV_LOG_DEBUG, "Texture Tile start");
6092 else if(startcode==0x1C2) av_log(s->avctx, AV_LOG_DEBUG, "Texture Shape Layer start");
6093 else if(startcode==0x1C3) av_log(s->avctx, AV_LOG_DEBUG, "stuffing start");
6094 else if(startcode<=0x1C5) av_log(s->avctx, AV_LOG_DEBUG, "reserved");
6095 else if(startcode<=0x1FF) av_log(s->avctx, AV_LOG_DEBUG, "System start");
6096 av_log(s->avctx, AV_LOG_DEBUG, " at %d\n", get_bits_count(gb));
6099 if(startcode >= 0x120 && startcode <= 0x12F){
6100 if(decode_vol_header(s, gb) < 0)
6103 else if(startcode == USER_DATA_STARTCODE){
6104 decode_user_data(s, gb);
6106 else if(startcode == GOP_STARTCODE){
6107 mpeg4_decode_gop_header(s, gb);
6109 else if(startcode == VOP_STARTCODE){
6117 if(s->flags& CODEC_FLAG_LOW_DELAY)
6119 s->avctx->has_b_frames= !s->low_delay;
6120 return decode_vop_header(s, gb);
6123 /* don't understand why they choose a different header ! */
6124 int intel_h263_decode_picture_header(MpegEncContext *s)
6128 /* picture header */
6129 if (get_bits_long(&s->gb, 22) != 0x20) {
6130 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
6133 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
6135 if (get_bits1(&s->gb) != 1) {
6136 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
6137 return -1; /* marker */
6139 if (get_bits1(&s->gb) != 0) {
6140 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
6141 return -1; /* h263 id */
6143 skip_bits1(&s->gb); /* split screen off */
6144 skip_bits1(&s->gb); /* camera off */
6145 skip_bits1(&s->gb); /* freeze picture release off */
6147 format = get_bits(&s->gb, 3);
6149 av_log(s->avctx, AV_LOG_ERROR, "Intel H263 free format not supported\n");
6154 s->pict_type = FF_I_TYPE + get_bits1(&s->gb);
6156 s->unrestricted_mv = get_bits1(&s->gb);
6157 s->h263_long_vectors = s->unrestricted_mv;
6159 if (get_bits1(&s->gb) != 0) {
6160 av_log(s->avctx, AV_LOG_ERROR, "SAC not supported\n");
6161 return -1; /* SAC: off */
6163 s->obmc= get_bits1(&s->gb);
6164 s->pb_frame = get_bits1(&s->gb);
6167 format = get_bits(&s->gb, 3);
6168 if(format == 0 || format == 7){
6169 av_log(s->avctx, AV_LOG_ERROR, "Wrong Intel H263 format\n");
6172 if(get_bits(&s->gb, 2))
6173 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
6174 s->loop_filter = get_bits1(&s->gb);
6175 if(get_bits1(&s->gb))
6176 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
6177 if(get_bits1(&s->gb))
6179 if(get_bits(&s->gb, 5))
6180 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
6181 if(get_bits(&s->gb, 5) != 1)
6182 av_log(s->avctx, AV_LOG_ERROR, "Invalid marker\n");
6185 int ar = get_bits(&s->gb, 4);
6186 skip_bits(&s->gb, 9); // display width
6188 skip_bits(&s->gb, 9); // display height
6190 skip_bits(&s->gb, 8); // aspect ratio - width
6191 skip_bits(&s->gb, 8); // aspect ratio - height
6195 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
6196 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
6199 skip_bits(&s->gb, 3); //temporal reference for B-frame
6200 skip_bits(&s->gb, 2); //dbquant
6204 while (get_bits1(&s->gb) != 0) {
6205 skip_bits(&s->gb, 8);
6209 s->y_dc_scale_table=
6210 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
6212 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
6218 int flv_h263_decode_picture_header(MpegEncContext *s)
6220 int format, width, height;
6222 /* picture header */
6223 if (get_bits_long(&s->gb, 17) != 1) {
6224 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
6227 format = get_bits(&s->gb, 5);
6228 if (format != 0 && format != 1) {
6229 av_log(s->avctx, AV_LOG_ERROR, "Bad picture format\n");
6232 s->h263_flv = format+1;
6233 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
6234 format = get_bits(&s->gb, 3);
6237 width = get_bits(&s->gb, 8);
6238 height = get_bits(&s->gb, 8);
6241 width = get_bits(&s->gb, 16);
6242 height = get_bits(&s->gb, 16);
6268 if(avcodec_check_dimensions(s->avctx, width, height))
6273 s->pict_type = FF_I_TYPE + get_bits(&s->gb, 2);
6274 s->dropable= s->pict_type > FF_P_TYPE;
6276 s->pict_type = FF_P_TYPE;
6278 skip_bits1(&s->gb); /* deblocking flag */
6279 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
6283 s->unrestricted_mv = 1;
6284 s->h263_long_vectors = 0;
6287 while (get_bits1(&s->gb) != 0) {
6288 skip_bits(&s->gb, 8);
6292 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
6293 av_log(s->avctx, AV_LOG_DEBUG, "%c esc_type:%d, qp:%d num:%d\n",
6294 s->dropable ? 'D' : av_get_pict_type_char(s->pict_type), s->h263_flv-1, s->qscale, s->picture_number);
6297 s->y_dc_scale_table=
6298 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;