2 * H263/MPEG4 backend for ffmpeg encoder and decoder
3 * Copyright (c) 2000,2001 Fabrice Bellard.
5 * Copyright (c) 2001 Juan J. Sierralta P.
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 * ac prediction encoding, b-frame support, error resilience, optimizations,
22 * qpel decoding, gmc decoding, interlaced decoding,
23 * by Michael Niedermayer <michaelni@gmx.at>
30 #include "mpegvideo.h"
32 #include "mpeg4data.h"
38 #define PRINT_MB_TYPE(a) {}
40 #define PRINT_MB_TYPE(a) printf(a)
43 #define INTRA_MCBPC_VLC_BITS 6
44 #define INTER_MCBPC_VLC_BITS 6
45 #define CBPY_VLC_BITS 6
48 #define SPRITE_TRAJ_VLC_BITS 6
49 #define MB_TYPE_B_VLC_BITS 4
50 #define TEX_VLC_BITS 9
52 #ifdef CONFIG_ENCODERS
53 static void h263_encode_block(MpegEncContext * s, DCTELEM * block,
55 static void h263_encode_motion(MpegEncContext * s, int val, int fcode);
56 static void h263p_encode_umotion(MpegEncContext * s, int val);
57 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block,
58 int n, int dc, UINT8 *scan_table,
59 PutBitContext *dc_pb, PutBitContext *ac_pb);
62 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode);
63 static int h263p_decode_umotion(MpegEncContext * s, int pred);
64 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
66 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
67 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
68 int n, int coded, int intra);
69 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr);
70 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
72 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s);
73 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr);
75 extern UINT32 inverse[256];
77 static UINT16 uni_DCtab_lum [512][2];
78 static UINT16 uni_DCtab_chrom[512][2];
80 #ifdef CONFIG_ENCODERS
81 static UINT16 (*mv_penalty)[MAX_MV*2+1]= NULL;
82 static UINT8 fcode_tab[MAX_MV*2+1];
83 static UINT8 umv_fcode_tab[MAX_MV*2+1];
85 static UINT32 uni_mpeg4_intra_rl_bits[64*64*2*2];
86 static UINT8 uni_mpeg4_intra_rl_len [64*64*2*2];
87 static UINT32 uni_mpeg4_inter_rl_bits[64*64*2*2];
88 static UINT8 uni_mpeg4_inter_rl_len [64*64*2*2];
89 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
90 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
104 int h263_get_picture_format(int width, int height)
108 if (width == 128 && height == 96)
110 else if (width == 176 && height == 144)
112 else if (width == 352 && height == 288)
114 else if (width == 704 && height == 576)
116 else if (width == 1408 && height == 1152)
123 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
127 align_put_bits(&s->pb);
129 /* Update the pointer to last GOB */
130 s->ptr_lastgob = pbBufPtr(&s->pb);
133 put_bits(&s->pb, 22, 0x20); /* PSC */
134 put_bits(&s->pb, 8, (((INT64)s->picture_number * 30 * FRAME_RATE_BASE) /
135 s->frame_rate) & 0xff);
137 put_bits(&s->pb, 1, 1); /* marker */
138 put_bits(&s->pb, 1, 0); /* h263 id */
139 put_bits(&s->pb, 1, 0); /* split screen off */
140 put_bits(&s->pb, 1, 0); /* camera off */
141 put_bits(&s->pb, 1, 0); /* freeze picture release off */
143 format = h263_get_picture_format(s->width, s->height);
146 put_bits(&s->pb, 3, format);
147 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
148 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
149 of H.263v1 UMV implies to check the predicted MV after
150 calculation of the current MB to see if we're on the limits */
151 put_bits(&s->pb, 1, 0); /* unrestricted motion vector: off */
152 put_bits(&s->pb, 1, 0); /* SAC: off */
153 put_bits(&s->pb, 1, 0); /* advanced prediction mode: off */
154 put_bits(&s->pb, 1, 0); /* not PB frame */
155 put_bits(&s->pb, 5, s->qscale);
156 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
159 /* H.263 Plus PTYPE */
160 put_bits(&s->pb, 3, 7);
161 put_bits(&s->pb,3,1); /* Update Full Extended PTYPE */
163 put_bits(&s->pb,3,6); /* Custom Source Format */
165 put_bits(&s->pb, 3, format);
167 put_bits(&s->pb,1,0); /* Custom PCF: off */
168 s->umvplus = (s->pict_type == P_TYPE) && s->unrestricted_mv;
169 put_bits(&s->pb, 1, s->umvplus); /* Unrestricted Motion Vector */
170 put_bits(&s->pb,1,0); /* SAC: off */
171 put_bits(&s->pb,1,0); /* Advanced Prediction Mode: off */
172 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
173 put_bits(&s->pb,1,0); /* Deblocking Filter: off */
174 put_bits(&s->pb,1,0); /* Slice Structured: off */
175 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
176 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
177 put_bits(&s->pb,1,0); /* Alternative Inter VLC: off */
178 put_bits(&s->pb,1,0); /* Modified Quantization: off */
179 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
180 put_bits(&s->pb,3,0); /* Reserved */
182 put_bits(&s->pb, 3, s->pict_type == P_TYPE);
184 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
185 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
186 if (s->pict_type == I_TYPE)
190 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
191 put_bits(&s->pb,2,0); /* Reserved */
192 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
194 /* This should be here if PLUSPTYPE */
195 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
198 /* Custom Picture Format (CPFMT) */
200 if (s->aspect_ratio_info)
201 put_bits(&s->pb,4,s->aspect_ratio_info);
203 put_bits(&s->pb,4,2); /* Aspect ratio: CIF 12:11 (4:3) picture */
204 put_bits(&s->pb,9,(s->width >> 2) - 1);
205 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
206 put_bits(&s->pb,9,(s->height >> 2));
207 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED)
209 put_bits(&s->pb, 8, s->aspected_width);
210 put_bits(&s->pb, 8, s->aspected_height);
214 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
216 put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
217 put_bits(&s->pb, 5, s->qscale);
220 put_bits(&s->pb, 1, 0); /* no PEI */
224 s->c_dc_scale_table= h263_aic_dc_scale_table;
227 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
232 * Encodes a group of blocks header.
234 int h263_encode_gob_header(MpegEncContext * s, int mb_line)
236 align_put_bits(&s->pb);
237 flush_put_bits(&s->pb);
238 /* Call the RTP callback to send the last GOB */
239 if (s->rtp_callback) {
240 int pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
241 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
243 put_bits(&s->pb, 17, 1); /* GBSC */
244 s->gob_number = mb_line / s->gob_index;
245 put_bits(&s->pb, 5, s->gob_number); /* GN */
246 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
247 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
248 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
252 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6])
254 int score0=0, score1=0;
258 INT16 *ac_val, *ac_val1;
260 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
263 const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width;
265 ac_val-= s->block_wrap[n]*16;
266 if(s->mb_y==0 || s->qscale == s->qscale_table[xy] || n==2 || n==3){
269 const int level= block[n][s->idct_permutation[i ]];
271 score1+= ABS(level - ac_val[i+8]);
272 ac_val1[i ]= block[n][s->idct_permutation[i<<3]];
276 /* different qscale, we must rescale */
278 const int level= block[n][s->idct_permutation[i ]];
280 score1+= ABS(level - ROUNDED_DIV(ac_val[i + 8]*s->qscale_table[xy], s->qscale));
281 ac_val1[i ]= block[n][s->idct_permutation[i<<3]];
286 const int xy= s->mb_x-1 + s->mb_y*s->mb_width;
287 /* left prediction */
289 if(s->mb_x==0 || s->qscale == s->qscale_table[xy] || n==1 || n==3){
292 const int level= block[n][s->idct_permutation[i<<3]];
294 score1+= ABS(level - ac_val[i]);
296 ac_val1[i+8]= block[n][s->idct_permutation[i ]];
299 /* different qscale, we must rescale */
301 const int level= block[n][s->idct_permutation[i<<3]];
303 score1+= ABS(level - ROUNDED_DIV(ac_val[i]*s->qscale_table[xy], s->qscale));
305 ac_val1[i+8]= block[n][s->idct_permutation[i ]];
311 return score0 > score1 ? 1 : 0;
315 * modify qscale so that encoding is acually possible in h263 (limit difference to -2..2)
317 void ff_clean_h263_qscales(MpegEncContext *s){
320 for(i=1; i<s->mb_num; i++){
321 if(s->qscale_table[i] - s->qscale_table[i-1] >2)
322 s->qscale_table[i]= s->qscale_table[i-1]+2;
324 for(i=s->mb_num-2; i>=0; i--){
325 if(s->qscale_table[i] - s->qscale_table[i+1] >2)
326 s->qscale_table[i]= s->qscale_table[i+1]+2;
331 * modify mb_type & qscale so that encoding is acually possible in mpeg4
333 void ff_clean_mpeg4_qscales(MpegEncContext *s){
336 ff_clean_h263_qscales(s);
338 for(i=1; i<s->mb_num; i++){
339 if(s->qscale_table[i] != s->qscale_table[i-1] && (s->mb_type[i]&MB_TYPE_INTER4V)){
340 s->mb_type[i]&= ~MB_TYPE_INTER4V;
341 s->mb_type[i]|= MB_TYPE_INTER;
345 if(s->pict_type== B_TYPE){
347 /* ok, come on, this isnt funny anymore, theres more code for handling this mpeg4 mess than
348 for the actual adaptive quantization */
350 for(i=0; i<s->mb_num; i++){
351 odd += s->qscale_table[i]&1;
354 if(2*odd > s->mb_num) odd=1;
357 for(i=0; i<s->mb_num; i++){
358 if((s->qscale_table[i]&1) != odd)
359 s->qscale_table[i]++;
360 if(s->qscale_table[i] > 31)
361 s->qscale_table[i]= 31;
364 for(i=1; i<s->mb_num; i++){
365 if(s->qscale_table[i] != s->qscale_table[i-1] && (s->mb_type[i]&MB_TYPE_DIRECT)){
366 s->mb_type[i]&= ~MB_TYPE_DIRECT;
367 s->mb_type[i]|= MB_TYPE_BIDIR;
373 #ifdef CONFIG_ENCODERS
374 void mpeg4_encode_mb(MpegEncContext * s,
375 DCTELEM block[6][64],
376 int motion_x, int motion_y)
378 int cbpc, cbpy, i, pred_x, pred_y;
380 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
381 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=B_TYPE ? &s->tex_pb : &s->pb;
382 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=I_TYPE ? &s->pb2 : &s->pb;
383 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
384 const int dquant_code[5]= {1,0,9,2,3};
386 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
390 for (i = 0; i < 6; i++) {
391 if (s->block_last_index[i] >= 0)
395 if(s->pict_type==B_TYPE){
396 static const int mb_type_table[8]= {-1, 2, 3, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
397 int mb_type= mb_type_table[s->mv_dir];
403 s->last_mv[1][0][1]= 0;
406 assert(s->dquant>=-2 && s->dquant<=2);
407 assert((s->dquant&1)==0);
410 /* nothing to do if this MB was skiped in the next P Frame */
411 if(s->mbskip_table[s->mb_y * s->mb_width + s->mb_x]){ //FIXME avoid DCT & ...
417 s->mv_dir= MV_DIR_FORWARD; //doesnt matter
418 s->qscale -= s->dquant;
422 if ((cbp | motion_x | motion_y | mb_type) ==0) {
423 /* direct MB with MV={0,0} */
424 assert(s->dquant==0);
426 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
428 if(interleaved_stats){
435 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
436 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
437 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we dont need it :)
438 if(cbp) put_bits(&s->pb, 6, cbp);
442 put_bits(&s->pb, 2, (s->dquant>>2)+3);
444 put_bits(&s->pb, 1, 0);
446 s->qscale -= s->dquant;
448 if(!s->progressive_sequence){
450 put_bits(&s->pb, 1, s->interlaced_dct);
451 if(mb_type) // not diect mode
452 put_bits(&s->pb, 1, 0); // no interlaced ME yet
455 if(interleaved_stats){
456 bits= get_bit_count(&s->pb);
457 s->misc_bits+= bits - s->last_bits;
464 h263_encode_motion(s, motion_x, 1);
465 h263_encode_motion(s, motion_y, 1);
470 h263_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code);
471 h263_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
472 h263_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code);
473 h263_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
474 s->last_mv[0][0][0]= s->mv[0][0][0];
475 s->last_mv[0][0][1]= s->mv[0][0][1];
476 s->last_mv[1][0][0]= s->mv[1][0][0];
477 s->last_mv[1][0][1]= s->mv[1][0][1];
481 case 2: /* backward */
482 h263_encode_motion(s, motion_x - s->last_mv[1][0][0], s->b_code);
483 h263_encode_motion(s, motion_y - s->last_mv[1][0][1], s->b_code);
484 s->last_mv[1][0][0]= motion_x;
485 s->last_mv[1][0][1]= motion_y;
488 case 3: /* forward */
489 h263_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);
490 h263_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);
491 s->last_mv[0][0][0]= motion_x;
492 s->last_mv[0][0][1]= motion_y;
496 printf("unknown mb type\n");
500 if(interleaved_stats){
501 bits= get_bit_count(&s->pb);
502 s->mv_bits+= bits - s->last_bits;
506 /* encode each block */
507 for (i = 0; i < 6; i++) {
508 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, NULL, &s->pb);
511 if(interleaved_stats){
512 bits= get_bit_count(&s->pb);
513 s->p_tex_bits+= bits - s->last_bits;
516 }else{ /* s->pict_type==B_TYPE */
517 if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
518 /* check if the B frames can skip it too, as we must skip it if we skip here
519 why didnt they just compress the skip-mb bits instead of reusing them ?! */
520 if(s->max_b_frames>0){
527 if(x+16 > s->width) x= s->width-16;
528 if(y+16 > s->height) y= s->height-16;
530 offset= x + y*s->linesize;
531 p_pic= s->new_picture[0] + offset;
534 for(i=0; i<s->max_b_frames; i++){
538 if(s->coded_order[i+1].pict_type!=B_TYPE) break;
540 b_pic= s->coded_order[i+1].picture[0] + offset;
541 diff= pix_abs16x16(p_pic, b_pic, s->linesize);
542 if(diff>s->qscale*70){ //FIXME check that 70 is optimal
551 /* skip macroblock */
552 put_bits(&s->pb, 1, 1);
554 if(interleaved_stats){
563 put_bits(&s->pb, 1, 0); /* mb coded */
564 if(s->mv_type==MV_TYPE_16X16){
566 if(s->dquant) cbpc+= 8;
568 inter_MCBPC_bits[cbpc],
569 inter_MCBPC_code[cbpc]);
573 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
575 put_bits(pb2, 2, dquant_code[s->dquant+2]);
577 if(!s->progressive_sequence){
579 put_bits(pb2, 1, s->interlaced_dct);
580 put_bits(pb2, 1, 0); // no interlaced ME yet
583 if(interleaved_stats){
584 bits= get_bit_count(&s->pb);
585 s->misc_bits+= bits - s->last_bits;
589 /* motion vectors: 16x16 mode */
590 h263_pred_motion(s, 0, &pred_x, &pred_y);
592 h263_encode_motion(s, motion_x - pred_x, s->f_code);
593 h263_encode_motion(s, motion_y - pred_y, s->f_code);
597 inter_MCBPC_bits[cbpc],
598 inter_MCBPC_code[cbpc]);
601 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
603 if(!s->progressive_sequence){
605 put_bits(pb2, 1, s->interlaced_dct);
608 if(interleaved_stats){
609 bits= get_bit_count(&s->pb);
610 s->misc_bits+= bits - s->last_bits;
615 /* motion vectors: 8x8 mode*/
616 h263_pred_motion(s, i, &pred_x, &pred_y);
618 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][0] - pred_x, s->f_code);
619 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][1] - pred_y, s->f_code);
623 if(interleaved_stats){
624 bits= get_bit_count(&s->pb);
625 s->mv_bits+= bits - s->last_bits;
629 /* encode each block */
630 for (i = 0; i < 6; i++) {
631 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, NULL, tex_pb);
634 if(interleaved_stats){
635 bits= get_bit_count(&s->pb);
636 s->p_tex_bits+= bits - s->last_bits;
643 int dc_diff[6]; //dc values with the dc prediction subtracted
644 int dir[6]; //prediction direction
645 int zigzag_last_index[6];
646 UINT8 *scan_table[6];
649 const int level= block[i][0];
652 dc_diff[i]= level - ff_mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]);
654 *dc_ptr = level * s->y_dc_scale;
656 *dc_ptr = level * s->c_dc_scale;
660 s->ac_pred= decide_ac_pred(s, block, dir);
667 mpeg4_inv_pred_ac(s, block[i], i, dir[i]);
668 if (dir[i]==0) st = s->intra_v_scantable.permutated; /* left */
669 else st = s->intra_h_scantable.permutated; /* top */
671 for(last_index=63; last_index>=0; last_index--) //FIXME optimize
672 if(block[i][st[last_index]]) break;
673 zigzag_last_index[i]= s->block_last_index[i];
674 s->block_last_index[i]= last_index;
679 scan_table[i]= s->intra_scantable.permutated;
684 for (i = 0; i < 6; i++) {
685 if (s->block_last_index[i] >= 1)
690 if (s->pict_type == I_TYPE) {
691 if(s->dquant) cbpc+=4;
693 intra_MCBPC_bits[cbpc],
694 intra_MCBPC_code[cbpc]);
696 if(s->dquant) cbpc+=8;
697 put_bits(&s->pb, 1, 0); /* mb coded */
699 inter_MCBPC_bits[cbpc + 4],
700 inter_MCBPC_code[cbpc + 4]);
702 put_bits(pb2, 1, s->ac_pred);
704 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
706 put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
708 if(!s->progressive_sequence){
709 put_bits(dc_pb, 1, s->interlaced_dct);
712 if(interleaved_stats){
713 bits= get_bit_count(&s->pb);
714 s->misc_bits+= bits - s->last_bits;
718 /* encode each block */
719 for (i = 0; i < 6; i++) {
720 mpeg4_encode_block(s, block[i], i, dc_diff[i], scan_table[i], dc_pb, tex_pb);
723 if(interleaved_stats){
724 bits= get_bit_count(&s->pb);
725 s->i_tex_bits+= bits - s->last_bits;
730 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
736 ac_val = s->ac_val[0][0] + s->block_index[i] * 16;
740 block[i][s->idct_permutation[j ]]= ac_val[j+8];
743 block[i][s->idct_permutation[j<<3]]= ac_val[j ];
745 s->block_last_index[i]= zigzag_last_index[i];
751 void h263_encode_mb(MpegEncContext * s,
752 DCTELEM block[6][64],
753 int motion_x, int motion_y)
755 int cbpc, cbpy, i, cbp, pred_x, pred_y;
757 INT16 rec_intradc[6];
759 const int dquant_code[5]= {1,0,9,2,3};
761 //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
765 for (i = 0; i < 6; i++) {
766 if (s->block_last_index[i] >= 0)
769 if ((cbp | motion_x | motion_y | s->dquant) == 0) {
770 /* skip macroblock */
771 put_bits(&s->pb, 1, 1);
774 put_bits(&s->pb, 1, 0); /* mb coded */
776 if(s->dquant) cbpc+= 8;
778 inter_MCBPC_bits[cbpc],
779 inter_MCBPC_code[cbpc]);
782 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
784 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
786 /* motion vectors: 16x16 mode only now */
787 h263_pred_motion(s, 0, &pred_x, &pred_y);
790 h263_encode_motion(s, motion_x - pred_x, s->f_code);
791 h263_encode_motion(s, motion_y - pred_y, s->f_code);
794 h263p_encode_umotion(s, motion_x - pred_x);
795 h263p_encode_umotion(s, motion_y - pred_y);
796 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
797 /* To prevent Start Code emulation */
798 put_bits(&s->pb,1,1);
801 int li = s->h263_aic ? 0 : 1;
806 if (s->h263_aic && s->mb_intra) {
807 INT16 level = block[i][0];
809 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
813 level = (level + (s->qscale >> 1))/(s->y_dc_scale);
815 level = (level - (s->qscale >> 1))/(s->y_dc_scale);
817 /* AIC can change CBP */
818 if (level == 0 && s->block_last_index[i] == 0)
819 s->block_last_index[i] = -1;
820 else if (level < -127)
822 else if (level > 127)
827 rec_intradc[i] = (s->y_dc_scale*level) + pred_dc;
830 //if ((rec_intradc[i] % 2) == 0)
833 if (rec_intradc[i] < 0)
835 else if (rec_intradc[i] > 2047)
836 rec_intradc[i] = 2047;
838 /* Update AC/DC tables */
839 *dc_ptr[i] = rec_intradc[i];
842 if (s->block_last_index[i] >= li)
847 if (s->pict_type == I_TYPE) {
848 if(s->dquant) cbpc+=4;
850 intra_MCBPC_bits[cbpc],
851 intra_MCBPC_code[cbpc]);
853 if(s->dquant) cbpc+=8;
854 put_bits(&s->pb, 1, 0); /* mb coded */
856 inter_MCBPC_bits[cbpc + 4],
857 inter_MCBPC_code[cbpc + 4]);
860 /* XXX: currently, we do not try to use ac prediction */
861 put_bits(&s->pb, 1, 0); /* no AC prediction */
864 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
866 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
870 /* encode each block */
871 h263_encode_block(s, block[i], i);
873 /* Update INTRADC for decoding */
874 if (s->h263_aic && s->mb_intra) {
875 block[i][0] = rec_intradc[i];
882 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr)
884 int x, y, wrap, a, c, pred_dc, scale;
885 INT16 *dc_val, *ac_val;
887 /* find prediction */
889 x = 2 * s->mb_x + 1 + (n & 1);
890 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
891 wrap = s->mb_width * 2 + 2;
892 dc_val = s->dc_val[0];
893 ac_val = s->ac_val[0][0];
894 scale = s->y_dc_scale;
898 wrap = s->mb_width + 2;
899 dc_val = s->dc_val[n - 4 + 1];
900 ac_val = s->ac_val[n - 4 + 1][0];
901 scale = s->c_dc_scale;
906 a = dc_val[(x - 1) + (y) * wrap];
907 c = dc_val[(x) + (y - 1) * wrap];
909 /* No prediction outside GOB boundary */
910 if (s->first_slice_line && ((n < 2) || (n > 3)))
913 /* just DC prediction */
914 if (a != 1024 && c != 1024)
915 pred_dc = (a + c) >> 1;
921 /* we assume pred is positive */
922 //pred_dc = (pred_dc + (scale >> 1)) / scale;
923 *dc_val_ptr = &dc_val[x + y * wrap];
928 void h263_pred_acdc(MpegEncContext * s, INT16 *block, int n)
930 int x, y, wrap, a, c, pred_dc, scale, i;
931 INT16 *dc_val, *ac_val, *ac_val1;
933 /* find prediction */
935 x = 2 * s->mb_x + 1 + (n & 1);
936 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
937 wrap = s->mb_width * 2 + 2;
938 dc_val = s->dc_val[0];
939 ac_val = s->ac_val[0][0];
940 scale = s->y_dc_scale;
944 wrap = s->mb_width + 2;
945 dc_val = s->dc_val[n - 4 + 1];
946 ac_val = s->ac_val[n - 4 + 1][0];
947 scale = s->c_dc_scale;
950 ac_val += ((y) * wrap + (x)) * 16;
956 a = dc_val[(x - 1) + (y) * wrap];
957 c = dc_val[(x) + (y - 1) * wrap];
959 /* No prediction outside GOB boundary */
960 if (s->first_slice_line && ((n < 2) || (n > 3)))
964 if (s->h263_aic_dir) {
965 /* left prediction */
969 block[s->idct_permutation[i<<3]] += ac_val[i];
978 block[s->idct_permutation[i ]] += ac_val[i + 8];
984 /* just DC prediction */
985 if (a != 1024 && c != 1024)
986 pred_dc = (a + c) >> 1;
993 /* we assume pred is positive */
994 block[0]=block[0]*scale + pred_dc;
998 else if (!(block[0] & 1))
1001 /* Update AC/DC tables */
1002 dc_val[(x) + (y) * wrap] = block[0];
1006 ac_val1[i ] = block[s->idct_permutation[i<<3]];
1009 ac_val1[8 + i] = block[s->idct_permutation[i ]];
1012 INT16 *h263_pred_motion(MpegEncContext * s, int block,
1016 INT16 *A, *B, *C, *mot_val;
1017 static const int off[4]= {2, 1, 1, -1};
1019 wrap = s->block_wrap[0];
1020 xy = s->block_index[block];
1022 mot_val = s->motion_val[xy];
1024 A = s->motion_val[xy - 1];
1025 /* special case for first (slice) line */
1026 if (s->first_slice_line && block<3) {
1027 // we cant just change some MVs to simulate that as we need them for the B frames (and ME)
1028 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
1029 if(block==0){ //most common case
1030 if(s->mb_x == s->resync_mb_x){ //rare
1032 }else if(s->mb_x + 1 == s->resync_mb_x){ //rare
1033 C = s->motion_val[xy + off[block] - wrap];
1038 *px = mid_pred(A[0], 0, C[0]);
1039 *py = mid_pred(A[1], 0, C[1]);
1046 if(s->mb_x + 1 == s->resync_mb_x){ //rare
1047 C = s->motion_val[xy + off[block] - wrap];
1048 *px = mid_pred(A[0], 0, C[0]);
1049 *py = mid_pred(A[1], 0, C[1]);
1054 }else{ /* block==2*/
1055 B = s->motion_val[xy - wrap];
1056 C = s->motion_val[xy + off[block] - wrap];
1057 if(s->mb_x == s->resync_mb_x) //rare
1060 *px = mid_pred(A[0], B[0], C[0]);
1061 *py = mid_pred(A[1], B[1], C[1]);
1064 B = s->motion_val[xy - wrap];
1065 C = s->motion_val[xy + off[block] - wrap];
1066 *px = mid_pred(A[0], B[0], C[0]);
1067 *py = mid_pred(A[1], B[1], C[1]);
1072 #ifdef CONFIG_ENCODERS
1073 static void h263_encode_motion(MpegEncContext * s, int val, int f_code)
1075 int range, l, bit_size, sign, code, bits;
1080 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1082 bit_size = f_code - 1;
1083 range = 1 << bit_size;
1084 /* modulo encoding */
1091 val= (val^sign)-sign;
1096 } else if (val >= l) {
1100 assert(val>=-l && val<l);
1110 code = (val >> bit_size) + 1;
1111 bits = val & (range - 1);
1113 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1115 put_bits(&s->pb, bit_size, bits);
1121 /* Encode MV differences on H.263+ with Unrestricted MV mode */
1122 static void h263p_encode_umotion(MpegEncContext * s, int val)
1132 put_bits(&s->pb, 1, 1);
1134 put_bits(&s->pb, 3, 0);
1136 put_bits(&s->pb, 3, 2);
1139 sval = ((val < 0) ? (short)(-val):(short)val);
1142 while (temp_val != 0) {
1143 temp_val = temp_val >> 1;
1149 tcode = (sval & (1 << (i-1))) >> (i-1);
1150 tcode = (tcode << 1) | 1;
1151 code = (code << 2) | tcode;
1154 code = ((code << 1) | (val < 0)) << 1;
1155 put_bits(&s->pb, (2*n_bits)+1, code);
1156 //printf("\nVal = %d\tCode = %d", sval, code);
1160 static void init_mv_penalty_and_fcode(MpegEncContext *s)
1165 if(mv_penalty==NULL)
1166 mv_penalty= av_mallocz( sizeof(UINT16)*(MAX_FCODE+1)*(2*MAX_MV+1) );
1168 for(f_code=1; f_code<=MAX_FCODE; f_code++){
1169 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
1172 if(mv==0) len= mvtab[0][1];
1174 int val, bit_size, range, code;
1176 bit_size = s->f_code - 1;
1177 range = 1 << bit_size;
1183 code = (val >> bit_size) + 1;
1185 len= mvtab[code][1] + 1 + bit_size;
1187 len= mvtab[32][1] + 2 + bit_size;
1191 mv_penalty[f_code][mv+MAX_MV]= len;
1195 for(f_code=MAX_FCODE; f_code>0; f_code--){
1196 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
1197 fcode_tab[mv+MAX_MV]= f_code;
1201 for(mv=0; mv<MAX_MV*2+1; mv++){
1202 umv_fcode_tab[mv]= 1;
1207 static void init_uni_dc_tab(void)
1209 int level, uni_code, uni_len;
1211 for(level=-256; level<256; level++){
1213 /* find number of bits */
1222 l= (-level) ^ ((1 << size) - 1);
1227 uni_code= DCtab_lum[size][0];
1228 uni_len = DCtab_lum[size][1];
1231 uni_code<<=size; uni_code|=l;
1234 uni_code<<=1; uni_code|=1;
1238 uni_DCtab_lum[level+256][0]= uni_code;
1239 uni_DCtab_lum[level+256][1]= uni_len;
1242 uni_code= DCtab_chrom[size][0];
1243 uni_len = DCtab_chrom[size][1];
1246 uni_code<<=size; uni_code|=l;
1249 uni_code<<=1; uni_code|=1;
1253 uni_DCtab_chrom[level+256][0]= uni_code;
1254 uni_DCtab_chrom[level+256][1]= uni_len;
1259 #ifdef CONFIG_ENCODERS
1260 static void init_uni_mpeg4_rl_tab(RLTable *rl, UINT32 *bits_tab, UINT8 *len_tab){
1261 int slevel, run, last;
1263 assert(MAX_LEVEL >= 64);
1264 assert(MAX_RUN >= 63);
1266 for(slevel=-64; slevel<64; slevel++){
1267 if(slevel==0) continue;
1268 for(run=0; run<64; run++){
1269 for(last=0; last<=1; last++){
1270 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1271 int level= slevel < 0 ? -slevel : slevel;
1272 int sign= slevel < 0 ? 1 : 0;
1273 int bits, len, code;
1276 len_tab[index]= 100;
1279 code= get_rl_index(rl, last, run, level);
1280 bits= rl->table_vlc[code][0];
1281 len= rl->table_vlc[code][1];
1282 bits=bits*2+sign; len++;
1284 if(code!=rl->n && len < len_tab[index]){
1285 bits_tab[index]= bits;
1286 len_tab [index]= len;
1290 bits= rl->table_vlc[rl->n][0];
1291 len= rl->table_vlc[rl->n][1];
1292 bits=bits*2; len++; //esc1
1293 level1= level - rl->max_level[last][run];
1295 code= get_rl_index(rl, last, run, level1);
1296 bits<<= rl->table_vlc[code][1];
1297 len += rl->table_vlc[code][1];
1298 bits += rl->table_vlc[code][0];
1299 bits=bits*2+sign; len++;
1301 if(code!=rl->n && len < len_tab[index]){
1302 bits_tab[index]= bits;
1303 len_tab [index]= len;
1309 bits= rl->table_vlc[rl->n][0];
1310 len= rl->table_vlc[rl->n][1];
1311 bits=bits*4+2; len+=2; //esc2
1312 run1 = run - rl->max_run[last][level] - 1;
1314 code= get_rl_index(rl, last, run1, level);
1315 bits<<= rl->table_vlc[code][1];
1316 len += rl->table_vlc[code][1];
1317 bits += rl->table_vlc[code][0];
1318 bits=bits*2+sign; len++;
1320 if(code!=rl->n && len < len_tab[index]){
1321 bits_tab[index]= bits;
1322 len_tab [index]= len;
1327 bits= rl->table_vlc[rl->n][0];
1328 len = rl->table_vlc[rl->n][1];
1329 bits=bits*4+3; len+=2; //esc3
1330 bits=bits*2+last; len++;
1331 bits=bits*64+run; len+=6;
1332 bits=bits*2+1; len++; //marker
1333 bits=bits*4096+(slevel&0xfff); len+=12;
1334 bits=bits*2+1; len++; //marker
1336 if(len < len_tab[index]){
1337 bits_tab[index]= bits;
1338 len_tab [index]= len;
1345 void h263_encode_init(MpegEncContext *s)
1347 static int done = 0;
1356 init_rl(&rl_intra_aic);
1358 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
1359 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
1361 init_mv_penalty_and_fcode(s);
1363 s->mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
1365 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
1366 switch(s->codec_id){
1367 case CODEC_ID_MPEG4:
1368 s->fcode_tab= fcode_tab;
1369 s->min_qcoeff= -2048;
1370 s->max_qcoeff= 2047;
1372 case CODEC_ID_H263P:
1373 s->fcode_tab= umv_fcode_tab;
1374 s->min_qcoeff= -128;
1377 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
1378 default: //nothing needed default table allready set in mpegvideo.c
1379 s->min_qcoeff= -128;
1381 s->y_dc_scale_table=
1382 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
1386 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
1387 s->inter_quant_bias= 0;
1389 s->intra_quant_bias=0;
1390 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
1394 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
1396 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
1400 if (s->mb_intra && !s->h263_aic) {
1403 /* 255 cannot be represented, so we clamp */
1408 /* 0 cannot be represented also */
1414 put_bits(&s->pb, 8, 0xff);
1416 put_bits(&s->pb, 8, level & 0xff);
1420 if (s->h263_aic && s->mb_intra)
1425 last_index = s->block_last_index[n];
1426 last_non_zero = i - 1;
1427 for (; i <= last_index; i++) {
1428 j = s->intra_scantable.permutated[i];
1431 run = i - last_non_zero - 1;
1432 last = (i == last_index);
1439 code = get_rl_index(rl, last, run, level);
1440 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1441 if (code == rl->n) {
1442 put_bits(&s->pb, 1, last);
1443 put_bits(&s->pb, 6, run);
1444 put_bits(&s->pb, 8, slevel & 0xff);
1446 put_bits(&s->pb, 1, sign);
1454 /***************************************************/
1456 * add mpeg4 stuffing bits (01...1)
1458 void ff_mpeg4_stuffing(PutBitContext * pbc)
1461 put_bits(pbc, 1, 0);
1462 length= (-get_bit_count(pbc))&7;
1463 if(length) put_bits(pbc, length, (1<<length)-1);
1466 /* must be called before writing the header */
1467 void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){
1468 int time_div, time_mod;
1470 if(s->pict_type==I_TYPE){ //we will encode a vol header
1471 s->time_increment_resolution= s->frame_rate/ff_gcd(s->frame_rate, FRAME_RATE_BASE);
1472 if(s->time_increment_resolution>=256*256) s->time_increment_resolution= 256*128;
1474 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
1478 s->time= (s->avctx->pts*s->time_increment_resolution + 500*1000)/(1000*1000);
1480 s->time= picture_number*(INT64)FRAME_RATE_BASE*s->time_increment_resolution/s->frame_rate;
1481 time_div= s->time/s->time_increment_resolution;
1482 time_mod= s->time%s->time_increment_resolution;
1484 if(s->pict_type==B_TYPE){
1485 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
1487 s->last_time_base= s->time_base;
1488 s->time_base= time_div;
1489 s->pp_time= s->time - s->last_non_b_time;
1490 s->last_non_b_time= s->time;
1494 static void mpeg4_encode_vol_header(MpegEncContext * s)
1496 int vo_ver_id=1; //must be 2 if we want GMC or q-pel
1499 s->vo_type= s->has_b_frames ? CORE_VO_TYPE : SIMPLE_VO_TYPE;
1501 put_bits(&s->pb, 16, 0);
1502 put_bits(&s->pb, 16, 0x100); /* video obj */
1503 put_bits(&s->pb, 16, 0);
1504 put_bits(&s->pb, 16, 0x120); /* video obj layer */
1506 put_bits(&s->pb, 1, 0); /* random access vol */
1507 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
1508 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
1509 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
1510 put_bits(&s->pb, 3, 1); /* is obj layer priority */
1511 if(s->aspect_ratio_info)
1512 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
1514 put_bits(&s->pb, 4, 1); /* aspect ratio info= sqare pixel */
1515 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED)
1517 put_bits(&s->pb, 8, s->aspected_width);
1518 put_bits(&s->pb, 8, s->aspected_height);
1522 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
1523 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
1524 put_bits(&s->pb, 1, s->low_delay);
1525 put_bits(&s->pb, 1, 0); /* vbv parameters= no */
1527 put_bits(&s->pb, 1, 0); /* vol control parameters= no */
1530 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
1531 put_bits(&s->pb, 1, 1); /* marker bit */
1533 put_bits(&s->pb, 16, s->time_increment_resolution);
1534 if (s->time_increment_bits < 1)
1535 s->time_increment_bits = 1;
1536 put_bits(&s->pb, 1, 1); /* marker bit */
1537 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
1538 put_bits(&s->pb, 1, 1); /* marker bit */
1539 put_bits(&s->pb, 13, s->width); /* vol width */
1540 put_bits(&s->pb, 1, 1); /* marker bit */
1541 put_bits(&s->pb, 13, s->height); /* vol height */
1542 put_bits(&s->pb, 1, 1); /* marker bit */
1543 put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
1544 put_bits(&s->pb, 1, 1); /* obmc disable */
1545 if (vo_ver_id == 1) {
1546 put_bits(&s->pb, 1, s->vol_sprite_usage=0); /* sprite enable */
1547 }else{ /* vo_ver_id == 2 */
1548 put_bits(&s->pb, 2, s->vol_sprite_usage=0); /* sprite enable */
1551 s->quant_precision=5;
1552 put_bits(&s->pb, 1, 0); /* not 8 bit == false */
1553 put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
1554 if(s->mpeg_quant) put_bits(&s->pb, 2, 0); /* no custom matrixes */
1557 put_bits(&s->pb, 1, s->quarter_sample=0);
1558 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
1559 s->resync_marker= s->rtp_mode;
1560 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
1561 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
1562 if(s->data_partitioning){
1563 put_bits(&s->pb, 1, 0); /* no rvlc */
1566 if (vo_ver_id != 1){
1567 put_bits(&s->pb, 1, 0); /* newpred */
1568 put_bits(&s->pb, 1, 0); /* reduced res vop */
1570 put_bits(&s->pb, 1, 0); /* scalability */
1572 ff_mpeg4_stuffing(&s->pb);
1576 put_bits(&s->pb, 16, 0);
1577 put_bits(&s->pb, 16, 0x1B2); /* user_data */
1578 sprintf(buf, "FFmpeg%sb%s", FFMPEG_VERSION, LIBAVCODEC_BUILD_STR);
1579 put_string(&s->pb, buf);
1580 ff_mpeg4_stuffing(&s->pb);
1584 /* write mpeg4 VOP header */
1585 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
1588 int time_div, time_mod;
1590 if(s->pict_type==I_TYPE){
1592 if(picture_number==0 || !s->strict_std_compliance)
1593 mpeg4_encode_vol_header(s);
1596 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
1598 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->frame_rate, FRAME_RATE_BASE);
1600 put_bits(&s->pb, 16, 0); /* vop header */
1601 put_bits(&s->pb, 16, 0x1B6); /* vop header */
1602 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
1604 time_div= s->time/s->time_increment_resolution;
1605 time_mod= s->time%s->time_increment_resolution;
1606 time_incr= time_div - s->last_time_base;
1608 put_bits(&s->pb, 1, 1);
1610 put_bits(&s->pb, 1, 0);
1612 put_bits(&s->pb, 1, 1); /* marker */
1613 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
1614 put_bits(&s->pb, 1, 1); /* marker */
1615 put_bits(&s->pb, 1, 1); /* vop coded */
1616 if ( s->pict_type == P_TYPE
1617 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
1618 s->no_rounding ^= 1;
1619 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
1621 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
1622 if(!s->progressive_sequence){
1623 put_bits(&s->pb, 1, s->top_field_first);
1624 put_bits(&s->pb, 1, s->alternate_scan);
1626 //FIXME sprite stuff
1628 put_bits(&s->pb, 5, s->qscale);
1630 if (s->pict_type != I_TYPE)
1631 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
1632 if (s->pict_type == B_TYPE)
1633 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
1634 // printf("****frame %d\n", picture_number);
1636 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
1637 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
1638 s->h_edge_pos= s->width;
1639 s->v_edge_pos= s->height;
1643 * change qscale by given dquant and update qscale dependant variables.
1645 static void change_qscale(MpegEncContext * s, int dquant)
1647 s->qscale += dquant;
1651 else if (s->qscale > 31)
1654 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
1655 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
1658 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr)
1660 int a, b, c, wrap, pred, scale;
1664 /* find prediction */
1666 scale = s->y_dc_scale;
1668 scale = s->c_dc_scale;
1670 wrap= s->block_wrap[n];
1671 dc_val = s->dc_val[0] + s->block_index[n];
1677 b = dc_val[ - 1 - wrap];
1678 c = dc_val[ - wrap];
1680 /* outside slice handling (we cant do that by memset as we need the dc for error resilience) */
1681 if(s->first_slice_line && n!=3){
1683 if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
1685 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
1686 if(n==0 || n==4 || n==5)
1690 if (abs(a - b) < abs(b - c)) {
1692 *dir_ptr = 1; /* top */
1695 *dir_ptr = 0; /* left */
1697 /* we assume pred is positive */
1700 "xorl %%edx, %%edx \n\t"
1702 : "=d" (pred), "=a"(dummy)
1703 : "a" (pred + (scale >> 1)), "c" (inverse[scale])
1706 pred = (pred + (scale >> 1)) / scale;
1709 /* prepare address for prediction update */
1710 *dc_val_ptr = &dc_val[0];
1715 void mpeg4_pred_ac(MpegEncContext * s, INT16 *block, int n,
1719 INT16 *ac_val, *ac_val1;
1721 /* find prediction */
1722 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1726 const int xy= s->mb_x-1 + s->mb_y*s->mb_width;
1727 /* left prediction */
1730 if(s->mb_x==0 || s->qscale == s->qscale_table[xy] || n==1 || n==3){
1733 block[s->idct_permutation[i<<3]] += ac_val[i];
1736 /* different qscale, we must rescale */
1738 block[s->idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*s->qscale_table[xy], s->qscale);
1742 const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width;
1743 /* top prediction */
1744 ac_val -= 16 * s->block_wrap[n];
1746 if(s->mb_y==0 || s->qscale == s->qscale_table[xy] || n==2 || n==3){
1749 block[s->idct_permutation[i]] += ac_val[i + 8];
1752 /* different qscale, we must rescale */
1754 block[s->idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*s->qscale_table[xy], s->qscale);
1761 ac_val1[i ] = block[s->idct_permutation[i<<3]];
1765 ac_val1[8 + i] = block[s->idct_permutation[i ]];
1769 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
1775 /* find prediction */
1776 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1779 const int xy= s->mb_x-1 + s->mb_y*s->mb_width;
1780 /* left prediction */
1782 if(s->mb_x==0 || s->qscale == s->qscale_table[xy] || n==1 || n==3){
1785 block[s->idct_permutation[i<<3]] -= ac_val[i];
1788 /* different qscale, we must rescale */
1790 block[s->idct_permutation[i<<3]] -= ROUNDED_DIV(ac_val[i]*s->qscale_table[xy], s->qscale);
1794 const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width;
1795 /* top prediction */
1796 ac_val -= 16 * s->block_wrap[n];
1797 if(s->mb_y==0 || s->qscale == s->qscale_table[xy] || n==2 || n==3){
1800 block[s->idct_permutation[i]] -= ac_val[i + 8];
1803 /* different qscale, we must rescale */
1805 block[s->idct_permutation[i]] -= ROUNDED_DIV(ac_val[i + 8]*s->qscale_table[xy], s->qscale);
1811 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
1814 // if(level<-255 || level>255) printf("dc overflow\n");
1818 put_bits(s, uni_DCtab_lum[level][1], uni_DCtab_lum[level][0]);
1821 put_bits(s, uni_DCtab_chrom[level][1], uni_DCtab_chrom[level][0]);
1825 /* find number of bits */
1835 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
1838 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
1841 /* encode remaining bits */
1844 level = (-level) ^ ((1 << size) - 1);
1845 put_bits(&s->pb, size, level);
1847 put_bits(&s->pb, 1, 1);
1851 #ifdef CONFIG_ENCODERS
1852 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
1853 UINT8 *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
1855 int i, last_non_zero;
1856 #if 0 //variables for the outcommented version
1857 int code, sign, last;
1862 const int last_index = s->block_last_index[n];
1864 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
1865 /* mpeg4 based DC predictor */
1866 mpeg4_encode_dc(dc_pb, intra_dc, n);
1867 if(last_index<1) return;
1870 bits_tab= uni_mpeg4_intra_rl_bits;
1871 len_tab = uni_mpeg4_intra_rl_len;
1873 if(last_index<0) return;
1876 bits_tab= uni_mpeg4_inter_rl_bits;
1877 len_tab = uni_mpeg4_inter_rl_len;
1881 last_non_zero = i - 1;
1883 for (; i < last_index; i++) {
1884 int level = block[ scan_table[i] ];
1886 int run = i - last_non_zero - 1;
1888 if((level&(~127)) == 0){
1889 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
1890 put_bits(ac_pb, len_tab[index], bits_tab[index]);
1892 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);
1897 /*if(i<=last_index)*/{
1898 int level = block[ scan_table[i] ];
1899 int run = i - last_non_zero - 1;
1901 if((level&(~127)) == 0){
1902 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
1903 put_bits(ac_pb, len_tab[index], bits_tab[index]);
1905 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);
1909 for (; i <= last_index; i++) {
1910 const int slevel = block[ scan_table[i] ];
1913 int run = i - last_non_zero - 1;
1914 last = (i == last_index);
1921 code = get_rl_index(rl, last, run, level);
1922 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1923 if (code == rl->n) {
1925 level1 = level - rl->max_level[last][run];
1928 code = get_rl_index(rl, last, run, level1);
1929 if (code == rl->n) {
1931 put_bits(ac_pb, 1, 1);
1932 if (level > MAX_LEVEL)
1934 run1 = run - rl->max_run[last][level] - 1;
1937 code = get_rl_index(rl, last, run1, level);
1938 if (code == rl->n) {
1941 put_bits(ac_pb, 1, 1);
1942 put_bits(ac_pb, 1, last);
1943 put_bits(ac_pb, 6, run);
1944 put_bits(ac_pb, 1, 1);
1945 put_bits(ac_pb, 12, slevel & 0xfff);
1946 put_bits(ac_pb, 1, 1);
1949 put_bits(ac_pb, 1, 0);
1950 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1951 put_bits(ac_pb, 1, sign);
1955 put_bits(ac_pb, 1, 0);
1956 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1957 put_bits(ac_pb, 1, sign);
1960 put_bits(ac_pb, 1, sign);
1970 /***********************************************/
1973 static VLC intra_MCBPC_vlc;
1974 static VLC inter_MCBPC_vlc;
1975 static VLC cbpy_vlc;
1977 static VLC dc_lum, dc_chrom;
1978 static VLC sprite_trajectory;
1979 static VLC mb_type_b_vlc;
1981 void init_rl(RLTable *rl)
1983 INT8 max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
1984 UINT8 index_run[MAX_RUN+1];
1985 int last, run, level, start, end, i;
1987 /* compute max_level[], max_run[] and index_run[] */
1988 for(last=0;last<2;last++) {
1997 memset(max_level, 0, MAX_RUN + 1);
1998 memset(max_run, 0, MAX_LEVEL + 1);
1999 memset(index_run, rl->n, MAX_RUN + 1);
2000 for(i=start;i<end;i++) {
2001 run = rl->table_run[i];
2002 level = rl->table_level[i];
2003 if (index_run[run] == rl->n)
2005 if (level > max_level[run])
2006 max_level[run] = level;
2007 if (run > max_run[level])
2008 max_run[level] = run;
2010 rl->max_level[last] = av_malloc(MAX_RUN + 1);
2011 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
2012 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
2013 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
2014 rl->index_run[last] = av_malloc(MAX_RUN + 1);
2015 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
2019 void init_vlc_rl(RLTable *rl)
2023 init_vlc(&rl->vlc, 9, rl->n + 1,
2024 &rl->table_vlc[0][1], 4, 2,
2025 &rl->table_vlc[0][0], 4, 2);
2028 for(q=0; q<32; q++){
2037 rl->rl_vlc[q]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
2038 for(i=0; i<rl->vlc.table_size; i++){
2039 int code= rl->vlc.table[i][0];
2040 int len = rl->vlc.table[i][1];
2043 if(len==0){ // illegal code
2046 }else if(len<0){ //more bits needed
2050 if(code==rl->n){ //esc
2054 run= rl->table_run [code] + 1;
2055 level= rl->table_level[code] * qmul + qadd;
2056 if(code >= rl->last) run+=192;
2059 rl->rl_vlc[q][i].len= len;
2060 rl->rl_vlc[q][i].level= level;
2061 rl->rl_vlc[q][i].run= run;
2068 /* XXX: find a better solution to handle static init */
2069 void h263_decode_init_vlc(MpegEncContext *s)
2071 static int done = 0;
2076 init_vlc(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 8,
2077 intra_MCBPC_bits, 1, 1,
2078 intra_MCBPC_code, 1, 1);
2079 init_vlc(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 25,
2080 inter_MCBPC_bits, 1, 1,
2081 inter_MCBPC_code, 1, 1);
2082 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
2083 &cbpy_tab[0][1], 2, 1,
2084 &cbpy_tab[0][0], 2, 1);
2085 init_vlc(&mv_vlc, MV_VLC_BITS, 33,
2087 &mvtab[0][0], 2, 1);
2090 init_rl(&rl_intra_aic);
2091 init_vlc_rl(&rl_inter);
2092 init_vlc_rl(&rl_intra);
2093 init_vlc_rl(&rl_intra_aic);
2094 init_vlc(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
2095 &DCtab_lum[0][1], 2, 1,
2096 &DCtab_lum[0][0], 2, 1);
2097 init_vlc(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
2098 &DCtab_chrom[0][1], 2, 1,
2099 &DCtab_chrom[0][0], 2, 1);
2100 init_vlc(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
2101 &sprite_trajectory_tab[0][1], 4, 2,
2102 &sprite_trajectory_tab[0][0], 4, 2);
2103 init_vlc(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
2104 &mb_type_b_tab[0][1], 2, 1,
2105 &mb_type_b_tab[0][0], 2, 1);
2110 * Get the GOB height based on picture height.
2112 int ff_h263_get_gob_height(MpegEncContext *s){
2113 if (s->height <= 400)
2115 else if (s->height <= 800)
2122 * decodes the group of blocks header.
2123 * @return <0 if an error occured
2125 static int h263_decode_gob_header(MpegEncContext *s)
2127 unsigned int val, gfid;
2130 /* Check for GOB Start Code */
2131 val = show_bits(&s->gb, 16);
2135 /* We have a GBSC probably with GSTUFF */
2136 skip_bits(&s->gb, 16); /* Drop the zeros */
2137 left= s->gb.size*8 - get_bits_count(&s->gb);
2138 //MN: we must check the bits left or we might end in a infinite loop (or segfault)
2139 for(;left>13; left--){
2140 if(get_bits1(&s->gb)) break; /* Seek the '1' bit */
2146 fprintf(stderr,"\nGOB Start Code at MB %d\n", (s->mb_y * s->mb_width) + s->mb_x);
2148 s->gob_number = get_bits(&s->gb, 5); /* GN */
2149 gfid = get_bits(&s->gb, 2); /* GFID */
2150 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
2154 s->mb_y= s->gob_index* s->gob_number;
2156 fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", s->gob_number, gfid, s->qscale);
2161 static inline void memsetw(short *tab, int val, int n)
2168 void ff_mpeg4_init_partitions(MpegEncContext *s)
2170 init_put_bits(&s->tex_pb, s->tex_pb_buffer, PB_BUFFER_SIZE, NULL, NULL);
2171 init_put_bits(&s->pb2 , s->pb2_buffer , PB_BUFFER_SIZE, NULL, NULL);
2174 void ff_mpeg4_merge_partitions(MpegEncContext *s)
2176 const int pb2_len = get_bit_count(&s->pb2 );
2177 const int tex_pb_len= get_bit_count(&s->tex_pb);
2178 const int bits= get_bit_count(&s->pb);
2180 if(s->pict_type==I_TYPE){
2181 put_bits(&s->pb, 19, DC_MARKER);
2182 s->misc_bits+=19 + pb2_len + bits - s->last_bits;
2183 s->i_tex_bits+= tex_pb_len;
2185 put_bits(&s->pb, 17, MOTION_MARKER);
2186 s->misc_bits+=17 + pb2_len;
2187 s->mv_bits+= bits - s->last_bits;
2188 s->p_tex_bits+= tex_pb_len;
2191 flush_put_bits(&s->pb2);
2192 flush_put_bits(&s->tex_pb);
2194 ff_copy_bits(&s->pb, s->pb2_buffer , pb2_len);
2195 ff_copy_bits(&s->pb, s->tex_pb_buffer, tex_pb_len);
2196 s->last_bits= get_bit_count(&s->pb);
2199 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
2200 switch(s->pict_type){
2205 return s->f_code+15;
2207 return MAX(MAX(s->f_code, s->b_code)+15, 17);
2213 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
2215 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
2217 ff_mpeg4_stuffing(&s->pb);
2218 put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0);
2219 put_bits(&s->pb, 1, 1);
2221 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
2222 put_bits(&s->pb, s->quant_precision, s->qscale);
2223 put_bits(&s->pb, 1, 0); /* no HEC */
2227 * check if the next stuff is a resync marker or the end.
2230 static inline int mpeg4_is_resync(MpegEncContext *s){
2231 const int bits_count= get_bits_count(&s->gb);
2233 if(s->workaround_bugs&FF_BUG_NO_PADDING){
2237 if(bits_count + 8 >= s->gb.size*8){
2238 int v= show_bits(&s->gb, 8);
2239 v|= 0x7F >> (7-(bits_count&7));
2244 if(show_bits(&s->gb, 16) == ff_mpeg4_resync_prefix[bits_count&7]){
2246 GetBitContext gb= s->gb;
2248 skip_bits(&s->gb, 1);
2249 align_get_bits(&s->gb);
2251 for(len=0; len<32; len++){
2252 if(get_bits1(&s->gb)) break;
2257 if(len>=ff_mpeg4_get_video_packet_prefix_length(s))
2265 * decodes the next video packet.
2266 * @return <0 if something went wrong
2268 static int mpeg4_decode_video_packet_header(MpegEncContext *s)
2270 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
2271 int header_extension=0, mb_num, len;
2273 /* is there enough space left for a video packet + header */
2274 if( get_bits_count(&s->gb) > s->gb.size*8-20) return -1;
2276 for(len=0; len<32; len++){
2277 if(get_bits1(&s->gb)) break;
2280 if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
2281 printf("marker does not match f_code\n");
2285 if(s->shape != RECT_SHAPE){
2286 header_extension= get_bits1(&s->gb);
2287 //FIXME more stuff here
2290 mb_num= get_bits(&s->gb, mb_num_bits);
2291 if(mb_num>=s->mb_num){
2292 fprintf(stderr, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);
2295 s->mb_x= mb_num % s->mb_width;
2296 s->mb_y= mb_num / s->mb_width;
2298 if(s->shape != BIN_ONLY_SHAPE){
2299 int qscale= get_bits(&s->gb, s->quant_precision);
2304 if(s->shape == RECT_SHAPE){
2305 header_extension= get_bits1(&s->gb);
2307 if(header_extension){
2311 while (get_bits1(&s->gb) != 0)
2314 check_marker(&s->gb, "before time_increment in video packed header");
2315 time_increment= get_bits(&s->gb, s->time_increment_bits);
2316 check_marker(&s->gb, "before vop_coding_type in video packed header");
2318 skip_bits(&s->gb, 2); /* vop coding type */
2319 //FIXME not rect stuff here
2321 if(s->shape != BIN_ONLY_SHAPE){
2322 skip_bits(&s->gb, 3); /* intra dc vlc threshold */
2323 //FIXME dont just ignore everything
2324 if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2325 mpeg4_decode_sprite_trajectory(s);
2326 fprintf(stderr, "untested\n");
2329 //FIXME reduced res stuff here
2331 if (s->pict_type != I_TYPE) {
2332 int f_code = get_bits(&s->gb, 3); /* fcode_for */
2334 printf("Error, video packet header damaged (f_code=0)\n");
2337 if (s->pict_type == B_TYPE) {
2338 int b_code = get_bits(&s->gb, 3);
2340 printf("Error, video packet header damaged (b_code=0)\n");
2345 //FIXME new-pred stuff
2347 //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));
2352 void ff_mpeg4_clean_buffers(MpegEncContext *s)
2354 int c_wrap, c_xy, l_wrap, l_xy;
2356 l_wrap= s->block_wrap[0];
2357 l_xy= s->mb_y*l_wrap*2 + s->mb_x*2;
2358 c_wrap= s->block_wrap[4];
2359 c_xy= s->mb_y*c_wrap + s->mb_x;
2363 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
2364 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
2365 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
2369 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(INT16));
2370 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(INT16));
2371 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(INT16));
2374 // we cant clear the MVs as they might be needed by a b frame
2375 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(INT16));
2376 // memset(s->motion_val, 0, 2*sizeof(INT16)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
2377 s->last_mv[0][0][0]=
2378 s->last_mv[0][0][1]=
2379 s->last_mv[1][0][0]=
2380 s->last_mv[1][0][1]= 0;
2384 * decodes the group of blocks / video packet header.
2385 * @return <0 if no resync found
2387 int ff_h263_resync(MpegEncContext *s){
2390 if(s->codec_id==CODEC_ID_MPEG4)
2393 align_get_bits(&s->gb);
2395 if(show_bits(&s->gb, 16)==0){
2396 if(s->codec_id==CODEC_ID_MPEG4)
2397 ret= mpeg4_decode_video_packet_header(s);
2399 ret= h263_decode_gob_header(s);
2403 //ok, its not where its supposed to be ...
2404 s->gb= s->last_resync_gb;
2405 align_get_bits(&s->gb);
2406 left= s->gb.size*8 - get_bits_count(&s->gb);
2408 for(;left>16+1+5+5; left-=8){
2409 if(show_bits(&s->gb, 16)==0){
2410 GetBitContext bak= s->gb;
2412 if(s->codec_id==CODEC_ID_MPEG4)
2413 ret= mpeg4_decode_video_packet_header(s);
2415 ret= h263_decode_gob_header(s);
2421 skip_bits(&s->gb, 8);
2428 * @param n either 0 for the x component or 1 for y
2429 * @returns the average MV for a GMC MB
2431 static inline int get_amv(MpegEncContext *s, int n){
2432 int x, y, mb_v, sum, dx, dy, shift;
2433 int len = 1 << (s->f_code + 4);
2434 const int a= s->sprite_warping_accuracy;
2436 if(s->real_sprite_warping_points==1){
2437 if(s->divx_version==500 && s->divx_build==413)
2438 sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample));
2440 sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a);
2442 dx= s->sprite_delta[n][0];
2443 dy= s->sprite_delta[n][1];
2444 shift= s->sprite_shift[0];
2445 if(n) dy -= 1<<(shift + a + 1);
2446 else dx -= 1<<(shift + a + 1);
2447 mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16;
2450 for(y=0; y<16; y++){
2454 //XXX FIXME optimize
2455 for(x=0; x<16; x++){
2461 sum= RSHIFT(sum<<s->quarter_sample, a);
2464 if (sum < -len) sum= -len;
2465 else if (sum >= len) sum= len-1;
2471 * decodes first partition.
2472 * @return number of MBs decoded or <0 if an error occured
2474 static int mpeg4_decode_partition_a(MpegEncContext *s){
2476 static const INT8 quant_tab[4] = { -1, -2, 1, 2 };
2478 /* decode first partition */
2480 s->first_slice_line=1;
2481 for(; s->mb_y<s->mb_height; s->mb_y++){
2482 ff_init_block_index(s);
2483 for(; s->mb_x<s->mb_width; s->mb_x++){
2484 const int xy= s->mb_x + s->mb_y*s->mb_width;
2489 ff_update_block_index(s);
2490 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
2491 s->first_slice_line=0;
2493 if(s->mb_x==0) PRINT_MB_TYPE("\n");
2495 if(s->pict_type==I_TYPE){
2498 if(show_bits(&s->gb, 19)==DC_MARKER){
2503 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
2506 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
2509 s->cbp_table[xy]= cbpc & 3;
2510 s->mb_type[xy]= MB_TYPE_INTRA;
2514 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2516 s->qscale_table[xy]= s->qscale;
2518 s->mbintra_table[xy]= 1;
2521 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
2523 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
2527 if(dc_pred_dir) dir|=1;
2529 s->pred_dir_table[xy]= dir;
2531 s->error_status_table[xy]= AC_ERROR;
2532 }else{ /* P/S_TYPE */
2533 int mx, my, pred_x, pred_y, bits;
2534 INT16 * const mot_val= s->motion_val[s->block_index[0]];
2535 const int stride= s->block_wrap[0]*2;
2537 bits= show_bits(&s->gb, 17);
2538 if(bits==MOTION_MARKER){
2544 s->mb_type[xy]= MB_TYPE_SKIPED;
2545 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2553 mot_val[0 ]= mot_val[2 ]=
2554 mot_val[0+stride]= mot_val[2+stride]= mx;
2555 mot_val[1 ]= mot_val[3 ]=
2556 mot_val[1+stride]= mot_val[3+stride]= my;
2558 if(s->mbintra_table[xy])
2559 ff_clean_intra_table_entries(s);
2561 s->error_status_table[xy]= AC_ERROR;
2564 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
2566 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
2571 else if (cbpc == 20)
2572 fprintf(stderr, "Stuffing !");
2573 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
2575 s->mb_intra = ((cbpc & 4) != 0);
2579 s->mbintra_table[xy]= 1;
2580 s->mb_type[xy]= MB_TYPE_INTRA;
2581 mot_val[0 ]= mot_val[2 ]=
2582 mot_val[0+stride]= mot_val[2+stride]= 0;
2583 mot_val[1 ]= mot_val[3 ]=
2584 mot_val[1+stride]= mot_val[3+stride]= 0;
2585 s->error_status_table[xy]= DC_ERROR|AC_ERROR;
2587 if(s->mbintra_table[xy])
2588 ff_clean_intra_table_entries(s);
2590 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
2591 s->mcsel= get_bits1(&s->gb);
2594 if ((cbpc & 16) == 0) {
2596 /* 16x16 motion prediction */
2597 s->mb_type[xy]= MB_TYPE_INTER;
2599 h263_pred_motion(s, 0, &pred_x, &pred_y);
2601 mx = h263_decode_motion(s, pred_x, s->f_code);
2605 my = h263_decode_motion(s, pred_y, s->f_code);
2613 mot_val[0 ]= mot_val[2 ] =
2614 mot_val[0+stride]= mot_val[2+stride]= mx;
2615 mot_val[1 ]= mot_val[3 ]=
2616 mot_val[1+stride]= mot_val[3+stride]= my;
2620 s->mb_type[xy]= MB_TYPE_INTER4V;
2622 INT16 *mot_val= h263_pred_motion(s, i, &pred_x, &pred_y);
2623 mx = h263_decode_motion(s, pred_x, s->f_code);
2627 my = h263_decode_motion(s, pred_y, s->f_code);
2634 s->error_status_table[xy]= AC_ERROR;
2645 * decode second partition.
2646 * @return <0 if an error occured
2648 static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
2650 static const INT8 quant_tab[4] = { -1, -2, 1, 2 };
2652 s->mb_x= s->resync_mb_x;
2653 s->first_slice_line=1;
2654 for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
2655 ff_init_block_index(s);
2656 for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
2657 const int xy= s->mb_x + s->mb_y*s->mb_width;
2660 ff_update_block_index(s);
2661 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
2662 s->first_slice_line=0;
2664 if(s->pict_type==I_TYPE){
2665 int ac_pred= get_bits1(&s->gb);
2666 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2668 fprintf(stderr, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2672 s->cbp_table[xy]|= cbpy<<2;
2673 s->pred_dir_table[xy]|= ac_pred<<7;
2674 }else{ /* P || S_TYPE */
2675 if(s->mb_type[xy]&MB_TYPE_INTRA){
2677 int ac_pred = get_bits1(&s->gb);
2678 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2681 fprintf(stderr, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2685 if(s->cbp_table[xy] & 8) {
2686 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2688 s->qscale_table[xy]= s->qscale;
2692 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
2694 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
2698 if(dc_pred_dir) dir|=1;
2700 s->cbp_table[xy]&= 3; //remove dquant
2701 s->cbp_table[xy]|= cbpy<<2;
2702 s->pred_dir_table[xy]= dir | (ac_pred<<7);
2703 s->error_status_table[xy]&= ~DC_ERROR;
2704 }else if(s->mb_type[xy]&MB_TYPE_SKIPED){
2705 s->qscale_table[xy]= s->qscale;
2706 s->cbp_table[xy]= 0;
2708 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2711 fprintf(stderr, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2715 if(s->cbp_table[xy] & 8) {
2716 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2718 s->qscale_table[xy]= s->qscale;
2720 s->cbp_table[xy]&= 3; //remove dquant
2721 s->cbp_table[xy]|= (cbpy^0xf)<<2;
2725 if(mb_num >= mb_count) return 0;
2732 * decodes the first & second partition
2733 * @return <0 if error (and sets error type in the error_status_table)
2735 int ff_mpeg4_decode_partitions(MpegEncContext *s)
2739 mb_num= mpeg4_decode_partition_a(s);
2743 if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
2744 fprintf(stderr, "slice below monitor ...\n");
2748 s->mb_num_left= mb_num;
2750 if(s->pict_type==I_TYPE){
2751 if(get_bits(&s->gb, 19)!=DC_MARKER){
2752 fprintf(stderr, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
2755 s->error_status_table[s->mb_x + s->mb_y*s->mb_width-1]|= MV_END|DC_END;
2757 if(get_bits(&s->gb, 17)!=MOTION_MARKER){
2758 fprintf(stderr, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
2761 s->error_status_table[s->mb_x + s->mb_y*s->mb_width-1]|= MV_END;
2764 if( mpeg4_decode_partition_b(s, mb_num) < 0){
2768 s->error_status_table[s->mb_x + s->mb_y*s->mb_width-1]|= DC_END;
2774 * decode partition C of one MB.
2775 * @return <0 if an error occured
2777 static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64])
2780 const int xy= s->mb_x + s->mb_y*s->mb_width;
2782 mb_type= s->mb_type[xy];
2783 cbp = s->cbp_table[xy];
2785 if(s->qscale_table[xy] != s->qscale){
2786 s->qscale= s->qscale_table[xy];
2787 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
2788 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
2791 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
2794 s->mv[0][i][0] = s->motion_val[ s->block_index[i] ][0];
2795 s->mv[0][i][1] = s->motion_val[ s->block_index[i] ][1];
2797 s->mb_intra = mb_type&MB_TYPE_INTRA;
2799 if (mb_type&MB_TYPE_SKIPED) {
2802 s->block_last_index[i] = -1;
2803 s->mv_dir = MV_DIR_FORWARD;
2804 s->mv_type = MV_TYPE_16X16;
2805 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2812 }else if(s->mb_intra){
2813 s->ac_pred = s->pred_dir_table[xy]>>7;
2815 /* decode each block */
2816 for (i = 0; i < 6; i++) {
2817 if(mpeg4_decode_block(s, block[i], i, cbp&32, 1) < 0){
2818 fprintf(stderr, "texture corrupted at %d %d\n", s->mb_x, s->mb_y);
2823 }else if(!s->mb_intra){
2824 // s->mcsel= 0; //FIXME do we need to init that
2826 s->mv_dir = MV_DIR_FORWARD;
2827 if (mb_type&MB_TYPE_INTER4V) {
2828 s->mv_type = MV_TYPE_8X8;
2830 s->mv_type = MV_TYPE_16X16;
2832 /* decode each block */
2833 for (i = 0; i < 6; i++) {
2834 if(mpeg4_decode_block(s, block[i], i, cbp&32, 0) < 0){
2835 fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y);
2841 } else { /* I-Frame */
2844 s->ac_pred = s->pred_dir_table[xy]>>7;
2846 /* decode each block */
2847 for (i = 0; i < 6; i++) {
2848 if(mpeg4_decode_block(s, block[i], i, cbp&32, 1) < 0){
2849 fprintf(stderr, "texture corrupted at %d %d (trying to continue with dc only)\n", s->mb_x, s->mb_y);
2856 s->error_status_table[xy]&= ~AC_ERROR;
2858 /* per-MB end of slice check */
2860 if(--s->mb_num_left <= 0){
2861 //printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size*8 - get_bits_count(&s->gb));
2862 if(mpeg4_is_resync(s))
2867 if(s->cbp_table[xy+1] && mpeg4_is_resync(s))
2874 int ff_h263_decode_mb(MpegEncContext *s,
2875 DCTELEM block[6][64])
2877 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
2879 static INT8 quant_tab[4] = { -1, -2, 1, 2 };
2881 s->error_status_table[s->mb_x + s->mb_y*s->mb_width]= 0;
2883 if(s->mb_x==0) PRINT_MB_TYPE("\n");
2885 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
2886 if (get_bits1(&s->gb)) {
2890 s->block_last_index[i] = -1;
2891 s->mv_dir = MV_DIR_FORWARD;
2892 s->mv_type = MV_TYPE_16X16;
2893 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2896 s->mv[0][0][0]= get_amv(s, 0);
2897 s->mv[0][0][1]= get_amv(s, 1);
2909 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
2910 //fprintf(stderr, "\tCBPC: %d", cbpc);
2915 else if (cbpc == 20)
2916 fprintf(stderr, "Stuffing !");
2919 s->mb_intra = ((cbpc & 4) != 0);
2920 if (s->mb_intra) goto intra;
2922 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
2923 s->mcsel= get_bits1(&s->gb);
2925 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2926 cbp = (cbpc & 3) | ((cbpy ^ 0xf) << 2);
2928 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2930 if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE)))
2931 s->interlaced_dct= get_bits1(&s->gb);
2933 s->mv_dir = MV_DIR_FORWARD;
2934 if ((cbpc & 16) == 0) {
2937 /* 16x16 global motion prediction */
2938 s->mv_type = MV_TYPE_16X16;
2941 s->mv[0][0][0] = mx;
2942 s->mv[0][0][1] = my;
2943 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
2945 /* 16x8 field motion prediction */
2946 s->mv_type= MV_TYPE_FIELD;
2948 s->field_select[0][0]= get_bits1(&s->gb);
2949 s->field_select[0][1]= get_bits1(&s->gb);
2951 h263_pred_motion(s, 0, &pred_x, &pred_y);
2954 mx = h263_decode_motion(s, pred_x, s->f_code);
2958 my = h263_decode_motion(s, pred_y/2, s->f_code);
2962 s->mv[0][i][0] = mx;
2963 s->mv[0][i][1] = my;
2967 /* 16x16 motion prediction */
2968 s->mv_type = MV_TYPE_16X16;
2969 h263_pred_motion(s, 0, &pred_x, &pred_y);
2971 mx = h263p_decode_umotion(s, pred_x);
2973 mx = h263_decode_motion(s, pred_x, s->f_code);
2979 my = h263p_decode_umotion(s, pred_y);
2981 my = h263_decode_motion(s, pred_y, s->f_code);
2985 s->mv[0][0][0] = mx;
2986 s->mv[0][0][1] = my;
2988 if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
2989 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
2993 s->mv_type = MV_TYPE_8X8;
2995 mot_val = h263_pred_motion(s, i, &pred_x, &pred_y);
2997 mx = h263p_decode_umotion(s, pred_x);
2999 mx = h263_decode_motion(s, pred_x, s->f_code);
3004 my = h263p_decode_umotion(s, pred_y);
3006 my = h263_decode_motion(s, pred_y, s->f_code);
3009 s->mv[0][i][0] = mx;
3010 s->mv[0][i][1] = my;
3011 if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
3012 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3017 } else if(s->pict_type==B_TYPE) {
3018 int modb1; // first bit of modb
3019 int modb2; // second bit of modb
3025 s->mb_intra = 0; //B-frames never contain intra blocks
3026 s->mcsel=0; // ... true gmc blocks
3030 s->last_mv[i][0][0]=
3031 s->last_mv[i][0][1]=
3032 s->last_mv[i][1][0]=
3033 s->last_mv[i][1][1]= 0;
3037 /* if we skipped it in the future P Frame than skip it now too */
3038 s->mb_skiped= s->mbskip_table[s->mb_y * s->mb_width + s->mb_x]; // Note, skiptab=0 if last was GMC
3043 s->block_last_index[i] = -1;
3045 s->mv_dir = MV_DIR_FORWARD;
3046 s->mv_type = MV_TYPE_16X16;
3055 modb1= get_bits1(&s->gb);
3057 mb_type=4; //like MB_TYPE_B_DIRECT but no vectors coded
3062 modb2= get_bits1(&s->gb);
3063 mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
3065 else cbp= get_bits(&s->gb, 6);
3067 if (mb_type!=MB_TYPE_B_DIRECT && cbp) {
3068 if(get_bits1(&s->gb)){
3069 change_qscale(s, get_bits1(&s->gb)*4 - 2);
3074 if(!s->progressive_sequence){
3076 s->interlaced_dct= get_bits1(&s->gb);
3078 if(mb_type!=MB_TYPE_B_DIRECT && get_bits1(&s->gb)){
3081 if(mb_type!=MB_TYPE_B_BACKW){
3082 s->field_select[0][0]= get_bits1(&s->gb);
3083 s->field_select[0][1]= get_bits1(&s->gb);
3085 if(mb_type!=MB_TYPE_B_FORW){
3086 s->field_select[1][0]= get_bits1(&s->gb);
3087 s->field_select[1][1]= get_bits1(&s->gb);
3093 if(mb_type!=MB_TYPE_B_DIRECT && !field_mv){
3094 s->mv_type= MV_TYPE_16X16;
3095 if(mb_type!=MB_TYPE_B_BACKW){
3096 s->mv_dir = MV_DIR_FORWARD;
3098 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
3099 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
3100 s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
3101 s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
3104 if(mb_type!=MB_TYPE_B_FORW){
3105 s->mv_dir |= MV_DIR_BACKWARD;
3107 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
3108 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
3109 s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
3110 s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
3112 if(mb_type!=MB_TYPE_B_DIRECT)
3113 PRINT_MB_TYPE(mb_type==MB_TYPE_B_FORW ? "F" : (mb_type==MB_TYPE_B_BACKW ? "B" : "T"));
3114 }else if(mb_type!=MB_TYPE_B_DIRECT){
3115 s->mv_type= MV_TYPE_FIELD;
3117 if(mb_type!=MB_TYPE_B_BACKW){
3118 s->mv_dir = MV_DIR_FORWARD;
3121 mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code);
3122 my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
3123 s->last_mv[0][i][0]= s->mv[0][i][0] = mx;
3124 s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
3128 if(mb_type!=MB_TYPE_B_FORW){
3129 s->mv_dir |= MV_DIR_BACKWARD;
3132 mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code);
3133 my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
3134 s->last_mv[1][i][0]= s->mv[1][i][0] = mx;
3135 s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
3138 if(mb_type!=MB_TYPE_B_DIRECT)
3139 PRINT_MB_TYPE(mb_type==MB_TYPE_B_FORW ? "f" : (mb_type==MB_TYPE_B_BACKW ? "b" : "t"));
3143 if(mb_type==4 || mb_type==MB_TYPE_B_DIRECT){
3144 int mb_index= s->mb_x + s->mb_y*s->mb_width;
3150 mx = h263_decode_motion(s, 0, 1);
3151 my = h263_decode_motion(s, 0, 1);
3154 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3155 xy= s->block_index[0];
3156 time_pp= s->pp_time;
3157 time_pb= s->pb_time;
3159 //FIXME avoid divides
3160 switch(s->co_located_type_table[mb_index]){
3162 s->mv_type= MV_TYPE_16X16;
3163 s->mv[0][0][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
3164 s->mv[0][0][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
3165 s->mv[1][0][0] = mx ? s->mv[0][0][0] - s->motion_val[xy][0]
3166 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
3167 s->mv[1][0][1] = my ? s->mv[0][0][1] - s->motion_val[xy][1]
3168 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
3169 PRINT_MB_TYPE(mb_type==4 ? "D" : "S");
3171 case CO_LOCATED_TYPE_4MV:
3172 s->mv_type = MV_TYPE_8X8;
3174 xy= s->block_index[i];
3175 s->mv[0][i][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
3176 s->mv[0][i][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
3177 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->motion_val[xy][0]
3178 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
3179 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->motion_val[xy][1]
3180 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
3184 case CO_LOCATED_TYPE_FIELDMV:
3185 s->mv_type = MV_TYPE_FIELD;
3187 if(s->top_field_first){
3188 time_pp= s->pp_field_time - s->field_select_table[mb_index][i] + i;
3189 time_pb= s->pb_field_time - s->field_select_table[mb_index][i] + i;
3191 time_pp= s->pp_field_time + s->field_select_table[mb_index][i] - i;
3192 time_pb= s->pb_field_time + s->field_select_table[mb_index][i] - i;
3194 s->mv[0][i][0] = s->field_mv_table[mb_index][i][0]*time_pb/time_pp + mx;
3195 s->mv[0][i][1] = s->field_mv_table[mb_index][i][1]*time_pb/time_pp + my;
3196 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->field_mv_table[mb_index][i][0]
3197 : s->field_mv_table[mb_index][i][0]*(time_pb - time_pp)/time_pp;
3198 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->field_mv_table[mb_index][i][1]
3199 : s->field_mv_table[mb_index][i][1]*(time_pb - time_pp)/time_pp;
3206 if(mb_type<0 || mb_type>4){
3207 printf("illegal MB_type\n");
3210 } else { /* I-Frame */
3211 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
3218 if (s->h263_pred || s->h263_aic) {
3219 s->ac_pred = get_bits1(&s->gb);
3220 if (s->ac_pred && s->h263_aic)
3221 s->h263_aic_dir = get_bits1(&s->gb);
3223 PRINT_MB_TYPE(s->ac_pred ? "A" : "I");
3225 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3226 if(cbpy<0) return -1;
3227 cbp = (cbpc & 3) | (cbpy << 2);
3229 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
3232 if(!s->progressive_sequence)
3233 s->interlaced_dct= get_bits1(&s->gb);
3235 /* decode each block */
3237 for (i = 0; i < 6; i++) {
3238 if (mpeg4_decode_block(s, block[i], i, cbp&32, 1) < 0)
3243 for (i = 0; i < 6; i++) {
3244 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
3252 /* decode each block */
3254 for (i = 0; i < 6; i++) {
3255 if (mpeg4_decode_block(s, block[i], i, cbp&32, 0) < 0)
3260 for (i = 0; i < 6; i++) {
3261 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
3268 /* per-MB end of slice check */
3269 if(s->codec_id==CODEC_ID_MPEG4){
3270 if(mpeg4_is_resync(s)){
3271 if(s->pict_type==B_TYPE && s->mbskip_table[s->mb_y * s->mb_width + s->mb_x+1])
3276 if(get_bits_count(&s->gb) + 7 >= s->gb.size*8){
3277 int v= show_bits(&s->gb, 8) >> (((get_bits_count(&s->gb)-1)&7)+1);
3281 if(show_bits(&s->gb, 16)==0)
3289 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
3291 int code, val, sign, shift, l;
3292 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
3299 sign = get_bits1(&s->gb);
3301 val = (code - 1) << shift;
3303 val |= get_bits(&s->gb, shift);
3309 /* modulo decoding */
3310 if (!s->h263_long_vectors) {
3311 l = 1 << (f_code + 4);
3314 } else if (val >= l) {
3318 /* horrible h263 long vector mode */
3319 if (pred < -31 && val < -63)
3321 if (pred > 32 && val > 63)
3328 /* Decodes RVLC of H.263+ UMV */
3329 static int h263p_decode_umotion(MpegEncContext * s, int pred)
3333 if (get_bits1(&s->gb)) /* Motion difference = 0 */
3336 code = 2 + get_bits1(&s->gb);
3338 while (get_bits1(&s->gb))
3341 code += get_bits1(&s->gb);
3346 code = (sign) ? (pred - code) : (pred + code);
3348 fprintf(stderr,"H.263+ UMV Motion = %d\n", code);
3354 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
3357 int code, level, i, j, last, run;
3358 RLTable *rl = &rl_inter;
3359 const UINT8 *scan_table;
3361 scan_table = s->intra_scantable.permutated;
3362 if (s->h263_aic && s->mb_intra) {
3366 if (s->h263_aic_dir)
3367 scan_table = s->intra_v_scantable.permutated; /* left */
3369 scan_table = s->intra_h_scantable.permutated; /* top */
3371 } else if (s->mb_intra) {
3373 if (s->h263_rv10 && s->rv10_version == 3 && s->pict_type == I_TYPE) {
3374 int component, diff;
3375 component = (n <= 3 ? 0 : n - 4 + 1);
3376 level = s->last_dc[component];
3377 if (s->rv10_first_dc_coded[component]) {
3378 diff = rv_decode_dc(s, n);
3382 level = level & 0xff; /* handle wrap round */
3383 s->last_dc[component] = level;
3385 s->rv10_first_dc_coded[component] = 1;
3388 level = get_bits(&s->gb, 8);
3398 if (s->mb_intra && s->h263_aic)
3400 s->block_last_index[n] = i - 1;
3405 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
3407 fprintf(stderr, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
3410 if (code == rl->n) {
3412 last = get_bits1(&s->gb);
3413 run = get_bits(&s->gb, 6);
3414 level = (INT8)get_bits(&s->gb, 8);
3415 if (s->h263_rv10 && level == -128) {
3416 /* XXX: should patch encoder too */
3417 level = get_bits(&s->gb, 12);
3418 level= (level + ((-1)<<11)) ^ ((-1)<<11); //sign extension
3421 run = rl->table_run[code];
3422 level = rl->table_level[code];
3423 last = code >= rl->last;
3424 if (get_bits1(&s->gb))
3429 fprintf(stderr, "run overflow at %dx%d\n", s->mb_x, s->mb_y);
3439 if (s->mb_intra && s->h263_aic) {
3440 h263_pred_acdc(s, block, n);
3443 s->block_last_index[n] = i;
3447 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
3449 int level, pred, code;
3453 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
3455 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
3456 if (code < 0 || code > 9 /* && s->nbit<9 */){
3457 fprintf(stderr, "illegal dc vlc\n");
3463 level = get_bits(&s->gb, code);
3464 if ((level >> (code - 1)) == 0) /* if MSB not set it is negative*/
3465 level = - (level ^ ((1 << code) - 1));
3467 if(get_bits1(&s->gb)==0){ /* marker */
3468 if(s->error_resilience>=2){
3469 fprintf(stderr, "dc marker bit missing\n");
3475 pred = ff_mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
3478 if(s->error_resilience>=3){
3479 fprintf(stderr, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
3485 *dc_val = level * s->y_dc_scale;
3487 *dc_val = level * s->c_dc_scale;
3489 if(s->error_resilience>=3){
3490 if(*dc_val > 2048 + s->y_dc_scale + s->c_dc_scale){
3491 fprintf(stderr, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
3500 * @return <0 if an error occured
3502 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
3503 int n, int coded, int intra)
3505 int level, i, last, run;
3508 RL_VLC_ELEM * rl_vlc;
3509 const UINT8 * scan_table;
3514 if(s->partitioned_frame){
3515 level = s->dc_val[0][ s->block_index[n] ];
3516 if(n<4) level= (level + (s->y_dc_scale>>1))/s->y_dc_scale; //FIXME optimizs
3517 else level= (level + (s->c_dc_scale>>1))/s->c_dc_scale;
3518 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_width]<<n)&32;
3520 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
3529 rl_vlc = rl_intra.rl_vlc[0];
3531 if (dc_pred_dir == 0)
3532 scan_table = s->intra_v_scantable.permutated; /* left */
3534 scan_table = s->intra_h_scantable.permutated; /* top */
3536 scan_table = s->intra_scantable.permutated;
3543 s->block_last_index[n] = i;
3548 scan_table = s->intra_scantable.permutated;
3553 rl_vlc = rl_inter.rl_vlc[0];
3555 qmul = s->qscale << 1;
3556 qadd = (s->qscale - 1) | 1;
3557 rl_vlc = rl_inter.rl_vlc[s->qscale];
3561 OPEN_READER(re, &s->gb);
3563 UPDATE_CACHE(re, &s->gb);
3564 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
3567 cache= GET_CACHE(re, &s->gb);
3569 if (cache&0x80000000) {
3570 if (cache&0x40000000) {
3572 SKIP_CACHE(re, &s->gb, 2);
3573 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
3574 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
3575 SKIP_COUNTER(re, &s->gb, 2+1+6);
3576 UPDATE_CACHE(re, &s->gb);
3578 if(SHOW_UBITS(re, &s->gb, 1)==0){
3579 fprintf(stderr, "1. marker bit missing in 3. esc\n");
3581 }; SKIP_CACHE(re, &s->gb, 1);
3583 level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
3585 if(SHOW_UBITS(re, &s->gb, 1)==0){
3586 fprintf(stderr, "2. marker bit missing in 3. esc\n");
3588 }; LAST_SKIP_CACHE(re, &s->gb, 1);
3590 SKIP_COUNTER(re, &s->gb, 1+12+1);
3592 if(level*s->qscale>1024 || level*s->qscale<-1024){
3593 fprintf(stderr, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
3598 const int abs_level= ABS(level);
3599 if(abs_level<=MAX_LEVEL && run<=MAX_RUN && ((s->workaround_bugs&FF_BUG_AC_VLC)==0)){
3600 const int run1= run - rl->max_run[last][abs_level] - 1;
3601 if(abs_level <= rl->max_level[last][run]){
3602 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
3605 if(abs_level <= rl->max_level[last][run]*2){
3606 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
3609 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
3610 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
3616 if (level>0) level= level * qmul + qadd;
3617 else level= level * qmul - qadd;
3623 #if MIN_CACHE_BITS < 20
3624 LAST_SKIP_BITS(re, &s->gb, 2);
3625 UPDATE_CACHE(re, &s->gb);
3627 SKIP_BITS(re, &s->gb, 2);
3629 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
3630 i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing
3631 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
3632 LAST_SKIP_BITS(re, &s->gb, 1);
3636 #if MIN_CACHE_BITS < 19
3637 LAST_SKIP_BITS(re, &s->gb, 1);
3638 UPDATE_CACHE(re, &s->gb);
3640 SKIP_BITS(re, &s->gb, 1);
3642 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
3644 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
3645 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
3646 LAST_SKIP_BITS(re, &s->gb, 1);
3650 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
3651 LAST_SKIP_BITS(re, &s->gb, 1);
3656 fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
3660 block[scan_table[i]] = level;
3664 block[scan_table[i]] = level;
3666 CLOSE_READER(re, &s->gb);
3670 mpeg4_pred_ac(s, block, n, dc_pred_dir);
3672 i = 63; /* XXX: not optimal */
3675 s->block_last_index[n] = i;
3679 /* most is hardcoded. should extend to handle all h263 streams */
3680 int h263_decode_picture_header(MpegEncContext *s)
3682 int format, width, height;
3684 /* picture start code */
3685 if (get_bits(&s->gb, 22) != 0x20) {
3686 fprintf(stderr, "Bad picture start code\n");
3689 /* temporal reference */
3690 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
3692 /* PTYPE starts here */
3693 if (get_bits1(&s->gb) != 1) {
3695 fprintf(stderr, "Bad marker\n");
3698 if (get_bits1(&s->gb) != 0) {
3699 fprintf(stderr, "Bad H263 id\n");
3700 return -1; /* h263 id */
3702 skip_bits1(&s->gb); /* split screen off */
3703 skip_bits1(&s->gb); /* camera off */
3704 skip_bits1(&s->gb); /* freeze picture release off */
3706 /* Reset GOB number */
3709 format = get_bits(&s->gb, 3);
3714 7 extended PTYPE (PLUSPTYPE)
3717 if (format != 7 && format != 6) {
3720 width = h263_format[format][0];
3721 height = h263_format[format][1];
3727 s->pict_type = I_TYPE + get_bits1(&s->gb);
3729 s->unrestricted_mv = get_bits1(&s->gb);
3730 s->h263_long_vectors = s->unrestricted_mv;
3732 if (get_bits1(&s->gb) != 0) {
3733 fprintf(stderr, "H263 SAC not supported\n");
3734 return -1; /* SAC: off */
3736 if (get_bits1(&s->gb) != 0) {
3737 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
3740 if (get_bits1(&s->gb) != 0) {
3741 fprintf(stderr, "H263 PB frame not supported\n");
3742 return -1; /* not PB frame */
3744 s->qscale = get_bits(&s->gb, 5);
3745 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
3751 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
3753 /* ufep other than 0 and 1 are reserved */
3756 format = get_bits(&s->gb, 3);
3757 dprintf("ufep=1, format: %d\n", format);
3758 skip_bits(&s->gb,1); /* Custom PCF */
3759 s->umvplus_dec = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */
3760 skip_bits1(&s->gb); /* Syntax-based Arithmetic Coding (SAC) */
3761 if (get_bits1(&s->gb) != 0) {
3762 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
3764 if (get_bits1(&s->gb) != 0) { /* Advanced Intra Coding (AIC) */
3768 skip_bits(&s->gb, 7);
3769 /* these are the 7 bits: (in order of appearence */
3770 /* Deblocking Filter */
3771 /* Slice Structured */
3772 /* Reference Picture Selection */
3773 /* Independent Segment Decoding */
3774 /* Alternative Inter VLC */
3775 /* Modified Quantization */
3776 /* Prevent start code emulation */
3778 skip_bits(&s->gb, 3); /* Reserved */
3779 } else if (ufep != 0) {
3780 fprintf(stderr, "Bad UFEP type (%d)\n", ufep);
3785 s->pict_type = get_bits(&s->gb, 3) + I_TYPE;
3786 dprintf("pict_type: %d\n", s->pict_type);
3787 if (s->pict_type != I_TYPE &&
3788 s->pict_type != P_TYPE)
3790 skip_bits(&s->gb, 2);
3791 s->no_rounding = get_bits1(&s->gb);
3792 dprintf("RTYPE: %d\n", s->no_rounding);
3793 skip_bits(&s->gb, 4);
3795 /* Get the picture dimensions */
3798 /* Custom Picture Format (CPFMT) */
3799 s->aspect_ratio_info = get_bits(&s->gb, 4);
3800 dprintf("aspect: %d\n", s->aspect_ratio_info);
3805 3 - 10:11 (525-type 4:3)
3806 4 - 16:11 (CIF 16:9)
3807 5 - 40:33 (525-type 16:9)
3810 width = (get_bits(&s->gb, 9) + 1) * 4;
3812 height = get_bits(&s->gb, 9) * 4;
3813 dprintf("\nH.263+ Custom picture: %dx%d\n",width,height);
3814 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
3815 /* aspected dimensions */
3816 s->aspected_width = get_bits(&s->gb, 8);
3817 s->aspected_height = get_bits(&s->gb, 8);
3820 width = h263_format[format][0];
3821 height = h263_format[format][1];
3823 if ((width == 0) || (height == 0))
3827 if (s->umvplus_dec) {
3828 skip_bits1(&s->gb); /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
3832 s->qscale = get_bits(&s->gb, 5);
3835 while (get_bits1(&s->gb) != 0) {
3836 skip_bits(&s->gb, 8);
3841 s->y_dc_scale_table=
3842 s->c_dc_scale_table= h263_aic_dc_scale_table;
3844 s->y_dc_scale_table=
3845 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
3851 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s)
3854 int a= 2<<s->sprite_warping_accuracy;
3855 int rho= 3-s->sprite_warping_accuracy;
3857 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
3858 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
3859 int sprite_ref[4][2];
3860 int virtual_ref[2][2];
3862 int alpha=0, beta=0;
3867 for(i=0; i<s->num_sprite_warping_points; i++){
3871 length= get_vlc(&s->gb, &sprite_trajectory);
3873 x= get_bits(&s->gb, length);
3875 if ((x >> (length - 1)) == 0) /* if MSB not set it is negative*/
3876 x = - (x ^ ((1 << length) - 1));
3878 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(&s->gb); /* marker bit */
3880 length= get_vlc(&s->gb, &sprite_trajectory);
3882 y=get_bits(&s->gb, length);
3884 if ((y >> (length - 1)) == 0) /* if MSB not set it is negative*/
3885 y = - (y ^ ((1 << length) - 1));
3887 skip_bits1(&s->gb); /* marker bit */
3888 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
3893 while((1<<alpha)<w) alpha++;
3894 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
3898 // Note, the 4th point isnt used for GMC
3899 if(s->divx_version==500 && s->divx_build==413){
3900 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
3901 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
3902 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
3903 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
3904 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
3905 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
3907 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
3908 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
3909 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
3910 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
3911 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
3912 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
3914 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
3915 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
3917 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
3918 // perhaps it should be reordered to be more readable ...
3919 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
3920 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
3921 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
3922 + 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);
3923 virtual_ref[0][1]= 16*vop_ref[0][1]
3924 + 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);
3925 virtual_ref[1][0]= 16*vop_ref[0][0]
3926 + 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);
3927 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
3928 + 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);
3930 switch(s->num_sprite_warping_points)
3933 s->sprite_offset[0][0]= 0;
3934 s->sprite_offset[0][1]= 0;
3935 s->sprite_offset[1][0]= 0;
3936 s->sprite_offset[1][1]= 0;
3937 s->sprite_delta[0][0]= a;
3938 s->sprite_delta[0][1]= 0;
3939 s->sprite_delta[1][0]= 0;
3940 s->sprite_delta[1][1]= a;
3941 s->sprite_shift[0]= 0;
3942 s->sprite_shift[1]= 0;
3945 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
3946 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
3947 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
3948 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
3949 s->sprite_delta[0][0]= a;
3950 s->sprite_delta[0][1]= 0;
3951 s->sprite_delta[1][0]= 0;
3952 s->sprite_delta[1][1]= a;
3953 s->sprite_shift[0]= 0;
3954 s->sprite_shift[1]= 0;
3957 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
3958 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
3959 + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])
3960 + (1<<(alpha+rho-1));
3961 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
3962 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
3963 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])
3964 + (1<<(alpha+rho-1));
3965 s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
3966 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
3967 +2*w2*r*sprite_ref[0][0]
3969 + (1<<(alpha+rho+1)));
3970 s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
3971 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
3972 +2*w2*r*sprite_ref[0][1]
3974 + (1<<(alpha+rho+1)));
3975 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
3976 s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]);
3977 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
3978 s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
3980 s->sprite_shift[0]= alpha+rho;
3981 s->sprite_shift[1]= alpha+rho+2;
3984 min_ab= MIN(alpha, beta);
3987 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
3988 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])
3989 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])
3990 + (1<<(alpha+beta+rho-min_ab-1));
3991 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))
3992 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])
3993 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])
3994 + (1<<(alpha+beta+rho-min_ab-1));
3995 s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)
3996 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)
3997 + 2*w2*h3*r*sprite_ref[0][0]
3999 + (1<<(alpha+beta+rho-min_ab+1));
4000 s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)
4001 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)
4002 + 2*w2*h3*r*sprite_ref[0][1]
4004 + (1<<(alpha+beta+rho-min_ab+1));
4005 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;
4006 s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;
4007 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;
4008 s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;
4010 s->sprite_shift[0]= alpha + beta + rho - min_ab;
4011 s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;
4014 /* try to simplify the situation */
4015 if( s->sprite_delta[0][0] == a<<s->sprite_shift[0]
4016 && s->sprite_delta[0][1] == 0
4017 && s->sprite_delta[1][0] == 0
4018 && s->sprite_delta[1][1] == a<<s->sprite_shift[0])
4020 s->sprite_offset[0][0]>>=s->sprite_shift[0];
4021 s->sprite_offset[0][1]>>=s->sprite_shift[0];
4022 s->sprite_offset[1][0]>>=s->sprite_shift[1];
4023 s->sprite_offset[1][1]>>=s->sprite_shift[1];
4024 s->sprite_delta[0][0]= a;
4025 s->sprite_delta[0][1]= 0;
4026 s->sprite_delta[1][0]= 0;
4027 s->sprite_delta[1][1]= a;
4028 s->sprite_shift[0]= 0;
4029 s->sprite_shift[1]= 0;
4030 s->real_sprite_warping_points=1;
4033 int shift_y= 16 - s->sprite_shift[0];
4034 int shift_c= 16 - s->sprite_shift[1];
4035 //printf("shifts %d %d\n", shift_y, shift_c);
4037 s->sprite_offset[0][i]<<= shift_y;
4038 s->sprite_offset[1][i]<<= shift_c;
4039 s->sprite_delta[0][i]<<= shift_y;
4040 s->sprite_delta[1][i]<<= shift_y;
4041 s->sprite_shift[i]= 16;
4043 s->real_sprite_warping_points= s->num_sprite_warping_points;
4046 printf("vop:%d:%d %d:%d %d:%d, sprite:%d:%d %d:%d %d:%d, virtual: %d:%d %d:%d\n",
4047 vop_ref[0][0], vop_ref[0][1],
4048 vop_ref[1][0], vop_ref[1][1],
4049 vop_ref[2][0], vop_ref[2][1],
4050 sprite_ref[0][0], sprite_ref[0][1],
4051 sprite_ref[1][0], sprite_ref[1][1],
4052 sprite_ref[2][0], sprite_ref[2][1],
4053 virtual_ref[0][0], virtual_ref[0][1],
4054 virtual_ref[1][0], virtual_ref[1][1]
4057 printf("offset: %d:%d , delta: %d %d %d %d, shift %d\n",
4058 s->sprite_offset[0][0], s->sprite_offset[0][1],
4059 s->sprite_delta[0][0], s->sprite_delta[0][1],
4060 s->sprite_delta[1][0], s->sprite_delta[1][1],
4066 static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
4067 int width, height, vo_ver_id;
4070 skip_bits(gb, 1); /* random access */
4071 s->vo_type= get_bits(gb, 8);
4072 if (get_bits1(gb) != 0) { /* is_ol_id */
4073 vo_ver_id = get_bits(gb, 4); /* vo_ver_id */
4074 skip_bits(gb, 3); /* vo_priority */
4078 //printf("vo type:%d\n",s->vo_type);
4079 s->aspect_ratio_info= get_bits(gb, 4);
4080 if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
4081 s->aspected_width = get_bits(gb, 8); // par_width
4082 s->aspected_height = get_bits(gb, 8); // par_height
4085 if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
4086 int chroma_format= get_bits(gb, 2);
4087 if(chroma_format!=1){
4088 printf("illegal chroma format\n");
4090 s->low_delay= get_bits1(gb);
4091 if(get_bits1(gb)){ /* vbv parameters */
4092 get_bits(gb, 15); /* first_half_bitrate */
4093 skip_bits1(gb); /* marker */
4094 get_bits(gb, 15); /* latter_half_bitrate */
4095 skip_bits1(gb); /* marker */
4096 get_bits(gb, 15); /* first_half_vbv_buffer_size */
4097 skip_bits1(gb); /* marker */
4098 get_bits(gb, 3); /* latter_half_vbv_buffer_size */
4099 get_bits(gb, 11); /* first_half_vbv_occupancy */
4100 skip_bits1(gb); /* marker */
4101 get_bits(gb, 15); /* latter_half_vbv_occupancy */
4102 skip_bits1(gb); /* marker */
4105 // set low delay flag only once so the smart? low delay detection wont be overriden
4106 if(s->picture_number==0)
4110 s->shape = get_bits(gb, 2); /* vol shape */
4111 if(s->shape != RECT_SHAPE) printf("only rectangular vol supported\n");
4112 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
4113 printf("Gray shape not supported\n");
4114 skip_bits(gb, 4); //video_object_layer_shape_extension
4117 skip_bits1(gb); /* marker */
4119 s->time_increment_resolution = get_bits(gb, 16);
4121 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
4122 if (s->time_increment_bits < 1)
4123 s->time_increment_bits = 1;
4124 skip_bits1(gb); /* marker */
4126 if (get_bits1(gb) != 0) { /* fixed_vop_rate */
4127 skip_bits(gb, s->time_increment_bits);
4130 if (s->shape != BIN_ONLY_SHAPE) {
4131 if (s->shape == RECT_SHAPE) {
4132 skip_bits1(gb); /* marker */
4133 width = get_bits(gb, 13);
4134 skip_bits1(gb); /* marker */
4135 height = get_bits(gb, 13);
4136 skip_bits1(gb); /* marker */
4137 if(width && height){ /* they should be non zero but who knows ... */
4140 // printf("width/height: %d %d\n", width, height);
4144 s->progressive_sequence= get_bits1(gb)^1;
4145 if(!get_bits1(gb)) printf("OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */
4146 if (vo_ver_id == 1) {
4147 s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */
4149 s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */
4151 if(s->vol_sprite_usage==STATIC_SPRITE) printf("Static Sprites not supported\n");
4152 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
4153 if(s->vol_sprite_usage==STATIC_SPRITE){
4154 s->sprite_width = get_bits(gb, 13);
4155 skip_bits1(gb); /* marker */
4156 s->sprite_height= get_bits(gb, 13);
4157 skip_bits1(gb); /* marker */
4158 s->sprite_left = get_bits(gb, 13);
4159 skip_bits1(gb); /* marker */
4160 s->sprite_top = get_bits(gb, 13);
4161 skip_bits1(gb); /* marker */
4163 s->num_sprite_warping_points= get_bits(gb, 6);
4164 s->sprite_warping_accuracy = get_bits(gb, 2);
4165 s->sprite_brightness_change= get_bits1(gb);
4166 if(s->vol_sprite_usage==STATIC_SPRITE)
4167 s->low_latency_sprite= get_bits1(gb);
4169 // FIXME sadct disable bit if verid!=1 && shape not rect
4171 if (get_bits1(gb) == 1) { /* not_8_bit */
4172 s->quant_precision = get_bits(gb, 4); /* quant_precision */
4173 if(get_bits(gb, 4)!=8) printf("N-bit not supported\n"); /* bits_per_pixel */
4174 if(s->quant_precision!=5) printf("quant precission %d\n", s->quant_precision);
4176 s->quant_precision = 5;
4179 // FIXME a bunch of grayscale shape things
4181 if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */
4184 /* load default matrixes */
4185 for(i=0; i<64; i++){
4186 int j= s->idct_permutation[i];
4187 v= ff_mpeg4_default_intra_matrix[i];
4188 s->intra_matrix[j]= v;
4189 s->chroma_intra_matrix[j]= v;
4191 v= ff_mpeg4_default_non_intra_matrix[i];
4192 s->inter_matrix[j]= v;
4193 s->chroma_inter_matrix[j]= v;
4196 /* load custom intra matrix */
4199 for(i=0; i<64; i++){
4204 j= s->idct_permutation[ ff_zigzag_direct[i] ];
4205 s->intra_matrix[j]= v;
4206 s->chroma_intra_matrix[j]= v;
4209 /* replicate last value */
4211 j= s->idct_permutation[ ff_zigzag_direct[i] ];
4212 s->intra_matrix[j]= v;
4213 s->chroma_intra_matrix[j]= v;
4217 /* load custom non intra matrix */
4220 for(i=0; i<64; i++){
4225 j= s->idct_permutation[ ff_zigzag_direct[i] ];
4226 s->inter_matrix[j]= v;
4227 s->chroma_inter_matrix[j]= v;
4230 /* replicate last value */
4232 j= s->idct_permutation[ ff_zigzag_direct[i] ];
4233 s->inter_matrix[j]= last;
4234 s->chroma_inter_matrix[j]= last;
4238 // FIXME a bunch of grayscale shape things
4242 s->quarter_sample= get_bits1(gb);
4243 else s->quarter_sample=0;
4245 if(!get_bits1(gb)) printf("Complexity estimation not supported\n");
4247 s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */
4249 s->data_partitioning= get_bits1(gb);
4250 if(s->data_partitioning){
4251 s->rvlc= get_bits1(gb);
4253 printf("reversible vlc not supported\n");
4257 if(vo_ver_id != 1) {
4258 s->new_pred= get_bits1(gb);
4260 printf("new pred not supported\n");
4261 skip_bits(gb, 2); /* requested upstream message type */
4262 skip_bits1(gb); /* newpred segment type */
4264 s->reduced_res_vop= get_bits1(gb);
4265 if(s->reduced_res_vop) printf("reduced resolution VOP not supported\n");
4269 s->reduced_res_vop= 0;
4272 s->scalability= get_bits1(gb);
4274 if (s->scalability) {
4275 GetBitContext bak= *gb;
4277 int ref_layer_sampling_dir;
4278 int h_sampling_factor_n;
4279 int h_sampling_factor_m;
4280 int v_sampling_factor_n;
4281 int v_sampling_factor_m;
4283 s->hierachy_type= get_bits1(gb);
4284 ref_layer_id= get_bits(gb, 4);
4285 ref_layer_sampling_dir= get_bits1(gb);
4286 h_sampling_factor_n= get_bits(gb, 5);
4287 h_sampling_factor_m= get_bits(gb, 5);
4288 v_sampling_factor_n= get_bits(gb, 5);
4289 v_sampling_factor_m= get_bits(gb, 5);
4290 s->enhancement_type= get_bits1(gb);
4292 if( h_sampling_factor_n==0 || h_sampling_factor_m==0
4293 || v_sampling_factor_n==0 || v_sampling_factor_m==0){
4295 // fprintf(stderr, "illegal scalability header (VERY broken encoder), trying to workaround\n");
4300 printf("scalability not supported\n");
4302 // bin shape stuff FIXME
4308 static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
4312 int ver, build, ver2, ver3;
4314 buf[0]= show_bits(gb, 8);
4315 for(i=1; i<256; i++){
4316 buf[i]= show_bits(gb, 16)&0xFF;
4317 if(buf[i]==0) break;
4322 /* divx detection */
4323 e=sscanf(buf, "DivX%dBuild%d", &ver, &build);
4325 e=sscanf(buf, "DivX%db%d", &ver, &build);
4327 s->divx_version= ver;
4328 s->divx_build= build;
4329 if(s->picture_number==0){
4330 printf("This file was encoded with DivX%d Build%d\n", ver, build);
4334 /* ffmpeg detection */
4335 e=sscanf(buf, "FFmpeg%d.%d.%db%d", &ver, &ver2, &ver3, &build);
4337 e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
4339 if(strcmp(buf, "ffmpeg")==0){
4340 s->ffmpeg_version= 0x000406;
4341 s->lavc_build= 4600;
4345 s->ffmpeg_version= ver*256*256 + ver2*256 + ver3;
4346 s->lavc_build= build;
4347 if(s->picture_number==0)
4348 printf("This file was encoded with libavcodec build %d\n", build);
4351 /* xvid detection */
4352 e=sscanf(buf, "XviD%d", &build);
4354 s->xvid_build= build;
4355 if(s->picture_number==0)
4356 printf("This file was encoded with XviD build %d\n", build);
4359 //printf("User Data: %s\n", buf);
4363 static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
4364 int time_incr, time_increment;
4366 s->pict_type = get_bits(gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */
4367 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0){
4368 printf("low_delay flag set, but shouldnt, clearing it\n");
4372 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
4373 if(s->partitioned_frame)
4374 s->decode_mb= mpeg4_decode_partitioned_mb;
4376 s->decode_mb= ff_h263_decode_mb;
4378 if(s->time_increment_resolution==0){
4379 s->time_increment_resolution=1;
4380 // fprintf(stderr, "time_increment_resolution is illegal\n");
4383 while (get_bits1(gb) != 0)
4386 check_marker(gb, "before time_increment");
4387 time_increment= get_bits(gb, s->time_increment_bits);
4388 //printf(" type:%d modulo_time_base:%d increment:%d\n", s->pict_type, time_incr, time_increment);
4389 if(s->pict_type!=B_TYPE){
4390 s->last_time_base= s->time_base;
4391 s->time_base+= time_incr;
4392 s->time= s->time_base*s->time_increment_resolution + time_increment;
4393 if(s->workaround_bugs&FF_BUG_UMP4){
4394 if(s->time < s->last_non_b_time){
4395 // fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaround\n");
4397 s->time+= s->time_increment_resolution;
4400 s->pp_time= s->time - s->last_non_b_time;
4401 s->last_non_b_time= s->time;
4403 s->time= (s->last_time_base + time_incr)*s->time_increment_resolution + time_increment;
4404 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
4405 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
4406 // printf("messed up order, seeking?, skiping current b frame\n");
4407 return FRAME_SKIPED;
4410 if(s->t_frame==0) s->t_frame= s->time - s->last_time_base;
4411 if(s->t_frame==0) s->t_frame=1; // 1/0 protection
4412 //printf("%Ld %Ld %d %d\n", s->last_non_b_time, s->time, s->pp_time, s->t_frame); fflush(stdout);
4413 s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame)
4414 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
4415 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame)
4416 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
4419 s->avctx->pts= s->time*1000LL*1000LL / s->time_increment_resolution;
4421 if(check_marker(gb, "before vop_coded")==0 && s->picture_number==0){
4422 printf("hmm, seems the headers arnt complete, trying to guess time_increment_bits\n");
4423 for(s->time_increment_bits++ ;s->time_increment_bits<16; s->time_increment_bits++){
4424 if(get_bits1(gb)) break;
4426 printf("my guess is %d bits ;)\n",s->time_increment_bits);
4429 if (get_bits1(gb) != 1){
4430 printf("vop not coded\n");
4431 return FRAME_SKIPED;
4433 //printf("time %d %d %d || %Ld %Ld %Ld\n", s->time_increment_bits, s->time_increment_resolution, s->time_base,
4434 //s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time);
4435 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE
4436 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
4437 /* rounding type for motion estimation */
4438 s->no_rounding = get_bits1(gb);
4442 //FIXME reduced res stuff
4444 if (s->shape != RECT_SHAPE) {
4445 if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) {
4446 int width, height, hor_spat_ref, ver_spat_ref;
4448 width = get_bits(gb, 13);
4449 skip_bits1(gb); /* marker */
4450 height = get_bits(gb, 13);
4451 skip_bits1(gb); /* marker */
4452 hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */
4453 skip_bits1(gb); /* marker */
4454 ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */
4456 skip_bits1(gb); /* change_CR_disable */
4458 if (get_bits1(gb) != 0) {
4459 skip_bits(gb, 8); /* constant_alpha_value */
4462 //FIXME complexity estimation stuff
4464 if (s->shape != BIN_ONLY_SHAPE) {
4466 t=get_bits(gb, 3); /* intra dc VLC threshold */
4467 //printf("threshold %d\n", t);
4468 if(!s->progressive_sequence){
4469 s->top_field_first= get_bits1(gb);
4470 s->alternate_scan= get_bits1(gb);
4472 s->alternate_scan= 0;
4475 if(s->alternate_scan){
4476 ff_init_scantable(s, &s->inter_scantable , ff_alternate_vertical_scan);
4477 ff_init_scantable(s, &s->intra_scantable , ff_alternate_vertical_scan);
4478 ff_init_scantable(s, &s->intra_h_scantable, ff_alternate_vertical_scan);
4479 ff_init_scantable(s, &s->intra_v_scantable, ff_alternate_vertical_scan);
4481 ff_init_scantable(s, &s->inter_scantable , ff_zigzag_direct);
4482 ff_init_scantable(s, &s->intra_scantable , ff_zigzag_direct);
4483 ff_init_scantable(s, &s->intra_h_scantable, ff_alternate_horizontal_scan);
4484 ff_init_scantable(s, &s->intra_v_scantable, ff_alternate_vertical_scan);
4487 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
4488 mpeg4_decode_sprite_trajectory(s);
4489 if(s->sprite_brightness_change) printf("sprite_brightness_change not supported\n");
4490 if(s->vol_sprite_usage==STATIC_SPRITE) printf("static sprite not supported\n");
4493 if (s->shape != BIN_ONLY_SHAPE) {
4494 s->qscale = get_bits(gb, s->quant_precision);
4496 printf("Error, header damaged or not MPEG4 header (qscale=0)\n");
4497 return -1; // makes no sense to continue, as there is nothing left from the image then
4500 if (s->pict_type != I_TYPE) {
4501 s->f_code = get_bits(gb, 3); /* fcode_for */
4503 printf("Error, header damaged or not MPEG4 header (f_code=0)\n");
4504 return -1; // makes no sense to continue, as the MV decoding will break very quickly
4509 if (s->pict_type == B_TYPE) {
4510 s->b_code = get_bits(gb, 3);
4514 printf("qp:%d fc:%d bc:%d type:%s size:%d pro:%d alt:%d top:%d qpel:%d part:%d resync:%d w:%d a:%d\n",
4515 s->qscale, s->f_code, s->b_code,
4516 s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")),
4517 gb->size,s->progressive_sequence, s->alternate_scan, s->top_field_first,
4518 s->quarter_sample, s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,
4519 s->sprite_warping_accuracy);
4521 if(!s->scalability){
4522 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {
4523 skip_bits1(gb); // vop shape coding type
4526 if(s->enhancement_type){
4527 int load_backward_shape= get_bits1(gb);
4528 if(load_backward_shape){
4529 printf("load backward shape isnt supported\n");
4532 skip_bits(gb, 2); //ref_select_code
4535 /* detect buggy encoders which dont set the low_delay flag (divx4/xvid/opendivx)*/
4536 // note we cannot detect divx5 without b-frames easyly (allthough its buggy too)
4537 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
4538 printf("looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
4542 s->picture_number++; // better than pic number==0 allways ;)
4544 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
4545 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
4547 if(s->divx_version==0 || s->divx_version < 500){
4548 s->h_edge_pos= s->width;
4549 s->v_edge_pos= s->height;
4555 * decode mpeg4 headers
4556 * @return <0 if no VOP found (or a damaged one)
4557 * FRAME_SKIPPED if a not coded VOP is found
4558 * 0 if a VOP is found
4560 int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb)
4564 /* search next start code */
4568 v = get_bits(gb, 8);
4569 startcode = ((startcode << 8) | v) & 0xffffffff;
4571 if(get_bits_count(gb) >= gb->size*8){
4572 if(gb->size==1 && s->divx_version){
4573 printf("frame skip %d\n", gb->size);
4574 return FRAME_SKIPED; //divx bug
4576 return -1; //end of stream
4579 if((startcode&0xFFFFFF00) != 0x100)
4580 continue; //no startcode
4584 decode_vol_header(s, gb);
4587 decode_user_data(s, gb);
4590 return decode_vop_header(s, gb);
4592 // printf("startcode %X found\n", startcode);
4601 /* don't understand why they choose a different header ! */
4602 int intel_h263_decode_picture_header(MpegEncContext *s)
4606 /* picture header */
4607 if (get_bits(&s->gb, 22) != 0x20) {
4608 fprintf(stderr, "Bad picture start code\n");
4611 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
4613 if (get_bits1(&s->gb) != 1) {
4614 fprintf(stderr, "Bad marker\n");
4615 return -1; /* marker */
4617 if (get_bits1(&s->gb) != 0) {
4618 fprintf(stderr, "Bad H263 id\n");
4619 return -1; /* h263 id */
4621 skip_bits1(&s->gb); /* split screen off */
4622 skip_bits1(&s->gb); /* camera off */
4623 skip_bits1(&s->gb); /* freeze picture release off */
4625 format = get_bits(&s->gb, 3);
4627 fprintf(stderr, "Intel H263 free format not supported\n");
4632 s->pict_type = I_TYPE + get_bits1(&s->gb);
4634 s->unrestricted_mv = get_bits1(&s->gb);
4635 s->h263_long_vectors = s->unrestricted_mv;
4637 if (get_bits1(&s->gb) != 0) {
4638 fprintf(stderr, "SAC not supported\n");
4639 return -1; /* SAC: off */
4641 if (get_bits1(&s->gb) != 0) {
4642 fprintf(stderr, "Advanced Prediction Mode not supported\n");
4643 return -1; /* advanced prediction mode: off */
4645 if (get_bits1(&s->gb) != 0) {
4646 fprintf(stderr, "PB frame mode no supported\n");
4647 return -1; /* PB frame mode */
4650 /* skip unknown header garbage */
4651 skip_bits(&s->gb, 41);
4653 s->qscale = get_bits(&s->gb, 5);
4654 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
4657 while (get_bits1(&s->gb) != 0) {
4658 skip_bits(&s->gb, 8);
4662 s->y_dc_scale_table=
4663 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;