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 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 * ac prediction encoding, b-frame support, error resilience, optimizations,
23 * qpel decoding, gmc decoding, interlaced decoding,
24 * by Michael Niedermayer <michaelni@gmx.at>
38 #include "mpegvideo.h"
40 #include "mpeg4data.h"
45 #define INTRA_MCBPC_VLC_BITS 6
46 #define INTER_MCBPC_VLC_BITS 7
47 #define CBPY_VLC_BITS 6
50 #define SPRITE_TRAJ_VLC_BITS 6
51 #define MB_TYPE_B_VLC_BITS 4
52 #define TEX_VLC_BITS 9
53 #define H263_MBTYPE_B_VLC_BITS 6
54 #define CBPC_B_VLC_BITS 3
56 #ifdef CONFIG_ENCODERS
57 static void h263_encode_block(MpegEncContext * s, DCTELEM * block,
59 static void h263p_encode_umotion(MpegEncContext * s, int val);
60 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block,
61 int n, int dc, uint8_t *scan_table,
62 PutBitContext *dc_pb, PutBitContext *ac_pb);
65 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode);
66 static int h263p_decode_umotion(MpegEncContext * s, int pred);
67 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
69 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
70 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
71 int n, int coded, int intra, int rvlc);
72 static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
74 static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr);
75 #ifdef CONFIG_ENCODERS
76 static void mpeg4_encode_visual_object_header(MpegEncContext * s);
77 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number);
78 #endif //CONFIG_ENCODERS
79 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb);
80 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding);
82 #ifdef CONFIG_ENCODERS
83 static uint8_t uni_DCtab_lum_len[512];
84 static uint8_t uni_DCtab_chrom_len[512];
85 static uint16_t uni_DCtab_lum_bits[512];
86 static uint16_t uni_DCtab_chrom_bits[512];
88 static uint8_t (*mv_penalty)[MAX_MV*2+1]= NULL;
89 static uint8_t fcode_tab[MAX_MV*2+1];
90 static uint8_t umv_fcode_tab[MAX_MV*2+1];
92 static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2];
93 static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2];
94 static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2];
95 static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2];
96 static uint8_t uni_h263_intra_aic_rl_len [64*64*2*2];
97 static uint8_t uni_h263_inter_rl_len [64*64*2*2];
98 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
99 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
100 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
113 #if 0 //3IV1 is quite rare and it slows things down a tiny bit
114 #define IS_3IV1 s->avctx->codec_tag == ff_get_fourcc("3IV1")
119 int h263_get_picture_format(int width, int height)
123 if (width == 128 && height == 96)
125 else if (width == 176 && height == 144)
127 else if (width == 352 && height == 288)
129 else if (width == 704 && height == 576)
131 else if (width == 1408 && height == 1152)
138 #ifdef CONFIG_ENCODERS
140 static void aspect_to_info(MpegEncContext * s, AVRational aspect){
143 if(aspect.num==0) aspect= (AVRational){1,1};
146 if(av_cmp_q(pixel_aspect[i], aspect) == 0){
147 s->aspect_ratio_info=i;
152 s->aspect_ratio_info= FF_ASPECT_EXTENDED;
155 void ff_flv_encode_picture_header(MpegEncContext * s, int picture_number)
159 align_put_bits(&s->pb);
161 put_bits(&s->pb, 17, 1);
162 put_bits(&s->pb, 5, (s->h263_flv-1)); /* 0: h263 escape codes 1: 11-bit escape codes */
163 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->time_base.num) / //FIXME use timestamp
164 s->avctx->time_base.den) & 0xff); /* TemporalReference */
165 if (s->width == 352 && s->height == 288)
167 else if (s->width == 176 && s->height == 144)
169 else if (s->width == 128 && s->height == 96)
171 else if (s->width == 320 && s->height == 240)
173 else if (s->width == 160 && s->height == 120)
175 else if (s->width <= 255 && s->height <= 255)
176 format = 0; /* use 1 byte width & height */
178 format = 1; /* use 2 bytes width & height */
179 put_bits(&s->pb, 3, format); /* PictureSize */
181 put_bits(&s->pb, 8, s->width);
182 put_bits(&s->pb, 8, s->height);
183 } else if (format == 1) {
184 put_bits(&s->pb, 16, s->width);
185 put_bits(&s->pb, 16, s->height);
187 put_bits(&s->pb, 2, s->pict_type == P_TYPE); /* PictureType */
188 put_bits(&s->pb, 1, 1); /* DeblockingFlag: on */
189 put_bits(&s->pb, 5, s->qscale); /* Quantizer */
190 put_bits(&s->pb, 1, 0); /* ExtraInformation */
194 s->c_dc_scale_table= ff_aic_dc_scale_table;
197 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
201 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
203 int format, coded_frame_rate, coded_frame_rate_base, i, temp_ref;
204 int best_clock_code=1;
206 int best_error= INT_MAX;
211 div= (s->avctx->time_base.num*1800000LL + 500LL*s->avctx->time_base.den) / ((1000LL+i)*s->avctx->time_base.den);
212 div= clip(1, div, 127);
213 error= ABS(s->avctx->time_base.num*1800000LL - (1000LL+i)*s->avctx->time_base.den*div);
214 if(error < best_error){
221 s->custom_pcf= best_clock_code!=1 || best_divisor!=60;
222 coded_frame_rate= 1800000;
223 coded_frame_rate_base= (1000+best_clock_code)*best_divisor;
225 align_put_bits(&s->pb);
227 /* Update the pointer to last GOB */
228 s->ptr_lastgob = pbBufPtr(&s->pb);
229 put_bits(&s->pb, 22, 0x20); /* PSC */
230 temp_ref= s->picture_number * (int64_t)coded_frame_rate * s->avctx->time_base.num / //FIXME use timestamp
231 (coded_frame_rate_base * (int64_t)s->avctx->time_base.den);
232 put_bits(&s->pb, 8, temp_ref & 0xff); /* TemporalReference */
234 put_bits(&s->pb, 1, 1); /* marker */
235 put_bits(&s->pb, 1, 0); /* h263 id */
236 put_bits(&s->pb, 1, 0); /* split screen off */
237 put_bits(&s->pb, 1, 0); /* camera off */
238 put_bits(&s->pb, 1, 0); /* freeze picture release off */
240 format = h263_get_picture_format(s->width, s->height);
243 put_bits(&s->pb, 3, format);
244 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
245 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
246 of H.263v1 UMV implies to check the predicted MV after
247 calculation of the current MB to see if we're on the limits */
248 put_bits(&s->pb, 1, 0); /* unrestricted motion vector: off */
249 put_bits(&s->pb, 1, 0); /* SAC: off */
250 put_bits(&s->pb, 1, s->obmc); /* advanced prediction mode */
251 put_bits(&s->pb, 1, 0); /* not PB frame */
252 put_bits(&s->pb, 5, s->qscale);
253 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
257 /* H.263 Plus PTYPE */
259 put_bits(&s->pb, 3, 7);
260 put_bits(&s->pb,3,ufep); /* Update Full Extended PTYPE */
262 put_bits(&s->pb,3,6); /* Custom Source Format */
264 put_bits(&s->pb, 3, format);
266 put_bits(&s->pb,1, s->custom_pcf);
267 put_bits(&s->pb,1, s->umvplus); /* Unrestricted Motion Vector */
268 put_bits(&s->pb,1,0); /* SAC: off */
269 put_bits(&s->pb,1,s->obmc); /* Advanced Prediction Mode */
270 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
271 put_bits(&s->pb,1,s->loop_filter); /* Deblocking Filter */
272 put_bits(&s->pb,1,s->h263_slice_structured); /* Slice Structured */
273 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
274 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
275 put_bits(&s->pb,1,s->alt_inter_vlc); /* Alternative Inter VLC */
276 put_bits(&s->pb,1,s->modified_quant); /* Modified Quantization: */
277 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
278 put_bits(&s->pb,3,0); /* Reserved */
280 put_bits(&s->pb, 3, s->pict_type == P_TYPE);
282 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
283 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
284 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
285 put_bits(&s->pb,2,0); /* Reserved */
286 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
288 /* This should be here if PLUSPTYPE */
289 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
292 /* Custom Picture Format (CPFMT) */
293 aspect_to_info(s, s->avctx->sample_aspect_ratio);
295 put_bits(&s->pb,4,s->aspect_ratio_info);
296 put_bits(&s->pb,9,(s->width >> 2) - 1);
297 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
298 put_bits(&s->pb,9,(s->height >> 2));
299 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
300 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
301 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
306 put_bits(&s->pb, 1, best_clock_code);
307 put_bits(&s->pb, 7, best_divisor);
309 put_bits(&s->pb, 2, (temp_ref>>8)&3);
312 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
314 // put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
315 //FIXME check actual requested range
316 put_bits(&s->pb,2,1); /* unlimited */
317 if(s->h263_slice_structured)
318 put_bits(&s->pb,2,0); /* no weird submodes */
320 put_bits(&s->pb, 5, s->qscale);
323 put_bits(&s->pb, 1, 0); /* no PEI */
325 if(s->h263_slice_structured){
326 put_bits(&s->pb, 1, 1);
328 assert(s->mb_x == 0 && s->mb_y == 0);
329 ff_h263_encode_mba(s);
331 put_bits(&s->pb, 1, 1);
336 s->c_dc_scale_table= ff_aic_dc_scale_table;
339 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
344 * Encodes a group of blocks header.
346 void h263_encode_gob_header(MpegEncContext * s, int mb_line)
348 put_bits(&s->pb, 17, 1); /* GBSC */
350 if(s->h263_slice_structured){
351 put_bits(&s->pb, 1, 1);
353 ff_h263_encode_mba(s);
356 put_bits(&s->pb, 1, 1);
357 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
358 put_bits(&s->pb, 1, 1);
359 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
361 int gob_number= mb_line / s->gob_index;
363 put_bits(&s->pb, 5, gob_number); /* GN */
364 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
365 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
369 static inline int get_block_rate(MpegEncContext * s, DCTELEM block[64], int block_last_index, uint8_t scantable[64]){
374 for(j=1; j<=block_last_index; j++){
375 const int index= scantable[j];
376 int level= block[index];
379 if((level&(~127)) == 0){
380 if(j<block_last_index) rate+= s->intra_ac_vlc_length [UNI_AC_ENC_INDEX(j-last-1, level)];
381 else rate+= s->intra_ac_vlc_last_length[UNI_AC_ENC_INDEX(j-last-1, level)];
383 rate += s->ac_esc_length;
393 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
397 int8_t * const qscale_table= s->current_picture.qscale_table;
399 memcpy(zigzag_last_index, s->block_last_index, sizeof(int)*6);
402 int16_t *ac_val, *ac_val1;
404 score -= get_block_rate(s, block[n], s->block_last_index[n], s->intra_scantable.permutated);
406 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
409 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
411 ac_val-= s->block_wrap[n]*16;
412 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
415 const int level= block[n][s->dsp.idct_permutation[i ]];
416 block[n][s->dsp.idct_permutation[i ]] = level - ac_val[i+8];
417 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
421 /* different qscale, we must rescale */
423 const int level= block[n][s->dsp.idct_permutation[i ]];
424 block[n][s->dsp.idct_permutation[i ]] = level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
425 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
429 st[n]= s->intra_h_scantable.permutated;
431 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
432 /* left prediction */
434 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
437 const int level= block[n][s->dsp.idct_permutation[i<<3]];
438 block[n][s->dsp.idct_permutation[i<<3]]= level - ac_val[i];
440 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
443 /* different qscale, we must rescale */
445 const int level= block[n][s->dsp.idct_permutation[i<<3]];
446 block[n][s->dsp.idct_permutation[i<<3]]= level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
448 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
451 st[n]= s->intra_v_scantable.permutated;
454 for(i=63; i>0; i--) //FIXME optimize
455 if(block[n][ st[n][i] ]) break;
456 s->block_last_index[n]= i;
458 score += get_block_rate(s, block[n], s->block_last_index[n], st[n]);
464 static inline void restore_ac_coeffs(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
467 memcpy(s->block_last_index, zigzag_last_index, sizeof(int)*6);
470 int16_t *ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
472 st[n]= s->intra_scantable.permutated;
476 block[n][s->dsp.idct_permutation[i ]] = ac_val[i+8];
479 /* left prediction */
481 block[n][s->dsp.idct_permutation[i<<3]]= ac_val[i ];
488 * modify qscale so that encoding is acually possible in h263 (limit difference to -2..2)
490 void ff_clean_h263_qscales(MpegEncContext *s){
492 int8_t * const qscale_table= s->current_picture.qscale_table;
494 for(i=1; i<s->mb_num; i++){
495 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i-1] ] >2)
496 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i-1] ]+2;
498 for(i=s->mb_num-2; i>=0; i--){
499 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i+1] ] >2)
500 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i+1] ]+2;
503 if(s->codec_id != CODEC_ID_H263P){
504 for(i=1; i<s->mb_num; i++){
505 int mb_xy= s->mb_index2xy[i];
507 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_INTER4V)){
508 s->mb_type[mb_xy]&= ~CANDIDATE_MB_TYPE_INTER4V;
509 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_INTER;
516 * modify mb_type & qscale so that encoding is acually possible in mpeg4
518 void ff_clean_mpeg4_qscales(MpegEncContext *s){
520 int8_t * const qscale_table= s->current_picture.qscale_table;
522 ff_clean_h263_qscales(s);
524 if(s->pict_type== B_TYPE){
526 /* ok, come on, this isn't funny anymore, there's more code for handling this mpeg4 mess than for the actual adaptive quantization */
528 for(i=0; i<s->mb_num; i++){
529 int mb_xy= s->mb_index2xy[i];
530 odd += qscale_table[mb_xy]&1;
533 if(2*odd > s->mb_num) odd=1;
536 for(i=0; i<s->mb_num; i++){
537 int mb_xy= s->mb_index2xy[i];
538 if((qscale_table[mb_xy]&1) != odd)
539 qscale_table[mb_xy]++;
540 if(qscale_table[mb_xy] > 31)
541 qscale_table[mb_xy]= 31;
544 for(i=1; i<s->mb_num; i++){
545 int mb_xy= s->mb_index2xy[i];
546 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_DIRECT)){
547 s->mb_type[mb_xy]&= ~CANDIDATE_MB_TYPE_DIRECT;
548 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_BIDIR;
554 #endif //CONFIG_ENCODERS
557 * @return the mb_type
559 int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){
560 const int mb_index= s->mb_x + s->mb_y*s->mb_stride;
561 const int colocated_mb_type= s->next_picture.mb_type[mb_index];
562 int xy= s->block_index[0];
563 uint16_t time_pp= s->pp_time;
564 uint16_t time_pb= s->pb_time;
567 //FIXME avoid divides
569 if(IS_8X8(colocated_mb_type)){
570 s->mv_type = MV_TYPE_8X8;
572 xy= s->block_index[i];
573 s->mv[0][i][0] = s->next_picture.motion_val[0][xy][0]*time_pb/time_pp + mx;
574 s->mv[0][i][1] = s->next_picture.motion_val[0][xy][1]*time_pb/time_pp + my;
575 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->next_picture.motion_val[0][xy][0]
576 : s->next_picture.motion_val[0][xy][0]*(time_pb - time_pp)/time_pp;
577 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->next_picture.motion_val[0][xy][1]
578 : s->next_picture.motion_val[0][xy][1]*(time_pb - time_pp)/time_pp;
580 return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_L0L1;
581 } else if(IS_INTERLACED(colocated_mb_type)){
582 s->mv_type = MV_TYPE_FIELD;
584 int field_select= s->next_picture.ref_index[0][s->block_index[2*i]];
585 if(s->top_field_first){
586 time_pp= s->pp_field_time - field_select + i;
587 time_pb= s->pb_field_time - field_select + i;
589 time_pp= s->pp_field_time + field_select - i;
590 time_pb= s->pb_field_time + field_select - i;
592 s->mv[0][i][0] = s->p_field_mv_table[i][0][mb_index][0]*time_pb/time_pp + mx;
593 s->mv[0][i][1] = s->p_field_mv_table[i][0][mb_index][1]*time_pb/time_pp + my;
594 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->p_field_mv_table[i][0][mb_index][0]
595 : s->p_field_mv_table[i][0][mb_index][0]*(time_pb - time_pp)/time_pp;
596 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->p_field_mv_table[i][0][mb_index][1]
597 : s->p_field_mv_table[i][0][mb_index][1]*(time_pb - time_pp)/time_pp;
599 return MB_TYPE_DIRECT2 | MB_TYPE_16x8 | MB_TYPE_L0L1 | MB_TYPE_INTERLACED;
601 s->mv[0][0][0] = s->mv[0][1][0] = s->mv[0][2][0] = s->mv[0][3][0] = s->next_picture.motion_val[0][xy][0]*time_pb/time_pp + mx;
602 s->mv[0][0][1] = s->mv[0][1][1] = s->mv[0][2][1] = s->mv[0][3][1] = s->next_picture.motion_val[0][xy][1]*time_pb/time_pp + my;
603 s->mv[1][0][0] = s->mv[1][1][0] = s->mv[1][2][0] = s->mv[1][3][0] = mx ? s->mv[0][0][0] - s->next_picture.motion_val[0][xy][0]
604 : s->next_picture.motion_val[0][xy][0]*(time_pb - time_pp)/time_pp;
605 s->mv[1][0][1] = s->mv[1][1][1] = s->mv[1][2][1] = s->mv[1][3][1] = my ? s->mv[0][0][1] - s->next_picture.motion_val[0][xy][1]
606 : s->next_picture.motion_val[0][xy][1]*(time_pb - time_pp)/time_pp;
607 if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample)
608 s->mv_type= MV_TYPE_16X16;
610 s->mv_type= MV_TYPE_8X8;
611 return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_L0L1; //Note see prev line
615 void ff_h263_update_motion_val(MpegEncContext * s){
616 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
617 //FIXME a lot of that is only needed for !low_delay
618 const int wrap = s->b8_stride;
619 const int xy = s->block_index[0];
621 s->current_picture.mbskip_table[mb_xy]= s->mb_skipped;
623 if(s->mv_type != MV_TYPE_8X8){
624 int motion_x, motion_y;
628 } else if (s->mv_type == MV_TYPE_16X16) {
629 motion_x = s->mv[0][0][0];
630 motion_y = s->mv[0][0][1];
631 } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {
633 motion_x = s->mv[0][0][0] + s->mv[0][1][0];
634 motion_y = s->mv[0][0][1] + s->mv[0][1][1];
635 motion_x = (motion_x>>1) | (motion_x&1);
637 s->p_field_mv_table[i][0][mb_xy][0]= s->mv[0][i][0];
638 s->p_field_mv_table[i][0][mb_xy][1]= s->mv[0][i][1];
640 s->current_picture.ref_index[0][xy ]=
641 s->current_picture.ref_index[0][xy + 1]= s->field_select[0][0];
642 s->current_picture.ref_index[0][xy + wrap ]=
643 s->current_picture.ref_index[0][xy + wrap + 1]= s->field_select[0][1];
646 /* no update if 8X8 because it has been done during parsing */
647 s->current_picture.motion_val[0][xy][0] = motion_x;
648 s->current_picture.motion_val[0][xy][1] = motion_y;
649 s->current_picture.motion_val[0][xy + 1][0] = motion_x;
650 s->current_picture.motion_val[0][xy + 1][1] = motion_y;
651 s->current_picture.motion_val[0][xy + wrap][0] = motion_x;
652 s->current_picture.motion_val[0][xy + wrap][1] = motion_y;
653 s->current_picture.motion_val[0][xy + 1 + wrap][0] = motion_x;
654 s->current_picture.motion_val[0][xy + 1 + wrap][1] = motion_y;
657 if(s->encoding){ //FIXME encoding MUST be cleaned up
658 if (s->mv_type == MV_TYPE_8X8)
659 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_8x8;
661 s->current_picture.mb_type[mb_xy]= MB_TYPE_INTRA;
663 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_16x16;
667 #ifdef CONFIG_ENCODERS
669 static inline int h263_get_motion_length(MpegEncContext * s, int val, int f_code){
670 int l, bit_size, code;
675 bit_size = f_code - 1;
676 /* modulo encoding */
677 l= INT_BIT - 6 - bit_size;
680 code = (val >> bit_size) + 1;
682 return mvtab[code][1] + 1 + bit_size;
686 static inline void ff_h263_encode_motion_vector(MpegEncContext * s, int x, int y, int f_code){
687 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
688 skip_put_bits(&s->pb,
689 h263_get_motion_length(s, x, f_code)
690 +h263_get_motion_length(s, y, f_code));
692 ff_h263_encode_motion(s, x, f_code);
693 ff_h263_encode_motion(s, y, f_code);
697 static inline int get_p_cbp(MpegEncContext * s,
698 DCTELEM block[6][64],
699 int motion_x, int motion_y){
702 if(s->flags & CODEC_FLAG_CBP_RD){
703 int best_cbpy_score= INT_MAX;
704 int best_cbpc_score= INT_MAX;
705 int cbpc = (-1), cbpy= (-1);
706 const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0);
707 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
710 int score= inter_MCBPC_bits[i + offset] * lambda;
711 if(i&1) score += s->coded_score[5];
712 if(i&2) score += s->coded_score[4];
714 if(score < best_cbpc_score){
715 best_cbpc_score= score;
721 int score= cbpy_tab[i ^ 0xF][1] * lambda;
722 if(i&1) score += s->coded_score[3];
723 if(i&2) score += s->coded_score[2];
724 if(i&4) score += s->coded_score[1];
725 if(i&8) score += s->coded_score[0];
727 if(score < best_cbpy_score){
728 best_cbpy_score= score;
733 if ((motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16){
734 if(best_cbpy_score + best_cbpc_score + 2*lambda >= 0)
738 for (i = 0; i < 6; i++) {
739 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
740 s->block_last_index[i]= -1;
741 memset(s->block[i], 0, sizeof(DCTELEM)*64);
746 for (i = 0; i < 6; i++) {
747 if (s->block_last_index[i] >= 0)
754 static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64],
755 int motion_x, int motion_y, int mb_type){
758 if(s->flags & CODEC_FLAG_CBP_RD){
760 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
763 if(s->coded_score[i] < 0){
764 score += s->coded_score[i];
771 if ((motion_x | motion_y | s->dquant | mb_type) == 0){
772 zero_score-= 4; //2*MV + mb_type + cbp bit
776 if(zero_score <= score){
781 for (i = 0; i < 6; i++) {
782 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
783 s->block_last_index[i]= -1;
784 memset(s->block[i], 0, sizeof(DCTELEM)*64);
788 for (i = 0; i < 6; i++) {
789 if (s->block_last_index[i] >= 0)
796 static inline void mpeg4_encode_blocks(MpegEncContext * s, DCTELEM block[6][64], int intra_dc[6],
797 uint8_t **scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb){
801 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
802 for (i = 0; i < 6; i++) {
803 skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, intra_dc[i], scan_table[i]));
806 /* encode each block */
807 for (i = 0; i < 6; i++) {
808 mpeg4_encode_block(s, block[i], i, intra_dc[i], scan_table[i], dc_pb, ac_pb);
812 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
813 for (i = 0; i < 6; i++) {
814 skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, 0, s->intra_scantable.permutated));
817 /* encode each block */
818 for (i = 0; i < 6; i++) {
819 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, dc_pb, ac_pb);
825 void mpeg4_encode_mb(MpegEncContext * s,
826 DCTELEM block[6][64],
827 int motion_x, int motion_y)
829 int cbpc, cbpy, pred_x, pred_y;
830 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
831 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=B_TYPE ? &s->tex_pb : &s->pb;
832 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=I_TYPE ? &s->pb2 : &s->pb;
833 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
834 const int dquant_code[5]= {1,0,9,2,3};
836 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
840 if(s->pict_type==B_TYPE){
841 static const int mb_type_table[8]= {-1, 2, 3, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
842 int mb_type= mb_type_table[s->mv_dir];
849 s->last_mv[i][1][1]= 0;
853 assert(s->dquant>=-2 && s->dquant<=2);
854 assert((s->dquant&1)==0);
857 /* nothing to do if this MB was skipped in the next P Frame */
858 if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){ //FIXME avoid DCT & ...
864 s->mv_dir= MV_DIR_FORWARD; //doesn't matter
865 s->qscale -= s->dquant;
871 cbp= get_b_cbp(s, block, motion_x, motion_y, mb_type);
873 if ((cbp | motion_x | motion_y | mb_type) ==0) {
874 /* direct MB with MV={0,0} */
875 assert(s->dquant==0);
877 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
879 if(interleaved_stats){
887 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
888 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
889 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we don't need it :)
890 if(cbp) put_bits(&s->pb, 6, cbp);
894 put_bits(&s->pb, 2, (s->dquant>>2)+3);
896 put_bits(&s->pb, 1, 0);
898 s->qscale -= s->dquant;
900 if(!s->progressive_sequence){
902 put_bits(&s->pb, 1, s->interlaced_dct);
903 if(mb_type) // not direct mode
904 put_bits(&s->pb, 1, s->mv_type == MV_TYPE_FIELD);
907 if(interleaved_stats){
908 s->misc_bits+= get_bits_diff(s);
912 assert(s->mv_dir & MV_DIRECT);
913 ff_h263_encode_motion_vector(s, motion_x, motion_y, 1);
917 assert(mb_type > 0 && mb_type < 4);
918 if(s->mv_type != MV_TYPE_FIELD){
919 if(s->mv_dir & MV_DIR_FORWARD){
920 ff_h263_encode_motion_vector(s, s->mv[0][0][0] - s->last_mv[0][0][0],
921 s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
922 s->last_mv[0][0][0]= s->last_mv[0][1][0]= s->mv[0][0][0];
923 s->last_mv[0][0][1]= s->last_mv[0][1][1]= s->mv[0][0][1];
926 if(s->mv_dir & MV_DIR_BACKWARD){
927 ff_h263_encode_motion_vector(s, s->mv[1][0][0] - s->last_mv[1][0][0],
928 s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
929 s->last_mv[1][0][0]= s->last_mv[1][1][0]= s->mv[1][0][0];
930 s->last_mv[1][0][1]= s->last_mv[1][1][1]= s->mv[1][0][1];
934 if(s->mv_dir & MV_DIR_FORWARD){
935 put_bits(&s->pb, 1, s->field_select[0][0]);
936 put_bits(&s->pb, 1, s->field_select[0][1]);
938 if(s->mv_dir & MV_DIR_BACKWARD){
939 put_bits(&s->pb, 1, s->field_select[1][0]);
940 put_bits(&s->pb, 1, s->field_select[1][1]);
942 if(s->mv_dir & MV_DIR_FORWARD){
944 ff_h263_encode_motion_vector(s, s->mv[0][i][0] - s->last_mv[0][i][0] ,
945 s->mv[0][i][1] - s->last_mv[0][i][1]/2, s->f_code);
946 s->last_mv[0][i][0]= s->mv[0][i][0];
947 s->last_mv[0][i][1]= s->mv[0][i][1]*2;
951 if(s->mv_dir & MV_DIR_BACKWARD){
953 ff_h263_encode_motion_vector(s, s->mv[1][i][0] - s->last_mv[1][i][0] ,
954 s->mv[1][i][1] - s->last_mv[1][i][1]/2, s->b_code);
955 s->last_mv[1][i][0]= s->mv[1][i][0];
956 s->last_mv[1][i][1]= s->mv[1][i][1]*2;
963 if(interleaved_stats){
964 s->mv_bits+= get_bits_diff(s);
967 mpeg4_encode_blocks(s, block, NULL, NULL, NULL, &s->pb);
969 if(interleaved_stats){
970 s->p_tex_bits+= get_bits_diff(s);
973 }else{ /* s->pict_type==B_TYPE */
974 cbp= get_p_cbp(s, block, motion_x, motion_y);
976 if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
977 /* check if the B frames can skip it too, as we must skip it if we skip here
978 why didn't they just compress the skip-mb bits instead of reusing them ?! */
979 if(s->max_b_frames>0){
986 if(x+16 > s->width) x= s->width-16;
987 if(y+16 > s->height) y= s->height-16;
989 offset= x + y*s->linesize;
990 p_pic= s->new_picture.data[0] + offset;
993 for(i=0; i<s->max_b_frames; i++){
996 Picture *pic= s->reordered_input_picture[i+1];
998 if(pic==NULL || pic->pict_type!=B_TYPE) break;
1000 b_pic= pic->data[0] + offset + 16; //FIXME +16
1001 diff= s->dsp.sad[0](NULL, p_pic, b_pic, s->linesize, 16);
1002 if(diff>s->qscale*70){ //FIXME check that 70 is optimal
1010 if(s->mb_skipped==1){
1011 /* skip macroblock */
1012 put_bits(&s->pb, 1, 1);
1014 if(interleaved_stats){
1024 put_bits(&s->pb, 1, 0); /* mb coded */
1028 if(s->mv_type==MV_TYPE_16X16){
1029 if(s->dquant) cbpc+= 8;
1031 inter_MCBPC_bits[cbpc],
1032 inter_MCBPC_code[cbpc]);
1034 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1036 put_bits(pb2, 2, dquant_code[s->dquant+2]);
1038 if(!s->progressive_sequence){
1040 put_bits(pb2, 1, s->interlaced_dct);
1041 put_bits(pb2, 1, 0);
1044 if(interleaved_stats){
1045 s->misc_bits+= get_bits_diff(s);
1048 /* motion vectors: 16x16 mode */
1049 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1051 ff_h263_encode_motion_vector(s, motion_x - pred_x,
1052 motion_y - pred_y, s->f_code);
1053 }else if(s->mv_type==MV_TYPE_FIELD){
1054 if(s->dquant) cbpc+= 8;
1056 inter_MCBPC_bits[cbpc],
1057 inter_MCBPC_code[cbpc]);
1059 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1061 put_bits(pb2, 2, dquant_code[s->dquant+2]);
1063 assert(!s->progressive_sequence);
1065 put_bits(pb2, 1, s->interlaced_dct);
1066 put_bits(pb2, 1, 1);
1068 if(interleaved_stats){
1069 s->misc_bits+= get_bits_diff(s);
1072 /* motion vectors: 16x8 interlaced mode */
1073 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1076 put_bits(&s->pb, 1, s->field_select[0][0]);
1077 put_bits(&s->pb, 1, s->field_select[0][1]);
1079 ff_h263_encode_motion_vector(s, s->mv[0][0][0] - pred_x,
1080 s->mv[0][0][1] - pred_y, s->f_code);
1081 ff_h263_encode_motion_vector(s, s->mv[0][1][0] - pred_x,
1082 s->mv[0][1][1] - pred_y, s->f_code);
1084 assert(s->mv_type==MV_TYPE_8X8);
1086 inter_MCBPC_bits[cbpc+16],
1087 inter_MCBPC_code[cbpc+16]);
1088 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1090 if(!s->progressive_sequence){
1092 put_bits(pb2, 1, s->interlaced_dct);
1095 if(interleaved_stats){
1096 s->misc_bits+= get_bits_diff(s);
1100 /* motion vectors: 8x8 mode*/
1101 h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1103 ff_h263_encode_motion_vector(s, s->current_picture.motion_val[0][ s->block_index[i] ][0] - pred_x,
1104 s->current_picture.motion_val[0][ s->block_index[i] ][1] - pred_y, s->f_code);
1108 if(interleaved_stats){
1109 s->mv_bits+= get_bits_diff(s);
1112 mpeg4_encode_blocks(s, block, NULL, NULL, NULL, tex_pb);
1114 if(interleaved_stats){
1115 s->p_tex_bits+= get_bits_diff(s);
1121 int dc_diff[6]; //dc values with the dc prediction subtracted
1122 int dir[6]; //prediction direction
1123 int zigzag_last_index[6];
1124 uint8_t *scan_table[6];
1128 dc_diff[i]= ff_mpeg4_pred_dc(s, i, block[i][0], &dir[i], 1);
1131 if(s->flags & CODEC_FLAG_AC_PRED){
1132 s->ac_pred= decide_ac_pred(s, block, dir, scan_table, zigzag_last_index);
1134 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1137 scan_table[i]= s->intra_scantable.permutated;
1142 for (i = 0; i < 6; i++) {
1143 if (s->block_last_index[i] >= 1)
1144 cbp |= 1 << (5 - i);
1148 if (s->pict_type == I_TYPE) {
1149 if(s->dquant) cbpc+=4;
1151 intra_MCBPC_bits[cbpc],
1152 intra_MCBPC_code[cbpc]);
1154 if(s->dquant) cbpc+=8;
1155 put_bits(&s->pb, 1, 0); /* mb coded */
1157 inter_MCBPC_bits[cbpc + 4],
1158 inter_MCBPC_code[cbpc + 4]);
1160 put_bits(pb2, 1, s->ac_pred);
1162 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1164 put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
1166 if(!s->progressive_sequence){
1167 put_bits(dc_pb, 1, s->interlaced_dct);
1170 if(interleaved_stats){
1171 s->misc_bits+= get_bits_diff(s);
1174 mpeg4_encode_blocks(s, block, dc_diff, scan_table, dc_pb, tex_pb);
1176 if(interleaved_stats){
1177 s->i_tex_bits+= get_bits_diff(s);
1181 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
1183 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1187 void h263_encode_mb(MpegEncContext * s,
1188 DCTELEM block[6][64],
1189 int motion_x, int motion_y)
1191 int cbpc, cbpy, i, cbp, pred_x, pred_y;
1193 int16_t rec_intradc[6];
1194 uint16_t *dc_ptr[6];
1195 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1);
1196 const int dquant_code[5]= {1,0,9,2,3};
1198 //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
1201 cbp= get_p_cbp(s, block, motion_x, motion_y);
1203 if ((cbp | motion_x | motion_y | s->dquant | (s->mv_type - MV_TYPE_16X16)) == 0) {
1204 /* skip macroblock */
1205 put_bits(&s->pb, 1, 1);
1206 if(interleaved_stats){
1214 put_bits(&s->pb, 1, 0); /* mb coded */
1218 if(s->alt_inter_vlc==0 || cbpc!=3)
1220 if(s->dquant) cbpc+= 8;
1221 if(s->mv_type==MV_TYPE_16X16){
1223 inter_MCBPC_bits[cbpc],
1224 inter_MCBPC_code[cbpc]);
1226 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1228 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1230 if(interleaved_stats){
1231 s->misc_bits+= get_bits_diff(s);
1234 /* motion vectors: 16x16 mode */
1235 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1238 ff_h263_encode_motion_vector(s, motion_x - pred_x,
1239 motion_y - pred_y, 1);
1242 h263p_encode_umotion(s, motion_x - pred_x);
1243 h263p_encode_umotion(s, motion_y - pred_y);
1244 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
1245 /* To prevent Start Code emulation */
1246 put_bits(&s->pb,1,1);
1250 inter_MCBPC_bits[cbpc+16],
1251 inter_MCBPC_code[cbpc+16]);
1252 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1254 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1256 if(interleaved_stats){
1257 s->misc_bits+= get_bits_diff(s);
1261 /* motion vectors: 8x8 mode*/
1262 h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1264 motion_x= s->current_picture.motion_val[0][ s->block_index[i] ][0];
1265 motion_y= s->current_picture.motion_val[0][ s->block_index[i] ][1];
1267 ff_h263_encode_motion_vector(s, motion_x - pred_x,
1268 motion_y - pred_y, 1);
1271 h263p_encode_umotion(s, motion_x - pred_x);
1272 h263p_encode_umotion(s, motion_y - pred_y);
1273 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
1274 /* To prevent Start Code emulation */
1275 put_bits(&s->pb,1,1);
1280 if(interleaved_stats){
1281 s->mv_bits+= get_bits_diff(s);
1284 assert(s->mb_intra);
1289 for(i=0; i<6; i++) {
1290 int16_t level = block[i][0];
1293 if(i<4) scale= s->y_dc_scale;
1294 else scale= s->c_dc_scale;
1296 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
1300 level = (level + (scale>>1))/scale;
1302 level = (level - (scale>>1))/scale;
1304 /* AIC can change CBP */
1305 if (level == 0 && s->block_last_index[i] == 0)
1306 s->block_last_index[i] = -1;
1308 if(!s->modified_quant){
1311 else if (level > 127)
1315 block[i][0] = level;
1316 /* Reconstruction */
1317 rec_intradc[i] = scale*level + pred_dc;
1319 rec_intradc[i] |= 1;
1320 //if ((rec_intradc[i] % 2) == 0)
1321 // rec_intradc[i]++;
1323 if (rec_intradc[i] < 0)
1325 else if (rec_intradc[i] > 2047)
1326 rec_intradc[i] = 2047;
1328 /* Update AC/DC tables */
1329 *dc_ptr[i] = rec_intradc[i];
1330 if (s->block_last_index[i] >= 0)
1331 cbp |= 1 << (5 - i);
1334 for(i=0; i<6; i++) {
1336 if (s->block_last_index[i] >= 1)
1337 cbp |= 1 << (5 - i);
1342 if (s->pict_type == I_TYPE) {
1343 if(s->dquant) cbpc+=4;
1345 intra_MCBPC_bits[cbpc],
1346 intra_MCBPC_code[cbpc]);
1348 if(s->dquant) cbpc+=8;
1349 put_bits(&s->pb, 1, 0); /* mb coded */
1351 inter_MCBPC_bits[cbpc + 4],
1352 inter_MCBPC_code[cbpc + 4]);
1355 /* XXX: currently, we do not try to use ac prediction */
1356 put_bits(&s->pb, 1, 0); /* no AC prediction */
1359 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1361 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1363 if(interleaved_stats){
1364 s->misc_bits+= get_bits_diff(s);
1368 for(i=0; i<6; i++) {
1369 /* encode each block */
1370 h263_encode_block(s, block[i], i);
1372 /* Update INTRADC for decoding */
1373 if (s->h263_aic && s->mb_intra) {
1374 block[i][0] = rec_intradc[i];
1379 if(interleaved_stats){
1381 s->p_tex_bits+= get_bits_diff(s);
1384 s->i_tex_bits+= get_bits_diff(s);
1391 void ff_h263_loop_filter(MpegEncContext * s){
1393 const int linesize = s->linesize;
1394 const int uvlinesize= s->uvlinesize;
1395 const int xy = s->mb_y * s->mb_stride + s->mb_x;
1396 uint8_t *dest_y = s->dest[0];
1397 uint8_t *dest_cb= s->dest[1];
1398 uint8_t *dest_cr= s->dest[2];
1400 // if(s->pict_type==B_TYPE && !s->readable) return;
1406 if(!IS_SKIP(s->current_picture.mb_type[xy])){
1408 s->dsp.h263_v_loop_filter(dest_y+8*linesize , linesize, qp_c);
1409 s->dsp.h263_v_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
1414 int qp_dt, qp_t, qp_tc;
1416 if(IS_SKIP(s->current_picture.mb_type[xy-s->mb_stride]))
1419 qp_t= s->current_picture.qscale_table[xy-s->mb_stride];
1427 const int chroma_qp= s->chroma_qscale_table[qp_tc];
1428 s->dsp.h263_v_loop_filter(dest_y , linesize, qp_tc);
1429 s->dsp.h263_v_loop_filter(dest_y+8, linesize, qp_tc);
1431 s->dsp.h263_v_loop_filter(dest_cb , uvlinesize, chroma_qp);
1432 s->dsp.h263_v_loop_filter(dest_cr , uvlinesize, chroma_qp);
1436 s->dsp.h263_h_loop_filter(dest_y-8*linesize+8 , linesize, qp_t);
1439 if(qp_t || IS_SKIP(s->current_picture.mb_type[xy-1-s->mb_stride]))
1442 qp_dt= s->current_picture.qscale_table[xy-1-s->mb_stride];
1445 const int chroma_qp= s->chroma_qscale_table[qp_dt];
1446 s->dsp.h263_h_loop_filter(dest_y -8*linesize , linesize, qp_dt);
1447 s->dsp.h263_h_loop_filter(dest_cb-8*uvlinesize, uvlinesize, chroma_qp);
1448 s->dsp.h263_h_loop_filter(dest_cr-8*uvlinesize, uvlinesize, chroma_qp);
1454 s->dsp.h263_h_loop_filter(dest_y +8, linesize, qp_c);
1455 if(s->mb_y + 1 == s->mb_height)
1456 s->dsp.h263_h_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
1461 if(qp_c || IS_SKIP(s->current_picture.mb_type[xy-1]))
1464 qp_lc= s->current_picture.qscale_table[xy-1];
1467 s->dsp.h263_h_loop_filter(dest_y, linesize, qp_lc);
1468 if(s->mb_y + 1 == s->mb_height){
1469 const int chroma_qp= s->chroma_qscale_table[qp_lc];
1470 s->dsp.h263_h_loop_filter(dest_y +8* linesize, linesize, qp_lc);
1471 s->dsp.h263_h_loop_filter(dest_cb , uvlinesize, chroma_qp);
1472 s->dsp.h263_h_loop_filter(dest_cr , uvlinesize, chroma_qp);
1478 static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr)
1480 int x, y, wrap, a, c, pred_dc, scale;
1481 int16_t *dc_val, *ac_val;
1483 /* find prediction */
1485 x = 2 * s->mb_x + (n & 1);
1486 y = 2 * s->mb_y + ((n & 2) >> 1);
1487 wrap = s->b8_stride;
1488 dc_val = s->dc_val[0];
1489 ac_val = s->ac_val[0][0];
1490 scale = s->y_dc_scale;
1494 wrap = s->mb_stride;
1495 dc_val = s->dc_val[n - 4 + 1];
1496 ac_val = s->ac_val[n - 4 + 1][0];
1497 scale = s->c_dc_scale;
1502 a = dc_val[(x - 1) + (y) * wrap];
1503 c = dc_val[(x) + (y - 1) * wrap];
1505 /* No prediction outside GOB boundary */
1506 if(s->first_slice_line && n!=3){
1508 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
1511 /* just DC prediction */
1512 if (a != 1024 && c != 1024)
1513 pred_dc = (a + c) >> 1;
1519 /* we assume pred is positive */
1520 //pred_dc = (pred_dc + (scale >> 1)) / scale;
1521 *dc_val_ptr = &dc_val[x + y * wrap];
1525 static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n)
1527 int x, y, wrap, a, c, pred_dc, scale, i;
1528 int16_t *dc_val, *ac_val, *ac_val1;
1530 /* find prediction */
1532 x = 2 * s->mb_x + (n & 1);
1533 y = 2 * s->mb_y + (n>> 1);
1534 wrap = s->b8_stride;
1535 dc_val = s->dc_val[0];
1536 ac_val = s->ac_val[0][0];
1537 scale = s->y_dc_scale;
1541 wrap = s->mb_stride;
1542 dc_val = s->dc_val[n - 4 + 1];
1543 ac_val = s->ac_val[n - 4 + 1][0];
1544 scale = s->c_dc_scale;
1547 ac_val += ((y) * wrap + (x)) * 16;
1553 a = dc_val[(x - 1) + (y) * wrap];
1554 c = dc_val[(x) + (y - 1) * wrap];
1556 /* No prediction outside GOB boundary */
1557 if(s->first_slice_line && n!=3){
1559 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
1564 if (s->h263_aic_dir) {
1565 /* left prediction */
1569 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
1574 /* top prediction */
1576 ac_val -= 16 * wrap;
1578 block[s->dsp.idct_permutation[i ]] += ac_val[i + 8];
1584 /* just DC prediction */
1585 if (a != 1024 && c != 1024)
1586 pred_dc = (a + c) >> 1;
1593 /* we assume pred is positive */
1594 block[0]=block[0]*scale + pred_dc;
1601 /* Update AC/DC tables */
1602 dc_val[(x) + (y) * wrap] = block[0];
1606 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
1609 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
1612 int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir,
1616 int16_t *A, *B, *C, (*mot_val)[2];
1617 static const int off[4]= {2, 1, 1, -1};
1619 wrap = s->b8_stride;
1620 mot_val = s->current_picture.motion_val[dir] + s->block_index[block];
1623 /* special case for first (slice) line */
1624 if (s->first_slice_line && block<3) {
1625 // we can't just change some MVs to simulate that as we need them for the B frames (and ME)
1626 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
1627 if(block==0){ //most common case
1628 if(s->mb_x == s->resync_mb_x){ //rare
1630 }else if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
1631 C = mot_val[off[block] - wrap];
1636 *px = mid_pred(A[0], 0, C[0]);
1637 *py = mid_pred(A[1], 0, C[1]);
1644 if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
1645 C = mot_val[off[block] - wrap];
1646 *px = mid_pred(A[0], 0, C[0]);
1647 *py = mid_pred(A[1], 0, C[1]);
1652 }else{ /* block==2*/
1653 B = mot_val[ - wrap];
1654 C = mot_val[off[block] - wrap];
1655 if(s->mb_x == s->resync_mb_x) //rare
1658 *px = mid_pred(A[0], B[0], C[0]);
1659 *py = mid_pred(A[1], B[1], C[1]);
1662 B = mot_val[ - wrap];
1663 C = mot_val[off[block] - wrap];
1664 *px = mid_pred(A[0], B[0], C[0]);
1665 *py = mid_pred(A[1], B[1], C[1]);
1670 #ifdef CONFIG_ENCODERS
1671 void ff_h263_encode_motion(MpegEncContext * s, int val, int f_code)
1673 int range, l, bit_size, sign, code, bits;
1678 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1680 bit_size = f_code - 1;
1681 range = 1 << bit_size;
1682 /* modulo encoding */
1683 l= INT_BIT - 6 - bit_size;
1686 val= (val^sign)-sign;
1690 code = (val >> bit_size) + 1;
1691 bits = val & (range - 1);
1693 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1695 put_bits(&s->pb, bit_size, bits);
1700 /* Encode MV differences on H.263+ with Unrestricted MV mode */
1701 static void h263p_encode_umotion(MpegEncContext * s, int val)
1711 put_bits(&s->pb, 1, 1);
1713 put_bits(&s->pb, 3, 0);
1715 put_bits(&s->pb, 3, 2);
1718 sval = ((val < 0) ? (short)(-val):(short)val);
1721 while (temp_val != 0) {
1722 temp_val = temp_val >> 1;
1728 tcode = (sval & (1 << (i-1))) >> (i-1);
1729 tcode = (tcode << 1) | 1;
1730 code = (code << 2) | tcode;
1733 code = ((code << 1) | (val < 0)) << 1;
1734 put_bits(&s->pb, (2*n_bits)+1, code);
1735 //printf("\nVal = %d\tCode = %d", sval, code);
1739 static void init_mv_penalty_and_fcode(MpegEncContext *s)
1744 if(mv_penalty==NULL)
1745 mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
1747 for(f_code=1; f_code<=MAX_FCODE; f_code++){
1748 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
1751 if(mv==0) len= mvtab[0][1];
1753 int val, bit_size, range, code;
1755 bit_size = f_code - 1;
1756 range = 1 << bit_size;
1762 code = (val >> bit_size) + 1;
1764 len= mvtab[code][1] + 1 + bit_size;
1766 len= mvtab[32][1] + 2 + bit_size;
1770 mv_penalty[f_code][mv+MAX_MV]= len;
1774 for(f_code=MAX_FCODE; f_code>0; f_code--){
1775 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
1776 fcode_tab[mv+MAX_MV]= f_code;
1780 for(mv=0; mv<MAX_MV*2+1; mv++){
1781 umv_fcode_tab[mv]= 1;
1786 #ifdef CONFIG_ENCODERS
1788 static void init_uni_dc_tab(void)
1790 int level, uni_code, uni_len;
1792 for(level=-256; level<256; level++){
1794 /* find number of bits */
1803 l= (-level) ^ ((1 << size) - 1);
1808 uni_code= DCtab_lum[size][0];
1809 uni_len = DCtab_lum[size][1];
1812 uni_code<<=size; uni_code|=l;
1815 uni_code<<=1; uni_code|=1;
1819 uni_DCtab_lum_bits[level+256]= uni_code;
1820 uni_DCtab_lum_len [level+256]= uni_len;
1823 uni_code= DCtab_chrom[size][0];
1824 uni_len = DCtab_chrom[size][1];
1827 uni_code<<=size; uni_code|=l;
1830 uni_code<<=1; uni_code|=1;
1834 uni_DCtab_chrom_bits[level+256]= uni_code;
1835 uni_DCtab_chrom_len [level+256]= uni_len;
1840 #endif //CONFIG_ENCODERS
1842 #ifdef CONFIG_ENCODERS
1843 static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1844 int slevel, run, last;
1846 assert(MAX_LEVEL >= 64);
1847 assert(MAX_RUN >= 63);
1849 for(slevel=-64; slevel<64; slevel++){
1850 if(slevel==0) continue;
1851 for(run=0; run<64; run++){
1852 for(last=0; last<=1; last++){
1853 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1854 int level= slevel < 0 ? -slevel : slevel;
1855 int sign= slevel < 0 ? 1 : 0;
1856 int bits, len, code;
1859 len_tab[index]= 100;
1862 code= get_rl_index(rl, last, run, level);
1863 bits= rl->table_vlc[code][0];
1864 len= rl->table_vlc[code][1];
1865 bits=bits*2+sign; len++;
1867 if(code!=rl->n && len < len_tab[index]){
1868 bits_tab[index]= bits;
1869 len_tab [index]= len;
1873 bits= rl->table_vlc[rl->n][0];
1874 len= rl->table_vlc[rl->n][1];
1875 bits=bits*2; len++; //esc1
1876 level1= level - rl->max_level[last][run];
1878 code= get_rl_index(rl, last, run, level1);
1879 bits<<= rl->table_vlc[code][1];
1880 len += rl->table_vlc[code][1];
1881 bits += rl->table_vlc[code][0];
1882 bits=bits*2+sign; len++;
1884 if(code!=rl->n && len < len_tab[index]){
1885 bits_tab[index]= bits;
1886 len_tab [index]= len;
1892 bits= rl->table_vlc[rl->n][0];
1893 len= rl->table_vlc[rl->n][1];
1894 bits=bits*4+2; len+=2; //esc2
1895 run1 = run - rl->max_run[last][level] - 1;
1897 code= get_rl_index(rl, last, run1, level);
1898 bits<<= rl->table_vlc[code][1];
1899 len += rl->table_vlc[code][1];
1900 bits += rl->table_vlc[code][0];
1901 bits=bits*2+sign; len++;
1903 if(code!=rl->n && len < len_tab[index]){
1904 bits_tab[index]= bits;
1905 len_tab [index]= len;
1910 bits= rl->table_vlc[rl->n][0];
1911 len = rl->table_vlc[rl->n][1];
1912 bits=bits*4+3; len+=2; //esc3
1913 bits=bits*2+last; len++;
1914 bits=bits*64+run; len+=6;
1915 bits=bits*2+1; len++; //marker
1916 bits=bits*4096+(slevel&0xfff); len+=12;
1917 bits=bits*2+1; len++; //marker
1919 if(len < len_tab[index]){
1920 bits_tab[index]= bits;
1921 len_tab [index]= len;
1928 static void init_uni_h263_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1929 int slevel, run, last;
1931 assert(MAX_LEVEL >= 64);
1932 assert(MAX_RUN >= 63);
1934 for(slevel=-64; slevel<64; slevel++){
1935 if(slevel==0) continue;
1936 for(run=0; run<64; run++){
1937 for(last=0; last<=1; last++){
1938 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1939 int level= slevel < 0 ? -slevel : slevel;
1940 int sign= slevel < 0 ? 1 : 0;
1941 int bits, len, code;
1943 len_tab[index]= 100;
1946 code= get_rl_index(rl, last, run, level);
1947 bits= rl->table_vlc[code][0];
1948 len= rl->table_vlc[code][1];
1949 bits=bits*2+sign; len++;
1951 if(code!=rl->n && len < len_tab[index]){
1952 if(bits_tab) bits_tab[index]= bits;
1953 len_tab [index]= len;
1956 bits= rl->table_vlc[rl->n][0];
1957 len = rl->table_vlc[rl->n][1];
1958 bits=bits*2+last; len++;
1959 bits=bits*64+run; len+=6;
1960 bits=bits*256+(level&0xff); len+=8;
1962 if(len < len_tab[index]){
1963 if(bits_tab) bits_tab[index]= bits;
1964 len_tab [index]= len;
1971 void h263_encode_init(MpegEncContext *s)
1973 static int done = 0;
1980 init_rl(&rl_inter, 1);
1981 init_rl(&rl_intra, 1);
1982 init_rl(&rl_intra_aic, 1);
1984 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
1985 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
1987 init_uni_h263_rl_tab(&rl_intra_aic, NULL, uni_h263_intra_aic_rl_len);
1988 init_uni_h263_rl_tab(&rl_inter , NULL, uni_h263_inter_rl_len);
1990 init_mv_penalty_and_fcode(s);
1992 s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
1994 s->intra_ac_vlc_length =s->inter_ac_vlc_length = uni_h263_inter_rl_len;
1995 s->intra_ac_vlc_last_length=s->inter_ac_vlc_last_length= uni_h263_inter_rl_len + 128*64;
1997 s->intra_ac_vlc_length = uni_h263_intra_aic_rl_len;
1998 s->intra_ac_vlc_last_length= uni_h263_intra_aic_rl_len + 128*64;
2000 s->ac_esc_length= 7+1+6+8;
2002 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
2003 switch(s->codec_id){
2004 case CODEC_ID_MPEG4:
2005 s->fcode_tab= fcode_tab;
2006 s->min_qcoeff= -2048;
2007 s->max_qcoeff= 2047;
2008 s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len;
2009 s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64;
2010 s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len;
2011 s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64;
2012 s->luma_dc_vlc_length= uni_DCtab_lum_len;
2013 s->chroma_dc_vlc_length= uni_DCtab_chrom_len;
2014 s->ac_esc_length= 7+2+1+6+1+12+1;
2015 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
2016 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
2018 if(s->flags & CODEC_FLAG_GLOBAL_HEADER){
2020 s->avctx->extradata= av_malloc(1024);
2021 init_put_bits(&s->pb, s->avctx->extradata, 1024);
2023 if(!(s->workaround_bugs & FF_BUG_MS))
2024 mpeg4_encode_visual_object_header(s);
2025 mpeg4_encode_vol_header(s, 0, 0);
2027 // ff_mpeg4_stuffing(&s->pb); ?
2028 flush_put_bits(&s->pb);
2029 s->avctx->extradata_size= (put_bits_count(&s->pb)+7)>>3;
2033 case CODEC_ID_H263P:
2035 s->fcode_tab= umv_fcode_tab;
2036 if(s->modified_quant){
2037 s->min_qcoeff= -2047;
2038 s->max_qcoeff= 2047;
2040 s->min_qcoeff= -127;
2044 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
2046 if (s->h263_flv > 1) {
2047 s->min_qcoeff= -1023;
2048 s->max_qcoeff= 1023;
2050 s->min_qcoeff= -127;
2053 s->y_dc_scale_table=
2054 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
2056 default: //nothing needed - default table already set in mpegvideo.c
2057 s->min_qcoeff= -127;
2059 s->y_dc_scale_table=
2060 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
2065 * encodes a 8x8 block.
2066 * @param block the 8x8 block
2067 * @param n block index (0-3 are luma, 4-5 are chroma)
2069 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
2071 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
2075 if (s->mb_intra && !s->h263_aic) {
2078 /* 255 cannot be represented, so we clamp */
2083 /* 0 cannot be represented also */
2084 else if (level < 1) {
2088 if (level == 128) //FIXME check rv10
2089 put_bits(&s->pb, 8, 0xff);
2091 put_bits(&s->pb, 8, level);
2095 if (s->h263_aic && s->mb_intra)
2098 if(s->alt_inter_vlc && !s->mb_intra){
2100 int inter_vlc_bits=0;
2104 last_index = s->block_last_index[n];
2105 last_non_zero = i - 1;
2106 for (; i <= last_index; i++) {
2107 j = s->intra_scantable.permutated[i];
2110 run = i - last_non_zero - 1;
2111 last = (i == last_index);
2113 if(level<0) level= -level;
2115 code = get_rl_index(rl, last, run, level);
2116 aic_code = get_rl_index(&rl_intra_aic, last, run, level);
2117 inter_vlc_bits += rl->table_vlc[code][1]+1;
2118 aic_vlc_bits += rl_intra_aic.table_vlc[aic_code][1]+1;
2120 if (code == rl->n) {
2121 inter_vlc_bits += 1+6+8-1;
2123 if (aic_code == rl_intra_aic.n) {
2124 aic_vlc_bits += 1+6+8-1;
2125 wrong_pos += run + 1;
2127 wrong_pos += wrong_run[aic_code];
2132 if(aic_vlc_bits < inter_vlc_bits && wrong_pos > 63)
2138 last_index = s->block_last_index[n];
2139 last_non_zero = i - 1;
2140 for (; i <= last_index; i++) {
2141 j = s->intra_scantable.permutated[i];
2144 run = i - last_non_zero - 1;
2145 last = (i == last_index);
2152 code = get_rl_index(rl, last, run, level);
2153 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2154 if (code == rl->n) {
2155 if(s->h263_flv <= 1){
2156 put_bits(&s->pb, 1, last);
2157 put_bits(&s->pb, 6, run);
2159 assert(slevel != 0);
2162 put_bits(&s->pb, 8, slevel & 0xff);
2164 put_bits(&s->pb, 8, 128);
2165 put_bits(&s->pb, 5, slevel & 0x1f);
2166 put_bits(&s->pb, 6, (slevel>>5)&0x3f);
2169 if(level < 64) { // 7-bit level
2170 put_bits(&s->pb, 1, 0);
2171 put_bits(&s->pb, 1, last);
2172 put_bits(&s->pb, 6, run);
2174 put_bits(&s->pb, 7, slevel & 0x7f);
2177 put_bits(&s->pb, 1, 1);
2178 put_bits(&s->pb, 1, last);
2179 put_bits(&s->pb, 6, run);
2181 put_bits(&s->pb, 11, slevel & 0x7ff);
2185 put_bits(&s->pb, 1, sign);
2193 #ifdef CONFIG_ENCODERS
2195 /***************************************************/
2197 * add mpeg4 stuffing bits (01...1)
2199 void ff_mpeg4_stuffing(PutBitContext * pbc)
2202 put_bits(pbc, 1, 0);
2203 length= (-put_bits_count(pbc))&7;
2204 if(length) put_bits(pbc, length, (1<<length)-1);
2207 /* must be called before writing the header */
2208 void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){
2209 int time_div, time_mod;
2211 assert(s->current_picture_ptr->pts != AV_NOPTS_VALUE);
2212 s->time= s->current_picture_ptr->pts*s->avctx->time_base.num;
2214 time_div= s->time/s->avctx->time_base.den;
2215 time_mod= s->time%s->avctx->time_base.den;
2217 if(s->pict_type==B_TYPE){
2218 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
2219 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
2221 s->last_time_base= s->time_base;
2222 s->time_base= time_div;
2223 s->pp_time= s->time - s->last_non_b_time;
2224 s->last_non_b_time= s->time;
2225 assert(picture_number==0 || s->pp_time > 0);
2229 static void mpeg4_encode_gop_header(MpegEncContext * s){
2230 int hours, minutes, seconds;
2233 put_bits(&s->pb, 16, 0);
2234 put_bits(&s->pb, 16, GOP_STARTCODE);
2236 time= s->current_picture_ptr->pts;
2237 if(s->reordered_input_picture[1])
2238 time= FFMIN(time, s->reordered_input_picture[1]->pts);
2239 time= time*s->avctx->time_base.num;
2241 seconds= time/s->avctx->time_base.den;
2242 minutes= seconds/60; seconds %= 60;
2243 hours= minutes/60; minutes %= 60;
2246 put_bits(&s->pb, 5, hours);
2247 put_bits(&s->pb, 6, minutes);
2248 put_bits(&s->pb, 1, 1);
2249 put_bits(&s->pb, 6, seconds);
2251 put_bits(&s->pb, 1, !!(s->flags&CODEC_FLAG_CLOSED_GOP));
2252 put_bits(&s->pb, 1, 0); //broken link == NO
2254 s->last_time_base= time / s->avctx->time_base.den;
2256 ff_mpeg4_stuffing(&s->pb);
2259 static void mpeg4_encode_visual_object_header(MpegEncContext * s){
2260 int profile_and_level_indication;
2263 if(s->avctx->profile != FF_PROFILE_UNKNOWN){
2264 profile_and_level_indication = s->avctx->profile << 4;
2265 }else if(s->max_b_frames || s->quarter_sample){
2266 profile_and_level_indication= 0xF0; // adv simple
2268 profile_and_level_indication= 0x00; // simple
2271 if(s->avctx->level != FF_LEVEL_UNKNOWN){
2272 profile_and_level_indication |= s->avctx->level;
2274 profile_and_level_indication |= 1; //level 1
2277 if(profile_and_level_indication>>4 == 0xF){
2285 put_bits(&s->pb, 16, 0);
2286 put_bits(&s->pb, 16, VOS_STARTCODE);
2288 put_bits(&s->pb, 8, profile_and_level_indication);
2290 put_bits(&s->pb, 16, 0);
2291 put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);
2293 put_bits(&s->pb, 1, 1);
2294 put_bits(&s->pb, 4, vo_ver_id);
2295 put_bits(&s->pb, 3, 1); //priority
2297 put_bits(&s->pb, 4, 1); //visual obj type== video obj
2299 put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME
2301 ff_mpeg4_stuffing(&s->pb);
2304 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number)
2308 if(s->max_b_frames || s->quarter_sample){
2310 s->vo_type= ADV_SIMPLE_VO_TYPE;
2313 s->vo_type= SIMPLE_VO_TYPE;
2316 put_bits(&s->pb, 16, 0);
2317 put_bits(&s->pb, 16, 0x100 + vo_number); /* video obj */
2318 put_bits(&s->pb, 16, 0);
2319 put_bits(&s->pb, 16, 0x120 + vol_number); /* video obj layer */
2321 put_bits(&s->pb, 1, 0); /* random access vol */
2322 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
2323 if(s->workaround_bugs & FF_BUG_MS) {
2324 put_bits(&s->pb, 1, 0); /* is obj layer id= no */
2326 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
2327 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
2328 put_bits(&s->pb, 3, 1); /* is obj layer priority */
2331 aspect_to_info(s, s->avctx->sample_aspect_ratio);
2333 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
2334 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
2335 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
2336 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
2339 if(s->workaround_bugs & FF_BUG_MS) { //
2340 put_bits(&s->pb, 1, 0); /* vol control parameters= no @@@ */
2342 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
2343 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
2344 put_bits(&s->pb, 1, s->low_delay);
2345 put_bits(&s->pb, 1, 0); /* vbv parameters= no */
2348 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
2349 put_bits(&s->pb, 1, 1); /* marker bit */
2351 put_bits(&s->pb, 16, s->avctx->time_base.den);
2352 if (s->time_increment_bits < 1)
2353 s->time_increment_bits = 1;
2354 put_bits(&s->pb, 1, 1); /* marker bit */
2355 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
2356 put_bits(&s->pb, 1, 1); /* marker bit */
2357 put_bits(&s->pb, 13, s->width); /* vol width */
2358 put_bits(&s->pb, 1, 1); /* marker bit */
2359 put_bits(&s->pb, 13, s->height); /* vol height */
2360 put_bits(&s->pb, 1, 1); /* marker bit */
2361 put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
2362 put_bits(&s->pb, 1, 1); /* obmc disable */
2363 if (vo_ver_id == 1) {
2364 put_bits(&s->pb, 1, s->vol_sprite_usage); /* sprite enable */
2366 put_bits(&s->pb, 2, s->vol_sprite_usage); /* sprite enable */
2369 put_bits(&s->pb, 1, 0); /* not 8 bit == false */
2370 put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
2373 ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix);
2374 ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix);
2378 put_bits(&s->pb, 1, s->quarter_sample);
2379 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
2380 s->resync_marker= s->rtp_mode;
2381 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
2382 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
2383 if(s->data_partitioning){
2384 put_bits(&s->pb, 1, 0); /* no rvlc */
2387 if (vo_ver_id != 1){
2388 put_bits(&s->pb, 1, 0); /* newpred */
2389 put_bits(&s->pb, 1, 0); /* reduced res vop */
2391 put_bits(&s->pb, 1, 0); /* scalability */
2393 ff_mpeg4_stuffing(&s->pb);
2396 if(!(s->flags & CODEC_FLAG_BITEXACT)){
2397 put_bits(&s->pb, 16, 0);
2398 put_bits(&s->pb, 16, 0x1B2); /* user_data */
2399 put_string(&s->pb, LIBAVCODEC_IDENT, 0);
2403 /* write mpeg4 VOP header */
2404 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
2407 int time_div, time_mod;
2409 if(s->pict_type==I_TYPE){
2410 if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
2411 if(s->strict_std_compliance < 2) //HACK, the reference sw is buggy
2412 mpeg4_encode_visual_object_header(s);
2413 if(s->strict_std_compliance < 2 || picture_number==0) //HACK, the reference sw is buggy
2414 mpeg4_encode_vol_header(s, 0, 0);
2416 if(!(s->workaround_bugs & FF_BUG_MS))
2417 mpeg4_encode_gop_header(s);
2420 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
2422 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->time_base.den, FRAME_RATE_BASE);
2424 put_bits(&s->pb, 16, 0); /* vop header */
2425 put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */
2426 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
2428 time_div= s->time/s->avctx->time_base.den;
2429 time_mod= s->time%s->avctx->time_base.den;
2430 time_incr= time_div - s->last_time_base;
2431 assert(time_incr >= 0);
2433 put_bits(&s->pb, 1, 1);
2435 put_bits(&s->pb, 1, 0);
2437 put_bits(&s->pb, 1, 1); /* marker */
2438 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
2439 put_bits(&s->pb, 1, 1); /* marker */
2440 put_bits(&s->pb, 1, 1); /* vop coded */
2441 if ( s->pict_type == P_TYPE
2442 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
2443 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
2445 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
2446 if(!s->progressive_sequence){
2447 put_bits(&s->pb, 1, s->current_picture_ptr->top_field_first);
2448 put_bits(&s->pb, 1, s->alternate_scan);
2450 //FIXME sprite stuff
2452 put_bits(&s->pb, 5, s->qscale);
2454 if (s->pict_type != I_TYPE)
2455 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
2456 if (s->pict_type == B_TYPE)
2457 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
2458 // printf("****frame %d\n", picture_number);
2461 #endif //CONFIG_ENCODERS
2464 * set qscale and update qscale dependant variables.
2466 void ff_set_qscale(MpegEncContext * s, int qscale)
2470 else if (qscale > 31)
2474 s->chroma_qscale= s->chroma_qscale_table[qscale];
2476 s->y_dc_scale= s->y_dc_scale_table[ qscale ];
2477 s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
2482 * encoding quantized level -> quantized diff
2483 * decoding quantized diff -> quantized level
2484 * @param n block index (0-3 are luma, 4-5 are chroma)
2485 * @param dir_ptr pointer to an integer where the prediction direction will be stored
2487 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding)
2489 int a, b, c, wrap, pred, scale, ret;
2492 /* find prediction */
2494 scale = s->y_dc_scale;
2496 scale = s->c_dc_scale;
2501 wrap= s->block_wrap[n];
2502 dc_val = s->dc_val[0] + s->block_index[n];
2508 b = dc_val[ - 1 - wrap];
2509 c = dc_val[ - wrap];
2511 /* outside slice handling (we can't do that by memset as we need the dc for error resilience) */
2512 if(s->first_slice_line && n!=3){
2514 if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
2516 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
2517 if(n==0 || n==4 || n==5)
2521 if (abs(a - b) < abs(b - c)) {
2523 *dir_ptr = 1; /* top */
2526 *dir_ptr = 0; /* left */
2528 /* we assume pred is positive */
2529 pred = FASTDIV((pred + (scale >> 1)), scale);
2536 if(s->error_resilience>=3){
2538 av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
2541 if(level*scale > 2048 + scale){
2542 av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
2551 else if(!(s->workaround_bugs&FF_BUG_DC_CLIP))
2561 * @param n block index (0-3 are luma, 4-5 are chroma)
2562 * @param dir the ac prediction direction
2564 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
2568 int16_t *ac_val, *ac_val1;
2569 int8_t * const qscale_table= s->current_picture.qscale_table;
2571 /* find prediction */
2572 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2576 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
2577 /* left prediction */
2580 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
2583 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
2586 /* different qscale, we must rescale */
2588 block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
2592 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
2593 /* top prediction */
2594 ac_val -= 16 * s->block_wrap[n];
2596 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
2599 block[s->dsp.idct_permutation[i]] += ac_val[i + 8];
2602 /* different qscale, we must rescale */
2604 block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
2611 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
2615 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
2619 #ifdef CONFIG_ENCODERS
2622 * encodes the dc value.
2623 * @param n block index (0-3 are luma, 4-5 are chroma)
2625 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
2628 // if(level<-255 || level>255) printf("dc overflow\n");
2632 put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]);
2635 put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]);
2639 /* find number of bits */
2649 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
2652 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
2655 /* encode remaining bits */
2658 level = (-level) ^ ((1 << size) - 1);
2659 put_bits(&s->pb, size, level);
2661 put_bits(&s->pb, 1, 1);
2666 static inline int mpeg4_get_dc_length(int level, int n){
2668 return uni_DCtab_lum_len[level + 256];
2670 return uni_DCtab_chrom_len[level + 256];
2675 * encodes a 8x8 block
2676 * @param n block index (0-3 are luma, 4-5 are chroma)
2678 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2679 uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
2681 int i, last_non_zero;
2682 #if 0 //variables for the outcommented version
2683 int code, sign, last;
2688 const int last_index = s->block_last_index[n];
2690 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2691 /* mpeg4 based DC predictor */
2692 mpeg4_encode_dc(dc_pb, intra_dc, n);
2693 if(last_index<1) return;
2696 bits_tab= uni_mpeg4_intra_rl_bits;
2697 len_tab = uni_mpeg4_intra_rl_len;
2699 if(last_index<0) return;
2702 bits_tab= uni_mpeg4_inter_rl_bits;
2703 len_tab = uni_mpeg4_inter_rl_len;
2707 last_non_zero = i - 1;
2709 for (; i < last_index; i++) {
2710 int level = block[ scan_table[i] ];
2712 int run = i - last_non_zero - 1;
2714 if((level&(~127)) == 0){
2715 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2716 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2718 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);
2723 /*if(i<=last_index)*/{
2724 int level = block[ scan_table[i] ];
2725 int run = i - last_non_zero - 1;
2727 if((level&(~127)) == 0){
2728 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2729 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2731 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);
2735 for (; i <= last_index; i++) {
2736 const int slevel = block[ scan_table[i] ];
2739 int run = i - last_non_zero - 1;
2740 last = (i == last_index);
2747 code = get_rl_index(rl, last, run, level);
2748 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2749 if (code == rl->n) {
2751 level1 = level - rl->max_level[last][run];
2754 code = get_rl_index(rl, last, run, level1);
2755 if (code == rl->n) {
2757 put_bits(ac_pb, 1, 1);
2758 if (level > MAX_LEVEL)
2760 run1 = run - rl->max_run[last][level] - 1;
2763 code = get_rl_index(rl, last, run1, level);
2764 if (code == rl->n) {
2767 put_bits(ac_pb, 1, 1);
2768 put_bits(ac_pb, 1, last);
2769 put_bits(ac_pb, 6, run);
2770 put_bits(ac_pb, 1, 1);
2771 put_bits(ac_pb, 12, slevel & 0xfff);
2772 put_bits(ac_pb, 1, 1);
2775 put_bits(ac_pb, 1, 0);
2776 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2777 put_bits(ac_pb, 1, sign);
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);
2786 put_bits(ac_pb, 1, sign);
2794 static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2795 uint8_t *scan_table)
2797 int i, last_non_zero;
2800 const int last_index = s->block_last_index[n];
2803 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2804 /* mpeg4 based DC predictor */
2805 len += mpeg4_get_dc_length(intra_dc, n);
2806 if(last_index<1) return len;
2809 len_tab = uni_mpeg4_intra_rl_len;
2811 if(last_index<0) return 0;
2814 len_tab = uni_mpeg4_inter_rl_len;
2818 last_non_zero = i - 1;
2819 for (; i < last_index; i++) {
2820 int level = block[ scan_table[i] ];
2822 int run = i - last_non_zero - 1;
2824 if((level&(~127)) == 0){
2825 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2826 len += len_tab[index];
2828 len += 7+2+1+6+1+12+1;
2833 /*if(i<=last_index)*/{
2834 int level = block[ scan_table[i] ];
2835 int run = i - last_non_zero - 1;
2837 if((level&(~127)) == 0){
2838 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2839 len += len_tab[index];
2841 len += 7+2+1+6+1+12+1;
2851 /***********************************************/
2854 static VLC intra_MCBPC_vlc;
2855 static VLC inter_MCBPC_vlc;
2856 static VLC cbpy_vlc;
2858 static VLC dc_lum, dc_chrom;
2859 static VLC sprite_trajectory;
2860 static VLC mb_type_b_vlc;
2861 static VLC h263_mbtype_b_vlc;
2862 static VLC cbpc_b_vlc;
2864 void init_vlc_rl(RLTable *rl, int use_static)
2868 /* Return if static table is already initialized */
2869 if(use_static && rl->rl_vlc[0])
2872 init_vlc(&rl->vlc, 9, rl->n + 1,
2873 &rl->table_vlc[0][1], 4, 2,
2874 &rl->table_vlc[0][0], 4, 2, use_static);
2877 for(q=0; q<32; q++){
2886 rl->rl_vlc[q]= av_mallocz_static(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
2888 rl->rl_vlc[q]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
2889 for(i=0; i<rl->vlc.table_size; i++){
2890 int code= rl->vlc.table[i][0];
2891 int len = rl->vlc.table[i][1];
2894 if(len==0){ // illegal code
2897 }else if(len<0){ //more bits needed
2901 if(code==rl->n){ //esc
2905 run= rl->table_run [code] + 1;
2906 level= rl->table_level[code] * qmul + qadd;
2907 if(code >= rl->last) run+=192;
2910 rl->rl_vlc[q][i].len= len;
2911 rl->rl_vlc[q][i].level= level;
2912 rl->rl_vlc[q][i].run= run;
2919 /* XXX: find a better solution to handle static init */
2920 void h263_decode_init_vlc(MpegEncContext *s)
2922 static int done = 0;
2927 init_vlc(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 9,
2928 intra_MCBPC_bits, 1, 1,
2929 intra_MCBPC_code, 1, 1, 1);
2930 init_vlc(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 28,
2931 inter_MCBPC_bits, 1, 1,
2932 inter_MCBPC_code, 1, 1, 1);
2933 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
2934 &cbpy_tab[0][1], 2, 1,
2935 &cbpy_tab[0][0], 2, 1, 1);
2936 init_vlc(&mv_vlc, MV_VLC_BITS, 33,
2938 &mvtab[0][0], 2, 1, 1);
2939 init_rl(&rl_inter, 1);
2940 init_rl(&rl_intra, 1);
2941 init_rl(&rvlc_rl_inter, 1);
2942 init_rl(&rvlc_rl_intra, 1);
2943 init_rl(&rl_intra_aic, 1);
2944 init_vlc_rl(&rl_inter, 1);
2945 init_vlc_rl(&rl_intra, 1);
2946 init_vlc_rl(&rvlc_rl_inter, 1);
2947 init_vlc_rl(&rvlc_rl_intra, 1);
2948 init_vlc_rl(&rl_intra_aic, 1);
2949 init_vlc(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
2950 &DCtab_lum[0][1], 2, 1,
2951 &DCtab_lum[0][0], 2, 1, 1);
2952 init_vlc(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
2953 &DCtab_chrom[0][1], 2, 1,
2954 &DCtab_chrom[0][0], 2, 1, 1);
2955 init_vlc(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
2956 &sprite_trajectory_tab[0][1], 4, 2,
2957 &sprite_trajectory_tab[0][0], 4, 2, 1);
2958 init_vlc(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
2959 &mb_type_b_tab[0][1], 2, 1,
2960 &mb_type_b_tab[0][0], 2, 1, 1);
2961 init_vlc(&h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15,
2962 &h263_mbtype_b_tab[0][1], 2, 1,
2963 &h263_mbtype_b_tab[0][0], 2, 1, 1);
2964 init_vlc(&cbpc_b_vlc, CBPC_B_VLC_BITS, 4,
2965 &cbpc_b_tab[0][1], 2, 1,
2966 &cbpc_b_tab[0][0], 2, 1, 1);
2971 * Get the GOB height based on picture height.
2973 int ff_h263_get_gob_height(MpegEncContext *s){
2974 if (s->height <= 400)
2976 else if (s->height <= 800)
2982 int ff_h263_decode_mba(MpegEncContext *s)
2987 if(s->mb_num-1 <= ff_mba_max[i]) break;
2989 mb_pos= get_bits(&s->gb, ff_mba_length[i]);
2990 s->mb_x= mb_pos % s->mb_width;
2991 s->mb_y= mb_pos / s->mb_width;
2996 void ff_h263_encode_mba(MpegEncContext *s)
3001 if(s->mb_num-1 <= ff_mba_max[i]) break;
3003 mb_pos= s->mb_x + s->mb_width*s->mb_y;
3004 put_bits(&s->pb, ff_mba_length[i], mb_pos);
3008 * decodes the group of blocks header or slice header.
3009 * @return <0 if an error occured
3011 static int h263_decode_gob_header(MpegEncContext *s)
3013 unsigned int val, gfid, gob_number;
3016 /* Check for GOB Start Code */
3017 val = show_bits(&s->gb, 16);
3021 /* We have a GBSC probably with GSTUFF */
3022 skip_bits(&s->gb, 16); /* Drop the zeros */
3023 left= s->gb.size_in_bits - get_bits_count(&s->gb);
3024 //MN: we must check the bits left or we might end in a infinite loop (or segfault)
3025 for(;left>13; left--){
3026 if(get_bits1(&s->gb)) break; /* Seek the '1' bit */
3031 if(s->h263_slice_structured){
3032 if(get_bits1(&s->gb)==0)
3035 ff_h263_decode_mba(s);
3037 if(s->mb_num > 1583)
3038 if(get_bits1(&s->gb)==0)
3041 s->qscale = get_bits(&s->gb, 5); /* SQUANT */
3042 if(get_bits1(&s->gb)==0)
3044 gfid = get_bits(&s->gb, 2); /* GFID */
3046 gob_number = get_bits(&s->gb, 5); /* GN */
3048 s->mb_y= s->gob_index* gob_number;
3049 gfid = get_bits(&s->gb, 2); /* GFID */
3050 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
3053 if(s->mb_y >= s->mb_height)
3062 static inline void memsetw(short *tab, int val, int n)
3069 #ifdef CONFIG_ENCODERS
3071 void ff_mpeg4_init_partitions(MpegEncContext *s)
3073 uint8_t *start= pbBufPtr(&s->pb);
3074 uint8_t *end= s->pb.buf_end;
3075 int size= end - start;
3076 int pb_size = (((long)start + size/3)&(~3)) - (long)start;
3077 int tex_size= (size - 2*pb_size)&(~3);
3079 set_put_bits_buffer_size(&s->pb, pb_size);
3080 init_put_bits(&s->tex_pb, start + pb_size , tex_size);
3081 init_put_bits(&s->pb2 , start + pb_size + tex_size, pb_size);
3084 void ff_mpeg4_merge_partitions(MpegEncContext *s)
3086 const int pb2_len = put_bits_count(&s->pb2 );
3087 const int tex_pb_len= put_bits_count(&s->tex_pb);
3088 const int bits= put_bits_count(&s->pb);
3090 if(s->pict_type==I_TYPE){
3091 put_bits(&s->pb, 19, DC_MARKER);
3092 s->misc_bits+=19 + pb2_len + bits - s->last_bits;
3093 s->i_tex_bits+= tex_pb_len;
3095 put_bits(&s->pb, 17, MOTION_MARKER);
3096 s->misc_bits+=17 + pb2_len;
3097 s->mv_bits+= bits - s->last_bits;
3098 s->p_tex_bits+= tex_pb_len;
3101 flush_put_bits(&s->pb2);
3102 flush_put_bits(&s->tex_pb);
3104 set_put_bits_buffer_size(&s->pb, s->pb2.buf_end - s->pb.buf);
3105 ff_copy_bits(&s->pb, s->pb2.buf , pb2_len);
3106 ff_copy_bits(&s->pb, s->tex_pb.buf, tex_pb_len);
3107 s->last_bits= put_bits_count(&s->pb);
3110 #endif //CONFIG_ENCODERS
3112 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
3113 switch(s->pict_type){
3118 return s->f_code+15;
3120 return FFMAX(FFMAX(s->f_code, s->b_code)+15, 17);
3126 #ifdef CONFIG_ENCODERS
3128 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
3130 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
3132 put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0);
3133 put_bits(&s->pb, 1, 1);
3135 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
3136 put_bits(&s->pb, s->quant_precision, s->qscale);
3137 put_bits(&s->pb, 1, 0); /* no HEC */
3140 #endif //CONFIG_ENCODERS
3143 * check if the next stuff is a resync marker or the end.
3146 static inline int mpeg4_is_resync(MpegEncContext *s){
3147 const int bits_count= get_bits_count(&s->gb);
3149 if(s->workaround_bugs&FF_BUG_NO_PADDING){
3153 if(bits_count + 8 >= s->gb.size_in_bits){
3154 int v= show_bits(&s->gb, 8);
3155 v|= 0x7F >> (7-(bits_count&7));
3160 if(show_bits(&s->gb, 16) == ff_mpeg4_resync_prefix[bits_count&7]){
3162 GetBitContext gb= s->gb;
3164 skip_bits(&s->gb, 1);
3165 align_get_bits(&s->gb);
3167 for(len=0; len<32; len++){
3168 if(get_bits1(&s->gb)) break;
3173 if(len>=ff_mpeg4_get_video_packet_prefix_length(s))
3181 * decodes the next video packet.
3182 * @return <0 if something went wrong
3184 static int mpeg4_decode_video_packet_header(MpegEncContext *s)
3186 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
3187 int header_extension=0, mb_num, len;
3189 /* is there enough space left for a video packet + header */
3190 if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1;
3192 for(len=0; len<32; len++){
3193 if(get_bits1(&s->gb)) break;
3196 if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
3197 av_log(s->avctx, AV_LOG_ERROR, "marker does not match f_code\n");
3201 if(s->shape != RECT_SHAPE){
3202 header_extension= get_bits1(&s->gb);
3203 //FIXME more stuff here
3206 mb_num= get_bits(&s->gb, mb_num_bits);
3207 if(mb_num>=s->mb_num){
3208 av_log(s->avctx, AV_LOG_ERROR, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);
3211 if(s->pict_type == B_TYPE){
3212 while(s->next_picture.mbskip_table[ s->mb_index2xy[ mb_num ] ]) mb_num++;
3213 if(mb_num >= s->mb_num) return -1; // slice contains just skipped MBs which where allready decoded
3216 s->mb_x= mb_num % s->mb_width;
3217 s->mb_y= mb_num / s->mb_width;
3219 if(s->shape != BIN_ONLY_SHAPE){
3220 int qscale= get_bits(&s->gb, s->quant_precision);
3222 s->chroma_qscale=s->qscale= qscale;
3225 if(s->shape == RECT_SHAPE){
3226 header_extension= get_bits1(&s->gb);
3228 if(header_extension){
3232 while (get_bits1(&s->gb) != 0)
3235 check_marker(&s->gb, "before time_increment in video packed header");
3236 time_increment= get_bits(&s->gb, s->time_increment_bits);
3237 check_marker(&s->gb, "before vop_coding_type in video packed header");
3239 skip_bits(&s->gb, 2); /* vop coding type */
3240 //FIXME not rect stuff here
3242 if(s->shape != BIN_ONLY_SHAPE){
3243 skip_bits(&s->gb, 3); /* intra dc vlc threshold */
3244 //FIXME don't just ignore everything
3245 if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3246 mpeg4_decode_sprite_trajectory(s, &s->gb);
3247 av_log(s->avctx, AV_LOG_ERROR, "untested\n");
3250 //FIXME reduced res stuff here
3252 if (s->pict_type != I_TYPE) {
3253 int f_code = get_bits(&s->gb, 3); /* fcode_for */
3255 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (f_code=0)\n");
3258 if (s->pict_type == B_TYPE) {
3259 int b_code = get_bits(&s->gb, 3);
3261 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (b_code=0)\n");
3266 //FIXME new-pred stuff
3268 //printf("parse ok %d %d %d %d\n", mb_num, s->mb_x + s->mb_y*s->mb_width, get_bits_count(gb), get_bits_count(&s->gb));
3273 void ff_mpeg4_clean_buffers(MpegEncContext *s)
3275 int c_wrap, c_xy, l_wrap, l_xy;
3277 l_wrap= s->b8_stride;
3278 l_xy= (2*s->mb_y-1)*l_wrap + s->mb_x*2 - 1;
3279 c_wrap= s->mb_stride;
3280 c_xy= (s->mb_y-1)*c_wrap + s->mb_x - 1;
3284 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
3285 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
3286 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
3290 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t));
3291 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
3292 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
3295 // we can't clear the MVs as they might be needed by a b frame
3296 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t));
3297 // memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
3298 s->last_mv[0][0][0]=
3299 s->last_mv[0][0][1]=
3300 s->last_mv[1][0][0]=
3301 s->last_mv[1][0][1]= 0;
3305 * decodes the group of blocks / video packet header.
3306 * @return <0 if no resync found
3308 int ff_h263_resync(MpegEncContext *s){
3311 if(s->codec_id==CODEC_ID_MPEG4){
3313 align_get_bits(&s->gb);
3316 if(show_bits(&s->gb, 16)==0){
3317 if(s->codec_id==CODEC_ID_MPEG4)
3318 ret= mpeg4_decode_video_packet_header(s);
3320 ret= h263_decode_gob_header(s);
3324 //ok, it's not where its supposed to be ...
3325 s->gb= s->last_resync_gb;
3326 align_get_bits(&s->gb);
3327 left= s->gb.size_in_bits - get_bits_count(&s->gb);
3329 for(;left>16+1+5+5; left-=8){
3330 if(show_bits(&s->gb, 16)==0){
3331 GetBitContext bak= s->gb;
3333 if(s->codec_id==CODEC_ID_MPEG4)
3334 ret= mpeg4_decode_video_packet_header(s);
3336 ret= h263_decode_gob_header(s);
3342 skip_bits(&s->gb, 8);
3349 * gets the average motion vector for a GMC MB.
3350 * @param n either 0 for the x component or 1 for y
3351 * @returns the average MV for a GMC MB
3353 static inline int get_amv(MpegEncContext *s, int n){
3354 int x, y, mb_v, sum, dx, dy, shift;
3355 int len = 1 << (s->f_code + 4);
3356 const int a= s->sprite_warping_accuracy;
3358 if(s->workaround_bugs & FF_BUG_AMV)
3359 len >>= s->quarter_sample;
3361 if(s->real_sprite_warping_points==1){
3362 if(s->divx_version==500 && s->divx_build==413)
3363 sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample));
3365 sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a);
3367 dx= s->sprite_delta[n][0];
3368 dy= s->sprite_delta[n][1];
3369 shift= s->sprite_shift[0];
3370 if(n) dy -= 1<<(shift + a + 1);
3371 else dx -= 1<<(shift + a + 1);
3372 mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16;
3375 for(y=0; y<16; y++){
3379 //XXX FIXME optimize
3380 for(x=0; x<16; x++){
3385 sum= RSHIFT(sum, a+8-s->quarter_sample);
3388 if (sum < -len) sum= -len;
3389 else if (sum >= len) sum= len-1;
3395 * decodes first partition.
3396 * @return number of MBs decoded or <0 if an error occured
3398 static int mpeg4_decode_partition_a(MpegEncContext *s){
3400 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3402 /* decode first partition */
3404 s->first_slice_line=1;
3405 for(; s->mb_y<s->mb_height; s->mb_y++){
3406 ff_init_block_index(s);
3407 for(; s->mb_x<s->mb_width; s->mb_x++){
3408 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3413 ff_update_block_index(s);
3414 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3415 s->first_slice_line=0;
3417 if(s->pict_type==I_TYPE){
3421 if(show_bits_long(&s->gb, 19)==DC_MARKER){
3425 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
3427 av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
3432 s->cbp_table[xy]= cbpc & 3;
3433 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3437 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3439 s->current_picture.qscale_table[xy]= s->qscale;
3441 s->mbintra_table[xy]= 1;
3444 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3446 av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3450 if(dc_pred_dir) dir|=1;
3452 s->pred_dir_table[xy]= dir;
3453 }else{ /* P/S_TYPE */
3454 int mx, my, pred_x, pred_y, bits;
3455 int16_t * const mot_val= s->current_picture.motion_val[0][s->block_index[0]];
3456 const int stride= s->b8_stride*2;
3459 bits= show_bits(&s->gb, 17);
3460 if(bits==MOTION_MARKER){
3466 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3467 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
3471 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3474 mot_val[0 ]= mot_val[2 ]=
3475 mot_val[0+stride]= mot_val[2+stride]= mx;
3476 mot_val[1 ]= mot_val[3 ]=
3477 mot_val[1+stride]= mot_val[3+stride]= my;
3479 if(s->mbintra_table[xy])
3480 ff_clean_intra_table_entries(s);
3484 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3486 av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
3492 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
3494 s->mb_intra = ((cbpc & 4) != 0);
3497 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3498 s->mbintra_table[xy]= 1;
3499 mot_val[0 ]= mot_val[2 ]=
3500 mot_val[0+stride]= mot_val[2+stride]= 0;
3501 mot_val[1 ]= mot_val[3 ]=
3502 mot_val[1+stride]= mot_val[3+stride]= 0;
3504 if(s->mbintra_table[xy])
3505 ff_clean_intra_table_entries(s);
3507 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
3508 s->mcsel= get_bits1(&s->gb);
3511 if ((cbpc & 16) == 0) {
3512 /* 16x16 motion prediction */
3514 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3516 mx = h263_decode_motion(s, pred_x, s->f_code);
3520 my = h263_decode_motion(s, pred_y, s->f_code);
3523 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3527 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
3530 mot_val[0 ]= mot_val[2 ] =
3531 mot_val[0+stride]= mot_val[2+stride]= mx;
3532 mot_val[1 ]= mot_val[3 ]=
3533 mot_val[1+stride]= mot_val[3+stride]= my;
3536 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3538 int16_t *mot_val= h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3539 mx = h263_decode_motion(s, pred_x, s->f_code);
3543 my = h263_decode_motion(s, pred_y, s->f_code);
3560 * decode second partition.
3561 * @return <0 if an error occured
3563 static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
3565 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3567 s->mb_x= s->resync_mb_x;
3568 s->first_slice_line=1;
3569 for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
3570 ff_init_block_index(s);
3571 for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
3572 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3575 ff_update_block_index(s);
3576 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3577 s->first_slice_line=0;
3579 if(s->pict_type==I_TYPE){
3580 int ac_pred= get_bits1(&s->gb);
3581 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3583 av_log(s->avctx, AV_LOG_ERROR, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3587 s->cbp_table[xy]|= cbpy<<2;
3588 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3589 }else{ /* P || S_TYPE */
3590 if(IS_INTRA(s->current_picture.mb_type[xy])){
3592 int ac_pred = get_bits1(&s->gb);
3593 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3596 av_log(s->avctx, AV_LOG_ERROR, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3600 if(s->cbp_table[xy] & 8) {
3601 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3603 s->current_picture.qscale_table[xy]= s->qscale;
3607 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3609 av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3613 if(dc_pred_dir) dir|=1;
3615 s->cbp_table[xy]&= 3; //remove dquant
3616 s->cbp_table[xy]|= cbpy<<2;
3617 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3618 s->pred_dir_table[xy]= dir;
3619 }else if(IS_SKIP(s->current_picture.mb_type[xy])){
3620 s->current_picture.qscale_table[xy]= s->qscale;
3621 s->cbp_table[xy]= 0;
3623 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3626 av_log(s->avctx, AV_LOG_ERROR, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3630 if(s->cbp_table[xy] & 8) {
3631 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3633 s->current_picture.qscale_table[xy]= s->qscale;
3635 s->cbp_table[xy]&= 3; //remove dquant
3636 s->cbp_table[xy]|= (cbpy^0xf)<<2;
3640 if(mb_num >= mb_count) return 0;
3647 * decodes the first & second partition
3648 * @return <0 if error (and sets error type in the error_status_table)
3650 int ff_mpeg4_decode_partitions(MpegEncContext *s)
3653 const int part_a_error= s->pict_type==I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR;
3654 const int part_a_end = s->pict_type==I_TYPE ? (DC_END |MV_END) : MV_END;
3656 mb_num= mpeg4_decode_partition_a(s);
3658 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3662 if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
3663 av_log(s->avctx, AV_LOG_ERROR, "slice below monitor ...\n");
3664 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3668 s->mb_num_left= mb_num;
3670 if(s->pict_type==I_TYPE){
3671 while(show_bits(&s->gb, 9) == 1)
3672 skip_bits(&s->gb, 9);
3673 if(get_bits_long(&s->gb, 19)!=DC_MARKER){
3674 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
3678 while(show_bits(&s->gb, 10) == 1)
3679 skip_bits(&s->gb, 10);
3680 if(get_bits(&s->gb, 17)!=MOTION_MARKER){
3681 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
3685 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end);
3687 if( mpeg4_decode_partition_b(s, mb_num) < 0){
3688 if(s->pict_type==P_TYPE)
3689 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR);
3692 if(s->pict_type==P_TYPE)
3693 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END);
3700 * decode partition C of one MB.
3701 * @return <0 if an error occured
3703 static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64])
3706 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3708 mb_type= s->current_picture.mb_type[xy];
3709 cbp = s->cbp_table[xy];
3711 if(s->current_picture.qscale_table[xy] != s->qscale){
3712 ff_set_qscale(s, s->current_picture.qscale_table[xy] );
3715 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
3718 s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0];
3719 s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1];
3721 s->mb_intra = IS_INTRA(mb_type);
3723 if (IS_SKIP(mb_type)) {
3726 s->block_last_index[i] = -1;
3727 s->mv_dir = MV_DIR_FORWARD;
3728 s->mv_type = MV_TYPE_16X16;
3729 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3736 }else if(s->mb_intra){
3737 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3738 }else if(!s->mb_intra){
3739 // s->mcsel= 0; //FIXME do we need to init that
3741 s->mv_dir = MV_DIR_FORWARD;
3742 if (IS_8X8(mb_type)) {
3743 s->mv_type = MV_TYPE_8X8;
3745 s->mv_type = MV_TYPE_16X16;
3748 } else { /* I-Frame */
3750 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3753 if (!IS_SKIP(mb_type)) {
3755 s->dsp.clear_blocks(s->block[0]);
3756 /* decode each block */
3757 for (i = 0; i < 6; i++) {
3758 if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){
3759 av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra);
3766 /* per-MB end of slice check */
3768 if(--s->mb_num_left <= 0){
3769 //printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb));
3770 if(mpeg4_is_resync(s))
3775 if(mpeg4_is_resync(s)){
3776 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
3777 if(s->cbp_table[xy+delta])
3785 * read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :)
3787 static void preview_obmc(MpegEncContext *s){
3788 GetBitContext gb= s->gb;
3790 int cbpc, i, pred_x, pred_y, mx, my;
3792 const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
3793 const int stride= s->b8_stride*2;
3796 s->block_index[i]+= 2;
3798 s->block_index[i]+= 1;
3801 assert(s->pict_type == P_TYPE);
3804 if (get_bits1(&s->gb)) {
3806 mot_val = s->current_picture.motion_val[0][ s->block_index[0] ];
3807 mot_val[0 ]= mot_val[2 ]=
3808 mot_val[0+stride]= mot_val[2+stride]= 0;
3809 mot_val[1 ]= mot_val[3 ]=
3810 mot_val[1+stride]= mot_val[3+stride]= 0;
3812 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3815 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3819 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3821 get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3823 if(s->modified_quant){
3824 if(get_bits1(&s->gb)) skip_bits(&s->gb, 1);
3825 else skip_bits(&s->gb, 5);
3827 skip_bits(&s->gb, 2);
3830 if ((cbpc & 16) == 0) {
3831 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3832 /* 16x16 motion prediction */
3833 mot_val= h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3835 mx = h263p_decode_umotion(s, pred_x);
3837 mx = h263_decode_motion(s, pred_x, 1);
3840 my = h263p_decode_umotion(s, pred_y);
3842 my = h263_decode_motion(s, pred_y, 1);
3844 mot_val[0 ]= mot_val[2 ]=
3845 mot_val[0+stride]= mot_val[2+stride]= mx;
3846 mot_val[1 ]= mot_val[3 ]=
3847 mot_val[1+stride]= mot_val[3+stride]= my;
3849 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3851 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3853 mx = h263p_decode_umotion(s, pred_x);
3855 mx = h263_decode_motion(s, pred_x, 1);
3858 my = h263p_decode_umotion(s, pred_y);
3860 my = h263_decode_motion(s, pred_y, 1);
3861 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3862 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3871 s->block_index[i]-= 2;
3873 s->block_index[i]-= 1;
3879 static void h263_decode_dquant(MpegEncContext *s){
3880 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3882 if(s->modified_quant){
3883 if(get_bits1(&s->gb))
3884 s->qscale= modified_quant_tab[get_bits1(&s->gb)][ s->qscale ];
3886 s->qscale= get_bits(&s->gb, 5);
3888 s->qscale += quant_tab[get_bits(&s->gb, 2)];
3889 ff_set_qscale(s, s->qscale);
3892 int ff_h263_decode_mb(MpegEncContext *s,
3893 DCTELEM block[6][64])
3895 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
3897 const int xy= s->mb_x + s->mb_y * s->mb_stride;
3899 assert(!s->h263_pred);
3901 if (s->pict_type == P_TYPE) {
3903 if (get_bits1(&s->gb)) {
3907 s->block_last_index[i] = -1;
3908 s->mv_dir = MV_DIR_FORWARD;
3909 s->mv_type = MV_TYPE_16X16;
3910 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3913 s->mb_skipped = !(s->obmc | s->loop_filter);
3916 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3917 //fprintf(stderr, "\tCBPC: %d", cbpc);
3919 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
3924 s->dsp.clear_blocks(s->block[0]);
3927 s->mb_intra = ((cbpc & 4) != 0);
3928 if (s->mb_intra) goto intra;
3930 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3932 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
3935 cbp = (cbpc & 3) | (cbpy << 2);
3937 h263_decode_dquant(s);
3940 s->mv_dir = MV_DIR_FORWARD;
3941 if ((cbpc & 16) == 0) {
3942 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3943 /* 16x16 motion prediction */
3944 s->mv_type = MV_TYPE_16X16;
3945 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3947 mx = h263p_decode_umotion(s, pred_x);
3949 mx = h263_decode_motion(s, pred_x, 1);
3955 my = h263p_decode_umotion(s, pred_y);
3957 my = h263_decode_motion(s, pred_y, 1);
3961 s->mv[0][0][0] = mx;
3962 s->mv[0][0][1] = my;
3964 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3965 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3967 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3968 s->mv_type = MV_TYPE_8X8;
3970 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3972 mx = h263p_decode_umotion(s, pred_x);
3974 mx = h263_decode_motion(s, pred_x, 1);
3979 my = h263p_decode_umotion(s, pred_y);
3981 my = h263_decode_motion(s, pred_y, 1);
3984 s->mv[0][i][0] = mx;
3985 s->mv[0][i][1] = my;
3986 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3987 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3993 /* decode each block */
3994 for (i = 0; i < 6; i++) {
3995 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
4001 if(s->pict_type == P_TYPE && s->mb_x+1<s->mb_width && s->mb_num_left != 1)
4004 } else if(s->pict_type==B_TYPE) {
4006 const int stride= s->b8_stride;
4007 int16_t *mot_val0 = s->current_picture.motion_val[0][ 2*(s->mb_x + s->mb_y*stride) ];
4008 int16_t *mot_val1 = s->current_picture.motion_val[1][ 2*(s->mb_x + s->mb_y*stride) ];
4009 // const int mv_xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
4012 mot_val0[0 ]= mot_val0[2 ]= mot_val0[0+2*stride]= mot_val0[2+2*stride]=
4013 mot_val0[1 ]= mot_val0[3 ]= mot_val0[1+2*stride]= mot_val0[3+2*stride]=
4014 mot_val1[0 ]= mot_val1[2 ]= mot_val1[0+2*stride]= mot_val1[2+2*stride]=
4015 mot_val1[1 ]= mot_val1[3 ]= mot_val1[1+2*stride]= mot_val1[3+2*stride]= 0;
4018 mb_type= get_vlc2(&s->gb, h263_mbtype_b_vlc.table, H263_MBTYPE_B_VLC_BITS, 2);
4020 av_log(s->avctx, AV_LOG_ERROR, "b mb_type damaged at %d %d\n", s->mb_x, s->mb_y);
4024 mb_type= h263_mb_type_b_map[ mb_type ];
4027 s->mb_intra = IS_INTRA(mb_type);
4028 if(HAS_CBP(mb_type)){
4029 s->dsp.clear_blocks(s->block[0]);
4030 cbpc = get_vlc2(&s->gb, cbpc_b_vlc.table, CBPC_B_VLC_BITS, 1);
4032 dquant = IS_QUANT(mb_type);
4036 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4039 av_log(s->avctx, AV_LOG_ERROR, "b cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4043 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
4046 cbp = (cbpc & 3) | (cbpy << 2);
4050 assert(!s->mb_intra);
4052 if(IS_QUANT(mb_type)){
4053 h263_decode_dquant(s);
4056 if(IS_DIRECT(mb_type)){
4057 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4058 mb_type |= ff_mpeg4_set_direct_mv(s, 0, 0);
4061 s->mv_type= MV_TYPE_16X16;
4064 if(USES_LIST(mb_type, 0)){
4065 int16_t *mot_val= h263_pred_motion(s, 0, 0, &mx, &my);
4066 s->mv_dir = MV_DIR_FORWARD;
4068 mx = h263_decode_motion(s, mx, 1);
4069 my = h263_decode_motion(s, my, 1);
4071 s->mv[0][0][0] = mx;
4072 s->mv[0][0][1] = my;
4073 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
4074 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
4077 if(USES_LIST(mb_type, 1)){
4078 int16_t *mot_val= h263_pred_motion(s, 0, 1, &mx, &my);
4079 s->mv_dir |= MV_DIR_BACKWARD;
4081 mx = h263_decode_motion(s, mx, 1);
4082 my = h263_decode_motion(s, my, 1);
4084 s->mv[1][0][0] = mx;
4085 s->mv[1][0][1] = my;
4086 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
4087 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
4091 s->current_picture.mb_type[xy]= mb_type;
4093 /* decode each block */
4094 for (i = 0; i < 6; i++) {
4095 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
4099 } else { /* I-Frame */
4101 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
4103 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4108 s->dsp.clear_blocks(s->block[0]);
4113 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
4115 s->ac_pred = get_bits1(&s->gb);
4117 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
4119 s->h263_aic_dir = get_bits1(&s->gb);
4124 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4126 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4129 cbp = (cbpc & 3) | (cbpy << 2);
4131 h263_decode_dquant(s);
4134 /* decode each block */
4135 for (i = 0; i < 6; i++) {
4136 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
4143 /* per-MB end of slice check */
4145 int v= show_bits(&s->gb, 16);
4147 if(get_bits_count(&s->gb) + 16 > s->gb.size_in_bits){
4148 v>>= get_bits_count(&s->gb) + 16 - s->gb.size_in_bits;
4158 int ff_mpeg4_decode_mb(MpegEncContext *s,
4159 DCTELEM block[6][64])
4161 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
4163 static int8_t quant_tab[4] = { -1, -2, 1, 2 };
4164 const int xy= s->mb_x + s->mb_y * s->mb_stride;
4166 assert(s->h263_pred);
4168 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
4170 if (get_bits1(&s->gb)) {
4174 s->block_last_index[i] = -1;
4175 s->mv_dir = MV_DIR_FORWARD;
4176 s->mv_type = MV_TYPE_16X16;
4177 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
4178 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
4180 s->mv[0][0][0]= get_amv(s, 0);
4181 s->mv[0][0][1]= get_amv(s, 1);
4185 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4193 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
4194 //fprintf(stderr, "\tCBPC: %d", cbpc);
4196 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4201 s->dsp.clear_blocks(s->block[0]);
4203 s->mb_intra = ((cbpc & 4) != 0);
4204 if (s->mb_intra) goto intra;
4206 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
4207 s->mcsel= get_bits1(&s->gb);
4209 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1) ^ 0x0F;
4211 cbp = (cbpc & 3) | (cbpy << 2);
4213 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
4215 if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE)))
4216 s->interlaced_dct= get_bits1(&s->gb);
4218 s->mv_dir = MV_DIR_FORWARD;
4219 if ((cbpc & 16) == 0) {
4221 s->current_picture.mb_type[xy]= MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
4222 /* 16x16 global motion prediction */
4223 s->mv_type = MV_TYPE_16X16;
4226 s->mv[0][0][0] = mx;
4227 s->mv[0][0][1] = my;
4228 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
4229 s->current_picture.mb_type[xy]= MB_TYPE_16x8 | MB_TYPE_L0 | MB_TYPE_INTERLACED;
4230 /* 16x8 field motion prediction */
4231 s->mv_type= MV_TYPE_FIELD;
4233 s->field_select[0][0]= get_bits1(&s->gb);
4234 s->field_select[0][1]= get_bits1(&s->gb);
4236 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4239 mx = h263_decode_motion(s, pred_x, s->f_code);
4243 my = h263_decode_motion(s, pred_y/2, s->f_code);
4247 s->mv[0][i][0] = mx;
4248 s->mv[0][i][1] = my;
4251 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
4252 /* 16x16 motion prediction */
4253 s->mv_type = MV_TYPE_16X16;
4254 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4255 mx = h263_decode_motion(s, pred_x, s->f_code);
4260 my = h263_decode_motion(s, pred_y, s->f_code);
4264 s->mv[0][0][0] = mx;
4265 s->mv[0][0][1] = my;
4268 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
4269 s->mv_type = MV_TYPE_8X8;
4271 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
4272 mx = h263_decode_motion(s, pred_x, s->f_code);
4276 my = h263_decode_motion(s, pred_y, s->f_code);
4279 s->mv[0][i][0] = mx;
4280 s->mv[0][i][1] = my;
4285 } else if(s->pict_type==B_TYPE) {
4286 int modb1; // first bit of modb
4287 int modb2; // second bit of modb
4290 s->mb_intra = 0; //B-frames never contain intra blocks
4291 s->mcsel=0; // ... true gmc blocks
4295 s->last_mv[i][0][0]=
4296 s->last_mv[i][0][1]=
4297 s->last_mv[i][1][0]=
4298 s->last_mv[i][1][1]= 0;
4302 /* if we skipped it in the future P Frame than skip it now too */
4303 s->mb_skipped= s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]; // Note, skiptab=0 if last was GMC
4308 s->block_last_index[i] = -1;
4310 s->mv_dir = MV_DIR_FORWARD;
4311 s->mv_type = MV_TYPE_16X16;
4316 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4320 modb1= get_bits1(&s->gb);
4322 mb_type= MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1; //like MB_TYPE_B_DIRECT but no vectors coded
4325 modb2= get_bits1(&s->gb);
4326 mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
4328 av_log(s->avctx, AV_LOG_ERROR, "illegal MB_type\n");
4331 mb_type= mb_type_b_map[ mb_type ];
4334 s->dsp.clear_blocks(s->block[0]);
4335 cbp= get_bits(&s->gb, 6);
4338 if ((!IS_DIRECT(mb_type)) && cbp) {
4339 if(get_bits1(&s->gb)){
4340 ff_set_qscale(s, s->qscale + get_bits1(&s->gb)*4 - 2);
4344 if(!s->progressive_sequence){
4346 s->interlaced_dct= get_bits1(&s->gb);
4348 if(!IS_DIRECT(mb_type) && get_bits1(&s->gb)){
4349 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
4350 mb_type &= ~MB_TYPE_16x16;
4352 if(USES_LIST(mb_type, 0)){
4353 s->field_select[0][0]= get_bits1(&s->gb);
4354 s->field_select[0][1]= get_bits1(&s->gb);
4356 if(USES_LIST(mb_type, 1)){
4357 s->field_select[1][0]= get_bits1(&s->gb);
4358 s->field_select[1][1]= get_bits1(&s->gb);
4364 if((mb_type & (MB_TYPE_DIRECT2|MB_TYPE_INTERLACED)) == 0){
4365 s->mv_type= MV_TYPE_16X16;
4367 if(USES_LIST(mb_type, 0)){
4368 s->mv_dir = MV_DIR_FORWARD;
4370 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
4371 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
4372 s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
4373 s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
4376 if(USES_LIST(mb_type, 1)){
4377 s->mv_dir |= MV_DIR_BACKWARD;
4379 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
4380 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
4381 s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
4382 s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
4384 }else if(!IS_DIRECT(mb_type)){
4385 s->mv_type= MV_TYPE_FIELD;
4387 if(USES_LIST(mb_type, 0)){
4388 s->mv_dir = MV_DIR_FORWARD;
4391 mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code);
4392 my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
4393 s->last_mv[0][i][0]= s->mv[0][i][0] = mx;
4394 s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
4398 if(USES_LIST(mb_type, 1)){
4399 s->mv_dir |= MV_DIR_BACKWARD;
4402 mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code);
4403 my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
4404 s->last_mv[1][i][0]= s->mv[1][i][0] = mx;
4405 s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
4411 if(IS_DIRECT(mb_type)){
4412 if(IS_SKIP(mb_type))
4415 mx = h263_decode_motion(s, 0, 1);
4416 my = h263_decode_motion(s, 0, 1);
4419 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4420 mb_type |= ff_mpeg4_set_direct_mv(s, mx, my);
4422 s->current_picture.mb_type[xy]= mb_type;
4423 } else { /* I-Frame */
4425 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
4427 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4435 s->ac_pred = get_bits1(&s->gb);
4437 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
4439 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
4441 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4443 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4446 cbp = (cbpc & 3) | (cbpy << 2);
4448 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
4451 if(!s->progressive_sequence)
4452 s->interlaced_dct= get_bits1(&s->gb);
4454 s->dsp.clear_blocks(s->block[0]);
4455 /* decode each block */
4456 for (i = 0; i < 6; i++) {
4457 if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0)
4464 /* decode each block */
4465 for (i = 0; i < 6; i++) {
4466 if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0)
4472 /* per-MB end of slice check */
4473 if(s->codec_id==CODEC_ID_MPEG4){
4474 if(mpeg4_is_resync(s)){
4475 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
4476 if(s->pict_type==B_TYPE && s->next_picture.mbskip_table[xy + delta])
4485 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
4487 int code, val, sign, shift, l;
4488 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
4495 sign = get_bits1(&s->gb);
4499 val = (val - 1) << shift;
4500 val |= get_bits(&s->gb, shift);
4507 /* modulo decoding */
4508 if (!s->h263_long_vectors) {
4509 l = INT_BIT - 5 - f_code;
4512 /* horrible h263 long vector mode */
4513 if (pred < -31 && val < -63)
4515 if (pred > 32 && val > 63)
4522 /* Decodes RVLC of H.263+ UMV */
4523 static int h263p_decode_umotion(MpegEncContext * s, int pred)
4527 if (get_bits1(&s->gb)) /* Motion difference = 0 */
4530 code = 2 + get_bits1(&s->gb);
4532 while (get_bits1(&s->gb))
4535 code += get_bits1(&s->gb);
4540 code = (sign) ? (pred - code) : (pred + code);
4542 fprintf(stderr,"H.263+ UMV Motion = %d\n", code);
4548 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
4551 int code, level, i, j, last, run;
4552 RLTable *rl = &rl_inter;
4553 const uint8_t *scan_table;
4554 GetBitContext gb= s->gb;
4556 scan_table = s->intra_scantable.permutated;
4557 if (s->h263_aic && s->mb_intra) {
4561 if (s->h263_aic_dir)
4562 scan_table = s->intra_v_scantable.permutated; /* left */
4564 scan_table = s->intra_h_scantable.permutated; /* top */
4566 } else if (s->mb_intra) {
4568 if(s->codec_id == CODEC_ID_RV10){
4569 #ifdef CONFIG_RV10_DECODER
4570 if (s->rv10_version == 3 && s->pict_type == I_TYPE) {
4571 int component, diff;
4572 component = (n <= 3 ? 0 : n - 4 + 1);
4573 level = s->last_dc[component];
4574 if (s->rv10_first_dc_coded[component]) {
4575 diff = rv_decode_dc(s, n);
4579 level = level & 0xff; /* handle wrap round */
4580 s->last_dc[component] = level;
4582 s->rv10_first_dc_coded[component] = 1;
4585 level = get_bits(&s->gb, 8);
4591 level = get_bits(&s->gb, 8);
4592 if((level&0x7F) == 0){
4593 av_log(s->avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y);
4594 if(s->error_resilience >= FF_ER_COMPLIANT)
4606 if (s->mb_intra && s->h263_aic)
4608 s->block_last_index[n] = i - 1;
4613 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
4615 av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
4618 if (code == rl->n) {
4620 if (s->h263_flv > 1) {
4621 int is11 = get_bits1(&s->gb);
4622 last = get_bits1(&s->gb);
4623 run = get_bits(&s->gb, 6);
4625 level = get_sbits(&s->gb, 11);
4627 level = get_sbits(&s->gb, 7);
4630 last = get_bits1(&s->gb);
4631 run = get_bits(&s->gb, 6);
4632 level = (int8_t)get_bits(&s->gb, 8);
4634 if (s->codec_id == CODEC_ID_RV10) {
4635 /* XXX: should patch encoder too */
4636 level = get_sbits(&s->gb, 12);
4638 level = get_bits(&s->gb, 5);
4639 level |= get_sbits(&s->gb, 6)<<5;
4644 run = rl->table_run[code];
4645 level = rl->table_level[code];
4646 last = code >= rl->last;
4647 if (get_bits1(&s->gb))
4652 if(s->alt_inter_vlc && rl == &rl_inter && !s->mb_intra){
4653 //looks like a hack but no, it's the way its supposed to work ...
4657 memset(block, 0, sizeof(DCTELEM)*64);
4660 av_log(s->avctx, AV_LOG_ERROR, "run overflow at %dx%d i:%d\n", s->mb_x, s->mb_y, s->mb_intra);
4670 if (s->mb_intra && s->h263_aic) {
4671 h263_pred_acdc(s, block, n);
4674 s->block_last_index[n] = i;
4679 * decodes the dc value.
4680 * @param n block index (0-3 are luma, 4-5 are chroma)
4681 * @param dir_ptr the prediction direction will be stored here
4682 * @return the quantized dc
4684 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
4689 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
4691 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
4692 if (code < 0 || code > 9 /* && s->nbit<9 */){
4693 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
4701 level= 2*get_bits1(&s->gb)-1;
4703 if(get_bits1(&s->gb))
4704 level = get_bits(&s->gb, code-1) + (1<<(code-1));
4706 level = -get_bits(&s->gb, code-1) - (1<<(code-1));
4709 level = get_xbits(&s->gb, code);
4713 if(get_bits1(&s->gb)==0){ /* marker */
4714 if(s->error_resilience>=2){
4715 av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n");
4722 return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0);
4727 * @return <0 if an error occured
4729 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
4730 int n, int coded, int intra, int rvlc)
4732 int level, i, last, run;
4735 RL_VLC_ELEM * rl_vlc;
4736 const uint8_t * scan_table;
4739 //Note intra & rvlc should be optimized away if this is inlined
4742 if(s->qscale < s->intra_dc_threshold){
4744 if(s->partitioned_frame){
4745 level = s->dc_val[0][ s->block_index[n] ];
4746 if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale);
4747 else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale);
4748 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32;
4750 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
4763 rl = &rvlc_rl_intra;
4764 rl_vlc = rvlc_rl_intra.rl_vlc[0];
4767 rl_vlc = rl_intra.rl_vlc[0];
4770 if (dc_pred_dir == 0)
4771 scan_table = s->intra_v_scantable.permutated; /* left */
4773 scan_table = s->intra_h_scantable.permutated; /* top */
4775 scan_table = s->intra_scantable.permutated;
4782 s->block_last_index[n] = i;
4785 if(rvlc) rl = &rvlc_rl_inter;
4786 else rl = &rl_inter;
4788 scan_table = s->intra_scantable.permutated;
4794 rl_vlc = rvlc_rl_inter.rl_vlc[0];
4796 rl_vlc = rl_inter.rl_vlc[0];
4799 qmul = s->qscale << 1;
4800 qadd = (s->qscale - 1) | 1;
4802 rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale];
4804 rl_vlc = rl_inter.rl_vlc[s->qscale];
4809 OPEN_READER(re, &s->gb);
4811 UPDATE_CACHE(re, &s->gb);
4812 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
4816 if(SHOW_UBITS(re, &s->gb, 1)==0){
4817 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n");
4819 }; SKIP_CACHE(re, &s->gb, 1);
4821 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4822 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4823 SKIP_COUNTER(re, &s->gb, 1+1+6);
4824 UPDATE_CACHE(re, &s->gb);
4826 if(SHOW_UBITS(re, &s->gb, 1)==0){
4827 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n");
4829 }; SKIP_CACHE(re, &s->gb, 1);
4831 level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11);
4833 if(SHOW_UBITS(re, &s->gb, 5)!=0x10){
4834 av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n");
4836 }; SKIP_CACHE(re, &s->gb, 5);
4838 level= level * qmul + qadd;
4839 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1);
4840 SKIP_COUNTER(re, &s->gb, 1+11+5+1);
4846 cache= GET_CACHE(re, &s->gb);
4849 cache ^= 0xC0000000;
4851 if (cache&0x80000000) {
4852 if (cache&0x40000000) {
4854 SKIP_CACHE(re, &s->gb, 2);
4855 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4856 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4857 SKIP_COUNTER(re, &s->gb, 2+1+6);
4858 UPDATE_CACHE(re, &s->gb);
4861 level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12);
4863 if(SHOW_UBITS(re, &s->gb, 1)==0){
4864 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n");
4866 }; SKIP_CACHE(re, &s->gb, 1);
4868 level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
4870 if(SHOW_UBITS(re, &s->gb, 1)==0){
4871 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n");
4873 }; LAST_SKIP_CACHE(re, &s->gb, 1);
4875 SKIP_COUNTER(re, &s->gb, 1+12+1);
4879 if(s->error_resilience >= FF_ER_COMPLIANT){
4880 const int abs_level= ABS(level);
4881 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
4882 const int run1= run - rl->max_run[last][abs_level] - 1;
4883 if(abs_level <= rl->max_level[last][run]){
4884 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
4887 if(s->error_resilience > FF_ER_COMPLIANT){
4888 if(abs_level <= rl->max_level[last][run]*2){
4889 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
4892 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
4893 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
4900 if (level>0) level= level * qmul + qadd;
4901 else level= level * qmul - qadd;
4903 if((unsigned)(level + 2048) > 4095){
4904 if(s->error_resilience > FF_ER_COMPLIANT){
4905 if(level > 2560 || level<-2560){
4906 av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
4910 level= level<0 ? -2048 : 2047;
4917 #if MIN_CACHE_BITS < 20
4918 LAST_SKIP_BITS(re, &s->gb, 2);
4919 UPDATE_CACHE(re, &s->gb);
4921 SKIP_BITS(re, &s->gb, 2);
4923 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
4924 i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing
4925 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4926 LAST_SKIP_BITS(re, &s->gb, 1);
4930 #if MIN_CACHE_BITS < 19
4931 LAST_SKIP_BITS(re, &s->gb, 1);
4932 UPDATE_CACHE(re, &s->gb);
4934 SKIP_BITS(re, &s->gb, 1);
4936 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
4938 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
4939 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4940 LAST_SKIP_BITS(re, &s->gb, 1);
4945 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4946 LAST_SKIP_BITS(re, &s->gb, 1);
4951 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
4955 block[scan_table[i]] = level;
4959 block[scan_table[i]] = level;
4961 CLOSE_READER(re, &s->gb);
4965 if(s->qscale >= s->intra_dc_threshold){
4966 block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0);
4971 mpeg4_pred_ac(s, block, n, dc_pred_dir);
4973 i = 63; /* XXX: not optimal */
4976 s->block_last_index[n] = i;
4980 /* most is hardcoded. should extend to handle all h263 streams */
4981 int h263_decode_picture_header(MpegEncContext *s)
4983 int format, width, height, i;
4986 align_get_bits(&s->gb);
4988 startcode= get_bits(&s->gb, 22-8);
4990 for(i= s->gb.size_in_bits - get_bits_count(&s->gb); i>24; i-=8) {
4991 startcode = ((startcode << 8) | get_bits(&s->gb, 8)) & 0x003FFFFF;
4993 if(startcode == 0x20)
4997 if (startcode != 0x20) {
4998 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
5001 /* temporal reference */
5002 i = get_bits(&s->gb, 8); /* picture timestamp */
5003 if( (s->picture_number&~0xFF)+i < s->picture_number)
5005 s->picture_number= (s->picture_number&~0xFF) + i;
5007 /* PTYPE starts here */
5008 if (get_bits1(&s->gb) != 1) {
5010 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
5013 if (get_bits1(&s->gb) != 0) {
5014 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
5015 return -1; /* h263 id */
5017 skip_bits1(&s->gb); /* split screen off */
5018 skip_bits1(&s->gb); /* camera off */
5019 skip_bits1(&s->gb); /* freeze picture release off */
5021 format = get_bits(&s->gb, 3);
5026 7 extended PTYPE (PLUSPTYPE)
5029 if (format != 7 && format != 6) {
5032 width = h263_format[format][0];
5033 height = h263_format[format][1];
5037 s->pict_type = I_TYPE + get_bits1(&s->gb);
5039 s->h263_long_vectors = get_bits1(&s->gb);
5041 if (get_bits1(&s->gb) != 0) {
5042 av_log(s->avctx, AV_LOG_ERROR, "H263 SAC not supported\n");
5043 return -1; /* SAC: off */
5045 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
5046 s->unrestricted_mv = s->h263_long_vectors || s->obmc;
5048 if (get_bits1(&s->gb) != 0) {
5049 av_log(s->avctx, AV_LOG_ERROR, "H263 PB frame not supported\n");
5050 return -1; /* not PB frame */
5052 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
5053 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
5057 s->avctx->sample_aspect_ratio= (AVRational){12,11};
5058 s->avctx->time_base= (AVRational){1001, 30000};
5064 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
5066 /* ufep other than 0 and 1 are reserved */
5069 format = get_bits(&s->gb, 3);
5070 dprintf("ufep=1, format: %d\n", format);
5071 s->custom_pcf= get_bits1(&s->gb);
5072 s->umvplus = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */
5073 if (get_bits1(&s->gb) != 0) {
5074 av_log(s->avctx, AV_LOG_ERROR, "Syntax-based Arithmetic Coding (SAC) not supported\n");
5076 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
5077 s->h263_aic = get_bits1(&s->gb); /* Advanced Intra Coding (AIC) */
5078 s->loop_filter= get_bits1(&s->gb);
5079 s->unrestricted_mv = s->umvplus || s->obmc || s->loop_filter;
5081 s->h263_slice_structured= get_bits1(&s->gb);
5082 if (get_bits1(&s->gb) != 0) {
5083 av_log(s->avctx, AV_LOG_ERROR, "Reference Picture Selection not supported\n");
5085 if (get_bits1(&s->gb) != 0) {
5086 av_log(s->avctx, AV_LOG_ERROR, "Independent Segment Decoding not supported\n");
5088 s->alt_inter_vlc= get_bits1(&s->gb);
5089 s->modified_quant= get_bits1(&s->gb);
5090 if(s->modified_quant)
5091 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
5093 skip_bits(&s->gb, 1); /* Prevent start code emulation */
5095 skip_bits(&s->gb, 3); /* Reserved */
5096 } else if (ufep != 0) {
5097 av_log(s->avctx, AV_LOG_ERROR, "Bad UFEP type (%d)\n", ufep);
5102 s->pict_type = get_bits(&s->gb, 3);
5103 switch(s->pict_type){
5104 case 0: s->pict_type= I_TYPE;break;
5105 case 1: s->pict_type= P_TYPE;break;
5106 case 3: s->pict_type= B_TYPE;break;
5107 case 7: s->pict_type= I_TYPE;break; //ZYGO
5111 skip_bits(&s->gb, 2);
5112 s->no_rounding = get_bits1(&s->gb);
5113 skip_bits(&s->gb, 4);
5115 /* Get the picture dimensions */
5118 /* Custom Picture Format (CPFMT) */
5119 s->aspect_ratio_info = get_bits(&s->gb, 4);
5120 dprintf("aspect: %d\n", s->aspect_ratio_info);
5125 3 - 10:11 (525-type 4:3)
5126 4 - 16:11 (CIF 16:9)
5127 5 - 40:33 (525-type 16:9)
5130 width = (get_bits(&s->gb, 9) + 1) * 4;
5132 height = get_bits(&s->gb, 9) * 4;
5133 dprintf("\nH.263+ Custom picture: %dx%d\n",width,height);
5134 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
5135 /* aspected dimensions */
5136 s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 8);
5137 s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 8);
5139 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
5142 width = h263_format[format][0];
5143 height = h263_format[format][1];
5144 s->avctx->sample_aspect_ratio= (AVRational){12,11};
5146 if ((width == 0) || (height == 0))
5153 s->avctx->time_base.den= 1800000;
5154 s->avctx->time_base.num= 1000 + get_bits1(&s->gb);
5155 s->avctx->time_base.num*= get_bits(&s->gb, 7);
5156 if(s->avctx->time_base.num == 0){
5157 av_log(s, AV_LOG_ERROR, "zero framerate\n");
5160 gcd= ff_gcd(s->avctx->time_base.den, s->avctx->time_base.num);
5161 s->avctx->time_base.den /= gcd;
5162 s->avctx->time_base.num /= gcd;
5163 // av_log(s->avctx, AV_LOG_DEBUG, "%d/%d\n", s->avctx->time_base.den, s->avctx->time_base.num);
5165 s->avctx->time_base= (AVRational){1001, 30000};
5170 skip_bits(&s->gb, 2); //extended Temporal reference
5175 if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
5178 if(s->h263_slice_structured){
5179 if (get_bits1(&s->gb) != 0) {
5180 av_log(s->avctx, AV_LOG_ERROR, "rectangular slices not supported\n");
5182 if (get_bits1(&s->gb) != 0) {
5183 av_log(s->avctx, AV_LOG_ERROR, "unordered slices not supported\n");
5188 s->qscale = get_bits(&s->gb, 5);
5191 s->mb_width = (s->width + 15) / 16;
5192 s->mb_height = (s->height + 15) / 16;
5193 s->mb_num = s->mb_width * s->mb_height;
5196 while (get_bits1(&s->gb) != 0) {
5197 skip_bits(&s->gb, 8);
5200 if(s->h263_slice_structured){
5201 if (get_bits1(&s->gb) != 1) {
5202 av_log(s->avctx, AV_LOG_ERROR, "SEPB1 marker missing\n");
5206 ff_h263_decode_mba(s);
5208 if (get_bits1(&s->gb) != 1) {
5209 av_log(s->avctx, AV_LOG_ERROR, "SEPB2 marker missing\n");
5216 s->y_dc_scale_table=
5217 s->c_dc_scale_table= ff_aic_dc_scale_table;
5219 s->y_dc_scale_table=
5220 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
5223 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
5224 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",
5225 s->qscale, av_get_pict_type_char(s->pict_type),
5226 s->gb.size_in_bits, 1-s->no_rounding,
5227 s->obmc ? " AP" : "",
5228 s->umvplus ? " UMV" : "",
5229 s->h263_long_vectors ? " LONG" : "",
5230 s->h263_plus ? " +" : "",
5231 s->h263_aic ? " AIC" : "",
5232 s->alt_inter_vlc ? " AIV" : "",
5233 s->modified_quant ? " MQ" : "",
5234 s->loop_filter ? " LOOP" : "",
5235 s->h263_slice_structured ? " SS" : "",
5236 s->avctx->time_base.den, s->avctx->time_base.num
5240 if (s->pict_type == I_TYPE && s->avctx->codec_tag == ff_get_fourcc("ZYGO")){
5242 for(i=0; i<85; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
5243 av_log(s->avctx, AV_LOG_DEBUG, "\n");
5244 for(i=0; i<13; i++){
5246 int v= get_bits(&s->gb, 8);
5247 v |= get_sbits(&s->gb, 8)<<8;
5248 av_log(s->avctx, AV_LOG_DEBUG, " %5d", v);
5250 av_log(s->avctx, AV_LOG_DEBUG, "\n");
5252 for(i=0; i<50; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
5259 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb)
5262 int a= 2<<s->sprite_warping_accuracy;
5263 int rho= 3-s->sprite_warping_accuracy;
5265 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
5266 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
5267 int sprite_ref[4][2];
5268 int virtual_ref[2][2];
5270 int alpha=0, beta=0;
5275 for(i=0; i<s->num_sprite_warping_points; i++){
5279 length= get_vlc(gb, &sprite_trajectory);
5281 x= get_xbits(gb, length);
5283 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(gb); /* marker bit */
5285 length= get_vlc(gb, &sprite_trajectory);
5287 y=get_xbits(gb, length);
5289 skip_bits1(gb); /* marker bit */
5290 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
5295 while((1<<alpha)<w) alpha++;
5296 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
5300 // Note, the 4th point isn't used for GMC
5301 if(s->divx_version==500 && s->divx_build==413){
5302 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
5303 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
5304 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
5305 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
5306 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
5307 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
5309 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
5310 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
5311 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
5312 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
5313 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
5314 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
5316 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
5317 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
5319 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
5320 // perhaps it should be reordered to be more readable ...
5321 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
5322 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
5323 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
5324 + 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);
5325 virtual_ref[0][1]= 16*vop_ref[0][1]
5326 + 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);
5327 virtual_ref[1][0]= 16*vop_ref[0][0]
5328 + 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);
5329 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
5330 + 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);
5332 switch(s->num_sprite_warping_points)
5335 s->sprite_offset[0][0]= 0;
5336 s->sprite_offset[0][1]= 0;
5337 s->sprite_offset[1][0]= 0;
5338 s->sprite_offset[1][1]= 0;
5339 s->sprite_delta[0][0]= a;
5340 s->sprite_delta[0][1]= 0;
5341 s->sprite_delta[1][0]= 0;
5342 s->sprite_delta[1][1]= a;
5343 s->sprite_shift[0]= 0;
5344 s->sprite_shift[1]= 0;
5347 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
5348 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
5349 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
5350 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
5351 s->sprite_delta[0][0]= a;
5352 s->sprite_delta[0][1]= 0;
5353 s->sprite_delta[1][0]= 0;
5354 s->sprite_delta[1][1]= a;
5355 s->sprite_shift[0]= 0;
5356 s->sprite_shift[1]= 0;
5359 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
5360 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
5361 + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])
5362 + (1<<(alpha+rho-1));
5363 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
5364 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
5365 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])
5366 + (1<<(alpha+rho-1));
5367 s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
5368 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
5369 +2*w2*r*sprite_ref[0][0]
5371 + (1<<(alpha+rho+1)));
5372 s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
5373 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
5374 +2*w2*r*sprite_ref[0][1]
5376 + (1<<(alpha+rho+1)));
5377 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
5378 s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]);
5379 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
5380 s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
5382 s->sprite_shift[0]= alpha+rho;
5383 s->sprite_shift[1]= alpha+rho+2;
5386 min_ab= FFMIN(alpha, beta);
5389 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
5390 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])
5391 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])
5392 + (1<<(alpha+beta+rho-min_ab-1));
5393 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))
5394 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])
5395 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])
5396 + (1<<(alpha+beta+rho-min_ab-1));
5397 s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)
5398 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)
5399 + 2*w2*h3*r*sprite_ref[0][0]
5401 + (1<<(alpha+beta+rho-min_ab+1));
5402 s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)
5403 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)
5404 + 2*w2*h3*r*sprite_ref[0][1]
5406 + (1<<(alpha+beta+rho-min_ab+1));
5407 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;
5408 s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;
5409 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;
5410 s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;
5412 s->sprite_shift[0]= alpha + beta + rho - min_ab;
5413 s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;
5416 /* try to simplify the situation */
5417 if( s->sprite_delta[0][0] == a<<s->sprite_shift[0]
5418 && s->sprite_delta[0][1] == 0
5419 && s->sprite_delta[1][0] == 0
5420 && s->sprite_delta[1][1] == a<<s->sprite_shift[0])
5422 s->sprite_offset[0][0]>>=s->sprite_shift[0];
5423 s->sprite_offset[0][1]>>=s->sprite_shift[0];
5424 s->sprite_offset[1][0]>>=s->sprite_shift[1];
5425 s->sprite_offset[1][1]>>=s->sprite_shift[1];
5426 s->sprite_delta[0][0]= a;
5427 s->sprite_delta[0][1]= 0;
5428 s->sprite_delta[1][0]= 0;
5429 s->sprite_delta[1][1]= a;
5430 s->sprite_shift[0]= 0;
5431 s->sprite_shift[1]= 0;
5432 s->real_sprite_warping_points=1;
5435 int shift_y= 16 - s->sprite_shift[0];
5436 int shift_c= 16 - s->sprite_shift[1];
5437 //printf("shifts %d %d\n", shift_y, shift_c);
5439 s->sprite_offset[0][i]<<= shift_y;
5440 s->sprite_offset[1][i]<<= shift_c;
5441 s->sprite_delta[0][i]<<= shift_y;
5442 s->sprite_delta[1][i]<<= shift_y;
5443 s->sprite_shift[i]= 16;
5445 s->real_sprite_warping_points= s->num_sprite_warping_points;
5448 printf("vop:%d:%d %d:%d %d:%d, sprite:%d:%d %d:%d %d:%d, virtual: %d:%d %d:%d\n",
5449 vop_ref[0][0], vop_ref[0][1],
5450 vop_ref[1][0], vop_ref[1][1],
5451 vop_ref[2][0], vop_ref[2][1],
5452 sprite_ref[0][0], sprite_ref[0][1],
5453 sprite_ref[1][0], sprite_ref[1][1],
5454 sprite_ref[2][0], sprite_ref[2][1],
5455 virtual_ref[0][0], virtual_ref[0][1],
5456 virtual_ref[1][0], virtual_ref[1][1]
5459 printf("offset: %d:%d , delta: %d %d %d %d, shift %d\n",
5460 s->sprite_offset[0][0], s->sprite_offset[0][1],
5461 s->sprite_delta[0][0], s->sprite_delta[0][1],
5462 s->sprite_delta[1][0], s->sprite_delta[1][1],
5468 static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
5469 int hours, minutes, seconds;
5471 hours= get_bits(gb, 5);
5472 minutes= get_bits(gb, 6);
5474 seconds= get_bits(gb, 6);
5476 s->time_base= seconds + 60*(minutes + 60*hours);
5484 static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
5485 int width, height, vo_ver_id;
5488 skip_bits(gb, 1); /* random access */
5489 s->vo_type= get_bits(gb, 8);
5490 if (get_bits1(gb) != 0) { /* is_ol_id */
5491 vo_ver_id = get_bits(gb, 4); /* vo_ver_id */
5492 skip_bits(gb, 3); /* vo_priority */
5496 //printf("vo type:%d\n",s->vo_type);
5497 s->aspect_ratio_info= get_bits(gb, 4);
5498 if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
5499 s->avctx->sample_aspect_ratio.num= get_bits(gb, 8); // par_width
5500 s->avctx->sample_aspect_ratio.den= get_bits(gb, 8); // par_height
5502 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
5505 if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
5506 int chroma_format= get_bits(gb, 2);
5507 if(chroma_format!=1){
5508 av_log(s->avctx, AV_LOG_ERROR, "illegal chroma format\n");
5510 s->low_delay= get_bits1(gb);
5511 if(get_bits1(gb)){ /* vbv parameters */
5512 get_bits(gb, 15); /* first_half_bitrate */
5513 skip_bits1(gb); /* marker */
5514 get_bits(gb, 15); /* latter_half_bitrate */
5515 skip_bits1(gb); /* marker */
5516 get_bits(gb, 15); /* first_half_vbv_buffer_size */
5517 skip_bits1(gb); /* marker */
5518 get_bits(gb, 3); /* latter_half_vbv_buffer_size */
5519 get_bits(gb, 11); /* first_half_vbv_occupancy */
5520 skip_bits1(gb); /* marker */
5521 get_bits(gb, 15); /* latter_half_vbv_occupancy */
5522 skip_bits1(gb); /* marker */
5525 // set low delay flag only once the smartest? low delay detection won't be overriden
5526 if(s->picture_number==0)
5530 s->shape = get_bits(gb, 2); /* vol shape */
5531 if(s->shape != RECT_SHAPE) av_log(s->avctx, AV_LOG_ERROR, "only rectangular vol supported\n");
5532 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
5533 av_log(s->avctx, AV_LOG_ERROR, "Gray shape not supported\n");
5534 skip_bits(gb, 4); //video_object_layer_shape_extension
5537 check_marker(gb, "before time_increment_resolution");
5539 s->avctx->time_base.den = get_bits(gb, 16);
5541 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
5542 if (s->time_increment_bits < 1)
5543 s->time_increment_bits = 1;
5545 check_marker(gb, "before fixed_vop_rate");
5547 if (get_bits1(gb) != 0) { /* fixed_vop_rate */
5548 s->avctx->time_base.num = get_bits(gb, s->time_increment_bits);
5550 s->avctx->time_base.num = 1;
5554 if (s->shape != BIN_ONLY_SHAPE) {
5555 if (s->shape == RECT_SHAPE) {
5556 skip_bits1(gb); /* marker */
5557 width = get_bits(gb, 13);
5558 skip_bits1(gb); /* marker */
5559 height = get_bits(gb, 13);
5560 skip_bits1(gb); /* marker */
5561 if(width && height && !(s->width && s->avctx->codec_tag == ff_get_fourcc("MP4S"))){ /* they should be non zero but who knows ... */
5564 // printf("width/height: %d %d\n", width, height);
5568 s->progressive_sequence=
5569 s->progressive_frame= get_bits1(gb)^1;
5570 if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO))
5571 av_log(s->avctx, AV_LOG_INFO, "MPEG4 OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */
5572 if (vo_ver_id == 1) {
5573 s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */
5575 s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */
5577 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "Static Sprites not supported\n");
5578 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
5579 if(s->vol_sprite_usage==STATIC_SPRITE){
5580 s->sprite_width = get_bits(gb, 13);
5581 skip_bits1(gb); /* marker */
5582 s->sprite_height= get_bits(gb, 13);
5583 skip_bits1(gb); /* marker */
5584 s->sprite_left = get_bits(gb, 13);
5585 skip_bits1(gb); /* marker */
5586 s->sprite_top = get_bits(gb, 13);
5587 skip_bits1(gb); /* marker */
5589 s->num_sprite_warping_points= get_bits(gb, 6);
5590 s->sprite_warping_accuracy = get_bits(gb, 2);
5591 s->sprite_brightness_change= get_bits1(gb);
5592 if(s->vol_sprite_usage==STATIC_SPRITE)
5593 s->low_latency_sprite= get_bits1(gb);
5595 // FIXME sadct disable bit if verid!=1 && shape not rect
5597 if (get_bits1(gb) == 1) { /* not_8_bit */
5598 s->quant_precision = get_bits(gb, 4); /* quant_precision */
5599 if(get_bits(gb, 4)!=8) av_log(s->avctx, AV_LOG_ERROR, "N-bit not supported\n"); /* bits_per_pixel */
5600 if(s->quant_precision!=5) av_log(s->avctx, AV_LOG_ERROR, "quant precision %d\n", s->quant_precision);
5602 s->quant_precision = 5;
5605 // FIXME a bunch of grayscale shape things
5607 if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */
5610 /* load default matrixes */
5611 for(i=0; i<64; i++){
5612 int j= s->dsp.idct_permutation[i];
5613 v= ff_mpeg4_default_intra_matrix[i];
5614 s->intra_matrix[j]= v;
5615 s->chroma_intra_matrix[j]= v;
5617 v= ff_mpeg4_default_non_intra_matrix[i];
5618 s->inter_matrix[j]= v;
5619 s->chroma_inter_matrix[j]= v;
5622 /* load custom intra matrix */
5625 for(i=0; i<64; i++){
5631 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5632 s->intra_matrix[j]= v;
5633 s->chroma_intra_matrix[j]= v;
5636 /* replicate last value */
5638 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5639 s->intra_matrix[j]= last;
5640 s->chroma_intra_matrix[j]= last;
5644 /* load custom non intra matrix */
5647 for(i=0; i<64; i++){
5653 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5654 s->inter_matrix[j]= v;
5655 s->chroma_inter_matrix[j]= v;
5658 /* replicate last value */
5660 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5661 s->inter_matrix[j]= last;
5662 s->chroma_inter_matrix[j]= last;
5666 // FIXME a bunch of grayscale shape things
5670 s->quarter_sample= get_bits1(gb);
5671 else s->quarter_sample=0;
5673 if(!get_bits1(gb)) av_log(s->avctx, AV_LOG_ERROR, "Complexity estimation not supported\n");
5675 s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */
5677 s->data_partitioning= get_bits1(gb);
5678 if(s->data_partitioning){
5679 s->rvlc= get_bits1(gb);
5682 if(vo_ver_id != 1) {
5683 s->new_pred= get_bits1(gb);
5685 av_log(s->avctx, AV_LOG_ERROR, "new pred not supported\n");
5686 skip_bits(gb, 2); /* requested upstream message type */
5687 skip_bits1(gb); /* newpred segment type */
5689 s->reduced_res_vop= get_bits1(gb);
5690 if(s->reduced_res_vop) av_log(s->avctx, AV_LOG_ERROR, "reduced resolution VOP not supported\n");
5694 s->reduced_res_vop= 0;
5697 s->scalability= get_bits1(gb);
5699 if (s->scalability) {
5700 GetBitContext bak= *gb;
5702 int ref_layer_sampling_dir;
5703 int h_sampling_factor_n;
5704 int h_sampling_factor_m;
5705 int v_sampling_factor_n;
5706 int v_sampling_factor_m;
5708 s->hierachy_type= get_bits1(gb);
5709 ref_layer_id= get_bits(gb, 4);
5710 ref_layer_sampling_dir= get_bits1(gb);
5711 h_sampling_factor_n= get_bits(gb, 5);
5712 h_sampling_factor_m= get_bits(gb, 5);
5713 v_sampling_factor_n= get_bits(gb, 5);
5714 v_sampling_factor_m= get_bits(gb, 5);
5715 s->enhancement_type= get_bits1(gb);
5717 if( h_sampling_factor_n==0 || h_sampling_factor_m==0
5718 || v_sampling_factor_n==0 || v_sampling_factor_m==0){
5720 // fprintf(stderr, "illegal scalability header (VERY broken encoder), trying to workaround\n");
5725 av_log(s->avctx, AV_LOG_ERROR, "scalability not supported\n");
5727 // bin shape stuff FIXME
5734 * decodes the user data stuff in the header.
5735 * allso inits divx/xvid/lavc_version/build
5737 static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
5741 int ver, build, ver2, ver3;
5744 buf[0]= show_bits(gb, 8);
5745 for(i=1; i<256; i++){
5746 buf[i]= show_bits(gb, 16)&0xFF;
5747 if(buf[i]==0) break;
5752 /* divx detection */
5753 e=sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last);
5755 e=sscanf(buf, "DivX%db%d%c", &ver, &build, &last);
5757 s->divx_version= ver;
5758 s->divx_build= build;
5759 s->divx_packed= e==3 && last=='p';
5762 /* ffmpeg detection */
5763 e=sscanf(buf, "FFmpeg%d.%d.%db%d", &ver, &ver2, &ver3, &build);
5765 e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
5767 if(strcmp(buf, "ffmpeg")==0){
5768 s->ffmpeg_version= 0x000406;
5769 s->lavc_build= 4600;
5773 s->ffmpeg_version= ver*256*256 + ver2*256 + ver3;
5774 s->lavc_build= build;
5777 /* xvid detection */
5778 e=sscanf(buf, "XviD%d", &build);
5780 s->xvid_build= build;
5783 //printf("User Data: %s\n", buf);
5787 static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
5788 int time_incr, time_increment;
5790 s->pict_type = get_bits(gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */
5791 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0 && !(s->flags & CODEC_FLAG_LOW_DELAY)){
5792 av_log(s->avctx, AV_LOG_ERROR, "low_delay flag incorrectly, clearing it\n");
5796 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
5797 if(s->partitioned_frame)
5798 s->decode_mb= mpeg4_decode_partitioned_mb;
5800 s->decode_mb= ff_mpeg4_decode_mb;
5802 if(s->avctx->time_base.den==0){
5803 s->avctx->time_base.den=1;
5804 // fprintf(stderr, "time_increment_resolution is illegal\n");
5807 while (get_bits1(gb) != 0)
5810 check_marker(gb, "before time_increment");
5812 if(s->time_increment_bits==0){
5813 av_log(s->avctx, AV_LOG_ERROR, "hmm, seems the headers are not complete, trying to guess time_increment_bits\n");
5815 for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){
5816 if(show_bits(gb, s->time_increment_bits+1)&1) break;
5819 av_log(s->avctx, AV_LOG_ERROR, "my guess is %d bits ;)\n",s->time_increment_bits);
5822 if(IS_3IV1) time_increment= get_bits1(gb); //FIXME investigate further
5823 else time_increment= get_bits(gb, s->time_increment_bits);
5825 // printf("%d %X\n", s->time_increment_bits, time_increment);
5826 //av_log(s->avctx, AV_LOG_DEBUG, " type:%d modulo_time_base:%d increment:%d t_frame %d\n", s->pict_type, time_incr, time_increment, s->t_frame);
5827 if(s->pict_type!=B_TYPE){
5828 s->last_time_base= s->time_base;
5829 s->time_base+= time_incr;
5830 s->time= s->time_base*s->avctx->time_base.den + time_increment;
5831 if(s->workaround_bugs&FF_BUG_UMP4){
5832 if(s->time < s->last_non_b_time){
5833 // fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaround\n");
5835 s->time+= s->avctx->time_base.den;
5838 s->pp_time= s->time - s->last_non_b_time;
5839 s->last_non_b_time= s->time;
5841 s->time= (s->last_time_base + time_incr)*s->avctx->time_base.den + time_increment;
5842 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
5843 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
5844 // printf("messed up order, maybe after seeking? skipping current b frame\n");
5845 return FRAME_SKIPPED;
5848 if(s->t_frame==0) s->t_frame= s->pb_time;
5849 if(s->t_frame==0) s->t_frame=1; // 1/0 protection
5850 s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame)
5851 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
5852 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame)
5853 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
5855 //av_log(s->avctx, AV_LOG_DEBUG, "last nonb %Ld last_base %d time %Ld pp %d pb %d t %d ppf %d pbf %d\n", s->last_non_b_time, s->last_time_base, s->time, s->pp_time, s->pb_time, s->t_frame, s->pp_field_time, s->pb_field_time);
5857 s->current_picture_ptr->pts= (s->time + s->avctx->time_base.num/2) / s->avctx->time_base.num;
5858 if(s->avctx->debug&FF_DEBUG_PTS)
5859 av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %f\n", s->current_picture_ptr->pts);
5861 check_marker(gb, "before vop_coded");
5864 if (get_bits1(gb) != 1){
5865 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
5866 av_log(s->avctx, AV_LOG_ERROR, "vop not coded\n");
5867 return FRAME_SKIPPED;
5869 //printf("time %d %d %d || %Ld %Ld %Ld\n", s->time_increment_bits, s->avctx->time_base.den, s->time_base,
5870 //s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time);
5871 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE
5872 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
5873 /* rounding type for motion estimation */
5874 s->no_rounding = get_bits1(gb);
5878 //FIXME reduced res stuff
5880 if (s->shape != RECT_SHAPE) {
5881 if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) {
5882 int width, height, hor_spat_ref, ver_spat_ref;
5884 width = get_bits(gb, 13);
5885 skip_bits1(gb); /* marker */
5886 height = get_bits(gb, 13);
5887 skip_bits1(gb); /* marker */
5888 hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */
5889 skip_bits1(gb); /* marker */
5890 ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */
5892 skip_bits1(gb); /* change_CR_disable */
5894 if (get_bits1(gb) != 0) {
5895 skip_bits(gb, 8); /* constant_alpha_value */
5898 //FIXME complexity estimation stuff
5900 if (s->shape != BIN_ONLY_SHAPE) {
5901 s->intra_dc_threshold= mpeg4_dc_threshold[ get_bits(gb, 3) ];
5902 if(!s->progressive_sequence){
5903 s->top_field_first= get_bits1(gb);
5904 s->alternate_scan= get_bits1(gb);
5906 s->alternate_scan= 0;
5909 if(s->alternate_scan){
5910 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
5911 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
5912 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
5913 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
5915 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
5916 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
5917 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
5918 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
5921 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
5922 mpeg4_decode_sprite_trajectory(s, gb);
5923 if(s->sprite_brightness_change) av_log(s->avctx, AV_LOG_ERROR, "sprite_brightness_change not supported\n");
5924 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "static sprite not supported\n");
5927 if (s->shape != BIN_ONLY_SHAPE) {
5928 s->chroma_qscale= s->qscale = get_bits(gb, s->quant_precision);
5930 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (qscale=0)\n");
5931 return -1; // makes no sense to continue, as there is nothing left from the image then
5934 if (s->pict_type != I_TYPE) {
5935 s->f_code = get_bits(gb, 3); /* fcode_for */
5937 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (f_code=0)\n");
5938 return -1; // makes no sense to continue, as the MV decoding will break very quickly
5943 if (s->pict_type == B_TYPE) {
5944 s->b_code = get_bits(gb, 3);
5948 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
5949 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\n",
5950 s->qscale, s->f_code, s->b_code,
5951 s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")),
5952 gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first,
5953 s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,
5954 s->sprite_warping_accuracy, 1-s->no_rounding, s->vo_type, s->vol_control_parameters ? " VOLC" : " ", s->intra_dc_threshold);
5957 if(!s->scalability){
5958 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {
5959 skip_bits1(gb); // vop shape coding type
5962 if(s->enhancement_type){
5963 int load_backward_shape= get_bits1(gb);
5964 if(load_backward_shape){
5965 av_log(s->avctx, AV_LOG_ERROR, "load backward shape isn't supported\n");
5968 skip_bits(gb, 2); //ref_select_code
5971 /* detect buggy encoders which don't set the low_delay flag (divx4/xvid/opendivx)*/
5972 // note we cannot detect divx5 without b-frames easily (although it's buggy too)
5973 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
5974 av_log(s->avctx, AV_LOG_ERROR, "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
5978 s->picture_number++; // better than pic number==0 always ;)
5980 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
5981 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
5983 if(s->workaround_bugs&FF_BUG_EDGE){
5984 s->h_edge_pos= s->width;
5985 s->v_edge_pos= s->height;
5991 * decode mpeg4 headers
5992 * @return <0 if no VOP found (or a damaged one)
5993 * FRAME_SKIPPED if a not coded VOP is found
5994 * 0 if a VOP is found
5996 int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb)
6000 /* search next start code */
6003 if(s->avctx->codec_tag == ff_get_fourcc("WV1F") && show_bits(gb, 24) == 0x575630){
6005 if(get_bits(gb, 8) == 0xF0)
6006 return decode_vop_header(s, gb);
6011 v = get_bits(gb, 8);
6012 startcode = ((startcode << 8) | v) & 0xffffffff;
6014 if(get_bits_count(gb) >= gb->size_in_bits){
6015 if(gb->size_in_bits==8 && (s->divx_version || s->xvid_build)){
6016 av_log(s->avctx, AV_LOG_ERROR, "frame skip %d\n", gb->size_in_bits);
6017 return FRAME_SKIPPED; //divx bug
6019 return -1; //end of stream
6022 if((startcode&0xFFFFFF00) != 0x100)
6023 continue; //no startcode
6025 if(s->avctx->debug&FF_DEBUG_STARTCODE){
6026 av_log(s->avctx, AV_LOG_DEBUG, "startcode: %3X ", startcode);
6027 if (startcode<=0x11F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Start");
6028 else if(startcode<=0x12F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Layer Start");
6029 else if(startcode<=0x13F) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
6030 else if(startcode<=0x15F) av_log(s->avctx, AV_LOG_DEBUG, "FGS bp start");
6031 else if(startcode<=0x1AF) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
6032 else if(startcode==0x1B0) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq Start");
6033 else if(startcode==0x1B1) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq End");
6034 else if(startcode==0x1B2) av_log(s->avctx, AV_LOG_DEBUG, "User Data");
6035 else if(startcode==0x1B3) av_log(s->avctx, AV_LOG_DEBUG, "Group of VOP start");
6036 else if(startcode==0x1B4) av_log(s->avctx, AV_LOG_DEBUG, "Video Session Error");
6037 else if(startcode==0x1B5) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Start");
6038 else if(startcode==0x1B6) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Plane start");
6039 else if(startcode==0x1B7) av_log(s->avctx, AV_LOG_DEBUG, "slice start");
6040 else if(startcode==0x1B8) av_log(s->avctx, AV_LOG_DEBUG, "extension start");
6041 else if(startcode==0x1B9) av_log(s->avctx, AV_LOG_DEBUG, "fgs start");
6042 else if(startcode==0x1BA) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object start");
6043 else if(startcode==0x1BB) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object Plane start");
6044 else if(startcode==0x1BC) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object start");
6045 else if(startcode==0x1BD) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object Plane start");
6046 else if(startcode==0x1BE) av_log(s->avctx, AV_LOG_DEBUG, "Still Texture Object start");
6047 else if(startcode==0x1BF) av_log(s->avctx, AV_LOG_DEBUG, "Texture Spatial Layer start");
6048 else if(startcode==0x1C0) av_log(s->avctx, AV_LOG_DEBUG, "Texture SNR Layer start");
6049 else if(startcode==0x1C1) av_log(s->avctx, AV_LOG_DEBUG, "Texture Tile start");
6050 else if(startcode==0x1C2) av_log(s->avctx, AV_LOG_DEBUG, "Texture Shape Layer start");
6051 else if(startcode==0x1C3) av_log(s->avctx, AV_LOG_DEBUG, "stuffing start");
6052 else if(startcode<=0x1C5) av_log(s->avctx, AV_LOG_DEBUG, "reserved");
6053 else if(startcode<=0x1FF) av_log(s->avctx, AV_LOG_DEBUG, "System start");
6054 av_log(s->avctx, AV_LOG_DEBUG, " at %d\n", get_bits_count(gb));
6057 if(startcode >= 0x120 && startcode <= 0x12F){
6058 if(decode_vol_header(s, gb) < 0)
6061 else if(startcode == USER_DATA_STARTCODE){
6062 decode_user_data(s, gb);
6064 else if(startcode == GOP_STARTCODE){
6065 mpeg4_decode_gop_header(s, gb);
6067 else if(startcode == VOP_STARTCODE){
6068 return decode_vop_header(s, gb);
6076 /* don't understand why they choose a different header ! */
6077 int intel_h263_decode_picture_header(MpegEncContext *s)
6081 /* picture header */
6082 if (get_bits_long(&s->gb, 22) != 0x20) {
6083 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
6086 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
6088 if (get_bits1(&s->gb) != 1) {
6089 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
6090 return -1; /* marker */
6092 if (get_bits1(&s->gb) != 0) {
6093 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
6094 return -1; /* h263 id */
6096 skip_bits1(&s->gb); /* split screen off */
6097 skip_bits1(&s->gb); /* camera off */
6098 skip_bits1(&s->gb); /* freeze picture release off */
6100 format = get_bits(&s->gb, 3);
6102 av_log(s->avctx, AV_LOG_ERROR, "Intel H263 free format not supported\n");
6107 s->pict_type = I_TYPE + get_bits1(&s->gb);
6109 s->unrestricted_mv = get_bits1(&s->gb);
6110 s->h263_long_vectors = s->unrestricted_mv;
6112 if (get_bits1(&s->gb) != 0) {
6113 av_log(s->avctx, AV_LOG_ERROR, "SAC not supported\n");
6114 return -1; /* SAC: off */
6116 if (get_bits1(&s->gb) != 0) {
6118 av_log(s->avctx, AV_LOG_ERROR, "Advanced Prediction Mode not supported\n");
6119 // return -1; /* advanced prediction mode: off */
6121 if (get_bits1(&s->gb) != 0) {
6122 av_log(s->avctx, AV_LOG_ERROR, "PB frame mode no supported\n");
6123 return -1; /* PB frame mode */
6126 /* skip unknown header garbage */
6127 skip_bits(&s->gb, 41);
6129 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
6130 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
6133 while (get_bits1(&s->gb) != 0) {
6134 skip_bits(&s->gb, 8);
6138 s->y_dc_scale_table=
6139 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
6144 int flv_h263_decode_picture_header(MpegEncContext *s)
6146 int format, width, height;
6148 /* picture header */
6149 if (get_bits_long(&s->gb, 17) != 1) {
6150 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
6153 format = get_bits(&s->gb, 5);
6154 if (format != 0 && format != 1) {
6155 av_log(s->avctx, AV_LOG_ERROR, "Bad picture format\n");
6158 s->h263_flv = format+1;
6159 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
6160 format = get_bits(&s->gb, 3);
6163 width = get_bits(&s->gb, 8);
6164 height = get_bits(&s->gb, 8);
6167 width = get_bits(&s->gb, 16);
6168 height = get_bits(&s->gb, 16);
6194 if(avcodec_check_dimensions(s->avctx, width, height))
6199 s->pict_type = I_TYPE + get_bits(&s->gb, 2);
6200 s->dropable= s->pict_type > P_TYPE;
6202 s->pict_type = P_TYPE;
6204 skip_bits1(&s->gb); /* deblocking flag */
6205 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
6209 s->unrestricted_mv = 1;
6210 s->h263_long_vectors = 0;
6213 while (get_bits1(&s->gb) != 0) {
6214 skip_bits(&s->gb, 8);
6218 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
6219 av_log(s->avctx, AV_LOG_DEBUG, "%c esc_type:%d, qp:%d num:%d\n",
6220 s->dropable ? 'D' : av_get_pict_type_char(s->pict_type), s->h263_flv-1, s->qscale, s->picture_number);
6223 s->y_dc_scale_table=
6224 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;