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 h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr);
73 #ifdef CONFIG_ENCODERS
74 static void mpeg4_encode_visual_object_header(MpegEncContext * s);
75 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number);
76 #endif //CONFIG_ENCODERS
77 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb);
78 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding);
80 #ifdef CONFIG_ENCODERS
81 static uint8_t uni_DCtab_lum_len[512];
82 static uint8_t uni_DCtab_chrom_len[512];
83 static uint16_t uni_DCtab_lum_bits[512];
84 static uint16_t uni_DCtab_chrom_bits[512];
86 static uint8_t (*mv_penalty)[MAX_MV*2+1]= NULL;
87 static uint8_t fcode_tab[MAX_MV*2+1];
88 static uint8_t umv_fcode_tab[MAX_MV*2+1];
90 static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2];
91 static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2];
92 static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2];
93 static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2];
94 static uint8_t uni_h263_intra_aic_rl_len [64*64*2*2];
95 static uint8_t uni_h263_inter_rl_len [64*64*2*2];
96 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
97 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
98 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
111 #if 0 //3IV1 is quite rare and tis slows things down a tiny bit
112 #define IS_3IV1 s->avctx->codec_tag == ff_get_fourcc("3IV1")
117 int h263_get_picture_format(int width, int height)
121 if (width == 128 && height == 96)
123 else if (width == 176 && height == 144)
125 else if (width == 352 && height == 288)
127 else if (width == 704 && height == 576)
129 else if (width == 1408 && height == 1152)
136 #ifdef CONFIG_ENCODERS
138 static void aspect_to_info(MpegEncContext * s, AVRational aspect){
141 if(aspect.num==0) aspect= (AVRational){1,1};
144 if(av_cmp_q(pixel_aspect[i], aspect) == 0){
145 s->aspect_ratio_info=i;
150 s->aspect_ratio_info= FF_ASPECT_EXTENDED;
153 void ff_flv_encode_picture_header(MpegEncContext * s, int picture_number)
157 align_put_bits(&s->pb);
159 put_bits(&s->pb, 17, 1);
160 put_bits(&s->pb, 5, (s->h263_flv-1)); /* 0: h263 escape codes 1: 11-bit escape codes */
161 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->frame_rate_base) /
162 s->avctx->frame_rate) & 0xff); /* TemporalReference */
163 if (s->width == 352 && s->height == 288)
165 else if (s->width == 176 && s->height == 144)
167 else if (s->width == 128 && s->height == 96)
169 else if (s->width == 320 && s->height == 240)
171 else if (s->width == 160 && s->height == 120)
173 else if (s->width <= 255 && s->height <= 255)
174 format = 0; /* use 1 byte width & height */
176 format = 1; /* use 2 bytes width & height */
177 put_bits(&s->pb, 3, format); /* PictureSize */
179 put_bits(&s->pb, 8, s->width);
180 put_bits(&s->pb, 8, s->height);
181 } else if (format == 1) {
182 put_bits(&s->pb, 16, s->width);
183 put_bits(&s->pb, 16, s->height);
185 put_bits(&s->pb, 2, s->pict_type == P_TYPE); /* PictureType */
186 put_bits(&s->pb, 1, 1); /* DeblockingFlag: on */
187 put_bits(&s->pb, 5, s->qscale); /* Quantizer */
188 put_bits(&s->pb, 1, 0); /* ExtraInformation */
192 s->c_dc_scale_table= ff_aic_dc_scale_table;
195 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
199 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
201 int format, coded_frame_rate, coded_frame_rate_base, i, temp_ref;
202 int best_clock_code=1;
204 int best_error= INT_MAX;
209 div= (s->avctx->frame_rate_base*1800000LL + 500LL*s->avctx->frame_rate) / ((1000LL+i)*s->avctx->frame_rate);
210 div= clip(1, div, 127);
211 error= ABS(s->avctx->frame_rate_base*1800000LL - (1000LL+i)*s->avctx->frame_rate*div);
212 if(error < best_error){
219 s->custom_pcf= best_clock_code!=1 || best_divisor!=60;
220 coded_frame_rate= 1800000;
221 coded_frame_rate_base= (1000+best_clock_code)*best_divisor;
223 align_put_bits(&s->pb);
225 /* Update the pointer to last GOB */
226 s->ptr_lastgob = pbBufPtr(&s->pb);
227 put_bits(&s->pb, 22, 0x20); /* PSC */
228 temp_ref= s->picture_number * (int64_t)coded_frame_rate * s->avctx->frame_rate_base /
229 (coded_frame_rate_base * (int64_t)s->avctx->frame_rate);
230 put_bits(&s->pb, 8, temp_ref & 0xff); /* TemporalReference */
232 put_bits(&s->pb, 1, 1); /* marker */
233 put_bits(&s->pb, 1, 0); /* h263 id */
234 put_bits(&s->pb, 1, 0); /* split screen off */
235 put_bits(&s->pb, 1, 0); /* camera off */
236 put_bits(&s->pb, 1, 0); /* freeze picture release off */
238 format = h263_get_picture_format(s->width, s->height);
241 put_bits(&s->pb, 3, format);
242 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
243 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
244 of H.263v1 UMV implies to check the predicted MV after
245 calculation of the current MB to see if we're on the limits */
246 put_bits(&s->pb, 1, 0); /* unrestricted motion vector: off */
247 put_bits(&s->pb, 1, 0); /* SAC: off */
248 put_bits(&s->pb, 1, s->obmc); /* advanced prediction mode */
249 put_bits(&s->pb, 1, 0); /* not PB frame */
250 put_bits(&s->pb, 5, s->qscale);
251 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
255 /* H.263 Plus PTYPE */
257 put_bits(&s->pb, 3, 7);
258 put_bits(&s->pb,3,ufep); /* Update Full Extended PTYPE */
260 put_bits(&s->pb,3,6); /* Custom Source Format */
262 put_bits(&s->pb, 3, format);
264 put_bits(&s->pb,1, s->custom_pcf);
265 put_bits(&s->pb,1, s->umvplus); /* Unrestricted Motion Vector */
266 put_bits(&s->pb,1,0); /* SAC: off */
267 put_bits(&s->pb,1,s->obmc); /* Advanced Prediction Mode */
268 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
269 put_bits(&s->pb,1,s->loop_filter); /* Deblocking Filter */
270 put_bits(&s->pb,1,s->h263_slice_structured); /* Slice Structured */
271 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
272 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
273 put_bits(&s->pb,1,s->alt_inter_vlc); /* Alternative Inter VLC */
274 put_bits(&s->pb,1,s->modified_quant); /* Modified Quantization: */
275 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
276 put_bits(&s->pb,3,0); /* Reserved */
278 put_bits(&s->pb, 3, s->pict_type == P_TYPE);
280 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
281 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
282 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
283 put_bits(&s->pb,2,0); /* Reserved */
284 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
286 /* This should be here if PLUSPTYPE */
287 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
290 /* Custom Picture Format (CPFMT) */
291 aspect_to_info(s, s->avctx->sample_aspect_ratio);
293 put_bits(&s->pb,4,s->aspect_ratio_info);
294 put_bits(&s->pb,9,(s->width >> 2) - 1);
295 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
296 put_bits(&s->pb,9,(s->height >> 2));
297 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
298 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
299 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
304 put_bits(&s->pb, 1, best_clock_code);
305 put_bits(&s->pb, 7, best_divisor);
307 put_bits(&s->pb, 2, (temp_ref>>8)&3);
310 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
312 // put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
313 //FIXME check actual requested range
314 put_bits(&s->pb,2,1); /* unlimited */
315 if(s->h263_slice_structured)
316 put_bits(&s->pb,2,0); /* no weird submodes */
318 put_bits(&s->pb, 5, s->qscale);
321 put_bits(&s->pb, 1, 0); /* no PEI */
323 if(s->h263_slice_structured){
324 put_bits(&s->pb, 1, 1);
326 assert(s->mb_x == 0 && s->mb_y == 0);
327 ff_h263_encode_mba(s);
329 put_bits(&s->pb, 1, 1);
334 s->c_dc_scale_table= ff_aic_dc_scale_table;
337 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
342 * Encodes a group of blocks header.
344 void h263_encode_gob_header(MpegEncContext * s, int mb_line)
346 put_bits(&s->pb, 17, 1); /* GBSC */
348 if(s->h263_slice_structured){
349 put_bits(&s->pb, 1, 1);
351 ff_h263_encode_mba(s);
354 put_bits(&s->pb, 1, 1);
355 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
356 put_bits(&s->pb, 1, 1);
357 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
359 int gob_number= mb_line / s->gob_index;
361 put_bits(&s->pb, 5, gob_number); /* GN */
362 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
363 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
367 static inline int get_block_rate(MpegEncContext * s, DCTELEM block[64], int block_last_index, uint8_t scantable[64]){
372 for(j=1; j<=block_last_index; j++){
373 const int index= scantable[j];
374 int level= block[index];
377 if((level&(~127)) == 0){
378 if(j<block_last_index) rate+= s->intra_ac_vlc_length [UNI_AC_ENC_INDEX(j-last-1, level)];
379 else rate+= s->intra_ac_vlc_last_length[UNI_AC_ENC_INDEX(j-last-1, level)];
381 rate += s->ac_esc_length;
391 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
395 int8_t * const qscale_table= s->current_picture.qscale_table;
397 memcpy(zigzag_last_index, s->block_last_index, sizeof(int)*6);
400 int16_t *ac_val, *ac_val1;
402 score -= get_block_rate(s, block[n], s->block_last_index[n], s->intra_scantable.permutated);
404 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
407 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
409 ac_val-= s->block_wrap[n]*16;
410 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
413 const int level= block[n][s->dsp.idct_permutation[i ]];
414 block[n][s->dsp.idct_permutation[i ]] = level - ac_val[i+8];
415 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
419 /* different qscale, we must rescale */
421 const int level= block[n][s->dsp.idct_permutation[i ]];
422 block[n][s->dsp.idct_permutation[i ]] = level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
423 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
427 st[n]= s->intra_h_scantable.permutated;
429 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
430 /* left prediction */
432 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
435 const int level= block[n][s->dsp.idct_permutation[i<<3]];
436 block[n][s->dsp.idct_permutation[i<<3]]= level - ac_val[i];
438 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
441 /* different qscale, we must rescale */
443 const int level= block[n][s->dsp.idct_permutation[i<<3]];
444 block[n][s->dsp.idct_permutation[i<<3]]= level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
446 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
449 st[n]= s->intra_v_scantable.permutated;
452 for(i=63; i>0; i--) //FIXME optimize
453 if(block[n][ st[n][i] ]) break;
454 s->block_last_index[n]= i;
456 score += get_block_rate(s, block[n], s->block_last_index[n], st[n]);
462 static inline void restore_ac_coeffs(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
465 memcpy(s->block_last_index, zigzag_last_index, sizeof(int)*6);
468 int16_t *ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
470 st[n]= s->intra_scantable.permutated;
474 block[n][s->dsp.idct_permutation[i ]] = ac_val[i+8];
477 /* left prediction */
479 block[n][s->dsp.idct_permutation[i<<3]]= ac_val[i ];
486 * modify qscale so that encoding is acually possible in h263 (limit difference to -2..2)
488 void ff_clean_h263_qscales(MpegEncContext *s){
490 int8_t * const qscale_table= s->current_picture.qscale_table;
492 for(i=1; i<s->mb_num; i++){
493 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i-1] ] >2)
494 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i-1] ]+2;
496 for(i=s->mb_num-2; i>=0; i--){
497 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i+1] ] >2)
498 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i+1] ]+2;
501 if(s->codec_id != CODEC_ID_H263P){
502 for(i=1; i<s->mb_num; i++){
503 int mb_xy= s->mb_index2xy[i];
505 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_INTER4V)){
506 s->mb_type[mb_xy]&= ~CANDIDATE_MB_TYPE_INTER4V;
507 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_INTER;
514 * modify mb_type & qscale so that encoding is acually possible in mpeg4
516 void ff_clean_mpeg4_qscales(MpegEncContext *s){
518 int8_t * const qscale_table= s->current_picture.qscale_table;
520 ff_clean_h263_qscales(s);
522 if(s->pict_type== B_TYPE){
524 /* ok, come on, this isnt funny anymore, theres more code for handling this mpeg4 mess than
525 for the actual adaptive quantization */
527 for(i=0; i<s->mb_num; i++){
528 int mb_xy= s->mb_index2xy[i];
529 odd += qscale_table[mb_xy]&1;
532 if(2*odd > s->mb_num) odd=1;
535 for(i=0; i<s->mb_num; i++){
536 int mb_xy= s->mb_index2xy[i];
537 if((qscale_table[mb_xy]&1) != odd)
538 qscale_table[mb_xy]++;
539 if(qscale_table[mb_xy] > 31)
540 qscale_table[mb_xy]= 31;
543 for(i=1; i<s->mb_num; i++){
544 int mb_xy= s->mb_index2xy[i];
545 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_DIRECT)){
546 s->mb_type[mb_xy]&= ~CANDIDATE_MB_TYPE_DIRECT;
547 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_BIDIR;
553 #endif //CONFIG_ENCODERS
556 * @return the mb_type
558 int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){
559 const int mb_index= s->mb_x + s->mb_y*s->mb_stride;
560 const int colocated_mb_type= s->next_picture.mb_type[mb_index];
561 int xy= s->block_index[0];
562 uint16_t time_pp= s->pp_time;
563 uint16_t time_pb= s->pb_time;
566 //FIXME avoid divides
568 if(IS_8X8(colocated_mb_type)){
569 s->mv_type = MV_TYPE_8X8;
571 xy= s->block_index[i];
572 s->mv[0][i][0] = s->next_picture.motion_val[0][xy][0]*time_pb/time_pp + mx;
573 s->mv[0][i][1] = s->next_picture.motion_val[0][xy][1]*time_pb/time_pp + my;
574 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->next_picture.motion_val[0][xy][0]
575 : s->next_picture.motion_val[0][xy][0]*(time_pb - time_pp)/time_pp;
576 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->next_picture.motion_val[0][xy][1]
577 : s->next_picture.motion_val[0][xy][1]*(time_pb - time_pp)/time_pp;
579 return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_L0L1;
580 } else if(IS_INTERLACED(colocated_mb_type)){
581 s->mv_type = MV_TYPE_FIELD;
583 int field_select= s->next_picture.ref_index[0][s->block_index[2*i]];
584 if(s->top_field_first){
585 time_pp= s->pp_field_time - field_select + i;
586 time_pb= s->pb_field_time - field_select + i;
588 time_pp= s->pp_field_time + field_select - i;
589 time_pb= s->pb_field_time + field_select - i;
591 s->mv[0][i][0] = s->p_field_mv_table[i][0][mb_index][0]*time_pb/time_pp + mx;
592 s->mv[0][i][1] = s->p_field_mv_table[i][0][mb_index][1]*time_pb/time_pp + my;
593 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->p_field_mv_table[i][0][mb_index][0]
594 : s->p_field_mv_table[i][0][mb_index][0]*(time_pb - time_pp)/time_pp;
595 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->p_field_mv_table[i][0][mb_index][1]
596 : s->p_field_mv_table[i][0][mb_index][1]*(time_pb - time_pp)/time_pp;
598 return MB_TYPE_DIRECT2 | MB_TYPE_16x8 | MB_TYPE_L0L1 | MB_TYPE_INTERLACED;
600 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;
601 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;
602 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]
603 : s->next_picture.motion_val[0][xy][0]*(time_pb - time_pp)/time_pp;
604 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]
605 : s->next_picture.motion_val[0][xy][1]*(time_pb - time_pp)/time_pp;
606 if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample)
607 s->mv_type= MV_TYPE_16X16;
609 s->mv_type= MV_TYPE_8X8;
610 return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_L0L1; //Note see prev line
614 void ff_h263_update_motion_val(MpegEncContext * s){
615 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
616 //FIXME a lot of thet is only needed for !low_delay
617 const int wrap = s->b8_stride;
618 const int xy = s->block_index[0];
620 s->current_picture.mbskip_table[mb_xy]= s->mb_skiped;
622 if(s->mv_type != MV_TYPE_8X8){
623 int motion_x, motion_y;
627 } else if (s->mv_type == MV_TYPE_16X16) {
628 motion_x = s->mv[0][0][0];
629 motion_y = s->mv[0][0][1];
630 } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {
632 motion_x = s->mv[0][0][0] + s->mv[0][1][0];
633 motion_y = s->mv[0][0][1] + s->mv[0][1][1];
634 motion_x = (motion_x>>1) | (motion_x&1);
636 s->p_field_mv_table[i][0][mb_xy][0]= s->mv[0][i][0];
637 s->p_field_mv_table[i][0][mb_xy][1]= s->mv[0][i][1];
639 s->current_picture.ref_index[0][xy ]=
640 s->current_picture.ref_index[0][xy + 1]= s->field_select[0][0];
641 s->current_picture.ref_index[0][xy + wrap ]=
642 s->current_picture.ref_index[0][xy + wrap + 1]= s->field_select[0][1];
645 /* no update if 8X8 because it has been done during parsing */
646 s->current_picture.motion_val[0][xy][0] = motion_x;
647 s->current_picture.motion_val[0][xy][1] = motion_y;
648 s->current_picture.motion_val[0][xy + 1][0] = motion_x;
649 s->current_picture.motion_val[0][xy + 1][1] = motion_y;
650 s->current_picture.motion_val[0][xy + wrap][0] = motion_x;
651 s->current_picture.motion_val[0][xy + wrap][1] = motion_y;
652 s->current_picture.motion_val[0][xy + 1 + wrap][0] = motion_x;
653 s->current_picture.motion_val[0][xy + 1 + wrap][1] = motion_y;
656 if(s->encoding){ //FIXME encoding MUST be cleaned up
657 if (s->mv_type == MV_TYPE_8X8)
658 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_8x8;
660 s->current_picture.mb_type[mb_xy]= MB_TYPE_INTRA;
662 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_16x16;
666 #ifdef CONFIG_ENCODERS
668 static inline int get_p_cbp(MpegEncContext * s,
669 DCTELEM block[6][64],
670 int motion_x, int motion_y){
673 if(s->flags & CODEC_FLAG_CBP_RD){
674 int best_cbpy_score= INT_MAX;
675 int best_cbpc_score= INT_MAX;
676 int cbpc = (-1), cbpy= (-1);
677 const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0);
678 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
681 int score= inter_MCBPC_bits[i + offset] * lambda;
682 if(i&1) score += s->coded_score[5];
683 if(i&2) score += s->coded_score[4];
685 if(score < best_cbpc_score){
686 best_cbpc_score= score;
692 int score= cbpy_tab[i ^ 0xF][1] * lambda;
693 if(i&1) score += s->coded_score[3];
694 if(i&2) score += s->coded_score[2];
695 if(i&4) score += s->coded_score[1];
696 if(i&8) score += s->coded_score[0];
698 if(score < best_cbpy_score){
699 best_cbpy_score= score;
704 if ((motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16){
705 if(best_cbpy_score + best_cbpc_score + 2*lambda >= 0)
709 for (i = 0; i < 6; i++) {
710 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
711 s->block_last_index[i]= -1;
712 memset(s->block[i], 0, sizeof(DCTELEM)*64);
717 for (i = 0; i < 6; i++) {
718 if (s->block_last_index[i] >= 0)
725 static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64],
726 int motion_x, int motion_y, int mb_type){
729 if(s->flags & CODEC_FLAG_CBP_RD){
731 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
734 if(s->coded_score[i] < 0){
735 score += s->coded_score[i];
742 if ((motion_x | motion_y | s->dquant | mb_type) == 0){
743 zero_score-= 4; //2*MV + mb_type + cbp bit
747 if(zero_score <= score){
752 for (i = 0; i < 6; i++) {
753 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
754 s->block_last_index[i]= -1;
755 memset(s->block[i], 0, sizeof(DCTELEM)*64);
759 for (i = 0; i < 6; i++) {
760 if (s->block_last_index[i] >= 0)
767 void mpeg4_encode_mb(MpegEncContext * s,
768 DCTELEM block[6][64],
769 int motion_x, int motion_y)
771 int cbpc, cbpy, pred_x, pred_y;
772 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
773 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=B_TYPE ? &s->tex_pb : &s->pb;
774 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=I_TYPE ? &s->pb2 : &s->pb;
775 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
776 const int dquant_code[5]= {1,0,9,2,3};
778 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
782 if(s->pict_type==B_TYPE){
783 static const int mb_type_table[8]= {-1, 2, 3, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
784 int mb_type= mb_type_table[s->mv_dir];
791 s->last_mv[i][1][1]= 0;
795 assert(s->dquant>=-2 && s->dquant<=2);
796 assert((s->dquant&1)==0);
799 /* nothing to do if this MB was skiped in the next P Frame */
800 if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){ //FIXME avoid DCT & ...
806 s->mv_dir= MV_DIR_FORWARD; //doesnt matter
807 s->qscale -= s->dquant;
813 cbp= get_b_cbp(s, block, motion_x, motion_y, mb_type);
815 if ((cbp | motion_x | motion_y | mb_type) ==0) {
816 /* direct MB with MV={0,0} */
817 assert(s->dquant==0);
819 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
821 if(interleaved_stats){
829 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
830 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
831 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we dont need it :)
832 if(cbp) put_bits(&s->pb, 6, cbp);
836 put_bits(&s->pb, 2, (s->dquant>>2)+3);
838 put_bits(&s->pb, 1, 0);
840 s->qscale -= s->dquant;
842 if(!s->progressive_sequence){
844 put_bits(&s->pb, 1, s->interlaced_dct);
845 if(mb_type) // not diect mode
846 put_bits(&s->pb, 1, s->mv_type == MV_TYPE_FIELD);
849 if(interleaved_stats){
850 s->misc_bits+= get_bits_diff(s);
854 assert(s->mv_dir & MV_DIRECT);
855 ff_h263_encode_motion(s, motion_x, 1);
856 ff_h263_encode_motion(s, motion_y, 1);
860 assert(mb_type > 0 && mb_type < 4);
861 if(s->mv_type != MV_TYPE_FIELD){
862 if(s->mv_dir & MV_DIR_FORWARD){
863 ff_h263_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code);
864 ff_h263_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
865 s->last_mv[0][0][0]= s->last_mv[0][1][0]= s->mv[0][0][0];
866 s->last_mv[0][0][1]= s->last_mv[0][1][1]= s->mv[0][0][1];
869 if(s->mv_dir & MV_DIR_BACKWARD){
870 ff_h263_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code);
871 ff_h263_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
872 s->last_mv[1][0][0]= s->last_mv[1][1][0]= s->mv[1][0][0];
873 s->last_mv[1][0][1]= s->last_mv[1][1][1]= s->mv[1][0][1];
877 if(s->mv_dir & MV_DIR_FORWARD){
878 put_bits(&s->pb, 1, s->field_select[0][0]);
879 put_bits(&s->pb, 1, s->field_select[0][1]);
881 if(s->mv_dir & MV_DIR_BACKWARD){
882 put_bits(&s->pb, 1, s->field_select[1][0]);
883 put_bits(&s->pb, 1, s->field_select[1][1]);
885 if(s->mv_dir & MV_DIR_FORWARD){
887 ff_h263_encode_motion(s, s->mv[0][i][0] - s->last_mv[0][i][0] , s->f_code);
888 ff_h263_encode_motion(s, s->mv[0][i][1] - s->last_mv[0][i][1]/2, s->f_code);
889 s->last_mv[0][i][0]= s->mv[0][i][0];
890 s->last_mv[0][i][1]= s->mv[0][i][1]*2;
894 if(s->mv_dir & MV_DIR_BACKWARD){
896 ff_h263_encode_motion(s, s->mv[1][i][0] - s->last_mv[1][i][0] , s->b_code);
897 ff_h263_encode_motion(s, s->mv[1][i][1] - s->last_mv[1][i][1]/2, s->b_code);
898 s->last_mv[1][i][0]= s->mv[1][i][0];
899 s->last_mv[1][i][1]= s->mv[1][i][1]*2;
906 if(interleaved_stats){
907 s->mv_bits+= get_bits_diff(s);
910 /* encode each block */
911 for (i = 0; i < 6; i++) {
912 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, NULL, &s->pb);
915 if(interleaved_stats){
916 s->p_tex_bits+= get_bits_diff(s);
919 }else{ /* s->pict_type==B_TYPE */
920 cbp= get_p_cbp(s, block, motion_x, motion_y);
922 if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
923 /* check if the B frames can skip it too, as we must skip it if we skip here
924 why didnt they just compress the skip-mb bits instead of reusing them ?! */
925 if(s->max_b_frames>0){
932 if(x+16 > s->width) x= s->width-16;
933 if(y+16 > s->height) y= s->height-16;
935 offset= x + y*s->linesize;
936 p_pic= s->new_picture.data[0] + offset;
939 for(i=0; i<s->max_b_frames; i++){
942 Picture *pic= s->reordered_input_picture[i+1];
944 if(pic==NULL || pic->pict_type!=B_TYPE) break;
946 b_pic= pic->data[0] + offset + 16; //FIXME +16
947 diff= s->dsp.sad[0](NULL, p_pic, b_pic, s->linesize, 16);
948 if(diff>s->qscale*70){ //FIXME check that 70 is optimal
957 /* skip macroblock */
958 put_bits(&s->pb, 1, 1);
960 if(interleaved_stats){
970 put_bits(&s->pb, 1, 0); /* mb coded */
974 if(s->mv_type==MV_TYPE_16X16){
975 if(s->dquant) cbpc+= 8;
977 inter_MCBPC_bits[cbpc],
978 inter_MCBPC_code[cbpc]);
980 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
982 put_bits(pb2, 2, dquant_code[s->dquant+2]);
984 if(!s->progressive_sequence){
986 put_bits(pb2, 1, s->interlaced_dct);
990 if(interleaved_stats){
991 s->misc_bits+= get_bits_diff(s);
994 /* motion vectors: 16x16 mode */
995 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
997 ff_h263_encode_motion(s, motion_x - pred_x, s->f_code);
998 ff_h263_encode_motion(s, motion_y - pred_y, s->f_code);
999 }else if(s->mv_type==MV_TYPE_FIELD){
1000 if(s->dquant) cbpc+= 8;
1002 inter_MCBPC_bits[cbpc],
1003 inter_MCBPC_code[cbpc]);
1005 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1007 put_bits(pb2, 2, dquant_code[s->dquant+2]);
1009 assert(!s->progressive_sequence);
1011 put_bits(pb2, 1, s->interlaced_dct);
1012 put_bits(pb2, 1, 1);
1014 if(interleaved_stats){
1015 s->misc_bits+= get_bits_diff(s);
1018 /* motion vectors: 16x8 interlaced mode */
1019 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1022 put_bits(&s->pb, 1, s->field_select[0][0]);
1023 put_bits(&s->pb, 1, s->field_select[0][1]);
1025 ff_h263_encode_motion(s, s->mv[0][0][0] - pred_x, s->f_code);
1026 ff_h263_encode_motion(s, s->mv[0][0][1] - pred_y, s->f_code);
1027 ff_h263_encode_motion(s, s->mv[0][1][0] - pred_x, s->f_code);
1028 ff_h263_encode_motion(s, s->mv[0][1][1] - pred_y, s->f_code);
1030 assert(s->mv_type==MV_TYPE_8X8);
1032 inter_MCBPC_bits[cbpc+16],
1033 inter_MCBPC_code[cbpc+16]);
1034 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1036 if(!s->progressive_sequence){
1038 put_bits(pb2, 1, s->interlaced_dct);
1041 if(interleaved_stats){
1042 s->misc_bits+= get_bits_diff(s);
1046 /* motion vectors: 8x8 mode*/
1047 h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1049 ff_h263_encode_motion(s, s->current_picture.motion_val[0][ s->block_index[i] ][0] - pred_x, s->f_code);
1050 ff_h263_encode_motion(s, s->current_picture.motion_val[0][ s->block_index[i] ][1] - pred_y, s->f_code);
1054 if(interleaved_stats){
1055 s->mv_bits+= get_bits_diff(s);
1058 /* encode each block */
1059 for (i = 0; i < 6; i++) {
1060 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, NULL, tex_pb);
1063 if(interleaved_stats){
1064 s->p_tex_bits+= get_bits_diff(s);
1070 int dc_diff[6]; //dc values with the dc prediction subtracted
1071 int dir[6]; //prediction direction
1072 int zigzag_last_index[6];
1073 uint8_t *scan_table[6];
1077 dc_diff[i]= ff_mpeg4_pred_dc(s, i, block[i][0], &dir[i], 1);
1080 if(s->flags & CODEC_FLAG_AC_PRED){
1081 s->ac_pred= decide_ac_pred(s, block, dir, scan_table, zigzag_last_index);
1083 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1086 scan_table[i]= s->intra_scantable.permutated;
1091 for (i = 0; i < 6; i++) {
1092 if (s->block_last_index[i] >= 1)
1093 cbp |= 1 << (5 - i);
1097 if (s->pict_type == I_TYPE) {
1098 if(s->dquant) cbpc+=4;
1100 intra_MCBPC_bits[cbpc],
1101 intra_MCBPC_code[cbpc]);
1103 if(s->dquant) cbpc+=8;
1104 put_bits(&s->pb, 1, 0); /* mb coded */
1106 inter_MCBPC_bits[cbpc + 4],
1107 inter_MCBPC_code[cbpc + 4]);
1109 put_bits(pb2, 1, s->ac_pred);
1111 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1113 put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
1115 if(!s->progressive_sequence){
1116 put_bits(dc_pb, 1, s->interlaced_dct);
1119 if(interleaved_stats){
1120 s->misc_bits+= get_bits_diff(s);
1123 /* encode each block */
1124 for (i = 0; i < 6; i++) {
1125 mpeg4_encode_block(s, block[i], i, dc_diff[i], scan_table[i], dc_pb, tex_pb);
1128 if(interleaved_stats){
1129 s->i_tex_bits+= get_bits_diff(s);
1133 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
1135 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1139 void h263_encode_mb(MpegEncContext * s,
1140 DCTELEM block[6][64],
1141 int motion_x, int motion_y)
1143 int cbpc, cbpy, i, cbp, pred_x, pred_y;
1145 int16_t rec_intradc[6];
1146 uint16_t *dc_ptr[6];
1147 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1);
1148 const int dquant_code[5]= {1,0,9,2,3};
1150 //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
1153 cbp= get_p_cbp(s, block, motion_x, motion_y);
1155 if ((cbp | motion_x | motion_y | s->dquant | (s->mv_type - MV_TYPE_16X16)) == 0) {
1156 /* skip macroblock */
1157 put_bits(&s->pb, 1, 1);
1158 if(interleaved_stats){
1166 put_bits(&s->pb, 1, 0); /* mb coded */
1170 if(s->alt_inter_vlc==0 || cbpc!=3)
1172 if(s->dquant) cbpc+= 8;
1173 if(s->mv_type==MV_TYPE_16X16){
1175 inter_MCBPC_bits[cbpc],
1176 inter_MCBPC_code[cbpc]);
1178 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1180 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1182 if(interleaved_stats){
1183 s->misc_bits+= get_bits_diff(s);
1186 /* motion vectors: 16x16 mode */
1187 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1190 ff_h263_encode_motion(s, motion_x - pred_x, 1);
1191 ff_h263_encode_motion(s, motion_y - pred_y, 1);
1194 h263p_encode_umotion(s, motion_x - pred_x);
1195 h263p_encode_umotion(s, motion_y - pred_y);
1196 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
1197 /* To prevent Start Code emulation */
1198 put_bits(&s->pb,1,1);
1202 inter_MCBPC_bits[cbpc+16],
1203 inter_MCBPC_code[cbpc+16]);
1204 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1206 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1208 if(interleaved_stats){
1209 s->misc_bits+= get_bits_diff(s);
1213 /* motion vectors: 8x8 mode*/
1214 h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1216 motion_x= s->current_picture.motion_val[0][ s->block_index[i] ][0];
1217 motion_y= s->current_picture.motion_val[0][ s->block_index[i] ][1];
1219 ff_h263_encode_motion(s, motion_x - pred_x, 1);
1220 ff_h263_encode_motion(s, motion_y - pred_y, 1);
1223 h263p_encode_umotion(s, motion_x - pred_x);
1224 h263p_encode_umotion(s, motion_y - pred_y);
1225 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
1226 /* To prevent Start Code emulation */
1227 put_bits(&s->pb,1,1);
1232 if(interleaved_stats){
1233 s->mv_bits+= get_bits_diff(s);
1236 assert(s->mb_intra);
1241 for(i=0; i<6; i++) {
1242 int16_t level = block[i][0];
1245 if(i<4) scale= s->y_dc_scale;
1246 else scale= s->c_dc_scale;
1248 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
1252 level = (level + (scale>>1))/scale;
1254 level = (level - (scale>>1))/scale;
1256 /* AIC can change CBP */
1257 if (level == 0 && s->block_last_index[i] == 0)
1258 s->block_last_index[i] = -1;
1260 if(!s->modified_quant){
1263 else if (level > 127)
1267 block[i][0] = level;
1268 /* Reconstruction */
1269 rec_intradc[i] = scale*level + pred_dc;
1271 rec_intradc[i] |= 1;
1272 //if ((rec_intradc[i] % 2) == 0)
1273 // rec_intradc[i]++;
1275 if (rec_intradc[i] < 0)
1277 else if (rec_intradc[i] > 2047)
1278 rec_intradc[i] = 2047;
1280 /* Update AC/DC tables */
1281 *dc_ptr[i] = rec_intradc[i];
1282 if (s->block_last_index[i] >= 0)
1283 cbp |= 1 << (5 - i);
1286 for(i=0; i<6; i++) {
1288 if (s->block_last_index[i] >= 1)
1289 cbp |= 1 << (5 - i);
1294 if (s->pict_type == I_TYPE) {
1295 if(s->dquant) cbpc+=4;
1297 intra_MCBPC_bits[cbpc],
1298 intra_MCBPC_code[cbpc]);
1300 if(s->dquant) cbpc+=8;
1301 put_bits(&s->pb, 1, 0); /* mb coded */
1303 inter_MCBPC_bits[cbpc + 4],
1304 inter_MCBPC_code[cbpc + 4]);
1307 /* XXX: currently, we do not try to use ac prediction */
1308 put_bits(&s->pb, 1, 0); /* no AC prediction */
1311 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1313 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1315 if(interleaved_stats){
1316 s->misc_bits+= get_bits_diff(s);
1320 for(i=0; i<6; i++) {
1321 /* encode each block */
1322 h263_encode_block(s, block[i], i);
1324 /* Update INTRADC for decoding */
1325 if (s->h263_aic && s->mb_intra) {
1326 block[i][0] = rec_intradc[i];
1331 if(interleaved_stats){
1333 s->p_tex_bits+= get_bits_diff(s);
1336 s->i_tex_bits+= get_bits_diff(s);
1343 void ff_h263_loop_filter(MpegEncContext * s){
1345 const int linesize = s->linesize;
1346 const int uvlinesize= s->uvlinesize;
1347 const int xy = s->mb_y * s->mb_stride + s->mb_x;
1348 uint8_t *dest_y = s->dest[0];
1349 uint8_t *dest_cb= s->dest[1];
1350 uint8_t *dest_cr= s->dest[2];
1352 // if(s->pict_type==B_TYPE && !s->readable) return;
1358 if(!IS_SKIP(s->current_picture.mb_type[xy])){
1360 s->dsp.h263_v_loop_filter(dest_y+8*linesize , linesize, qp_c);
1361 s->dsp.h263_v_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
1366 int qp_dt, qp_t, qp_tc;
1368 if(IS_SKIP(s->current_picture.mb_type[xy-s->mb_stride]))
1371 qp_t= s->current_picture.qscale_table[xy-s->mb_stride];
1379 const int chroma_qp= s->chroma_qscale_table[qp_tc];
1380 s->dsp.h263_v_loop_filter(dest_y , linesize, qp_tc);
1381 s->dsp.h263_v_loop_filter(dest_y+8, linesize, qp_tc);
1383 s->dsp.h263_v_loop_filter(dest_cb , uvlinesize, chroma_qp);
1384 s->dsp.h263_v_loop_filter(dest_cr , uvlinesize, chroma_qp);
1388 s->dsp.h263_h_loop_filter(dest_y-8*linesize+8 , linesize, qp_t);
1391 if(qp_t || IS_SKIP(s->current_picture.mb_type[xy-1-s->mb_stride]))
1394 qp_dt= s->current_picture.qscale_table[xy-1-s->mb_stride];
1397 const int chroma_qp= s->chroma_qscale_table[qp_dt];
1398 s->dsp.h263_h_loop_filter(dest_y -8*linesize , linesize, qp_dt);
1399 s->dsp.h263_h_loop_filter(dest_cb-8*uvlinesize, uvlinesize, chroma_qp);
1400 s->dsp.h263_h_loop_filter(dest_cr-8*uvlinesize, uvlinesize, chroma_qp);
1406 s->dsp.h263_h_loop_filter(dest_y +8, linesize, qp_c);
1407 if(s->mb_y + 1 == s->mb_height)
1408 s->dsp.h263_h_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
1413 if(qp_c || IS_SKIP(s->current_picture.mb_type[xy-1]))
1416 qp_lc= s->current_picture.qscale_table[xy-1];
1419 s->dsp.h263_h_loop_filter(dest_y, linesize, qp_lc);
1420 if(s->mb_y + 1 == s->mb_height){
1421 const int chroma_qp= s->chroma_qscale_table[qp_lc];
1422 s->dsp.h263_h_loop_filter(dest_y +8* linesize, linesize, qp_lc);
1423 s->dsp.h263_h_loop_filter(dest_cb , uvlinesize, chroma_qp);
1424 s->dsp.h263_h_loop_filter(dest_cr , uvlinesize, chroma_qp);
1430 static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr)
1432 int x, y, wrap, a, c, pred_dc, scale;
1433 int16_t *dc_val, *ac_val;
1435 /* find prediction */
1437 x = 2 * s->mb_x + (n & 1);
1438 y = 2 * s->mb_y + ((n & 2) >> 1);
1439 wrap = s->b8_stride;
1440 dc_val = s->dc_val[0];
1441 ac_val = s->ac_val[0][0];
1442 scale = s->y_dc_scale;
1446 wrap = s->mb_stride;
1447 dc_val = s->dc_val[n - 4 + 1];
1448 ac_val = s->ac_val[n - 4 + 1][0];
1449 scale = s->c_dc_scale;
1454 a = dc_val[(x - 1) + (y) * wrap];
1455 c = dc_val[(x) + (y - 1) * wrap];
1457 /* No prediction outside GOB boundary */
1458 if(s->first_slice_line && n!=3){
1460 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
1463 /* just DC prediction */
1464 if (a != 1024 && c != 1024)
1465 pred_dc = (a + c) >> 1;
1471 /* we assume pred is positive */
1472 //pred_dc = (pred_dc + (scale >> 1)) / scale;
1473 *dc_val_ptr = &dc_val[x + y * wrap];
1477 static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n)
1479 int x, y, wrap, a, c, pred_dc, scale, i;
1480 int16_t *dc_val, *ac_val, *ac_val1;
1482 /* find prediction */
1484 x = 2 * s->mb_x + (n & 1);
1485 y = 2 * s->mb_y + (n>> 1);
1486 wrap = s->b8_stride;
1487 dc_val = s->dc_val[0];
1488 ac_val = s->ac_val[0][0];
1489 scale = s->y_dc_scale;
1493 wrap = s->mb_stride;
1494 dc_val = s->dc_val[n - 4 + 1];
1495 ac_val = s->ac_val[n - 4 + 1][0];
1496 scale = s->c_dc_scale;
1499 ac_val += ((y) * wrap + (x)) * 16;
1505 a = dc_val[(x - 1) + (y) * wrap];
1506 c = dc_val[(x) + (y - 1) * wrap];
1508 /* No prediction outside GOB boundary */
1509 if(s->first_slice_line && n!=3){
1511 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
1516 if (s->h263_aic_dir) {
1517 /* left prediction */
1521 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
1526 /* top prediction */
1528 ac_val -= 16 * wrap;
1530 block[s->dsp.idct_permutation[i ]] += ac_val[i + 8];
1536 /* just DC prediction */
1537 if (a != 1024 && c != 1024)
1538 pred_dc = (a + c) >> 1;
1545 /* we assume pred is positive */
1546 block[0]=block[0]*scale + pred_dc;
1553 /* Update AC/DC tables */
1554 dc_val[(x) + (y) * wrap] = block[0];
1558 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
1561 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
1564 int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir,
1568 int16_t *A, *B, *C, (*mot_val)[2];
1569 static const int off[4]= {2, 1, 1, -1};
1571 wrap = s->b8_stride;
1572 mot_val = s->current_picture.motion_val[dir] + s->block_index[block];
1575 /* special case for first (slice) line */
1576 if (s->first_slice_line && block<3) {
1577 // we cant just change some MVs to simulate that as we need them for the B frames (and ME)
1578 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
1579 if(block==0){ //most common case
1580 if(s->mb_x == s->resync_mb_x){ //rare
1582 }else if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
1583 C = mot_val[off[block] - wrap];
1588 *px = mid_pred(A[0], 0, C[0]);
1589 *py = mid_pred(A[1], 0, C[1]);
1596 if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
1597 C = mot_val[off[block] - wrap];
1598 *px = mid_pred(A[0], 0, C[0]);
1599 *py = mid_pred(A[1], 0, C[1]);
1604 }else{ /* block==2*/
1605 B = mot_val[ - wrap];
1606 C = mot_val[off[block] - wrap];
1607 if(s->mb_x == s->resync_mb_x) //rare
1610 *px = mid_pred(A[0], B[0], C[0]);
1611 *py = mid_pred(A[1], B[1], C[1]);
1614 B = mot_val[ - wrap];
1615 C = mot_val[off[block] - wrap];
1616 *px = mid_pred(A[0], B[0], C[0]);
1617 *py = mid_pred(A[1], B[1], C[1]);
1622 #ifdef CONFIG_ENCODERS
1623 void ff_h263_encode_motion(MpegEncContext * s, int val, int f_code)
1625 int range, l, bit_size, sign, code, bits;
1630 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1632 bit_size = f_code - 1;
1633 range = 1 << bit_size;
1634 /* modulo encoding */
1635 l= INT_BIT - 6 - bit_size;
1638 val= (val^sign)-sign;
1642 code = (val >> bit_size) + 1;
1643 bits = val & (range - 1);
1645 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1647 put_bits(&s->pb, bit_size, bits);
1653 /* Encode MV differences on H.263+ with Unrestricted MV mode */
1654 static void h263p_encode_umotion(MpegEncContext * s, int val)
1664 put_bits(&s->pb, 1, 1);
1666 put_bits(&s->pb, 3, 0);
1668 put_bits(&s->pb, 3, 2);
1671 sval = ((val < 0) ? (short)(-val):(short)val);
1674 while (temp_val != 0) {
1675 temp_val = temp_val >> 1;
1681 tcode = (sval & (1 << (i-1))) >> (i-1);
1682 tcode = (tcode << 1) | 1;
1683 code = (code << 2) | tcode;
1686 code = ((code << 1) | (val < 0)) << 1;
1687 put_bits(&s->pb, (2*n_bits)+1, code);
1688 //printf("\nVal = %d\tCode = %d", sval, code);
1692 static void init_mv_penalty_and_fcode(MpegEncContext *s)
1697 if(mv_penalty==NULL)
1698 mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
1700 for(f_code=1; f_code<=MAX_FCODE; f_code++){
1701 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
1704 if(mv==0) len= mvtab[0][1];
1706 int val, bit_size, range, code;
1708 bit_size = f_code - 1;
1709 range = 1 << bit_size;
1715 code = (val >> bit_size) + 1;
1717 len= mvtab[code][1] + 1 + bit_size;
1719 len= mvtab[32][1] + 2 + bit_size;
1723 mv_penalty[f_code][mv+MAX_MV]= len;
1727 for(f_code=MAX_FCODE; f_code>0; f_code--){
1728 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
1729 fcode_tab[mv+MAX_MV]= f_code;
1733 for(mv=0; mv<MAX_MV*2+1; mv++){
1734 umv_fcode_tab[mv]= 1;
1739 #ifdef CONFIG_ENCODERS
1741 static void init_uni_dc_tab(void)
1743 int level, uni_code, uni_len;
1745 for(level=-256; level<256; level++){
1747 /* find number of bits */
1756 l= (-level) ^ ((1 << size) - 1);
1761 uni_code= DCtab_lum[size][0];
1762 uni_len = DCtab_lum[size][1];
1765 uni_code<<=size; uni_code|=l;
1768 uni_code<<=1; uni_code|=1;
1772 uni_DCtab_lum_bits[level+256]= uni_code;
1773 uni_DCtab_lum_len [level+256]= uni_len;
1776 uni_code= DCtab_chrom[size][0];
1777 uni_len = DCtab_chrom[size][1];
1780 uni_code<<=size; uni_code|=l;
1783 uni_code<<=1; uni_code|=1;
1787 uni_DCtab_chrom_bits[level+256]= uni_code;
1788 uni_DCtab_chrom_len [level+256]= uni_len;
1793 #endif //CONFIG_ENCODERS
1795 #ifdef CONFIG_ENCODERS
1796 static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1797 int slevel, run, last;
1799 assert(MAX_LEVEL >= 64);
1800 assert(MAX_RUN >= 63);
1802 for(slevel=-64; slevel<64; slevel++){
1803 if(slevel==0) continue;
1804 for(run=0; run<64; run++){
1805 for(last=0; last<=1; last++){
1806 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1807 int level= slevel < 0 ? -slevel : slevel;
1808 int sign= slevel < 0 ? 1 : 0;
1809 int bits, len, code;
1812 len_tab[index]= 100;
1815 code= get_rl_index(rl, last, run, level);
1816 bits= rl->table_vlc[code][0];
1817 len= rl->table_vlc[code][1];
1818 bits=bits*2+sign; len++;
1820 if(code!=rl->n && len < len_tab[index]){
1821 bits_tab[index]= bits;
1822 len_tab [index]= len;
1826 bits= rl->table_vlc[rl->n][0];
1827 len= rl->table_vlc[rl->n][1];
1828 bits=bits*2; len++; //esc1
1829 level1= level - rl->max_level[last][run];
1831 code= get_rl_index(rl, last, run, level1);
1832 bits<<= rl->table_vlc[code][1];
1833 len += rl->table_vlc[code][1];
1834 bits += rl->table_vlc[code][0];
1835 bits=bits*2+sign; len++;
1837 if(code!=rl->n && len < len_tab[index]){
1838 bits_tab[index]= bits;
1839 len_tab [index]= len;
1845 bits= rl->table_vlc[rl->n][0];
1846 len= rl->table_vlc[rl->n][1];
1847 bits=bits*4+2; len+=2; //esc2
1848 run1 = run - rl->max_run[last][level] - 1;
1850 code= get_rl_index(rl, last, run1, level);
1851 bits<<= rl->table_vlc[code][1];
1852 len += rl->table_vlc[code][1];
1853 bits += rl->table_vlc[code][0];
1854 bits=bits*2+sign; len++;
1856 if(code!=rl->n && len < len_tab[index]){
1857 bits_tab[index]= bits;
1858 len_tab [index]= len;
1863 bits= rl->table_vlc[rl->n][0];
1864 len = rl->table_vlc[rl->n][1];
1865 bits=bits*4+3; len+=2; //esc3
1866 bits=bits*2+last; len++;
1867 bits=bits*64+run; len+=6;
1868 bits=bits*2+1; len++; //marker
1869 bits=bits*4096+(slevel&0xfff); len+=12;
1870 bits=bits*2+1; len++; //marker
1872 if(len < len_tab[index]){
1873 bits_tab[index]= bits;
1874 len_tab [index]= len;
1881 static void init_uni_h263_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1882 int slevel, run, last;
1884 assert(MAX_LEVEL >= 64);
1885 assert(MAX_RUN >= 63);
1887 for(slevel=-64; slevel<64; slevel++){
1888 if(slevel==0) continue;
1889 for(run=0; run<64; run++){
1890 for(last=0; last<=1; last++){
1891 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1892 int level= slevel < 0 ? -slevel : slevel;
1893 int sign= slevel < 0 ? 1 : 0;
1894 int bits, len, code;
1897 len_tab[index]= 100;
1900 code= get_rl_index(rl, last, run, level);
1901 bits= rl->table_vlc[code][0];
1902 len= rl->table_vlc[code][1];
1903 bits=bits*2+sign; len++;
1905 if(code!=rl->n && len < len_tab[index]){
1906 if(bits_tab) bits_tab[index]= bits;
1907 len_tab [index]= len;
1910 bits= rl->table_vlc[rl->n][0];
1911 len = rl->table_vlc[rl->n][1];
1912 bits=bits*2+last; len++;
1913 bits=bits*64+run; len+=6;
1914 bits=bits*256+(level&0xff); len+=8;
1916 if(len < len_tab[index]){
1917 if(bits_tab) bits_tab[index]= bits;
1918 len_tab [index]= len;
1925 void h263_encode_init(MpegEncContext *s)
1927 static int done = 0;
1934 init_rl(&rl_inter, 1);
1935 init_rl(&rl_intra, 1);
1936 init_rl(&rl_intra_aic, 1);
1938 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
1939 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
1941 init_uni_h263_rl_tab(&rl_intra_aic, NULL, uni_h263_intra_aic_rl_len);
1942 init_uni_h263_rl_tab(&rl_inter , NULL, uni_h263_inter_rl_len);
1944 init_mv_penalty_and_fcode(s);
1946 s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
1948 s->intra_ac_vlc_length =s->inter_ac_vlc_length = uni_h263_inter_rl_len;
1949 s->intra_ac_vlc_last_length=s->inter_ac_vlc_last_length= uni_h263_inter_rl_len + 128*64;
1951 s->intra_ac_vlc_length = uni_h263_intra_aic_rl_len;
1952 s->intra_ac_vlc_last_length= uni_h263_intra_aic_rl_len + 128*64;
1954 s->ac_esc_length= 7+1+6+8;
1956 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
1957 switch(s->codec_id){
1958 case CODEC_ID_MPEG4:
1959 s->fcode_tab= fcode_tab;
1960 s->min_qcoeff= -2048;
1961 s->max_qcoeff= 2047;
1962 s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len;
1963 s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64;
1964 s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len;
1965 s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64;
1966 s->luma_dc_vlc_length= uni_DCtab_lum_len;
1967 s->chroma_dc_vlc_length= uni_DCtab_chrom_len;
1968 s->ac_esc_length= 7+2+1+6+1+12+1;
1969 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
1970 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
1972 if(s->flags & CODEC_FLAG_GLOBAL_HEADER){
1974 s->avctx->extradata= av_malloc(1024);
1975 init_put_bits(&s->pb, s->avctx->extradata, 1024);
1977 mpeg4_encode_visual_object_header(s);
1978 mpeg4_encode_vol_header(s, 0, 0);
1980 // ff_mpeg4_stuffing(&s->pb); ?
1981 flush_put_bits(&s->pb);
1982 s->avctx->extradata_size= (put_bits_count(&s->pb)+7)>>3;
1986 case CODEC_ID_H263P:
1988 s->fcode_tab= umv_fcode_tab;
1989 if(s->modified_quant){
1990 s->min_qcoeff= -2047;
1991 s->max_qcoeff= 2047;
1993 s->min_qcoeff= -127;
1997 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
1999 if (s->h263_flv > 1) {
2000 s->min_qcoeff= -1023;
2001 s->max_qcoeff= 1023;
2003 s->min_qcoeff= -127;
2006 s->y_dc_scale_table=
2007 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
2009 default: //nothing needed default table allready set in mpegvideo.c
2010 s->min_qcoeff= -127;
2012 s->y_dc_scale_table=
2013 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
2018 * encodes a 8x8 block.
2019 * @param block the 8x8 block
2020 * @param n block index (0-3 are luma, 4-5 are chroma)
2022 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
2024 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
2028 if (s->mb_intra && !s->h263_aic) {
2031 /* 255 cannot be represented, so we clamp */
2036 /* 0 cannot be represented also */
2037 else if (level < 1) {
2041 if (level == 128) //FIXME check rv10
2042 put_bits(&s->pb, 8, 0xff);
2044 put_bits(&s->pb, 8, level);
2048 if (s->h263_aic && s->mb_intra)
2051 if(s->alt_inter_vlc && !s->mb_intra){
2053 int inter_vlc_bits=0;
2057 last_index = s->block_last_index[n];
2058 last_non_zero = i - 1;
2059 for (; i <= last_index; i++) {
2060 j = s->intra_scantable.permutated[i];
2063 run = i - last_non_zero - 1;
2064 last = (i == last_index);
2066 if(level<0) level= -level;
2068 code = get_rl_index(rl, last, run, level);
2069 aic_code = get_rl_index(&rl_intra_aic, last, run, level);
2070 inter_vlc_bits += rl->table_vlc[code][1]+1;
2071 aic_vlc_bits += rl_intra_aic.table_vlc[aic_code][1]+1;
2073 if (code == rl->n) {
2074 inter_vlc_bits += 1+6+8-1;
2076 if (aic_code == rl_intra_aic.n) {
2077 aic_vlc_bits += 1+6+8-1;
2078 wrong_pos += run + 1;
2080 wrong_pos += wrong_run[aic_code];
2085 if(aic_vlc_bits < inter_vlc_bits && wrong_pos > 63)
2091 last_index = s->block_last_index[n];
2092 last_non_zero = i - 1;
2093 for (; i <= last_index; i++) {
2094 j = s->intra_scantable.permutated[i];
2097 run = i - last_non_zero - 1;
2098 last = (i == last_index);
2105 code = get_rl_index(rl, last, run, level);
2106 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2107 if (code == rl->n) {
2108 if(s->h263_flv <= 1){
2109 put_bits(&s->pb, 1, last);
2110 put_bits(&s->pb, 6, run);
2112 assert(slevel != 0);
2115 put_bits(&s->pb, 8, slevel & 0xff);
2117 put_bits(&s->pb, 8, 128);
2118 put_bits(&s->pb, 5, slevel & 0x1f);
2119 put_bits(&s->pb, 6, (slevel>>5)&0x3f);
2122 if(level < 64) { // 7-bit level
2123 put_bits(&s->pb, 1, 0);
2124 put_bits(&s->pb, 1, last);
2125 put_bits(&s->pb, 6, run);
2127 put_bits(&s->pb, 7, slevel & 0x7f);
2130 put_bits(&s->pb, 1, 1);
2131 put_bits(&s->pb, 1, last);
2132 put_bits(&s->pb, 6, run);
2134 put_bits(&s->pb, 11, slevel & 0x7ff);
2138 put_bits(&s->pb, 1, sign);
2146 #ifdef CONFIG_ENCODERS
2148 /***************************************************/
2150 * add mpeg4 stuffing bits (01...1)
2152 void ff_mpeg4_stuffing(PutBitContext * pbc)
2155 put_bits(pbc, 1, 0);
2156 length= (-put_bits_count(pbc))&7;
2157 if(length) put_bits(pbc, length, (1<<length)-1);
2160 /* must be called before writing the header */
2161 void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){
2162 int time_div, time_mod;
2164 assert(s->current_picture_ptr->pts != AV_NOPTS_VALUE);
2165 s->time= (s->current_picture_ptr->pts*s->time_increment_resolution + AV_TIME_BASE/2)/AV_TIME_BASE;
2167 time_div= s->time/s->time_increment_resolution;
2168 time_mod= s->time%s->time_increment_resolution;
2170 if(s->pict_type==B_TYPE){
2171 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
2172 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
2174 s->last_time_base= s->time_base;
2175 s->time_base= time_div;
2176 s->pp_time= s->time - s->last_non_b_time;
2177 s->last_non_b_time= s->time;
2178 assert(s->pp_time > 0);
2182 static void mpeg4_encode_gop_header(MpegEncContext * s){
2183 int hours, minutes, seconds;
2186 put_bits(&s->pb, 16, 0);
2187 put_bits(&s->pb, 16, GOP_STARTCODE);
2189 time= s->current_picture_ptr->pts;
2190 if(s->reordered_input_picture[1])
2191 time= FFMIN(time, s->reordered_input_picture[1]->pts);
2192 time= (time*s->time_increment_resolution + AV_TIME_BASE/2)/AV_TIME_BASE;
2194 seconds= time/s->time_increment_resolution;
2195 minutes= seconds/60; seconds %= 60;
2196 hours= minutes/60; minutes %= 60;
2199 put_bits(&s->pb, 5, hours);
2200 put_bits(&s->pb, 6, minutes);
2201 put_bits(&s->pb, 1, 1);
2202 put_bits(&s->pb, 6, seconds);
2204 put_bits(&s->pb, 1, !!(s->flags&CODEC_FLAG_CLOSED_GOP));
2205 put_bits(&s->pb, 1, 0); //broken link == NO
2207 s->last_time_base= time / s->time_increment_resolution;
2209 ff_mpeg4_stuffing(&s->pb);
2212 static void mpeg4_encode_visual_object_header(MpegEncContext * s){
2213 int profile_and_level_indication;
2216 if(s->avctx->profile != FF_PROFILE_UNKNOWN){
2217 profile_and_level_indication = s->avctx->profile << 4;
2218 }else if(s->max_b_frames || s->quarter_sample){
2219 profile_and_level_indication= 0xF0; // adv simple
2221 profile_and_level_indication= 0x00; // simple
2224 if(s->avctx->level != FF_LEVEL_UNKNOWN){
2225 profile_and_level_indication |= s->avctx->level;
2227 profile_and_level_indication |= 1; //level 1
2230 if(profile_and_level_indication>>4 == 0xF){
2238 put_bits(&s->pb, 16, 0);
2239 put_bits(&s->pb, 16, VOS_STARTCODE);
2241 put_bits(&s->pb, 8, profile_and_level_indication);
2243 put_bits(&s->pb, 16, 0);
2244 put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);
2246 put_bits(&s->pb, 1, 1);
2247 put_bits(&s->pb, 4, vo_ver_id);
2248 put_bits(&s->pb, 3, 1); //priority
2250 put_bits(&s->pb, 4, 1); //visual obj type== video obj
2252 put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME
2254 ff_mpeg4_stuffing(&s->pb);
2257 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number)
2261 if(s->max_b_frames || s->quarter_sample){
2263 s->vo_type= ADV_SIMPLE_VO_TYPE;
2266 s->vo_type= SIMPLE_VO_TYPE;
2269 put_bits(&s->pb, 16, 0);
2270 put_bits(&s->pb, 16, 0x100 + vo_number); /* video obj */
2271 put_bits(&s->pb, 16, 0);
2272 put_bits(&s->pb, 16, 0x120 + vol_number); /* video obj layer */
2274 put_bits(&s->pb, 1, 0); /* random access vol */
2275 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
2276 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
2277 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
2278 put_bits(&s->pb, 3, 1); /* is obj layer priority */
2280 aspect_to_info(s, s->avctx->sample_aspect_ratio);
2282 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
2283 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
2284 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
2285 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
2288 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
2289 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
2290 put_bits(&s->pb, 1, s->low_delay);
2291 put_bits(&s->pb, 1, 0); /* vbv parameters= no */
2293 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
2294 put_bits(&s->pb, 1, 1); /* marker bit */
2296 put_bits(&s->pb, 16, s->time_increment_resolution);
2297 if (s->time_increment_bits < 1)
2298 s->time_increment_bits = 1;
2299 put_bits(&s->pb, 1, 1); /* marker bit */
2300 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
2301 put_bits(&s->pb, 1, 1); /* marker bit */
2302 put_bits(&s->pb, 13, s->width); /* vol width */
2303 put_bits(&s->pb, 1, 1); /* marker bit */
2304 put_bits(&s->pb, 13, s->height); /* vol height */
2305 put_bits(&s->pb, 1, 1); /* marker bit */
2306 put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
2307 put_bits(&s->pb, 1, 1); /* obmc disable */
2308 if (vo_ver_id == 1) {
2309 put_bits(&s->pb, 1, s->vol_sprite_usage); /* sprite enable */
2311 put_bits(&s->pb, 2, s->vol_sprite_usage); /* sprite enable */
2314 put_bits(&s->pb, 1, 0); /* not 8 bit == false */
2315 put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
2318 ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix);
2319 ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix);
2323 put_bits(&s->pb, 1, s->quarter_sample);
2324 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
2325 s->resync_marker= s->rtp_mode;
2326 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
2327 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
2328 if(s->data_partitioning){
2329 put_bits(&s->pb, 1, 0); /* no rvlc */
2332 if (vo_ver_id != 1){
2333 put_bits(&s->pb, 1, 0); /* newpred */
2334 put_bits(&s->pb, 1, 0); /* reduced res vop */
2336 put_bits(&s->pb, 1, 0); /* scalability */
2338 ff_mpeg4_stuffing(&s->pb);
2341 if(!(s->flags & CODEC_FLAG_BITEXACT)){
2342 put_bits(&s->pb, 16, 0);
2343 put_bits(&s->pb, 16, 0x1B2); /* user_data */
2344 put_string(&s->pb, LIBAVCODEC_IDENT, 0);
2348 /* write mpeg4 VOP header */
2349 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
2352 int time_div, time_mod;
2354 if(s->pict_type==I_TYPE){
2355 if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
2356 if(s->strict_std_compliance < 2) //HACK, the reference sw is buggy
2357 mpeg4_encode_visual_object_header(s);
2358 if(s->strict_std_compliance < 2 || picture_number==0) //HACK, the reference sw is buggy
2359 mpeg4_encode_vol_header(s, 0, 0);
2361 mpeg4_encode_gop_header(s);
2364 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
2366 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->frame_rate, FRAME_RATE_BASE);
2368 put_bits(&s->pb, 16, 0); /* vop header */
2369 put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */
2370 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
2372 time_div= s->time/s->time_increment_resolution;
2373 time_mod= s->time%s->time_increment_resolution;
2374 time_incr= time_div - s->last_time_base;
2375 assert(time_incr >= 0);
2377 put_bits(&s->pb, 1, 1);
2379 put_bits(&s->pb, 1, 0);
2381 put_bits(&s->pb, 1, 1); /* marker */
2382 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
2383 put_bits(&s->pb, 1, 1); /* marker */
2384 put_bits(&s->pb, 1, 1); /* vop coded */
2385 if ( s->pict_type == P_TYPE
2386 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
2387 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
2389 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
2390 if(!s->progressive_sequence){
2391 put_bits(&s->pb, 1, s->current_picture_ptr->top_field_first);
2392 put_bits(&s->pb, 1, s->alternate_scan);
2394 //FIXME sprite stuff
2396 put_bits(&s->pb, 5, s->qscale);
2398 if (s->pict_type != I_TYPE)
2399 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
2400 if (s->pict_type == B_TYPE)
2401 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
2402 // printf("****frame %d\n", picture_number);
2405 #endif //CONFIG_ENCODERS
2408 * set qscale and update qscale dependant variables.
2410 void ff_set_qscale(MpegEncContext * s, int qscale)
2414 else if (qscale > 31)
2418 s->chroma_qscale= s->chroma_qscale_table[qscale];
2420 s->y_dc_scale= s->y_dc_scale_table[ qscale ];
2421 s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
2426 * encoding quantized level -> quantized diff
2427 * decoding quantized diff -> quantized level
2428 * @param n block index (0-3 are luma, 4-5 are chroma)
2429 * @param dir_ptr pointer to an integer where the prediction direction will be stored
2431 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding)
2433 int a, b, c, wrap, pred, scale, ret;
2436 /* find prediction */
2438 scale = s->y_dc_scale;
2440 scale = s->c_dc_scale;
2445 wrap= s->block_wrap[n];
2446 dc_val = s->dc_val[0] + s->block_index[n];
2452 b = dc_val[ - 1 - wrap];
2453 c = dc_val[ - wrap];
2455 /* outside slice handling (we cant do that by memset as we need the dc for error resilience) */
2456 if(s->first_slice_line && n!=3){
2458 if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
2460 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
2461 if(n==0 || n==4 || n==5)
2465 if (abs(a - b) < abs(b - c)) {
2467 *dir_ptr = 1; /* top */
2470 *dir_ptr = 0; /* left */
2472 /* we assume pred is positive */
2473 pred = FASTDIV((pred + (scale >> 1)), scale);
2480 if(s->error_resilience>=3){
2482 av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
2485 if(level*scale > 2048 + scale){
2486 av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
2495 else if(!(s->workaround_bugs&FF_BUG_DC_CLIP))
2505 * @param n block index (0-3 are luma, 4-5 are chroma)
2506 * @param dir the ac prediction direction
2508 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
2512 int16_t *ac_val, *ac_val1;
2513 int8_t * const qscale_table= s->current_picture.qscale_table;
2515 /* find prediction */
2516 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2520 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
2521 /* left prediction */
2524 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
2527 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
2530 /* different qscale, we must rescale */
2532 block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
2536 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
2537 /* top prediction */
2538 ac_val -= 16 * s->block_wrap[n];
2540 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
2543 block[s->dsp.idct_permutation[i]] += ac_val[i + 8];
2546 /* different qscale, we must rescale */
2548 block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
2555 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
2559 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
2563 #ifdef CONFIG_ENCODERS
2566 * encodes the dc value.
2567 * @param n block index (0-3 are luma, 4-5 are chroma)
2569 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
2572 // if(level<-255 || level>255) printf("dc overflow\n");
2576 put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]);
2579 put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]);
2583 /* find number of bits */
2593 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
2596 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
2599 /* encode remaining bits */
2602 level = (-level) ^ ((1 << size) - 1);
2603 put_bits(&s->pb, size, level);
2605 put_bits(&s->pb, 1, 1);
2611 * encodes a 8x8 block
2612 * @param n block index (0-3 are luma, 4-5 are chroma)
2614 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2615 uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
2617 int i, last_non_zero;
2618 #if 0 //variables for the outcommented version
2619 int code, sign, last;
2624 const int last_index = s->block_last_index[n];
2626 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2627 /* mpeg4 based DC predictor */
2628 mpeg4_encode_dc(dc_pb, intra_dc, n);
2629 if(last_index<1) return;
2632 bits_tab= uni_mpeg4_intra_rl_bits;
2633 len_tab = uni_mpeg4_intra_rl_len;
2635 if(last_index<0) return;
2638 bits_tab= uni_mpeg4_inter_rl_bits;
2639 len_tab = uni_mpeg4_inter_rl_len;
2643 last_non_zero = i - 1;
2645 for (; i < last_index; i++) {
2646 int level = block[ scan_table[i] ];
2648 int run = i - last_non_zero - 1;
2650 if((level&(~127)) == 0){
2651 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2652 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2654 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);
2659 /*if(i<=last_index)*/{
2660 int level = block[ scan_table[i] ];
2661 int run = i - last_non_zero - 1;
2663 if((level&(~127)) == 0){
2664 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2665 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2667 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);
2671 for (; i <= last_index; i++) {
2672 const int slevel = block[ scan_table[i] ];
2675 int run = i - last_non_zero - 1;
2676 last = (i == last_index);
2683 code = get_rl_index(rl, last, run, level);
2684 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2685 if (code == rl->n) {
2687 level1 = level - rl->max_level[last][run];
2690 code = get_rl_index(rl, last, run, level1);
2691 if (code == rl->n) {
2693 put_bits(ac_pb, 1, 1);
2694 if (level > MAX_LEVEL)
2696 run1 = run - rl->max_run[last][level] - 1;
2699 code = get_rl_index(rl, last, run1, level);
2700 if (code == rl->n) {
2703 put_bits(ac_pb, 1, 1);
2704 put_bits(ac_pb, 1, last);
2705 put_bits(ac_pb, 6, run);
2706 put_bits(ac_pb, 1, 1);
2707 put_bits(ac_pb, 12, slevel & 0xfff);
2708 put_bits(ac_pb, 1, 1);
2711 put_bits(ac_pb, 1, 0);
2712 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2713 put_bits(ac_pb, 1, sign);
2717 put_bits(ac_pb, 1, 0);
2718 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2719 put_bits(ac_pb, 1, sign);
2722 put_bits(ac_pb, 1, sign);
2730 static inline int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2731 uint8_t *scan_table)
2733 int i, last_non_zero;
2736 const int last_index = s->block_last_index[n];
2739 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2740 /* mpeg4 based DC predictor */
2741 //mpeg4_encode_dc(dc_pb, intra_dc, n); //FIXME
2742 if(last_index<1) return len;
2745 len_tab = uni_mpeg4_intra_rl_len;
2747 if(last_index<0) return 0;
2750 len_tab = uni_mpeg4_inter_rl_len;
2754 last_non_zero = i - 1;
2755 for (; i < last_index; i++) {
2756 int level = block[ scan_table[i] ];
2758 int run = i - last_non_zero - 1;
2760 if((level&(~127)) == 0){
2761 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2762 len += len_tab[index];
2764 len += 7+2+1+6+1+12+1;
2769 /*if(i<=last_index)*/{
2770 int level = block[ scan_table[i] ];
2771 int run = i - last_non_zero - 1;
2773 if((level&(~127)) == 0){
2774 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2775 len += len_tab[index];
2777 len += 7+2+1+6+1+12+1;
2787 /***********************************************/
2790 static VLC intra_MCBPC_vlc;
2791 static VLC inter_MCBPC_vlc;
2792 static VLC cbpy_vlc;
2794 static VLC dc_lum, dc_chrom;
2795 static VLC sprite_trajectory;
2796 static VLC mb_type_b_vlc;
2797 static VLC h263_mbtype_b_vlc;
2798 static VLC cbpc_b_vlc;
2800 void init_vlc_rl(RLTable *rl, int use_static)
2804 /* Return if static table is already initialized */
2805 if(use_static && rl->rl_vlc[0])
2808 init_vlc(&rl->vlc, 9, rl->n + 1,
2809 &rl->table_vlc[0][1], 4, 2,
2810 &rl->table_vlc[0][0], 4, 2, use_static);
2813 for(q=0; q<32; q++){
2822 rl->rl_vlc[q]= av_mallocz_static(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
2824 rl->rl_vlc[q]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
2825 for(i=0; i<rl->vlc.table_size; i++){
2826 int code= rl->vlc.table[i][0];
2827 int len = rl->vlc.table[i][1];
2830 if(len==0){ // illegal code
2833 }else if(len<0){ //more bits needed
2837 if(code==rl->n){ //esc
2841 run= rl->table_run [code] + 1;
2842 level= rl->table_level[code] * qmul + qadd;
2843 if(code >= rl->last) run+=192;
2846 rl->rl_vlc[q][i].len= len;
2847 rl->rl_vlc[q][i].level= level;
2848 rl->rl_vlc[q][i].run= run;
2855 /* XXX: find a better solution to handle static init */
2856 void h263_decode_init_vlc(MpegEncContext *s)
2858 static int done = 0;
2863 init_vlc(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 9,
2864 intra_MCBPC_bits, 1, 1,
2865 intra_MCBPC_code, 1, 1, 1);
2866 init_vlc(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 28,
2867 inter_MCBPC_bits, 1, 1,
2868 inter_MCBPC_code, 1, 1, 1);
2869 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
2870 &cbpy_tab[0][1], 2, 1,
2871 &cbpy_tab[0][0], 2, 1, 1);
2872 init_vlc(&mv_vlc, MV_VLC_BITS, 33,
2874 &mvtab[0][0], 2, 1, 1);
2875 init_rl(&rl_inter, 1);
2876 init_rl(&rl_intra, 1);
2877 init_rl(&rvlc_rl_inter, 1);
2878 init_rl(&rvlc_rl_intra, 1);
2879 init_rl(&rl_intra_aic, 1);
2880 init_vlc_rl(&rl_inter, 1);
2881 init_vlc_rl(&rl_intra, 1);
2882 init_vlc_rl(&rvlc_rl_inter, 1);
2883 init_vlc_rl(&rvlc_rl_intra, 1);
2884 init_vlc_rl(&rl_intra_aic, 1);
2885 init_vlc(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
2886 &DCtab_lum[0][1], 2, 1,
2887 &DCtab_lum[0][0], 2, 1, 1);
2888 init_vlc(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
2889 &DCtab_chrom[0][1], 2, 1,
2890 &DCtab_chrom[0][0], 2, 1, 1);
2891 init_vlc(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
2892 &sprite_trajectory_tab[0][1], 4, 2,
2893 &sprite_trajectory_tab[0][0], 4, 2, 1);
2894 init_vlc(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
2895 &mb_type_b_tab[0][1], 2, 1,
2896 &mb_type_b_tab[0][0], 2, 1, 1);
2897 init_vlc(&h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15,
2898 &h263_mbtype_b_tab[0][1], 2, 1,
2899 &h263_mbtype_b_tab[0][0], 2, 1, 1);
2900 init_vlc(&cbpc_b_vlc, CBPC_B_VLC_BITS, 4,
2901 &cbpc_b_tab[0][1], 2, 1,
2902 &cbpc_b_tab[0][0], 2, 1, 1);
2907 * Get the GOB height based on picture height.
2909 int ff_h263_get_gob_height(MpegEncContext *s){
2910 if (s->height <= 400)
2912 else if (s->height <= 800)
2918 int ff_h263_decode_mba(MpegEncContext *s)
2923 if(s->mb_num-1 <= ff_mba_max[i]) break;
2925 mb_pos= get_bits(&s->gb, ff_mba_length[i]);
2926 s->mb_x= mb_pos % s->mb_width;
2927 s->mb_y= mb_pos / s->mb_width;
2932 void ff_h263_encode_mba(MpegEncContext *s)
2937 if(s->mb_num-1 <= ff_mba_max[i]) break;
2939 mb_pos= s->mb_x + s->mb_width*s->mb_y;
2940 put_bits(&s->pb, ff_mba_length[i], mb_pos);
2944 * decodes the group of blocks header or slice header.
2945 * @return <0 if an error occured
2947 static int h263_decode_gob_header(MpegEncContext *s)
2949 unsigned int val, gfid, gob_number;
2952 /* Check for GOB Start Code */
2953 val = show_bits(&s->gb, 16);
2957 /* We have a GBSC probably with GSTUFF */
2958 skip_bits(&s->gb, 16); /* Drop the zeros */
2959 left= s->gb.size_in_bits - get_bits_count(&s->gb);
2960 //MN: we must check the bits left or we might end in a infinite loop (or segfault)
2961 for(;left>13; left--){
2962 if(get_bits1(&s->gb)) break; /* Seek the '1' bit */
2967 if(s->h263_slice_structured){
2968 if(get_bits1(&s->gb)==0)
2971 ff_h263_decode_mba(s);
2973 if(s->mb_num > 1583)
2974 if(get_bits1(&s->gb)==0)
2977 s->qscale = get_bits(&s->gb, 5); /* SQUANT */
2978 if(get_bits1(&s->gb)==0)
2980 gfid = get_bits(&s->gb, 2); /* GFID */
2982 gob_number = get_bits(&s->gb, 5); /* GN */
2984 s->mb_y= s->gob_index* gob_number;
2985 gfid = get_bits(&s->gb, 2); /* GFID */
2986 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
2989 if(s->mb_y >= s->mb_height)
2998 static inline void memsetw(short *tab, int val, int n)
3005 #ifdef CONFIG_ENCODERS
3007 void ff_mpeg4_init_partitions(MpegEncContext *s)
3009 uint8_t *start= pbBufPtr(&s->pb);
3010 uint8_t *end= s->pb.buf_end;
3011 int size= end - start;
3012 int pb_size = (((int)start + size/3)&(~3)) - (int)start;
3013 int tex_size= (size - 2*pb_size)&(~3);
3015 set_put_bits_buffer_size(&s->pb, pb_size);
3016 init_put_bits(&s->tex_pb, start + pb_size , tex_size);
3017 init_put_bits(&s->pb2 , start + pb_size + tex_size, pb_size);
3020 void ff_mpeg4_merge_partitions(MpegEncContext *s)
3022 const int pb2_len = put_bits_count(&s->pb2 );
3023 const int tex_pb_len= put_bits_count(&s->tex_pb);
3024 const int bits= put_bits_count(&s->pb);
3026 if(s->pict_type==I_TYPE){
3027 put_bits(&s->pb, 19, DC_MARKER);
3028 s->misc_bits+=19 + pb2_len + bits - s->last_bits;
3029 s->i_tex_bits+= tex_pb_len;
3031 put_bits(&s->pb, 17, MOTION_MARKER);
3032 s->misc_bits+=17 + pb2_len;
3033 s->mv_bits+= bits - s->last_bits;
3034 s->p_tex_bits+= tex_pb_len;
3037 flush_put_bits(&s->pb2);
3038 flush_put_bits(&s->tex_pb);
3040 set_put_bits_buffer_size(&s->pb, s->pb2.buf_end - s->pb.buf);
3041 ff_copy_bits(&s->pb, s->pb2.buf , pb2_len);
3042 ff_copy_bits(&s->pb, s->tex_pb.buf, tex_pb_len);
3043 s->last_bits= put_bits_count(&s->pb);
3046 #endif //CONFIG_ENCODERS
3048 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
3049 switch(s->pict_type){
3054 return s->f_code+15;
3056 return FFMAX(FFMAX(s->f_code, s->b_code)+15, 17);
3062 #ifdef CONFIG_ENCODERS
3064 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
3066 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
3068 put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0);
3069 put_bits(&s->pb, 1, 1);
3071 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
3072 put_bits(&s->pb, s->quant_precision, s->qscale);
3073 put_bits(&s->pb, 1, 0); /* no HEC */
3076 #endif //CONFIG_ENCODERS
3079 * check if the next stuff is a resync marker or the end.
3082 static inline int mpeg4_is_resync(MpegEncContext *s){
3083 const int bits_count= get_bits_count(&s->gb);
3085 if(s->workaround_bugs&FF_BUG_NO_PADDING){
3089 if(bits_count + 8 >= s->gb.size_in_bits){
3090 int v= show_bits(&s->gb, 8);
3091 v|= 0x7F >> (7-(bits_count&7));
3096 if(show_bits(&s->gb, 16) == ff_mpeg4_resync_prefix[bits_count&7]){
3098 GetBitContext gb= s->gb;
3100 skip_bits(&s->gb, 1);
3101 align_get_bits(&s->gb);
3103 for(len=0; len<32; len++){
3104 if(get_bits1(&s->gb)) break;
3109 if(len>=ff_mpeg4_get_video_packet_prefix_length(s))
3117 * decodes the next video packet.
3118 * @return <0 if something went wrong
3120 static int mpeg4_decode_video_packet_header(MpegEncContext *s)
3122 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
3123 int header_extension=0, mb_num, len;
3125 /* is there enough space left for a video packet + header */
3126 if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1;
3128 for(len=0; len<32; len++){
3129 if(get_bits1(&s->gb)) break;
3132 if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
3133 av_log(s->avctx, AV_LOG_ERROR, "marker does not match f_code\n");
3137 if(s->shape != RECT_SHAPE){
3138 header_extension= get_bits1(&s->gb);
3139 //FIXME more stuff here
3142 mb_num= get_bits(&s->gb, mb_num_bits);
3143 if(mb_num>=s->mb_num){
3144 av_log(s->avctx, AV_LOG_ERROR, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);
3147 if(s->pict_type == B_TYPE){
3148 while(s->next_picture.mbskip_table[ s->mb_index2xy[ mb_num ] ]) mb_num++;
3149 if(mb_num >= s->mb_num) return -1; // slice contains just skiped MBs which where allready decoded
3152 s->mb_x= mb_num % s->mb_width;
3153 s->mb_y= mb_num / s->mb_width;
3155 if(s->shape != BIN_ONLY_SHAPE){
3156 int qscale= get_bits(&s->gb, s->quant_precision);
3158 s->chroma_qscale=s->qscale= qscale;
3161 if(s->shape == RECT_SHAPE){
3162 header_extension= get_bits1(&s->gb);
3164 if(header_extension){
3168 while (get_bits1(&s->gb) != 0)
3171 check_marker(&s->gb, "before time_increment in video packed header");
3172 time_increment= get_bits(&s->gb, s->time_increment_bits);
3173 check_marker(&s->gb, "before vop_coding_type in video packed header");
3175 skip_bits(&s->gb, 2); /* vop coding type */
3176 //FIXME not rect stuff here
3178 if(s->shape != BIN_ONLY_SHAPE){
3179 skip_bits(&s->gb, 3); /* intra dc vlc threshold */
3180 //FIXME dont just ignore everything
3181 if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3182 mpeg4_decode_sprite_trajectory(s, &s->gb);
3183 av_log(s->avctx, AV_LOG_ERROR, "untested\n");
3186 //FIXME reduced res stuff here
3188 if (s->pict_type != I_TYPE) {
3189 int f_code = get_bits(&s->gb, 3); /* fcode_for */
3191 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (f_code=0)\n");
3194 if (s->pict_type == B_TYPE) {
3195 int b_code = get_bits(&s->gb, 3);
3197 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (b_code=0)\n");
3202 //FIXME new-pred stuff
3204 //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));
3209 void ff_mpeg4_clean_buffers(MpegEncContext *s)
3211 int c_wrap, c_xy, l_wrap, l_xy;
3213 l_wrap= s->b8_stride;
3214 l_xy= (2*s->mb_y-1)*l_wrap + s->mb_x*2 - 1;
3215 c_wrap= s->mb_stride;
3216 c_xy= (s->mb_y-1)*c_wrap + s->mb_x - 1;
3220 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
3221 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
3222 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
3226 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t));
3227 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
3228 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
3231 // we cant clear the MVs as they might be needed by a b frame
3232 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t));
3233 // memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
3234 s->last_mv[0][0][0]=
3235 s->last_mv[0][0][1]=
3236 s->last_mv[1][0][0]=
3237 s->last_mv[1][0][1]= 0;
3241 * decodes the group of blocks / video packet header.
3242 * @return <0 if no resync found
3244 int ff_h263_resync(MpegEncContext *s){
3247 if(s->codec_id==CODEC_ID_MPEG4){
3249 align_get_bits(&s->gb);
3252 if(show_bits(&s->gb, 16)==0){
3253 if(s->codec_id==CODEC_ID_MPEG4)
3254 ret= mpeg4_decode_video_packet_header(s);
3256 ret= h263_decode_gob_header(s);
3260 //ok, its not where its supposed to be ...
3261 s->gb= s->last_resync_gb;
3262 align_get_bits(&s->gb);
3263 left= s->gb.size_in_bits - get_bits_count(&s->gb);
3265 for(;left>16+1+5+5; left-=8){
3266 if(show_bits(&s->gb, 16)==0){
3267 GetBitContext bak= s->gb;
3269 if(s->codec_id==CODEC_ID_MPEG4)
3270 ret= mpeg4_decode_video_packet_header(s);
3272 ret= h263_decode_gob_header(s);
3278 skip_bits(&s->gb, 8);
3285 * gets the average motion vector for a GMC MB.
3286 * @param n either 0 for the x component or 1 for y
3287 * @returns the average MV for a GMC MB
3289 static inline int get_amv(MpegEncContext *s, int n){
3290 int x, y, mb_v, sum, dx, dy, shift;
3291 int len = 1 << (s->f_code + 4);
3292 const int a= s->sprite_warping_accuracy;
3294 if(s->workaround_bugs & FF_BUG_AMV)
3295 len >>= s->quarter_sample;
3297 if(s->real_sprite_warping_points==1){
3298 if(s->divx_version==500 && s->divx_build==413)
3299 sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample));
3301 sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a);
3303 dx= s->sprite_delta[n][0];
3304 dy= s->sprite_delta[n][1];
3305 shift= s->sprite_shift[0];
3306 if(n) dy -= 1<<(shift + a + 1);
3307 else dx -= 1<<(shift + a + 1);
3308 mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16;
3311 for(y=0; y<16; y++){
3315 //XXX FIXME optimize
3316 for(x=0; x<16; x++){
3321 sum= RSHIFT(sum, a+8-s->quarter_sample);
3324 if (sum < -len) sum= -len;
3325 else if (sum >= len) sum= len-1;
3331 * decodes first partition.
3332 * @return number of MBs decoded or <0 if an error occured
3334 static int mpeg4_decode_partition_a(MpegEncContext *s){
3336 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3338 /* decode first partition */
3340 s->first_slice_line=1;
3341 for(; s->mb_y<s->mb_height; s->mb_y++){
3342 ff_init_block_index(s);
3343 for(; s->mb_x<s->mb_width; s->mb_x++){
3344 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3349 ff_update_block_index(s);
3350 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3351 s->first_slice_line=0;
3353 if(s->pict_type==I_TYPE){
3357 if(show_bits_long(&s->gb, 19)==DC_MARKER){
3361 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
3363 av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
3368 s->cbp_table[xy]= cbpc & 3;
3369 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3373 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3375 s->current_picture.qscale_table[xy]= s->qscale;
3377 s->mbintra_table[xy]= 1;
3380 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3382 av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3386 if(dc_pred_dir) dir|=1;
3388 s->pred_dir_table[xy]= dir;
3389 }else{ /* P/S_TYPE */
3390 int mx, my, pred_x, pred_y, bits;
3391 int16_t * const mot_val= s->current_picture.motion_val[0][s->block_index[0]];
3392 const int stride= s->b8_stride*2;
3395 bits= show_bits(&s->gb, 17);
3396 if(bits==MOTION_MARKER){
3402 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3403 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
3407 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3410 mot_val[0 ]= mot_val[2 ]=
3411 mot_val[0+stride]= mot_val[2+stride]= mx;
3412 mot_val[1 ]= mot_val[3 ]=
3413 mot_val[1+stride]= mot_val[3+stride]= my;
3415 if(s->mbintra_table[xy])
3416 ff_clean_intra_table_entries(s);
3420 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3422 av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
3428 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
3430 s->mb_intra = ((cbpc & 4) != 0);
3433 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3434 s->mbintra_table[xy]= 1;
3435 mot_val[0 ]= mot_val[2 ]=
3436 mot_val[0+stride]= mot_val[2+stride]= 0;
3437 mot_val[1 ]= mot_val[3 ]=
3438 mot_val[1+stride]= mot_val[3+stride]= 0;
3440 if(s->mbintra_table[xy])
3441 ff_clean_intra_table_entries(s);
3443 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
3444 s->mcsel= get_bits1(&s->gb);
3447 if ((cbpc & 16) == 0) {
3448 /* 16x16 motion prediction */
3450 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3452 mx = h263_decode_motion(s, pred_x, s->f_code);
3456 my = h263_decode_motion(s, pred_y, s->f_code);
3459 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3463 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
3466 mot_val[0 ]= mot_val[2 ] =
3467 mot_val[0+stride]= mot_val[2+stride]= mx;
3468 mot_val[1 ]= mot_val[3 ]=
3469 mot_val[1+stride]= mot_val[3+stride]= my;
3472 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3474 int16_t *mot_val= h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3475 mx = h263_decode_motion(s, pred_x, s->f_code);
3479 my = h263_decode_motion(s, pred_y, s->f_code);
3496 * decode second partition.
3497 * @return <0 if an error occured
3499 static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
3501 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3503 s->mb_x= s->resync_mb_x;
3504 s->first_slice_line=1;
3505 for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
3506 ff_init_block_index(s);
3507 for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
3508 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3511 ff_update_block_index(s);
3512 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3513 s->first_slice_line=0;
3515 if(s->pict_type==I_TYPE){
3516 int ac_pred= get_bits1(&s->gb);
3517 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3519 av_log(s->avctx, AV_LOG_ERROR, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3523 s->cbp_table[xy]|= cbpy<<2;
3524 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3525 }else{ /* P || S_TYPE */
3526 if(IS_INTRA(s->current_picture.mb_type[xy])){
3528 int ac_pred = get_bits1(&s->gb);
3529 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3532 av_log(s->avctx, AV_LOG_ERROR, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3536 if(s->cbp_table[xy] & 8) {
3537 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3539 s->current_picture.qscale_table[xy]= s->qscale;
3543 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3545 av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3549 if(dc_pred_dir) dir|=1;
3551 s->cbp_table[xy]&= 3; //remove dquant
3552 s->cbp_table[xy]|= cbpy<<2;
3553 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3554 s->pred_dir_table[xy]= dir;
3555 }else if(IS_SKIP(s->current_picture.mb_type[xy])){
3556 s->current_picture.qscale_table[xy]= s->qscale;
3557 s->cbp_table[xy]= 0;
3559 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3562 av_log(s->avctx, AV_LOG_ERROR, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3566 if(s->cbp_table[xy] & 8) {
3567 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3569 s->current_picture.qscale_table[xy]= s->qscale;
3571 s->cbp_table[xy]&= 3; //remove dquant
3572 s->cbp_table[xy]|= (cbpy^0xf)<<2;
3576 if(mb_num >= mb_count) return 0;
3583 * decodes the first & second partition
3584 * @return <0 if error (and sets error type in the error_status_table)
3586 int ff_mpeg4_decode_partitions(MpegEncContext *s)
3589 const int part_a_error= s->pict_type==I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR;
3590 const int part_a_end = s->pict_type==I_TYPE ? (DC_END |MV_END) : MV_END;
3592 mb_num= mpeg4_decode_partition_a(s);
3594 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3598 if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
3599 av_log(s->avctx, AV_LOG_ERROR, "slice below monitor ...\n");
3600 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3604 s->mb_num_left= mb_num;
3606 if(s->pict_type==I_TYPE){
3607 while(show_bits(&s->gb, 9) == 1)
3608 skip_bits(&s->gb, 9);
3609 if(get_bits_long(&s->gb, 19)!=DC_MARKER){
3610 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
3614 while(show_bits(&s->gb, 10) == 1)
3615 skip_bits(&s->gb, 10);
3616 if(get_bits(&s->gb, 17)!=MOTION_MARKER){
3617 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
3621 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end);
3623 if( mpeg4_decode_partition_b(s, mb_num) < 0){
3624 if(s->pict_type==P_TYPE)
3625 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR);
3628 if(s->pict_type==P_TYPE)
3629 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END);
3636 * decode partition C of one MB.
3637 * @return <0 if an error occured
3639 static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64])
3642 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3644 mb_type= s->current_picture.mb_type[xy];
3645 cbp = s->cbp_table[xy];
3647 if(s->current_picture.qscale_table[xy] != s->qscale){
3648 ff_set_qscale(s, s->current_picture.qscale_table[xy] );
3651 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
3654 s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0];
3655 s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1];
3657 s->mb_intra = IS_INTRA(mb_type);
3659 if (IS_SKIP(mb_type)) {
3662 s->block_last_index[i] = -1;
3663 s->mv_dir = MV_DIR_FORWARD;
3664 s->mv_type = MV_TYPE_16X16;
3665 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3672 }else if(s->mb_intra){
3673 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3674 }else if(!s->mb_intra){
3675 // s->mcsel= 0; //FIXME do we need to init that
3677 s->mv_dir = MV_DIR_FORWARD;
3678 if (IS_8X8(mb_type)) {
3679 s->mv_type = MV_TYPE_8X8;
3681 s->mv_type = MV_TYPE_16X16;
3684 } else { /* I-Frame */
3686 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3689 if (!IS_SKIP(mb_type)) {
3691 /* decode each block */
3692 for (i = 0; i < 6; i++) {
3693 if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){
3694 av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra);
3701 /* per-MB end of slice check */
3703 if(--s->mb_num_left <= 0){
3704 //printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb));
3705 if(mpeg4_is_resync(s))
3710 if(mpeg4_is_resync(s)){
3711 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
3712 if(s->cbp_table[xy+delta])
3720 * read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :)
3722 static void preview_obmc(MpegEncContext *s){
3723 GetBitContext gb= s->gb;
3725 int cbpc, i, pred_x, pred_y, mx, my;
3727 const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
3728 const int stride= s->b8_stride*2;
3731 s->block_index[i]+= 2;
3733 s->block_index[i]+= 1;
3736 assert(s->pict_type == P_TYPE);
3739 if (get_bits1(&s->gb)) {
3741 mot_val = s->current_picture.motion_val[0][ s->block_index[0] ];
3742 mot_val[0 ]= mot_val[2 ]=
3743 mot_val[0+stride]= mot_val[2+stride]= 0;
3744 mot_val[1 ]= mot_val[3 ]=
3745 mot_val[1+stride]= mot_val[3+stride]= 0;
3747 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3750 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3754 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3756 get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3758 if(s->modified_quant){
3759 if(get_bits1(&s->gb)) skip_bits(&s->gb, 1);
3760 else skip_bits(&s->gb, 5);
3762 skip_bits(&s->gb, 2);
3765 if ((cbpc & 16) == 0) {
3766 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3767 /* 16x16 motion prediction */
3768 mot_val= h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3770 mx = h263p_decode_umotion(s, pred_x);
3772 mx = h263_decode_motion(s, pred_x, 1);
3775 my = h263p_decode_umotion(s, pred_y);
3777 my = h263_decode_motion(s, pred_y, 1);
3779 mot_val[0 ]= mot_val[2 ]=
3780 mot_val[0+stride]= mot_val[2+stride]= mx;
3781 mot_val[1 ]= mot_val[3 ]=
3782 mot_val[1+stride]= mot_val[3+stride]= my;
3784 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3786 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3788 mx = h263p_decode_umotion(s, pred_x);
3790 mx = h263_decode_motion(s, pred_x, 1);
3793 my = h263p_decode_umotion(s, pred_y);
3795 my = h263_decode_motion(s, pred_y, 1);
3796 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3797 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3806 s->block_index[i]-= 2;
3808 s->block_index[i]-= 1;
3814 static void h263_decode_dquant(MpegEncContext *s){
3815 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3817 if(s->modified_quant){
3818 if(get_bits1(&s->gb))
3819 s->qscale= modified_quant_tab[get_bits1(&s->gb)][ s->qscale ];
3821 s->qscale= get_bits(&s->gb, 5);
3823 s->qscale += quant_tab[get_bits(&s->gb, 2)];
3824 ff_set_qscale(s, s->qscale);
3827 int ff_h263_decode_mb(MpegEncContext *s,
3828 DCTELEM block[6][64])
3830 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
3832 const int xy= s->mb_x + s->mb_y * s->mb_stride;
3834 assert(!s->h263_pred);
3836 if (s->pict_type == P_TYPE) {
3838 if (get_bits1(&s->gb)) {
3842 s->block_last_index[i] = -1;
3843 s->mv_dir = MV_DIR_FORWARD;
3844 s->mv_type = MV_TYPE_16X16;
3845 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3848 s->mb_skiped = !(s->obmc | s->loop_filter);
3851 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3852 //fprintf(stderr, "\tCBPC: %d", cbpc);
3854 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
3860 s->mb_intra = ((cbpc & 4) != 0);
3861 if (s->mb_intra) goto intra;
3863 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3865 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
3868 cbp = (cbpc & 3) | (cbpy << 2);
3870 h263_decode_dquant(s);
3873 s->mv_dir = MV_DIR_FORWARD;
3874 if ((cbpc & 16) == 0) {
3875 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3876 /* 16x16 motion prediction */
3877 s->mv_type = MV_TYPE_16X16;
3878 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3880 mx = h263p_decode_umotion(s, pred_x);
3882 mx = h263_decode_motion(s, pred_x, 1);
3888 my = h263p_decode_umotion(s, pred_y);
3890 my = h263_decode_motion(s, pred_y, 1);
3894 s->mv[0][0][0] = mx;
3895 s->mv[0][0][1] = my;
3897 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3898 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3900 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3901 s->mv_type = MV_TYPE_8X8;
3903 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3905 mx = h263p_decode_umotion(s, pred_x);
3907 mx = h263_decode_motion(s, pred_x, 1);
3912 my = h263p_decode_umotion(s, pred_y);
3914 my = h263_decode_motion(s, pred_y, 1);
3917 s->mv[0][i][0] = mx;
3918 s->mv[0][i][1] = my;
3919 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3920 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3926 /* decode each block */
3927 for (i = 0; i < 6; i++) {
3928 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
3934 if(s->pict_type == P_TYPE && s->mb_x+1<s->mb_width && s->mb_num_left != 1)
3937 } else if(s->pict_type==B_TYPE) {
3939 const int stride= s->b8_stride;
3940 int16_t *mot_val0 = s->current_picture.motion_val[0][ 2*(s->mb_x + s->mb_y*stride) ];
3941 int16_t *mot_val1 = s->current_picture.motion_val[1][ 2*(s->mb_x + s->mb_y*stride) ];
3942 // const int mv_xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
3945 mot_val0[0 ]= mot_val0[2 ]= mot_val0[0+2*stride]= mot_val0[2+2*stride]=
3946 mot_val0[1 ]= mot_val0[3 ]= mot_val0[1+2*stride]= mot_val0[3+2*stride]=
3947 mot_val1[0 ]= mot_val1[2 ]= mot_val1[0+2*stride]= mot_val1[2+2*stride]=
3948 mot_val1[1 ]= mot_val1[3 ]= mot_val1[1+2*stride]= mot_val1[3+2*stride]= 0;
3951 mb_type= get_vlc2(&s->gb, h263_mbtype_b_vlc.table, H263_MBTYPE_B_VLC_BITS, 2);
3953 av_log(s->avctx, AV_LOG_ERROR, "b mb_type damaged at %d %d\n", s->mb_x, s->mb_y);
3957 mb_type= h263_mb_type_b_map[ mb_type ];
3960 s->mb_intra = IS_INTRA(mb_type);
3961 if(HAS_CBP(mb_type)){
3962 cbpc = get_vlc2(&s->gb, cbpc_b_vlc.table, CBPC_B_VLC_BITS, 1);
3964 dquant = IS_QUANT(mb_type);
3968 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3971 av_log(s->avctx, AV_LOG_ERROR, "b cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
3975 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
3978 cbp = (cbpc & 3) | (cbpy << 2);
3982 assert(!s->mb_intra);
3984 if(IS_QUANT(mb_type)){
3985 h263_decode_dquant(s);
3988 if(IS_DIRECT(mb_type)){
3989 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3990 mb_type |= ff_mpeg4_set_direct_mv(s, 0, 0);
3993 s->mv_type= MV_TYPE_16X16;
3996 if(USES_LIST(mb_type, 0)){
3997 int16_t *mot_val= h263_pred_motion(s, 0, 0, &mx, &my);
3998 s->mv_dir = MV_DIR_FORWARD;
4000 mx = h263_decode_motion(s, mx, 1);
4001 my = h263_decode_motion(s, my, 1);
4003 s->mv[0][0][0] = mx;
4004 s->mv[0][0][1] = my;
4005 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
4006 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
4009 if(USES_LIST(mb_type, 1)){
4010 int16_t *mot_val= h263_pred_motion(s, 0, 1, &mx, &my);
4011 s->mv_dir |= MV_DIR_BACKWARD;
4013 mx = h263_decode_motion(s, mx, 1);
4014 my = h263_decode_motion(s, my, 1);
4016 s->mv[1][0][0] = mx;
4017 s->mv[1][0][1] = my;
4018 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
4019 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
4023 s->current_picture.mb_type[xy]= mb_type;
4025 /* decode each block */
4026 for (i = 0; i < 6; i++) {
4027 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
4031 } else { /* I-Frame */
4033 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
4035 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4043 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
4045 s->ac_pred = get_bits1(&s->gb);
4047 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
4049 s->h263_aic_dir = get_bits1(&s->gb);
4054 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4056 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4059 cbp = (cbpc & 3) | (cbpy << 2);
4061 h263_decode_dquant(s);
4064 /* decode each block */
4065 for (i = 0; i < 6; i++) {
4066 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
4073 /* per-MB end of slice check */
4075 int v= show_bits(&s->gb, 16);
4077 if(get_bits_count(&s->gb) + 16 > s->gb.size_in_bits){
4078 v>>= get_bits_count(&s->gb) + 16 - s->gb.size_in_bits;
4088 int ff_mpeg4_decode_mb(MpegEncContext *s,
4089 DCTELEM block[6][64])
4091 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
4093 static int8_t quant_tab[4] = { -1, -2, 1, 2 };
4094 const int xy= s->mb_x + s->mb_y * s->mb_stride;
4096 assert(s->h263_pred);
4098 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
4100 if (get_bits1(&s->gb)) {
4104 s->block_last_index[i] = -1;
4105 s->mv_dir = MV_DIR_FORWARD;
4106 s->mv_type = MV_TYPE_16X16;
4107 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
4108 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
4110 s->mv[0][0][0]= get_amv(s, 0);
4111 s->mv[0][0][1]= get_amv(s, 1);
4115 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4123 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
4124 //fprintf(stderr, "\tCBPC: %d", cbpc);
4126 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4132 s->mb_intra = ((cbpc & 4) != 0);
4133 if (s->mb_intra) goto intra;
4135 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
4136 s->mcsel= get_bits1(&s->gb);
4138 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1) ^ 0x0F;
4140 cbp = (cbpc & 3) | (cbpy << 2);
4142 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
4144 if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE)))
4145 s->interlaced_dct= get_bits1(&s->gb);
4147 s->mv_dir = MV_DIR_FORWARD;
4148 if ((cbpc & 16) == 0) {
4150 s->current_picture.mb_type[xy]= MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
4151 /* 16x16 global motion prediction */
4152 s->mv_type = MV_TYPE_16X16;
4155 s->mv[0][0][0] = mx;
4156 s->mv[0][0][1] = my;
4157 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
4158 s->current_picture.mb_type[xy]= MB_TYPE_16x8 | MB_TYPE_L0 | MB_TYPE_INTERLACED;
4159 /* 16x8 field motion prediction */
4160 s->mv_type= MV_TYPE_FIELD;
4162 s->field_select[0][0]= get_bits1(&s->gb);
4163 s->field_select[0][1]= get_bits1(&s->gb);
4165 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4168 mx = h263_decode_motion(s, pred_x, s->f_code);
4172 my = h263_decode_motion(s, pred_y/2, s->f_code);
4176 s->mv[0][i][0] = mx;
4177 s->mv[0][i][1] = my;
4180 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
4181 /* 16x16 motion prediction */
4182 s->mv_type = MV_TYPE_16X16;
4183 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4184 mx = h263_decode_motion(s, pred_x, s->f_code);
4189 my = h263_decode_motion(s, pred_y, s->f_code);
4193 s->mv[0][0][0] = mx;
4194 s->mv[0][0][1] = my;
4197 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
4198 s->mv_type = MV_TYPE_8X8;
4200 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
4201 mx = h263_decode_motion(s, pred_x, s->f_code);
4205 my = h263_decode_motion(s, pred_y, s->f_code);
4208 s->mv[0][i][0] = mx;
4209 s->mv[0][i][1] = my;
4214 } else if(s->pict_type==B_TYPE) {
4215 int modb1; // first bit of modb
4216 int modb2; // second bit of modb
4219 s->mb_intra = 0; //B-frames never contain intra blocks
4220 s->mcsel=0; // ... true gmc blocks
4224 s->last_mv[i][0][0]=
4225 s->last_mv[i][0][1]=
4226 s->last_mv[i][1][0]=
4227 s->last_mv[i][1][1]= 0;
4231 /* if we skipped it in the future P Frame than skip it now too */
4232 s->mb_skiped= s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]; // Note, skiptab=0 if last was GMC
4237 s->block_last_index[i] = -1;
4239 s->mv_dir = MV_DIR_FORWARD;
4240 s->mv_type = MV_TYPE_16X16;
4245 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4249 modb1= get_bits1(&s->gb);
4251 mb_type= MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1; //like MB_TYPE_B_DIRECT but no vectors coded
4254 modb2= get_bits1(&s->gb);
4255 mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
4257 av_log(s->avctx, AV_LOG_ERROR, "illegal MB_type\n");
4260 mb_type= mb_type_b_map[ mb_type ];
4262 else cbp= get_bits(&s->gb, 6);
4264 if ((!IS_DIRECT(mb_type)) && cbp) {
4265 if(get_bits1(&s->gb)){
4266 ff_set_qscale(s, s->qscale + get_bits1(&s->gb)*4 - 2);
4270 if(!s->progressive_sequence){
4272 s->interlaced_dct= get_bits1(&s->gb);
4274 if(!IS_DIRECT(mb_type) && get_bits1(&s->gb)){
4275 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
4276 mb_type &= ~MB_TYPE_16x16;
4278 if(USES_LIST(mb_type, 0)){
4279 s->field_select[0][0]= get_bits1(&s->gb);
4280 s->field_select[0][1]= get_bits1(&s->gb);
4282 if(USES_LIST(mb_type, 1)){
4283 s->field_select[1][0]= get_bits1(&s->gb);
4284 s->field_select[1][1]= get_bits1(&s->gb);
4290 if((mb_type & (MB_TYPE_DIRECT2|MB_TYPE_INTERLACED)) == 0){
4291 s->mv_type= MV_TYPE_16X16;
4293 if(USES_LIST(mb_type, 0)){
4294 s->mv_dir = MV_DIR_FORWARD;
4296 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
4297 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
4298 s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
4299 s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
4302 if(USES_LIST(mb_type, 1)){
4303 s->mv_dir |= MV_DIR_BACKWARD;
4305 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
4306 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
4307 s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
4308 s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
4310 }else if(!IS_DIRECT(mb_type)){
4311 s->mv_type= MV_TYPE_FIELD;
4313 if(USES_LIST(mb_type, 0)){
4314 s->mv_dir = MV_DIR_FORWARD;
4317 mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code);
4318 my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
4319 s->last_mv[0][i][0]= s->mv[0][i][0] = mx;
4320 s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
4324 if(USES_LIST(mb_type, 1)){
4325 s->mv_dir |= MV_DIR_BACKWARD;
4328 mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code);
4329 my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
4330 s->last_mv[1][i][0]= s->mv[1][i][0] = mx;
4331 s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
4337 if(IS_DIRECT(mb_type)){
4338 if(IS_SKIP(mb_type))
4341 mx = h263_decode_motion(s, 0, 1);
4342 my = h263_decode_motion(s, 0, 1);
4345 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4346 mb_type |= ff_mpeg4_set_direct_mv(s, mx, my);
4348 s->current_picture.mb_type[xy]= mb_type;
4349 } else { /* I-Frame */
4351 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
4353 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4361 s->ac_pred = get_bits1(&s->gb);
4363 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
4365 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
4367 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4369 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4372 cbp = (cbpc & 3) | (cbpy << 2);
4374 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
4377 if(!s->progressive_sequence)
4378 s->interlaced_dct= get_bits1(&s->gb);
4380 /* decode each block */
4381 for (i = 0; i < 6; i++) {
4382 if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0)
4389 /* decode each block */
4390 for (i = 0; i < 6; i++) {
4391 if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0)
4397 /* per-MB end of slice check */
4398 if(s->codec_id==CODEC_ID_MPEG4){
4399 if(mpeg4_is_resync(s)){
4400 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
4401 if(s->pict_type==B_TYPE && s->next_picture.mbskip_table[xy + delta])
4410 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
4412 int code, val, sign, shift, l;
4413 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
4420 sign = get_bits1(&s->gb);
4424 val = (val - 1) << shift;
4425 val |= get_bits(&s->gb, shift);
4432 /* modulo decoding */
4433 if (!s->h263_long_vectors) {
4434 l = INT_BIT - 5 - f_code;
4437 /* horrible h263 long vector mode */
4438 if (pred < -31 && val < -63)
4440 if (pred > 32 && val > 63)
4447 /* Decodes RVLC of H.263+ UMV */
4448 static int h263p_decode_umotion(MpegEncContext * s, int pred)
4452 if (get_bits1(&s->gb)) /* Motion difference = 0 */
4455 code = 2 + get_bits1(&s->gb);
4457 while (get_bits1(&s->gb))
4460 code += get_bits1(&s->gb);
4465 code = (sign) ? (pred - code) : (pred + code);
4467 fprintf(stderr,"H.263+ UMV Motion = %d\n", code);
4473 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
4476 int code, level, i, j, last, run;
4477 RLTable *rl = &rl_inter;
4478 const uint8_t *scan_table;
4479 GetBitContext gb= s->gb;
4481 scan_table = s->intra_scantable.permutated;
4482 if (s->h263_aic && s->mb_intra) {
4486 if (s->h263_aic_dir)
4487 scan_table = s->intra_v_scantable.permutated; /* left */
4489 scan_table = s->intra_h_scantable.permutated; /* top */
4491 } else if (s->mb_intra) {
4493 if(s->codec_id == CODEC_ID_RV10){
4494 if (s->rv10_version == 3 && s->pict_type == I_TYPE) {
4495 int component, diff;
4496 component = (n <= 3 ? 0 : n - 4 + 1);
4497 level = s->last_dc[component];
4498 if (s->rv10_first_dc_coded[component]) {
4499 diff = rv_decode_dc(s, n);
4503 level = level & 0xff; /* handle wrap round */
4504 s->last_dc[component] = level;
4506 s->rv10_first_dc_coded[component] = 1;
4509 level = get_bits(&s->gb, 8);
4514 level = get_bits(&s->gb, 8);
4515 if((level&0x7F) == 0){
4516 av_log(s->avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y);
4517 if(s->error_resilience >= FF_ER_COMPLIANT)
4529 if (s->mb_intra && s->h263_aic)
4531 s->block_last_index[n] = i - 1;
4536 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
4538 av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
4541 if (code == rl->n) {
4543 if (s->h263_flv > 1) {
4544 int is11 = get_bits1(&s->gb);
4545 last = get_bits1(&s->gb);
4546 run = get_bits(&s->gb, 6);
4548 level = get_sbits(&s->gb, 11);
4550 level = get_sbits(&s->gb, 7);
4553 last = get_bits1(&s->gb);
4554 run = get_bits(&s->gb, 6);
4555 level = (int8_t)get_bits(&s->gb, 8);
4557 if (s->codec_id == CODEC_ID_RV10) {
4558 /* XXX: should patch encoder too */
4559 level = get_sbits(&s->gb, 12);
4561 level = get_bits(&s->gb, 5);
4562 level |= get_sbits(&s->gb, 6)<<5;
4567 run = rl->table_run[code];
4568 level = rl->table_level[code];
4569 last = code >= rl->last;
4570 if (get_bits1(&s->gb))
4575 if(s->alt_inter_vlc && rl == &rl_inter && !s->mb_intra){
4576 //looks like a hack but no, its the way its supposed to work ...
4580 memset(block, 0, sizeof(DCTELEM)*64);
4583 av_log(s->avctx, AV_LOG_ERROR, "run overflow at %dx%d i:%d\n", s->mb_x, s->mb_y, s->mb_intra);
4593 if (s->mb_intra && s->h263_aic) {
4594 h263_pred_acdc(s, block, n);
4597 s->block_last_index[n] = i;
4602 * decodes the dc value.
4603 * @param n block index (0-3 are luma, 4-5 are chroma)
4604 * @param dir_ptr the prediction direction will be stored here
4605 * @return the quantized dc
4607 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
4612 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
4614 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
4615 if (code < 0 || code > 9 /* && s->nbit<9 */){
4616 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
4624 level= 2*get_bits1(&s->gb)-1;
4626 if(get_bits1(&s->gb))
4627 level = get_bits(&s->gb, code-1) + (1<<(code-1));
4629 level = -get_bits(&s->gb, code-1) - (1<<(code-1));
4632 level = get_xbits(&s->gb, code);
4636 if(get_bits1(&s->gb)==0){ /* marker */
4637 if(s->error_resilience>=2){
4638 av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n");
4645 return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0);
4650 * @return <0 if an error occured
4652 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
4653 int n, int coded, int intra, int rvlc)
4655 int level, i, last, run;
4658 RL_VLC_ELEM * rl_vlc;
4659 const uint8_t * scan_table;
4662 //Note intra & rvlc should be optimized away if this is inlined
4665 if(s->qscale < s->intra_dc_threshold){
4667 if(s->partitioned_frame){
4668 level = s->dc_val[0][ s->block_index[n] ];
4669 if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale);
4670 else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale);
4671 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32;
4673 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
4686 rl = &rvlc_rl_intra;
4687 rl_vlc = rvlc_rl_intra.rl_vlc[0];
4690 rl_vlc = rl_intra.rl_vlc[0];
4693 if (dc_pred_dir == 0)
4694 scan_table = s->intra_v_scantable.permutated; /* left */
4696 scan_table = s->intra_h_scantable.permutated; /* top */
4698 scan_table = s->intra_scantable.permutated;
4705 s->block_last_index[n] = i;
4708 if(rvlc) rl = &rvlc_rl_inter;
4709 else rl = &rl_inter;
4711 scan_table = s->intra_scantable.permutated;
4717 rl_vlc = rvlc_rl_inter.rl_vlc[0];
4719 rl_vlc = rl_inter.rl_vlc[0];
4722 qmul = s->qscale << 1;
4723 qadd = (s->qscale - 1) | 1;
4725 rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale];
4727 rl_vlc = rl_inter.rl_vlc[s->qscale];
4732 OPEN_READER(re, &s->gb);
4734 UPDATE_CACHE(re, &s->gb);
4735 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
4739 if(SHOW_UBITS(re, &s->gb, 1)==0){
4740 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n");
4742 }; SKIP_CACHE(re, &s->gb, 1);
4744 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4745 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4746 SKIP_COUNTER(re, &s->gb, 1+1+6);
4747 UPDATE_CACHE(re, &s->gb);
4749 if(SHOW_UBITS(re, &s->gb, 1)==0){
4750 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n");
4752 }; SKIP_CACHE(re, &s->gb, 1);
4754 level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11);
4756 if(SHOW_UBITS(re, &s->gb, 5)!=0x10){
4757 av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n");
4759 }; SKIP_CACHE(re, &s->gb, 5);
4761 level= level * qmul + qadd;
4762 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1);
4763 SKIP_COUNTER(re, &s->gb, 1+11+5+1);
4769 cache= GET_CACHE(re, &s->gb);
4772 cache ^= 0xC0000000;
4774 if (cache&0x80000000) {
4775 if (cache&0x40000000) {
4777 SKIP_CACHE(re, &s->gb, 2);
4778 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4779 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4780 SKIP_COUNTER(re, &s->gb, 2+1+6);
4781 UPDATE_CACHE(re, &s->gb);
4784 level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12);
4786 if(SHOW_UBITS(re, &s->gb, 1)==0){
4787 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n");
4789 }; SKIP_CACHE(re, &s->gb, 1);
4791 level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
4793 if(SHOW_UBITS(re, &s->gb, 1)==0){
4794 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n");
4796 }; LAST_SKIP_CACHE(re, &s->gb, 1);
4798 SKIP_COUNTER(re, &s->gb, 1+12+1);
4802 if(s->error_resilience >= FF_ER_COMPLIANT){
4803 const int abs_level= ABS(level);
4804 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
4805 const int run1= run - rl->max_run[last][abs_level] - 1;
4806 if(abs_level <= rl->max_level[last][run]){
4807 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
4810 if(s->error_resilience > FF_ER_COMPLIANT){
4811 if(abs_level <= rl->max_level[last][run]*2){
4812 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
4815 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
4816 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
4823 if (level>0) level= level * qmul + qadd;
4824 else level= level * qmul - qadd;
4826 if((unsigned)(level + 2048) > 4095){
4827 if(s->error_resilience > FF_ER_COMPLIANT){
4828 if(level > 2560 || level<-2560){
4829 av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
4833 level= level<0 ? -2048 : 2047;
4840 #if MIN_CACHE_BITS < 20
4841 LAST_SKIP_BITS(re, &s->gb, 2);
4842 UPDATE_CACHE(re, &s->gb);
4844 SKIP_BITS(re, &s->gb, 2);
4846 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
4847 i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing
4848 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4849 LAST_SKIP_BITS(re, &s->gb, 1);
4853 #if MIN_CACHE_BITS < 19
4854 LAST_SKIP_BITS(re, &s->gb, 1);
4855 UPDATE_CACHE(re, &s->gb);
4857 SKIP_BITS(re, &s->gb, 1);
4859 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
4861 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
4862 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4863 LAST_SKIP_BITS(re, &s->gb, 1);
4868 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4869 LAST_SKIP_BITS(re, &s->gb, 1);
4874 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
4878 block[scan_table[i]] = level;
4882 block[scan_table[i]] = level;
4884 CLOSE_READER(re, &s->gb);
4888 if(s->qscale >= s->intra_dc_threshold){
4889 block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0);
4894 mpeg4_pred_ac(s, block, n, dc_pred_dir);
4896 i = 63; /* XXX: not optimal */
4899 s->block_last_index[n] = i;
4903 /* most is hardcoded. should extend to handle all h263 streams */
4904 int h263_decode_picture_header(MpegEncContext *s)
4906 int format, width, height, i;
4909 align_get_bits(&s->gb);
4911 startcode= get_bits(&s->gb, 22-8);
4913 for(i= s->gb.size_in_bits - get_bits_count(&s->gb); i>24; i-=8) {
4914 startcode = ((startcode << 8) | get_bits(&s->gb, 8)) & 0x003FFFFF;
4916 if(startcode == 0x20)
4920 if (startcode != 0x20) {
4921 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
4924 /* temporal reference */
4925 i = get_bits(&s->gb, 8); /* picture timestamp */
4926 if( (s->picture_number&~0xFF)+i < s->picture_number)
4928 s->picture_number= (s->picture_number&~0xFF) + i;
4930 /* PTYPE starts here */
4931 if (get_bits1(&s->gb) != 1) {
4933 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
4936 if (get_bits1(&s->gb) != 0) {
4937 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
4938 return -1; /* h263 id */
4940 skip_bits1(&s->gb); /* split screen off */
4941 skip_bits1(&s->gb); /* camera off */
4942 skip_bits1(&s->gb); /* freeze picture release off */
4944 format = get_bits(&s->gb, 3);
4949 7 extended PTYPE (PLUSPTYPE)
4952 if (format != 7 && format != 6) {
4955 width = h263_format[format][0];
4956 height = h263_format[format][1];
4960 s->pict_type = I_TYPE + get_bits1(&s->gb);
4962 s->h263_long_vectors = get_bits1(&s->gb);
4964 if (get_bits1(&s->gb) != 0) {
4965 av_log(s->avctx, AV_LOG_ERROR, "H263 SAC not supported\n");
4966 return -1; /* SAC: off */
4968 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
4969 s->unrestricted_mv = s->h263_long_vectors || s->obmc;
4971 if (get_bits1(&s->gb) != 0) {
4972 av_log(s->avctx, AV_LOG_ERROR, "H263 PB frame not supported\n");
4973 return -1; /* not PB frame */
4975 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
4976 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
4980 s->avctx->sample_aspect_ratio= (AVRational){12,11};
4981 s->avctx->frame_rate = 30000;
4982 s->avctx->frame_rate_base= 1001;
4988 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
4990 /* ufep other than 0 and 1 are reserved */
4993 format = get_bits(&s->gb, 3);
4994 dprintf("ufep=1, format: %d\n", format);
4995 s->custom_pcf= get_bits1(&s->gb);
4996 s->umvplus = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */
4997 if (get_bits1(&s->gb) != 0) {
4998 av_log(s->avctx, AV_LOG_ERROR, "Syntax-based Arithmetic Coding (SAC) not supported\n");
5000 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
5001 s->h263_aic = get_bits1(&s->gb); /* Advanced Intra Coding (AIC) */
5002 s->loop_filter= get_bits1(&s->gb);
5003 s->unrestricted_mv = s->umvplus || s->obmc || s->loop_filter;
5005 s->h263_slice_structured= get_bits1(&s->gb);
5006 if (get_bits1(&s->gb) != 0) {
5007 av_log(s->avctx, AV_LOG_ERROR, "Reference Picture Selection not supported\n");
5009 if (get_bits1(&s->gb) != 0) {
5010 av_log(s->avctx, AV_LOG_ERROR, "Independent Segment Decoding not supported\n");
5012 s->alt_inter_vlc= get_bits1(&s->gb);
5013 s->modified_quant= get_bits1(&s->gb);
5014 if(s->modified_quant)
5015 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
5017 skip_bits(&s->gb, 1); /* Prevent start code emulation */
5019 skip_bits(&s->gb, 3); /* Reserved */
5020 } else if (ufep != 0) {
5021 av_log(s->avctx, AV_LOG_ERROR, "Bad UFEP type (%d)\n", ufep);
5026 s->pict_type = get_bits(&s->gb, 3);
5027 switch(s->pict_type){
5028 case 0: s->pict_type= I_TYPE;break;
5029 case 1: s->pict_type= P_TYPE;break;
5030 case 3: s->pict_type= B_TYPE;break;
5031 case 7: s->pict_type= I_TYPE;break; //ZYGO
5035 skip_bits(&s->gb, 2);
5036 s->no_rounding = get_bits1(&s->gb);
5037 skip_bits(&s->gb, 4);
5039 /* Get the picture dimensions */
5042 /* Custom Picture Format (CPFMT) */
5043 s->aspect_ratio_info = get_bits(&s->gb, 4);
5044 dprintf("aspect: %d\n", s->aspect_ratio_info);
5049 3 - 10:11 (525-type 4:3)
5050 4 - 16:11 (CIF 16:9)
5051 5 - 40:33 (525-type 16:9)
5054 width = (get_bits(&s->gb, 9) + 1) * 4;
5056 height = get_bits(&s->gb, 9) * 4;
5057 dprintf("\nH.263+ Custom picture: %dx%d\n",width,height);
5058 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
5059 /* aspected dimensions */
5060 s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 8);
5061 s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 8);
5063 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
5066 width = h263_format[format][0];
5067 height = h263_format[format][1];
5068 s->avctx->sample_aspect_ratio= (AVRational){12,11};
5070 if ((width == 0) || (height == 0))
5077 s->avctx->frame_rate= 1800000;
5078 s->avctx->frame_rate_base= 1000 + get_bits1(&s->gb);
5079 s->avctx->frame_rate_base*= get_bits(&s->gb, 7);
5080 if(s->avctx->frame_rate_base == 0){
5081 av_log(s, AV_LOG_ERROR, "zero framerate\n");
5084 gcd= ff_gcd(s->avctx->frame_rate, s->avctx->frame_rate_base);
5085 s->avctx->frame_rate /= gcd;
5086 s->avctx->frame_rate_base /= gcd;
5087 // av_log(s->avctx, AV_LOG_DEBUG, "%d/%d\n", s->avctx->frame_rate, s->avctx->frame_rate_base);
5089 s->avctx->frame_rate = 30000;
5090 s->avctx->frame_rate_base= 1001;
5095 skip_bits(&s->gb, 2); //extended Temporal reference
5100 if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
5103 if(s->h263_slice_structured){
5104 if (get_bits1(&s->gb) != 0) {
5105 av_log(s->avctx, AV_LOG_ERROR, "rectangular slices not supported\n");
5107 if (get_bits1(&s->gb) != 0) {
5108 av_log(s->avctx, AV_LOG_ERROR, "unordered slices not supported\n");
5113 s->qscale = get_bits(&s->gb, 5);
5116 s->mb_width = (s->width + 15) / 16;
5117 s->mb_height = (s->height + 15) / 16;
5118 s->mb_num = s->mb_width * s->mb_height;
5121 while (get_bits1(&s->gb) != 0) {
5122 skip_bits(&s->gb, 8);
5125 if(s->h263_slice_structured){
5126 if (get_bits1(&s->gb) != 1) {
5127 av_log(s->avctx, AV_LOG_ERROR, "SEPB1 marker missing\n");
5131 ff_h263_decode_mba(s);
5133 if (get_bits1(&s->gb) != 1) {
5134 av_log(s->avctx, AV_LOG_ERROR, "SEPB2 marker missing\n");
5141 s->y_dc_scale_table=
5142 s->c_dc_scale_table= ff_aic_dc_scale_table;
5144 s->y_dc_scale_table=
5145 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
5148 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
5149 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",
5150 s->qscale, av_get_pict_type_char(s->pict_type),
5151 s->gb.size_in_bits, 1-s->no_rounding,
5152 s->obmc ? " AP" : "",
5153 s->umvplus ? " UMV" : "",
5154 s->h263_long_vectors ? " LONG" : "",
5155 s->h263_plus ? " +" : "",
5156 s->h263_aic ? " AIC" : "",
5157 s->alt_inter_vlc ? " AIV" : "",
5158 s->modified_quant ? " MQ" : "",
5159 s->loop_filter ? " LOOP" : "",
5160 s->h263_slice_structured ? " SS" : "",
5161 s->avctx->frame_rate, s->avctx->frame_rate_base
5165 if (s->pict_type == I_TYPE && s->avctx->codec_tag == ff_get_fourcc("ZYGO")){
5167 for(i=0; i<85; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
5168 av_log(s->avctx, AV_LOG_DEBUG, "\n");
5169 for(i=0; i<13; i++){
5171 int v= get_bits(&s->gb, 8);
5172 v |= get_sbits(&s->gb, 8)<<8;
5173 av_log(s->avctx, AV_LOG_DEBUG, " %5d", v);
5175 av_log(s->avctx, AV_LOG_DEBUG, "\n");
5177 for(i=0; i<50; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
5184 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb)
5187 int a= 2<<s->sprite_warping_accuracy;
5188 int rho= 3-s->sprite_warping_accuracy;
5190 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
5191 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
5192 int sprite_ref[4][2];
5193 int virtual_ref[2][2];
5195 int alpha=0, beta=0;
5200 for(i=0; i<s->num_sprite_warping_points; i++){
5204 length= get_vlc(gb, &sprite_trajectory);
5206 x= get_xbits(gb, length);
5208 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(gb); /* marker bit */
5210 length= get_vlc(gb, &sprite_trajectory);
5212 y=get_xbits(gb, length);
5214 skip_bits1(gb); /* marker bit */
5215 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
5220 while((1<<alpha)<w) alpha++;
5221 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
5225 // Note, the 4th point isnt used for GMC
5226 if(s->divx_version==500 && s->divx_build==413){
5227 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
5228 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
5229 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
5230 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
5231 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
5232 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
5234 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
5235 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
5236 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
5237 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
5238 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
5239 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
5241 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
5242 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
5244 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
5245 // perhaps it should be reordered to be more readable ...
5246 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
5247 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
5248 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
5249 + 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);
5250 virtual_ref[0][1]= 16*vop_ref[0][1]
5251 + 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);
5252 virtual_ref[1][0]= 16*vop_ref[0][0]
5253 + 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);
5254 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
5255 + 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);
5257 switch(s->num_sprite_warping_points)
5260 s->sprite_offset[0][0]= 0;
5261 s->sprite_offset[0][1]= 0;
5262 s->sprite_offset[1][0]= 0;
5263 s->sprite_offset[1][1]= 0;
5264 s->sprite_delta[0][0]= a;
5265 s->sprite_delta[0][1]= 0;
5266 s->sprite_delta[1][0]= 0;
5267 s->sprite_delta[1][1]= a;
5268 s->sprite_shift[0]= 0;
5269 s->sprite_shift[1]= 0;
5272 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
5273 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
5274 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
5275 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
5276 s->sprite_delta[0][0]= a;
5277 s->sprite_delta[0][1]= 0;
5278 s->sprite_delta[1][0]= 0;
5279 s->sprite_delta[1][1]= a;
5280 s->sprite_shift[0]= 0;
5281 s->sprite_shift[1]= 0;
5284 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
5285 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
5286 + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])
5287 + (1<<(alpha+rho-1));
5288 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
5289 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
5290 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])
5291 + (1<<(alpha+rho-1));
5292 s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
5293 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
5294 +2*w2*r*sprite_ref[0][0]
5296 + (1<<(alpha+rho+1)));
5297 s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
5298 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
5299 +2*w2*r*sprite_ref[0][1]
5301 + (1<<(alpha+rho+1)));
5302 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
5303 s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]);
5304 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
5305 s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
5307 s->sprite_shift[0]= alpha+rho;
5308 s->sprite_shift[1]= alpha+rho+2;
5311 min_ab= FFMIN(alpha, beta);
5314 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
5315 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])
5316 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])
5317 + (1<<(alpha+beta+rho-min_ab-1));
5318 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))
5319 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])
5320 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])
5321 + (1<<(alpha+beta+rho-min_ab-1));
5322 s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)
5323 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)
5324 + 2*w2*h3*r*sprite_ref[0][0]
5326 + (1<<(alpha+beta+rho-min_ab+1));
5327 s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)
5328 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)
5329 + 2*w2*h3*r*sprite_ref[0][1]
5331 + (1<<(alpha+beta+rho-min_ab+1));
5332 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;
5333 s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;
5334 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;
5335 s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;
5337 s->sprite_shift[0]= alpha + beta + rho - min_ab;
5338 s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;
5341 /* try to simplify the situation */
5342 if( s->sprite_delta[0][0] == a<<s->sprite_shift[0]
5343 && s->sprite_delta[0][1] == 0
5344 && s->sprite_delta[1][0] == 0
5345 && s->sprite_delta[1][1] == a<<s->sprite_shift[0])
5347 s->sprite_offset[0][0]>>=s->sprite_shift[0];
5348 s->sprite_offset[0][1]>>=s->sprite_shift[0];
5349 s->sprite_offset[1][0]>>=s->sprite_shift[1];
5350 s->sprite_offset[1][1]>>=s->sprite_shift[1];
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;
5357 s->real_sprite_warping_points=1;
5360 int shift_y= 16 - s->sprite_shift[0];
5361 int shift_c= 16 - s->sprite_shift[1];
5362 //printf("shifts %d %d\n", shift_y, shift_c);
5364 s->sprite_offset[0][i]<<= shift_y;
5365 s->sprite_offset[1][i]<<= shift_c;
5366 s->sprite_delta[0][i]<<= shift_y;
5367 s->sprite_delta[1][i]<<= shift_y;
5368 s->sprite_shift[i]= 16;
5370 s->real_sprite_warping_points= s->num_sprite_warping_points;
5373 printf("vop:%d:%d %d:%d %d:%d, sprite:%d:%d %d:%d %d:%d, virtual: %d:%d %d:%d\n",
5374 vop_ref[0][0], vop_ref[0][1],
5375 vop_ref[1][0], vop_ref[1][1],
5376 vop_ref[2][0], vop_ref[2][1],
5377 sprite_ref[0][0], sprite_ref[0][1],
5378 sprite_ref[1][0], sprite_ref[1][1],
5379 sprite_ref[2][0], sprite_ref[2][1],
5380 virtual_ref[0][0], virtual_ref[0][1],
5381 virtual_ref[1][0], virtual_ref[1][1]
5384 printf("offset: %d:%d , delta: %d %d %d %d, shift %d\n",
5385 s->sprite_offset[0][0], s->sprite_offset[0][1],
5386 s->sprite_delta[0][0], s->sprite_delta[0][1],
5387 s->sprite_delta[1][0], s->sprite_delta[1][1],
5393 static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
5394 int hours, minutes, seconds;
5396 hours= get_bits(gb, 5);
5397 minutes= get_bits(gb, 6);
5399 seconds= get_bits(gb, 6);
5401 s->time_base= seconds + 60*(minutes + 60*hours);
5409 static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
5410 int width, height, vo_ver_id;
5413 skip_bits(gb, 1); /* random access */
5414 s->vo_type= get_bits(gb, 8);
5415 if (get_bits1(gb) != 0) { /* is_ol_id */
5416 vo_ver_id = get_bits(gb, 4); /* vo_ver_id */
5417 skip_bits(gb, 3); /* vo_priority */
5421 //printf("vo type:%d\n",s->vo_type);
5422 s->aspect_ratio_info= get_bits(gb, 4);
5423 if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
5424 s->avctx->sample_aspect_ratio.num= get_bits(gb, 8); // par_width
5425 s->avctx->sample_aspect_ratio.den= get_bits(gb, 8); // par_height
5427 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
5430 if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
5431 int chroma_format= get_bits(gb, 2);
5432 if(chroma_format!=1){
5433 av_log(s->avctx, AV_LOG_ERROR, "illegal chroma format\n");
5435 s->low_delay= get_bits1(gb);
5436 if(get_bits1(gb)){ /* vbv parameters */
5437 get_bits(gb, 15); /* first_half_bitrate */
5438 skip_bits1(gb); /* marker */
5439 get_bits(gb, 15); /* latter_half_bitrate */
5440 skip_bits1(gb); /* marker */
5441 get_bits(gb, 15); /* first_half_vbv_buffer_size */
5442 skip_bits1(gb); /* marker */
5443 get_bits(gb, 3); /* latter_half_vbv_buffer_size */
5444 get_bits(gb, 11); /* first_half_vbv_occupancy */
5445 skip_bits1(gb); /* marker */
5446 get_bits(gb, 15); /* latter_half_vbv_occupancy */
5447 skip_bits1(gb); /* marker */
5450 // set low delay flag only once so the smart? low delay detection wont be overriden
5451 if(s->picture_number==0)
5455 s->shape = get_bits(gb, 2); /* vol shape */
5456 if(s->shape != RECT_SHAPE) av_log(s->avctx, AV_LOG_ERROR, "only rectangular vol supported\n");
5457 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
5458 av_log(s->avctx, AV_LOG_ERROR, "Gray shape not supported\n");
5459 skip_bits(gb, 4); //video_object_layer_shape_extension
5462 check_marker(gb, "before time_increment_resolution");
5464 s->time_increment_resolution = get_bits(gb, 16);
5466 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
5467 if (s->time_increment_bits < 1)
5468 s->time_increment_bits = 1;
5470 check_marker(gb, "before fixed_vop_rate");
5472 if (get_bits1(gb) != 0) { /* fixed_vop_rate */
5473 skip_bits(gb, s->time_increment_bits);
5478 if (s->shape != BIN_ONLY_SHAPE) {
5479 if (s->shape == RECT_SHAPE) {
5480 skip_bits1(gb); /* marker */
5481 width = get_bits(gb, 13);
5482 skip_bits1(gb); /* marker */
5483 height = get_bits(gb, 13);
5484 skip_bits1(gb); /* marker */
5485 if(width && height){ /* they should be non zero but who knows ... */
5488 // printf("width/height: %d %d\n", width, height);
5492 s->progressive_sequence=
5493 s->progressive_frame= get_bits1(gb)^1;
5494 if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO))
5495 av_log(s->avctx, AV_LOG_INFO, "MPEG4 OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */
5496 if (vo_ver_id == 1) {
5497 s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */
5499 s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */
5501 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "Static Sprites not supported\n");
5502 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
5503 if(s->vol_sprite_usage==STATIC_SPRITE){
5504 s->sprite_width = get_bits(gb, 13);
5505 skip_bits1(gb); /* marker */
5506 s->sprite_height= get_bits(gb, 13);
5507 skip_bits1(gb); /* marker */
5508 s->sprite_left = get_bits(gb, 13);
5509 skip_bits1(gb); /* marker */
5510 s->sprite_top = get_bits(gb, 13);
5511 skip_bits1(gb); /* marker */
5513 s->num_sprite_warping_points= get_bits(gb, 6);
5514 s->sprite_warping_accuracy = get_bits(gb, 2);
5515 s->sprite_brightness_change= get_bits1(gb);
5516 if(s->vol_sprite_usage==STATIC_SPRITE)
5517 s->low_latency_sprite= get_bits1(gb);
5519 // FIXME sadct disable bit if verid!=1 && shape not rect
5521 if (get_bits1(gb) == 1) { /* not_8_bit */
5522 s->quant_precision = get_bits(gb, 4); /* quant_precision */
5523 if(get_bits(gb, 4)!=8) av_log(s->avctx, AV_LOG_ERROR, "N-bit not supported\n"); /* bits_per_pixel */
5524 if(s->quant_precision!=5) av_log(s->avctx, AV_LOG_ERROR, "quant precission %d\n", s->quant_precision);
5526 s->quant_precision = 5;
5529 // FIXME a bunch of grayscale shape things
5531 if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */
5534 /* load default matrixes */
5535 for(i=0; i<64; i++){
5536 int j= s->dsp.idct_permutation[i];
5537 v= ff_mpeg4_default_intra_matrix[i];
5538 s->intra_matrix[j]= v;
5539 s->chroma_intra_matrix[j]= v;
5541 v= ff_mpeg4_default_non_intra_matrix[i];
5542 s->inter_matrix[j]= v;
5543 s->chroma_inter_matrix[j]= v;
5546 /* load custom intra matrix */
5549 for(i=0; i<64; i++){
5555 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5556 s->intra_matrix[j]= v;
5557 s->chroma_intra_matrix[j]= v;
5560 /* replicate last value */
5562 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5563 s->intra_matrix[j]= last;
5564 s->chroma_intra_matrix[j]= last;
5568 /* load custom non intra matrix */
5571 for(i=0; i<64; i++){
5577 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5578 s->inter_matrix[j]= v;
5579 s->chroma_inter_matrix[j]= v;
5582 /* replicate last value */
5584 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5585 s->inter_matrix[j]= last;
5586 s->chroma_inter_matrix[j]= last;
5590 // FIXME a bunch of grayscale shape things
5594 s->quarter_sample= get_bits1(gb);
5595 else s->quarter_sample=0;
5597 if(!get_bits1(gb)) av_log(s->avctx, AV_LOG_ERROR, "Complexity estimation not supported\n");
5599 s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */
5601 s->data_partitioning= get_bits1(gb);
5602 if(s->data_partitioning){
5603 s->rvlc= get_bits1(gb);
5606 if(vo_ver_id != 1) {
5607 s->new_pred= get_bits1(gb);
5609 av_log(s->avctx, AV_LOG_ERROR, "new pred not supported\n");
5610 skip_bits(gb, 2); /* requested upstream message type */
5611 skip_bits1(gb); /* newpred segment type */
5613 s->reduced_res_vop= get_bits1(gb);
5614 if(s->reduced_res_vop) av_log(s->avctx, AV_LOG_ERROR, "reduced resolution VOP not supported\n");
5618 s->reduced_res_vop= 0;
5621 s->scalability= get_bits1(gb);
5623 if (s->scalability) {
5624 GetBitContext bak= *gb;
5626 int ref_layer_sampling_dir;
5627 int h_sampling_factor_n;
5628 int h_sampling_factor_m;
5629 int v_sampling_factor_n;
5630 int v_sampling_factor_m;
5632 s->hierachy_type= get_bits1(gb);
5633 ref_layer_id= get_bits(gb, 4);
5634 ref_layer_sampling_dir= get_bits1(gb);
5635 h_sampling_factor_n= get_bits(gb, 5);
5636 h_sampling_factor_m= get_bits(gb, 5);
5637 v_sampling_factor_n= get_bits(gb, 5);
5638 v_sampling_factor_m= get_bits(gb, 5);
5639 s->enhancement_type= get_bits1(gb);
5641 if( h_sampling_factor_n==0 || h_sampling_factor_m==0
5642 || v_sampling_factor_n==0 || v_sampling_factor_m==0){
5644 // fprintf(stderr, "illegal scalability header (VERY broken encoder), trying to workaround\n");
5649 av_log(s->avctx, AV_LOG_ERROR, "scalability not supported\n");
5651 // bin shape stuff FIXME
5658 * decodes the user data stuff in the header.
5659 * allso inits divx/xvid/lavc_version/build
5661 static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
5665 int ver, build, ver2, ver3;
5668 buf[0]= show_bits(gb, 8);
5669 for(i=1; i<256; i++){
5670 buf[i]= show_bits(gb, 16)&0xFF;
5671 if(buf[i]==0) break;
5676 /* divx detection */
5677 e=sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last);
5679 e=sscanf(buf, "DivX%db%d%c", &ver, &build, &last);
5681 s->divx_version= ver;
5682 s->divx_build= build;
5683 s->divx_packed= e==3 && last=='p';
5686 /* ffmpeg detection */
5687 e=sscanf(buf, "FFmpeg%d.%d.%db%d", &ver, &ver2, &ver3, &build);
5689 e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
5691 if(strcmp(buf, "ffmpeg")==0){
5692 s->ffmpeg_version= 0x000406;
5693 s->lavc_build= 4600;
5697 s->ffmpeg_version= ver*256*256 + ver2*256 + ver3;
5698 s->lavc_build= build;
5701 /* xvid detection */
5702 e=sscanf(buf, "XviD%d", &build);
5704 s->xvid_build= build;
5707 //printf("User Data: %s\n", buf);
5711 static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
5712 int time_incr, time_increment;
5714 s->pict_type = get_bits(gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */
5715 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0 && !(s->flags & CODEC_FLAG_LOW_DELAY)){
5716 av_log(s->avctx, AV_LOG_ERROR, "low_delay flag set, but shouldnt, clearing it\n");
5720 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
5721 if(s->partitioned_frame)
5722 s->decode_mb= mpeg4_decode_partitioned_mb;
5724 s->decode_mb= ff_mpeg4_decode_mb;
5726 if(s->time_increment_resolution==0){
5727 s->time_increment_resolution=1;
5728 // fprintf(stderr, "time_increment_resolution is illegal\n");
5731 while (get_bits1(gb) != 0)
5734 check_marker(gb, "before time_increment");
5736 if(s->time_increment_bits==0){
5737 av_log(s->avctx, AV_LOG_ERROR, "hmm, seems the headers arnt complete, trying to guess time_increment_bits\n");
5739 for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){
5740 if(show_bits(gb, s->time_increment_bits+1)&1) break;
5743 av_log(s->avctx, AV_LOG_ERROR, "my guess is %d bits ;)\n",s->time_increment_bits);
5746 if(IS_3IV1) time_increment= get_bits1(gb); //FIXME investigate further
5747 else time_increment= get_bits(gb, s->time_increment_bits);
5749 // printf("%d %X\n", s->time_increment_bits, time_increment);
5750 //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);
5751 if(s->pict_type!=B_TYPE){
5752 s->last_time_base= s->time_base;
5753 s->time_base+= time_incr;
5754 s->time= s->time_base*s->time_increment_resolution + time_increment;
5755 if(s->workaround_bugs&FF_BUG_UMP4){
5756 if(s->time < s->last_non_b_time){
5757 // fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaround\n");
5759 s->time+= s->time_increment_resolution;
5762 s->pp_time= s->time - s->last_non_b_time;
5763 s->last_non_b_time= s->time;
5765 s->time= (s->last_time_base + time_incr)*s->time_increment_resolution + time_increment;
5766 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
5767 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
5768 // printf("messed up order, seeking?, skiping current b frame\n");
5769 return FRAME_SKIPED;
5772 if(s->t_frame==0) s->t_frame= s->pb_time;
5773 if(s->t_frame==0) s->t_frame=1; // 1/0 protection
5774 s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame)
5775 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
5776 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame)
5777 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
5779 //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);
5781 s->current_picture_ptr->pts= s->time*(int64_t)AV_TIME_BASE / s->time_increment_resolution;
5782 if(s->avctx->debug&FF_DEBUG_PTS)
5783 av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %f\n", s->current_picture_ptr->pts/(float)AV_TIME_BASE);
5785 check_marker(gb, "before vop_coded");
5788 if (get_bits1(gb) != 1){
5789 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
5790 av_log(s->avctx, AV_LOG_ERROR, "vop not coded\n");
5791 return FRAME_SKIPED;
5793 //printf("time %d %d %d || %Ld %Ld %Ld\n", s->time_increment_bits, s->time_increment_resolution, s->time_base,
5794 //s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time);
5795 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE
5796 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
5797 /* rounding type for motion estimation */
5798 s->no_rounding = get_bits1(gb);
5802 //FIXME reduced res stuff
5804 if (s->shape != RECT_SHAPE) {
5805 if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) {
5806 int width, height, hor_spat_ref, ver_spat_ref;
5808 width = get_bits(gb, 13);
5809 skip_bits1(gb); /* marker */
5810 height = get_bits(gb, 13);
5811 skip_bits1(gb); /* marker */
5812 hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */
5813 skip_bits1(gb); /* marker */
5814 ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */
5816 skip_bits1(gb); /* change_CR_disable */
5818 if (get_bits1(gb) != 0) {
5819 skip_bits(gb, 8); /* constant_alpha_value */
5822 //FIXME complexity estimation stuff
5824 if (s->shape != BIN_ONLY_SHAPE) {
5825 s->intra_dc_threshold= mpeg4_dc_threshold[ get_bits(gb, 3) ];
5826 if(!s->progressive_sequence){
5827 s->top_field_first= get_bits1(gb);
5828 s->alternate_scan= get_bits1(gb);
5830 s->alternate_scan= 0;
5833 if(s->alternate_scan){
5834 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
5835 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
5836 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
5837 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
5839 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
5840 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
5841 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
5842 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
5845 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
5846 mpeg4_decode_sprite_trajectory(s, gb);
5847 if(s->sprite_brightness_change) av_log(s->avctx, AV_LOG_ERROR, "sprite_brightness_change not supported\n");
5848 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "static sprite not supported\n");
5851 if (s->shape != BIN_ONLY_SHAPE) {
5852 s->chroma_qscale= s->qscale = get_bits(gb, s->quant_precision);
5854 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (qscale=0)\n");
5855 return -1; // makes no sense to continue, as there is nothing left from the image then
5858 if (s->pict_type != I_TYPE) {
5859 s->f_code = get_bits(gb, 3); /* fcode_for */
5861 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (f_code=0)\n");
5862 return -1; // makes no sense to continue, as the MV decoding will break very quickly
5867 if (s->pict_type == B_TYPE) {
5868 s->b_code = get_bits(gb, 3);
5872 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
5873 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",
5874 s->qscale, s->f_code, s->b_code,
5875 s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")),
5876 gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first,
5877 s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,
5878 s->sprite_warping_accuracy, 1-s->no_rounding, s->vo_type, s->vol_control_parameters ? " VOLC" : " ", s->intra_dc_threshold);
5881 if(!s->scalability){
5882 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {
5883 skip_bits1(gb); // vop shape coding type
5886 if(s->enhancement_type){
5887 int load_backward_shape= get_bits1(gb);
5888 if(load_backward_shape){
5889 av_log(s->avctx, AV_LOG_ERROR, "load backward shape isnt supported\n");
5892 skip_bits(gb, 2); //ref_select_code
5895 /* detect buggy encoders which dont set the low_delay flag (divx4/xvid/opendivx)*/
5896 // note we cannot detect divx5 without b-frames easyly (allthough its buggy too)
5897 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
5898 av_log(s->avctx, AV_LOG_ERROR, "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
5902 s->picture_number++; // better than pic number==0 allways ;)
5904 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
5905 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
5907 if(s->workaround_bugs&FF_BUG_EDGE){
5908 s->h_edge_pos= s->width;
5909 s->v_edge_pos= s->height;
5915 * decode mpeg4 headers
5916 * @return <0 if no VOP found (or a damaged one)
5917 * FRAME_SKIPPED if a not coded VOP is found
5918 * 0 if a VOP is found
5920 int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb)
5924 /* search next start code */
5927 if(s->avctx->codec_tag == ff_get_fourcc("WV1F") && show_bits(gb, 24) == 0x575630){
5929 if(get_bits(gb, 8) == 0xF0)
5930 return decode_vop_header(s, gb);
5935 v = get_bits(gb, 8);
5936 startcode = ((startcode << 8) | v) & 0xffffffff;
5938 if(get_bits_count(gb) >= gb->size_in_bits){
5939 if(gb->size_in_bits==8 && s->divx_version){
5940 av_log(s->avctx, AV_LOG_ERROR, "frame skip %d\n", gb->size_in_bits);
5941 return FRAME_SKIPED; //divx bug
5943 return -1; //end of stream
5946 if((startcode&0xFFFFFF00) != 0x100)
5947 continue; //no startcode
5949 if(s->avctx->debug&FF_DEBUG_STARTCODE){
5950 av_log(s->avctx, AV_LOG_DEBUG, "startcode: %3X ", startcode);
5951 if (startcode<=0x11F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Start");
5952 else if(startcode<=0x12F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Layer Start");
5953 else if(startcode<=0x13F) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
5954 else if(startcode<=0x15F) av_log(s->avctx, AV_LOG_DEBUG, "FGS bp start");
5955 else if(startcode<=0x1AF) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
5956 else if(startcode==0x1B0) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq Start");
5957 else if(startcode==0x1B1) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq End");
5958 else if(startcode==0x1B2) av_log(s->avctx, AV_LOG_DEBUG, "User Data");
5959 else if(startcode==0x1B3) av_log(s->avctx, AV_LOG_DEBUG, "Group of VOP start");
5960 else if(startcode==0x1B4) av_log(s->avctx, AV_LOG_DEBUG, "Video Session Error");
5961 else if(startcode==0x1B5) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Start");
5962 else if(startcode==0x1B6) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Plane start");
5963 else if(startcode==0x1B7) av_log(s->avctx, AV_LOG_DEBUG, "slice start");
5964 else if(startcode==0x1B8) av_log(s->avctx, AV_LOG_DEBUG, "extension start");
5965 else if(startcode==0x1B9) av_log(s->avctx, AV_LOG_DEBUG, "fgs start");
5966 else if(startcode==0x1BA) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object start");
5967 else if(startcode==0x1BB) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object Plane start");
5968 else if(startcode==0x1BC) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object start");
5969 else if(startcode==0x1BD) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object Plane start");
5970 else if(startcode==0x1BE) av_log(s->avctx, AV_LOG_DEBUG, "Still Textutre Object start");
5971 else if(startcode==0x1BF) av_log(s->avctx, AV_LOG_DEBUG, "Textutre Spatial Layer start");
5972 else if(startcode==0x1C0) av_log(s->avctx, AV_LOG_DEBUG, "Textutre SNR Layer start");
5973 else if(startcode==0x1C1) av_log(s->avctx, AV_LOG_DEBUG, "Textutre Tile start");
5974 else if(startcode==0x1C2) av_log(s->avctx, AV_LOG_DEBUG, "Textutre Shape Layer start");
5975 else if(startcode==0x1C3) av_log(s->avctx, AV_LOG_DEBUG, "stuffing start");
5976 else if(startcode<=0x1C5) av_log(s->avctx, AV_LOG_DEBUG, "reserved");
5977 else if(startcode<=0x1FF) av_log(s->avctx, AV_LOG_DEBUG, "System start");
5978 av_log(s->avctx, AV_LOG_DEBUG, " at %d\n", get_bits_count(gb));
5981 if(startcode >= 0x120 && startcode <= 0x12F){
5982 if(decode_vol_header(s, gb) < 0)
5985 else if(startcode == USER_DATA_STARTCODE){
5986 decode_user_data(s, gb);
5988 else if(startcode == GOP_STARTCODE){
5989 mpeg4_decode_gop_header(s, gb);
5991 else if(startcode == VOP_STARTCODE){
5992 return decode_vop_header(s, gb);
6000 /* don't understand why they choose a different header ! */
6001 int intel_h263_decode_picture_header(MpegEncContext *s)
6005 /* picture header */
6006 if (get_bits_long(&s->gb, 22) != 0x20) {
6007 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
6010 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
6012 if (get_bits1(&s->gb) != 1) {
6013 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
6014 return -1; /* marker */
6016 if (get_bits1(&s->gb) != 0) {
6017 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
6018 return -1; /* h263 id */
6020 skip_bits1(&s->gb); /* split screen off */
6021 skip_bits1(&s->gb); /* camera off */
6022 skip_bits1(&s->gb); /* freeze picture release off */
6024 format = get_bits(&s->gb, 3);
6026 av_log(s->avctx, AV_LOG_ERROR, "Intel H263 free format not supported\n");
6031 s->pict_type = I_TYPE + get_bits1(&s->gb);
6033 s->unrestricted_mv = get_bits1(&s->gb);
6034 s->h263_long_vectors = s->unrestricted_mv;
6036 if (get_bits1(&s->gb) != 0) {
6037 av_log(s->avctx, AV_LOG_ERROR, "SAC not supported\n");
6038 return -1; /* SAC: off */
6040 if (get_bits1(&s->gb) != 0) {
6042 av_log(s->avctx, AV_LOG_ERROR, "Advanced Prediction Mode not supported\n");
6043 // return -1; /* advanced prediction mode: off */
6045 if (get_bits1(&s->gb) != 0) {
6046 av_log(s->avctx, AV_LOG_ERROR, "PB frame mode no supported\n");
6047 return -1; /* PB frame mode */
6050 /* skip unknown header garbage */
6051 skip_bits(&s->gb, 41);
6053 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
6054 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
6057 while (get_bits1(&s->gb) != 0) {
6058 skip_bits(&s->gb, 8);
6062 s->y_dc_scale_table=
6063 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
6068 int flv_h263_decode_picture_header(MpegEncContext *s)
6070 int format, width, height;
6072 /* picture header */
6073 if (get_bits_long(&s->gb, 17) != 1) {
6074 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
6077 format = get_bits(&s->gb, 5);
6078 if (format != 0 && format != 1) {
6079 av_log(s->avctx, AV_LOG_ERROR, "Bad picture format\n");
6082 s->h263_flv = format+1;
6083 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
6084 format = get_bits(&s->gb, 3);
6087 width = get_bits(&s->gb, 8);
6088 height = get_bits(&s->gb, 8);
6091 width = get_bits(&s->gb, 16);
6092 height = get_bits(&s->gb, 16);
6118 if ((width == 0) || (height == 0))
6123 s->pict_type = I_TYPE + get_bits(&s->gb, 2);
6124 s->dropable= s->pict_type > P_TYPE;
6126 s->pict_type = P_TYPE;
6128 skip_bits1(&s->gb); /* deblocking flag */
6129 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
6133 s->unrestricted_mv = 1;
6134 s->h263_long_vectors = 0;
6137 while (get_bits1(&s->gb) != 0) {
6138 skip_bits(&s->gb, 8);
6142 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
6143 av_log(s->avctx, AV_LOG_DEBUG, "%c esc_type:%d, qp:%d num:%d\n",
6144 av_get_pict_type_char(s->pict_type), s->h263_flv-1, s->qscale, s->picture_number);
6147 s->y_dc_scale_table=
6148 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;