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 h263_encode_motion(MpegEncContext * s, int val, int fcode);
60 static void h263p_encode_umotion(MpegEncContext * s, int val);
61 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block,
62 int n, int dc, uint8_t *scan_table,
63 PutBitContext *dc_pb, PutBitContext *ac_pb);
66 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode);
67 static int h263p_decode_umotion(MpegEncContext * s, int pred);
68 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
70 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
71 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
72 int n, int coded, int intra, int rvlc);
73 static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr);
74 #ifdef CONFIG_ENCODERS
75 static void mpeg4_encode_visual_object_header(MpegEncContext * s);
76 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number);
77 #endif //CONFIG_ENCODERS
78 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb);
79 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr, int *dir_ptr);
81 #ifdef CONFIG_ENCODERS
82 static uint8_t uni_DCtab_lum_len[512];
83 static uint8_t uni_DCtab_chrom_len[512];
84 static uint16_t uni_DCtab_lum_bits[512];
85 static uint16_t uni_DCtab_chrom_bits[512];
87 static uint8_t (*mv_penalty)[MAX_MV*2+1]= NULL;
88 static uint8_t fcode_tab[MAX_MV*2+1];
89 static uint8_t umv_fcode_tab[MAX_MV*2+1];
91 static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2];
92 static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2];
93 static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2];
94 static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2];
95 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
96 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
97 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
110 #if 0 //3IV1 is quite rare and tis slows things down a tiny bit
111 #define IS_3IV1 s->avctx->codec_tag == ff_get_fourcc("3IV1")
116 int h263_get_picture_format(int width, int height)
120 if (width == 128 && height == 96)
122 else if (width == 176 && height == 144)
124 else if (width == 352 && height == 288)
126 else if (width == 704 && height == 576)
128 else if (width == 1408 && height == 1152)
135 #ifdef CONFIG_ENCODERS
137 static void aspect_to_info(MpegEncContext * s, AVRational aspect){
140 if(aspect.num==0) aspect= (AVRational){1,1};
143 if(av_cmp_q(pixel_aspect[i], aspect) == 0){
144 s->aspect_ratio_info=i;
149 s->aspect_ratio_info= FF_ASPECT_EXTENDED;
152 void ff_flv_encode_picture_header(MpegEncContext * s, int picture_number)
156 align_put_bits(&s->pb);
158 put_bits(&s->pb, 17, 1);
159 put_bits(&s->pb, 5, (s->h263_flv-1)); /* 0: h263 escape codes 1: 11-bit escape codes */
160 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->frame_rate_base) /
161 s->avctx->frame_rate) & 0xff); /* TemporalReference */
162 if (s->width == 352 && s->height == 288)
164 else if (s->width == 176 && s->height == 144)
166 else if (s->width == 128 && s->height == 96)
168 else if (s->width == 320 && s->height == 240)
170 else if (s->width == 160 && s->height == 120)
172 else if (s->width <= 255 && s->height <= 255)
173 format = 0; /* use 1 byte width & height */
175 format = 1; /* use 2 bytes width & height */
176 put_bits(&s->pb, 3, format); /* PictureSize */
178 put_bits(&s->pb, 8, s->width);
179 put_bits(&s->pb, 8, s->height);
180 } else if (format == 1) {
181 put_bits(&s->pb, 16, s->width);
182 put_bits(&s->pb, 16, s->height);
184 put_bits(&s->pb, 2, s->pict_type == P_TYPE); /* PictureType */
185 put_bits(&s->pb, 1, 1); /* DeblockingFlag: on */
186 put_bits(&s->pb, 5, s->qscale); /* Quantizer */
187 put_bits(&s->pb, 1, 0); /* ExtraInformation */
191 s->c_dc_scale_table= ff_aic_dc_scale_table;
194 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
198 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
200 int format, coded_frame_rate, coded_frame_rate_base, i, temp_ref;
201 int best_clock_code=1;
203 int best_error= INT_MAX;
208 div= (s->avctx->frame_rate_base*1800000LL + 500LL*s->avctx->frame_rate) / ((1000LL+i)*s->avctx->frame_rate);
209 div= clip(1, div, 127);
210 error= ABS(s->avctx->frame_rate_base*1800000LL - (1000LL+i)*s->avctx->frame_rate*div);
211 if(error < best_error){
218 s->custom_pcf= best_clock_code!=1 || best_divisor!=60;
219 coded_frame_rate= 1800000;
220 coded_frame_rate_base= (1000+best_clock_code)*best_divisor;
222 align_put_bits(&s->pb);
224 /* Update the pointer to last GOB */
225 s->ptr_lastgob = pbBufPtr(&s->pb);
226 put_bits(&s->pb, 22, 0x20); /* PSC */
227 temp_ref= s->picture_number * (int64_t)coded_frame_rate * s->avctx->frame_rate_base /
228 (coded_frame_rate_base * (int64_t)s->avctx->frame_rate);
229 put_bits(&s->pb, 8, temp_ref & 0xff); /* TemporalReference */
231 put_bits(&s->pb, 1, 1); /* marker */
232 put_bits(&s->pb, 1, 0); /* h263 id */
233 put_bits(&s->pb, 1, 0); /* split screen off */
234 put_bits(&s->pb, 1, 0); /* camera off */
235 put_bits(&s->pb, 1, 0); /* freeze picture release off */
237 format = h263_get_picture_format(s->width, s->height);
240 put_bits(&s->pb, 3, format);
241 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
242 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
243 of H.263v1 UMV implies to check the predicted MV after
244 calculation of the current MB to see if we're on the limits */
245 put_bits(&s->pb, 1, 0); /* unrestricted motion vector: off */
246 put_bits(&s->pb, 1, 0); /* SAC: off */
247 put_bits(&s->pb, 1, s->obmc); /* advanced prediction mode */
248 put_bits(&s->pb, 1, 0); /* not PB frame */
249 put_bits(&s->pb, 5, s->qscale);
250 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
254 /* H.263 Plus PTYPE */
256 put_bits(&s->pb, 3, 7);
257 put_bits(&s->pb,3,ufep); /* Update Full Extended PTYPE */
259 put_bits(&s->pb,3,6); /* Custom Source Format */
261 put_bits(&s->pb, 3, format);
263 put_bits(&s->pb,1, s->custom_pcf);
264 put_bits(&s->pb,1, s->umvplus); /* Unrestricted Motion Vector */
265 put_bits(&s->pb,1,0); /* SAC: off */
266 put_bits(&s->pb,1,s->obmc); /* Advanced Prediction Mode */
267 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
268 put_bits(&s->pb,1,s->loop_filter); /* Deblocking Filter */
269 put_bits(&s->pb,1,s->h263_slice_structured); /* Slice Structured */
270 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
271 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
272 put_bits(&s->pb,1,s->alt_inter_vlc); /* Alternative Inter VLC */
273 put_bits(&s->pb,1,s->modified_quant); /* Modified Quantization: */
274 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
275 put_bits(&s->pb,3,0); /* Reserved */
277 put_bits(&s->pb, 3, s->pict_type == P_TYPE);
279 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
280 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
281 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
282 put_bits(&s->pb,2,0); /* Reserved */
283 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
285 /* This should be here if PLUSPTYPE */
286 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
289 /* Custom Picture Format (CPFMT) */
290 aspect_to_info(s, s->avctx->sample_aspect_ratio);
292 put_bits(&s->pb,4,s->aspect_ratio_info);
293 put_bits(&s->pb,9,(s->width >> 2) - 1);
294 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
295 put_bits(&s->pb,9,(s->height >> 2));
296 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
297 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
298 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
303 put_bits(&s->pb, 1, best_clock_code);
304 put_bits(&s->pb, 7, best_divisor);
306 put_bits(&s->pb, 2, (temp_ref>>8)&3);
309 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
311 // put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
312 //FIXME check actual requested range
313 put_bits(&s->pb,2,1); /* unlimited */
314 if(s->h263_slice_structured)
315 put_bits(&s->pb,2,0); /* no weird submodes */
317 put_bits(&s->pb, 5, s->qscale);
320 put_bits(&s->pb, 1, 0); /* no PEI */
322 if(s->h263_slice_structured){
323 put_bits(&s->pb, 1, 1);
325 assert(s->mb_x == 0 && s->mb_y == 0);
326 ff_h263_encode_mba(s);
328 put_bits(&s->pb, 1, 1);
333 s->c_dc_scale_table= ff_aic_dc_scale_table;
336 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
341 * Encodes a group of blocks header.
343 void h263_encode_gob_header(MpegEncContext * s, int mb_line)
345 put_bits(&s->pb, 17, 1); /* GBSC */
347 if(s->h263_slice_structured){
348 put_bits(&s->pb, 1, 1);
350 ff_h263_encode_mba(s);
353 put_bits(&s->pb, 1, 1);
354 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
355 put_bits(&s->pb, 1, 1);
356 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
358 int gob_number= mb_line / s->gob_index;
360 put_bits(&s->pb, 5, gob_number); /* GN */
361 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
362 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
366 static inline int get_block_rate(MpegEncContext * s, DCTELEM block[64], int block_last_index, uint8_t scantable[64]){
371 for(j=1; j<=block_last_index; j++){
372 const int index= scantable[j];
373 int level= block[index];
376 if((level&(~127)) == 0){
377 if(j<block_last_index) rate+= s->intra_ac_vlc_length [UNI_AC_ENC_INDEX(j-last-1, level)];
378 else rate+= s->intra_ac_vlc_last_length[UNI_AC_ENC_INDEX(j-last-1, level)];
380 rate += s->ac_esc_length;
390 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
394 int8_t * const qscale_table= s->current_picture.qscale_table;
396 memcpy(zigzag_last_index, s->block_last_index, sizeof(int)*6);
399 int16_t *ac_val, *ac_val1;
401 score -= get_block_rate(s, block[n], s->block_last_index[n], s->intra_scantable.permutated);
403 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
406 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
408 ac_val-= s->block_wrap[n]*16;
409 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
412 const int level= block[n][s->dsp.idct_permutation[i ]];
413 block[n][s->dsp.idct_permutation[i ]] = level - ac_val[i+8];
414 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
418 /* different qscale, we must rescale */
420 const int level= block[n][s->dsp.idct_permutation[i ]];
421 block[n][s->dsp.idct_permutation[i ]] = level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
422 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
426 st[n]= s->intra_h_scantable.permutated;
428 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
429 /* left prediction */
431 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
434 const int level= block[n][s->dsp.idct_permutation[i<<3]];
435 block[n][s->dsp.idct_permutation[i<<3]]= level - ac_val[i];
437 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
440 /* different qscale, we must rescale */
442 const int level= block[n][s->dsp.idct_permutation[i<<3]];
443 block[n][s->dsp.idct_permutation[i<<3]]= level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
445 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
448 st[n]= s->intra_v_scantable.permutated;
451 for(i=63; i>0; i--) //FIXME optimize
452 if(block[n][ st[n][i] ]) break;
453 s->block_last_index[n]= i;
455 score += get_block_rate(s, block[n], s->block_last_index[n], st[n]);
461 static inline void restore_ac_coeffs(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
464 memcpy(s->block_last_index, zigzag_last_index, sizeof(int)*6);
467 int16_t *ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
469 st[n]= s->intra_scantable.permutated;
473 block[n][s->dsp.idct_permutation[i ]] = ac_val[i+8];
476 /* left prediction */
478 block[n][s->dsp.idct_permutation[i<<3]]= ac_val[i ];
485 * modify qscale so that encoding is acually possible in h263 (limit difference to -2..2)
487 void ff_clean_h263_qscales(MpegEncContext *s){
489 int8_t * const qscale_table= s->current_picture.qscale_table;
491 for(i=1; i<s->mb_num; i++){
492 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i-1] ] >2)
493 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i-1] ]+2;
495 for(i=s->mb_num-2; i>=0; i--){
496 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i+1] ] >2)
497 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i+1] ]+2;
502 * modify mb_type & qscale so that encoding is acually possible in mpeg4
504 void ff_clean_mpeg4_qscales(MpegEncContext *s){
506 int8_t * const qscale_table= s->current_picture.qscale_table;
508 ff_clean_h263_qscales(s);
510 for(i=1; i<s->mb_num; i++){
511 int mb_xy= s->mb_index2xy[i];
513 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_INTER4V)){
514 s->mb_type[mb_xy]&= ~CANDIDATE_MB_TYPE_INTER4V;
515 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_INTER;
519 if(s->pict_type== B_TYPE){
521 /* ok, come on, this isnt funny anymore, theres more code for handling this mpeg4 mess than
522 for the actual adaptive quantization */
524 for(i=0; i<s->mb_num; i++){
525 int mb_xy= s->mb_index2xy[i];
526 odd += qscale_table[mb_xy]&1;
529 if(2*odd > s->mb_num) odd=1;
532 for(i=0; i<s->mb_num; i++){
533 int mb_xy= s->mb_index2xy[i];
534 if((qscale_table[mb_xy]&1) != odd)
535 qscale_table[mb_xy]++;
536 if(qscale_table[mb_xy] > 31)
537 qscale_table[mb_xy]= 31;
540 for(i=1; i<s->mb_num; i++){
541 int mb_xy= s->mb_index2xy[i];
542 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_DIRECT)){
543 s->mb_type[mb_xy]&= ~CANDIDATE_MB_TYPE_DIRECT;
544 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_BIDIR;
550 #endif //CONFIG_ENCODERS
553 * @return the mb_type
555 int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){
556 const int mb_index= s->mb_x + s->mb_y*s->mb_stride;
557 const int colocated_mb_type= s->next_picture.mb_type[mb_index];
558 int xy= s->block_index[0];
559 uint16_t time_pp= s->pp_time;
560 uint16_t time_pb= s->pb_time;
563 //FIXME avoid divides
565 if(IS_8X8(colocated_mb_type)){
566 s->mv_type = MV_TYPE_8X8;
568 xy= s->block_index[i];
569 s->mv[0][i][0] = s->next_picture.motion_val[0][xy][0]*time_pb/time_pp + mx;
570 s->mv[0][i][1] = s->next_picture.motion_val[0][xy][1]*time_pb/time_pp + my;
571 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->next_picture.motion_val[0][xy][0]
572 : s->next_picture.motion_val[0][xy][0]*(time_pb - time_pp)/time_pp;
573 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->next_picture.motion_val[0][xy][1]
574 : s->next_picture.motion_val[0][xy][1]*(time_pb - time_pp)/time_pp;
576 return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_L0L1;
577 } else if(IS_INTERLACED(colocated_mb_type)){
578 s->mv_type = MV_TYPE_FIELD;
580 if(s->top_field_first){
581 time_pp= s->pp_field_time - s->p_field_select_table[i][mb_index] + i;
582 time_pb= s->pb_field_time - s->p_field_select_table[i][mb_index] + i;
584 time_pp= s->pp_field_time + s->p_field_select_table[i][mb_index] - i;
585 time_pb= s->pb_field_time + s->p_field_select_table[i][mb_index] - i;
587 s->mv[0][i][0] = s->p_field_mv_table[i][0][mb_index][0]*time_pb/time_pp + mx;
588 s->mv[0][i][1] = s->p_field_mv_table[i][0][mb_index][1]*time_pb/time_pp + my;
589 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->p_field_mv_table[i][0][mb_index][0]
590 : s->p_field_mv_table[i][0][mb_index][0]*(time_pb - time_pp)/time_pp;
591 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->p_field_mv_table[i][0][mb_index][1]
592 : s->p_field_mv_table[i][0][mb_index][1]*(time_pb - time_pp)/time_pp;
594 return MB_TYPE_DIRECT2 | MB_TYPE_16x8 | MB_TYPE_L0L1 | MB_TYPE_INTERLACED;
596 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;
597 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;
598 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]
599 : s->next_picture.motion_val[0][xy][0]*(time_pb - time_pp)/time_pp;
600 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]
601 : s->next_picture.motion_val[0][xy][1]*(time_pb - time_pp)/time_pp;
602 if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample)
603 s->mv_type= MV_TYPE_16X16;
605 s->mv_type= MV_TYPE_8X8;
606 return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_L0L1; //Note see prev line
610 void ff_h263_update_motion_val(MpegEncContext * s){
611 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
612 //FIXME a lot of thet is only needed for !low_delay
613 const int wrap = s->b8_stride;
614 const int xy = s->block_index[0];
616 s->current_picture.mbskip_table[mb_xy]= s->mb_skiped;
618 if(s->mv_type != MV_TYPE_8X8){
619 int motion_x, motion_y;
623 } else if (s->mv_type == MV_TYPE_16X16) {
624 motion_x = s->mv[0][0][0];
625 motion_y = s->mv[0][0][1];
626 } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {
628 motion_x = s->mv[0][0][0] + s->mv[0][1][0];
629 motion_y = s->mv[0][0][1] + s->mv[0][1][1];
630 motion_x = (motion_x>>1) | (motion_x&1);
632 s->p_field_mv_table[i][0][mb_xy][0]= s->mv[0][i][0];
633 s->p_field_mv_table[i][0][mb_xy][1]= s->mv[0][i][1];
634 s->p_field_select_table[i][mb_xy]= s->field_select[0][i];
638 /* no update if 8X8 because it has been done during parsing */
639 s->current_picture.motion_val[0][xy][0] = motion_x;
640 s->current_picture.motion_val[0][xy][1] = motion_y;
641 s->current_picture.motion_val[0][xy + 1][0] = motion_x;
642 s->current_picture.motion_val[0][xy + 1][1] = motion_y;
643 s->current_picture.motion_val[0][xy + wrap][0] = motion_x;
644 s->current_picture.motion_val[0][xy + wrap][1] = motion_y;
645 s->current_picture.motion_val[0][xy + 1 + wrap][0] = motion_x;
646 s->current_picture.motion_val[0][xy + 1 + wrap][1] = motion_y;
649 if(s->encoding){ //FIXME encoding MUST be cleaned up
650 if (s->mv_type == MV_TYPE_8X8)
651 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_8x8;
653 s->current_picture.mb_type[mb_xy]= MB_TYPE_INTRA;
655 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_16x16;
659 #ifdef CONFIG_ENCODERS
661 static inline int get_p_cbp(MpegEncContext * s,
662 DCTELEM block[6][64],
663 int motion_x, int motion_y){
666 if(s->flags & CODEC_FLAG_CBP_RD){
667 int best_cbpy_score= INT_MAX;
668 int best_cbpc_score= INT_MAX;
669 int cbpc = (-1), cbpy= (-1);
670 const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0);
671 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
674 int score= inter_MCBPC_bits[i + offset] * lambda;
675 if(i&1) score += s->coded_score[5];
676 if(i&2) score += s->coded_score[4];
678 if(score < best_cbpc_score){
679 best_cbpc_score= score;
685 int score= cbpy_tab[i ^ 0xF][1] * lambda;
686 if(i&1) score += s->coded_score[3];
687 if(i&2) score += s->coded_score[2];
688 if(i&4) score += s->coded_score[1];
689 if(i&8) score += s->coded_score[0];
691 if(score < best_cbpy_score){
692 best_cbpy_score= score;
697 if ((motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16){
698 if(best_cbpy_score + best_cbpc_score + 2*lambda >= 0)
702 for (i = 0; i < 6; i++) {
703 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
704 s->block_last_index[i]= -1;
705 memset(s->block[i], 0, sizeof(DCTELEM)*64);
710 for (i = 0; i < 6; i++) {
711 if (s->block_last_index[i] >= 0)
718 static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64],
719 int motion_x, int motion_y, int mb_type){
722 if(s->flags & CODEC_FLAG_CBP_RD){
724 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
727 if(s->coded_score[i] < 0){
728 score += s->coded_score[i];
735 if ((motion_x | motion_y | s->dquant | mb_type) == 0){
736 zero_score-= 4; //2*MV + mb_type + cbp bit
740 if(zero_score <= score){
745 for (i = 0; i < 6; i++) {
746 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
747 s->block_last_index[i]= -1;
748 memset(s->block[i], 0, sizeof(DCTELEM)*64);
752 for (i = 0; i < 6; i++) {
753 if (s->block_last_index[i] >= 0)
760 void mpeg4_encode_mb(MpegEncContext * s,
761 DCTELEM block[6][64],
762 int motion_x, int motion_y)
764 int cbpc, cbpy, pred_x, pred_y;
765 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
766 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=B_TYPE ? &s->tex_pb : &s->pb;
767 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=I_TYPE ? &s->pb2 : &s->pb;
768 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
769 const int dquant_code[5]= {1,0,9,2,3};
771 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
775 if(s->pict_type==B_TYPE){
776 static const int mb_type_table[8]= {-1, 2, 3, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
777 int mb_type= mb_type_table[s->mv_dir];
784 s->last_mv[i][1][1]= 0;
788 assert(s->dquant>=-2 && s->dquant<=2);
789 assert((s->dquant&1)==0);
792 /* nothing to do if this MB was skiped in the next P Frame */
793 if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){ //FIXME avoid DCT & ...
799 s->mv_dir= MV_DIR_FORWARD; //doesnt matter
800 s->qscale -= s->dquant;
806 cbp= get_b_cbp(s, block, motion_x, motion_y, mb_type);
808 if ((cbp | motion_x | motion_y | mb_type) ==0) {
809 /* direct MB with MV={0,0} */
810 assert(s->dquant==0);
812 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
814 if(interleaved_stats){
822 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
823 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
824 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we dont need it :)
825 if(cbp) put_bits(&s->pb, 6, cbp);
829 put_bits(&s->pb, 2, (s->dquant>>2)+3);
831 put_bits(&s->pb, 1, 0);
833 s->qscale -= s->dquant;
835 if(!s->progressive_sequence){
837 put_bits(&s->pb, 1, s->interlaced_dct);
838 if(mb_type) // not diect mode
839 put_bits(&s->pb, 1, s->mv_type == MV_TYPE_FIELD);
842 if(interleaved_stats){
843 s->misc_bits+= get_bits_diff(s);
847 assert(s->mv_dir & MV_DIRECT);
848 h263_encode_motion(s, motion_x, 1);
849 h263_encode_motion(s, motion_y, 1);
853 assert(mb_type > 0 && mb_type < 4);
854 if(s->mv_type != MV_TYPE_FIELD){
855 if(s->mv_dir & MV_DIR_FORWARD){
856 h263_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code);
857 h263_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
858 s->last_mv[0][0][0]= s->last_mv[0][1][0]= s->mv[0][0][0];
859 s->last_mv[0][0][1]= s->last_mv[0][1][1]= s->mv[0][0][1];
862 if(s->mv_dir & MV_DIR_BACKWARD){
863 h263_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code);
864 h263_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
865 s->last_mv[1][0][0]= s->last_mv[1][1][0]= s->mv[1][0][0];
866 s->last_mv[1][0][1]= s->last_mv[1][1][1]= s->mv[1][0][1];
870 if(s->mv_dir & MV_DIR_FORWARD){
871 put_bits(&s->pb, 1, s->field_select[0][0]);
872 put_bits(&s->pb, 1, s->field_select[0][1]);
874 if(s->mv_dir & MV_DIR_BACKWARD){
875 put_bits(&s->pb, 1, s->field_select[1][0]);
876 put_bits(&s->pb, 1, s->field_select[1][1]);
878 if(s->mv_dir & MV_DIR_FORWARD){
880 h263_encode_motion(s, s->mv[0][i][0] - s->last_mv[0][i][0] , s->f_code);
881 h263_encode_motion(s, s->mv[0][i][1] - s->last_mv[0][i][1]/2, s->f_code);
882 s->last_mv[0][i][0]= s->mv[0][i][0];
883 s->last_mv[0][i][1]= s->mv[0][i][1]*2;
887 if(s->mv_dir & MV_DIR_BACKWARD){
889 h263_encode_motion(s, s->mv[1][i][0] - s->last_mv[1][i][0] , s->b_code);
890 h263_encode_motion(s, s->mv[1][i][1] - s->last_mv[1][i][1]/2, s->b_code);
891 s->last_mv[1][i][0]= s->mv[1][i][0];
892 s->last_mv[1][i][1]= s->mv[1][i][1]*2;
899 if(interleaved_stats){
900 s->mv_bits+= get_bits_diff(s);
903 /* encode each block */
904 for (i = 0; i < 6; i++) {
905 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, NULL, &s->pb);
908 if(interleaved_stats){
909 s->p_tex_bits+= get_bits_diff(s);
912 }else{ /* s->pict_type==B_TYPE */
913 cbp= get_p_cbp(s, block, motion_x, motion_y);
915 if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
916 /* check if the B frames can skip it too, as we must skip it if we skip here
917 why didnt they just compress the skip-mb bits instead of reusing them ?! */
918 if(s->max_b_frames>0){
925 if(x+16 > s->width) x= s->width-16;
926 if(y+16 > s->height) y= s->height-16;
928 offset= x + y*s->linesize;
929 p_pic= s->new_picture.data[0] + offset;
932 for(i=0; i<s->max_b_frames; i++){
935 Picture *pic= s->reordered_input_picture[i+1];
937 if(pic==NULL || pic->pict_type!=B_TYPE) break;
939 b_pic= pic->data[0] + offset + 16; //FIXME +16
940 diff= s->dsp.sad[0](NULL, p_pic, b_pic, s->linesize, 16);
941 if(diff>s->qscale*70){ //FIXME check that 70 is optimal
950 /* skip macroblock */
951 put_bits(&s->pb, 1, 1);
953 if(interleaved_stats){
963 put_bits(&s->pb, 1, 0); /* mb coded */
967 if(s->mv_type==MV_TYPE_16X16){
968 if(s->dquant) cbpc+= 8;
970 inter_MCBPC_bits[cbpc],
971 inter_MCBPC_code[cbpc]);
973 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
975 put_bits(pb2, 2, dquant_code[s->dquant+2]);
977 if(!s->progressive_sequence){
979 put_bits(pb2, 1, s->interlaced_dct);
983 if(interleaved_stats){
984 s->misc_bits+= get_bits_diff(s);
987 /* motion vectors: 16x16 mode */
988 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
990 h263_encode_motion(s, motion_x - pred_x, s->f_code);
991 h263_encode_motion(s, motion_y - pred_y, s->f_code);
992 }else if(s->mv_type==MV_TYPE_FIELD){
993 if(s->dquant) cbpc+= 8;
995 inter_MCBPC_bits[cbpc],
996 inter_MCBPC_code[cbpc]);
998 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1000 put_bits(pb2, 2, dquant_code[s->dquant+2]);
1002 assert(!s->progressive_sequence);
1004 put_bits(pb2, 1, s->interlaced_dct);
1005 put_bits(pb2, 1, 1);
1007 if(interleaved_stats){
1008 s->misc_bits+= get_bits_diff(s);
1011 /* motion vectors: 16x8 interlaced mode */
1012 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1015 put_bits(&s->pb, 1, s->field_select[0][0]);
1016 put_bits(&s->pb, 1, s->field_select[0][1]);
1018 h263_encode_motion(s, s->mv[0][0][0] - pred_x, s->f_code);
1019 h263_encode_motion(s, s->mv[0][0][1] - pred_y, s->f_code);
1020 h263_encode_motion(s, s->mv[0][1][0] - pred_x, s->f_code);
1021 h263_encode_motion(s, s->mv[0][1][1] - pred_y, s->f_code);
1023 assert(s->mv_type==MV_TYPE_8X8);
1025 inter_MCBPC_bits[cbpc+16],
1026 inter_MCBPC_code[cbpc+16]);
1027 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1029 if(!s->progressive_sequence){
1031 put_bits(pb2, 1, s->interlaced_dct);
1034 if(interleaved_stats){
1035 s->misc_bits+= get_bits_diff(s);
1039 /* motion vectors: 8x8 mode*/
1040 h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1042 h263_encode_motion(s, s->current_picture.motion_val[0][ s->block_index[i] ][0] - pred_x, s->f_code);
1043 h263_encode_motion(s, s->current_picture.motion_val[0][ s->block_index[i] ][1] - pred_y, s->f_code);
1047 if(interleaved_stats){
1048 s->mv_bits+= get_bits_diff(s);
1051 /* encode each block */
1052 for (i = 0; i < 6; i++) {
1053 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, NULL, tex_pb);
1056 if(interleaved_stats){
1057 s->p_tex_bits+= get_bits_diff(s);
1063 int dc_diff[6]; //dc values with the dc prediction subtracted
1064 int dir[6]; //prediction direction
1065 int zigzag_last_index[6];
1066 uint8_t *scan_table[6];
1070 const int level= block[i][0];
1073 dc_diff[i]= level - ff_mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]);
1075 *dc_ptr = level * s->y_dc_scale;
1077 *dc_ptr = level * s->c_dc_scale;
1081 if(s->flags & CODEC_FLAG_AC_PRED){
1082 s->ac_pred= decide_ac_pred(s, block, dir, scan_table, zigzag_last_index);
1084 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1087 scan_table[i]= s->intra_scantable.permutated;
1092 for (i = 0; i < 6; i++) {
1093 if (s->block_last_index[i] >= 1)
1094 cbp |= 1 << (5 - i);
1098 if (s->pict_type == I_TYPE) {
1099 if(s->dquant) cbpc+=4;
1101 intra_MCBPC_bits[cbpc],
1102 intra_MCBPC_code[cbpc]);
1104 if(s->dquant) cbpc+=8;
1105 put_bits(&s->pb, 1, 0); /* mb coded */
1107 inter_MCBPC_bits[cbpc + 4],
1108 inter_MCBPC_code[cbpc + 4]);
1110 put_bits(pb2, 1, s->ac_pred);
1112 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1114 put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
1116 if(!s->progressive_sequence){
1117 put_bits(dc_pb, 1, s->interlaced_dct);
1120 if(interleaved_stats){
1121 s->misc_bits+= get_bits_diff(s);
1124 /* encode each block */
1125 for (i = 0; i < 6; i++) {
1126 mpeg4_encode_block(s, block[i], i, dc_diff[i], scan_table[i], dc_pb, tex_pb);
1129 if(interleaved_stats){
1130 s->i_tex_bits+= get_bits_diff(s);
1134 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
1136 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1140 void h263_encode_mb(MpegEncContext * s,
1141 DCTELEM block[6][64],
1142 int motion_x, int motion_y)
1144 int cbpc, cbpy, i, cbp, pred_x, pred_y;
1146 int16_t rec_intradc[6];
1147 uint16_t *dc_ptr[6];
1148 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1);
1149 const int dquant_code[5]= {1,0,9,2,3};
1151 //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
1154 cbp= get_p_cbp(s, block, motion_x, motion_y);
1156 if ((cbp | motion_x | motion_y | s->dquant | (s->mv_type - MV_TYPE_16X16)) == 0) {
1157 /* skip macroblock */
1158 put_bits(&s->pb, 1, 1);
1159 if(interleaved_stats){
1167 put_bits(&s->pb, 1, 0); /* mb coded */
1171 if(s->alt_inter_vlc==0 || cbpc!=3)
1173 if(s->dquant) cbpc+= 8;
1174 if(s->mv_type==MV_TYPE_16X16){
1176 inter_MCBPC_bits[cbpc],
1177 inter_MCBPC_code[cbpc]);
1179 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1181 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1183 if(interleaved_stats){
1184 s->misc_bits+= get_bits_diff(s);
1187 /* motion vectors: 16x16 mode */
1188 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
1191 h263_encode_motion(s, motion_x - pred_x, 1);
1192 h263_encode_motion(s, motion_y - pred_y, 1);
1195 h263p_encode_umotion(s, motion_x - pred_x);
1196 h263p_encode_umotion(s, motion_y - pred_y);
1197 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
1198 /* To prevent Start Code emulation */
1199 put_bits(&s->pb,1,1);
1203 inter_MCBPC_bits[cbpc+16],
1204 inter_MCBPC_code[cbpc+16]);
1205 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1207 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1209 if(interleaved_stats){
1210 s->misc_bits+= get_bits_diff(s);
1214 /* motion vectors: 8x8 mode*/
1215 h263_pred_motion(s, i, 0, &pred_x, &pred_y);
1217 motion_x= s->current_picture.motion_val[0][ s->block_index[i] ][0];
1218 motion_y= s->current_picture.motion_val[0][ s->block_index[i] ][1];
1220 h263_encode_motion(s, motion_x - pred_x, 1);
1221 h263_encode_motion(s, motion_y - pred_y, 1);
1224 h263p_encode_umotion(s, motion_x - pred_x);
1225 h263p_encode_umotion(s, motion_y - pred_y);
1226 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
1227 /* To prevent Start Code emulation */
1228 put_bits(&s->pb,1,1);
1233 if(interleaved_stats){
1234 s->mv_bits+= get_bits_diff(s);
1237 assert(s->mb_intra);
1242 for(i=0; i<6; i++) {
1243 int16_t level = block[i][0];
1246 if(i<4) scale= s->y_dc_scale;
1247 else scale= s->c_dc_scale;
1249 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
1253 level = (level + (scale>>1))/scale;
1255 level = (level - (scale>>1))/scale;
1257 /* AIC can change CBP */
1258 if (level == 0 && s->block_last_index[i] == 0)
1259 s->block_last_index[i] = -1;
1261 if(!s->modified_quant){
1264 else if (level > 127)
1268 block[i][0] = level;
1269 /* Reconstruction */
1270 rec_intradc[i] = scale*level + pred_dc;
1272 rec_intradc[i] |= 1;
1273 //if ((rec_intradc[i] % 2) == 0)
1274 // rec_intradc[i]++;
1276 if (rec_intradc[i] < 0)
1278 else if (rec_intradc[i] > 2047)
1279 rec_intradc[i] = 2047;
1281 /* Update AC/DC tables */
1282 *dc_ptr[i] = rec_intradc[i];
1283 if (s->block_last_index[i] >= 0)
1284 cbp |= 1 << (5 - i);
1287 for(i=0; i<6; i++) {
1289 if (s->block_last_index[i] >= 1)
1290 cbp |= 1 << (5 - i);
1295 if (s->pict_type == I_TYPE) {
1296 if(s->dquant) cbpc+=4;
1298 intra_MCBPC_bits[cbpc],
1299 intra_MCBPC_code[cbpc]);
1301 if(s->dquant) cbpc+=8;
1302 put_bits(&s->pb, 1, 0); /* mb coded */
1304 inter_MCBPC_bits[cbpc + 4],
1305 inter_MCBPC_code[cbpc + 4]);
1308 /* XXX: currently, we do not try to use ac prediction */
1309 put_bits(&s->pb, 1, 0); /* no AC prediction */
1312 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1314 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1316 if(interleaved_stats){
1317 s->misc_bits+= get_bits_diff(s);
1321 for(i=0; i<6; i++) {
1322 /* encode each block */
1323 h263_encode_block(s, block[i], i);
1325 /* Update INTRADC for decoding */
1326 if (s->h263_aic && s->mb_intra) {
1327 block[i][0] = rec_intradc[i];
1332 if(interleaved_stats){
1334 s->p_tex_bits+= get_bits_diff(s);
1337 s->i_tex_bits+= get_bits_diff(s);
1344 void ff_h263_loop_filter(MpegEncContext * s){
1346 const int linesize = s->linesize;
1347 const int uvlinesize= s->uvlinesize;
1348 const int xy = s->mb_y * s->mb_stride + s->mb_x;
1349 uint8_t *dest_y = s->dest[0];
1350 uint8_t *dest_cb= s->dest[1];
1351 uint8_t *dest_cr= s->dest[2];
1353 // if(s->pict_type==B_TYPE && !s->readable) return;
1359 if(!IS_SKIP(s->current_picture.mb_type[xy])){
1361 s->dsp.h263_v_loop_filter(dest_y+8*linesize , linesize, qp_c);
1362 s->dsp.h263_v_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
1367 int qp_dt, qp_t, qp_tc;
1369 if(IS_SKIP(s->current_picture.mb_type[xy-s->mb_stride]))
1372 qp_t= s->current_picture.qscale_table[xy-s->mb_stride];
1380 const int chroma_qp= s->chroma_qscale_table[qp_tc];
1381 s->dsp.h263_v_loop_filter(dest_y , linesize, qp_tc);
1382 s->dsp.h263_v_loop_filter(dest_y+8, linesize, qp_tc);
1384 s->dsp.h263_v_loop_filter(dest_cb , uvlinesize, chroma_qp);
1385 s->dsp.h263_v_loop_filter(dest_cr , uvlinesize, chroma_qp);
1389 s->dsp.h263_h_loop_filter(dest_y-8*linesize+8 , linesize, qp_t);
1392 if(qp_t || IS_SKIP(s->current_picture.mb_type[xy-1-s->mb_stride]))
1395 qp_dt= s->current_picture.qscale_table[xy-1-s->mb_stride];
1398 const int chroma_qp= s->chroma_qscale_table[qp_dt];
1399 s->dsp.h263_h_loop_filter(dest_y -8*linesize , linesize, qp_dt);
1400 s->dsp.h263_h_loop_filter(dest_cb-8*uvlinesize, uvlinesize, chroma_qp);
1401 s->dsp.h263_h_loop_filter(dest_cb-8*uvlinesize, uvlinesize, chroma_qp);
1407 s->dsp.h263_h_loop_filter(dest_y +8, linesize, qp_c);
1408 if(s->mb_y + 1 == s->mb_height)
1409 s->dsp.h263_h_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
1414 if(qp_c || IS_SKIP(s->current_picture.mb_type[xy-1]))
1417 qp_lc= s->current_picture.qscale_table[xy-1];
1420 s->dsp.h263_h_loop_filter(dest_y, linesize, qp_lc);
1421 if(s->mb_y + 1 == s->mb_height){
1422 const int chroma_qp= s->chroma_qscale_table[qp_lc];
1423 s->dsp.h263_h_loop_filter(dest_y +8* linesize, linesize, qp_lc);
1424 s->dsp.h263_h_loop_filter(dest_cb , uvlinesize, chroma_qp);
1425 s->dsp.h263_h_loop_filter(dest_cr , uvlinesize, chroma_qp);
1431 static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr)
1433 int x, y, wrap, a, c, pred_dc, scale;
1434 int16_t *dc_val, *ac_val;
1436 /* find prediction */
1438 x = 2 * s->mb_x + (n & 1);
1439 y = 2 * s->mb_y + ((n & 2) >> 1);
1440 wrap = s->b8_stride;
1441 dc_val = s->dc_val[0];
1442 ac_val = s->ac_val[0][0];
1443 scale = s->y_dc_scale;
1447 wrap = s->mb_stride;
1448 dc_val = s->dc_val[n - 4 + 1];
1449 ac_val = s->ac_val[n - 4 + 1][0];
1450 scale = s->c_dc_scale;
1455 a = dc_val[(x - 1) + (y) * wrap];
1456 c = dc_val[(x) + (y - 1) * wrap];
1458 /* No prediction outside GOB boundary */
1459 if(s->first_slice_line && n!=3){
1461 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
1464 /* just DC prediction */
1465 if (a != 1024 && c != 1024)
1466 pred_dc = (a + c) >> 1;
1472 /* we assume pred is positive */
1473 //pred_dc = (pred_dc + (scale >> 1)) / scale;
1474 *dc_val_ptr = &dc_val[x + y * wrap];
1478 static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n)
1480 int x, y, wrap, a, c, pred_dc, scale, i;
1481 int16_t *dc_val, *ac_val, *ac_val1;
1483 /* find prediction */
1485 x = 2 * s->mb_x + (n & 1);
1486 y = 2 * s->mb_y + (n>> 1);
1487 wrap = s->b8_stride;
1488 dc_val = s->dc_val[0];
1489 ac_val = s->ac_val[0][0];
1490 scale = s->y_dc_scale;
1494 wrap = s->mb_stride;
1495 dc_val = s->dc_val[n - 4 + 1];
1496 ac_val = s->ac_val[n - 4 + 1][0];
1497 scale = s->c_dc_scale;
1500 ac_val += ((y) * wrap + (x)) * 16;
1506 a = dc_val[(x - 1) + (y) * wrap];
1507 c = dc_val[(x) + (y - 1) * wrap];
1509 /* No prediction outside GOB boundary */
1510 if(s->first_slice_line && n!=3){
1512 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
1517 if (s->h263_aic_dir) {
1518 /* left prediction */
1522 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
1527 /* top prediction */
1529 ac_val -= 16 * wrap;
1531 block[s->dsp.idct_permutation[i ]] += ac_val[i + 8];
1537 /* just DC prediction */
1538 if (a != 1024 && c != 1024)
1539 pred_dc = (a + c) >> 1;
1546 /* we assume pred is positive */
1547 block[0]=block[0]*scale + pred_dc;
1554 /* Update AC/DC tables */
1555 dc_val[(x) + (y) * wrap] = block[0];
1559 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
1562 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
1565 int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir,
1569 int16_t *A, *B, *C, (*mot_val)[2];
1570 static const int off[4]= {2, 1, 1, -1};
1572 wrap = s->b8_stride;
1573 mot_val = s->current_picture.motion_val[dir] + s->block_index[block];
1576 /* special case for first (slice) line */
1577 if (s->first_slice_line && block<3) {
1578 // we cant just change some MVs to simulate that as we need them for the B frames (and ME)
1579 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
1580 if(block==0){ //most common case
1581 if(s->mb_x == s->resync_mb_x){ //rare
1583 }else if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
1584 C = mot_val[off[block] - wrap];
1589 *px = mid_pred(A[0], 0, C[0]);
1590 *py = mid_pred(A[1], 0, C[1]);
1597 if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
1598 C = mot_val[off[block] - wrap];
1599 *px = mid_pred(A[0], 0, C[0]);
1600 *py = mid_pred(A[1], 0, C[1]);
1605 }else{ /* block==2*/
1606 B = mot_val[ - wrap];
1607 C = mot_val[off[block] - wrap];
1608 if(s->mb_x == s->resync_mb_x) //rare
1611 *px = mid_pred(A[0], B[0], C[0]);
1612 *py = mid_pred(A[1], B[1], C[1]);
1615 B = mot_val[ - wrap];
1616 C = mot_val[off[block] - wrap];
1617 *px = mid_pred(A[0], B[0], C[0]);
1618 *py = mid_pred(A[1], B[1], C[1]);
1623 #ifdef CONFIG_ENCODERS
1624 static void h263_encode_motion(MpegEncContext * s, int val, int f_code)
1626 int range, l, bit_size, sign, code, bits;
1631 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1633 bit_size = f_code - 1;
1634 range = 1 << bit_size;
1635 /* modulo encoding */
1642 val= (val^sign)-sign;
1647 } else if (val >= l) {
1651 assert(val>=-l && val<l);
1661 code = (val >> bit_size) + 1;
1662 bits = val & (range - 1);
1664 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1666 put_bits(&s->pb, bit_size, bits);
1672 /* Encode MV differences on H.263+ with Unrestricted MV mode */
1673 static void h263p_encode_umotion(MpegEncContext * s, int val)
1683 put_bits(&s->pb, 1, 1);
1685 put_bits(&s->pb, 3, 0);
1687 put_bits(&s->pb, 3, 2);
1690 sval = ((val < 0) ? (short)(-val):(short)val);
1693 while (temp_val != 0) {
1694 temp_val = temp_val >> 1;
1700 tcode = (sval & (1 << (i-1))) >> (i-1);
1701 tcode = (tcode << 1) | 1;
1702 code = (code << 2) | tcode;
1705 code = ((code << 1) | (val < 0)) << 1;
1706 put_bits(&s->pb, (2*n_bits)+1, code);
1707 //printf("\nVal = %d\tCode = %d", sval, code);
1711 static void init_mv_penalty_and_fcode(MpegEncContext *s)
1716 if(mv_penalty==NULL)
1717 mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
1719 for(f_code=1; f_code<=MAX_FCODE; f_code++){
1720 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
1723 if(mv==0) len= mvtab[0][1];
1725 int val, bit_size, range, code;
1727 bit_size = f_code - 1;
1728 range = 1 << bit_size;
1734 code = (val >> bit_size) + 1;
1736 len= mvtab[code][1] + 1 + bit_size;
1738 len= mvtab[32][1] + 2 + bit_size;
1742 mv_penalty[f_code][mv+MAX_MV]= len;
1746 for(f_code=MAX_FCODE; f_code>0; f_code--){
1747 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
1748 fcode_tab[mv+MAX_MV]= f_code;
1752 for(mv=0; mv<MAX_MV*2+1; mv++){
1753 umv_fcode_tab[mv]= 1;
1758 #ifdef CONFIG_ENCODERS
1760 static void init_uni_dc_tab(void)
1762 int level, uni_code, uni_len;
1764 for(level=-256; level<256; level++){
1766 /* find number of bits */
1775 l= (-level) ^ ((1 << size) - 1);
1780 uni_code= DCtab_lum[size][0];
1781 uni_len = DCtab_lum[size][1];
1784 uni_code<<=size; uni_code|=l;
1787 uni_code<<=1; uni_code|=1;
1791 uni_DCtab_lum_bits[level+256]= uni_code;
1792 uni_DCtab_lum_len [level+256]= uni_len;
1795 uni_code= DCtab_chrom[size][0];
1796 uni_len = DCtab_chrom[size][1];
1799 uni_code<<=size; uni_code|=l;
1802 uni_code<<=1; uni_code|=1;
1806 uni_DCtab_chrom_bits[level+256]= uni_code;
1807 uni_DCtab_chrom_len [level+256]= uni_len;
1812 #endif //CONFIG_ENCODERS
1814 #ifdef CONFIG_ENCODERS
1815 static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1816 int slevel, run, last;
1818 assert(MAX_LEVEL >= 64);
1819 assert(MAX_RUN >= 63);
1821 for(slevel=-64; slevel<64; slevel++){
1822 if(slevel==0) continue;
1823 for(run=0; run<64; run++){
1824 for(last=0; last<=1; last++){
1825 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1826 int level= slevel < 0 ? -slevel : slevel;
1827 int sign= slevel < 0 ? 1 : 0;
1828 int bits, len, code;
1831 len_tab[index]= 100;
1834 code= get_rl_index(rl, last, run, level);
1835 bits= rl->table_vlc[code][0];
1836 len= rl->table_vlc[code][1];
1837 bits=bits*2+sign; len++;
1839 if(code!=rl->n && len < len_tab[index]){
1840 bits_tab[index]= bits;
1841 len_tab [index]= len;
1845 bits= rl->table_vlc[rl->n][0];
1846 len= rl->table_vlc[rl->n][1];
1847 bits=bits*2; len++; //esc1
1848 level1= level - rl->max_level[last][run];
1850 code= get_rl_index(rl, last, run, level1);
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;
1864 bits= rl->table_vlc[rl->n][0];
1865 len= rl->table_vlc[rl->n][1];
1866 bits=bits*4+2; len+=2; //esc2
1867 run1 = run - rl->max_run[last][level] - 1;
1869 code= get_rl_index(rl, last, run1, level);
1870 bits<<= rl->table_vlc[code][1];
1871 len += rl->table_vlc[code][1];
1872 bits += rl->table_vlc[code][0];
1873 bits=bits*2+sign; len++;
1875 if(code!=rl->n && len < len_tab[index]){
1876 bits_tab[index]= bits;
1877 len_tab [index]= len;
1882 bits= rl->table_vlc[rl->n][0];
1883 len = rl->table_vlc[rl->n][1];
1884 bits=bits*4+3; len+=2; //esc3
1885 bits=bits*2+last; len++;
1886 bits=bits*64+run; len+=6;
1887 bits=bits*2+1; len++; //marker
1888 bits=bits*4096+(slevel&0xfff); len+=12;
1889 bits=bits*2+1; len++; //marker
1891 if(len < len_tab[index]){
1892 bits_tab[index]= bits;
1893 len_tab [index]= len;
1900 void h263_encode_init(MpegEncContext *s)
1902 static int done = 0;
1911 init_rl(&rl_intra_aic);
1913 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
1914 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
1916 init_mv_penalty_and_fcode(s);
1918 s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
1920 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
1921 switch(s->codec_id){
1922 case CODEC_ID_MPEG4:
1923 s->fcode_tab= fcode_tab;
1924 s->min_qcoeff= -2048;
1925 s->max_qcoeff= 2047;
1926 s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len;
1927 s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64;
1928 s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len;
1929 s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64;
1930 s->luma_dc_vlc_length= uni_DCtab_lum_len;
1931 s->chroma_dc_vlc_length= uni_DCtab_chrom_len;
1932 s->ac_esc_length= 7+2+1+6+1+12+1;
1933 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
1934 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
1936 if(s->flags & CODEC_FLAG_GLOBAL_HEADER){
1938 s->avctx->extradata= av_malloc(1024);
1939 init_put_bits(&s->pb, s->avctx->extradata, 1024);
1941 mpeg4_encode_visual_object_header(s);
1942 mpeg4_encode_vol_header(s, 0, 0);
1944 // ff_mpeg4_stuffing(&s->pb); ?
1945 flush_put_bits(&s->pb);
1946 s->avctx->extradata_size= (put_bits_count(&s->pb)+7)>>3;
1950 case CODEC_ID_H263P:
1952 s->fcode_tab= umv_fcode_tab;
1953 if(s->modified_quant){
1954 s->min_qcoeff= -2047;
1955 s->max_qcoeff= 2047;
1957 s->min_qcoeff= -127;
1961 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
1963 if (s->h263_flv > 1) {
1964 s->min_qcoeff= -1023;
1965 s->max_qcoeff= 1023;
1967 s->min_qcoeff= -127;
1970 s->y_dc_scale_table=
1971 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
1973 default: //nothing needed default table allready set in mpegvideo.c
1974 s->min_qcoeff= -127;
1976 s->y_dc_scale_table=
1977 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
1982 * encodes a 8x8 block.
1983 * @param block the 8x8 block
1984 * @param n block index (0-3 are luma, 4-5 are chroma)
1986 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
1988 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
1992 if (s->mb_intra && !s->h263_aic) {
1995 /* 255 cannot be represented, so we clamp */
2000 /* 0 cannot be represented also */
2001 else if (level < 1) {
2005 if (level == 128) //FIXME check rv10
2006 put_bits(&s->pb, 8, 0xff);
2008 put_bits(&s->pb, 8, level);
2012 if (s->h263_aic && s->mb_intra)
2015 if(s->alt_inter_vlc && !s->mb_intra){
2017 int inter_vlc_bits=0;
2021 last_index = s->block_last_index[n];
2022 last_non_zero = i - 1;
2023 for (; i <= last_index; i++) {
2024 j = s->intra_scantable.permutated[i];
2027 run = i - last_non_zero - 1;
2028 last = (i == last_index);
2030 if(level<0) level= -level;
2032 code = get_rl_index(rl, last, run, level);
2033 aic_code = get_rl_index(&rl_intra_aic, last, run, level);
2034 inter_vlc_bits += rl->table_vlc[code][1]+1;
2035 aic_vlc_bits += rl_intra_aic.table_vlc[aic_code][1]+1;
2037 if (code == rl->n) {
2038 inter_vlc_bits += 1+6+8-1;
2040 if (aic_code == rl_intra_aic.n) {
2041 aic_vlc_bits += 1+6+8-1;
2042 wrong_pos += run + 1;
2044 wrong_pos += wrong_run[aic_code];
2049 if(aic_vlc_bits < inter_vlc_bits && wrong_pos > 63)
2055 last_index = s->block_last_index[n];
2056 last_non_zero = i - 1;
2057 for (; i <= last_index; i++) {
2058 j = s->intra_scantable.permutated[i];
2061 run = i - last_non_zero - 1;
2062 last = (i == last_index);
2069 code = get_rl_index(rl, last, run, level);
2070 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2071 if (code == rl->n) {
2072 if(s->h263_flv <= 1){
2073 put_bits(&s->pb, 1, last);
2074 put_bits(&s->pb, 6, run);
2076 assert(slevel != 0);
2079 put_bits(&s->pb, 8, slevel & 0xff);
2081 put_bits(&s->pb, 8, 128);
2082 put_bits(&s->pb, 5, slevel & 0x1f);
2083 put_bits(&s->pb, 6, (slevel>>5)&0x3f);
2086 if(level < 64) { // 7-bit level
2087 put_bits(&s->pb, 1, 0);
2088 put_bits(&s->pb, 1, last);
2089 put_bits(&s->pb, 6, run);
2091 put_bits(&s->pb, 7, slevel & 0x7f);
2094 put_bits(&s->pb, 1, 1);
2095 put_bits(&s->pb, 1, last);
2096 put_bits(&s->pb, 6, run);
2098 put_bits(&s->pb, 11, slevel & 0x7ff);
2102 put_bits(&s->pb, 1, sign);
2110 #ifdef CONFIG_ENCODERS
2112 /***************************************************/
2114 * add mpeg4 stuffing bits (01...1)
2116 void ff_mpeg4_stuffing(PutBitContext * pbc)
2119 put_bits(pbc, 1, 0);
2120 length= (-put_bits_count(pbc))&7;
2121 if(length) put_bits(pbc, length, (1<<length)-1);
2124 /* must be called before writing the header */
2125 void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){
2126 int time_div, time_mod;
2128 assert(s->current_picture_ptr->pts != AV_NOPTS_VALUE);
2129 s->time= (s->current_picture_ptr->pts*s->time_increment_resolution + AV_TIME_BASE/2)/AV_TIME_BASE;
2131 time_div= s->time/s->time_increment_resolution;
2132 time_mod= s->time%s->time_increment_resolution;
2134 if(s->pict_type==B_TYPE){
2135 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
2137 s->last_time_base= s->time_base;
2138 s->time_base= time_div;
2139 s->pp_time= s->time - s->last_non_b_time;
2140 s->last_non_b_time= s->time;
2144 static void mpeg4_encode_gop_header(MpegEncContext * s){
2145 int hours, minutes, seconds;
2148 put_bits(&s->pb, 16, 0);
2149 put_bits(&s->pb, 16, GOP_STARTCODE);
2151 time= s->current_picture_ptr->pts;
2152 if(s->reordered_input_picture[1])
2153 time= FFMIN(time, s->reordered_input_picture[1]->pts);
2154 time= (time*s->time_increment_resolution + AV_TIME_BASE/2)/AV_TIME_BASE;
2156 seconds= time/s->time_increment_resolution;
2157 minutes= seconds/60; seconds %= 60;
2158 hours= minutes/60; minutes %= 60;
2161 put_bits(&s->pb, 5, hours);
2162 put_bits(&s->pb, 6, minutes);
2163 put_bits(&s->pb, 1, 1);
2164 put_bits(&s->pb, 6, seconds);
2166 put_bits(&s->pb, 1, !!(s->flags&CODEC_FLAG_CLOSED_GOP));
2167 put_bits(&s->pb, 1, 0); //broken link == NO
2169 s->last_time_base= time / s->time_increment_resolution;
2171 ff_mpeg4_stuffing(&s->pb);
2174 static void mpeg4_encode_visual_object_header(MpegEncContext * s){
2175 int profile_and_level_indication;
2178 if(s->max_b_frames || s->quarter_sample){
2179 profile_and_level_indication= 0xF1; // adv simple level 1
2182 profile_and_level_indication= 0x01; // simple level 1
2187 put_bits(&s->pb, 16, 0);
2188 put_bits(&s->pb, 16, VOS_STARTCODE);
2190 put_bits(&s->pb, 8, profile_and_level_indication);
2192 put_bits(&s->pb, 16, 0);
2193 put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);
2195 put_bits(&s->pb, 1, 1);
2196 put_bits(&s->pb, 4, vo_ver_id);
2197 put_bits(&s->pb, 3, 1); //priority
2199 put_bits(&s->pb, 4, 1); //visual obj type== video obj
2201 put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME
2203 ff_mpeg4_stuffing(&s->pb);
2206 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number)
2210 if(s->max_b_frames || s->quarter_sample){
2212 s->vo_type= ADV_SIMPLE_VO_TYPE;
2215 s->vo_type= SIMPLE_VO_TYPE;
2218 put_bits(&s->pb, 16, 0);
2219 put_bits(&s->pb, 16, 0x100 + vo_number); /* video obj */
2220 put_bits(&s->pb, 16, 0);
2221 put_bits(&s->pb, 16, 0x120 + vol_number); /* video obj layer */
2223 put_bits(&s->pb, 1, 0); /* random access vol */
2224 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
2225 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
2226 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
2227 put_bits(&s->pb, 3, 1); /* is obj layer priority */
2229 aspect_to_info(s, s->avctx->sample_aspect_ratio);
2231 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
2232 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
2233 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
2234 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
2238 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
2239 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
2240 put_bits(&s->pb, 1, s->low_delay);
2241 put_bits(&s->pb, 1, 0); /* vbv parameters= no */
2243 put_bits(&s->pb, 1, 0); /* vol control parameters= no */
2246 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
2247 put_bits(&s->pb, 1, 1); /* marker bit */
2249 put_bits(&s->pb, 16, s->time_increment_resolution);
2250 if (s->time_increment_bits < 1)
2251 s->time_increment_bits = 1;
2252 put_bits(&s->pb, 1, 1); /* marker bit */
2253 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
2254 put_bits(&s->pb, 1, 1); /* marker bit */
2255 put_bits(&s->pb, 13, s->width); /* vol width */
2256 put_bits(&s->pb, 1, 1); /* marker bit */
2257 put_bits(&s->pb, 13, s->height); /* vol height */
2258 put_bits(&s->pb, 1, 1); /* marker bit */
2259 put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
2260 put_bits(&s->pb, 1, 1); /* obmc disable */
2261 if (vo_ver_id == 1) {
2262 put_bits(&s->pb, 1, s->vol_sprite_usage); /* sprite enable */
2264 put_bits(&s->pb, 2, s->vol_sprite_usage); /* sprite enable */
2267 put_bits(&s->pb, 1, 0); /* not 8 bit == false */
2268 put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
2271 ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix);
2272 ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix);
2276 put_bits(&s->pb, 1, s->quarter_sample);
2277 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
2278 s->resync_marker= s->rtp_mode;
2279 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
2280 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
2281 if(s->data_partitioning){
2282 put_bits(&s->pb, 1, 0); /* no rvlc */
2285 if (vo_ver_id != 1){
2286 put_bits(&s->pb, 1, 0); /* newpred */
2287 put_bits(&s->pb, 1, 0); /* reduced res vop */
2289 put_bits(&s->pb, 1, 0); /* scalability */
2291 ff_mpeg4_stuffing(&s->pb);
2294 if(!(s->flags & CODEC_FLAG_BITEXACT)){
2295 put_bits(&s->pb, 16, 0);
2296 put_bits(&s->pb, 16, 0x1B2); /* user_data */
2297 put_string(&s->pb, LIBAVCODEC_IDENT, 0);
2301 /* write mpeg4 VOP header */
2302 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
2305 int time_div, time_mod;
2307 if(s->pict_type==I_TYPE){
2308 if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
2309 if(s->strict_std_compliance < 2) //HACK, the reference sw is buggy
2310 mpeg4_encode_visual_object_header(s);
2311 if(s->strict_std_compliance < 2 || picture_number==0) //HACK, the reference sw is buggy
2312 mpeg4_encode_vol_header(s, 0, 0);
2314 mpeg4_encode_gop_header(s);
2317 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
2319 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->frame_rate, FRAME_RATE_BASE);
2321 put_bits(&s->pb, 16, 0); /* vop header */
2322 put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */
2323 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
2325 time_div= s->time/s->time_increment_resolution;
2326 time_mod= s->time%s->time_increment_resolution;
2327 time_incr= time_div - s->last_time_base;
2328 assert(time_incr >= 0);
2330 put_bits(&s->pb, 1, 1);
2332 put_bits(&s->pb, 1, 0);
2334 put_bits(&s->pb, 1, 1); /* marker */
2335 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
2336 put_bits(&s->pb, 1, 1); /* marker */
2337 put_bits(&s->pb, 1, 1); /* vop coded */
2338 if ( s->pict_type == P_TYPE
2339 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
2340 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
2342 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
2343 if(!s->progressive_sequence){
2344 put_bits(&s->pb, 1, s->current_picture_ptr->top_field_first);
2345 put_bits(&s->pb, 1, s->alternate_scan);
2347 //FIXME sprite stuff
2349 put_bits(&s->pb, 5, s->qscale);
2351 if (s->pict_type != I_TYPE)
2352 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
2353 if (s->pict_type == B_TYPE)
2354 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
2355 // printf("****frame %d\n", picture_number);
2358 #endif //CONFIG_ENCODERS
2361 * set qscale and update qscale dependant variables.
2363 void ff_set_qscale(MpegEncContext * s, int qscale)
2367 else if (qscale > 31)
2371 s->chroma_qscale= s->chroma_qscale_table[qscale];
2373 s->y_dc_scale= s->y_dc_scale_table[ qscale ];
2374 s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
2379 * @param n block index (0-3 are luma, 4-5 are chroma)
2380 * @param dc_val_ptr a pointer to the dc_val entry for the current MB will be stored here
2381 * @param dir_ptr pointer to an integer where the prediction direction will be stored
2382 * @return the quantized predicted dc
2384 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr, int *dir_ptr)
2386 int a, b, c, wrap, pred, scale;
2389 /* find prediction */
2391 scale = s->y_dc_scale;
2393 scale = s->c_dc_scale;
2398 wrap= s->block_wrap[n];
2399 dc_val = s->dc_val[0] + s->block_index[n];
2405 b = dc_val[ - 1 - wrap];
2406 c = dc_val[ - wrap];
2408 /* outside slice handling (we cant do that by memset as we need the dc for error resilience) */
2409 if(s->first_slice_line && n!=3){
2411 if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
2413 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
2414 if(n==0 || n==4 || n==5)
2418 if (abs(a - b) < abs(b - c)) {
2420 *dir_ptr = 1; /* top */
2423 *dir_ptr = 0; /* left */
2425 /* we assume pred is positive */
2426 pred = FASTDIV((pred + (scale >> 1)), scale);
2428 /* prepare address for prediction update */
2429 *dc_val_ptr = &dc_val[0];
2436 * @param n block index (0-3 are luma, 4-5 are chroma)
2437 * @param dir the ac prediction direction
2439 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
2443 int16_t *ac_val, *ac_val1;
2444 int8_t * const qscale_table= s->current_picture.qscale_table;
2446 /* find prediction */
2447 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2451 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
2452 /* left prediction */
2455 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
2458 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
2461 /* different qscale, we must rescale */
2463 block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
2467 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
2468 /* top prediction */
2469 ac_val -= 16 * s->block_wrap[n];
2471 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
2474 block[s->dsp.idct_permutation[i]] += ac_val[i + 8];
2477 /* different qscale, we must rescale */
2479 block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
2486 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
2490 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
2494 #ifdef CONFIG_ENCODERS
2497 * encodes the dc value.
2498 * @param n block index (0-3 are luma, 4-5 are chroma)
2500 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
2503 // if(level<-255 || level>255) printf("dc overflow\n");
2507 put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]);
2510 put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]);
2514 /* find number of bits */
2524 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
2527 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
2530 /* encode remaining bits */
2533 level = (-level) ^ ((1 << size) - 1);
2534 put_bits(&s->pb, size, level);
2536 put_bits(&s->pb, 1, 1);
2542 * encodes a 8x8 block
2543 * @param n block index (0-3 are luma, 4-5 are chroma)
2545 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2546 uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
2548 int i, last_non_zero;
2549 #if 0 //variables for the outcommented version
2550 int code, sign, last;
2555 const int last_index = s->block_last_index[n];
2557 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2558 /* mpeg4 based DC predictor */
2559 mpeg4_encode_dc(dc_pb, intra_dc, n);
2560 if(last_index<1) return;
2563 bits_tab= uni_mpeg4_intra_rl_bits;
2564 len_tab = uni_mpeg4_intra_rl_len;
2566 if(last_index<0) return;
2569 bits_tab= uni_mpeg4_inter_rl_bits;
2570 len_tab = uni_mpeg4_inter_rl_len;
2574 last_non_zero = i - 1;
2576 for (; i < last_index; i++) {
2577 int level = block[ scan_table[i] ];
2579 int run = i - last_non_zero - 1;
2581 if((level&(~127)) == 0){
2582 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2583 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2585 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);
2590 /*if(i<=last_index)*/{
2591 int level = block[ scan_table[i] ];
2592 int run = i - last_non_zero - 1;
2594 if((level&(~127)) == 0){
2595 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2596 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2598 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);
2602 for (; i <= last_index; i++) {
2603 const int slevel = block[ scan_table[i] ];
2606 int run = i - last_non_zero - 1;
2607 last = (i == last_index);
2614 code = get_rl_index(rl, last, run, level);
2615 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2616 if (code == rl->n) {
2618 level1 = level - rl->max_level[last][run];
2621 code = get_rl_index(rl, last, run, level1);
2622 if (code == rl->n) {
2624 put_bits(ac_pb, 1, 1);
2625 if (level > MAX_LEVEL)
2627 run1 = run - rl->max_run[last][level] - 1;
2630 code = get_rl_index(rl, last, run1, level);
2631 if (code == rl->n) {
2634 put_bits(ac_pb, 1, 1);
2635 put_bits(ac_pb, 1, last);
2636 put_bits(ac_pb, 6, run);
2637 put_bits(ac_pb, 1, 1);
2638 put_bits(ac_pb, 12, slevel & 0xfff);
2639 put_bits(ac_pb, 1, 1);
2642 put_bits(ac_pb, 1, 0);
2643 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2644 put_bits(ac_pb, 1, sign);
2648 put_bits(ac_pb, 1, 0);
2649 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2650 put_bits(ac_pb, 1, sign);
2653 put_bits(ac_pb, 1, sign);
2661 static inline int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2662 uint8_t *scan_table)
2664 int i, last_non_zero;
2667 const int last_index = s->block_last_index[n];
2670 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2671 /* mpeg4 based DC predictor */
2672 //mpeg4_encode_dc(dc_pb, intra_dc, n); //FIXME
2673 if(last_index<1) return len;
2676 len_tab = uni_mpeg4_intra_rl_len;
2678 if(last_index<0) return 0;
2681 len_tab = uni_mpeg4_inter_rl_len;
2685 last_non_zero = i - 1;
2686 for (; i < last_index; i++) {
2687 int level = block[ scan_table[i] ];
2689 int run = i - last_non_zero - 1;
2691 if((level&(~127)) == 0){
2692 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2693 len += len_tab[index];
2695 len += 7+2+1+6+1+12+1;
2700 /*if(i<=last_index)*/{
2701 int level = block[ scan_table[i] ];
2702 int run = i - last_non_zero - 1;
2704 if((level&(~127)) == 0){
2705 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2706 len += len_tab[index];
2708 len += 7+2+1+6+1+12+1;
2718 /***********************************************/
2721 static VLC intra_MCBPC_vlc;
2722 static VLC inter_MCBPC_vlc;
2723 static VLC cbpy_vlc;
2725 static VLC dc_lum, dc_chrom;
2726 static VLC sprite_trajectory;
2727 static VLC mb_type_b_vlc;
2728 static VLC h263_mbtype_b_vlc;
2729 static VLC cbpc_b_vlc;
2731 void init_vlc_rl(RLTable *rl)
2735 init_vlc(&rl->vlc, 9, rl->n + 1,
2736 &rl->table_vlc[0][1], 4, 2,
2737 &rl->table_vlc[0][0], 4, 2);
2740 for(q=0; q<32; q++){
2749 rl->rl_vlc[q]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
2750 for(i=0; i<rl->vlc.table_size; i++){
2751 int code= rl->vlc.table[i][0];
2752 int len = rl->vlc.table[i][1];
2755 if(len==0){ // illegal code
2758 }else if(len<0){ //more bits needed
2762 if(code==rl->n){ //esc
2766 run= rl->table_run [code] + 1;
2767 level= rl->table_level[code] * qmul + qadd;
2768 if(code >= rl->last) run+=192;
2771 rl->rl_vlc[q][i].len= len;
2772 rl->rl_vlc[q][i].level= level;
2773 rl->rl_vlc[q][i].run= run;
2780 /* XXX: find a better solution to handle static init */
2781 void h263_decode_init_vlc(MpegEncContext *s)
2783 static int done = 0;
2788 init_vlc(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 9,
2789 intra_MCBPC_bits, 1, 1,
2790 intra_MCBPC_code, 1, 1);
2791 init_vlc(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 28,
2792 inter_MCBPC_bits, 1, 1,
2793 inter_MCBPC_code, 1, 1);
2794 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
2795 &cbpy_tab[0][1], 2, 1,
2796 &cbpy_tab[0][0], 2, 1);
2797 init_vlc(&mv_vlc, MV_VLC_BITS, 33,
2799 &mvtab[0][0], 2, 1);
2802 init_rl(&rvlc_rl_inter);
2803 init_rl(&rvlc_rl_intra);
2804 init_rl(&rl_intra_aic);
2805 init_vlc_rl(&rl_inter);
2806 init_vlc_rl(&rl_intra);
2807 init_vlc_rl(&rvlc_rl_inter);
2808 init_vlc_rl(&rvlc_rl_intra);
2809 init_vlc_rl(&rl_intra_aic);
2810 init_vlc(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
2811 &DCtab_lum[0][1], 2, 1,
2812 &DCtab_lum[0][0], 2, 1);
2813 init_vlc(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
2814 &DCtab_chrom[0][1], 2, 1,
2815 &DCtab_chrom[0][0], 2, 1);
2816 init_vlc(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
2817 &sprite_trajectory_tab[0][1], 4, 2,
2818 &sprite_trajectory_tab[0][0], 4, 2);
2819 init_vlc(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
2820 &mb_type_b_tab[0][1], 2, 1,
2821 &mb_type_b_tab[0][0], 2, 1);
2822 init_vlc(&h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15,
2823 &h263_mbtype_b_tab[0][1], 2, 1,
2824 &h263_mbtype_b_tab[0][0], 2, 1);
2825 init_vlc(&cbpc_b_vlc, CBPC_B_VLC_BITS, 4,
2826 &cbpc_b_tab[0][1], 2, 1,
2827 &cbpc_b_tab[0][0], 2, 1);
2832 * Get the GOB height based on picture height.
2834 int ff_h263_get_gob_height(MpegEncContext *s){
2835 if (s->height <= 400)
2837 else if (s->height <= 800)
2843 int ff_h263_decode_mba(MpegEncContext *s)
2848 if(s->mb_num-1 <= ff_mba_max[i]) break;
2850 mb_pos= get_bits(&s->gb, ff_mba_length[i]);
2851 s->mb_x= mb_pos % s->mb_width;
2852 s->mb_y= mb_pos / s->mb_width;
2857 void ff_h263_encode_mba(MpegEncContext *s)
2862 if(s->mb_num-1 <= ff_mba_max[i]) break;
2864 mb_pos= s->mb_x + s->mb_width*s->mb_y;
2865 put_bits(&s->pb, ff_mba_length[i], mb_pos);
2869 * decodes the group of blocks header or slice header.
2870 * @return <0 if an error occured
2872 static int h263_decode_gob_header(MpegEncContext *s)
2874 unsigned int val, gfid, gob_number;
2877 /* Check for GOB Start Code */
2878 val = show_bits(&s->gb, 16);
2882 /* We have a GBSC probably with GSTUFF */
2883 skip_bits(&s->gb, 16); /* Drop the zeros */
2884 left= s->gb.size_in_bits - get_bits_count(&s->gb);
2885 //MN: we must check the bits left or we might end in a infinite loop (or segfault)
2886 for(;left>13; left--){
2887 if(get_bits1(&s->gb)) break; /* Seek the '1' bit */
2892 if(s->h263_slice_structured){
2893 if(get_bits1(&s->gb)==0)
2896 ff_h263_decode_mba(s);
2898 if(s->mb_num > 1583)
2899 if(get_bits1(&s->gb)==0)
2902 s->qscale = get_bits(&s->gb, 5); /* SQUANT */
2903 if(get_bits1(&s->gb)==0)
2905 gfid = get_bits(&s->gb, 2); /* GFID */
2907 gob_number = get_bits(&s->gb, 5); /* GN */
2909 s->mb_y= s->gob_index* gob_number;
2910 gfid = get_bits(&s->gb, 2); /* GFID */
2911 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
2914 if(s->mb_y >= s->mb_height)
2923 static inline void memsetw(short *tab, int val, int n)
2930 #ifdef CONFIG_ENCODERS
2932 void ff_mpeg4_init_partitions(MpegEncContext *s)
2934 uint8_t *start= pbBufPtr(&s->pb);
2935 uint8_t *end= s->pb.buf_end;
2936 int size= end - start;
2937 int pb_size = (((int)start + size/3)&(~3)) - (int)start;
2938 int tex_size= (size - 2*pb_size)&(~3);
2940 set_put_bits_buffer_size(&s->pb, pb_size);
2941 init_put_bits(&s->tex_pb, start + pb_size , tex_size);
2942 init_put_bits(&s->pb2 , start + pb_size + tex_size, pb_size);
2945 void ff_mpeg4_merge_partitions(MpegEncContext *s)
2947 const int pb2_len = put_bits_count(&s->pb2 );
2948 const int tex_pb_len= put_bits_count(&s->tex_pb);
2949 const int bits= put_bits_count(&s->pb);
2951 if(s->pict_type==I_TYPE){
2952 put_bits(&s->pb, 19, DC_MARKER);
2953 s->misc_bits+=19 + pb2_len + bits - s->last_bits;
2954 s->i_tex_bits+= tex_pb_len;
2956 put_bits(&s->pb, 17, MOTION_MARKER);
2957 s->misc_bits+=17 + pb2_len;
2958 s->mv_bits+= bits - s->last_bits;
2959 s->p_tex_bits+= tex_pb_len;
2962 flush_put_bits(&s->pb2);
2963 flush_put_bits(&s->tex_pb);
2965 set_put_bits_buffer_size(&s->pb, s->pb2.buf_end - s->pb.buf);
2966 ff_copy_bits(&s->pb, s->pb2.buf , pb2_len);
2967 ff_copy_bits(&s->pb, s->tex_pb.buf, tex_pb_len);
2968 s->last_bits= put_bits_count(&s->pb);
2971 #endif //CONFIG_ENCODERS
2973 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
2974 switch(s->pict_type){
2979 return s->f_code+15;
2981 return FFMAX(FFMAX(s->f_code, s->b_code)+15, 17);
2987 #ifdef CONFIG_ENCODERS
2989 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
2991 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
2993 put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0);
2994 put_bits(&s->pb, 1, 1);
2996 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
2997 put_bits(&s->pb, s->quant_precision, s->qscale);
2998 put_bits(&s->pb, 1, 0); /* no HEC */
3001 #endif //CONFIG_ENCODERS
3004 * check if the next stuff is a resync marker or the end.
3007 static inline int mpeg4_is_resync(MpegEncContext *s){
3008 const int bits_count= get_bits_count(&s->gb);
3010 if(s->workaround_bugs&FF_BUG_NO_PADDING){
3014 if(bits_count + 8 >= s->gb.size_in_bits){
3015 int v= show_bits(&s->gb, 8);
3016 v|= 0x7F >> (7-(bits_count&7));
3021 if(show_bits(&s->gb, 16) == ff_mpeg4_resync_prefix[bits_count&7]){
3023 GetBitContext gb= s->gb;
3025 skip_bits(&s->gb, 1);
3026 align_get_bits(&s->gb);
3028 for(len=0; len<32; len++){
3029 if(get_bits1(&s->gb)) break;
3034 if(len>=ff_mpeg4_get_video_packet_prefix_length(s))
3042 * decodes the next video packet.
3043 * @return <0 if something went wrong
3045 static int mpeg4_decode_video_packet_header(MpegEncContext *s)
3047 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
3048 int header_extension=0, mb_num, len;
3050 /* is there enough space left for a video packet + header */
3051 if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1;
3053 for(len=0; len<32; len++){
3054 if(get_bits1(&s->gb)) break;
3057 if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
3058 av_log(s->avctx, AV_LOG_ERROR, "marker does not match f_code\n");
3062 if(s->shape != RECT_SHAPE){
3063 header_extension= get_bits1(&s->gb);
3064 //FIXME more stuff here
3067 mb_num= get_bits(&s->gb, mb_num_bits);
3068 if(mb_num>=s->mb_num){
3069 av_log(s->avctx, AV_LOG_ERROR, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);
3072 if(s->pict_type == B_TYPE){
3073 while(s->next_picture.mbskip_table[ s->mb_index2xy[ mb_num ] ]) mb_num++;
3074 if(mb_num >= s->mb_num) return -1; // slice contains just skiped MBs which where allready decoded
3077 s->mb_x= mb_num % s->mb_width;
3078 s->mb_y= mb_num / s->mb_width;
3080 if(s->shape != BIN_ONLY_SHAPE){
3081 int qscale= get_bits(&s->gb, s->quant_precision);
3083 s->chroma_qscale=s->qscale= qscale;
3086 if(s->shape == RECT_SHAPE){
3087 header_extension= get_bits1(&s->gb);
3089 if(header_extension){
3093 while (get_bits1(&s->gb) != 0)
3096 check_marker(&s->gb, "before time_increment in video packed header");
3097 time_increment= get_bits(&s->gb, s->time_increment_bits);
3098 check_marker(&s->gb, "before vop_coding_type in video packed header");
3100 skip_bits(&s->gb, 2); /* vop coding type */
3101 //FIXME not rect stuff here
3103 if(s->shape != BIN_ONLY_SHAPE){
3104 skip_bits(&s->gb, 3); /* intra dc vlc threshold */
3105 //FIXME dont just ignore everything
3106 if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3107 mpeg4_decode_sprite_trajectory(s, &s->gb);
3108 av_log(s->avctx, AV_LOG_ERROR, "untested\n");
3111 //FIXME reduced res stuff here
3113 if (s->pict_type != I_TYPE) {
3114 int f_code = get_bits(&s->gb, 3); /* fcode_for */
3116 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (f_code=0)\n");
3119 if (s->pict_type == B_TYPE) {
3120 int b_code = get_bits(&s->gb, 3);
3122 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (b_code=0)\n");
3127 //FIXME new-pred stuff
3129 //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));
3134 void ff_mpeg4_clean_buffers(MpegEncContext *s)
3136 int c_wrap, c_xy, l_wrap, l_xy;
3138 l_wrap= s->b8_stride;
3139 l_xy= (2*s->mb_y-1)*l_wrap + s->mb_x*2 - 1;
3140 c_wrap= s->mb_stride;
3141 c_xy= (s->mb_y-1)*c_wrap + s->mb_x - 1;
3145 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
3146 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
3147 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
3151 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t));
3152 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
3153 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
3156 // we cant clear the MVs as they might be needed by a b frame
3157 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t));
3158 // memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
3159 s->last_mv[0][0][0]=
3160 s->last_mv[0][0][1]=
3161 s->last_mv[1][0][0]=
3162 s->last_mv[1][0][1]= 0;
3166 * decodes the group of blocks / video packet header.
3167 * @return <0 if no resync found
3169 int ff_h263_resync(MpegEncContext *s){
3172 if(s->codec_id==CODEC_ID_MPEG4){
3174 align_get_bits(&s->gb);
3177 if(show_bits(&s->gb, 16)==0){
3178 if(s->codec_id==CODEC_ID_MPEG4)
3179 ret= mpeg4_decode_video_packet_header(s);
3181 ret= h263_decode_gob_header(s);
3185 //ok, its not where its supposed to be ...
3186 s->gb= s->last_resync_gb;
3187 align_get_bits(&s->gb);
3188 left= s->gb.size_in_bits - get_bits_count(&s->gb);
3190 for(;left>16+1+5+5; left-=8){
3191 if(show_bits(&s->gb, 16)==0){
3192 GetBitContext bak= s->gb;
3194 if(s->codec_id==CODEC_ID_MPEG4)
3195 ret= mpeg4_decode_video_packet_header(s);
3197 ret= h263_decode_gob_header(s);
3203 skip_bits(&s->gb, 8);
3210 * gets the average motion vector for a GMC MB.
3211 * @param n either 0 for the x component or 1 for y
3212 * @returns the average MV for a GMC MB
3214 static inline int get_amv(MpegEncContext *s, int n){
3215 int x, y, mb_v, sum, dx, dy, shift;
3216 int len = 1 << (s->f_code + 4);
3217 const int a= s->sprite_warping_accuracy;
3219 if(s->real_sprite_warping_points==1){
3220 if(s->divx_version==500 && s->divx_build==413)
3221 sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample));
3223 sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a);
3225 dx= s->sprite_delta[n][0];
3226 dy= s->sprite_delta[n][1];
3227 shift= s->sprite_shift[0];
3228 if(n) dy -= 1<<(shift + a + 1);
3229 else dx -= 1<<(shift + a + 1);
3230 mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16;
3233 for(y=0; y<16; y++){
3237 //XXX FIXME optimize
3238 for(x=0; x<16; x++){
3243 sum= RSHIFT(sum, a+8-s->quarter_sample);
3246 if (sum < -len) sum= -len;
3247 else if (sum >= len) sum= len-1;
3253 * decodes first partition.
3254 * @return number of MBs decoded or <0 if an error occured
3256 static int mpeg4_decode_partition_a(MpegEncContext *s){
3258 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3260 /* decode first partition */
3262 s->first_slice_line=1;
3263 for(; s->mb_y<s->mb_height; s->mb_y++){
3264 ff_init_block_index(s);
3265 for(; s->mb_x<s->mb_width; s->mb_x++){
3266 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3271 ff_update_block_index(s);
3272 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3273 s->first_slice_line=0;
3275 if(s->pict_type==I_TYPE){
3279 if(show_bits_long(&s->gb, 19)==DC_MARKER){
3283 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
3285 av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
3290 s->cbp_table[xy]= cbpc & 3;
3291 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3295 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3297 s->current_picture.qscale_table[xy]= s->qscale;
3299 s->mbintra_table[xy]= 1;
3302 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3304 av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3308 if(dc_pred_dir) dir|=1;
3310 s->pred_dir_table[xy]= dir;
3311 }else{ /* P/S_TYPE */
3312 int mx, my, pred_x, pred_y, bits;
3313 int16_t * const mot_val= s->current_picture.motion_val[0][s->block_index[0]];
3314 const int stride= s->b8_stride*2;
3317 bits= show_bits(&s->gb, 17);
3318 if(bits==MOTION_MARKER){
3324 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3325 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
3329 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3332 mot_val[0 ]= mot_val[2 ]=
3333 mot_val[0+stride]= mot_val[2+stride]= mx;
3334 mot_val[1 ]= mot_val[3 ]=
3335 mot_val[1+stride]= mot_val[3+stride]= my;
3337 if(s->mbintra_table[xy])
3338 ff_clean_intra_table_entries(s);
3342 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3344 av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
3350 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
3352 s->mb_intra = ((cbpc & 4) != 0);
3355 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3356 s->mbintra_table[xy]= 1;
3357 mot_val[0 ]= mot_val[2 ]=
3358 mot_val[0+stride]= mot_val[2+stride]= 0;
3359 mot_val[1 ]= mot_val[3 ]=
3360 mot_val[1+stride]= mot_val[3+stride]= 0;
3362 if(s->mbintra_table[xy])
3363 ff_clean_intra_table_entries(s);
3365 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
3366 s->mcsel= get_bits1(&s->gb);
3369 if ((cbpc & 16) == 0) {
3370 /* 16x16 motion prediction */
3372 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3374 mx = h263_decode_motion(s, pred_x, s->f_code);
3378 my = h263_decode_motion(s, pred_y, s->f_code);
3381 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3385 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
3388 mot_val[0 ]= mot_val[2 ] =
3389 mot_val[0+stride]= mot_val[2+stride]= mx;
3390 mot_val[1 ]= mot_val[3 ]=
3391 mot_val[1+stride]= mot_val[3+stride]= my;
3394 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3396 int16_t *mot_val= h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3397 mx = h263_decode_motion(s, pred_x, s->f_code);
3401 my = h263_decode_motion(s, pred_y, s->f_code);
3418 * decode second partition.
3419 * @return <0 if an error occured
3421 static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
3423 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3425 s->mb_x= s->resync_mb_x;
3426 s->first_slice_line=1;
3427 for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
3428 ff_init_block_index(s);
3429 for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
3430 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3433 ff_update_block_index(s);
3434 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3435 s->first_slice_line=0;
3437 if(s->pict_type==I_TYPE){
3438 int ac_pred= get_bits1(&s->gb);
3439 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3441 av_log(s->avctx, AV_LOG_ERROR, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3445 s->cbp_table[xy]|= cbpy<<2;
3446 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3447 }else{ /* P || S_TYPE */
3448 if(IS_INTRA(s->current_picture.mb_type[xy])){
3450 int ac_pred = get_bits1(&s->gb);
3451 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3454 av_log(s->avctx, AV_LOG_ERROR, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3458 if(s->cbp_table[xy] & 8) {
3459 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3461 s->current_picture.qscale_table[xy]= s->qscale;
3465 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3467 av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3471 if(dc_pred_dir) dir|=1;
3473 s->cbp_table[xy]&= 3; //remove dquant
3474 s->cbp_table[xy]|= cbpy<<2;
3475 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3476 s->pred_dir_table[xy]= dir;
3477 }else if(IS_SKIP(s->current_picture.mb_type[xy])){
3478 s->current_picture.qscale_table[xy]= s->qscale;
3479 s->cbp_table[xy]= 0;
3481 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3484 av_log(s->avctx, AV_LOG_ERROR, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3488 if(s->cbp_table[xy] & 8) {
3489 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
3491 s->current_picture.qscale_table[xy]= s->qscale;
3493 s->cbp_table[xy]&= 3; //remove dquant
3494 s->cbp_table[xy]|= (cbpy^0xf)<<2;
3498 if(mb_num >= mb_count) return 0;
3505 * decodes the first & second partition
3506 * @return <0 if error (and sets error type in the error_status_table)
3508 int ff_mpeg4_decode_partitions(MpegEncContext *s)
3511 const int part_a_error= s->pict_type==I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR;
3512 const int part_a_end = s->pict_type==I_TYPE ? (DC_END |MV_END) : MV_END;
3514 mb_num= mpeg4_decode_partition_a(s);
3516 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3520 if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
3521 av_log(s->avctx, AV_LOG_ERROR, "slice below monitor ...\n");
3522 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3526 s->mb_num_left= mb_num;
3528 if(s->pict_type==I_TYPE){
3529 while(show_bits(&s->gb, 9) == 1)
3530 skip_bits(&s->gb, 9);
3531 if(get_bits_long(&s->gb, 19)!=DC_MARKER){
3532 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
3536 while(show_bits(&s->gb, 10) == 1)
3537 skip_bits(&s->gb, 10);
3538 if(get_bits(&s->gb, 17)!=MOTION_MARKER){
3539 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
3543 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end);
3545 if( mpeg4_decode_partition_b(s, mb_num) < 0){
3546 if(s->pict_type==P_TYPE)
3547 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR);
3550 if(s->pict_type==P_TYPE)
3551 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END);
3558 * decode partition C of one MB.
3559 * @return <0 if an error occured
3561 static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64])
3564 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3566 mb_type= s->current_picture.mb_type[xy];
3567 cbp = s->cbp_table[xy];
3569 if(s->current_picture.qscale_table[xy] != s->qscale){
3570 ff_set_qscale(s, s->current_picture.qscale_table[xy] );
3573 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
3576 s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0];
3577 s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1];
3579 s->mb_intra = IS_INTRA(mb_type);
3581 if (IS_SKIP(mb_type)) {
3584 s->block_last_index[i] = -1;
3585 s->mv_dir = MV_DIR_FORWARD;
3586 s->mv_type = MV_TYPE_16X16;
3587 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3594 }else if(s->mb_intra){
3595 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3596 }else if(!s->mb_intra){
3597 // s->mcsel= 0; //FIXME do we need to init that
3599 s->mv_dir = MV_DIR_FORWARD;
3600 if (IS_8X8(mb_type)) {
3601 s->mv_type = MV_TYPE_8X8;
3603 s->mv_type = MV_TYPE_16X16;
3606 } else { /* I-Frame */
3608 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3611 if (!IS_SKIP(mb_type)) {
3613 /* decode each block */
3614 for (i = 0; i < 6; i++) {
3615 if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){
3616 av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra);
3623 /* per-MB end of slice check */
3625 if(--s->mb_num_left <= 0){
3626 //printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb));
3627 if(mpeg4_is_resync(s))
3632 if(mpeg4_is_resync(s)){
3633 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
3634 if(s->cbp_table[xy+delta])
3642 * read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :)
3644 static void preview_obmc(MpegEncContext *s){
3645 GetBitContext gb= s->gb;
3647 int cbpc, i, pred_x, pred_y, mx, my;
3649 const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
3650 const int stride= s->b8_stride*2;
3653 s->block_index[i]+= 2;
3655 s->block_index[i]+= 1;
3658 assert(s->pict_type == P_TYPE);
3661 if (get_bits1(&s->gb)) {
3663 mot_val = s->current_picture.motion_val[0][ s->block_index[0] ];
3664 mot_val[0 ]= mot_val[2 ]=
3665 mot_val[0+stride]= mot_val[2+stride]= 0;
3666 mot_val[1 ]= mot_val[3 ]=
3667 mot_val[1+stride]= mot_val[3+stride]= 0;
3669 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3672 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3676 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3678 get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3680 if(s->modified_quant){
3681 if(get_bits1(&s->gb)) skip_bits(&s->gb, 1);
3682 else skip_bits(&s->gb, 5);
3684 skip_bits(&s->gb, 2);
3687 if ((cbpc & 16) == 0) {
3688 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3689 /* 16x16 motion prediction */
3690 mot_val= h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3692 mx = h263p_decode_umotion(s, pred_x);
3694 mx = h263_decode_motion(s, pred_x, 1);
3697 my = h263p_decode_umotion(s, pred_y);
3699 my = h263_decode_motion(s, pred_y, 1);
3701 mot_val[0 ]= mot_val[2 ]=
3702 mot_val[0+stride]= mot_val[2+stride]= mx;
3703 mot_val[1 ]= mot_val[3 ]=
3704 mot_val[1+stride]= mot_val[3+stride]= my;
3706 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3708 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3710 mx = h263p_decode_umotion(s, pred_x);
3712 mx = h263_decode_motion(s, pred_x, 1);
3715 my = h263p_decode_umotion(s, pred_y);
3717 my = h263_decode_motion(s, pred_y, 1);
3718 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3719 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3728 s->block_index[i]-= 2;
3730 s->block_index[i]-= 1;
3736 static void h263_decode_dquant(MpegEncContext *s){
3737 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3739 if(s->modified_quant){
3740 if(get_bits1(&s->gb))
3741 s->qscale= modified_quant_tab[get_bits1(&s->gb)][ s->qscale ];
3743 s->qscale= get_bits(&s->gb, 5);
3745 s->qscale += quant_tab[get_bits(&s->gb, 2)];
3746 ff_set_qscale(s, s->qscale);
3749 int ff_h263_decode_mb(MpegEncContext *s,
3750 DCTELEM block[6][64])
3752 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
3754 const int xy= s->mb_x + s->mb_y * s->mb_stride;
3756 assert(!s->h263_pred);
3758 if (s->pict_type == P_TYPE) {
3760 if (get_bits1(&s->gb)) {
3764 s->block_last_index[i] = -1;
3765 s->mv_dir = MV_DIR_FORWARD;
3766 s->mv_type = MV_TYPE_16X16;
3767 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3770 s->mb_skiped = !(s->obmc | s->loop_filter);
3773 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3774 //fprintf(stderr, "\tCBPC: %d", cbpc);
3776 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
3782 s->mb_intra = ((cbpc & 4) != 0);
3783 if (s->mb_intra) goto intra;
3785 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3787 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
3790 cbp = (cbpc & 3) | (cbpy << 2);
3792 h263_decode_dquant(s);
3795 s->mv_dir = MV_DIR_FORWARD;
3796 if ((cbpc & 16) == 0) {
3797 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3798 /* 16x16 motion prediction */
3799 s->mv_type = MV_TYPE_16X16;
3800 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3802 mx = h263p_decode_umotion(s, pred_x);
3804 mx = h263_decode_motion(s, pred_x, 1);
3810 my = h263p_decode_umotion(s, pred_y);
3812 my = h263_decode_motion(s, pred_y, 1);
3816 s->mv[0][0][0] = mx;
3817 s->mv[0][0][1] = my;
3819 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3820 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3822 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3823 s->mv_type = MV_TYPE_8X8;
3825 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
3827 mx = h263p_decode_umotion(s, pred_x);
3829 mx = h263_decode_motion(s, pred_x, 1);
3834 my = h263p_decode_umotion(s, pred_y);
3836 my = h263_decode_motion(s, pred_y, 1);
3839 s->mv[0][i][0] = mx;
3840 s->mv[0][i][1] = my;
3841 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3842 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3848 /* decode each block */
3849 for (i = 0; i < 6; i++) {
3850 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
3856 if(s->pict_type == P_TYPE && s->mb_x+1<s->mb_width && s->mb_num_left != 1)
3859 } else if(s->pict_type==B_TYPE) {
3861 const int stride= s->b8_stride;
3862 int16_t *mot_val0 = s->current_picture.motion_val[0][ 2*(s->mb_x + s->mb_y*stride) ];
3863 int16_t *mot_val1 = s->current_picture.motion_val[1][ 2*(s->mb_x + s->mb_y*stride) ];
3864 // const int mv_xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
3867 mot_val0[0 ]= mot_val0[2 ]= mot_val0[0+2*stride]= mot_val0[2+2*stride]=
3868 mot_val0[1 ]= mot_val0[3 ]= mot_val0[1+2*stride]= mot_val0[3+2*stride]=
3869 mot_val1[0 ]= mot_val1[2 ]= mot_val1[0+2*stride]= mot_val1[2+2*stride]=
3870 mot_val1[1 ]= mot_val1[3 ]= mot_val1[1+2*stride]= mot_val1[3+2*stride]= 0;
3873 mb_type= get_vlc2(&s->gb, h263_mbtype_b_vlc.table, H263_MBTYPE_B_VLC_BITS, 2);
3875 av_log(s->avctx, AV_LOG_ERROR, "b mb_type damaged at %d %d\n", s->mb_x, s->mb_y);
3879 mb_type= h263_mb_type_b_map[ mb_type ];
3882 s->mb_intra = IS_INTRA(mb_type);
3883 if(HAS_CBP(mb_type)){
3884 cbpc = get_vlc2(&s->gb, cbpc_b_vlc.table, CBPC_B_VLC_BITS, 1);
3886 dquant = IS_QUANT(mb_type);
3890 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3893 av_log(s->avctx, AV_LOG_ERROR, "b cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
3897 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
3900 cbp = (cbpc & 3) | (cbpy << 2);
3904 assert(!s->mb_intra);
3906 if(IS_QUANT(mb_type)){
3907 h263_decode_dquant(s);
3910 if(IS_DIRECT(mb_type)){
3911 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3912 mb_type |= ff_mpeg4_set_direct_mv(s, 0, 0);
3915 s->mv_type= MV_TYPE_16X16;
3918 if(USES_LIST(mb_type, 0)){
3919 int16_t *mot_val= h263_pred_motion(s, 0, 0, &mx, &my);
3920 s->mv_dir = MV_DIR_FORWARD;
3922 mx = h263_decode_motion(s, mx, 1);
3923 my = h263_decode_motion(s, my, 1);
3925 s->mv[0][0][0] = mx;
3926 s->mv[0][0][1] = my;
3927 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
3928 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
3931 if(USES_LIST(mb_type, 1)){
3932 int16_t *mot_val= h263_pred_motion(s, 0, 1, &mx, &my);
3933 s->mv_dir |= MV_DIR_BACKWARD;
3935 mx = h263_decode_motion(s, mx, 1);
3936 my = h263_decode_motion(s, my, 1);
3938 s->mv[1][0][0] = mx;
3939 s->mv[1][0][1] = my;
3940 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
3941 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
3945 s->current_picture.mb_type[xy]= mb_type;
3947 /* decode each block */
3948 for (i = 0; i < 6; i++) {
3949 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
3953 } else { /* I-Frame */
3955 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
3957 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
3965 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3967 s->ac_pred = get_bits1(&s->gb);
3969 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
3971 s->h263_aic_dir = get_bits1(&s->gb);
3976 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3978 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
3981 cbp = (cbpc & 3) | (cbpy << 2);
3983 h263_decode_dquant(s);
3986 /* decode each block */
3987 for (i = 0; i < 6; i++) {
3988 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
3995 /* per-MB end of slice check */
3997 int v= show_bits(&s->gb, 16);
3999 if(get_bits_count(&s->gb) + 16 > s->gb.size_in_bits){
4000 v>>= get_bits_count(&s->gb) + 16 - s->gb.size_in_bits;
4010 int ff_mpeg4_decode_mb(MpegEncContext *s,
4011 DCTELEM block[6][64])
4013 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
4015 static int8_t quant_tab[4] = { -1, -2, 1, 2 };
4016 const int xy= s->mb_x + s->mb_y * s->mb_stride;
4018 assert(s->h263_pred);
4020 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
4022 if (get_bits1(&s->gb)) {
4026 s->block_last_index[i] = -1;
4027 s->mv_dir = MV_DIR_FORWARD;
4028 s->mv_type = MV_TYPE_16X16;
4029 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
4030 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
4032 s->mv[0][0][0]= get_amv(s, 0);
4033 s->mv[0][0][1]= get_amv(s, 1);
4037 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4045 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
4046 //fprintf(stderr, "\tCBPC: %d", cbpc);
4048 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4054 s->mb_intra = ((cbpc & 4) != 0);
4055 if (s->mb_intra) goto intra;
4057 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
4058 s->mcsel= get_bits1(&s->gb);
4060 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1) ^ 0x0F;
4062 cbp = (cbpc & 3) | (cbpy << 2);
4064 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
4066 if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE)))
4067 s->interlaced_dct= get_bits1(&s->gb);
4069 s->mv_dir = MV_DIR_FORWARD;
4070 if ((cbpc & 16) == 0) {
4072 s->current_picture.mb_type[xy]= MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
4073 /* 16x16 global motion prediction */
4074 s->mv_type = MV_TYPE_16X16;
4077 s->mv[0][0][0] = mx;
4078 s->mv[0][0][1] = my;
4079 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
4080 s->current_picture.mb_type[xy]= MB_TYPE_16x8 | MB_TYPE_L0 | MB_TYPE_INTERLACED;
4081 /* 16x8 field motion prediction */
4082 s->mv_type= MV_TYPE_FIELD;
4084 s->field_select[0][0]= get_bits1(&s->gb);
4085 s->field_select[0][1]= get_bits1(&s->gb);
4087 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4090 mx = h263_decode_motion(s, pred_x, s->f_code);
4094 my = h263_decode_motion(s, pred_y/2, s->f_code);
4098 s->mv[0][i][0] = mx;
4099 s->mv[0][i][1] = my;
4102 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
4103 /* 16x16 motion prediction */
4104 s->mv_type = MV_TYPE_16X16;
4105 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
4106 mx = h263_decode_motion(s, pred_x, s->f_code);
4111 my = h263_decode_motion(s, pred_y, s->f_code);
4115 s->mv[0][0][0] = mx;
4116 s->mv[0][0][1] = my;
4119 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
4120 s->mv_type = MV_TYPE_8X8;
4122 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
4123 mx = h263_decode_motion(s, pred_x, s->f_code);
4127 my = h263_decode_motion(s, pred_y, s->f_code);
4130 s->mv[0][i][0] = mx;
4131 s->mv[0][i][1] = my;
4136 } else if(s->pict_type==B_TYPE) {
4137 int modb1; // first bit of modb
4138 int modb2; // second bit of modb
4141 s->mb_intra = 0; //B-frames never contain intra blocks
4142 s->mcsel=0; // ... true gmc blocks
4146 s->last_mv[i][0][0]=
4147 s->last_mv[i][0][1]=
4148 s->last_mv[i][1][0]=
4149 s->last_mv[i][1][1]= 0;
4153 /* if we skipped it in the future P Frame than skip it now too */
4154 s->mb_skiped= s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]; // Note, skiptab=0 if last was GMC
4159 s->block_last_index[i] = -1;
4161 s->mv_dir = MV_DIR_FORWARD;
4162 s->mv_type = MV_TYPE_16X16;
4167 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4171 modb1= get_bits1(&s->gb);
4173 mb_type= MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1; //like MB_TYPE_B_DIRECT but no vectors coded
4176 modb2= get_bits1(&s->gb);
4177 mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
4179 av_log(s->avctx, AV_LOG_ERROR, "illegal MB_type\n");
4182 mb_type= mb_type_b_map[ mb_type ];
4184 else cbp= get_bits(&s->gb, 6);
4186 if ((!IS_DIRECT(mb_type)) && cbp) {
4187 if(get_bits1(&s->gb)){
4188 ff_set_qscale(s, s->qscale + get_bits1(&s->gb)*4 - 2);
4192 if(!s->progressive_sequence){
4194 s->interlaced_dct= get_bits1(&s->gb);
4196 if(!IS_DIRECT(mb_type) && get_bits1(&s->gb)){
4197 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
4198 mb_type &= ~MB_TYPE_16x16;
4200 if(USES_LIST(mb_type, 0)){
4201 s->field_select[0][0]= get_bits1(&s->gb);
4202 s->field_select[0][1]= get_bits1(&s->gb);
4204 if(USES_LIST(mb_type, 1)){
4205 s->field_select[1][0]= get_bits1(&s->gb);
4206 s->field_select[1][1]= get_bits1(&s->gb);
4212 if((mb_type & (MB_TYPE_DIRECT2|MB_TYPE_INTERLACED)) == 0){
4213 s->mv_type= MV_TYPE_16X16;
4215 if(USES_LIST(mb_type, 0)){
4216 s->mv_dir = MV_DIR_FORWARD;
4218 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
4219 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
4220 s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
4221 s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
4224 if(USES_LIST(mb_type, 1)){
4225 s->mv_dir |= MV_DIR_BACKWARD;
4227 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
4228 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
4229 s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
4230 s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
4232 }else if(!IS_DIRECT(mb_type)){
4233 s->mv_type= MV_TYPE_FIELD;
4235 if(USES_LIST(mb_type, 0)){
4236 s->mv_dir = MV_DIR_FORWARD;
4239 mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code);
4240 my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
4241 s->last_mv[0][i][0]= s->mv[0][i][0] = mx;
4242 s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
4246 if(USES_LIST(mb_type, 1)){
4247 s->mv_dir |= MV_DIR_BACKWARD;
4250 mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code);
4251 my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
4252 s->last_mv[1][i][0]= s->mv[1][i][0] = mx;
4253 s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
4259 if(IS_DIRECT(mb_type)){
4260 if(IS_SKIP(mb_type))
4263 mx = h263_decode_motion(s, 0, 1);
4264 my = h263_decode_motion(s, 0, 1);
4267 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4268 mb_type |= ff_mpeg4_set_direct_mv(s, mx, my);
4270 s->current_picture.mb_type[xy]= mb_type;
4271 } else { /* I-Frame */
4273 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
4275 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
4283 s->ac_pred = get_bits1(&s->gb);
4285 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
4287 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
4289 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4291 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4294 cbp = (cbpc & 3) | (cbpy << 2);
4296 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
4299 if(!s->progressive_sequence)
4300 s->interlaced_dct= get_bits1(&s->gb);
4302 /* decode each block */
4303 for (i = 0; i < 6; i++) {
4304 if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0)
4311 /* decode each block */
4312 for (i = 0; i < 6; i++) {
4313 if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0)
4319 /* per-MB end of slice check */
4320 if(s->codec_id==CODEC_ID_MPEG4){
4321 if(mpeg4_is_resync(s)){
4322 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
4323 if(s->pict_type==B_TYPE && s->next_picture.mbskip_table[xy + delta])
4332 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
4334 int code, val, sign, shift, l;
4335 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
4342 sign = get_bits1(&s->gb);
4346 val = (val - 1) << shift;
4347 val |= get_bits(&s->gb, shift);
4354 /* modulo decoding */
4355 if (!s->h263_long_vectors) {
4356 l = 1 << (f_code + 4);
4357 val = ((val + l)&(l*2-1)) - l;
4359 /* horrible h263 long vector mode */
4360 if (pred < -31 && val < -63)
4362 if (pred > 32 && val > 63)
4369 /* Decodes RVLC of H.263+ UMV */
4370 static int h263p_decode_umotion(MpegEncContext * s, int pred)
4374 if (get_bits1(&s->gb)) /* Motion difference = 0 */
4377 code = 2 + get_bits1(&s->gb);
4379 while (get_bits1(&s->gb))
4382 code += get_bits1(&s->gb);
4387 code = (sign) ? (pred - code) : (pred + code);
4389 fprintf(stderr,"H.263+ UMV Motion = %d\n", code);
4395 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
4398 int code, level, i, j, last, run;
4399 RLTable *rl = &rl_inter;
4400 const uint8_t *scan_table;
4401 GetBitContext gb= s->gb;
4403 scan_table = s->intra_scantable.permutated;
4404 if (s->h263_aic && s->mb_intra) {
4408 if (s->h263_aic_dir)
4409 scan_table = s->intra_v_scantable.permutated; /* left */
4411 scan_table = s->intra_h_scantable.permutated; /* top */
4413 } else if (s->mb_intra) {
4415 if(s->codec_id == CODEC_ID_RV10){
4416 if (s->rv10_version == 3 && s->pict_type == I_TYPE) {
4417 int component, diff;
4418 component = (n <= 3 ? 0 : n - 4 + 1);
4419 level = s->last_dc[component];
4420 if (s->rv10_first_dc_coded[component]) {
4421 diff = rv_decode_dc(s, n);
4425 level = level & 0xff; /* handle wrap round */
4426 s->last_dc[component] = level;
4428 s->rv10_first_dc_coded[component] = 1;
4431 level = get_bits(&s->gb, 8);
4434 level = get_bits(&s->gb, 8);
4435 if((level&0x7F) == 0){
4436 av_log(s->avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y);
4437 if(s->error_resilience >= FF_ER_COMPLIANT)
4449 if (s->mb_intra && s->h263_aic)
4451 s->block_last_index[n] = i - 1;
4456 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
4458 av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
4461 if (code == rl->n) {
4463 if (s->h263_flv > 1) {
4464 int is11 = get_bits1(&s->gb);
4465 last = get_bits1(&s->gb);
4466 run = get_bits(&s->gb, 6);
4468 level = get_sbits(&s->gb, 11);
4470 level = get_sbits(&s->gb, 7);
4473 last = get_bits1(&s->gb);
4474 run = get_bits(&s->gb, 6);
4475 level = (int8_t)get_bits(&s->gb, 8);
4477 if (s->codec_id == CODEC_ID_RV10) {
4478 /* XXX: should patch encoder too */
4479 level = get_sbits(&s->gb, 12);
4481 level = get_bits(&s->gb, 5);
4482 level |= get_sbits(&s->gb, 6)<<5;
4487 run = rl->table_run[code];
4488 level = rl->table_level[code];
4489 last = code >= rl->last;
4490 if (get_bits1(&s->gb))
4495 if(s->alt_inter_vlc && rl == &rl_inter && !s->mb_intra){
4496 //looks like a hack but no, its the way its supposed to work ...
4500 memset(block, 0, sizeof(DCTELEM)*64);
4503 av_log(s->avctx, AV_LOG_ERROR, "run overflow at %dx%d\n", s->mb_x, s->mb_y);
4513 if (s->mb_intra && s->h263_aic) {
4514 h263_pred_acdc(s, block, n);
4517 s->block_last_index[n] = i;
4522 * decodes the dc value.
4523 * @param n block index (0-3 are luma, 4-5 are chroma)
4524 * @param dir_ptr the prediction direction will be stored here
4525 * @return the quantized dc
4527 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
4529 int level, pred, code;
4533 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
4535 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
4536 if (code < 0 || code > 9 /* && s->nbit<9 */){
4537 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
4545 level= 2*get_bits1(&s->gb)-1;
4547 if(get_bits1(&s->gb))
4548 level = get_bits(&s->gb, code-1) + (1<<(code-1));
4550 level = -get_bits(&s->gb, code-1) - (1<<(code-1));
4553 level = get_xbits(&s->gb, code);
4557 if(get_bits1(&s->gb)==0){ /* marker */
4558 if(s->error_resilience>=2){
4559 av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n");
4565 pred = ff_mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
4568 if(s->error_resilience>=3){
4569 av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
4575 *dc_val = level * s->y_dc_scale;
4577 *dc_val = level * s->c_dc_scale;
4580 *dc_val = level * 8;
4582 if(s->error_resilience>=3){
4583 if(*dc_val > 2048 + s->y_dc_scale + s->c_dc_scale){
4584 av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
4593 * @return <0 if an error occured
4595 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
4596 int n, int coded, int intra, int rvlc)
4598 int level, i, last, run;
4601 RL_VLC_ELEM * rl_vlc;
4602 const uint8_t * scan_table;
4605 //Note intra & rvlc should be optimized away if this is inlined
4608 if(s->qscale < s->intra_dc_threshold){
4610 if(s->partitioned_frame){
4611 level = s->dc_val[0][ s->block_index[n] ];
4612 if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale);
4613 else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale);
4614 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32;
4616 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
4629 rl = &rvlc_rl_intra;
4630 rl_vlc = rvlc_rl_intra.rl_vlc[0];
4633 rl_vlc = rl_intra.rl_vlc[0];
4636 if (dc_pred_dir == 0)
4637 scan_table = s->intra_v_scantable.permutated; /* left */
4639 scan_table = s->intra_h_scantable.permutated; /* top */
4641 scan_table = s->intra_scantable.permutated;
4648 s->block_last_index[n] = i;
4651 if(rvlc) rl = &rvlc_rl_inter;
4652 else rl = &rl_inter;
4654 scan_table = s->intra_scantable.permutated;
4660 rl_vlc = rvlc_rl_inter.rl_vlc[0];
4662 rl_vlc = rl_inter.rl_vlc[0];
4665 qmul = s->qscale << 1;
4666 qadd = (s->qscale - 1) | 1;
4668 rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale];
4670 rl_vlc = rl_inter.rl_vlc[s->qscale];
4675 OPEN_READER(re, &s->gb);
4677 UPDATE_CACHE(re, &s->gb);
4678 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
4682 if(SHOW_UBITS(re, &s->gb, 1)==0){
4683 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n");
4685 }; SKIP_CACHE(re, &s->gb, 1);
4687 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4688 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4689 SKIP_COUNTER(re, &s->gb, 1+1+6);
4690 UPDATE_CACHE(re, &s->gb);
4692 if(SHOW_UBITS(re, &s->gb, 1)==0){
4693 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n");
4695 }; SKIP_CACHE(re, &s->gb, 1);
4697 level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11);
4699 if(SHOW_UBITS(re, &s->gb, 5)!=0x10){
4700 av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n");
4702 }; SKIP_CACHE(re, &s->gb, 5);
4704 level= level * qmul + qadd;
4705 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1);
4706 SKIP_COUNTER(re, &s->gb, 1+11+5+1);
4712 cache= GET_CACHE(re, &s->gb);
4715 cache ^= 0xC0000000;
4717 if (cache&0x80000000) {
4718 if (cache&0x40000000) {
4720 SKIP_CACHE(re, &s->gb, 2);
4721 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4722 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4723 SKIP_COUNTER(re, &s->gb, 2+1+6);
4724 UPDATE_CACHE(re, &s->gb);
4727 level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12);
4729 if(SHOW_UBITS(re, &s->gb, 1)==0){
4730 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n");
4732 }; SKIP_CACHE(re, &s->gb, 1);
4734 level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
4736 if(SHOW_UBITS(re, &s->gb, 1)==0){
4737 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n");
4739 }; LAST_SKIP_CACHE(re, &s->gb, 1);
4741 SKIP_COUNTER(re, &s->gb, 1+12+1);
4744 if(level*s->qscale>1024 || level*s->qscale<-1024){
4745 av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
4749 if(s->error_resilience >= FF_ER_COMPLIANT){
4750 const int abs_level= ABS(level);
4751 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
4752 const int run1= run - rl->max_run[last][abs_level] - 1;
4753 if(abs_level <= rl->max_level[last][run]){
4754 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
4757 if(s->error_resilience > FF_ER_COMPLIANT){
4758 if(abs_level <= rl->max_level[last][run]*2){
4759 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
4762 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
4763 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
4770 if (level>0) level= level * qmul + qadd;
4771 else level= level * qmul - qadd;
4777 #if MIN_CACHE_BITS < 20
4778 LAST_SKIP_BITS(re, &s->gb, 2);
4779 UPDATE_CACHE(re, &s->gb);
4781 SKIP_BITS(re, &s->gb, 2);
4783 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
4784 i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing
4785 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4786 LAST_SKIP_BITS(re, &s->gb, 1);
4790 #if MIN_CACHE_BITS < 19
4791 LAST_SKIP_BITS(re, &s->gb, 1);
4792 UPDATE_CACHE(re, &s->gb);
4794 SKIP_BITS(re, &s->gb, 1);
4796 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
4798 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
4799 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4800 LAST_SKIP_BITS(re, &s->gb, 1);
4805 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4806 LAST_SKIP_BITS(re, &s->gb, 1);
4811 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
4815 block[scan_table[i]] = level;
4819 block[scan_table[i]] = level;
4821 CLOSE_READER(re, &s->gb);
4825 if(s->qscale >= s->intra_dc_threshold){
4827 block[0] += ff_mpeg4_pred_dc(s, n, &dc_val, &dc_pred_dir);
4829 *dc_val = block[0] * s->y_dc_scale;
4831 *dc_val = block[0] * s->c_dc_scale;
4837 mpeg4_pred_ac(s, block, n, dc_pred_dir);
4839 i = 63; /* XXX: not optimal */
4842 s->block_last_index[n] = i;
4846 /* most is hardcoded. should extend to handle all h263 streams */
4847 int h263_decode_picture_header(MpegEncContext *s)
4849 int format, width, height, i;
4852 align_get_bits(&s->gb);
4854 startcode= get_bits(&s->gb, 22-8);
4856 for(i= s->gb.size_in_bits - get_bits_count(&s->gb); i>24; i-=8) {
4857 startcode = ((startcode << 8) | get_bits(&s->gb, 8)) & 0x003FFFFF;
4859 if(startcode == 0x20)
4863 if (startcode != 0x20) {
4864 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
4867 /* temporal reference */
4868 i = get_bits(&s->gb, 8); /* picture timestamp */
4869 if( (s->picture_number&~0xFF)+i < s->picture_number)
4871 s->picture_number= (s->picture_number&~0xFF) + i;
4873 /* PTYPE starts here */
4874 if (get_bits1(&s->gb) != 1) {
4876 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
4879 if (get_bits1(&s->gb) != 0) {
4880 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
4881 return -1; /* h263 id */
4883 skip_bits1(&s->gb); /* split screen off */
4884 skip_bits1(&s->gb); /* camera off */
4885 skip_bits1(&s->gb); /* freeze picture release off */
4887 format = get_bits(&s->gb, 3);
4892 7 extended PTYPE (PLUSPTYPE)
4895 if (format != 7 && format != 6) {
4898 width = h263_format[format][0];
4899 height = h263_format[format][1];
4903 s->pict_type = I_TYPE + get_bits1(&s->gb);
4905 s->h263_long_vectors = get_bits1(&s->gb);
4907 if (get_bits1(&s->gb) != 0) {
4908 av_log(s->avctx, AV_LOG_ERROR, "H263 SAC not supported\n");
4909 return -1; /* SAC: off */
4911 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
4912 s->unrestricted_mv = s->h263_long_vectors || s->obmc;
4914 if (get_bits1(&s->gb) != 0) {
4915 av_log(s->avctx, AV_LOG_ERROR, "H263 PB frame not supported\n");
4916 return -1; /* not PB frame */
4918 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
4919 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
4923 s->avctx->sample_aspect_ratio= (AVRational){12,11};
4924 s->avctx->frame_rate = 30000;
4925 s->avctx->frame_rate_base= 1001;
4931 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
4933 /* ufep other than 0 and 1 are reserved */
4936 format = get_bits(&s->gb, 3);
4937 dprintf("ufep=1, format: %d\n", format);
4938 s->custom_pcf= get_bits1(&s->gb);
4939 s->umvplus = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */
4940 if (get_bits1(&s->gb) != 0) {
4941 av_log(s->avctx, AV_LOG_ERROR, "Syntax-based Arithmetic Coding (SAC) not supported\n");
4943 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
4944 s->h263_aic = get_bits1(&s->gb); /* Advanced Intra Coding (AIC) */
4945 s->loop_filter= get_bits1(&s->gb);
4946 s->unrestricted_mv = s->umvplus || s->obmc || s->loop_filter;
4948 s->h263_slice_structured= get_bits1(&s->gb);
4949 if (get_bits1(&s->gb) != 0) {
4950 av_log(s->avctx, AV_LOG_ERROR, "Reference Picture Selection not supported\n");
4952 if (get_bits1(&s->gb) != 0) {
4953 av_log(s->avctx, AV_LOG_ERROR, "Independent Segment Decoding not supported\n");
4955 s->alt_inter_vlc= get_bits1(&s->gb);
4956 s->modified_quant= get_bits1(&s->gb);
4957 if(s->modified_quant)
4958 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
4960 skip_bits(&s->gb, 1); /* Prevent start code emulation */
4962 skip_bits(&s->gb, 3); /* Reserved */
4963 } else if (ufep != 0) {
4964 av_log(s->avctx, AV_LOG_ERROR, "Bad UFEP type (%d)\n", ufep);
4969 s->pict_type = get_bits(&s->gb, 3);
4970 switch(s->pict_type){
4971 case 0: s->pict_type= I_TYPE;break;
4972 case 1: s->pict_type= P_TYPE;break;
4973 case 3: s->pict_type= B_TYPE;break;
4974 case 7: s->pict_type= I_TYPE;break; //ZYGO
4978 skip_bits(&s->gb, 2);
4979 s->no_rounding = get_bits1(&s->gb);
4980 skip_bits(&s->gb, 4);
4982 /* Get the picture dimensions */
4985 /* Custom Picture Format (CPFMT) */
4986 s->aspect_ratio_info = get_bits(&s->gb, 4);
4987 dprintf("aspect: %d\n", s->aspect_ratio_info);
4992 3 - 10:11 (525-type 4:3)
4993 4 - 16:11 (CIF 16:9)
4994 5 - 40:33 (525-type 16:9)
4997 width = (get_bits(&s->gb, 9) + 1) * 4;
4999 height = get_bits(&s->gb, 9) * 4;
5000 dprintf("\nH.263+ Custom picture: %dx%d\n",width,height);
5001 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
5002 /* aspected dimensions */
5003 s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 8);
5004 s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 8);
5006 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
5009 width = h263_format[format][0];
5010 height = h263_format[format][1];
5011 s->avctx->sample_aspect_ratio= (AVRational){12,11};
5013 if ((width == 0) || (height == 0))
5020 s->avctx->frame_rate= 1800000;
5021 s->avctx->frame_rate_base= 1000 + get_bits1(&s->gb);
5022 s->avctx->frame_rate_base*= get_bits(&s->gb, 7);
5023 if(s->avctx->frame_rate_base == 0){
5024 av_log(s, AV_LOG_ERROR, "zero framerate\n");
5027 gcd= ff_gcd(s->avctx->frame_rate, s->avctx->frame_rate_base);
5028 s->avctx->frame_rate /= gcd;
5029 s->avctx->frame_rate_base /= gcd;
5030 // av_log(s->avctx, AV_LOG_DEBUG, "%d/%d\n", s->avctx->frame_rate, s->avctx->frame_rate_base);
5032 s->avctx->frame_rate = 30000;
5033 s->avctx->frame_rate_base= 1001;
5038 skip_bits(&s->gb, 2); //extended Temporal reference
5043 if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
5046 if(s->h263_slice_structured){
5047 if (get_bits1(&s->gb) != 0) {
5048 av_log(s->avctx, AV_LOG_ERROR, "rectangular slices not supported\n");
5050 if (get_bits1(&s->gb) != 0) {
5051 av_log(s->avctx, AV_LOG_ERROR, "unordered slices not supported\n");
5056 s->qscale = get_bits(&s->gb, 5);
5059 s->mb_width = (s->width + 15) / 16;
5060 s->mb_height = (s->height + 15) / 16;
5061 s->mb_num = s->mb_width * s->mb_height;
5064 while (get_bits1(&s->gb) != 0) {
5065 skip_bits(&s->gb, 8);
5068 if(s->h263_slice_structured){
5069 if (get_bits1(&s->gb) != 1) {
5070 av_log(s->avctx, AV_LOG_ERROR, "SEPB1 marker missing\n");
5074 ff_h263_decode_mba(s);
5076 if (get_bits1(&s->gb) != 1) {
5077 av_log(s->avctx, AV_LOG_ERROR, "SEPB2 marker missing\n");
5084 s->y_dc_scale_table=
5085 s->c_dc_scale_table= ff_aic_dc_scale_table;
5087 s->y_dc_scale_table=
5088 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
5091 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
5092 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",
5093 s->qscale, av_get_pict_type_char(s->pict_type),
5094 s->gb.size_in_bits, 1-s->no_rounding,
5095 s->obmc ? " AP" : "",
5096 s->umvplus ? " UMV" : "",
5097 s->h263_long_vectors ? " LONG" : "",
5098 s->h263_plus ? " +" : "",
5099 s->h263_aic ? " AIC" : "",
5100 s->alt_inter_vlc ? " AIV" : "",
5101 s->modified_quant ? " MQ" : "",
5102 s->loop_filter ? " LOOP" : "",
5103 s->h263_slice_structured ? " SS" : "",
5104 s->avctx->frame_rate, s->avctx->frame_rate_base
5108 if (s->pict_type == I_TYPE && s->avctx->codec_tag == ff_get_fourcc("ZYGO")){
5110 for(i=0; i<85; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
5111 av_log(s->avctx, AV_LOG_DEBUG, "\n");
5112 for(i=0; i<13; i++){
5114 int v= get_bits(&s->gb, 8);
5115 v |= get_sbits(&s->gb, 8)<<8;
5116 av_log(s->avctx, AV_LOG_DEBUG, " %5d", v);
5118 av_log(s->avctx, AV_LOG_DEBUG, "\n");
5120 for(i=0; i<50; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
5127 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb)
5130 int a= 2<<s->sprite_warping_accuracy;
5131 int rho= 3-s->sprite_warping_accuracy;
5133 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
5134 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
5135 int sprite_ref[4][2];
5136 int virtual_ref[2][2];
5138 int alpha=0, beta=0;
5143 for(i=0; i<s->num_sprite_warping_points; i++){
5147 length= get_vlc(gb, &sprite_trajectory);
5149 x= get_xbits(gb, length);
5151 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(gb); /* marker bit */
5153 length= get_vlc(gb, &sprite_trajectory);
5155 y=get_xbits(gb, length);
5157 skip_bits1(gb); /* marker bit */
5158 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
5163 while((1<<alpha)<w) alpha++;
5164 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
5168 // Note, the 4th point isnt used for GMC
5169 if(s->divx_version==500 && s->divx_build==413){
5170 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
5171 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
5172 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
5173 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
5174 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
5175 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
5177 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
5178 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
5179 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
5180 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
5181 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
5182 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
5184 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
5185 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
5187 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
5188 // perhaps it should be reordered to be more readable ...
5189 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
5190 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
5191 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
5192 + 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);
5193 virtual_ref[0][1]= 16*vop_ref[0][1]
5194 + 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);
5195 virtual_ref[1][0]= 16*vop_ref[0][0]
5196 + 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);
5197 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
5198 + 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);
5200 switch(s->num_sprite_warping_points)
5203 s->sprite_offset[0][0]= 0;
5204 s->sprite_offset[0][1]= 0;
5205 s->sprite_offset[1][0]= 0;
5206 s->sprite_offset[1][1]= 0;
5207 s->sprite_delta[0][0]= a;
5208 s->sprite_delta[0][1]= 0;
5209 s->sprite_delta[1][0]= 0;
5210 s->sprite_delta[1][1]= a;
5211 s->sprite_shift[0]= 0;
5212 s->sprite_shift[1]= 0;
5215 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
5216 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
5217 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
5218 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
5219 s->sprite_delta[0][0]= a;
5220 s->sprite_delta[0][1]= 0;
5221 s->sprite_delta[1][0]= 0;
5222 s->sprite_delta[1][1]= a;
5223 s->sprite_shift[0]= 0;
5224 s->sprite_shift[1]= 0;
5227 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
5228 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
5229 + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])
5230 + (1<<(alpha+rho-1));
5231 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
5232 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
5233 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])
5234 + (1<<(alpha+rho-1));
5235 s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
5236 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
5237 +2*w2*r*sprite_ref[0][0]
5239 + (1<<(alpha+rho+1)));
5240 s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
5241 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
5242 +2*w2*r*sprite_ref[0][1]
5244 + (1<<(alpha+rho+1)));
5245 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
5246 s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]);
5247 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
5248 s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
5250 s->sprite_shift[0]= alpha+rho;
5251 s->sprite_shift[1]= alpha+rho+2;
5254 min_ab= FFMIN(alpha, beta);
5257 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
5258 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])
5259 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])
5260 + (1<<(alpha+beta+rho-min_ab-1));
5261 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))
5262 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])
5263 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])
5264 + (1<<(alpha+beta+rho-min_ab-1));
5265 s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)
5266 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)
5267 + 2*w2*h3*r*sprite_ref[0][0]
5269 + (1<<(alpha+beta+rho-min_ab+1));
5270 s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)
5271 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)
5272 + 2*w2*h3*r*sprite_ref[0][1]
5274 + (1<<(alpha+beta+rho-min_ab+1));
5275 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;
5276 s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;
5277 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;
5278 s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;
5280 s->sprite_shift[0]= alpha + beta + rho - min_ab;
5281 s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;
5284 /* try to simplify the situation */
5285 if( s->sprite_delta[0][0] == a<<s->sprite_shift[0]
5286 && s->sprite_delta[0][1] == 0
5287 && s->sprite_delta[1][0] == 0
5288 && s->sprite_delta[1][1] == a<<s->sprite_shift[0])
5290 s->sprite_offset[0][0]>>=s->sprite_shift[0];
5291 s->sprite_offset[0][1]>>=s->sprite_shift[0];
5292 s->sprite_offset[1][0]>>=s->sprite_shift[1];
5293 s->sprite_offset[1][1]>>=s->sprite_shift[1];
5294 s->sprite_delta[0][0]= a;
5295 s->sprite_delta[0][1]= 0;
5296 s->sprite_delta[1][0]= 0;
5297 s->sprite_delta[1][1]= a;
5298 s->sprite_shift[0]= 0;
5299 s->sprite_shift[1]= 0;
5300 s->real_sprite_warping_points=1;
5303 int shift_y= 16 - s->sprite_shift[0];
5304 int shift_c= 16 - s->sprite_shift[1];
5305 //printf("shifts %d %d\n", shift_y, shift_c);
5307 s->sprite_offset[0][i]<<= shift_y;
5308 s->sprite_offset[1][i]<<= shift_c;
5309 s->sprite_delta[0][i]<<= shift_y;
5310 s->sprite_delta[1][i]<<= shift_y;
5311 s->sprite_shift[i]= 16;
5313 s->real_sprite_warping_points= s->num_sprite_warping_points;
5316 printf("vop:%d:%d %d:%d %d:%d, sprite:%d:%d %d:%d %d:%d, virtual: %d:%d %d:%d\n",
5317 vop_ref[0][0], vop_ref[0][1],
5318 vop_ref[1][0], vop_ref[1][1],
5319 vop_ref[2][0], vop_ref[2][1],
5320 sprite_ref[0][0], sprite_ref[0][1],
5321 sprite_ref[1][0], sprite_ref[1][1],
5322 sprite_ref[2][0], sprite_ref[2][1],
5323 virtual_ref[0][0], virtual_ref[0][1],
5324 virtual_ref[1][0], virtual_ref[1][1]
5327 printf("offset: %d:%d , delta: %d %d %d %d, shift %d\n",
5328 s->sprite_offset[0][0], s->sprite_offset[0][1],
5329 s->sprite_delta[0][0], s->sprite_delta[0][1],
5330 s->sprite_delta[1][0], s->sprite_delta[1][1],
5336 static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
5337 int hours, minutes, seconds;
5339 hours= get_bits(gb, 5);
5340 minutes= get_bits(gb, 6);
5342 seconds= get_bits(gb, 6);
5344 s->time_base= seconds + 60*(minutes + 60*hours);
5352 static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
5353 int width, height, vo_ver_id;
5356 skip_bits(gb, 1); /* random access */
5357 s->vo_type= get_bits(gb, 8);
5358 if (get_bits1(gb) != 0) { /* is_ol_id */
5359 vo_ver_id = get_bits(gb, 4); /* vo_ver_id */
5360 skip_bits(gb, 3); /* vo_priority */
5364 //printf("vo type:%d\n",s->vo_type);
5365 s->aspect_ratio_info= get_bits(gb, 4);
5366 if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
5367 s->avctx->sample_aspect_ratio.num= get_bits(gb, 8); // par_width
5368 s->avctx->sample_aspect_ratio.den= get_bits(gb, 8); // par_height
5370 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
5373 if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
5374 int chroma_format= get_bits(gb, 2);
5375 if(chroma_format!=1){
5376 av_log(s->avctx, AV_LOG_ERROR, "illegal chroma format\n");
5378 s->low_delay= get_bits1(gb);
5379 if(get_bits1(gb)){ /* vbv parameters */
5380 get_bits(gb, 15); /* first_half_bitrate */
5381 skip_bits1(gb); /* marker */
5382 get_bits(gb, 15); /* latter_half_bitrate */
5383 skip_bits1(gb); /* marker */
5384 get_bits(gb, 15); /* first_half_vbv_buffer_size */
5385 skip_bits1(gb); /* marker */
5386 get_bits(gb, 3); /* latter_half_vbv_buffer_size */
5387 get_bits(gb, 11); /* first_half_vbv_occupancy */
5388 skip_bits1(gb); /* marker */
5389 get_bits(gb, 15); /* latter_half_vbv_occupancy */
5390 skip_bits1(gb); /* marker */
5393 // set low delay flag only once so the smart? low delay detection wont be overriden
5394 if(s->picture_number==0)
5398 s->shape = get_bits(gb, 2); /* vol shape */
5399 if(s->shape != RECT_SHAPE) av_log(s->avctx, AV_LOG_ERROR, "only rectangular vol supported\n");
5400 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
5401 av_log(s->avctx, AV_LOG_ERROR, "Gray shape not supported\n");
5402 skip_bits(gb, 4); //video_object_layer_shape_extension
5405 check_marker(gb, "before time_increment_resolution");
5407 s->time_increment_resolution = get_bits(gb, 16);
5409 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
5410 if (s->time_increment_bits < 1)
5411 s->time_increment_bits = 1;
5413 check_marker(gb, "before fixed_vop_rate");
5415 if (get_bits1(gb) != 0) { /* fixed_vop_rate */
5416 skip_bits(gb, s->time_increment_bits);
5419 if (s->shape != BIN_ONLY_SHAPE) {
5420 if (s->shape == RECT_SHAPE) {
5421 skip_bits1(gb); /* marker */
5422 width = get_bits(gb, 13);
5423 skip_bits1(gb); /* marker */
5424 height = get_bits(gb, 13);
5425 skip_bits1(gb); /* marker */
5426 if(width && height){ /* they should be non zero but who knows ... */
5429 // printf("width/height: %d %d\n", width, height);
5433 s->progressive_sequence=
5434 s->progressive_frame= get_bits1(gb)^1;
5435 if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO))
5436 av_log(s->avctx, AV_LOG_INFO, "MPEG4 OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */
5437 if (vo_ver_id == 1) {
5438 s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */
5440 s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */
5442 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "Static Sprites not supported\n");
5443 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
5444 if(s->vol_sprite_usage==STATIC_SPRITE){
5445 s->sprite_width = get_bits(gb, 13);
5446 skip_bits1(gb); /* marker */
5447 s->sprite_height= get_bits(gb, 13);
5448 skip_bits1(gb); /* marker */
5449 s->sprite_left = get_bits(gb, 13);
5450 skip_bits1(gb); /* marker */
5451 s->sprite_top = get_bits(gb, 13);
5452 skip_bits1(gb); /* marker */
5454 s->num_sprite_warping_points= get_bits(gb, 6);
5455 s->sprite_warping_accuracy = get_bits(gb, 2);
5456 s->sprite_brightness_change= get_bits1(gb);
5457 if(s->vol_sprite_usage==STATIC_SPRITE)
5458 s->low_latency_sprite= get_bits1(gb);
5460 // FIXME sadct disable bit if verid!=1 && shape not rect
5462 if (get_bits1(gb) == 1) { /* not_8_bit */
5463 s->quant_precision = get_bits(gb, 4); /* quant_precision */
5464 if(get_bits(gb, 4)!=8) av_log(s->avctx, AV_LOG_ERROR, "N-bit not supported\n"); /* bits_per_pixel */
5465 if(s->quant_precision!=5) av_log(s->avctx, AV_LOG_ERROR, "quant precission %d\n", s->quant_precision);
5467 s->quant_precision = 5;
5470 // FIXME a bunch of grayscale shape things
5472 if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */
5475 /* load default matrixes */
5476 for(i=0; i<64; i++){
5477 int j= s->dsp.idct_permutation[i];
5478 v= ff_mpeg4_default_intra_matrix[i];
5479 s->intra_matrix[j]= v;
5480 s->chroma_intra_matrix[j]= v;
5482 v= ff_mpeg4_default_non_intra_matrix[i];
5483 s->inter_matrix[j]= v;
5484 s->chroma_inter_matrix[j]= v;
5487 /* load custom intra matrix */
5490 for(i=0; i<64; i++){
5496 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5497 s->intra_matrix[j]= v;
5498 s->chroma_intra_matrix[j]= v;
5501 /* replicate last value */
5503 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5504 s->intra_matrix[j]= last;
5505 s->chroma_intra_matrix[j]= last;
5509 /* load custom non intra matrix */
5512 for(i=0; i<64; i++){
5518 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5519 s->inter_matrix[j]= v;
5520 s->chroma_inter_matrix[j]= v;
5523 /* replicate last value */
5525 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
5526 s->inter_matrix[j]= last;
5527 s->chroma_inter_matrix[j]= last;
5531 // FIXME a bunch of grayscale shape things
5535 s->quarter_sample= get_bits1(gb);
5536 else s->quarter_sample=0;
5538 if(!get_bits1(gb)) av_log(s->avctx, AV_LOG_ERROR, "Complexity estimation not supported\n");
5540 s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */
5542 s->data_partitioning= get_bits1(gb);
5543 if(s->data_partitioning){
5544 s->rvlc= get_bits1(gb);
5547 if(vo_ver_id != 1) {
5548 s->new_pred= get_bits1(gb);
5550 av_log(s->avctx, AV_LOG_ERROR, "new pred not supported\n");
5551 skip_bits(gb, 2); /* requested upstream message type */
5552 skip_bits1(gb); /* newpred segment type */
5554 s->reduced_res_vop= get_bits1(gb);
5555 if(s->reduced_res_vop) av_log(s->avctx, AV_LOG_ERROR, "reduced resolution VOP not supported\n");
5559 s->reduced_res_vop= 0;
5562 s->scalability= get_bits1(gb);
5564 if (s->scalability) {
5565 GetBitContext bak= *gb;
5567 int ref_layer_sampling_dir;
5568 int h_sampling_factor_n;
5569 int h_sampling_factor_m;
5570 int v_sampling_factor_n;
5571 int v_sampling_factor_m;
5573 s->hierachy_type= get_bits1(gb);
5574 ref_layer_id= get_bits(gb, 4);
5575 ref_layer_sampling_dir= get_bits1(gb);
5576 h_sampling_factor_n= get_bits(gb, 5);
5577 h_sampling_factor_m= get_bits(gb, 5);
5578 v_sampling_factor_n= get_bits(gb, 5);
5579 v_sampling_factor_m= get_bits(gb, 5);
5580 s->enhancement_type= get_bits1(gb);
5582 if( h_sampling_factor_n==0 || h_sampling_factor_m==0
5583 || v_sampling_factor_n==0 || v_sampling_factor_m==0){
5585 // fprintf(stderr, "illegal scalability header (VERY broken encoder), trying to workaround\n");
5590 av_log(s->avctx, AV_LOG_ERROR, "scalability not supported\n");
5592 // bin shape stuff FIXME
5599 * decodes the user data stuff in the header.
5600 * allso inits divx/xvid/lavc_version/build
5602 static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
5606 int ver, build, ver2, ver3;
5609 buf[0]= show_bits(gb, 8);
5610 for(i=1; i<256; i++){
5611 buf[i]= show_bits(gb, 16)&0xFF;
5612 if(buf[i]==0) break;
5617 /* divx detection */
5618 e=sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last);
5620 e=sscanf(buf, "DivX%db%d%c", &ver, &build, &last);
5622 s->divx_version= ver;
5623 s->divx_build= build;
5624 s->divx_packed= e==3 && last=='p';
5627 /* ffmpeg detection */
5628 e=sscanf(buf, "FFmpeg%d.%d.%db%d", &ver, &ver2, &ver3, &build);
5630 e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
5632 if(strcmp(buf, "ffmpeg")==0){
5633 s->ffmpeg_version= 0x000406;
5634 s->lavc_build= 4600;
5638 s->ffmpeg_version= ver*256*256 + ver2*256 + ver3;
5639 s->lavc_build= build;
5642 /* xvid detection */
5643 e=sscanf(buf, "XviD%d", &build);
5645 s->xvid_build= build;
5648 //printf("User Data: %s\n", buf);
5652 static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
5653 int time_incr, time_increment;
5655 s->pict_type = get_bits(gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */
5656 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0 && !(s->flags & CODEC_FLAG_LOW_DELAY)){
5657 av_log(s->avctx, AV_LOG_ERROR, "low_delay flag set, but shouldnt, clearing it\n");
5661 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
5662 if(s->partitioned_frame)
5663 s->decode_mb= mpeg4_decode_partitioned_mb;
5665 s->decode_mb= ff_mpeg4_decode_mb;
5667 if(s->time_increment_resolution==0){
5668 s->time_increment_resolution=1;
5669 // fprintf(stderr, "time_increment_resolution is illegal\n");
5672 while (get_bits1(gb) != 0)
5675 check_marker(gb, "before time_increment");
5677 if(s->time_increment_bits==0){
5678 av_log(s->avctx, AV_LOG_ERROR, "hmm, seems the headers arnt complete, trying to guess time_increment_bits\n");
5680 for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){
5681 if(show_bits(gb, s->time_increment_bits+1)&1) break;
5684 av_log(s->avctx, AV_LOG_ERROR, "my guess is %d bits ;)\n",s->time_increment_bits);
5687 if(IS_3IV1) time_increment= get_bits1(gb); //FIXME investigate further
5688 else time_increment= get_bits(gb, s->time_increment_bits);
5690 // printf("%d %X\n", s->time_increment_bits, time_increment);
5691 //printf(" type:%d modulo_time_base:%d increment:%d\n", s->pict_type, time_incr, time_increment);
5692 if(s->pict_type!=B_TYPE){
5693 s->last_time_base= s->time_base;
5694 s->time_base+= time_incr;
5695 s->time= s->time_base*s->time_increment_resolution + time_increment;
5696 if(s->workaround_bugs&FF_BUG_UMP4){
5697 if(s->time < s->last_non_b_time){
5698 // fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaround\n");
5700 s->time+= s->time_increment_resolution;
5703 s->pp_time= s->time - s->last_non_b_time;
5704 s->last_non_b_time= s->time;
5706 s->time= (s->last_time_base + time_incr)*s->time_increment_resolution + time_increment;
5707 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
5708 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
5709 // printf("messed up order, seeking?, skiping current b frame\n");
5710 return FRAME_SKIPED;
5713 if(s->t_frame==0) s->t_frame= s->time - s->last_time_base;
5714 if(s->t_frame==0) s->t_frame=1; // 1/0 protection
5715 //printf("%Ld %Ld %d %d\n", s->last_non_b_time, s->time, s->pp_time, s->t_frame); fflush(stdout);
5716 s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame)
5717 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
5718 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame)
5719 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
5722 s->current_picture_ptr->pts= s->time*(int64_t)AV_TIME_BASE / s->time_increment_resolution;
5723 if(s->avctx->debug&FF_DEBUG_PTS)
5724 av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %f\n", s->current_picture_ptr->pts/(float)AV_TIME_BASE);
5726 check_marker(gb, "before vop_coded");
5729 if (get_bits1(gb) != 1){
5730 av_log(s->avctx, AV_LOG_ERROR, "vop not coded\n");
5731 return FRAME_SKIPED;
5733 //printf("time %d %d %d || %Ld %Ld %Ld\n", s->time_increment_bits, s->time_increment_resolution, s->time_base,
5734 //s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time);
5735 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE
5736 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
5737 /* rounding type for motion estimation */
5738 s->no_rounding = get_bits1(gb);
5742 //FIXME reduced res stuff
5744 if (s->shape != RECT_SHAPE) {
5745 if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) {
5746 int width, height, hor_spat_ref, ver_spat_ref;
5748 width = get_bits(gb, 13);
5749 skip_bits1(gb); /* marker */
5750 height = get_bits(gb, 13);
5751 skip_bits1(gb); /* marker */
5752 hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */
5753 skip_bits1(gb); /* marker */
5754 ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */
5756 skip_bits1(gb); /* change_CR_disable */
5758 if (get_bits1(gb) != 0) {
5759 skip_bits(gb, 8); /* constant_alpha_value */
5762 //FIXME complexity estimation stuff
5764 if (s->shape != BIN_ONLY_SHAPE) {
5765 s->intra_dc_threshold= mpeg4_dc_threshold[ get_bits(gb, 3) ];
5766 if(!s->progressive_sequence){
5767 s->top_field_first= get_bits1(gb);
5768 s->alternate_scan= get_bits1(gb);
5770 s->alternate_scan= 0;
5773 if(s->alternate_scan){
5774 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
5775 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
5776 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
5777 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
5779 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
5780 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
5781 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
5782 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
5785 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
5786 mpeg4_decode_sprite_trajectory(s, gb);
5787 if(s->sprite_brightness_change) av_log(s->avctx, AV_LOG_ERROR, "sprite_brightness_change not supported\n");
5788 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "static sprite not supported\n");
5791 if (s->shape != BIN_ONLY_SHAPE) {
5792 s->chroma_qscale= s->qscale = get_bits(gb, s->quant_precision);
5794 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (qscale=0)\n");
5795 return -1; // makes no sense to continue, as there is nothing left from the image then
5798 if (s->pict_type != I_TYPE) {
5799 s->f_code = get_bits(gb, 3); /* fcode_for */
5801 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (f_code=0)\n");
5802 return -1; // makes no sense to continue, as the MV decoding will break very quickly
5807 if (s->pict_type == B_TYPE) {
5808 s->b_code = get_bits(gb, 3);
5812 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
5813 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",
5814 s->qscale, s->f_code, s->b_code,
5815 s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")),
5816 gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first,
5817 s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,
5818 s->sprite_warping_accuracy, 1-s->no_rounding, s->vo_type, s->vol_control_parameters ? " VOLC" : " ", s->intra_dc_threshold);
5821 if(!s->scalability){
5822 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {
5823 skip_bits1(gb); // vop shape coding type
5826 if(s->enhancement_type){
5827 int load_backward_shape= get_bits1(gb);
5828 if(load_backward_shape){
5829 av_log(s->avctx, AV_LOG_ERROR, "load backward shape isnt supported\n");
5832 skip_bits(gb, 2); //ref_select_code
5835 /* detect buggy encoders which dont set the low_delay flag (divx4/xvid/opendivx)*/
5836 // note we cannot detect divx5 without b-frames easyly (allthough its buggy too)
5837 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
5838 av_log(s->avctx, AV_LOG_ERROR, "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
5842 s->picture_number++; // better than pic number==0 allways ;)
5844 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
5845 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
5847 if(s->workaround_bugs&FF_BUG_EDGE){
5848 s->h_edge_pos= s->width;
5849 s->v_edge_pos= s->height;
5855 * decode mpeg4 headers
5856 * @return <0 if no VOP found (or a damaged one)
5857 * FRAME_SKIPPED if a not coded VOP is found
5858 * 0 if a VOP is found
5860 int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb)
5864 /* search next start code */
5868 v = get_bits(gb, 8);
5869 startcode = ((startcode << 8) | v) & 0xffffffff;
5871 if(get_bits_count(gb) >= gb->size_in_bits){
5872 if(gb->size_in_bits==8 && s->divx_version){
5873 av_log(s->avctx, AV_LOG_ERROR, "frame skip %d\n", gb->size_in_bits);
5874 return FRAME_SKIPED; //divx bug
5876 return -1; //end of stream
5879 if((startcode&0xFFFFFF00) != 0x100)
5880 continue; //no startcode
5882 if(s->avctx->debug&FF_DEBUG_STARTCODE){
5883 av_log(s->avctx, AV_LOG_DEBUG, "startcode: %3X ", startcode);
5884 if (startcode<=0x11F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Start");
5885 else if(startcode<=0x12F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Layer Start");
5886 else if(startcode<=0x13F) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
5887 else if(startcode<=0x15F) av_log(s->avctx, AV_LOG_DEBUG, "FGS bp start");
5888 else if(startcode<=0x1AF) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
5889 else if(startcode==0x1B0) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq Start");
5890 else if(startcode==0x1B1) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq End");
5891 else if(startcode==0x1B2) av_log(s->avctx, AV_LOG_DEBUG, "User Data");
5892 else if(startcode==0x1B3) av_log(s->avctx, AV_LOG_DEBUG, "Group of VOP start");
5893 else if(startcode==0x1B4) av_log(s->avctx, AV_LOG_DEBUG, "Video Session Error");
5894 else if(startcode==0x1B5) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Start");
5895 else if(startcode==0x1B6) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Plane start");
5896 else if(startcode==0x1B7) av_log(s->avctx, AV_LOG_DEBUG, "slice start");
5897 else if(startcode==0x1B8) av_log(s->avctx, AV_LOG_DEBUG, "extension start");
5898 else if(startcode==0x1B9) av_log(s->avctx, AV_LOG_DEBUG, "fgs start");
5899 else if(startcode==0x1BA) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object start");
5900 else if(startcode==0x1BB) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object Plane start");
5901 else if(startcode==0x1BC) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object start");
5902 else if(startcode==0x1BD) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object Plane start");
5903 else if(startcode==0x1BE) av_log(s->avctx, AV_LOG_DEBUG, "Still Textutre Object start");
5904 else if(startcode==0x1BF) av_log(s->avctx, AV_LOG_DEBUG, "Textutre Spatial Layer start");
5905 else if(startcode==0x1C0) av_log(s->avctx, AV_LOG_DEBUG, "Textutre SNR Layer start");
5906 else if(startcode==0x1C1) av_log(s->avctx, AV_LOG_DEBUG, "Textutre Tile start");
5907 else if(startcode==0x1C2) av_log(s->avctx, AV_LOG_DEBUG, "Textutre Shape Layer start");
5908 else if(startcode==0x1C3) av_log(s->avctx, AV_LOG_DEBUG, "stuffing start");
5909 else if(startcode<=0x1C5) av_log(s->avctx, AV_LOG_DEBUG, "reserved");
5910 else if(startcode<=0x1FF) av_log(s->avctx, AV_LOG_DEBUG, "System start");
5911 av_log(s->avctx, AV_LOG_DEBUG, " at %d\n", get_bits_count(gb));
5914 if(startcode >= 0x120 && startcode <= 0x12F){
5915 if(decode_vol_header(s, gb) < 0)
5918 else if(startcode == USER_DATA_STARTCODE){
5919 decode_user_data(s, gb);
5921 else if(startcode == GOP_STARTCODE){
5922 mpeg4_decode_gop_header(s, gb);
5924 else if(startcode == VOP_STARTCODE){
5925 return decode_vop_header(s, gb);
5933 /* don't understand why they choose a different header ! */
5934 int intel_h263_decode_picture_header(MpegEncContext *s)
5938 /* picture header */
5939 if (get_bits_long(&s->gb, 22) != 0x20) {
5940 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
5943 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
5945 if (get_bits1(&s->gb) != 1) {
5946 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
5947 return -1; /* marker */
5949 if (get_bits1(&s->gb) != 0) {
5950 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
5951 return -1; /* h263 id */
5953 skip_bits1(&s->gb); /* split screen off */
5954 skip_bits1(&s->gb); /* camera off */
5955 skip_bits1(&s->gb); /* freeze picture release off */
5957 format = get_bits(&s->gb, 3);
5959 av_log(s->avctx, AV_LOG_ERROR, "Intel H263 free format not supported\n");
5964 s->pict_type = I_TYPE + get_bits1(&s->gb);
5966 s->unrestricted_mv = get_bits1(&s->gb);
5967 s->h263_long_vectors = s->unrestricted_mv;
5969 if (get_bits1(&s->gb) != 0) {
5970 av_log(s->avctx, AV_LOG_ERROR, "SAC not supported\n");
5971 return -1; /* SAC: off */
5973 if (get_bits1(&s->gb) != 0) {
5975 av_log(s->avctx, AV_LOG_ERROR, "Advanced Prediction Mode not supported\n");
5976 // return -1; /* advanced prediction mode: off */
5978 if (get_bits1(&s->gb) != 0) {
5979 av_log(s->avctx, AV_LOG_ERROR, "PB frame mode no supported\n");
5980 return -1; /* PB frame mode */
5983 /* skip unknown header garbage */
5984 skip_bits(&s->gb, 41);
5986 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
5987 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
5990 while (get_bits1(&s->gb) != 0) {
5991 skip_bits(&s->gb, 8);
5995 s->y_dc_scale_table=
5996 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
6001 int flv_h263_decode_picture_header(MpegEncContext *s)
6003 int format, width, height;
6005 /* picture header */
6006 if (get_bits_long(&s->gb, 17) != 1) {
6007 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
6010 format = get_bits(&s->gb, 5);
6011 if (format != 0 && format != 1) {
6012 av_log(s->avctx, AV_LOG_ERROR, "Bad picture format\n");
6015 s->h263_flv = format+1;
6016 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
6017 format = get_bits(&s->gb, 3);
6020 width = get_bits(&s->gb, 8);
6021 height = get_bits(&s->gb, 8);
6024 width = get_bits(&s->gb, 16);
6025 height = get_bits(&s->gb, 16);
6051 if ((width == 0) || (height == 0))
6056 s->pict_type = I_TYPE + get_bits(&s->gb, 2);
6057 if (s->pict_type > P_TYPE)
6058 s->pict_type = P_TYPE;
6059 skip_bits1(&s->gb); /* deblocking flag */
6060 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
6064 s->unrestricted_mv = 1;
6065 s->h263_long_vectors = 0;
6068 while (get_bits1(&s->gb) != 0) {
6069 skip_bits(&s->gb, 8);
6073 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
6074 av_log(s->avctx, AV_LOG_DEBUG, "%c esc_type:%d, qp:%d num:%d\n",
6075 av_get_pict_type_char(s->pict_type), s->h263_flv-1, s->qscale, s->picture_number);
6078 s->y_dc_scale_table=
6079 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;