2 * H263/MPEG4 backend for ffmpeg encoder and decoder
3 * Copyright (c) 2000,2001 Fabrice Bellard
5 * Copyright (c) 2001 Juan J. Sierralta P
6 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
8 * ac prediction encoding, B-frame support, error resilience, optimizations,
9 * qpel decoding, gmc decoding, interlaced decoding
10 * by Michael Niedermayer <michaelni@gmx.at>
12 * This file is part of FFmpeg.
14 * FFmpeg is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU Lesser General Public
16 * License as published by the Free Software Foundation; either
17 * version 2.1 of the License, or (at your option) any later version.
19 * FFmpeg is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 * Lesser General Public License for more details.
24 * You should have received a copy of the GNU Lesser General Public
25 * License along with FFmpeg; if not, write to the Free Software
26 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30 * @file libavcodec/h263.c
39 #include "mpegvideo.h"
41 #include "mpeg4data.h"
48 #define INTRA_MCBPC_VLC_BITS 6
49 #define INTER_MCBPC_VLC_BITS 7
50 #define CBPY_VLC_BITS 6
53 #define SPRITE_TRAJ_VLC_BITS 6
54 #define MB_TYPE_B_VLC_BITS 4
55 #define TEX_VLC_BITS 9
56 #define H263_MBTYPE_B_VLC_BITS 6
57 #define CBPC_B_VLC_BITS 3
59 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode);
60 static int h263p_decode_umotion(MpegEncContext * s, int pred);
61 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
63 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
64 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
65 int n, int coded, int intra, int rvlc);
67 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb);
68 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding);
71 static void h263_encode_block(MpegEncContext *s, DCTELEM *block, int n);
72 static void h263p_encode_umotion(MpegEncContext *s, int val);
73 static int h263_pred_dc(MpegEncContext *s, int n, int16_t **dc_val_ptr);
75 static void mpeg4_encode_visual_object_header(MpegEncContext *s);
76 static void mpeg4_encode_vol_header(MpegEncContext *s, int vo_number,
78 static inline void mpeg4_encode_block(MpegEncContext *s, DCTELEM *block,
79 int n, int dc, uint8_t *scan_table,
81 PutBitContext *ac_pb);
82 static int mpeg4_get_block_length(MpegEncContext *s, DCTELEM *block, int n,
83 int intra_dc, uint8_t *scan_table);
85 static uint8_t uni_DCtab_lum_len[512];
86 static uint8_t uni_DCtab_chrom_len[512];
87 static uint16_t uni_DCtab_lum_bits[512];
88 static uint16_t uni_DCtab_chrom_bits[512];
90 static uint8_t mv_penalty[MAX_FCODE+1][MAX_MV*2+1];
91 static uint8_t fcode_tab[MAX_MV*2+1];
92 static uint8_t umv_fcode_tab[MAX_MV*2+1];
94 static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2];
95 static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2];
96 static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2];
97 static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2];
98 static uint8_t uni_h263_intra_aic_rl_len [64*64*2*2];
99 static uint8_t uni_h263_inter_rl_len [64*64*2*2];
100 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
101 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
102 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
115 static uint8_t static_rl_table_store[5][2][2*MAX_RUN + MAX_LEVEL + 3];
117 #if 0 //3IV1 is quite rare and it slows things down a tiny bit
118 #define IS_3IV1 s->codec_tag == AV_RL32("3IV1")
123 int h263_get_picture_format(int width, int height)
127 if (width == 128 && height == 96)
129 else if (width == 176 && height == 144)
131 else if (width == 352 && height == 288)
133 else if (width == 704 && height == 576)
135 else if (width == 1408 && height == 1152)
142 static void show_pict_info(MpegEncContext *s){
143 av_log(s->avctx, AV_LOG_DEBUG, "qp:%d %c size:%d rnd:%d%s%s%s%s%s%s%s%s%s %d/%d\n",
144 s->qscale, av_get_pict_type_char(s->pict_type),
145 s->gb.size_in_bits, 1-s->no_rounding,
146 s->obmc ? " AP" : "",
147 s->umvplus ? " UMV" : "",
148 s->h263_long_vectors ? " LONG" : "",
149 s->h263_plus ? " +" : "",
150 s->h263_aic ? " AIC" : "",
151 s->alt_inter_vlc ? " AIV" : "",
152 s->modified_quant ? " MQ" : "",
153 s->loop_filter ? " LOOP" : "",
154 s->h263_slice_structured ? " SS" : "",
155 s->avctx->time_base.den, s->avctx->time_base.num
161 static void aspect_to_info(MpegEncContext * s, AVRational aspect){
164 if(aspect.num==0) aspect= (AVRational){1,1};
167 if(av_cmp_q(pixel_aspect[i], aspect) == 0){
168 s->aspect_ratio_info=i;
173 s->aspect_ratio_info= FF_ASPECT_EXTENDED;
176 void ff_flv_encode_picture_header(MpegEncContext * s, int picture_number)
180 align_put_bits(&s->pb);
182 put_bits(&s->pb, 17, 1);
183 put_bits(&s->pb, 5, (s->h263_flv-1)); /* 0: h263 escape codes 1: 11-bit escape codes */
184 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->time_base.num) / //FIXME use timestamp
185 s->avctx->time_base.den) & 0xff); /* TemporalReference */
186 if (s->width == 352 && s->height == 288)
188 else if (s->width == 176 && s->height == 144)
190 else if (s->width == 128 && s->height == 96)
192 else if (s->width == 320 && s->height == 240)
194 else if (s->width == 160 && s->height == 120)
196 else if (s->width <= 255 && s->height <= 255)
197 format = 0; /* use 1 byte width & height */
199 format = 1; /* use 2 bytes width & height */
200 put_bits(&s->pb, 3, format); /* PictureSize */
202 put_bits(&s->pb, 8, s->width);
203 put_bits(&s->pb, 8, s->height);
204 } else if (format == 1) {
205 put_bits(&s->pb, 16, s->width);
206 put_bits(&s->pb, 16, s->height);
208 put_bits(&s->pb, 2, s->pict_type == FF_P_TYPE); /* PictureType */
209 put_bits(&s->pb, 1, 1); /* DeblockingFlag: on */
210 put_bits(&s->pb, 5, s->qscale); /* Quantizer */
211 put_bits(&s->pb, 1, 0); /* ExtraInformation */
215 s->c_dc_scale_table= ff_aic_dc_scale_table;
218 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
222 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
224 int format, coded_frame_rate, coded_frame_rate_base, i, temp_ref;
225 int best_clock_code=1;
227 int best_error= INT_MAX;
232 div= (s->avctx->time_base.num*1800000LL + 500LL*s->avctx->time_base.den) / ((1000LL+i)*s->avctx->time_base.den);
233 div= av_clip(div, 1, 127);
234 error= FFABS(s->avctx->time_base.num*1800000LL - (1000LL+i)*s->avctx->time_base.den*div);
235 if(error < best_error){
242 s->custom_pcf= best_clock_code!=1 || best_divisor!=60;
243 coded_frame_rate= 1800000;
244 coded_frame_rate_base= (1000+best_clock_code)*best_divisor;
246 align_put_bits(&s->pb);
248 /* Update the pointer to last GOB */
249 s->ptr_lastgob = put_bits_ptr(&s->pb);
250 put_bits(&s->pb, 22, 0x20); /* PSC */
251 temp_ref= s->picture_number * (int64_t)coded_frame_rate * s->avctx->time_base.num / //FIXME use timestamp
252 (coded_frame_rate_base * (int64_t)s->avctx->time_base.den);
253 put_sbits(&s->pb, 8, temp_ref); /* TemporalReference */
255 put_bits(&s->pb, 1, 1); /* marker */
256 put_bits(&s->pb, 1, 0); /* h263 id */
257 put_bits(&s->pb, 1, 0); /* split screen off */
258 put_bits(&s->pb, 1, 0); /* camera off */
259 put_bits(&s->pb, 1, 0); /* freeze picture release off */
261 format = h263_get_picture_format(s->width, s->height);
264 put_bits(&s->pb, 3, format);
265 put_bits(&s->pb, 1, (s->pict_type == FF_P_TYPE));
266 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
267 of H.263v1 UMV implies to check the predicted MV after
268 calculation of the current MB to see if we're on the limits */
269 put_bits(&s->pb, 1, 0); /* Unrestricted Motion Vector: off */
270 put_bits(&s->pb, 1, 0); /* SAC: off */
271 put_bits(&s->pb, 1, s->obmc); /* Advanced Prediction */
272 put_bits(&s->pb, 1, 0); /* only I/P frames, no PB frame */
273 put_bits(&s->pb, 5, s->qscale);
274 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
278 /* H.263 Plus PTYPE */
280 put_bits(&s->pb, 3, 7);
281 put_bits(&s->pb,3,ufep); /* Update Full Extended PTYPE */
283 put_bits(&s->pb,3,6); /* Custom Source Format */
285 put_bits(&s->pb, 3, format);
287 put_bits(&s->pb,1, s->custom_pcf);
288 put_bits(&s->pb,1, s->umvplus); /* Unrestricted Motion Vector */
289 put_bits(&s->pb,1,0); /* SAC: off */
290 put_bits(&s->pb,1,s->obmc); /* Advanced Prediction Mode */
291 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
292 put_bits(&s->pb,1,s->loop_filter); /* Deblocking Filter */
293 put_bits(&s->pb,1,s->h263_slice_structured); /* Slice Structured */
294 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
295 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
296 put_bits(&s->pb,1,s->alt_inter_vlc); /* Alternative Inter VLC */
297 put_bits(&s->pb,1,s->modified_quant); /* Modified Quantization: */
298 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
299 put_bits(&s->pb,3,0); /* Reserved */
301 put_bits(&s->pb, 3, s->pict_type == FF_P_TYPE);
303 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
304 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
305 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
306 put_bits(&s->pb,2,0); /* Reserved */
307 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
309 /* This should be here if PLUSPTYPE */
310 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
313 /* Custom Picture Format (CPFMT) */
314 aspect_to_info(s, s->avctx->sample_aspect_ratio);
316 put_bits(&s->pb,4,s->aspect_ratio_info);
317 put_bits(&s->pb,9,(s->width >> 2) - 1);
318 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
319 put_bits(&s->pb,9,(s->height >> 2));
320 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
321 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
322 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
327 put_bits(&s->pb, 1, best_clock_code);
328 put_bits(&s->pb, 7, best_divisor);
330 put_sbits(&s->pb, 2, temp_ref>>8);
333 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
335 // put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
336 //FIXME check actual requested range
337 put_bits(&s->pb,2,1); /* unlimited */
338 if(s->h263_slice_structured)
339 put_bits(&s->pb,2,0); /* no weird submodes */
341 put_bits(&s->pb, 5, s->qscale);
344 put_bits(&s->pb, 1, 0); /* no PEI */
346 if(s->h263_slice_structured){
347 put_bits(&s->pb, 1, 1);
349 assert(s->mb_x == 0 && s->mb_y == 0);
350 ff_h263_encode_mba(s);
352 put_bits(&s->pb, 1, 1);
357 s->c_dc_scale_table= ff_aic_dc_scale_table;
360 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
365 * Encodes a group of blocks header.
367 void h263_encode_gob_header(MpegEncContext * s, int mb_line)
369 put_bits(&s->pb, 17, 1); /* GBSC */
371 if(s->h263_slice_structured){
372 put_bits(&s->pb, 1, 1);
374 ff_h263_encode_mba(s);
377 put_bits(&s->pb, 1, 1);
378 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
379 put_bits(&s->pb, 1, 1);
380 put_bits(&s->pb, 2, s->pict_type == FF_I_TYPE); /* GFID */
382 int gob_number= mb_line / s->gob_index;
384 put_bits(&s->pb, 5, gob_number); /* GN */
385 put_bits(&s->pb, 2, s->pict_type == FF_I_TYPE); /* GFID */
386 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
390 static inline int get_block_rate(MpegEncContext * s, DCTELEM block[64], int block_last_index, uint8_t scantable[64]){
395 for(j=1; j<=block_last_index; j++){
396 const int index= scantable[j];
397 int level= block[index];
400 if((level&(~127)) == 0){
401 if(j<block_last_index) rate+= s->intra_ac_vlc_length [UNI_AC_ENC_INDEX(j-last-1, level)];
402 else rate+= s->intra_ac_vlc_last_length[UNI_AC_ENC_INDEX(j-last-1, level)];
404 rate += s->ac_esc_length;
413 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
417 int8_t * const qscale_table= s->current_picture.qscale_table;
419 memcpy(zigzag_last_index, s->block_last_index, sizeof(int)*6);
422 int16_t *ac_val, *ac_val1;
424 score -= get_block_rate(s, block[n], s->block_last_index[n], s->intra_scantable.permutated);
426 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
429 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
431 ac_val-= s->block_wrap[n]*16;
432 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
435 const int level= block[n][s->dsp.idct_permutation[i ]];
436 block[n][s->dsp.idct_permutation[i ]] = level - ac_val[i+8];
437 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
441 /* different qscale, we must rescale */
443 const int level= block[n][s->dsp.idct_permutation[i ]];
444 block[n][s->dsp.idct_permutation[i ]] = level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
445 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
449 st[n]= s->intra_h_scantable.permutated;
451 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
452 /* left prediction */
454 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
457 const int level= block[n][s->dsp.idct_permutation[i<<3]];
458 block[n][s->dsp.idct_permutation[i<<3]]= level - ac_val[i];
460 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
463 /* different qscale, we must rescale */
465 const int level= block[n][s->dsp.idct_permutation[i<<3]];
466 block[n][s->dsp.idct_permutation[i<<3]]= level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
468 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
471 st[n]= s->intra_v_scantable.permutated;
474 for(i=63; i>0; i--) //FIXME optimize
475 if(block[n][ st[n][i] ]) break;
476 s->block_last_index[n]= i;
478 score += get_block_rate(s, block[n], s->block_last_index[n], st[n]);
484 static inline void restore_ac_coeffs(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
487 memcpy(s->block_last_index, zigzag_last_index, sizeof(int)*6);
490 int16_t *ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
492 st[n]= s->intra_scantable.permutated;
496 block[n][s->dsp.idct_permutation[i ]] = ac_val[i+8];
499 /* left prediction */
501 block[n][s->dsp.idct_permutation[i<<3]]= ac_val[i ];
508 * modify qscale so that encoding is acually possible in h263 (limit difference to -2..2)
510 void ff_clean_h263_qscales(MpegEncContext *s){
512 int8_t * const qscale_table= s->current_picture.qscale_table;
514 ff_init_qscale_tab(s);
516 for(i=1; i<s->mb_num; i++){
517 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i-1] ] >2)
518 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i-1] ]+2;
520 for(i=s->mb_num-2; i>=0; i--){
521 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i+1] ] >2)
522 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i+1] ]+2;
525 if(s->codec_id != CODEC_ID_H263P){
526 for(i=1; i<s->mb_num; i++){
527 int mb_xy= s->mb_index2xy[i];
529 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_INTER4V)){
530 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_INTER;
537 * modify mb_type & qscale so that encoding is acually possible in mpeg4
539 void ff_clean_mpeg4_qscales(MpegEncContext *s){
541 int8_t * const qscale_table= s->current_picture.qscale_table;
543 ff_clean_h263_qscales(s);
545 if(s->pict_type== FF_B_TYPE){
547 /* ok, come on, this isn't funny anymore, there's more code for handling this mpeg4 mess than for the actual adaptive quantization */
549 for(i=0; i<s->mb_num; i++){
550 int mb_xy= s->mb_index2xy[i];
551 odd += qscale_table[mb_xy]&1;
554 if(2*odd > s->mb_num) odd=1;
557 for(i=0; i<s->mb_num; i++){
558 int mb_xy= s->mb_index2xy[i];
559 if((qscale_table[mb_xy]&1) != odd)
560 qscale_table[mb_xy]++;
561 if(qscale_table[mb_xy] > 31)
562 qscale_table[mb_xy]= 31;
565 for(i=1; i<s->mb_num; i++){
566 int mb_xy= s->mb_index2xy[i];
567 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_DIRECT)){
568 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_BIDIR;
574 #endif //CONFIG_ENCODERS
576 #define tab_size ((signed)FF_ARRAY_ELEMS(s->direct_scale_mv[0]))
577 #define tab_bias (tab_size/2)
579 void ff_mpeg4_init_direct_mv(MpegEncContext *s){
581 for(i=0; i<tab_size; i++){
582 s->direct_scale_mv[0][i] = (i-tab_bias)*s->pb_time/s->pp_time;
583 s->direct_scale_mv[1][i] = (i-tab_bias)*(s->pb_time-s->pp_time)/s->pp_time;
587 static inline void ff_mpeg4_set_one_direct_mv(MpegEncContext *s, int mx, int my, int i){
588 int xy= s->block_index[i];
589 uint16_t time_pp= s->pp_time;
590 uint16_t time_pb= s->pb_time;
593 p_mx= s->next_picture.motion_val[0][xy][0];
594 if((unsigned)(p_mx + tab_bias) < tab_size){
595 s->mv[0][i][0] = s->direct_scale_mv[0][p_mx + tab_bias] + mx;
596 s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx
597 : s->direct_scale_mv[1][p_mx + tab_bias];
599 s->mv[0][i][0] = p_mx*time_pb/time_pp + mx;
600 s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx
601 : p_mx*(time_pb - time_pp)/time_pp;
603 p_my= s->next_picture.motion_val[0][xy][1];
604 if((unsigned)(p_my + tab_bias) < tab_size){
605 s->mv[0][i][1] = s->direct_scale_mv[0][p_my + tab_bias] + my;
606 s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my
607 : s->direct_scale_mv[1][p_my + tab_bias];
609 s->mv[0][i][1] = p_my*time_pb/time_pp + my;
610 s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my
611 : p_my*(time_pb - time_pp)/time_pp;
620 * @return the mb_type
622 int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){
623 const int mb_index= s->mb_x + s->mb_y*s->mb_stride;
624 const int colocated_mb_type= s->next_picture.mb_type[mb_index];
629 //FIXME avoid divides
630 // try special case with shifts for 1 and 3 B-frames?
632 if(IS_8X8(colocated_mb_type)){
633 s->mv_type = MV_TYPE_8X8;
635 ff_mpeg4_set_one_direct_mv(s, mx, my, i);
637 return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_L0L1;
638 } else if(IS_INTERLACED(colocated_mb_type)){
639 s->mv_type = MV_TYPE_FIELD;
641 int field_select= s->next_picture.ref_index[0][s->block_index[2*i]];
642 s->field_select[0][i]= field_select;
643 s->field_select[1][i]= i;
644 if(s->top_field_first){
645 time_pp= s->pp_field_time - field_select + i;
646 time_pb= s->pb_field_time - field_select + i;
648 time_pp= s->pp_field_time + field_select - i;
649 time_pb= s->pb_field_time + field_select - i;
651 s->mv[0][i][0] = s->p_field_mv_table[i][0][mb_index][0]*time_pb/time_pp + mx;
652 s->mv[0][i][1] = s->p_field_mv_table[i][0][mb_index][1]*time_pb/time_pp + my;
653 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->p_field_mv_table[i][0][mb_index][0]
654 : s->p_field_mv_table[i][0][mb_index][0]*(time_pb - time_pp)/time_pp;
655 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->p_field_mv_table[i][0][mb_index][1]
656 : s->p_field_mv_table[i][0][mb_index][1]*(time_pb - time_pp)/time_pp;
658 return MB_TYPE_DIRECT2 | MB_TYPE_16x8 | MB_TYPE_L0L1 | MB_TYPE_INTERLACED;
660 ff_mpeg4_set_one_direct_mv(s, mx, my, 0);
661 s->mv[0][1][0] = s->mv[0][2][0] = s->mv[0][3][0] = s->mv[0][0][0];
662 s->mv[0][1][1] = s->mv[0][2][1] = s->mv[0][3][1] = s->mv[0][0][1];
663 s->mv[1][1][0] = s->mv[1][2][0] = s->mv[1][3][0] = s->mv[1][0][0];
664 s->mv[1][1][1] = s->mv[1][2][1] = s->mv[1][3][1] = s->mv[1][0][1];
665 if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample)
666 s->mv_type= MV_TYPE_16X16;
668 s->mv_type= MV_TYPE_8X8;
669 return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_L0L1; //Note see prev line
673 void ff_h263_update_motion_val(MpegEncContext * s){
674 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
675 //FIXME a lot of that is only needed for !low_delay
676 const int wrap = s->b8_stride;
677 const int xy = s->block_index[0];
679 s->current_picture.mbskip_table[mb_xy]= s->mb_skipped;
681 if(s->mv_type != MV_TYPE_8X8){
682 int motion_x, motion_y;
686 } else if (s->mv_type == MV_TYPE_16X16) {
687 motion_x = s->mv[0][0][0];
688 motion_y = s->mv[0][0][1];
689 } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {
691 motion_x = s->mv[0][0][0] + s->mv[0][1][0];
692 motion_y = s->mv[0][0][1] + s->mv[0][1][1];
693 motion_x = (motion_x>>1) | (motion_x&1);
695 s->p_field_mv_table[i][0][mb_xy][0]= s->mv[0][i][0];
696 s->p_field_mv_table[i][0][mb_xy][1]= s->mv[0][i][1];
698 s->current_picture.ref_index[0][xy ]=
699 s->current_picture.ref_index[0][xy + 1]= s->field_select[0][0];
700 s->current_picture.ref_index[0][xy + wrap ]=
701 s->current_picture.ref_index[0][xy + wrap + 1]= s->field_select[0][1];
704 /* no update if 8X8 because it has been done during parsing */
705 s->current_picture.motion_val[0][xy][0] = motion_x;
706 s->current_picture.motion_val[0][xy][1] = motion_y;
707 s->current_picture.motion_val[0][xy + 1][0] = motion_x;
708 s->current_picture.motion_val[0][xy + 1][1] = motion_y;
709 s->current_picture.motion_val[0][xy + wrap][0] = motion_x;
710 s->current_picture.motion_val[0][xy + wrap][1] = motion_y;
711 s->current_picture.motion_val[0][xy + 1 + wrap][0] = motion_x;
712 s->current_picture.motion_val[0][xy + 1 + wrap][1] = motion_y;
715 if(s->encoding){ //FIXME encoding MUST be cleaned up
716 if (s->mv_type == MV_TYPE_8X8)
717 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_8x8;
719 s->current_picture.mb_type[mb_xy]= MB_TYPE_INTRA;
721 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_16x16;
727 static inline int h263_get_motion_length(MpegEncContext * s, int val, int f_code){
728 int l, bit_size, code;
733 bit_size = f_code - 1;
734 /* modulo encoding */
735 l= INT_BIT - 6 - bit_size;
738 code = (val >> bit_size) + 1;
740 return mvtab[code][1] + 1 + bit_size;
744 static inline void ff_h263_encode_motion_vector(MpegEncContext * s, int x, int y, int f_code){
745 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
746 skip_put_bits(&s->pb,
747 h263_get_motion_length(s, x, f_code)
748 +h263_get_motion_length(s, y, f_code));
750 ff_h263_encode_motion(s, x, f_code);
751 ff_h263_encode_motion(s, y, f_code);
755 static inline int get_p_cbp(MpegEncContext * s,
756 DCTELEM block[6][64],
757 int motion_x, int motion_y){
760 if(s->flags & CODEC_FLAG_CBP_RD){
761 int best_cbpy_score= INT_MAX;
762 int best_cbpc_score= INT_MAX;
763 int cbpc = (-1), cbpy= (-1);
764 const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0);
765 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
768 int score= inter_MCBPC_bits[i + offset] * lambda;
769 if(i&1) score += s->coded_score[5];
770 if(i&2) score += s->coded_score[4];
772 if(score < best_cbpc_score){
773 best_cbpc_score= score;
779 int score= cbpy_tab[i ^ 0xF][1] * lambda;
780 if(i&1) score += s->coded_score[3];
781 if(i&2) score += s->coded_score[2];
782 if(i&4) score += s->coded_score[1];
783 if(i&8) score += s->coded_score[0];
785 if(score < best_cbpy_score){
786 best_cbpy_score= score;
791 if ((motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16){
792 if(best_cbpy_score + best_cbpc_score + 2*lambda >= 0)
796 for (i = 0; i < 6; i++) {
797 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
798 s->block_last_index[i]= -1;
799 s->dsp.clear_block(s->block[i]);
804 for (i = 0; i < 6; i++) {
805 if (s->block_last_index[i] >= 0)
812 static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64],
813 int motion_x, int motion_y, int mb_type){
816 if(s->flags & CODEC_FLAG_CBP_RD){
818 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
821 if(s->coded_score[i] < 0){
822 score += s->coded_score[i];
829 if ((motion_x | motion_y | s->dquant | mb_type) == 0){
830 zero_score-= 4; //2*MV + mb_type + cbp bit
834 if(zero_score <= score){
839 for (i = 0; i < 6; i++) {
840 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
841 s->block_last_index[i]= -1;
842 s->dsp.clear_block(s->block[i]);
846 for (i = 0; i < 6; i++) {
847 if (s->block_last_index[i] >= 0)
854 static inline void mpeg4_encode_blocks(MpegEncContext * s, DCTELEM block[6][64], int intra_dc[6],
855 uint8_t **scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb){
859 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
860 for (i = 0; i < 6; i++) {
861 skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, intra_dc[i], scan_table[i]));
864 /* encode each block */
865 for (i = 0; i < 6; i++) {
866 mpeg4_encode_block(s, block[i], i, intra_dc[i], scan_table[i], dc_pb, ac_pb);
870 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
871 for (i = 0; i < 6; i++) {
872 skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, 0, s->intra_scantable.permutated));
875 /* encode each block */
876 for (i = 0; i < 6; i++) {
877 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, dc_pb, ac_pb);
883 static const int dquant_code[5]= {1,0,9,2,3};
885 void mpeg4_encode_mb(MpegEncContext * s,
886 DCTELEM block[6][64],
887 int motion_x, int motion_y)
889 int cbpc, cbpy, pred_x, pred_y;
890 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
891 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=FF_B_TYPE ? &s->tex_pb : &s->pb;
892 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=FF_I_TYPE ? &s->pb2 : &s->pb;
893 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
898 if(s->pict_type==FF_B_TYPE){
899 static const int mb_type_table[8]= {-1, 3, 2, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
900 int mb_type= mb_type_table[s->mv_dir];
907 s->last_mv[i][1][1]= 0;
911 assert(s->dquant>=-2 && s->dquant<=2);
912 assert((s->dquant&1)==0);
915 /* nothing to do if this MB was skipped in the next P Frame */
916 if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){ //FIXME avoid DCT & ...
922 s->mv_dir= MV_DIR_FORWARD; //doesn't matter
923 s->qscale -= s->dquant;
929 cbp= get_b_cbp(s, block, motion_x, motion_y, mb_type);
931 if ((cbp | motion_x | motion_y | mb_type) ==0) {
932 /* direct MB with MV={0,0} */
933 assert(s->dquant==0);
935 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
937 if(interleaved_stats){
945 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
946 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
947 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we don't need it :)
948 if(cbp) put_bits(&s->pb, 6, cbp);
952 put_bits(&s->pb, 2, (s->dquant>>2)+3);
954 put_bits(&s->pb, 1, 0);
956 s->qscale -= s->dquant;
958 if(!s->progressive_sequence){
960 put_bits(&s->pb, 1, s->interlaced_dct);
961 if(mb_type) // not direct mode
962 put_bits(&s->pb, 1, s->mv_type == MV_TYPE_FIELD);
965 if(interleaved_stats){
966 s->misc_bits+= get_bits_diff(s);
970 assert(s->mv_dir & MV_DIRECT);
971 ff_h263_encode_motion_vector(s, motion_x, motion_y, 1);
975 assert(mb_type > 0 && mb_type < 4);
976 if(s->mv_type != MV_TYPE_FIELD){
977 if(s->mv_dir & MV_DIR_FORWARD){
978 ff_h263_encode_motion_vector(s, s->mv[0][0][0] - s->last_mv[0][0][0],
979 s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
980 s->last_mv[0][0][0]= s->last_mv[0][1][0]= s->mv[0][0][0];
981 s->last_mv[0][0][1]= s->last_mv[0][1][1]= s->mv[0][0][1];
984 if(s->mv_dir & MV_DIR_BACKWARD){
985 ff_h263_encode_motion_vector(s, s->mv[1][0][0] - s->last_mv[1][0][0],
986 s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
987 s->last_mv[1][0][0]= s->last_mv[1][1][0]= s->mv[1][0][0];
988 s->last_mv[1][0][1]= s->last_mv[1][1][1]= s->mv[1][0][1];
992 if(s->mv_dir & MV_DIR_FORWARD){
993 put_bits(&s->pb, 1, s->field_select[0][0]);
994 put_bits(&s->pb, 1, s->field_select[0][1]);
996 if(s->mv_dir & MV_DIR_BACKWARD){
997 put_bits(&s->pb, 1, s->field_select[1][0]);
998 put_bits(&s->pb, 1, s->field_select[1][1]);
1000 if(s->mv_dir & MV_DIR_FORWARD){
1002 ff_h263_encode_motion_vector(s, s->mv[0][i][0] - s->last_mv[0][i][0] ,
1003 s->mv[0][i][1] - s->last_mv[0][i][1]/2, s->f_code);
1004 s->last_mv[0][i][0]= s->mv[0][i][0];
1005 s->last_mv[0][i][1]= s->mv[0][i][1]*2;
1009 if(s->mv_dir & MV_DIR_BACKWARD){
1011 ff_h263_encode_motion_vector(s, s->mv[1][i][0] - s->last_mv[1][i][0] ,
1012 s->mv[1][i][1] - s->last_mv[1][i][1]/2, s->b_code);
1013 s->last_mv[1][i][0]= s->mv[1][i][0];
1014 s->last_mv[1][i][1]= s->mv[1][i][1]*2;
1021 if(interleaved_stats){
1022 s->mv_bits+= get_bits_diff(s);
1025 mpeg4_encode_blocks(s, block, NULL, NULL, NULL, &s->pb);
1027 if(interleaved_stats){
1028 s->p_tex_bits+= get_bits_diff(s);
1031 }else{ /* s->pict_type==FF_B_TYPE */
1032 cbp= get_p_cbp(s, block, motion_x, motion_y);
1034 if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
1035 /* check if the B frames can skip it too, as we must skip it if we skip here
1036 why didn't they just compress the skip-mb bits instead of reusing them ?! */
1037 if(s->max_b_frames>0){
1044 if(x+16 > s->width) x= s->width-16;
1045 if(y+16 > s->height) y= s->height-16;
1047 offset= x + y*s->linesize;
1048 p_pic= s->new_picture.data[0] + offset;
1051 for(i=0; i<s->max_b_frames; i++){
1054 Picture *pic= s->reordered_input_picture[i+1];
1056 if(pic==NULL || pic->pict_type!=FF_B_TYPE) break;
1058 b_pic= pic->data[0] + offset;
1059 if(pic->type != FF_BUFFER_TYPE_SHARED)
1060 b_pic+= INPLACE_OFFSET;
1061 diff= s->dsp.sad[0](NULL, p_pic, b_pic, s->linesize, 16);
1062 if(diff>s->qscale*70){ //FIXME check that 70 is optimal
1070 if(s->mb_skipped==1){
1071 /* skip macroblock */
1072 put_bits(&s->pb, 1, 1);
1074 if(interleaved_stats){
1084 put_bits(&s->pb, 1, 0); /* mb coded */
1088 if(s->mv_type==MV_TYPE_16X16){
1089 if(s->dquant) cbpc+= 8;
1091 inter_MCBPC_bits[cbpc],
1092 inter_MCBPC_code[cbpc]);
1094 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1096 put_bits(pb2, 2, dquant_code[s->dquant+2]);
1098 if(!s->progressive_sequence){
1100 put_bits(pb2, 1, s->interlaced_dct);
1101 put_bits(pb2, 1, 0);
1104 if(interleaved_stats){
1105 s->misc_bits+= get_bits_diff(s);
1108 /* motion vectors: 16x16 mode */
1109 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1111 ff_h263_encode_motion_vector(s, motion_x - pred_x,
1112 motion_y - pred_y, s->f_code);
1113 }else if(s->mv_type==MV_TYPE_FIELD){
1114 if(s->dquant) cbpc+= 8;
1116 inter_MCBPC_bits[cbpc],
1117 inter_MCBPC_code[cbpc]);
1119 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1121 put_bits(pb2, 2, dquant_code[s->dquant+2]);
1123 assert(!s->progressive_sequence);
1125 put_bits(pb2, 1, s->interlaced_dct);
1126 put_bits(pb2, 1, 1);
1128 if(interleaved_stats){
1129 s->misc_bits+= get_bits_diff(s);
1132 /* motion vectors: 16x8 interlaced mode */
1133 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1136 put_bits(&s->pb, 1, s->field_select[0][0]);
1137 put_bits(&s->pb, 1, s->field_select[0][1]);
1139 ff_h263_encode_motion_vector(s, s->mv[0][0][0] - pred_x,
1140 s->mv[0][0][1] - pred_y, s->f_code);
1141 ff_h263_encode_motion_vector(s, s->mv[0][1][0] - pred_x,
1142 s->mv[0][1][1] - pred_y, s->f_code);
1144 assert(s->mv_type==MV_TYPE_8X8);
1146 inter_MCBPC_bits[cbpc+16],
1147 inter_MCBPC_code[cbpc+16]);
1148 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1150 if(!s->progressive_sequence){
1152 put_bits(pb2, 1, s->interlaced_dct);
1155 if(interleaved_stats){
1156 s->misc_bits+= get_bits_diff(s);
1160 /* motion vectors: 8x8 mode*/
1161 h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1163 ff_h263_encode_motion_vector(s, s->current_picture.motion_val[0][ s->block_index[i] ][0] - pred_x,
1164 s->current_picture.motion_val[0][ s->block_index[i] ][1] - pred_y, s->f_code);
1168 if(interleaved_stats){
1169 s->mv_bits+= get_bits_diff(s);
1172 mpeg4_encode_blocks(s, block, NULL, NULL, NULL, tex_pb);
1174 if(interleaved_stats){
1175 s->p_tex_bits+= get_bits_diff(s);
1181 int dc_diff[6]; //dc values with the dc prediction subtracted
1182 int dir[6]; //prediction direction
1183 int zigzag_last_index[6];
1184 uint8_t *scan_table[6];
1188 dc_diff[i]= ff_mpeg4_pred_dc(s, i, block[i][0], &dir[i], 1);
1191 if(s->flags & CODEC_FLAG_AC_PRED){
1192 s->ac_pred= decide_ac_pred(s, block, dir, scan_table, zigzag_last_index);
1194 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1197 scan_table[i]= s->intra_scantable.permutated;
1202 for (i = 0; i < 6; i++) {
1203 if (s->block_last_index[i] >= 1)
1204 cbp |= 1 << (5 - i);
1208 if (s->pict_type == FF_I_TYPE) {
1209 if(s->dquant) cbpc+=4;
1211 intra_MCBPC_bits[cbpc],
1212 intra_MCBPC_code[cbpc]);
1214 if(s->dquant) cbpc+=8;
1215 put_bits(&s->pb, 1, 0); /* mb coded */
1217 inter_MCBPC_bits[cbpc + 4],
1218 inter_MCBPC_code[cbpc + 4]);
1220 put_bits(pb2, 1, s->ac_pred);
1222 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1224 put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
1226 if(!s->progressive_sequence){
1227 put_bits(dc_pb, 1, s->interlaced_dct);
1230 if(interleaved_stats){
1231 s->misc_bits+= get_bits_diff(s);
1234 mpeg4_encode_blocks(s, block, dc_diff, scan_table, dc_pb, tex_pb);
1236 if(interleaved_stats){
1237 s->i_tex_bits+= get_bits_diff(s);
1241 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
1243 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1247 void h263_encode_mb(MpegEncContext * s,
1248 DCTELEM block[6][64],
1249 int motion_x, int motion_y)
1251 int cbpc, cbpy, i, cbp, pred_x, pred_y;
1253 int16_t rec_intradc[6];
1255 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1);
1259 cbp= get_p_cbp(s, block, motion_x, motion_y);
1261 if ((cbp | motion_x | motion_y | s->dquant | (s->mv_type - MV_TYPE_16X16)) == 0) {
1262 /* skip macroblock */
1263 put_bits(&s->pb, 1, 1);
1264 if(interleaved_stats){
1272 put_bits(&s->pb, 1, 0); /* mb coded */
1276 if(s->alt_inter_vlc==0 || cbpc!=3)
1278 if(s->dquant) cbpc+= 8;
1279 if(s->mv_type==MV_TYPE_16X16){
1281 inter_MCBPC_bits[cbpc],
1282 inter_MCBPC_code[cbpc]);
1284 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1286 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1288 if(interleaved_stats){
1289 s->misc_bits+= get_bits_diff(s);
1292 /* motion vectors: 16x16 mode */
1293 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1296 ff_h263_encode_motion_vector(s, motion_x - pred_x,
1297 motion_y - pred_y, 1);
1300 h263p_encode_umotion(s, motion_x - pred_x);
1301 h263p_encode_umotion(s, motion_y - pred_y);
1302 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
1303 /* To prevent Start Code emulation */
1304 put_bits(&s->pb,1,1);
1308 inter_MCBPC_bits[cbpc+16],
1309 inter_MCBPC_code[cbpc+16]);
1310 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1312 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1314 if(interleaved_stats){
1315 s->misc_bits+= get_bits_diff(s);
1319 /* motion vectors: 8x8 mode*/
1320 h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1322 motion_x= s->current_picture.motion_val[0][ s->block_index[i] ][0];
1323 motion_y= s->current_picture.motion_val[0][ s->block_index[i] ][1];
1325 ff_h263_encode_motion_vector(s, motion_x - pred_x,
1326 motion_y - pred_y, 1);
1329 h263p_encode_umotion(s, motion_x - pred_x);
1330 h263p_encode_umotion(s, motion_y - pred_y);
1331 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
1332 /* To prevent Start Code emulation */
1333 put_bits(&s->pb,1,1);
1338 if(interleaved_stats){
1339 s->mv_bits+= get_bits_diff(s);
1342 assert(s->mb_intra);
1347 for(i=0; i<6; i++) {
1348 int16_t level = block[i][0];
1351 if(i<4) scale= s->y_dc_scale;
1352 else scale= s->c_dc_scale;
1354 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
1358 level = (level + (scale>>1))/scale;
1360 level = (level - (scale>>1))/scale;
1362 /* AIC can change CBP */
1363 if (level == 0 && s->block_last_index[i] == 0)
1364 s->block_last_index[i] = -1;
1366 if(!s->modified_quant){
1369 else if (level > 127)
1373 block[i][0] = level;
1374 /* Reconstruction */
1375 rec_intradc[i] = scale*level + pred_dc;
1377 rec_intradc[i] |= 1;
1378 //if ((rec_intradc[i] % 2) == 0)
1379 // rec_intradc[i]++;
1381 if (rec_intradc[i] < 0)
1383 else if (rec_intradc[i] > 2047)
1384 rec_intradc[i] = 2047;
1386 /* Update AC/DC tables */
1387 *dc_ptr[i] = rec_intradc[i];
1388 if (s->block_last_index[i] >= 0)
1389 cbp |= 1 << (5 - i);
1392 for(i=0; i<6; i++) {
1394 if (s->block_last_index[i] >= 1)
1395 cbp |= 1 << (5 - i);
1400 if (s->pict_type == FF_I_TYPE) {
1401 if(s->dquant) cbpc+=4;
1403 intra_MCBPC_bits[cbpc],
1404 intra_MCBPC_code[cbpc]);
1406 if(s->dquant) cbpc+=8;
1407 put_bits(&s->pb, 1, 0); /* mb coded */
1409 inter_MCBPC_bits[cbpc + 4],
1410 inter_MCBPC_code[cbpc + 4]);
1413 /* XXX: currently, we do not try to use ac prediction */
1414 put_bits(&s->pb, 1, 0); /* no AC prediction */
1417 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1419 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1421 if(interleaved_stats){
1422 s->misc_bits+= get_bits_diff(s);
1426 for(i=0; i<6; i++) {
1427 /* encode each block */
1428 h263_encode_block(s, block[i], i);
1430 /* Update INTRADC for decoding */
1431 if (s->h263_aic && s->mb_intra) {
1432 block[i][0] = rec_intradc[i];
1437 if(interleaved_stats){
1439 s->p_tex_bits+= get_bits_diff(s);
1442 s->i_tex_bits+= get_bits_diff(s);
1449 void ff_h263_loop_filter(MpegEncContext * s){
1451 const int linesize = s->linesize;
1452 const int uvlinesize= s->uvlinesize;
1453 const int xy = s->mb_y * s->mb_stride + s->mb_x;
1454 uint8_t *dest_y = s->dest[0];
1455 uint8_t *dest_cb= s->dest[1];
1456 uint8_t *dest_cr= s->dest[2];
1458 // if(s->pict_type==FF_B_TYPE && !s->readable) return;
1464 if(!IS_SKIP(s->current_picture.mb_type[xy])){
1466 s->dsp.h263_v_loop_filter(dest_y+8*linesize , linesize, qp_c);
1467 s->dsp.h263_v_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
1472 int qp_dt, qp_tt, qp_tc;
1474 if(IS_SKIP(s->current_picture.mb_type[xy-s->mb_stride]))
1477 qp_tt= s->current_picture.qscale_table[xy-s->mb_stride];
1485 const int chroma_qp= s->chroma_qscale_table[qp_tc];
1486 s->dsp.h263_v_loop_filter(dest_y , linesize, qp_tc);
1487 s->dsp.h263_v_loop_filter(dest_y+8, linesize, qp_tc);
1489 s->dsp.h263_v_loop_filter(dest_cb , uvlinesize, chroma_qp);
1490 s->dsp.h263_v_loop_filter(dest_cr , uvlinesize, chroma_qp);
1494 s->dsp.h263_h_loop_filter(dest_y-8*linesize+8 , linesize, qp_tt);
1497 if(qp_tt || IS_SKIP(s->current_picture.mb_type[xy-1-s->mb_stride]))
1500 qp_dt= s->current_picture.qscale_table[xy-1-s->mb_stride];
1503 const int chroma_qp= s->chroma_qscale_table[qp_dt];
1504 s->dsp.h263_h_loop_filter(dest_y -8*linesize , linesize, qp_dt);
1505 s->dsp.h263_h_loop_filter(dest_cb-8*uvlinesize, uvlinesize, chroma_qp);
1506 s->dsp.h263_h_loop_filter(dest_cr-8*uvlinesize, uvlinesize, chroma_qp);
1512 s->dsp.h263_h_loop_filter(dest_y +8, linesize, qp_c);
1513 if(s->mb_y + 1 == s->mb_height)
1514 s->dsp.h263_h_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
1519 if(qp_c || IS_SKIP(s->current_picture.mb_type[xy-1]))
1522 qp_lc= s->current_picture.qscale_table[xy-1];
1525 s->dsp.h263_h_loop_filter(dest_y, linesize, qp_lc);
1526 if(s->mb_y + 1 == s->mb_height){
1527 const int chroma_qp= s->chroma_qscale_table[qp_lc];
1528 s->dsp.h263_h_loop_filter(dest_y +8* linesize, linesize, qp_lc);
1529 s->dsp.h263_h_loop_filter(dest_cb , uvlinesize, chroma_qp);
1530 s->dsp.h263_h_loop_filter(dest_cr , uvlinesize, chroma_qp);
1537 static int h263_pred_dc(MpegEncContext * s, int n, int16_t **dc_val_ptr)
1539 int x, y, wrap, a, c, pred_dc;
1542 /* find prediction */
1544 x = 2 * s->mb_x + (n & 1);
1545 y = 2 * s->mb_y + ((n & 2) >> 1);
1546 wrap = s->b8_stride;
1547 dc_val = s->dc_val[0];
1551 wrap = s->mb_stride;
1552 dc_val = s->dc_val[n - 4 + 1];
1557 a = dc_val[(x - 1) + (y) * wrap];
1558 c = dc_val[(x) + (y - 1) * wrap];
1560 /* No prediction outside GOB boundary */
1561 if(s->first_slice_line && n!=3){
1563 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
1565 /* just DC prediction */
1566 if (a != 1024 && c != 1024)
1567 pred_dc = (a + c) >> 1;
1573 /* we assume pred is positive */
1574 *dc_val_ptr = &dc_val[x + y * wrap];
1577 #endif /* CONFIG_ENCODERS */
1579 static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n)
1581 int x, y, wrap, a, c, pred_dc, scale, i;
1582 int16_t *dc_val, *ac_val, *ac_val1;
1584 /* find prediction */
1586 x = 2 * s->mb_x + (n & 1);
1587 y = 2 * s->mb_y + (n>> 1);
1588 wrap = s->b8_stride;
1589 dc_val = s->dc_val[0];
1590 ac_val = s->ac_val[0][0];
1591 scale = s->y_dc_scale;
1595 wrap = s->mb_stride;
1596 dc_val = s->dc_val[n - 4 + 1];
1597 ac_val = s->ac_val[n - 4 + 1][0];
1598 scale = s->c_dc_scale;
1601 ac_val += ((y) * wrap + (x)) * 16;
1607 a = dc_val[(x - 1) + (y) * wrap];
1608 c = dc_val[(x) + (y - 1) * wrap];
1610 /* No prediction outside GOB boundary */
1611 if(s->first_slice_line && n!=3){
1613 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
1618 if (s->h263_aic_dir) {
1619 /* left prediction */
1623 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
1628 /* top prediction */
1630 ac_val -= 16 * wrap;
1632 block[s->dsp.idct_permutation[i ]] += ac_val[i + 8];
1638 /* just DC prediction */
1639 if (a != 1024 && c != 1024)
1640 pred_dc = (a + c) >> 1;
1647 /* we assume pred is positive */
1648 block[0]=block[0]*scale + pred_dc;
1655 /* Update AC/DC tables */
1656 dc_val[(x) + (y) * wrap] = block[0];
1660 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
1663 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
1666 int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir,
1670 int16_t *A, *B, *C, (*mot_val)[2];
1671 static const int off[4]= {2, 1, 1, -1};
1673 wrap = s->b8_stride;
1674 mot_val = s->current_picture.motion_val[dir] + s->block_index[block];
1677 /* special case for first (slice) line */
1678 if (s->first_slice_line && block<3) {
1679 // we can't just change some MVs to simulate that as we need them for the B frames (and ME)
1680 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
1681 if(block==0){ //most common case
1682 if(s->mb_x == s->resync_mb_x){ //rare
1684 }else if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
1685 C = mot_val[off[block] - wrap];
1690 *px = mid_pred(A[0], 0, C[0]);
1691 *py = mid_pred(A[1], 0, C[1]);
1698 if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
1699 C = mot_val[off[block] - wrap];
1700 *px = mid_pred(A[0], 0, C[0]);
1701 *py = mid_pred(A[1], 0, C[1]);
1706 }else{ /* block==2*/
1707 B = mot_val[ - wrap];
1708 C = mot_val[off[block] - wrap];
1709 if(s->mb_x == s->resync_mb_x) //rare
1712 *px = mid_pred(A[0], B[0], C[0]);
1713 *py = mid_pred(A[1], B[1], C[1]);
1716 B = mot_val[ - wrap];
1717 C = mot_val[off[block] - wrap];
1718 *px = mid_pred(A[0], B[0], C[0]);
1719 *py = mid_pred(A[1], B[1], C[1]);
1725 void ff_h263_encode_motion(MpegEncContext * s, int val, int f_code)
1727 int range, l, bit_size, sign, code, bits;
1732 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1734 bit_size = f_code - 1;
1735 range = 1 << bit_size;
1736 /* modulo encoding */
1737 l= INT_BIT - 6 - bit_size;
1740 val= (val^sign)-sign;
1744 code = (val >> bit_size) + 1;
1745 bits = val & (range - 1);
1747 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1749 put_bits(&s->pb, bit_size, bits);
1754 /* Encode MV differences on H.263+ with Unrestricted MV mode */
1755 static void h263p_encode_umotion(MpegEncContext * s, int val)
1765 put_bits(&s->pb, 1, 1);
1767 put_bits(&s->pb, 3, 0);
1769 put_bits(&s->pb, 3, 2);
1772 sval = ((val < 0) ? (short)(-val):(short)val);
1775 while (temp_val != 0) {
1776 temp_val = temp_val >> 1;
1782 tcode = (sval & (1 << (i-1))) >> (i-1);
1783 tcode = (tcode << 1) | 1;
1784 code = (code << 2) | tcode;
1787 code = ((code << 1) | (val < 0)) << 1;
1788 put_bits(&s->pb, (2*n_bits)+1, code);
1792 static void init_mv_penalty_and_fcode(MpegEncContext *s)
1797 for(f_code=1; f_code<=MAX_FCODE; f_code++){
1798 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
1801 if(mv==0) len= mvtab[0][1];
1803 int val, bit_size, code;
1805 bit_size = f_code - 1;
1811 code = (val >> bit_size) + 1;
1813 len= mvtab[code][1] + 1 + bit_size;
1815 len= mvtab[32][1] + av_log2(code>>5) + 2 + bit_size;
1819 mv_penalty[f_code][mv+MAX_MV]= len;
1823 for(f_code=MAX_FCODE; f_code>0; f_code--){
1824 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
1825 fcode_tab[mv+MAX_MV]= f_code;
1829 for(mv=0; mv<MAX_MV*2+1; mv++){
1830 umv_fcode_tab[mv]= 1;
1834 static void init_uni_dc_tab(void)
1836 int level, uni_code, uni_len;
1838 for(level=-256; level<256; level++){
1840 /* find number of bits */
1849 l= (-level) ^ ((1 << size) - 1);
1854 uni_code= DCtab_lum[size][0];
1855 uni_len = DCtab_lum[size][1];
1858 uni_code<<=size; uni_code|=l;
1861 uni_code<<=1; uni_code|=1;
1865 uni_DCtab_lum_bits[level+256]= uni_code;
1866 uni_DCtab_lum_len [level+256]= uni_len;
1869 uni_code= DCtab_chrom[size][0];
1870 uni_len = DCtab_chrom[size][1];
1873 uni_code<<=size; uni_code|=l;
1876 uni_code<<=1; uni_code|=1;
1880 uni_DCtab_chrom_bits[level+256]= uni_code;
1881 uni_DCtab_chrom_len [level+256]= uni_len;
1886 static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1887 int slevel, run, last;
1889 assert(MAX_LEVEL >= 64);
1890 assert(MAX_RUN >= 63);
1892 for(slevel=-64; slevel<64; slevel++){
1893 if(slevel==0) continue;
1894 for(run=0; run<64; run++){
1895 for(last=0; last<=1; last++){
1896 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1897 int level= slevel < 0 ? -slevel : slevel;
1898 int sign= slevel < 0 ? 1 : 0;
1899 int bits, len, code;
1902 len_tab[index]= 100;
1905 code= get_rl_index(rl, last, run, level);
1906 bits= rl->table_vlc[code][0];
1907 len= rl->table_vlc[code][1];
1908 bits=bits*2+sign; len++;
1910 if(code!=rl->n && len < len_tab[index]){
1911 bits_tab[index]= bits;
1912 len_tab [index]= len;
1915 bits= rl->table_vlc[rl->n][0];
1916 len= rl->table_vlc[rl->n][1];
1917 bits=bits*2; len++; //esc1
1918 level1= level - rl->max_level[last][run];
1920 code= get_rl_index(rl, last, run, level1);
1921 bits<<= rl->table_vlc[code][1];
1922 len += rl->table_vlc[code][1];
1923 bits += rl->table_vlc[code][0];
1924 bits=bits*2+sign; len++;
1926 if(code!=rl->n && len < len_tab[index]){
1927 bits_tab[index]= bits;
1928 len_tab [index]= len;
1932 bits= rl->table_vlc[rl->n][0];
1933 len= rl->table_vlc[rl->n][1];
1934 bits=bits*4+2; len+=2; //esc2
1935 run1 = run - rl->max_run[last][level] - 1;
1937 code= get_rl_index(rl, last, run1, level);
1938 bits<<= rl->table_vlc[code][1];
1939 len += rl->table_vlc[code][1];
1940 bits += rl->table_vlc[code][0];
1941 bits=bits*2+sign; len++;
1943 if(code!=rl->n && len < len_tab[index]){
1944 bits_tab[index]= bits;
1945 len_tab [index]= len;
1949 bits= rl->table_vlc[rl->n][0];
1950 len = rl->table_vlc[rl->n][1];
1951 bits=bits*4+3; len+=2; //esc3
1952 bits=bits*2+last; len++;
1953 bits=bits*64+run; len+=6;
1954 bits=bits*2+1; len++; //marker
1955 bits=bits*4096+(slevel&0xfff); len+=12;
1956 bits=bits*2+1; len++; //marker
1958 if(len < len_tab[index]){
1959 bits_tab[index]= bits;
1960 len_tab [index]= len;
1967 static void init_uni_h263_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1968 int slevel, run, last;
1970 assert(MAX_LEVEL >= 64);
1971 assert(MAX_RUN >= 63);
1973 for(slevel=-64; slevel<64; slevel++){
1974 if(slevel==0) continue;
1975 for(run=0; run<64; run++){
1976 for(last=0; last<=1; last++){
1977 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1978 int level= slevel < 0 ? -slevel : slevel;
1979 int sign= slevel < 0 ? 1 : 0;
1980 int bits, len, code;
1982 len_tab[index]= 100;
1985 code= get_rl_index(rl, last, run, level);
1986 bits= rl->table_vlc[code][0];
1987 len= rl->table_vlc[code][1];
1988 bits=bits*2+sign; len++;
1990 if(code!=rl->n && len < len_tab[index]){
1991 if(bits_tab) bits_tab[index]= bits;
1992 len_tab [index]= len;
1995 bits= rl->table_vlc[rl->n][0];
1996 len = rl->table_vlc[rl->n][1];
1997 bits=bits*2+last; len++;
1998 bits=bits*64+run; len+=6;
1999 bits=bits*256+(level&0xff); len+=8;
2001 if(len < len_tab[index]){
2002 if(bits_tab) bits_tab[index]= bits;
2003 len_tab [index]= len;
2010 void h263_encode_init(MpegEncContext *s)
2012 static int done = 0;
2019 init_rl(&rl_inter, static_rl_table_store[0]);
2020 init_rl(&rl_intra, static_rl_table_store[1]);
2021 init_rl(&rl_intra_aic, static_rl_table_store[2]);
2023 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
2024 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
2026 init_uni_h263_rl_tab(&rl_intra_aic, NULL, uni_h263_intra_aic_rl_len);
2027 init_uni_h263_rl_tab(&rl_inter , NULL, uni_h263_inter_rl_len);
2029 init_mv_penalty_and_fcode(s);
2031 s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
2033 s->intra_ac_vlc_length =s->inter_ac_vlc_length = uni_h263_inter_rl_len;
2034 s->intra_ac_vlc_last_length=s->inter_ac_vlc_last_length= uni_h263_inter_rl_len + 128*64;
2036 s->intra_ac_vlc_length = uni_h263_intra_aic_rl_len;
2037 s->intra_ac_vlc_last_length= uni_h263_intra_aic_rl_len + 128*64;
2039 s->ac_esc_length= 7+1+6+8;
2041 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
2042 switch(s->codec_id){
2043 case CODEC_ID_MPEG4:
2044 s->fcode_tab= fcode_tab;
2045 s->min_qcoeff= -2048;
2046 s->max_qcoeff= 2047;
2047 s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len;
2048 s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64;
2049 s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len;
2050 s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64;
2051 s->luma_dc_vlc_length= uni_DCtab_lum_len;
2052 s->chroma_dc_vlc_length= uni_DCtab_chrom_len;
2053 s->ac_esc_length= 7+2+1+6+1+12+1;
2054 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
2055 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
2057 if(s->flags & CODEC_FLAG_GLOBAL_HEADER){
2059 s->avctx->extradata= av_malloc(1024);
2060 init_put_bits(&s->pb, s->avctx->extradata, 1024);
2062 if(!(s->workaround_bugs & FF_BUG_MS))
2063 mpeg4_encode_visual_object_header(s);
2064 mpeg4_encode_vol_header(s, 0, 0);
2066 // ff_mpeg4_stuffing(&s->pb); ?
2067 flush_put_bits(&s->pb);
2068 s->avctx->extradata_size= (put_bits_count(&s->pb)+7)>>3;
2072 case CODEC_ID_H263P:
2074 s->fcode_tab= umv_fcode_tab;
2075 if(s->modified_quant){
2076 s->min_qcoeff= -2047;
2077 s->max_qcoeff= 2047;
2079 s->min_qcoeff= -127;
2083 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
2085 if (s->h263_flv > 1) {
2086 s->min_qcoeff= -1023;
2087 s->max_qcoeff= 1023;
2089 s->min_qcoeff= -127;
2092 s->y_dc_scale_table=
2093 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
2095 default: //nothing needed - default table already set in mpegvideo.c
2096 s->min_qcoeff= -127;
2098 s->y_dc_scale_table=
2099 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
2104 * encodes a 8x8 block.
2105 * @param block the 8x8 block
2106 * @param n block index (0-3 are luma, 4-5 are chroma)
2108 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
2110 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
2114 if (s->mb_intra && !s->h263_aic) {
2117 /* 255 cannot be represented, so we clamp */
2122 /* 0 cannot be represented also */
2123 else if (level < 1) {
2127 if (level == 128) //FIXME check rv10
2128 put_bits(&s->pb, 8, 0xff);
2130 put_bits(&s->pb, 8, level);
2134 if (s->h263_aic && s->mb_intra)
2137 if(s->alt_inter_vlc && !s->mb_intra){
2139 int inter_vlc_bits=0;
2143 last_index = s->block_last_index[n];
2144 last_non_zero = i - 1;
2145 for (; i <= last_index; i++) {
2146 j = s->intra_scantable.permutated[i];
2149 run = i - last_non_zero - 1;
2150 last = (i == last_index);
2152 if(level<0) level= -level;
2154 code = get_rl_index(rl, last, run, level);
2155 aic_code = get_rl_index(&rl_intra_aic, last, run, level);
2156 inter_vlc_bits += rl->table_vlc[code][1]+1;
2157 aic_vlc_bits += rl_intra_aic.table_vlc[aic_code][1]+1;
2159 if (code == rl->n) {
2160 inter_vlc_bits += 1+6+8-1;
2162 if (aic_code == rl_intra_aic.n) {
2163 aic_vlc_bits += 1+6+8-1;
2164 wrong_pos += run + 1;
2166 wrong_pos += wrong_run[aic_code];
2171 if(aic_vlc_bits < inter_vlc_bits && wrong_pos > 63)
2177 last_index = s->block_last_index[n];
2178 last_non_zero = i - 1;
2179 for (; i <= last_index; i++) {
2180 j = s->intra_scantable.permutated[i];
2183 run = i - last_non_zero - 1;
2184 last = (i == last_index);
2191 code = get_rl_index(rl, last, run, level);
2192 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2193 if (code == rl->n) {
2194 if(s->h263_flv <= 1){
2195 put_bits(&s->pb, 1, last);
2196 put_bits(&s->pb, 6, run);
2198 assert(slevel != 0);
2201 put_sbits(&s->pb, 8, slevel);
2203 put_bits(&s->pb, 8, 128);
2204 put_sbits(&s->pb, 5, slevel);
2205 put_sbits(&s->pb, 6, slevel>>5);
2208 if(level < 64) { // 7-bit level
2209 put_bits(&s->pb, 1, 0);
2210 put_bits(&s->pb, 1, last);
2211 put_bits(&s->pb, 6, run);
2213 put_sbits(&s->pb, 7, slevel);
2216 put_bits(&s->pb, 1, 1);
2217 put_bits(&s->pb, 1, last);
2218 put_bits(&s->pb, 6, run);
2220 put_sbits(&s->pb, 11, slevel);
2224 put_bits(&s->pb, 1, sign);
2231 /***************************************************/
2233 * add mpeg4 stuffing bits (01...1)
2235 void ff_mpeg4_stuffing(PutBitContext * pbc)
2238 put_bits(pbc, 1, 0);
2239 length= (-put_bits_count(pbc))&7;
2240 if(length) put_bits(pbc, length, (1<<length)-1);
2243 /* must be called before writing the header */
2244 void ff_set_mpeg4_time(MpegEncContext * s){
2245 if(s->pict_type==FF_B_TYPE){
2246 ff_mpeg4_init_direct_mv(s);
2248 s->last_time_base= s->time_base;
2249 s->time_base= s->time/s->avctx->time_base.den;
2253 static void mpeg4_encode_gop_header(MpegEncContext * s){
2254 int hours, minutes, seconds;
2257 put_bits(&s->pb, 16, 0);
2258 put_bits(&s->pb, 16, GOP_STARTCODE);
2260 time= s->current_picture_ptr->pts;
2261 if(s->reordered_input_picture[1])
2262 time= FFMIN(time, s->reordered_input_picture[1]->pts);
2263 time= time*s->avctx->time_base.num;
2265 seconds= time/s->avctx->time_base.den;
2266 minutes= seconds/60; seconds %= 60;
2267 hours= minutes/60; minutes %= 60;
2270 put_bits(&s->pb, 5, hours);
2271 put_bits(&s->pb, 6, minutes);
2272 put_bits(&s->pb, 1, 1);
2273 put_bits(&s->pb, 6, seconds);
2275 put_bits(&s->pb, 1, !!(s->flags&CODEC_FLAG_CLOSED_GOP));
2276 put_bits(&s->pb, 1, 0); //broken link == NO
2278 s->last_time_base= time / s->avctx->time_base.den;
2280 ff_mpeg4_stuffing(&s->pb);
2283 static void mpeg4_encode_visual_object_header(MpegEncContext * s){
2284 int profile_and_level_indication;
2287 if(s->avctx->profile != FF_PROFILE_UNKNOWN){
2288 profile_and_level_indication = s->avctx->profile << 4;
2289 }else if(s->max_b_frames || s->quarter_sample){
2290 profile_and_level_indication= 0xF0; // adv simple
2292 profile_and_level_indication= 0x00; // simple
2295 if(s->avctx->level != FF_LEVEL_UNKNOWN){
2296 profile_and_level_indication |= s->avctx->level;
2298 profile_and_level_indication |= 1; //level 1
2301 if(profile_and_level_indication>>4 == 0xF){
2309 put_bits(&s->pb, 16, 0);
2310 put_bits(&s->pb, 16, VOS_STARTCODE);
2312 put_bits(&s->pb, 8, profile_and_level_indication);
2314 put_bits(&s->pb, 16, 0);
2315 put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);
2317 put_bits(&s->pb, 1, 1);
2318 put_bits(&s->pb, 4, vo_ver_id);
2319 put_bits(&s->pb, 3, 1); //priority
2321 put_bits(&s->pb, 4, 1); //visual obj type== video obj
2323 put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME
2325 ff_mpeg4_stuffing(&s->pb);
2328 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number)
2332 if (!CONFIG_MPEG4_ENCODER) return;
2334 if(s->max_b_frames || s->quarter_sample){
2336 s->vo_type= ADV_SIMPLE_VO_TYPE;
2339 s->vo_type= SIMPLE_VO_TYPE;
2342 put_bits(&s->pb, 16, 0);
2343 put_bits(&s->pb, 16, 0x100 + vo_number); /* video obj */
2344 put_bits(&s->pb, 16, 0);
2345 put_bits(&s->pb, 16, 0x120 + vol_number); /* video obj layer */
2347 put_bits(&s->pb, 1, 0); /* random access vol */
2348 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
2349 if(s->workaround_bugs & FF_BUG_MS) {
2350 put_bits(&s->pb, 1, 0); /* is obj layer id= no */
2352 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
2353 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
2354 put_bits(&s->pb, 3, 1); /* is obj layer priority */
2357 aspect_to_info(s, s->avctx->sample_aspect_ratio);
2359 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
2360 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
2361 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
2362 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
2365 if(s->workaround_bugs & FF_BUG_MS) { //
2366 put_bits(&s->pb, 1, 0); /* vol control parameters= no @@@ */
2368 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
2369 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
2370 put_bits(&s->pb, 1, s->low_delay);
2371 put_bits(&s->pb, 1, 0); /* vbv parameters= no */
2374 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
2375 put_bits(&s->pb, 1, 1); /* marker bit */
2377 put_bits(&s->pb, 16, s->avctx->time_base.den);
2378 if (s->time_increment_bits < 1)
2379 s->time_increment_bits = 1;
2380 put_bits(&s->pb, 1, 1); /* marker bit */
2381 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
2382 put_bits(&s->pb, 1, 1); /* marker bit */
2383 put_bits(&s->pb, 13, s->width); /* vol width */
2384 put_bits(&s->pb, 1, 1); /* marker bit */
2385 put_bits(&s->pb, 13, s->height); /* vol height */
2386 put_bits(&s->pb, 1, 1); /* marker bit */
2387 put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
2388 put_bits(&s->pb, 1, 1); /* obmc disable */
2389 if (vo_ver_id == 1) {
2390 put_bits(&s->pb, 1, s->vol_sprite_usage); /* sprite enable */
2392 put_bits(&s->pb, 2, s->vol_sprite_usage); /* sprite enable */
2395 put_bits(&s->pb, 1, 0); /* not 8 bit == false */
2396 put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
2399 ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix);
2400 ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix);
2404 put_bits(&s->pb, 1, s->quarter_sample);
2405 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
2406 s->resync_marker= s->rtp_mode;
2407 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
2408 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
2409 if(s->data_partitioning){
2410 put_bits(&s->pb, 1, 0); /* no rvlc */
2413 if (vo_ver_id != 1){
2414 put_bits(&s->pb, 1, 0); /* newpred */
2415 put_bits(&s->pb, 1, 0); /* reduced res vop */
2417 put_bits(&s->pb, 1, 0); /* scalability */
2419 ff_mpeg4_stuffing(&s->pb);
2422 if(!(s->flags & CODEC_FLAG_BITEXACT)){
2423 put_bits(&s->pb, 16, 0);
2424 put_bits(&s->pb, 16, 0x1B2); /* user_data */
2425 ff_put_string(&s->pb, LIBAVCODEC_IDENT, 0);
2429 /* write mpeg4 VOP header */
2430 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
2433 int time_div, time_mod;
2435 if(s->pict_type==FF_I_TYPE){
2436 if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
2437 if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT) //HACK, the reference sw is buggy
2438 mpeg4_encode_visual_object_header(s);
2439 if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT || picture_number==0) //HACK, the reference sw is buggy
2440 mpeg4_encode_vol_header(s, 0, 0);
2442 if(!(s->workaround_bugs & FF_BUG_MS))
2443 mpeg4_encode_gop_header(s);
2446 s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE;
2448 put_bits(&s->pb, 16, 0); /* vop header */
2449 put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */
2450 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
2453 time_div= s->time/s->avctx->time_base.den;
2454 time_mod= s->time%s->avctx->time_base.den;
2455 time_incr= time_div - s->last_time_base;
2456 assert(time_incr >= 0);
2458 put_bits(&s->pb, 1, 1);
2460 put_bits(&s->pb, 1, 0);
2462 put_bits(&s->pb, 1, 1); /* marker */
2463 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
2464 put_bits(&s->pb, 1, 1); /* marker */
2465 put_bits(&s->pb, 1, 1); /* vop coded */
2466 if ( s->pict_type == FF_P_TYPE
2467 || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
2468 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
2470 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
2471 if(!s->progressive_sequence){
2472 put_bits(&s->pb, 1, s->current_picture_ptr->top_field_first);
2473 put_bits(&s->pb, 1, s->alternate_scan);
2475 //FIXME sprite stuff
2477 put_bits(&s->pb, 5, s->qscale);
2479 if (s->pict_type != FF_I_TYPE)
2480 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
2481 if (s->pict_type == FF_B_TYPE)
2482 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
2485 #endif //CONFIG_ENCODERS
2489 * encoding quantized level -> quantized diff
2490 * decoding quantized diff -> quantized level
2491 * @param n block index (0-3 are luma, 4-5 are chroma)
2492 * @param dir_ptr pointer to an integer where the prediction direction will be stored
2494 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding)
2496 int a, b, c, wrap, pred, scale, ret;
2499 /* find prediction */
2501 scale = s->y_dc_scale;
2503 scale = s->c_dc_scale;
2508 wrap= s->block_wrap[n];
2509 dc_val = s->dc_val[0] + s->block_index[n];
2515 b = dc_val[ - 1 - wrap];
2516 c = dc_val[ - wrap];
2518 /* outside slice handling (we can't do that by memset as we need the dc for error resilience) */
2519 if(s->first_slice_line && n!=3){
2521 if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
2523 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
2524 if(n==0 || n==4 || n==5)
2528 if (abs(a - b) < abs(b - c)) {
2530 *dir_ptr = 1; /* top */
2533 *dir_ptr = 0; /* left */
2535 /* we assume pred is positive */
2536 pred = FASTDIV((pred + (scale >> 1)), scale);
2543 if(s->error_recognition>=3){
2545 av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
2548 if(level*scale > 2048 + scale){
2549 av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
2558 else if(!(s->workaround_bugs&FF_BUG_DC_CLIP))
2568 * @param n block index (0-3 are luma, 4-5 are chroma)
2569 * @param dir the ac prediction direction
2571 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
2575 int16_t *ac_val, *ac_val1;
2576 int8_t * const qscale_table= s->current_picture.qscale_table;
2578 /* find prediction */
2579 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2583 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
2584 /* left prediction */
2587 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
2590 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
2593 /* different qscale, we must rescale */
2595 block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
2599 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
2600 /* top prediction */
2601 ac_val -= 16 * s->block_wrap[n];
2603 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
2606 block[s->dsp.idct_permutation[i]] += ac_val[i + 8];
2609 /* different qscale, we must rescale */
2611 block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
2618 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
2622 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
2629 * encodes the dc value.
2630 * @param n block index (0-3 are luma, 4-5 are chroma)
2632 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
2638 put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]);
2641 put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]);
2645 /* find number of bits */
2655 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
2658 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
2661 /* encode remaining bits */
2664 level = (-level) ^ ((1 << size) - 1);
2665 put_bits(&s->pb, size, level);
2667 put_bits(&s->pb, 1, 1);
2672 static inline int mpeg4_get_dc_length(int level, int n){
2674 return uni_DCtab_lum_len[level + 256];
2676 return uni_DCtab_chrom_len[level + 256];
2681 * encodes a 8x8 block
2682 * @param n block index (0-3 are luma, 4-5 are chroma)
2684 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2685 uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
2687 int i, last_non_zero;
2688 #if 0 //variables for the outcommented version
2689 int code, sign, last;
2694 const int last_index = s->block_last_index[n];
2696 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2697 /* mpeg4 based DC predictor */
2698 mpeg4_encode_dc(dc_pb, intra_dc, n);
2699 if(last_index<1) return;
2702 bits_tab= uni_mpeg4_intra_rl_bits;
2703 len_tab = uni_mpeg4_intra_rl_len;
2705 if(last_index<0) return;
2708 bits_tab= uni_mpeg4_inter_rl_bits;
2709 len_tab = uni_mpeg4_inter_rl_len;
2713 last_non_zero = i - 1;
2715 for (; i < last_index; i++) {
2716 int level = block[ scan_table[i] ];
2718 int run = i - last_non_zero - 1;
2720 if((level&(~127)) == 0){
2721 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2722 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2724 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);
2729 /*if(i<=last_index)*/{
2730 int level = block[ scan_table[i] ];
2731 int run = i - last_non_zero - 1;
2733 if((level&(~127)) == 0){
2734 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2735 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2737 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);
2741 for (; i <= last_index; i++) {
2742 const int slevel = block[ scan_table[i] ];
2745 int run = i - last_non_zero - 1;
2746 last = (i == last_index);
2753 code = get_rl_index(rl, last, run, level);
2754 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2755 if (code == rl->n) {
2757 level1 = level - rl->max_level[last][run];
2760 code = get_rl_index(rl, last, run, level1);
2761 if (code == rl->n) {
2763 put_bits(ac_pb, 1, 1);
2764 if (level > MAX_LEVEL)
2766 run1 = run - rl->max_run[last][level] - 1;
2769 code = get_rl_index(rl, last, run1, level);
2770 if (code == rl->n) {
2773 put_bits(ac_pb, 1, 1);
2774 put_bits(ac_pb, 1, last);
2775 put_bits(ac_pb, 6, run);
2776 put_bits(ac_pb, 1, 1);
2777 put_sbits(ac_pb, 12, slevel);
2778 put_bits(ac_pb, 1, 1);
2781 put_bits(ac_pb, 1, 0);
2782 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2783 put_bits(ac_pb, 1, sign);
2787 put_bits(ac_pb, 1, 0);
2788 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2789 put_bits(ac_pb, 1, sign);
2792 put_bits(ac_pb, 1, sign);
2800 static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2801 uint8_t *scan_table)
2803 int i, last_non_zero;
2805 const int last_index = s->block_last_index[n];
2808 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2809 /* mpeg4 based DC predictor */
2810 len += mpeg4_get_dc_length(intra_dc, n);
2811 if(last_index<1) return len;
2813 len_tab = uni_mpeg4_intra_rl_len;
2815 if(last_index<0) return 0;
2817 len_tab = uni_mpeg4_inter_rl_len;
2821 last_non_zero = i - 1;
2822 for (; i < last_index; i++) {
2823 int level = block[ scan_table[i] ];
2825 int run = i - last_non_zero - 1;
2827 if((level&(~127)) == 0){
2828 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2829 len += len_tab[index];
2831 len += 7+2+1+6+1+12+1;
2836 /*if(i<=last_index)*/{
2837 int level = block[ scan_table[i] ];
2838 int run = i - last_non_zero - 1;
2840 if((level&(~127)) == 0){
2841 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2842 len += len_tab[index];
2844 len += 7+2+1+6+1+12+1;
2854 /***********************************************/
2857 static VLC intra_MCBPC_vlc;
2858 static VLC inter_MCBPC_vlc;
2859 static VLC cbpy_vlc;
2861 static VLC dc_lum, dc_chrom;
2862 static VLC sprite_trajectory;
2863 static VLC mb_type_b_vlc;
2864 static VLC h263_mbtype_b_vlc;
2865 static VLC cbpc_b_vlc;
2869 /* XXX: find a better solution to handle static init */
2870 void h263_decode_init_vlc(MpegEncContext *s)
2872 static int done = 0;
2877 INIT_VLC_STATIC(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 9,
2878 intra_MCBPC_bits, 1, 1,
2879 intra_MCBPC_code, 1, 1, 72);
2880 INIT_VLC_STATIC(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 28,
2881 inter_MCBPC_bits, 1, 1,
2882 inter_MCBPC_code, 1, 1, 198);
2883 INIT_VLC_STATIC(&cbpy_vlc, CBPY_VLC_BITS, 16,
2884 &cbpy_tab[0][1], 2, 1,
2885 &cbpy_tab[0][0], 2, 1, 64);
2886 INIT_VLC_STATIC(&mv_vlc, MV_VLC_BITS, 33,
2888 &mvtab[0][0], 2, 1, 538);
2889 init_rl(&rl_inter, static_rl_table_store[0]);
2890 init_rl(&rl_intra, static_rl_table_store[1]);
2891 init_rl(&rvlc_rl_inter, static_rl_table_store[3]);
2892 init_rl(&rvlc_rl_intra, static_rl_table_store[4]);
2893 init_rl(&rl_intra_aic, static_rl_table_store[2]);
2894 INIT_VLC_RL(rl_inter, 554);
2895 INIT_VLC_RL(rl_intra, 554);
2896 INIT_VLC_RL(rvlc_rl_inter, 1072);
2897 INIT_VLC_RL(rvlc_rl_intra, 1072);
2898 INIT_VLC_RL(rl_intra_aic, 554);
2899 INIT_VLC_STATIC(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
2900 &DCtab_lum[0][1], 2, 1,
2901 &DCtab_lum[0][0], 2, 1, 512);
2902 INIT_VLC_STATIC(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
2903 &DCtab_chrom[0][1], 2, 1,
2904 &DCtab_chrom[0][0], 2, 1, 512);
2905 INIT_VLC_STATIC(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
2906 &sprite_trajectory_tab[0][1], 4, 2,
2907 &sprite_trajectory_tab[0][0], 4, 2, 128);
2908 INIT_VLC_STATIC(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
2909 &mb_type_b_tab[0][1], 2, 1,
2910 &mb_type_b_tab[0][0], 2, 1, 16);
2911 INIT_VLC_STATIC(&h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15,
2912 &h263_mbtype_b_tab[0][1], 2, 1,
2913 &h263_mbtype_b_tab[0][0], 2, 1, 80);
2914 INIT_VLC_STATIC(&cbpc_b_vlc, CBPC_B_VLC_BITS, 4,
2915 &cbpc_b_tab[0][1], 2, 1,
2916 &cbpc_b_tab[0][0], 2, 1, 8);
2921 * Get the GOB height based on picture height.
2923 int ff_h263_get_gob_height(MpegEncContext *s){
2924 if (s->height <= 400)
2926 else if (s->height <= 800)
2932 int ff_h263_decode_mba(MpegEncContext *s)
2937 if(s->mb_num-1 <= ff_mba_max[i]) break;
2939 mb_pos= get_bits(&s->gb, ff_mba_length[i]);
2940 s->mb_x= mb_pos % s->mb_width;
2941 s->mb_y= mb_pos / s->mb_width;
2946 void ff_h263_encode_mba(MpegEncContext *s)
2951 if(s->mb_num-1 <= ff_mba_max[i]) break;
2953 mb_pos= s->mb_x + s->mb_width*s->mb_y;
2954 put_bits(&s->pb, ff_mba_length[i], mb_pos);
2958 * decodes the group of blocks header or slice header.
2959 * @return <0 if an error occurred
2961 static int h263_decode_gob_header(MpegEncContext *s)
2963 unsigned int val, gfid, gob_number;
2966 /* Check for GOB Start Code */
2967 val = show_bits(&s->gb, 16);
2971 /* We have a GBSC probably with GSTUFF */
2972 skip_bits(&s->gb, 16); /* Drop the zeros */
2973 left= get_bits_left(&s->gb);
2974 //MN: we must check the bits left or we might end in a infinite loop (or segfault)
2975 for(;left>13; left--){
2976 if(get_bits1(&s->gb)) break; /* Seek the '1' bit */
2981 if(s->h263_slice_structured){
2982 if(get_bits1(&s->gb)==0)
2985 ff_h263_decode_mba(s);
2987 if(s->mb_num > 1583)
2988 if(get_bits1(&s->gb)==0)
2991 s->qscale = get_bits(&s->gb, 5); /* SQUANT */
2992 if(get_bits1(&s->gb)==0)
2994 gfid = get_bits(&s->gb, 2); /* GFID */
2996 gob_number = get_bits(&s->gb, 5); /* GN */
2998 s->mb_y= s->gob_index* gob_number;
2999 gfid = get_bits(&s->gb, 2); /* GFID */
3000 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
3003 if(s->mb_y >= s->mb_height)
3012 static inline void memsetw(short *tab, int val, int n)
3021 void ff_mpeg4_init_partitions(MpegEncContext *s)
3023 uint8_t *start= put_bits_ptr(&s->pb);
3024 uint8_t *end= s->pb.buf_end;
3025 int size= end - start;
3026 int pb_size = (((intptr_t)start + size/3)&(~3)) - (intptr_t)start;
3027 int tex_size= (size - 2*pb_size)&(~3);
3029 set_put_bits_buffer_size(&s->pb, pb_size);
3030 init_put_bits(&s->tex_pb, start + pb_size , tex_size);
3031 init_put_bits(&s->pb2 , start + pb_size + tex_size, pb_size);
3034 void ff_mpeg4_merge_partitions(MpegEncContext *s)
3036 const int pb2_len = put_bits_count(&s->pb2 );
3037 const int tex_pb_len= put_bits_count(&s->tex_pb);
3038 const int bits= put_bits_count(&s->pb);
3040 if(s->pict_type==FF_I_TYPE){
3041 put_bits(&s->pb, 19, DC_MARKER);
3042 s->misc_bits+=19 + pb2_len + bits - s->last_bits;
3043 s->i_tex_bits+= tex_pb_len;
3045 put_bits(&s->pb, 17, MOTION_MARKER);
3046 s->misc_bits+=17 + pb2_len;
3047 s->mv_bits+= bits - s->last_bits;
3048 s->p_tex_bits+= tex_pb_len;
3051 flush_put_bits(&s->pb2);
3052 flush_put_bits(&s->tex_pb);
3054 set_put_bits_buffer_size(&s->pb, s->pb2.buf_end - s->pb.buf);
3055 ff_copy_bits(&s->pb, s->pb2.buf , pb2_len);
3056 ff_copy_bits(&s->pb, s->tex_pb.buf, tex_pb_len);
3057 s->last_bits= put_bits_count(&s->pb);
3060 #endif //CONFIG_ENCODERS
3062 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
3063 switch(s->pict_type){
3068 return s->f_code+15;
3070 return FFMAX3(s->f_code, s->b_code, 2) + 15;
3078 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
3080 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
3082 put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0);
3083 put_bits(&s->pb, 1, 1);
3085 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
3086 put_bits(&s->pb, s->quant_precision, s->qscale);
3087 put_bits(&s->pb, 1, 0); /* no HEC */
3090 #endif //CONFIG_ENCODERS
3093 * check if the next stuff is a resync marker or the end.
3096 static inline int mpeg4_is_resync(MpegEncContext *s){
3097 int bits_count= get_bits_count(&s->gb);
3098 int v= show_bits(&s->gb, 16);
3100 if(s->workaround_bugs&FF_BUG_NO_PADDING){
3105 if(s->pict_type==FF_B_TYPE || (v>>(8-s->pict_type)!=1) || s->partitioned_frame)
3107 skip_bits(&s->gb, 8+s->pict_type);
3108 bits_count+= 8+s->pict_type;
3109 v= show_bits(&s->gb, 16);
3112 if(bits_count + 8 >= s->gb.size_in_bits){
3114 v|= 0x7F >> (7-(bits_count&7));
3119 if(v == ff_mpeg4_resync_prefix[bits_count&7]){
3121 GetBitContext gb= s->gb;
3123 skip_bits(&s->gb, 1);
3124 align_get_bits(&s->gb);
3126 for(len=0; len<32; len++){
3127 if(get_bits1(&s->gb)) break;
3132 if(len>=ff_mpeg4_get_video_packet_prefix_length(s))
3140 * decodes the next video packet.
3141 * @return <0 if something went wrong
3143 static int mpeg4_decode_video_packet_header(MpegEncContext *s)
3145 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
3146 int header_extension=0, mb_num, len;
3148 /* is there enough space left for a video packet + header */
3149 if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1;
3151 for(len=0; len<32; len++){
3152 if(get_bits1(&s->gb)) break;
3155 if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
3156 av_log(s->avctx, AV_LOG_ERROR, "marker does not match f_code\n");
3160 if(s->shape != RECT_SHAPE){
3161 header_extension= get_bits1(&s->gb);
3162 //FIXME more stuff here
3165 mb_num= get_bits(&s->gb, mb_num_bits);
3166 if(mb_num>=s->mb_num){
3167 av_log(s->avctx, AV_LOG_ERROR, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);
3170 if(s->pict_type == FF_B_TYPE){
3171 while(s->next_picture.mbskip_table[ s->mb_index2xy[ mb_num ] ]) mb_num++;
3172 if(mb_num >= s->mb_num) return -1; // slice contains just skipped MBs which where already decoded
3175 s->mb_x= mb_num % s->mb_width;
3176 s->mb_y= mb_num / s->mb_width;
3178 if(s->shape != BIN_ONLY_SHAPE){
3179 int qscale= get_bits(&s->gb, s->quant_precision);
3181 s->chroma_qscale=s->qscale= qscale;
3184 if(s->shape == RECT_SHAPE){
3185 header_extension= get_bits1(&s->gb);
3187 if(header_extension){
3191 while (get_bits1(&s->gb) != 0)
3194 check_marker(&s->gb, "before time_increment in video packed header");
3195 time_increment= get_bits(&s->gb, s->time_increment_bits);
3196 check_marker(&s->gb, "before vop_coding_type in video packed header");
3198 skip_bits(&s->gb, 2); /* vop coding type */
3199 //FIXME not rect stuff here
3201 if(s->shape != BIN_ONLY_SHAPE){
3202 skip_bits(&s->gb, 3); /* intra dc vlc threshold */
3203 //FIXME don't just ignore everything
3204 if(s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3205 mpeg4_decode_sprite_trajectory(s, &s->gb);
3206 av_log(s->avctx, AV_LOG_ERROR, "untested\n");
3209 //FIXME reduced res stuff here
3211 if (s->pict_type != FF_I_TYPE) {
3212 int f_code = get_bits(&s->gb, 3); /* fcode_for */
3214 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (f_code=0)\n");
3217 if (s->pict_type == FF_B_TYPE) {
3218 int b_code = get_bits(&s->gb, 3);
3220 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (b_code=0)\n");
3225 //FIXME new-pred stuff
3230 void ff_mpeg4_clean_buffers(MpegEncContext *s)
3232 int c_wrap, c_xy, l_wrap, l_xy;
3234 l_wrap= s->b8_stride;
3235 l_xy= (2*s->mb_y-1)*l_wrap + s->mb_x*2 - 1;
3236 c_wrap= s->mb_stride;
3237 c_xy= (s->mb_y-1)*c_wrap + s->mb_x - 1;
3241 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
3242 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
3243 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
3247 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t));
3248 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
3249 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
3252 // we can't clear the MVs as they might be needed by a b frame
3253 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t));
3254 // memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
3255 s->last_mv[0][0][0]=
3256 s->last_mv[0][0][1]=
3257 s->last_mv[1][0][0]=
3258 s->last_mv[1][0][1]= 0;
3262 * finds the next resync_marker
3263 * @param p pointer to buffer to scan
3264 * @param end pointer to the end of the buffer
3265 * @return pointer to the next resync_marker, or \p end if none was found
3267 const uint8_t *ff_h263_find_resync_marker(const uint8_t *restrict p, const uint8_t * restrict end)
3275 if (!p[-1] && p[1]) return p - 1;
3276 else if(!p[ 1] && p[2]) return p;
3283 * decodes the group of blocks / video packet header.
3284 * @return bit position of the resync_marker, or <0 if none was found
3286 int ff_h263_resync(MpegEncContext *s){
3289 if(s->codec_id==CODEC_ID_MPEG4){
3291 align_get_bits(&s->gb);
3294 if(show_bits(&s->gb, 16)==0){
3295 pos= get_bits_count(&s->gb);
3296 if(s->codec_id==CODEC_ID_MPEG4)
3297 ret= mpeg4_decode_video_packet_header(s);
3299 ret= h263_decode_gob_header(s);
3303 //OK, it's not where it is supposed to be ...
3304 s->gb= s->last_resync_gb;
3305 align_get_bits(&s->gb);
3306 left= get_bits_left(&s->gb);
3308 for(;left>16+1+5+5; left-=8){
3309 if(show_bits(&s->gb, 16)==0){
3310 GetBitContext bak= s->gb;
3312 pos= get_bits_count(&s->gb);
3313 if(s->codec_id==CODEC_ID_MPEG4)
3314 ret= mpeg4_decode_video_packet_header(s);
3316 ret= h263_decode_gob_header(s);
3322 skip_bits(&s->gb, 8);
3329 * gets the average motion vector for a GMC MB.
3330 * @param n either 0 for the x component or 1 for y
3331 * @returns the average MV for a GMC MB
3333 static inline int get_amv(MpegEncContext *s, int n){
3334 int x, y, mb_v, sum, dx, dy, shift;
3335 int len = 1 << (s->f_code + 4);
3336 const int a= s->sprite_warping_accuracy;
3338 if(s->workaround_bugs & FF_BUG_AMV)
3339 len >>= s->quarter_sample;
3341 if(s->real_sprite_warping_points==1){
3342 if(s->divx_version==500 && s->divx_build==413)
3343 sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample));
3345 sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a);
3347 dx= s->sprite_delta[n][0];
3348 dy= s->sprite_delta[n][1];
3349 shift= s->sprite_shift[0];
3350 if(n) dy -= 1<<(shift + a + 1);
3351 else dx -= 1<<(shift + a + 1);
3352 mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16;
3355 for(y=0; y<16; y++){
3359 //XXX FIXME optimize
3360 for(x=0; x<16; x++){
3365 sum= RSHIFT(sum, a+8-s->quarter_sample);
3368 if (sum < -len) sum= -len;
3369 else if (sum >= len) sum= len-1;
3375 * decodes first partition.
3376 * @return number of MBs decoded or <0 if an error occurred
3378 static int mpeg4_decode_partition_a(MpegEncContext *s){
3380 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3382 /* decode first partition */
3384 s->first_slice_line=1;
3385 for(; s->mb_y<s->mb_height; s->mb_y++){
3386 ff_init_block_index(s);
3387 for(; s->mb_x<s->mb_width; s->mb_x++){
3388 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3393 ff_update_block_index(s);
3394 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3395 s->first_slice_line=0;
3397 if(s->pict_type==FF_I_TYPE){
3401 if(show_bits_long(&s->gb, 19)==DC_MARKER){
3405 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
3407 av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
3412 s->cbp_table[xy]= cbpc & 3;
3413 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3417 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3419 s->current_picture.qscale_table[xy]= s->qscale;
3421 s->mbintra_table[xy]= 1;
3424 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3426 av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3430 if(dc_pred_dir) dir|=1;
3432 s->pred_dir_table[xy]= dir;
3433 }else{ /* P/S_TYPE */
3434 int mx, my, pred_x, pred_y, bits;
3435 int16_t * const mot_val= s->current_picture.motion_val[0][s->block_index[0]];
3436 const int stride= s->b8_stride*2;
3439 bits= show_bits(&s->gb, 17);
3440 if(bits==MOTION_MARKER){
3446 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3447 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
3451 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3454 mot_val[0 ]= mot_val[2 ]=
3455 mot_val[0+stride]= mot_val[2+stride]= mx;
3456 mot_val[1 ]= mot_val[3 ]=
3457 mot_val[1+stride]= mot_val[3+stride]= my;
3459 if(s->mbintra_table[xy])
3460 ff_clean_intra_table_entries(s);
3464 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3466 av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
3472 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
3474 s->mb_intra = ((cbpc & 4) != 0);
3477 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3478 s->mbintra_table[xy]= 1;
3479 mot_val[0 ]= mot_val[2 ]=
3480 mot_val[0+stride]= mot_val[2+stride]= 0;
3481 mot_val[1 ]= mot_val[3 ]=
3482 mot_val[1+stride]= mot_val[3+stride]= 0;
3484 if(s->mbintra_table[xy])
3485 ff_clean_intra_table_entries(s);
3487 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
3488 s->mcsel= get_bits1(&s->gb);
3491 if ((cbpc & 16) == 0) {
3492 /* 16x16 motion prediction */
3494 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3496 mx = h263_decode_motion(s, pred_x, s->f_code);
3500 my = h263_decode_motion(s, pred_y, s->f_code);
3503 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3507 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
3510 mot_val[0 ]= mot_val[2 ] =
3511 mot_val[0+stride]= mot_val[2+stride]= mx;
3512 mot_val[1 ]= mot_val[3 ]=
3513 mot_val[1+stride]= mot_val[3+stride]= my;
3516 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3518 int16_t *mot_val= h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3519 mx = h263_decode_motion(s, pred_x, s->f_code);
3523 my = h263_decode_motion(s, pred_y, s->f_code);
3540 * decode second partition.
3541 * @return <0 if an error occurred
3543 static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
3545 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3547 s->mb_x= s->resync_mb_x;
3548 s->first_slice_line=1;
3549 for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
3550 ff_init_block_index(s);
3551 for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
3552 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3555 ff_update_block_index(s);
3556 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3557 s->first_slice_line=0;
3559 if(s->pict_type==FF_I_TYPE){
3560 int ac_pred= get_bits1(&s->gb);
3561 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3563 av_log(s->avctx, AV_LOG_ERROR, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3567 s->cbp_table[xy]|= cbpy<<2;
3568 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3569 }else{ /* P || S_TYPE */
3570 if(IS_INTRA(s->current_picture.mb_type[xy])){
3572 int ac_pred = get_bits1(&s->gb);
3573 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3576 av_log(s->avctx, AV_LOG_ERROR, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3580 if(s->cbp_table[xy] & 8) {
3581 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3583 s->current_picture.qscale_table[xy]= s->qscale;
3587 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3589 av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3593 if(dc_pred_dir) dir|=1;
3595 s->cbp_table[xy]&= 3; //remove dquant
3596 s->cbp_table[xy]|= cbpy<<2;
3597 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3598 s->pred_dir_table[xy]= dir;
3599 }else if(IS_SKIP(s->current_picture.mb_type[xy])){
3600 s->current_picture.qscale_table[xy]= s->qscale;
3601 s->cbp_table[xy]= 0;
3603 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3606 av_log(s->avctx, AV_LOG_ERROR, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3610 if(s->cbp_table[xy] & 8) {
3611 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3613 s->current_picture.qscale_table[xy]= s->qscale;
3615 s->cbp_table[xy]&= 3; //remove dquant
3616 s->cbp_table[xy]|= (cbpy^0xf)<<2;
3620 if(mb_num >= mb_count) return 0;
3627 * decodes the first & second partition
3628 * @return <0 if error (and sets error type in the error_status_table)
3630 int ff_mpeg4_decode_partitions(MpegEncContext *s)
3633 const int part_a_error= s->pict_type==FF_I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR;
3634 const int part_a_end = s->pict_type==FF_I_TYPE ? (DC_END |MV_END) : MV_END;
3636 mb_num= mpeg4_decode_partition_a(s);
3638 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3642 if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
3643 av_log(s->avctx, AV_LOG_ERROR, "slice below monitor ...\n");
3644 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3648 s->mb_num_left= mb_num;
3650 if(s->pict_type==FF_I_TYPE){
3651 while(show_bits(&s->gb, 9) == 1)
3652 skip_bits(&s->gb, 9);
3653 if(get_bits_long(&s->gb, 19)!=DC_MARKER){
3654 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
3658 while(show_bits(&s->gb, 10) == 1)
3659 skip_bits(&s->gb, 10);
3660 if(get_bits(&s->gb, 17)!=MOTION_MARKER){
3661 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
3665 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end);
3667 if( mpeg4_decode_partition_b(s, mb_num) < 0){
3668 if(s->pict_type==FF_P_TYPE)
3669 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR);
3672 if(s->pict_type==FF_P_TYPE)
3673 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END);
3680 * decode partition C of one MB.
3681 * @return <0 if an error occurred
3683 static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64])
3686 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3688 mb_type= s->current_picture.mb_type[xy];
3689 cbp = s->cbp_table[xy];
3691 s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold;
3693 if(s->current_picture.qscale_table[xy] != s->qscale){
3694 ff_set_qscale(s, s->current_picture.qscale_table[xy] );
3697 if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
3700 s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0];
3701 s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1];
3703 s->mb_intra = IS_INTRA(mb_type);
3705 if (IS_SKIP(mb_type)) {
3708 s->block_last_index[i] = -1;
3709 s->mv_dir = MV_DIR_FORWARD;
3710 s->mv_type = MV_TYPE_16X16;
3711 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3718 }else if(s->mb_intra){
3719 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3720 }else if(!s->mb_intra){
3721 // s->mcsel= 0; //FIXME do we need to init that
3723 s->mv_dir = MV_DIR_FORWARD;
3724 if (IS_8X8(mb_type)) {
3725 s->mv_type = MV_TYPE_8X8;
3727 s->mv_type = MV_TYPE_16X16;
3730 } else { /* I-Frame */
3732 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3735 if (!IS_SKIP(mb_type)) {
3737 s->dsp.clear_blocks(s->block[0]);
3738 /* decode each block */
3739 for (i = 0; i < 6; i++) {
3740 if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){
3741 av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra);
3748 /* per-MB end of slice check */
3750 if(--s->mb_num_left <= 0){
3751 if(mpeg4_is_resync(s))
3756 if(mpeg4_is_resync(s)){
3757 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
3758 if(s->cbp_table[xy+delta])
3766 * read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :)
3768 static void preview_obmc(MpegEncContext *s){
3769 GetBitContext gb= s->gb;
3771 int cbpc, i, pred_x, pred_y, mx, my;
3773 const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
3774 const int stride= s->b8_stride*2;
3777 s->block_index[i]+= 2;
3779 s->block_index[i]+= 1;
3782 assert(s->pict_type == FF_P_TYPE);
3785 if (get_bits1(&s->gb)) {
3787 mot_val = s->current_picture.motion_val[0][ s->block_index[0] ];
3788 mot_val[0 ]= mot_val[2 ]=
3789 mot_val[0+stride]= mot_val[2+stride]= 0;
3790 mot_val[1 ]= mot_val[3 ]=
3791 mot_val[1+stride]= mot_val[3+stride]= 0;
3793 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3796 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3800 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3802 get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3804 if(s->modified_quant){
3805 if(get_bits1(&s->gb)) skip_bits(&s->gb, 1);
3806 else skip_bits(&s->gb, 5);
3808 skip_bits(&s->gb, 2);
3811 if ((cbpc & 16) == 0) {
3812 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3813 /* 16x16 motion prediction */
3814 mot_val= h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3816 mx = h263p_decode_umotion(s, pred_x);
3818 mx = h263_decode_motion(s, pred_x, 1);
3821 my = h263p_decode_umotion(s, pred_y);
3823 my = h263_decode_motion(s, pred_y, 1);
3825 mot_val[0 ]= mot_val[2 ]=
3826 mot_val[0+stride]= mot_val[2+stride]= mx;
3827 mot_val[1 ]= mot_val[3 ]=
3828 mot_val[1+stride]= mot_val[3+stride]= my;
3830 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3832 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3834 mx = h263p_decode_umotion(s, pred_x);
3836 mx = h263_decode_motion(s, pred_x, 1);
3839 my = h263p_decode_umotion(s, pred_y);
3841 my = h263_decode_motion(s, pred_y, 1);
3842 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3843 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3852 s->block_index[i]-= 2;
3854 s->block_index[i]-= 1;
3860 static void h263_decode_dquant(MpegEncContext *s){
3861 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3863 if(s->modified_quant){
3864 if(get_bits1(&s->gb))
3865 s->qscale= modified_quant_tab[get_bits1(&s->gb)][ s->qscale ];
3867 s->qscale= get_bits(&s->gb, 5);
3869 s->qscale += quant_tab[get_bits(&s->gb, 2)];
3870 ff_set_qscale(s, s->qscale);
3873 static int h263_skip_b_part(MpegEncContext *s, int cbp)
3875 DECLARE_ALIGNED(16, DCTELEM, dblock[64]);
3878 /* we have to set s->mb_intra to zero to decode B-part of PB-frame correctly
3879 * but real value should be restored in order to be used later (in OBMC condition)
3883 for (i = 0; i < 6; i++) {
3884 if (h263_decode_block(s, dblock, i, cbp&32) < 0)
3892 static int h263_get_modb(GetBitContext *gb, int pb_frame, int *cbpb)
3896 if (pb_frame < 3) { // h.263 Annex G and i263 PB-frame
3898 if (pb_frame == 2 && c)
3899 mv = !get_bits1(gb);
3900 } else { // h.263 Annex M improved PB-frame
3901 mv = get_unary(gb, 0, 4) + 1;
3906 *cbpb = get_bits(gb, 6);
3910 int ff_h263_decode_mb(MpegEncContext *s,
3911 DCTELEM block[6][64])
3913 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
3915 const int xy= s->mb_x + s->mb_y * s->mb_stride;
3916 int cbpb = 0, pb_mv_count = 0;
3918 assert(!s->h263_pred);
3920 if (s->pict_type == FF_P_TYPE) {
3922 if (get_bits1(&s->gb)) {
3926 s->block_last_index[i] = -1;
3927 s->mv_dir = MV_DIR_FORWARD;
3928 s->mv_type = MV_TYPE_16X16;
3929 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3932 s->mb_skipped = !(s->obmc | s->loop_filter);
3935 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3937 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
3942 s->dsp.clear_blocks(s->block[0]);
3945 s->mb_intra = ((cbpc & 4) != 0);
3946 if (s->mb_intra) goto intra;
3948 if(s->pb_frame && get_bits1(&s->gb))
3949 pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb);
3950 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3952 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
3955 cbp = (cbpc & 3) | (cbpy << 2);
3957 h263_decode_dquant(s);
3960 s->mv_dir = MV_DIR_FORWARD;
3961 if ((cbpc & 16) == 0) {
3962 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3963 /* 16x16 motion prediction */
3964 s->mv_type = MV_TYPE_16X16;
3965 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3967 mx = h263p_decode_umotion(s, pred_x);
3969 mx = h263_decode_motion(s, pred_x, 1);
3975 my = h263p_decode_umotion(s, pred_y);
3977 my = h263_decode_motion(s, pred_y, 1);
3981 s->mv[0][0][0] = mx;
3982 s->mv[0][0][1] = my;
3984 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3985 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3987 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3988 s->mv_type = MV_TYPE_8X8;
3990 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3992 mx = h263p_decode_umotion(s, pred_x);
3994 mx = h263_decode_motion(s, pred_x, 1);
3999 my = h263p_decode_umotion(s, pred_y);
4001 my = h263_decode_motion(s, pred_y, 1);
4004 s->mv[0][i][0] = mx;
4005 s->mv[0][i][1] = my;
4006 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
4007 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
4012 } else if(s->pict_type==FF_B_TYPE) {
4014 const int stride= s->b8_stride;
4015 int16_t *mot_val0 = s->current_picture.motion_val[0][ 2*(s->mb_x + s->mb_y*stride) ];
4016 int16_t *mot_val1 = s->current_picture.motion_val[1][ 2*(s->mb_x + s->mb_y*stride) ];
4017 // const int mv_xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
4020 mot_val0[0 ]= mot_val0[2 ]= mot_val0[0+2*stride]= mot_val0[2+2*stride]=
4021 mot_val0[1 ]= mot_val0[3 ]= mot_val0[1+2*stride]= mot_val0[3+2*stride]=
4022 mot_val1[0 ]= mot_val1[2 ]= mot_val1[0+2*stride]= mot_val1[2+2*stride]=
4023 mot_val1[1 ]= mot_val1[3 ]= mot_val1[1+2*stride]= mot_val1[3+2*stride]= 0;
4026 mb_type= get_vlc2(&s->gb, h263_mbtype_b_vlc.table, H263_MBTYPE_B_VLC_BITS, 2);
4028 av_log(s->avctx, AV_LOG_ERROR, "b mb_type damaged at %d %d\n", s->mb_x, s->mb_y);
4032 mb_type= h263_mb_type_b_map[ mb_type ];
4035 s->mb_intra = IS_INTRA(mb_type);
4036 if(HAS_CBP(mb_type)){
4037 s->dsp.clear_blocks(s->block[0]);
4038 cbpc = get_vlc2(&s->gb, cbpc_b_vlc.table, CBPC_B_VLC_BITS, 1);
4040 dquant = IS_QUANT(mb_type);
4044 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4047 av_log(s->avctx, AV_LOG_ERROR, "b cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4051 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
4054 cbp = (cbpc & 3) | (cbpy << 2);
4058 assert(!s->mb_intra);
4060 if(IS_QUANT(mb_type)){
4061 h263_decode_dquant(s);
4064 if(IS_DIRECT(mb_type)){
4065 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4066 mb_type |= ff_mpeg4_set_direct_mv(s, 0, 0);
4069 s->mv_type= MV_TYPE_16X16;
4072 if(USES_LIST(mb_type, 0)){
4073 int16_t *mot_val= h263_pred_motion(s, 0, 0, &mx, &my);
4074 s->mv_dir = MV_DIR_FORWARD;
4076 mx = h263_decode_motion(s, mx, 1);
4077 my = h263_decode_motion(s, my, 1);
4079 s->mv[0][0][0] = mx;
4080 s->mv[0][0][1] = my;
4081 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
4082 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
4085 if(USES_LIST(mb_type, 1)){
4086 int16_t *mot_val= h263_pred_motion(s, 0, 1, &mx, &my);
4087 s->mv_dir |= MV_DIR_BACKWARD;
4089 mx = h263_decode_motion(s, mx, 1);
4090 my = h263_decode_motion(s, my, 1);
4092 s->mv[1][0][0] = mx;
4093 s->mv[1][0][1] = my;
4094 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
4095 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
4099 s->current_picture.mb_type[xy]= mb_type;
4100 } else { /* I-Frame */
4102 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
4104 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4109 s->dsp.clear_blocks(s->block[0]);
4114 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
4116 s->ac_pred = get_bits1(&s->gb);
4118 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
4120 s->h263_aic_dir = get_bits1(&s->gb);
4125 if(s->pb_frame && get_bits1(&s->gb))
4126 pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb);
4127 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4129 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4132 cbp = (cbpc & 3) | (cbpy << 2);
4134 h263_decode_dquant(s);
4137 pb_mv_count += !!s->pb_frame;
4140 while(pb_mv_count--){
4141 h263_decode_motion(s, 0, 1);
4142 h263_decode_motion(s, 0, 1);
4145 /* decode each block */
4146 for (i = 0; i < 6; i++) {
4147 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
4152 if(s->pb_frame && h263_skip_b_part(s, cbpb) < 0)
4154 if(s->obmc && !s->mb_intra){
4155 if(s->pict_type == FF_P_TYPE && s->mb_x+1<s->mb_width && s->mb_num_left != 1)
4160 /* per-MB end of slice check */
4162 int v= show_bits(&s->gb, 16);
4164 if(get_bits_count(&s->gb) + 16 > s->gb.size_in_bits){
4165 v>>= get_bits_count(&s->gb) + 16 - s->gb.size_in_bits;
4175 int ff_mpeg4_decode_mb(MpegEncContext *s,
4176 DCTELEM block[6][64])
4178 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
4180 static int8_t quant_tab[4] = { -1, -2, 1, 2 };
4181 const int xy= s->mb_x + s->mb_y * s->mb_stride;
4183 assert(s->h263_pred);
4185 if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
4187 if (get_bits1(&s->gb)) {
4191 s->block_last_index[i] = -1;
4192 s->mv_dir = MV_DIR_FORWARD;
4193 s->mv_type = MV_TYPE_16X16;
4194 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
4195 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
4197 s->mv[0][0][0]= get_amv(s, 0);
4198 s->mv[0][0][1]= get_amv(s, 1);
4202 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4210 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
4212 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4217 s->dsp.clear_blocks(s->block[0]);
4219 s->mb_intra = ((cbpc & 4) != 0);
4220 if (s->mb_intra) goto intra;
4222 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
4223 s->mcsel= get_bits1(&s->gb);
4225 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1) ^ 0x0F;
4227 cbp = (cbpc & 3) | (cbpy << 2);
4229 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
4231 if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE)))
4232 s->interlaced_dct= get_bits1(&s->gb);
4234 s->mv_dir = MV_DIR_FORWARD;
4235 if ((cbpc & 16) == 0) {
4237 s->current_picture.mb_type[xy]= MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
4238 /* 16x16 global motion prediction */
4239 s->mv_type = MV_TYPE_16X16;
4242 s->mv[0][0][0] = mx;
4243 s->mv[0][0][1] = my;
4244 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
4245 s->current_picture.mb_type[xy]= MB_TYPE_16x8 | MB_TYPE_L0 | MB_TYPE_INTERLACED;
4246 /* 16x8 field motion prediction */
4247 s->mv_type= MV_TYPE_FIELD;
4249 s->field_select[0][0]= get_bits1(&s->gb);
4250 s->field_select[0][1]= get_bits1(&s->gb);
4252 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4255 mx = h263_decode_motion(s, pred_x, s->f_code);
4259 my = h263_decode_motion(s, pred_y/2, s->f_code);
4263 s->mv[0][i][0] = mx;
4264 s->mv[0][i][1] = my;
4267 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
4268 /* 16x16 motion prediction */
4269 s->mv_type = MV_TYPE_16X16;
4270 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4271 mx = h263_decode_motion(s, pred_x, s->f_code);
4276 my = h263_decode_motion(s, pred_y, s->f_code);
4280 s->mv[0][0][0] = mx;
4281 s->mv[0][0][1] = my;
4284 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
4285 s->mv_type = MV_TYPE_8X8;
4287 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
4288 mx = h263_decode_motion(s, pred_x, s->f_code);
4292 my = h263_decode_motion(s, pred_y, s->f_code);
4295 s->mv[0][i][0] = mx;
4296 s->mv[0][i][1] = my;
4301 } else if(s->pict_type==FF_B_TYPE) {
4302 int modb1; // first bit of modb
4303 int modb2; // second bit of modb
4306 s->mb_intra = 0; //B-frames never contain intra blocks
4307 s->mcsel=0; // ... true gmc blocks
4311 s->last_mv[i][0][0]=
4312 s->last_mv[i][0][1]=
4313 s->last_mv[i][1][0]=
4314 s->last_mv[i][1][1]= 0;
4318 /* if we skipped it in the future P Frame than skip it now too */
4319 s->mb_skipped= s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]; // Note, skiptab=0 if last was GMC
4324 s->block_last_index[i] = -1;
4326 s->mv_dir = MV_DIR_FORWARD;
4327 s->mv_type = MV_TYPE_16X16;
4332 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4336 modb1= get_bits1(&s->gb);
4338 mb_type= MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1; //like MB_TYPE_B_DIRECT but no vectors coded
4341 modb2= get_bits1(&s->gb);
4342 mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
4344 av_log(s->avctx, AV_LOG_ERROR, "illegal MB_type\n");
4347 mb_type= mb_type_b_map[ mb_type ];
4350 s->dsp.clear_blocks(s->block[0]);
4351 cbp= get_bits(&s->gb, 6);
4354 if ((!IS_DIRECT(mb_type)) && cbp) {
4355 if(get_bits1(&s->gb)){
4356 ff_set_qscale(s, s->qscale + get_bits1(&s->gb)*4 - 2);
4360 if(!s->progressive_sequence){
4362 s->interlaced_dct= get_bits1(&s->gb);
4364 if(!IS_DIRECT(mb_type) && get_bits1(&s->gb)){
4365 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
4366 mb_type &= ~MB_TYPE_16x16;
4368 if(USES_LIST(mb_type, 0)){
4369 s->field_select[0][0]= get_bits1(&s->gb);
4370 s->field_select[0][1]= get_bits1(&s->gb);
4372 if(USES_LIST(mb_type, 1)){
4373 s->field_select[1][0]= get_bits1(&s->gb);
4374 s->field_select[1][1]= get_bits1(&s->gb);
4380 if((mb_type & (MB_TYPE_DIRECT2|MB_TYPE_INTERLACED)) == 0){
4381 s->mv_type= MV_TYPE_16X16;
4383 if(USES_LIST(mb_type, 0)){
4384 s->mv_dir = MV_DIR_FORWARD;
4386 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
4387 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
4388 s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
4389 s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
4392 if(USES_LIST(mb_type, 1)){
4393 s->mv_dir |= MV_DIR_BACKWARD;
4395 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
4396 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
4397 s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
4398 s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
4400 }else if(!IS_DIRECT(mb_type)){
4401 s->mv_type= MV_TYPE_FIELD;
4403 if(USES_LIST(mb_type, 0)){
4404 s->mv_dir = MV_DIR_FORWARD;
4407 mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code);
4408 my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
4409 s->last_mv[0][i][0]= s->mv[0][i][0] = mx;
4410 s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
4414 if(USES_LIST(mb_type, 1)){
4415 s->mv_dir |= MV_DIR_BACKWARD;
4418 mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code);
4419 my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
4420 s->last_mv[1][i][0]= s->mv[1][i][0] = mx;
4421 s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
4427 if(IS_DIRECT(mb_type)){
4428 if(IS_SKIP(mb_type))
4431 mx = h263_decode_motion(s, 0, 1);
4432 my = h263_decode_motion(s, 0, 1);
4435 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4436 mb_type |= ff_mpeg4_set_direct_mv(s, mx, my);
4438 s->current_picture.mb_type[xy]= mb_type;
4439 } else { /* I-Frame */
4441 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
4443 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4451 s->ac_pred = get_bits1(&s->gb);
4453 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
4455 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
4457 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4459 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4462 cbp = (cbpc & 3) | (cbpy << 2);
4464 s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold;
4467 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
4470 if(!s->progressive_sequence)
4471 s->interlaced_dct= get_bits1(&s->gb);
4473 s->dsp.clear_blocks(s->block[0]);
4474 /* decode each block */
4475 for (i = 0; i < 6; i++) {
4476 if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0)
4483 /* decode each block */
4484 for (i = 0; i < 6; i++) {
4485 if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0)
4491 /* per-MB end of slice check */
4492 if(s->codec_id==CODEC_ID_MPEG4){
4493 if(mpeg4_is_resync(s)){
4494 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
4495 if(s->pict_type==FF_B_TYPE && s->next_picture.mbskip_table[xy + delta])
4504 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
4506 int code, val, sign, shift, l;
4507 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
4514 sign = get_bits1(&s->gb);
4518 val = (val - 1) << shift;
4519 val |= get_bits(&s->gb, shift);
4526 /* modulo decoding */
4527 if (!s->h263_long_vectors) {
4528 l = INT_BIT - 5 - f_code;
4531 /* horrible h263 long vector mode */
4532 if (pred < -31 && val < -63)
4534 if (pred > 32 && val > 63)
4541 /* Decodes RVLC of H.263+ UMV */
4542 static int h263p_decode_umotion(MpegEncContext * s, int pred)
4546 if (get_bits1(&s->gb)) /* Motion difference = 0 */
4549 code = 2 + get_bits1(&s->gb);
4551 while (get_bits1(&s->gb))
4554 code += get_bits1(&s->gb);
4559 code = (sign) ? (pred - code) : (pred + code);
4560 dprintf(s->avctx,"H.263+ UMV Motion = %d\n", code);
4565 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
4568 int code, level, i, j, last, run;
4569 RLTable *rl = &rl_inter;
4570 const uint8_t *scan_table;
4571 GetBitContext gb= s->gb;
4573 scan_table = s->intra_scantable.permutated;
4574 if (s->h263_aic && s->mb_intra) {
4578 if (s->h263_aic_dir)
4579 scan_table = s->intra_v_scantable.permutated; /* left */
4581 scan_table = s->intra_h_scantable.permutated; /* top */
4583 } else if (s->mb_intra) {
4585 if(s->codec_id == CODEC_ID_RV10){
4586 #if CONFIG_RV10_DECODER
4587 if (s->rv10_version == 3 && s->pict_type == FF_I_TYPE) {
4588 int component, diff;
4589 component = (n <= 3 ? 0 : n - 4 + 1);
4590 level = s->last_dc[component];
4591 if (s->rv10_first_dc_coded[component]) {
4592 diff = rv_decode_dc(s, n);
4596 level = level & 0xff; /* handle wrap round */
4597 s->last_dc[component] = level;
4599 s->rv10_first_dc_coded[component] = 1;
4602 level = get_bits(&s->gb, 8);
4608 level = get_bits(&s->gb, 8);
4609 if((level&0x7F) == 0){
4610 av_log(s->avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y);
4611 if(s->error_recognition >= FF_ER_COMPLIANT)
4623 if (s->mb_intra && s->h263_aic)
4625 s->block_last_index[n] = i - 1;
4630 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
4632 av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
4635 if (code == rl->n) {
4637 if (s->h263_flv > 1) {
4638 int is11 = get_bits1(&s->gb);
4639 last = get_bits1(&s->gb);
4640 run = get_bits(&s->gb, 6);
4642 level = get_sbits(&s->gb, 11);
4644 level = get_sbits(&s->gb, 7);
4647 last = get_bits1(&s->gb);
4648 run = get_bits(&s->gb, 6);
4649 level = (int8_t)get_bits(&s->gb, 8);
4651 if (s->codec_id == CODEC_ID_RV10) {
4652 /* XXX: should patch encoder too */
4653 level = get_sbits(&s->gb, 12);
4655 level = get_bits(&s->gb, 5);
4656 level |= get_sbits(&s->gb, 6)<<5;
4661 run = rl->table_run[code];
4662 level = rl->table_level[code];
4663 last = code >= rl->last;
4664 if (get_bits1(&s->gb))
4669 if(s->alt_inter_vlc && rl == &rl_inter && !s->mb_intra){
4670 //Looks like a hack but no, it's the way it is supposed to work ...
4674 s->dsp.clear_block(block);
4677 av_log(s->avctx, AV_LOG_ERROR, "run overflow at %dx%d i:%d\n", s->mb_x, s->mb_y, s->mb_intra);
4687 if (s->mb_intra && s->h263_aic) {
4688 h263_pred_acdc(s, block, n);
4691 s->block_last_index[n] = i;
4696 * decodes the dc value.
4697 * @param n block index (0-3 are luma, 4-5 are chroma)
4698 * @param dir_ptr the prediction direction will be stored here
4699 * @return the quantized dc
4701 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
4706 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
4708 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
4709 if (code < 0 || code > 9 /* && s->nbit<9 */){
4710 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
4718 level= 2*get_bits1(&s->gb)-1;
4720 if(get_bits1(&s->gb))
4721 level = get_bits(&s->gb, code-1) + (1<<(code-1));
4723 level = -get_bits(&s->gb, code-1) - (1<<(code-1));
4726 level = get_xbits(&s->gb, code);
4730 if(get_bits1(&s->gb)==0){ /* marker */
4731 if(s->error_recognition>=2){
4732 av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n");
4739 return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0);
4744 * @return <0 if an error occurred
4746 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
4747 int n, int coded, int intra, int rvlc)
4749 int level, i, last, run;
4752 RL_VLC_ELEM * rl_vlc;
4753 const uint8_t * scan_table;
4756 //Note intra & rvlc should be optimized away if this is inlined
4759 if(s->use_intra_dc_vlc){
4761 if(s->partitioned_frame){
4762 level = s->dc_val[0][ s->block_index[n] ];
4763 if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale);
4764 else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale);
4765 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32;
4767 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
4775 ff_mpeg4_pred_dc(s, n, 0, &dc_pred_dir, 0);
4781 rl = &rvlc_rl_intra;
4782 rl_vlc = rvlc_rl_intra.rl_vlc[0];
4785 rl_vlc = rl_intra.rl_vlc[0];
4788 if (dc_pred_dir == 0)
4789 scan_table = s->intra_v_scantable.permutated; /* left */
4791 scan_table = s->intra_h_scantable.permutated; /* top */
4793 scan_table = s->intra_scantable.permutated;
4800 s->block_last_index[n] = i;
4803 if(rvlc) rl = &rvlc_rl_inter;
4804 else rl = &rl_inter;
4806 scan_table = s->intra_scantable.permutated;
4812 rl_vlc = rvlc_rl_inter.rl_vlc[0];
4814 rl_vlc = rl_inter.rl_vlc[0];
4817 qmul = s->qscale << 1;
4818 qadd = (s->qscale - 1) | 1;
4820 rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale];
4822 rl_vlc = rl_inter.rl_vlc[s->qscale];
4827 OPEN_READER(re, &s->gb);
4829 UPDATE_CACHE(re, &s->gb);
4830 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
4834 if(SHOW_UBITS(re, &s->gb, 1)==0){
4835 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n");
4837 }; SKIP_CACHE(re, &s->gb, 1);
4839 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4840 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4841 SKIP_COUNTER(re, &s->gb, 1+1+6);
4842 UPDATE_CACHE(re, &s->gb);
4844 if(SHOW_UBITS(re, &s->gb, 1)==0){
4845 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n");
4847 }; SKIP_CACHE(re, &s->gb, 1);
4849 level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11);
4851 if(SHOW_UBITS(re, &s->gb, 5)!=0x10){
4852 av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n");
4854 }; SKIP_CACHE(re, &s->gb, 5);
4856 level= level * qmul + qadd;
4857 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1);
4858 SKIP_COUNTER(re, &s->gb, 1+11+5+1);
4864 cache= GET_CACHE(re, &s->gb);
4867 cache ^= 0xC0000000;
4869 if (cache&0x80000000) {
4870 if (cache&0x40000000) {
4872 SKIP_CACHE(re, &s->gb, 2);
4873 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4874 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4875 SKIP_COUNTER(re, &s->gb, 2+1+6);
4876 UPDATE_CACHE(re, &s->gb);
4879 level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12);
4881 if(SHOW_UBITS(re, &s->gb, 1)==0){
4882 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n");
4884 }; SKIP_CACHE(re, &s->gb, 1);
4886 level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
4888 if(SHOW_UBITS(re, &s->gb, 1)==0){
4889 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n");
4891 }; LAST_SKIP_CACHE(re, &s->gb, 1);
4893 SKIP_COUNTER(re, &s->gb, 1+12+1);
4897 if(s->error_recognition >= FF_ER_COMPLIANT){
4898 const int abs_level= FFABS(level);
4899 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
4900 const int run1= run - rl->max_run[last][abs_level] - 1;
4901 if(abs_level <= rl->max_level[last][run]){
4902 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
4905 if(s->error_recognition > FF_ER_COMPLIANT){
4906 if(abs_level <= rl->max_level[last][run]*2){
4907 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n");
4910 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
4911 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n");
4918 if (level>0) level= level * qmul + qadd;
4919 else level= level * qmul - qadd;
4921 if((unsigned)(level + 2048) > 4095){
4922 if(s->error_recognition > FF_ER_COMPLIANT){
4923 if(level > 2560 || level<-2560){
4924 av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
4928 level= level<0 ? -2048 : 2047;
4935 #if MIN_CACHE_BITS < 20
4936 LAST_SKIP_BITS(re, &s->gb, 2);
4937 UPDATE_CACHE(re, &s->gb);
4939 SKIP_BITS(re, &s->gb, 2);
4941 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
4942 i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing
4943 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4944 LAST_SKIP_BITS(re, &s->gb, 1);
4948 #if MIN_CACHE_BITS < 19
4949 LAST_SKIP_BITS(re, &s->gb, 1);
4950 UPDATE_CACHE(re, &s->gb);
4952 SKIP_BITS(re, &s->gb, 1);
4954 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
4956 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
4957 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4958 LAST_SKIP_BITS(re, &s->gb, 1);
4963 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4964 LAST_SKIP_BITS(re, &s->gb, 1);
4969 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
4973 block[scan_table[i]] = level;
4977 block[scan_table[i]] = level;
4979 CLOSE_READER(re, &s->gb);
4983 if(!s->use_intra_dc_vlc){
4984 block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0);
4986 i -= i>>31; //if(i == -1) i=0;
4989 mpeg4_pred_ac(s, block, n, dc_pred_dir);
4991 i = 63; /* XXX: not optimal */
4994 s->block_last_index[n] = i;
4998 /* most is hardcoded. should extend to handle all h263 streams */
4999 int h263_decode_picture_header(MpegEncContext *s)
5001 int format, width, height, i;
5004 align_get_bits(&s->gb);
5006 startcode= get_bits(&s->gb, 22-8);
5008 for(i= get_bits_left(&s->gb); i>24; i-=8) {
5009 startcode = ((startcode << 8) | get_bits(&s->gb, 8)) & 0x003FFFFF;
5011 if(startcode == 0x20)
5015 if (startcode != 0x20) {
5016 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
5019 /* temporal reference */
5020 i = get_bits(&s->gb, 8); /* picture timestamp */
5021 if( (s->picture_number&~0xFF)+i < s->picture_number)
5023 s->current_picture_ptr->pts=
5024 s->picture_number= (s->picture_number&~0xFF) + i;
5026 /* PTYPE starts here */
5027 if (get_bits1(&s->gb) != 1) {
5029 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
5032 if (get_bits1(&s->gb) != 0) {
5033 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
5034 return -1; /* h263 id */
5036 skip_bits1(&s->gb); /* split screen off */
5037 skip_bits1(&s->gb); /* camera off */
5038 skip_bits1(&s->gb); /* freeze picture release off */
5040 format = get_bits(&s->gb, 3);
5045 7 extended PTYPE (PLUSPTYPE)
5048 if (format != 7 && format != 6) {
5051 width = h263_format[format][0];
5052 height = h263_format[format][1];
5056 s->pict_type = FF_I_TYPE + get_bits1(&s->gb);
5058 s->h263_long_vectors = get_bits1(&s->gb);
5060 if (get_bits1(&s->gb) != 0) {
5061 av_log(s->avctx, AV_LOG_ERROR, "H263 SAC not supported\n");
5062 return -1; /* SAC: off */
5064 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
5065 s->unrestricted_mv = s->h263_long_vectors || s->obmc;
5067 s->pb_frame = get_bits1(&s->gb);
5068 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
5069 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
5073 s->avctx->sample_aspect_ratio= (AVRational){12,11};
5074 s->avctx->time_base= (AVRational){1001, 30000};
5080 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
5082 /* ufep other than 0 and 1 are reserved */
5085 format = get_bits(&s->gb, 3);
5086 dprintf(s->avctx, "ufep=1, format: %d\n", format);
5087 s->custom_pcf= get_bits1(&s->gb);
5088 s->umvplus = get_bits1(&s->gb); /* Unrestricted Motion Vector */
5089 if (get_bits1(&s->gb) != 0) {
5090 av_log(s->avctx, AV_LOG_ERROR, "Syntax-based Arithmetic Coding (SAC) not supported\n");
5092 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
5093 s->h263_aic = get_bits1(&s->gb); /* Advanced Intra Coding (AIC) */
5094 s->loop_filter= get_bits1(&s->gb);
5095 s->unrestricted_mv = s->umvplus || s->obmc || s->loop_filter;
5097 s->h263_slice_structured= get_bits1(&s->gb);
5098 if (get_bits1(&s->gb) != 0) {
5099 av_log(s->avctx, AV_LOG_ERROR, "Reference Picture Selection not supported\n");
5101 if (get_bits1(&s->gb) != 0) {
5102 av_log(s->avctx, AV_LOG_ERROR, "Independent Segment Decoding not supported\n");
5104 s->alt_inter_vlc= get_bits1(&s->gb);
5105 s->modified_quant= get_bits1(&s->gb);
5106 if(s->modified_quant)
5107 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
5109 skip_bits(&s->gb, 1); /* Prevent start code emulation */
5111 skip_bits(&s->gb, 3); /* Reserved */
5112 } else if (ufep != 0) {
5113 av_log(s->avctx, AV_LOG_ERROR, "Bad UFEP type (%d)\n", ufep);
5118 s->pict_type = get_bits(&s->gb, 3);
5119 switch(s->pict_type){
5120 case 0: s->pict_type= FF_I_TYPE;break;
5121 case 1: s->pict_type= FF_P_TYPE;break;
5122 case 2: s->pict_type= FF_P_TYPE;s->pb_frame = 3;break;
5123 case 3: s->pict_type= FF_B_TYPE;break;
5124 case 7: s->pict_type= FF_I_TYPE;break; //ZYGO
5128 skip_bits(&s->gb, 2);
5129 s->no_rounding = get_bits1(&s->gb);
5130 skip_bits(&s->gb, 4);
5132 /* Get the picture dimensions */
5135 /* Custom Picture Format (CPFMT) */
5136 s->aspect_ratio_info = get_bits(&s->gb, 4);
5137 dprintf(s->avctx, "aspect: %d\n", s->aspect_ratio_info);
5142 3 - 10:11 (525-type 4:3)
5143 4 - 16:11 (CIF 16:9)
5144 5 - 40:33 (525-type 16:9)
5147 width = (get_bits(&s->gb, 9) + 1) * 4;
5149 height = get_bits(&s->gb, 9) * 4;
5150 dprintf(s->avctx, "\nH.263+ Custom picture: %dx%d\n",width,height);
5151 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
5152 /* aspected dimensions */
5153 s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 8);
5154 s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 8);
5156 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
5159 width = h263_format[format][0];
5160 height = h263_format[format][1];
5161 s->avctx->sample_aspect_ratio= (AVRational){12,11};
5163 if ((width == 0) || (height == 0))
5170 s->avctx->time_base.den= 1800000;
5171 s->avctx->time_base.num= 1000 + get_bits1(&s->gb);
5172 s->avctx->time_base.num*= get_bits(&s->gb, 7);
5173 if(s->avctx->time_base.num == 0){
5174 av_log(s, AV_LOG_ERROR, "zero framerate\n");
5177 gcd= av_gcd(s->avctx->time_base.den, s->avctx->time_base.num);
5178 s->avctx->time_base.den /= gcd;
5179 s->avctx->time_base.num /= gcd;
5181 s->avctx->time_base= (AVRational){1001, 30000};
5186 skip_bits(&s->gb, 2); //extended Temporal reference
5191 if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
5194 if(s->h263_slice_structured){
5195 if (get_bits1(&s->gb) != 0) {
5196 av_log(s->avctx, AV_LOG_ERROR, "rectangular slices not supported\n");
5198 if (get_bits1(&s->gb) != 0) {
5199 av_log(s->avctx, AV_LOG_ERROR, "unordered slices not supported\n");
5204 s->qscale = get_bits(&s->gb, 5);
5207 s->mb_width = (s->width + 15) / 16;
5208 s->mb_height = (s->height + 15) / 16;
5209 s->mb_num = s->mb_width * s->mb_height;
5212 skip_bits(&s->gb, 3); /* Temporal reference for B-pictures */
5214 skip_bits(&s->gb, 2); //extended Temporal reference
5215 skip_bits(&s->gb, 2); /* Quantization information for B-pictures */
5219 while (get_bits1(&s->gb) != 0) {
5220 skip_bits(&s->gb, 8);
5223 if(s->h263_slice_structured){
5224 if (get_bits1(&s->gb) != 1) {
5225 av_log(s->avctx, AV_LOG_ERROR, "SEPB1 marker missing\n");
5229 ff_h263_decode_mba(s);
5231 if (get_bits1(&s->gb) != 1) {
5232 av_log(s->avctx, AV_LOG_ERROR, "SEPB2 marker missing\n");
5239 s->y_dc_scale_table=
5240 s->c_dc_scale_table= ff_aic_dc_scale_table;
5242 s->y_dc_scale_table=
5243 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
5246 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
5249 if (s->pict_type == FF_I_TYPE && s->codec_tag == AV_RL32("ZYGO")){
5251 for(i=0; i<85; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
5252 av_log(s->avctx, AV_LOG_DEBUG, "\n");
5253 for(i=0; i<13; i++){
5255 int v= get_bits(&s->gb, 8);
5256 v |= get_sbits(&s->gb, 8)<<8;
5257 av_log(s->avctx, AV_LOG_DEBUG, " %5d", v);
5259 av_log(s->avctx, AV_LOG_DEBUG, "\n");
5261 for(i=0; i<50; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
5267 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb)
5270 int a= 2<<s->sprite_warping_accuracy;
5271 int rho= 3-s->sprite_warping_accuracy;
5273 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
5274 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
5275 int sprite_ref[4][2];
5276 int virtual_ref[2][2];
5278 int alpha=0, beta=0;
5283 for(i=0; i<s->num_sprite_warping_points; i++){
5287 length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);
5289 x= get_xbits(gb, length);
5291 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(gb); /* marker bit */
5293 length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);
5295 y=get_xbits(gb, length);
5297 skip_bits1(gb); /* marker bit */
5298 s->sprite_traj[i][0]= d[i][0]= x;
5299 s->sprite_traj[i][1]= d[i][1]= y;
5302 s->sprite_traj[i][0]= s->sprite_traj[i][1]= 0;
5304 while((1<<alpha)<w) alpha++;
5305 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
5309 // Note, the 4th point isn't used for GMC
5310 if(s->divx_version==500 && s->divx_build==413){
5311 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
5312 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
5313 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
5314 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
5315 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
5316 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
5318 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
5319 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
5320 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
5321 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
5322 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
5323 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
5325 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
5326 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
5328 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
5329 // perhaps it should be reordered to be more readable ...
5330 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
5331 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
5332 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
5333 + 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);
5334 virtual_ref[0][1]= 16*vop_ref[0][1]
5335 + 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);
5336 virtual_ref[1][0]= 16*vop_ref[0][0]
5337 + 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);
5338 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
5339 + 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);
5341 switch(s->num_sprite_warping_points)
5344 s->sprite_offset[0][0]= 0;
5345 s->sprite_offset[0][1]= 0;
5346 s->sprite_offset[1][0]= 0;
5347 s->sprite_offset[1][1]= 0;
5348 s->sprite_delta[0][0]= a;
5349 s->sprite_delta[0][1]= 0;
5350 s->sprite_delta[1][0]= 0;
5351 s->sprite_delta[1][1]= a;
5352 s->sprite_shift[0]= 0;
5353 s->sprite_shift[1]= 0;
5356 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
5357 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
5358 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
5359 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
5360 s->sprite_delta[0][0]= a;
5361 s->sprite_delta[0][1]= 0;
5362 s->sprite_delta[1][0]= 0;
5363 s->sprite_delta[1][1]= a;
5364 s->sprite_shift[0]= 0;
5365 s->sprite_shift[1]= 0;
5368 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
5369 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
5370 + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])
5371 + (1<<(alpha+rho-1));
5372 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
5373 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
5374 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])
5375 + (1<<(alpha+rho-1));
5376 s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
5377 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
5378 +2*w2*r*sprite_ref[0][0]
5380 + (1<<(alpha+rho+1)));
5381 s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
5382 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
5383 +2*w2*r*sprite_ref[0][1]
5385 + (1<<(alpha+rho+1)));
5386 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
5387 s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]);
5388 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
5389 s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
5391 s->sprite_shift[0]= alpha+rho;
5392 s->sprite_shift[1]= alpha+rho+2;
5395 min_ab= FFMIN(alpha, beta);
5398 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
5399 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])
5400 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])
5401 + (1<<(alpha+beta+rho-min_ab-1));
5402 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))
5403 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])
5404 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])
5405 + (1<<(alpha+beta+rho-min_ab-1));
5406 s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)
5407 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)
5408 + 2*w2*h3*r*sprite_ref[0][0]
5410 + (1<<(alpha+beta+rho-min_ab+1));
5411 s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)
5412 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)
5413 + 2*w2*h3*r*sprite_ref[0][1]
5415 + (1<<(alpha+beta+rho-min_ab+1));
5416 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;
5417 s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;
5418 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;
5419 s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;
5421 s->sprite_shift[0]= alpha + beta + rho - min_ab;
5422 s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;
5425 /* try to simplify the situation */
5426 if( s->sprite_delta[0][0] == a<<s->sprite_shift[0]
5427 && s->sprite_delta[0][1] == 0
5428 && s->sprite_delta[1][0] == 0
5429 && s->sprite_delta[1][1] == a<<s->sprite_shift[0])
5431 s->sprite_offset[0][0]>>=s->sprite_shift[0];
5432 s->sprite_offset[0][1]>>=s->sprite_shift[0];
5433 s->sprite_offset[1][0]>>=s->sprite_shift[1];
5434 s->sprite_offset[1][1]>>=s->sprite_shift[1];
5435 s->sprite_delta[0][0]= a;
5436 s->sprite_delta[0][1]= 0;
5437 s->sprite_delta[1][0]= 0;
5438 s->sprite_delta[1][1]= a;
5439 s->sprite_shift[0]= 0;
5440 s->sprite_shift[1]= 0;
5441 s->real_sprite_warping_points=1;
5444 int shift_y= 16 - s->sprite_shift[0];
5445 int shift_c= 16 - s->sprite_shift[1];
5447 s->sprite_offset[0][i]<<= shift_y;
5448 s->sprite_offset[1][i]<<= shift_c;
5449 s->sprite_delta[0][i]<<= shift_y;
5450 s->sprite_delta[1][i]<<= shift_y;
5451 s->sprite_shift[i]= 16;
5453 s->real_sprite_warping_points= s->num_sprite_warping_points;
5457 static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
5458 int hours, minutes, seconds;
5460 hours= get_bits(gb, 5);
5461 minutes= get_bits(gb, 6);
5463 seconds= get_bits(gb, 6);
5465 s->time_base= seconds + 60*(minutes + 60*hours);
5473 static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
5474 int width, height, vo_ver_id;
5477 skip_bits(gb, 1); /* random access */
5478 s->vo_type= get_bits(gb, 8);
5479 if (get_bits1(gb) != 0) { /* is_ol_id */
5480 vo_ver_id = get_bits(gb, 4); /* vo_ver_id */
5481 skip_bits(gb, 3); /* vo_priority */
5485 s->aspect_ratio_info= get_bits(gb, 4);
5486 if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
5487 s->avctx->sample_aspect_ratio.num= get_bits(gb, 8); // par_width
5488 s->avctx->sample_aspect_ratio.den= get_bits(gb, 8); // par_height
5490 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
5493 if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
5494 int chroma_format= get_bits(gb, 2);
5495 if(chroma_format!=CHROMA_420){
5496 av_log(s->avctx, AV_LOG_ERROR, "illegal chroma format\n");
5498 s->low_delay= get_bits1(gb);
5499 if(get_bits1(gb)){ /* vbv parameters */
5500 get_bits(gb, 15); /* first_half_bitrate */
5501 skip_bits1(gb); /* marker */
5502 get_bits(gb, 15); /* latter_half_bitrate */
5503 skip_bits1(gb); /* marker */
5504 get_bits(gb, 15); /* first_half_vbv_buffer_size */
5505 skip_bits1(gb); /* marker */
5506 get_bits(gb, 3); /* latter_half_vbv_buffer_size */
5507 get_bits(gb, 11); /* first_half_vbv_occupancy */
5508 skip_bits1(gb); /* marker */
5509 get_bits(gb, 15); /* latter_half_vbv_occupancy */
5510 skip_bits1(gb); /* marker */
5513 // set low delay flag only once the smartest? low delay detection won't be overriden
5514 if(s->picture_number==0)
5518 s->shape = get_bits(gb, 2); /* vol shape */
5519 if(s->shape != RECT_SHAPE) av_log(s->avctx, AV_LOG_ERROR, "only rectangular vol supported\n");
5520 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
5521 av_log(s->avctx, AV_LOG_ERROR, "Gray shape not supported\n");
5522 skip_bits(gb, 4); //video_object_layer_shape_extension
5525 check_marker(gb, "before time_increment_resolution");
5527 s->avctx->time_base.den = get_bits(gb, 16);
5528 if(!s->avctx->time_base.den){
5529 av_log(s->avctx, AV_LOG_ERROR, "time_base.den==0\n");
5533 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
5534 if (s->time_increment_bits < 1)
5535 s->time_increment_bits = 1;
5537 check_marker(gb, "before fixed_vop_rate");
5539 if (get_bits1(gb) != 0) { /* fixed_vop_rate */
5540 s->avctx->time_base.num = get_bits(gb, s->time_increment_bits);
5542 s->avctx->time_base.num = 1;
5546 if (s->shape != BIN_ONLY_SHAPE) {
5547 if (s->shape == RECT_SHAPE) {
5548 skip_bits1(gb); /* marker */
5549 width = get_bits(gb, 13);
5550 skip_bits1(gb); /* marker */
5551 height = get_bits(gb, 13);
5552 skip_bits1(gb); /* marker */
5553 if(width && height && !(s->width && s->codec_tag == AV_RL32("MP4S"))){ /* they should be non zero but who knows ... */
5559 s->progressive_sequence=
5560 s->progressive_frame= get_bits1(gb)^1;
5561 s->interlaced_dct=0;
5562 if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO))
5563 av_log(s->avctx, AV_LOG_INFO, "MPEG4 OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */
5564 if (vo_ver_id == 1) {
5565 s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */
5567 s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */
5569 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "Static Sprites not supported\n");
5570 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
5571 if(s->vol_sprite_usage==STATIC_SPRITE){
5572 s->sprite_width = get_bits(gb, 13);
5573 skip_bits1(gb); /* marker */
5574 s->sprite_height= get_bits(gb, 13);
5575 skip_bits1(gb); /* marker */
5576 s->sprite_left = get_bits(gb, 13);
5577 skip_bits1(gb); /* marker */
5578 s->sprite_top = get_bits(gb, 13);
5579 skip_bits1(gb); /* marker */
5581 s->num_sprite_warping_points= get_bits(gb, 6);
5582 if(s->num_sprite_warping_points > 3){
5583 av_log(s->avctx, AV_LOG_ERROR, "%d sprite_warping_points\n", s->num_sprite_warping_points);
5584 s->num_sprite_warping_points= 0;
5587 s->sprite_warping_accuracy = get_bits(gb, 2);
5588 s->sprite_brightness_change= get_bits1(gb);
5589 if(s->vol_sprite_usage==STATIC_SPRITE)
5590 s->low_latency_sprite= get_bits1(gb);
5592 // FIXME sadct disable bit if verid!=1 && shape not rect
5594 if (get_bits1(gb) == 1) { /* not_8_bit */
5595 s->quant_precision = get_bits(gb, 4); /* quant_precision */
5596 if(get_bits(gb, 4)!=8) av_log(s->avctx, AV_LOG_ERROR, "N-bit not supported\n"); /* bits_per_pixel */
5597 if(s->quant_precision!=5) av_log(s->avctx, AV_LOG_ERROR, "quant precision %d\n", s->quant_precision);
5599 s->quant_precision = 5;
5602 // FIXME a bunch of grayscale shape things
5604 if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */
5607 /* load default matrixes */
5608 for(i=0; i<64; i++){
5609 int j= s->dsp.idct_permutation[i];
5610 v= ff_mpeg4_default_intra_matrix[i];
5611 s->intra_matrix[j]= v;
5612 s->chroma_intra_matrix[j]= v;
5614 v= ff_mpeg4_default_non_intra_matrix[i];
5615 s->inter_matrix[j]= v;
5616 s->chroma_inter_matrix[j]= v;
5619 /* load custom intra matrix */
5622 for(i=0; i<64; i++){
5628 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5629 s->intra_matrix[j]= v;
5630 s->chroma_intra_matrix[j]= v;
5633 /* replicate last value */
5635 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5636 s->intra_matrix[j]= last;
5637 s->chroma_intra_matrix[j]= last;
5641 /* load custom non intra matrix */
5644 for(i=0; i<64; i++){
5650 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5651 s->inter_matrix[j]= v;
5652 s->chroma_inter_matrix[j]= v;
5655 /* replicate last value */
5657 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5658 s->inter_matrix[j]= last;
5659 s->chroma_inter_matrix[j]= last;
5663 // FIXME a bunch of grayscale shape things
5667 s->quarter_sample= get_bits1(gb);
5668 else s->quarter_sample=0;
5671 int pos= get_bits_count(gb);
5672 int estimation_method= get_bits(gb, 2);
5673 if(estimation_method<2){
5675 s->cplx_estimation_trash_i += 8*get_bits1(gb); //opaque
5676 s->cplx_estimation_trash_i += 8*get_bits1(gb); //transparent
5677 s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_cae
5678 s->cplx_estimation_trash_i += 8*get_bits1(gb); //inter_cae
5679 s->cplx_estimation_trash_i += 8*get_bits1(gb); //no_update
5680 s->cplx_estimation_trash_i += 8*get_bits1(gb); //upampling
5683 s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_blocks
5684 s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter_blocks
5685 s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter4v_blocks
5686 s->cplx_estimation_trash_i += 8*get_bits1(gb); //not coded blocks
5688 if(!check_marker(gb, "in complexity estimation part 1")){
5689 skip_bits_long(gb, pos - get_bits_count(gb));
5693 s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_coeffs
5694 s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_lines
5695 s->cplx_estimation_trash_i += 8*get_bits1(gb); //vlc_syms
5696 s->cplx_estimation_trash_i += 4*get_bits1(gb); //vlc_bits
5699 s->cplx_estimation_trash_p += 8*get_bits1(gb); //apm
5700 s->cplx_estimation_trash_p += 8*get_bits1(gb); //npm
5701 s->cplx_estimation_trash_b += 8*get_bits1(gb); //interpolate_mc_q
5702 s->cplx_estimation_trash_p += 8*get_bits1(gb); //forwback_mc_q
5703 s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel2
5704 s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel4
5706 if(!check_marker(gb, "in complexity estimation part 2")){
5707 skip_bits_long(gb, pos - get_bits_count(gb));
5710 if(estimation_method==1){
5711 s->cplx_estimation_trash_i += 8*get_bits1(gb); //sadct
5712 s->cplx_estimation_trash_p += 8*get_bits1(gb); //qpel
5715 av_log(s->avctx, AV_LOG_ERROR, "Invalid Complexity estimation method %d\n", estimation_method);
5718 s->cplx_estimation_trash_i=
5719 s->cplx_estimation_trash_p=
5720 s->cplx_estimation_trash_b= 0;
5723 s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */
5725 s->data_partitioning= get_bits1(gb);
5726 if(s->data_partitioning){
5727 s->rvlc= get_bits1(gb);
5730 if(vo_ver_id != 1) {
5731 s->new_pred= get_bits1(gb);
5733 av_log(s->avctx, AV_LOG_ERROR, "new pred not supported\n");
5734 skip_bits(gb, 2); /* requested upstream message type */
5735 skip_bits1(gb); /* newpred segment type */
5737 s->reduced_res_vop= get_bits1(gb);
5738 if(s->reduced_res_vop) av_log(s->avctx, AV_LOG_ERROR, "reduced resolution VOP not supported\n");
5742 s->reduced_res_vop= 0;
5745 s->scalability= get_bits1(gb);
5747 if (s->scalability) {
5748 GetBitContext bak= *gb;
5750 int ref_layer_sampling_dir;
5751 int h_sampling_factor_n;
5752 int h_sampling_factor_m;
5753 int v_sampling_factor_n;
5754 int v_sampling_factor_m;
5756 s->hierachy_type= get_bits1(gb);
5757 ref_layer_id= get_bits(gb, 4);
5758 ref_layer_sampling_dir= get_bits1(gb);
5759 h_sampling_factor_n= get_bits(gb, 5);
5760 h_sampling_factor_m= get_bits(gb, 5);
5761 v_sampling_factor_n= get_bits(gb, 5);
5762 v_sampling_factor_m= get_bits(gb, 5);
5763 s->enhancement_type= get_bits1(gb);
5765 if( h_sampling_factor_n==0 || h_sampling_factor_m==0
5766 || v_sampling_factor_n==0 || v_sampling_factor_m==0){
5772 av_log(s->avctx, AV_LOG_ERROR, "scalability not supported\n");
5774 // bin shape stuff FIXME
5781 * decodes the user data stuff in the header.
5782 * Also initializes divx/xvid/lavc_version/build.
5784 static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
5788 int ver = 0, build = 0, ver2 = 0, ver3 = 0;
5791 for(i=0; i<255 && get_bits_count(gb) < gb->size_in_bits; i++){
5792 if(show_bits(gb, 23) == 0) break;
5793 buf[i]= get_bits(gb, 8);
5797 /* divx detection */
5798 e=sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last);
5800 e=sscanf(buf, "DivX%db%d%c", &ver, &build, &last);
5802 s->divx_version= ver;
5803 s->divx_build= build;
5804 s->divx_packed= e==3 && last=='p';
5805 if(s->divx_packed && !s->showed_packed_warning) {
5806 av_log(s->avctx, AV_LOG_WARNING, "Invalid and inefficient vfw-avi packed B frames detected\n");
5807 s->showed_packed_warning=1;
5811 /* ffmpeg detection */
5812 e=sscanf(buf, "FFmpe%*[^b]b%d", &build)+3;
5814 e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
5816 e=sscanf(buf, "Lavc%d.%d.%d", &ver, &ver2, &ver3)+1;
5818 build= (ver<<16) + (ver2<<8) + ver3;
5821 if(strcmp(buf, "ffmpeg")==0){
5822 s->lavc_build= 4600;
5826 s->lavc_build= build;
5829 /* Xvid detection */
5830 e=sscanf(buf, "XviD%d", &build);
5832 s->xvid_build= build;
5838 static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
5839 int time_incr, time_increment;
5841 s->pict_type = get_bits(gb, 2) + FF_I_TYPE; /* pict type: I = 0 , P = 1 */
5842 if(s->pict_type==FF_B_TYPE && s->low_delay && s->vol_control_parameters==0 && !(s->flags & CODEC_FLAG_LOW_DELAY)){
5843 av_log(s->avctx, AV_LOG_ERROR, "low_delay flag incorrectly, clearing it\n");
5847 s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE;
5848 if(s->partitioned_frame)
5849 s->decode_mb= mpeg4_decode_partitioned_mb;
5851 s->decode_mb= ff_mpeg4_decode_mb;
5854 while (get_bits1(gb) != 0)
5857 check_marker(gb, "before time_increment");
5859 if(s->time_increment_bits==0 || !(show_bits(gb, s->time_increment_bits+1)&1)){
5860 av_log(s->avctx, AV_LOG_ERROR, "hmm, seems the headers are not complete, trying to guess time_increment_bits\n");
5862 for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){
5863 if ( s->pict_type == FF_P_TYPE
5864 || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
5865 if((show_bits(gb, s->time_increment_bits+6)&0x37) == 0x30) break;
5867 if((show_bits(gb, s->time_increment_bits+5)&0x1F) == 0x18) break;
5870 av_log(s->avctx, AV_LOG_ERROR, "my guess is %d bits ;)\n",s->time_increment_bits);
5873 if(IS_3IV1) time_increment= get_bits1(gb); //FIXME investigate further
5874 else time_increment= get_bits(gb, s->time_increment_bits);
5876 if(s->pict_type!=FF_B_TYPE){
5877 s->last_time_base= s->time_base;
5878 s->time_base+= time_incr;
5879 s->time= s->time_base*s->avctx->time_base.den + time_increment;
5880 if(s->workaround_bugs&FF_BUG_UMP4){
5881 if(s->time < s->last_non_b_time){
5883 s->time+= s->avctx->time_base.den;
5886 s->pp_time= s->time - s->last_non_b_time;
5887 s->last_non_b_time= s->time;
5889 s->time= (s->last_time_base + time_incr)*s->avctx->time_base.den + time_increment;
5890 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
5891 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
5892 return FRAME_SKIPPED;
5894 ff_mpeg4_init_direct_mv(s);
5896 if(s->t_frame==0) s->t_frame= s->pb_time;
5897 if(s->t_frame==0) s->t_frame=1; // 1/0 protection
5898 s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame)
5899 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
5900 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame)
5901 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
5902 if(!s->progressive_sequence){
5903 if(s->pp_field_time <= s->pb_field_time || s->pb_field_time <= 1)
5904 return FRAME_SKIPPED;
5908 if(s->avctx->time_base.num)
5909 s->current_picture_ptr->pts= (s->time + s->avctx->time_base.num/2) / s->avctx->time_base.num;
5911 s->current_picture_ptr->pts= AV_NOPTS_VALUE;
5912 if(s->avctx->debug&FF_DEBUG_PTS)
5913 av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %"PRId64"\n", s->current_picture_ptr->pts);
5915 check_marker(gb, "before vop_coded");
5918 if (get_bits1(gb) != 1){
5919 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
5920 av_log(s->avctx, AV_LOG_ERROR, "vop not coded\n");
5921 return FRAME_SKIPPED;
5923 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == FF_P_TYPE
5924 || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
5925 /* rounding type for motion estimation */
5926 s->no_rounding = get_bits1(gb);
5930 //FIXME reduced res stuff
5932 if (s->shape != RECT_SHAPE) {
5933 if (s->vol_sprite_usage != 1 || s->pict_type != FF_I_TYPE) {
5934 int width, height, hor_spat_ref, ver_spat_ref;
5936 width = get_bits(gb, 13);
5937 skip_bits1(gb); /* marker */
5938 height = get_bits(gb, 13);
5939 skip_bits1(gb); /* marker */
5940 hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */
5941 skip_bits1(gb); /* marker */
5942 ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */
5944 skip_bits1(gb); /* change_CR_disable */
5946 if (get_bits1(gb) != 0) {
5947 skip_bits(gb, 8); /* constant_alpha_value */
5950 //FIXME complexity estimation stuff
5952 if (s->shape != BIN_ONLY_SHAPE) {
5953 skip_bits_long(gb, s->cplx_estimation_trash_i);
5954 if(s->pict_type != FF_I_TYPE)
5955 skip_bits_long(gb, s->cplx_estimation_trash_p);
5956 if(s->pict_type == FF_B_TYPE)
5957 skip_bits_long(gb, s->cplx_estimation_trash_b);
5959 s->intra_dc_threshold= mpeg4_dc_threshold[ get_bits(gb, 3) ];
5960 if(!s->progressive_sequence){
5961 s->top_field_first= get_bits1(gb);
5962 s->alternate_scan= get_bits1(gb);
5964 s->alternate_scan= 0;
5967 if(s->alternate_scan){
5968 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
5969 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
5970 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
5971 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
5973 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
5974 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
5975 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
5976 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
5979 if(s->pict_type == FF_S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
5980 mpeg4_decode_sprite_trajectory(s, gb);
5981 if(s->sprite_brightness_change) av_log(s->avctx, AV_LOG_ERROR, "sprite_brightness_change not supported\n");
5982 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "static sprite not supported\n");
5985 if (s->shape != BIN_ONLY_SHAPE) {
5986 s->chroma_qscale= s->qscale = get_bits(gb, s->quant_precision);
5988 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (qscale=0)\n");
5989 return -1; // makes no sense to continue, as there is nothing left from the image then
5992 if (s->pict_type != FF_I_TYPE) {
5993 s->f_code = get_bits(gb, 3); /* fcode_for */
5995 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (f_code=0)\n");
5996 return -1; // makes no sense to continue, as the MV decoding will break very quickly
6001 if (s->pict_type == FF_B_TYPE) {
6002 s->b_code = get_bits(gb, 3);
6006 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
6007 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",
6008 s->qscale, s->f_code, s->b_code,
6009 s->pict_type == FF_I_TYPE ? "I" : (s->pict_type == FF_P_TYPE ? "P" : (s->pict_type == FF_B_TYPE ? "B" : "S")),
6010 gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first,
6011 s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,
6012 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);
6015 if(!s->scalability){
6016 if (s->shape!=RECT_SHAPE && s->pict_type!=FF_I_TYPE) {
6017 skip_bits1(gb); // vop shape coding type
6020 if(s->enhancement_type){
6021 int load_backward_shape= get_bits1(gb);
6022 if(load_backward_shape){
6023 av_log(s->avctx, AV_LOG_ERROR, "load backward shape isn't supported\n");
6026 skip_bits(gb, 2); //ref_select_code
6029 /* detect buggy encoders which don't set the low_delay flag (divx4/xvid/opendivx)*/
6030 // note we cannot detect divx5 without b-frames easily (although it's buggy too)
6031 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
6032 av_log(s->avctx, AV_LOG_ERROR, "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
6036 s->picture_number++; // better than pic number==0 always ;)
6038 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
6039 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
6041 if(s->workaround_bugs&FF_BUG_EDGE){
6042 s->h_edge_pos= s->width;
6043 s->v_edge_pos= s->height;
6049 * decode mpeg4 headers
6050 * @return <0 if no VOP found (or a damaged one)
6051 * FRAME_SKIPPED if a not coded VOP is found
6052 * 0 if a VOP is found
6054 int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb)
6058 /* search next start code */
6061 if(s->codec_tag == AV_RL32("WV1F") && show_bits(gb, 24) == 0x575630){
6063 if(get_bits(gb, 8) == 0xF0)
6069 if(get_bits_count(gb) >= gb->size_in_bits){
6070 if(gb->size_in_bits==8 && (s->divx_version || s->xvid_build)){
6071 av_log(s->avctx, AV_LOG_ERROR, "frame skip %d\n", gb->size_in_bits);
6072 return FRAME_SKIPPED; //divx bug
6074 return -1; //end of stream
6077 /* use the bits after the test */
6078 v = get_bits(gb, 8);
6079 startcode = ((startcode << 8) | v) & 0xffffffff;
6081 if((startcode&0xFFFFFF00) != 0x100)
6082 continue; //no startcode
6084 if(s->avctx->debug&FF_DEBUG_STARTCODE){
6085 av_log(s->avctx, AV_LOG_DEBUG, "startcode: %3X ", startcode);
6086 if (startcode<=0x11F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Start");
6087 else if(startcode<=0x12F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Layer Start");
6088 else if(startcode<=0x13F) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
6089 else if(startcode<=0x15F) av_log(s->avctx, AV_LOG_DEBUG, "FGS bp start");
6090 else if(startcode<=0x1AF) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
6091 else if(startcode==0x1B0) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq Start");
6092 else if(startcode==0x1B1) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq End");
6093 else if(startcode==0x1B2) av_log(s->avctx, AV_LOG_DEBUG, "User Data");
6094 else if(startcode==0x1B3) av_log(s->avctx, AV_LOG_DEBUG, "Group of VOP start");
6095 else if(startcode==0x1B4) av_log(s->avctx, AV_LOG_DEBUG, "Video Session Error");
6096 else if(startcode==0x1B5) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Start");
6097 else if(startcode==0x1B6) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Plane start");
6098 else if(startcode==0x1B7) av_log(s->avctx, AV_LOG_DEBUG, "slice start");
6099 else if(startcode==0x1B8) av_log(s->avctx, AV_LOG_DEBUG, "extension start");
6100 else if(startcode==0x1B9) av_log(s->avctx, AV_LOG_DEBUG, "fgs start");
6101 else if(startcode==0x1BA) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object start");
6102 else if(startcode==0x1BB) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object Plane start");
6103 else if(startcode==0x1BC) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object start");
6104 else if(startcode==0x1BD) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object Plane start");
6105 else if(startcode==0x1BE) av_log(s->avctx, AV_LOG_DEBUG, "Still Texture Object start");
6106 else if(startcode==0x1BF) av_log(s->avctx, AV_LOG_DEBUG, "Texture Spatial Layer start");
6107 else if(startcode==0x1C0) av_log(s->avctx, AV_LOG_DEBUG, "Texture SNR Layer start");
6108 else if(startcode==0x1C1) av_log(s->avctx, AV_LOG_DEBUG, "Texture Tile start");
6109 else if(startcode==0x1C2) av_log(s->avctx, AV_LOG_DEBUG, "Texture Shape Layer start");
6110 else if(startcode==0x1C3) av_log(s->avctx, AV_LOG_DEBUG, "stuffing start");
6111 else if(startcode<=0x1C5) av_log(s->avctx, AV_LOG_DEBUG, "reserved");
6112 else if(startcode<=0x1FF) av_log(s->avctx, AV_LOG_DEBUG, "System start");
6113 av_log(s->avctx, AV_LOG_DEBUG, " at %d\n", get_bits_count(gb));
6116 if(startcode >= 0x120 && startcode <= 0x12F){
6117 if(decode_vol_header(s, gb) < 0)
6120 else if(startcode == USER_DATA_STARTCODE){
6121 decode_user_data(s, gb);
6123 else if(startcode == GOP_STARTCODE){
6124 mpeg4_decode_gop_header(s, gb);
6126 else if(startcode == VOP_STARTCODE){
6134 if(s->flags& CODEC_FLAG_LOW_DELAY)
6136 s->avctx->has_b_frames= !s->low_delay;
6137 return decode_vop_header(s, gb);
6140 /* don't understand why they choose a different header ! */
6141 int intel_h263_decode_picture_header(MpegEncContext *s)
6145 /* picture header */
6146 if (get_bits_long(&s->gb, 22) != 0x20) {
6147 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
6150 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
6152 if (get_bits1(&s->gb) != 1) {
6153 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
6154 return -1; /* marker */
6156 if (get_bits1(&s->gb) != 0) {
6157 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
6158 return -1; /* h263 id */
6160 skip_bits1(&s->gb); /* split screen off */
6161 skip_bits1(&s->gb); /* camera off */
6162 skip_bits1(&s->gb); /* freeze picture release off */
6164 format = get_bits(&s->gb, 3);
6166 av_log(s->avctx, AV_LOG_ERROR, "Intel H263 free format not supported\n");
6171 s->pict_type = FF_I_TYPE + get_bits1(&s->gb);
6173 s->unrestricted_mv = get_bits1(&s->gb);
6174 s->h263_long_vectors = s->unrestricted_mv;
6176 if (get_bits1(&s->gb) != 0) {
6177 av_log(s->avctx, AV_LOG_ERROR, "SAC not supported\n");
6178 return -1; /* SAC: off */
6180 s->obmc= get_bits1(&s->gb);
6181 s->pb_frame = get_bits1(&s->gb);
6184 format = get_bits(&s->gb, 3);
6185 if(format == 0 || format == 7){
6186 av_log(s->avctx, AV_LOG_ERROR, "Wrong Intel H263 format\n");
6189 if(get_bits(&s->gb, 2))
6190 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
6191 s->loop_filter = get_bits1(&s->gb);
6192 if(get_bits1(&s->gb))
6193 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
6194 if(get_bits1(&s->gb))
6196 if(get_bits(&s->gb, 5))
6197 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
6198 if(get_bits(&s->gb, 5) != 1)
6199 av_log(s->avctx, AV_LOG_ERROR, "Invalid marker\n");
6202 int ar = get_bits(&s->gb, 4);
6203 skip_bits(&s->gb, 9); // display width
6205 skip_bits(&s->gb, 9); // display height
6207 skip_bits(&s->gb, 8); // aspect ratio - width
6208 skip_bits(&s->gb, 8); // aspect ratio - height
6212 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
6213 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
6216 skip_bits(&s->gb, 3); //temporal reference for B-frame
6217 skip_bits(&s->gb, 2); //dbquant
6221 while (get_bits1(&s->gb) != 0) {
6222 skip_bits(&s->gb, 8);
6226 s->y_dc_scale_table=
6227 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
6229 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
6235 int flv_h263_decode_picture_header(MpegEncContext *s)
6237 int format, width, height;
6239 /* picture header */
6240 if (get_bits_long(&s->gb, 17) != 1) {
6241 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
6244 format = get_bits(&s->gb, 5);
6245 if (format != 0 && format != 1) {
6246 av_log(s->avctx, AV_LOG_ERROR, "Bad picture format\n");
6249 s->h263_flv = format+1;
6250 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
6251 format = get_bits(&s->gb, 3);
6254 width = get_bits(&s->gb, 8);
6255 height = get_bits(&s->gb, 8);
6258 width = get_bits(&s->gb, 16);
6259 height = get_bits(&s->gb, 16);
6285 if(avcodec_check_dimensions(s->avctx, width, height))
6290 s->pict_type = FF_I_TYPE + get_bits(&s->gb, 2);
6291 s->dropable= s->pict_type > FF_P_TYPE;
6293 s->pict_type = FF_P_TYPE;
6295 skip_bits1(&s->gb); /* deblocking flag */
6296 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
6300 s->unrestricted_mv = 1;
6301 s->h263_long_vectors = 0;
6304 while (get_bits1(&s->gb) != 0) {
6305 skip_bits(&s->gb, 8);
6309 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
6310 av_log(s->avctx, AV_LOG_DEBUG, "%c esc_type:%d, qp:%d num:%d\n",
6311 s->dropable ? 'D' : av_get_pict_type_char(s->pict_type), s->h263_flv-1, s->qscale, s->picture_number);
6314 s->y_dc_scale_table=
6315 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;