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 by Michael Niedermayer <michaelni@gmx.at>
28 #include "mpegvideo.h"
30 #include "mpeg4data.h"
32 //rounded divison & shift
33 #define RSHIFT(a,b) ((a) > 0 ? ((a) + (1<<((b)-1)))>>(b) : ((a) + (1<<((b)-1))-1)>>(b))
35 #define PRINT_MB_TYPE(a) ;
36 //#define PRINT_MB_TYPE(a) printf(a);
38 static void h263_encode_block(MpegEncContext * s, DCTELEM * block,
40 static void h263_encode_motion(MpegEncContext * s, int val, int fcode);
41 static void h263p_encode_umotion(MpegEncContext * s, int val);
42 static void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block,
43 int n, int dc, UINT8 *scan_table,
44 PutBitContext *dc_pb, PutBitContext *ac_pb);
45 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode);
46 static int h263p_decode_umotion(MpegEncContext * s, int pred);
47 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
49 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
50 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
52 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr);
53 static inline int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr);
54 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
56 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s);
58 extern UINT32 inverse[256];
60 static UINT16 mv_penalty[MAX_FCODE+1][MAX_MV*2+1];
61 static UINT8 fcode_tab[MAX_MV*2+1];
62 static UINT8 umv_fcode_tab[MAX_MV*2+1];
64 static UINT16 uni_DCtab_lum [512][2];
65 static UINT16 uni_DCtab_chrom[512][2];
67 int h263_get_picture_format(int width, int height)
71 if (width == 128 && height == 96)
73 else if (width == 176 && height == 144)
75 else if (width == 352 && height == 288)
77 else if (width == 704 && height == 576)
79 else if (width == 1408 && height == 1152)
86 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
90 align_put_bits(&s->pb);
92 /* Update the pointer to last GOB */
93 s->ptr_lastgob = pbBufPtr(&s->pb);
96 put_bits(&s->pb, 22, 0x20); /* PSC */
97 put_bits(&s->pb, 8, (((INT64)s->picture_number * 30 * FRAME_RATE_BASE) /
98 s->frame_rate) & 0xff);
100 put_bits(&s->pb, 1, 1); /* marker */
101 put_bits(&s->pb, 1, 0); /* h263 id */
102 put_bits(&s->pb, 1, 0); /* split screen off */
103 put_bits(&s->pb, 1, 0); /* camera off */
104 put_bits(&s->pb, 1, 0); /* freeze picture release off */
106 format = h263_get_picture_format(s->width, s->height);
109 put_bits(&s->pb, 3, format);
110 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
111 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
112 of H.263v1 UMV implies to check the predicted MV after
113 calculation of the current MB to see if we're on the limits */
114 put_bits(&s->pb, 1, 0); /* unrestricted motion vector: off */
115 put_bits(&s->pb, 1, 0); /* SAC: off */
116 put_bits(&s->pb, 1, 0); /* advanced prediction mode: off */
117 put_bits(&s->pb, 1, 0); /* not PB frame */
118 put_bits(&s->pb, 5, s->qscale);
119 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
122 /* H.263 Plus PTYPE */
123 put_bits(&s->pb, 3, 7);
124 put_bits(&s->pb,3,1); /* Update Full Extended PTYPE */
126 put_bits(&s->pb,3,6); /* Custom Source Format */
128 put_bits(&s->pb, 3, format);
130 put_bits(&s->pb,1,0); /* Custom PCF: off */
131 s->umvplus = (s->pict_type == P_TYPE) && s->unrestricted_mv;
132 put_bits(&s->pb, 1, s->umvplus); /* Unrestricted Motion Vector */
133 put_bits(&s->pb,1,0); /* SAC: off */
134 put_bits(&s->pb,1,0); /* Advanced Prediction Mode: off */
135 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
136 put_bits(&s->pb,1,0); /* Deblocking Filter: off */
137 put_bits(&s->pb,1,0); /* Slice Structured: off */
138 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
139 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
140 put_bits(&s->pb,1,0); /* Alternative Inter VLC: off */
141 put_bits(&s->pb,1,0); /* Modified Quantization: off */
142 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
143 put_bits(&s->pb,3,0); /* Reserved */
145 put_bits(&s->pb, 3, s->pict_type == P_TYPE);
147 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
148 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
149 if (s->pict_type == I_TYPE)
153 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
154 put_bits(&s->pb,2,0); /* Reserved */
155 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
157 /* This should be here if PLUSPTYPE */
158 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
161 /* Custom Picture Format (CPFMT) */
163 if (s->aspect_ratio_info)
164 put_bits(&s->pb,4,s->aspect_ratio_info);
166 put_bits(&s->pb,4,2); /* Aspect ratio: CIF 12:11 (4:3) picture */
167 put_bits(&s->pb,9,(s->width >> 2) - 1);
168 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
169 put_bits(&s->pb,9,(s->height >> 2));
172 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
174 put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
175 put_bits(&s->pb, 5, s->qscale);
178 put_bits(&s->pb, 1, 0); /* no PEI */
181 int h263_encode_gob_header(MpegEncContext * s, int mb_line)
185 /* Check to see if we need to put a new GBSC */
186 /* for RTP packetization */
188 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
189 if (pdif >= s->rtp_payload_size) {
190 /* Bad luck, packet must be cut before */
191 align_put_bits(&s->pb);
192 flush_put_bits(&s->pb);
193 /* Call the RTP callback to send the last GOB */
194 if (s->rtp_callback) {
195 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
196 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
198 s->ptr_lastgob = pbBufPtr(&s->pb);
199 put_bits(&s->pb, 17, 1); /* GBSC */
200 s->gob_number = mb_line / s->gob_index;
201 put_bits(&s->pb, 5, s->gob_number); /* GN */
202 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
203 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
204 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
206 } else if (pdif + s->mb_line_avgsize >= s->rtp_payload_size) {
207 /* Cut the packet before we can't */
208 align_put_bits(&s->pb);
209 flush_put_bits(&s->pb);
210 /* Call the RTP callback to send the last GOB */
211 if (s->rtp_callback) {
212 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
213 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
215 s->ptr_lastgob = pbBufPtr(&s->pb);
216 put_bits(&s->pb, 17, 1); /* GBSC */
217 s->gob_number = mb_line / s->gob_index;
218 put_bits(&s->pb, 5, s->gob_number); /* GN */
219 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
220 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
221 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
228 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6])
230 int score0=0, score1=0;
234 INT16 *ac_val, *ac_val1;
236 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
239 ac_val-= s->block_wrap[n]*16;
241 const int level= block[n][block_permute_op(i )];
243 score1+= ABS(level - ac_val[i+8]);
244 ac_val1[i ]= block[n][block_permute_op(i<<3)];
250 const int level= block[n][block_permute_op(i<<3)];
252 score1+= ABS(level - ac_val[i]);
254 ac_val1[i+8]= block[n][block_permute_op(i )];
259 return score0 > score1 ? 1 : 0;
262 void mpeg4_encode_mb(MpegEncContext * s,
263 DCTELEM block[6][64],
264 int motion_x, int motion_y)
266 int cbpc, cbpy, i, pred_x, pred_y;
268 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
269 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=B_TYPE ? &s->tex_pb : &s->pb;
270 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=I_TYPE ? &s->pb2 : &s->pb;
271 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
273 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
277 for (i = 0; i < 6; i++) {
278 if (s->block_last_index[i] >= 0)
282 if(s->pict_type==B_TYPE){
283 static const int mb_type_table[8]= {-1, 2, 3, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
284 int mb_type= mb_type_table[s->mv_dir];
290 s->last_mv[1][0][1]= 0;
293 /* nothing to do if this MB was skiped in the next P Frame */
294 if(s->mbskip_table[s->mb_y * s->mb_width + s->mb_x]){
300 s->mv_dir= MV_DIR_FORWARD; //doesnt matter
304 if ((cbp | motion_x | motion_y | mb_type) ==0) {
305 /* direct MB with MV={0,0} */
306 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
308 if(interleaved_stats){
315 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
316 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
317 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we dont need it :)
318 if(cbp) put_bits(&s->pb, 6, cbp);
321 put_bits(&s->pb, 1, 0); /* no q-scale change */
323 if(interleaved_stats){
324 bits= get_bit_count(&s->pb);
325 s->misc_bits+= bits - s->last_bits;
332 h263_encode_motion(s, motion_x, 1);
333 h263_encode_motion(s, motion_y, 1);
336 h263_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code);
337 h263_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
338 h263_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code);
339 h263_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
340 s->last_mv[0][0][0]= s->mv[0][0][0];
341 s->last_mv[0][0][1]= s->mv[0][0][1];
342 s->last_mv[1][0][0]= s->mv[1][0][0];
343 s->last_mv[1][0][1]= s->mv[1][0][1];
345 case 2: /* backward */
346 h263_encode_motion(s, motion_x - s->last_mv[1][0][0], s->b_code);
347 h263_encode_motion(s, motion_y - s->last_mv[1][0][1], s->b_code);
348 s->last_mv[1][0][0]= motion_x;
349 s->last_mv[1][0][1]= motion_y;
351 case 3: /* forward */
352 h263_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);
353 h263_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);
354 s->last_mv[0][0][0]= motion_x;
355 s->last_mv[0][0][1]= motion_y;
358 printf("unknown mb type\n");
362 if(interleaved_stats){
363 bits= get_bit_count(&s->pb);
364 s->mv_bits+= bits - s->last_bits;
368 /* encode each block */
369 for (i = 0; i < 6; i++) {
370 mpeg4_encode_block(s, block[i], i, 0, zigzag_direct, NULL, &s->pb);
373 if(interleaved_stats){
374 bits= get_bit_count(&s->pb);
375 s->p_tex_bits+= bits - s->last_bits;
378 }else{ /* s->pict_type==B_TYPE */
379 if ((cbp | motion_x | motion_y) == 0 && s->mv_type==MV_TYPE_16X16) {
380 /* check if the B frames can skip it too, as we must skip it if we skip here
381 why didnt they just compress the skip-mb bits instead of reusing them ?! */
382 if(s->max_b_frames>0){
389 if(x+16 > s->width) x= s->width-16;
390 if(y+16 > s->height) y= s->height-16;
392 offset= x + y*s->linesize;
393 p_pic= s->new_picture[0] + offset;
396 for(i=0; i<s->max_b_frames; i++){
400 if(s->coded_order[i+1].pict_type!=B_TYPE) break;
402 b_pic= s->coded_order[i+1].picture[0] + offset;
403 diff= pix_abs16x16(p_pic, b_pic, s->linesize);
404 if(diff>s->qscale*70){ //FIXME check that 70 is optimal
413 /* skip macroblock */
414 put_bits(&s->pb, 1, 1);
416 if(interleaved_stats){
425 put_bits(&s->pb, 1, 0); /* mb coded */
426 if(s->mv_type==MV_TYPE_16X16){
429 inter_MCBPC_bits[cbpc],
430 inter_MCBPC_code[cbpc]);
433 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
435 if(interleaved_stats){
436 bits= get_bit_count(&s->pb);
437 s->misc_bits+= bits - s->last_bits;
441 /* motion vectors: 16x16 mode */
442 h263_pred_motion(s, 0, &pred_x, &pred_y);
444 h263_encode_motion(s, motion_x - pred_x, s->f_code);
445 h263_encode_motion(s, motion_y - pred_y, s->f_code);
449 inter_MCBPC_bits[cbpc],
450 inter_MCBPC_code[cbpc]);
453 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
455 if(interleaved_stats){
456 bits= get_bit_count(&s->pb);
457 s->misc_bits+= bits - s->last_bits;
462 /* motion vectors: 8x8 mode*/
463 h263_pred_motion(s, i, &pred_x, &pred_y);
465 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][0] - pred_x, s->f_code);
466 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][1] - pred_y, s->f_code);
470 if(interleaved_stats){
471 bits= get_bit_count(&s->pb);
472 s->mv_bits+= bits - s->last_bits;
476 /* encode each block */
477 for (i = 0; i < 6; i++) {
478 mpeg4_encode_block(s, block[i], i, 0, zigzag_direct, NULL, tex_pb);
481 if(interleaved_stats){
482 bits= get_bit_count(&s->pb);
483 s->p_tex_bits+= bits - s->last_bits;
490 int dc_diff[6]; //dc values with the dc prediction subtracted
491 int dir[6]; //prediction direction
492 int zigzag_last_index[6];
493 UINT8 *scan_table[6];
496 const int level= block[i][0];
499 dc_diff[i]= level - mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]);
501 *dc_ptr = level * s->y_dc_scale;
503 *dc_ptr = level * s->c_dc_scale;
507 s->ac_pred= decide_ac_pred(s, block, dir);
514 mpeg4_inv_pred_ac(s, block[i], i, dir[i]);
515 if (dir[i]==0) st = ff_alternate_vertical_scan; /* left */
516 else st = ff_alternate_horizontal_scan; /* top */
518 for(last_index=63; last_index>=0; last_index--) //FIXME optimize
519 if(block[i][st[last_index]]) break;
520 zigzag_last_index[i]= s->block_last_index[i];
521 s->block_last_index[i]= last_index;
526 scan_table[i]= zigzag_direct;
531 for (i = 0; i < 6; i++) {
532 if (s->block_last_index[i] >= 1)
537 if (s->pict_type == I_TYPE) {
539 intra_MCBPC_bits[cbpc],
540 intra_MCBPC_code[cbpc]);
542 put_bits(&s->pb, 1, 0); /* mb coded */
544 inter_MCBPC_bits[cbpc + 4],
545 inter_MCBPC_code[cbpc + 4]);
547 put_bits(pb2, 1, s->ac_pred);
549 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
551 if(interleaved_stats){
552 bits= get_bit_count(&s->pb);
553 s->misc_bits+= bits - s->last_bits;
557 /* encode each block */
558 for (i = 0; i < 6; i++) {
559 mpeg4_encode_block(s, block[i], i, dc_diff[i], scan_table[i], dc_pb, tex_pb);
562 if(interleaved_stats){
563 bits= get_bit_count(&s->pb);
564 s->i_tex_bits+= bits - s->last_bits;
569 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
575 ac_val = s->ac_val[0][0] + s->block_index[i] * 16;
579 block[i][block_permute_op(j )]= ac_val[j+8];
582 block[i][block_permute_op(j<<3)]= ac_val[j ];
584 s->block_last_index[i]= zigzag_last_index[i];
590 void h263_encode_mb(MpegEncContext * s,
591 DCTELEM block[6][64],
592 int motion_x, int motion_y)
594 int cbpc, cbpy, i, cbp, pred_x, pred_y;
596 INT16 rec_intradc[6];
599 //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
603 for (i = 0; i < 6; i++) {
604 if (s->block_last_index[i] >= 0)
607 if ((cbp | motion_x | motion_y) == 0) {
608 /* skip macroblock */
609 put_bits(&s->pb, 1, 1);
612 put_bits(&s->pb, 1, 0); /* mb coded */
615 inter_MCBPC_bits[cbpc],
616 inter_MCBPC_code[cbpc]);
619 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
621 /* motion vectors: 16x16 mode only now */
622 h263_pred_motion(s, 0, &pred_x, &pred_y);
625 h263_encode_motion(s, motion_x - pred_x, s->f_code);
626 h263_encode_motion(s, motion_y - pred_y, s->f_code);
629 h263p_encode_umotion(s, motion_x - pred_x);
630 h263p_encode_umotion(s, motion_y - pred_y);
631 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
632 /* To prevent Start Code emulation */
633 put_bits(&s->pb,1,1);
636 int li = s->h263_aic ? 0 : 1;
641 if (s->h263_aic && s->mb_intra) {
642 INT16 level = block[i][0];
644 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
648 level = (level + (s->qscale >> 1))/(s->y_dc_scale);
650 level = (level - (s->qscale >> 1))/(s->y_dc_scale);
652 /* AIC can change CBP */
653 if (level == 0 && s->block_last_index[i] == 0)
654 s->block_last_index[i] = -1;
655 else if (level < -127)
657 else if (level > 127)
662 rec_intradc[i] = (s->y_dc_scale*level) + pred_dc;
665 //if ((rec_intradc[i] % 2) == 0)
668 if (rec_intradc[i] < 0)
670 else if (rec_intradc[i] > 2047)
671 rec_intradc[i] = 2047;
673 /* Update AC/DC tables */
674 *dc_ptr[i] = rec_intradc[i];
677 if (s->block_last_index[i] >= li)
682 if (s->pict_type == I_TYPE) {
684 intra_MCBPC_bits[cbpc],
685 intra_MCBPC_code[cbpc]);
687 put_bits(&s->pb, 1, 0); /* mb coded */
689 inter_MCBPC_bits[cbpc + 4],
690 inter_MCBPC_code[cbpc + 4]);
693 /* XXX: currently, we do not try to use ac prediction */
694 put_bits(&s->pb, 1, 0); /* no AC prediction */
697 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
701 /* encode each block */
702 h263_encode_block(s, block[i], i);
704 /* Update INTRADC for decoding */
705 if (s->h263_aic && s->mb_intra) {
706 block[i][0] = rec_intradc[i];
712 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr)
714 int x, y, wrap, a, c, pred_dc, scale;
715 INT16 *dc_val, *ac_val;
717 /* find prediction */
719 x = 2 * s->mb_x + 1 + (n & 1);
720 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
721 wrap = s->mb_width * 2 + 2;
722 dc_val = s->dc_val[0];
723 ac_val = s->ac_val[0][0];
724 scale = s->y_dc_scale;
728 wrap = s->mb_width + 2;
729 dc_val = s->dc_val[n - 4 + 1];
730 ac_val = s->ac_val[n - 4 + 1][0];
731 scale = s->c_dc_scale;
736 a = dc_val[(x - 1) + (y) * wrap];
737 c = dc_val[(x) + (y - 1) * wrap];
739 /* No prediction outside GOB boundary */
740 if (s->first_slice_line && ((n < 2) || (n > 3)))
743 /* just DC prediction */
744 if (a != 1024 && c != 1024)
745 pred_dc = (a + c) >> 1;
751 /* we assume pred is positive */
752 //pred_dc = (pred_dc + (scale >> 1)) / scale;
753 *dc_val_ptr = &dc_val[x + y * wrap];
758 void h263_pred_acdc(MpegEncContext * s, INT16 *block, int n)
760 int x, y, wrap, a, c, pred_dc, scale, i;
761 INT16 *dc_val, *ac_val, *ac_val1;
763 /* find prediction */
765 x = 2 * s->mb_x + 1 + (n & 1);
766 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
767 wrap = s->mb_width * 2 + 2;
768 dc_val = s->dc_val[0];
769 ac_val = s->ac_val[0][0];
770 scale = s->y_dc_scale;
774 wrap = s->mb_width + 2;
775 dc_val = s->dc_val[n - 4 + 1];
776 ac_val = s->ac_val[n - 4 + 1][0];
777 scale = s->c_dc_scale;
780 ac_val += ((y) * wrap + (x)) * 16;
786 a = dc_val[(x - 1) + (y) * wrap];
787 c = dc_val[(x) + (y - 1) * wrap];
789 /* No prediction outside GOB boundary */
790 if (s->first_slice_line && ((n < 2) || (n > 3)))
794 if (s->h263_aic_dir) {
795 /* left prediction */
799 block[block_permute_op(i*8)] += ac_val[i];
808 block[block_permute_op(i)] += ac_val[i + 8];
814 /* just DC prediction */
815 if (a != 1024 && c != 1024)
816 pred_dc = (a + c) >> 1;
823 /* we assume pred is positive */
824 block[0]=block[0]*scale + pred_dc;
828 else if (!(block[0] & 1))
831 /* Update AC/DC tables */
832 dc_val[(x) + (y) * wrap] = block[0];
836 ac_val1[i] = block[block_permute_op(i * 8)];
839 ac_val1[8 + i] = block[block_permute_op(i)];
842 INT16 *h263_pred_motion(MpegEncContext * s, int block,
846 INT16 *A, *B, *C, *mot_val;
847 static const int off[4]= {2, 1, 1, -1};
849 wrap = s->block_wrap[0];
850 xy = s->block_index[block];
852 mot_val = s->motion_val[xy];
854 A = s->motion_val[xy - 1];
855 /* special case for first (slice) line */
856 if ((s->mb_y == 0 || s->first_slice_line) && block<3) {
857 // we cant just change some MVs to simulate that as we need them for the B frames (and ME)
858 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
859 if(block==0){ //most common case
860 if(s->mb_x == s->resync_mb_x){ //rare
862 }else if(s->mb_x + 1 == s->resync_mb_x){ //rare
863 C = s->motion_val[xy + off[block] - wrap];
868 *px = mid_pred(A[0], 0, C[0]);
869 *py = mid_pred(A[1], 0, C[1]);
876 if(s->mb_x + 1 == s->resync_mb_x){ //rare
877 C = s->motion_val[xy + off[block] - wrap];
878 *px = mid_pred(A[0], 0, C[0]);
879 *py = mid_pred(A[1], 0, C[1]);
885 B = s->motion_val[xy - wrap];
886 C = s->motion_val[xy + off[block] - wrap];
887 if(s->mb_x == s->resync_mb_x) //rare
890 *px = mid_pred(A[0], B[0], C[0]);
891 *py = mid_pred(A[1], B[1], C[1]);
894 B = s->motion_val[xy - wrap];
895 C = s->motion_val[xy + off[block] - wrap];
896 *px = mid_pred(A[0], B[0], C[0]);
897 *py = mid_pred(A[1], B[1], C[1]);
902 static void h263_encode_motion(MpegEncContext * s, int val, int f_code)
904 int range, l, m, bit_size, sign, code, bits;
909 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
911 bit_size = f_code - 1;
912 range = 1 << bit_size;
913 /* modulo encoding */
918 } else if (val >= l) {
929 code = (val >> bit_size) + 1;
930 bits = val & (range - 1);
932 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
934 put_bits(&s->pb, bit_size, bits);
939 /* Encode MV differences on H.263+ with Unrestricted MV mode */
940 static void h263p_encode_umotion(MpegEncContext * s, int val)
950 put_bits(&s->pb, 1, 1);
952 put_bits(&s->pb, 3, 0);
954 put_bits(&s->pb, 3, 2);
957 sval = ((val < 0) ? (short)(-val):(short)val);
960 while (temp_val != 0) {
961 temp_val = temp_val >> 1;
967 tcode = (sval & (1 << (i-1))) >> (i-1);
968 tcode = (tcode << 1) | 1;
969 code = (code << 2) | tcode;
972 code = ((code << 1) | (val < 0)) << 1;
973 put_bits(&s->pb, (2*n_bits)+1, code);
974 //printf("\nVal = %d\tCode = %d", sval, code);
978 static void init_mv_penalty_and_fcode(MpegEncContext *s)
982 for(f_code=1; f_code<=MAX_FCODE; f_code++){
983 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
986 if(mv==0) len= mvtab[0][1];
988 int val, bit_size, range, code;
990 bit_size = s->f_code - 1;
991 range = 1 << bit_size;
997 code = (val >> bit_size) + 1;
999 len= mvtab[code][1] + 1 + bit_size;
1001 len= mvtab[32][1] + 2 + bit_size;
1005 mv_penalty[f_code][mv+MAX_MV]= len;
1009 for(f_code=MAX_FCODE; f_code>0; f_code--){
1010 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
1011 fcode_tab[mv+MAX_MV]= f_code;
1015 for(mv=0; mv<MAX_MV*2+1; mv++){
1016 umv_fcode_tab[mv]= 1;
1020 static void init_uni_dc_tab(void)
1022 int level, uni_code, uni_len;
1024 for(level=-256; level<256; level++){
1026 /* find number of bits */
1035 l= (-level) ^ ((1 << size) - 1);
1040 uni_code= DCtab_lum[size][0];
1041 uni_len = DCtab_lum[size][1];
1044 uni_code<<=size; uni_code|=l;
1047 uni_code<<=1; uni_code|=1;
1051 uni_DCtab_lum[level+256][0]= uni_code;
1052 uni_DCtab_lum[level+256][1]= uni_len;
1055 uni_code= DCtab_chrom[size][0];
1056 uni_len = DCtab_chrom[size][1];
1059 uni_code<<=size; uni_code|=l;
1062 uni_code<<=1; uni_code|=1;
1066 uni_DCtab_chrom[level+256][0]= uni_code;
1067 uni_DCtab_chrom[level+256][1]= uni_len;
1072 void h263_encode_init(MpegEncContext *s)
1074 static int done = 0;
1083 init_rl(&rl_intra_aic);
1085 init_mv_penalty_and_fcode(s);
1087 s->mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
1089 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
1090 switch(s->codec_id){
1091 case CODEC_ID_MPEG4:
1092 s->fcode_tab= fcode_tab;
1093 s->min_qcoeff= -2048;
1094 s->max_qcoeff= 2047;
1096 case CODEC_ID_H263P:
1097 s->fcode_tab= umv_fcode_tab;
1098 s->min_qcoeff= -128;
1101 default: //nothing needed default table allready set in mpegvideo.c
1102 s->min_qcoeff= -128;
1106 /* h263 type bias */
1107 //FIXME mpeg4 mpeg quantizer
1108 s->intra_quant_bias=0;
1109 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
1112 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
1114 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
1118 if (s->mb_intra && !s->h263_aic) {
1121 /* 255 cannot be represented, so we clamp */
1126 /* 0 cannot be represented also */
1132 put_bits(&s->pb, 8, 0xff);
1134 put_bits(&s->pb, 8, level & 0xff);
1138 if (s->h263_aic && s->mb_intra)
1143 last_index = s->block_last_index[n];
1144 last_non_zero = i - 1;
1145 for (; i <= last_index; i++) {
1146 j = zigzag_direct[i];
1149 run = i - last_non_zero - 1;
1150 last = (i == last_index);
1157 code = get_rl_index(rl, last, run, level);
1158 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1159 if (code == rl->n) {
1160 put_bits(&s->pb, 1, last);
1161 put_bits(&s->pb, 6, run);
1162 put_bits(&s->pb, 8, slevel & 0xff);
1164 put_bits(&s->pb, 1, sign);
1171 /***************************************************/
1173 void ff_mpeg4_stuffing(PutBitContext * pbc)
1176 put_bits(pbc, 1, 0);
1177 length= (-get_bit_count(pbc))&7;
1178 if(length) put_bits(pbc, length, (1<<length)-1);
1181 /* must be called before writing the header */
1182 void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){
1183 int time_div, time_mod;
1185 if(s->pict_type==I_TYPE){ //we will encode a vol header
1186 s->time_increment_resolution= s->frame_rate/ff_gcd(s->frame_rate, FRAME_RATE_BASE);
1187 if(s->time_increment_resolution>=256*256) s->time_increment_resolution= 256*128;
1189 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
1192 s->time= picture_number*(INT64)FRAME_RATE_BASE*s->time_increment_resolution/s->frame_rate;
1193 time_div= s->time/s->time_increment_resolution;
1194 time_mod= s->time%s->time_increment_resolution;
1196 if(s->pict_type==B_TYPE){
1197 s->bp_time= s->last_non_b_time - s->time;
1199 s->last_time_base= s->time_base;
1200 s->time_base= time_div;
1201 s->pp_time= s->time - s->last_non_b_time;
1202 s->last_non_b_time= s->time;
1206 static void mpeg4_encode_vol_header(MpegEncContext * s)
1208 int vo_ver_id=1; //must be 2 if we want GMC or q-pel
1211 s->vo_type= s->has_b_frames ? CORE_VO_TYPE : SIMPLE_VO_TYPE;
1213 put_bits(&s->pb, 16, 0);
1214 put_bits(&s->pb, 16, 0x100); /* video obj */
1215 put_bits(&s->pb, 16, 0);
1216 put_bits(&s->pb, 16, 0x120); /* video obj layer */
1218 put_bits(&s->pb, 1, 0); /* random access vol */
1219 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
1220 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
1221 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
1222 put_bits(&s->pb, 3, 1); /* is obj layer priority */
1223 if(s->aspect_ratio_info)
1224 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
1226 put_bits(&s->pb, 4, 1); /* aspect ratio info= sqare pixel */
1229 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
1230 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
1231 put_bits(&s->pb, 1, s->low_delay);
1232 put_bits(&s->pb, 1, 0); /* vbv parameters= no */
1234 put_bits(&s->pb, 1, 0); /* vol control parameters= no */
1237 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
1238 put_bits(&s->pb, 1, 1); /* marker bit */
1240 put_bits(&s->pb, 16, s->time_increment_resolution);
1241 if (s->time_increment_bits < 1)
1242 s->time_increment_bits = 1;
1243 put_bits(&s->pb, 1, 1); /* marker bit */
1244 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
1245 put_bits(&s->pb, 1, 1); /* marker bit */
1246 put_bits(&s->pb, 13, s->width); /* vol width */
1247 put_bits(&s->pb, 1, 1); /* marker bit */
1248 put_bits(&s->pb, 13, s->height); /* vol height */
1249 put_bits(&s->pb, 1, 1); /* marker bit */
1250 put_bits(&s->pb, 1, 0); /* interlace */
1251 put_bits(&s->pb, 1, 1); /* obmc disable */
1252 if (vo_ver_id == 1) {
1253 put_bits(&s->pb, 1, s->vol_sprite_usage=0); /* sprite enable */
1254 }else{ /* vo_ver_id == 2 */
1255 put_bits(&s->pb, 2, s->vol_sprite_usage=0); /* sprite enable */
1257 put_bits(&s->pb, 1, 0); /* not 8 bit */
1258 put_bits(&s->pb, 1, 0); /* quant type= h263 style*/
1260 put_bits(&s->pb, 1, s->quarter_sample=0);
1261 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
1262 s->resync_marker= s->rtp_mode;
1263 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
1264 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
1265 if(s->data_partitioning){
1266 put_bits(&s->pb, 1, 0); /* no rvlc */
1269 if (vo_ver_id != 1){
1270 put_bits(&s->pb, 1, 0); /* newpred */
1271 put_bits(&s->pb, 1, 0); /* reduced res vop */
1273 put_bits(&s->pb, 1, 0); /* scalability */
1275 ff_mpeg4_stuffing(&s->pb);
1276 put_bits(&s->pb, 16, 0);
1277 put_bits(&s->pb, 16, 0x1B2); /* user_data */
1278 sprintf(buf, "FFmpeg%sb%s", FFMPEG_VERSION, LIBAVCODEC_BUILD_STR);
1279 put_string(&s->pb, buf);
1281 ff_mpeg4_stuffing(&s->pb);
1284 /* write mpeg4 VOP header */
1285 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
1288 int time_div, time_mod;
1290 if(s->pict_type==I_TYPE){
1292 if(picture_number==0 || !s->strict_std_compliance)
1293 mpeg4_encode_vol_header(s);
1296 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->frame_rate, FRAME_RATE_BASE);
1298 put_bits(&s->pb, 16, 0); /* vop header */
1299 put_bits(&s->pb, 16, 0x1B6); /* vop header */
1300 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
1302 time_div= s->time/s->time_increment_resolution;
1303 time_mod= s->time%s->time_increment_resolution;
1304 time_incr= time_div - s->last_time_base;
1306 put_bits(&s->pb, 1, 1);
1308 put_bits(&s->pb, 1, 0);
1310 put_bits(&s->pb, 1, 1); /* marker */
1311 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
1312 put_bits(&s->pb, 1, 1); /* marker */
1313 put_bits(&s->pb, 1, 1); /* vop coded */
1314 if ( s->pict_type == P_TYPE
1315 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
1316 s->no_rounding ^= 1;
1317 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
1319 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
1320 //FIXME sprite stuff
1322 put_bits(&s->pb, 5, s->qscale);
1324 if (s->pict_type != I_TYPE)
1325 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
1326 if (s->pict_type == B_TYPE)
1327 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
1328 // printf("****frame %d\n", picture_number);
1331 void h263_dc_scale(MpegEncContext * s)
1334 const static UINT8 y_tab[32]={
1335 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
1336 0, 8, 8, 8, 8,10,12,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,34,36,38,40,42,44,46
1338 const static UINT8 c_tab[32]={
1339 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
1340 0, 8, 8, 8, 8, 9, 9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,20,21,22,23,24,25
1342 s->y_dc_scale = y_tab[s->qscale];
1343 s->c_dc_scale = c_tab[s->qscale];
1350 else if (quant > 4 && quant < 9)
1351 s->y_dc_scale = (2 * quant);
1352 else if (quant > 8 && quant < 25)
1353 s->y_dc_scale = (quant + 8);
1355 s->y_dc_scale = (2 * quant - 16);
1359 else if (quant > 4 && quant < 25)
1360 s->c_dc_scale = ((quant + 13) / 2);
1362 s->c_dc_scale = (quant - 6);
1366 static inline int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr)
1368 int a, b, c, wrap, pred, scale;
1372 /* find prediction */
1374 scale = s->y_dc_scale;
1376 scale = s->c_dc_scale;
1378 wrap= s->block_wrap[n];
1379 dc_val = s->dc_val[0] + s->block_index[n];
1385 b = dc_val[ - 1 - wrap];
1386 c = dc_val[ - wrap];
1388 if (abs(a - b) < abs(b - c)) {
1390 *dir_ptr = 1; /* top */
1393 *dir_ptr = 0; /* left */
1395 /* we assume pred is positive */
1398 "xorl %%edx, %%edx \n\t"
1400 : "=d" (pred), "=a"(dummy)
1401 : "a" (pred + (scale >> 1)), "c" (inverse[scale])
1404 pred = (pred + (scale >> 1)) / scale;
1407 /* prepare address for prediction update */
1408 *dc_val_ptr = &dc_val[0];
1413 void mpeg4_pred_ac(MpegEncContext * s, INT16 *block, int n,
1417 INT16 *ac_val, *ac_val1;
1419 /* find prediction */
1420 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1424 /* left prediction */
1427 block[block_permute_op(i*8)] += ac_val[i];
1430 /* top prediction */
1431 ac_val -= 16 * s->block_wrap[n];
1433 block[block_permute_op(i)] += ac_val[i + 8];
1439 ac_val1[i] = block[block_permute_op(i * 8)];
1442 ac_val1[8 + i] = block[block_permute_op(i)];
1445 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
1451 /* find prediction */
1452 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1455 /* left prediction */
1458 block[block_permute_op(i*8)] -= ac_val[i];
1461 /* top prediction */
1462 ac_val -= 16 * s->block_wrap[n];
1464 block[block_permute_op(i)] -= ac_val[i + 8];
1469 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
1472 // if(level<-255 || level>255) printf("dc overflow\n");
1476 put_bits(s, uni_DCtab_lum[level][1], uni_DCtab_lum[level][0]);
1479 put_bits(s, uni_DCtab_chrom[level][1], uni_DCtab_chrom[level][0]);
1483 /* find number of bits */
1493 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
1496 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
1499 /* encode remaining bits */
1502 level = (-level) ^ ((1 << size) - 1);
1503 put_bits(&s->pb, size, level);
1505 put_bits(&s->pb, 1, 1);
1510 static void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
1511 UINT8 *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
1513 int level, run, last, i, j, last_index, last_non_zero, sign, slevel;
1518 /* mpeg4 based DC predictor */
1519 mpeg4_encode_dc(dc_pb, intra_dc, n);
1528 last_index = s->block_last_index[n];
1529 last_non_zero = i - 1;
1530 for (; i <= last_index; i++) {
1534 run = i - last_non_zero - 1;
1535 last = (i == last_index);
1542 code = get_rl_index(rl, last, run, level);
1543 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1544 if (code == rl->n) {
1546 level1 = level - rl->max_level[last][run];
1549 code = get_rl_index(rl, last, run, level1);
1550 if (code == rl->n) {
1552 put_bits(ac_pb, 1, 1);
1553 if (level > MAX_LEVEL)
1555 run1 = run - rl->max_run[last][level] - 1;
1558 code = get_rl_index(rl, last, run1, level);
1559 if (code == rl->n) {
1562 put_bits(ac_pb, 1, 1);
1563 put_bits(ac_pb, 1, last);
1564 put_bits(ac_pb, 6, run);
1565 put_bits(ac_pb, 1, 1);
1566 put_bits(ac_pb, 12, slevel & 0xfff);
1567 put_bits(ac_pb, 1, 1);
1570 put_bits(ac_pb, 1, 0);
1571 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1572 put_bits(ac_pb, 1, sign);
1576 put_bits(ac_pb, 1, 0);
1577 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1578 put_bits(ac_pb, 1, sign);
1581 put_bits(ac_pb, 1, sign);
1590 /***********************************************/
1593 static VLC intra_MCBPC_vlc;
1594 static VLC inter_MCBPC_vlc;
1595 static VLC cbpy_vlc;
1597 static VLC dc_lum, dc_chrom;
1598 static VLC sprite_trajectory;
1599 static VLC mb_type_b_vlc;
1601 void init_rl(RLTable *rl)
1603 INT8 max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
1604 UINT8 index_run[MAX_RUN+1];
1605 int last, run, level, start, end, i;
1607 /* compute max_level[], max_run[] and index_run[] */
1608 for(last=0;last<2;last++) {
1617 memset(max_level, 0, MAX_RUN + 1);
1618 memset(max_run, 0, MAX_LEVEL + 1);
1619 memset(index_run, rl->n, MAX_RUN + 1);
1620 for(i=start;i<end;i++) {
1621 run = rl->table_run[i];
1622 level = rl->table_level[i];
1623 if (index_run[run] == rl->n)
1625 if (level > max_level[run])
1626 max_level[run] = level;
1627 if (run > max_run[level])
1628 max_run[level] = run;
1630 rl->max_level[last] = av_malloc(MAX_RUN + 1);
1631 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1632 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1633 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1634 rl->index_run[last] = av_malloc(MAX_RUN + 1);
1635 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1639 void init_vlc_rl(RLTable *rl)
1641 init_vlc(&rl->vlc, 9, rl->n + 1,
1642 &rl->table_vlc[0][1], 4, 2,
1643 &rl->table_vlc[0][0], 4, 2);
1648 /* XXX: find a better solution to handle static init */
1649 void h263_decode_init_vlc(MpegEncContext *s)
1651 static int done = 0;
1656 init_vlc(&intra_MCBPC_vlc, 6, 8,
1657 intra_MCBPC_bits, 1, 1,
1658 intra_MCBPC_code, 1, 1);
1659 init_vlc(&inter_MCBPC_vlc, 9, 25,
1660 inter_MCBPC_bits, 1, 1,
1661 inter_MCBPC_code, 1, 1);
1662 init_vlc(&cbpy_vlc, 6, 16,
1663 &cbpy_tab[0][1], 2, 1,
1664 &cbpy_tab[0][0], 2, 1);
1665 init_vlc(&mv_vlc, 9, 33,
1667 &mvtab[0][0], 2, 1);
1670 init_rl(&rl_intra_aic);
1671 init_vlc_rl(&rl_inter);
1672 init_vlc_rl(&rl_intra);
1673 init_vlc_rl(&rl_intra_aic);
1674 init_vlc(&dc_lum, 9, 13,
1675 &DCtab_lum[0][1], 2, 1,
1676 &DCtab_lum[0][0], 2, 1);
1677 init_vlc(&dc_chrom, 9, 13,
1678 &DCtab_chrom[0][1], 2, 1,
1679 &DCtab_chrom[0][0], 2, 1);
1680 init_vlc(&sprite_trajectory, 9, 15,
1681 &sprite_trajectory_tab[0][1], 4, 2,
1682 &sprite_trajectory_tab[0][0], 4, 2);
1683 init_vlc(&mb_type_b_vlc, 4, 4,
1684 &mb_type_b_tab[0][1], 2, 1,
1685 &mb_type_b_tab[0][0], 2, 1);
1689 int h263_decode_gob_header(MpegEncContext *s)
1691 unsigned int val, gfid;
1693 /* Check for GOB Start Code */
1694 val = show_bits(&s->gb, 16);
1696 /* We have a GBSC probably with GSTUFF */
1697 skip_bits(&s->gb, 16); /* Drop the zeros */
1698 while (get_bits1(&s->gb) == 0); /* Seek the '1' bit */
1700 fprintf(stderr,"\nGOB Start Code at MB %d\n", (s->mb_y * s->mb_width) + s->mb_x);
1702 s->gob_number = get_bits(&s->gb, 5); /* GN */
1703 gfid = get_bits(&s->gb, 2); /* GFID */
1704 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
1706 fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", s->gob_number, gfid, s->qscale);
1714 static inline void memsetw(short *tab, int val, int n)
1721 void ff_mpeg4_init_partitions(MpegEncContext *s)
1723 init_put_bits(&s->tex_pb, s->tex_pb_buffer, PB_BUFFER_SIZE, NULL, NULL);
1724 init_put_bits(&s->pb2 , s->pb2_buffer , PB_BUFFER_SIZE, NULL, NULL);
1727 void ff_mpeg4_merge_partitions(MpegEncContext *s)
1729 const int pb2_len = get_bit_count(&s->pb2 );
1730 const int tex_pb_len= get_bit_count(&s->tex_pb);
1731 const int bits= get_bit_count(&s->pb);
1733 if(s->pict_type==I_TYPE){
1734 put_bits(&s->pb, 19, DC_MARKER);
1735 s->misc_bits+=19 + pb2_len + bits - s->last_bits;
1736 s->i_tex_bits+= tex_pb_len;
1738 put_bits(&s->pb, 17, MOTION_MARKER);
1739 s->misc_bits+=17 + pb2_len;;
1740 s->mv_bits+= bits - s->last_bits;
1741 s->p_tex_bits+= tex_pb_len;
1744 flush_put_bits(&s->pb2);
1745 flush_put_bits(&s->tex_pb);
1747 ff_copy_bits(&s->pb, s->pb2_buffer , pb2_len);
1748 ff_copy_bits(&s->pb, s->tex_pb_buffer, tex_pb_len);
1749 s->last_bits= get_bit_count(&s->pb);
1752 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
1754 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
1756 ff_mpeg4_stuffing(&s->pb);
1757 if(s->pict_type==I_TYPE)
1758 put_bits(&s->pb, 16, 0);
1759 else if(s->pict_type==B_TYPE)
1760 put_bits(&s->pb, MAX(MAX(s->f_code, s->b_code)+15, 17), 0);
1762 put_bits(&s->pb, s->f_code+15, 0);
1763 put_bits(&s->pb, 1, 1);
1765 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
1766 put_bits(&s->pb, 5, s->qscale);
1767 put_bits(&s->pb, 1, 0); /* no HEC */
1771 * decodes the next video packet and sets s->next_qscale
1772 * returns mb_num of the next packet or <0 if something went wrong
1774 static int decode_video_packet_header(MpegEncContext *s, GetBitContext *gb)
1777 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
1778 int header_extension=0, mb_num;
1779 //printf("%X\n", show_bits(&gb, 24));
1780 //printf("parse_video_packet_header\n");
1781 // if(show_aligned_bits(gb, 1, 16) != 0) return -1;
1783 /* is there enough space left for a video packet + header */
1784 if( get_bits_count(gb) > gb->size*8-20) return -1;
1786 //printf("resync at %d %d\n", s->mb_x, s->mb_y);
1787 // skip_bits(gb, 1);
1788 // align_get_bits(gb);
1789 if(get_bits(gb, 16)!=0){
1790 printf("internal error while decoding video packet header\n");
1793 //printf("%X\n", show_bits(gb, 24));
1795 while(!get_bits1(gb) && bits<30) bits++;
1796 if((s->pict_type == P_TYPE || s->pict_type == S_TYPE) && bits != s->f_code-1){
1797 printf("marker does not match f_code (is: %d should be: %d pos: %d end %d x: %d y: %d)\n",
1798 bits+1, s->f_code, get_bits_count(gb), gb->size*8, s->mb_x, s->mb_y);
1800 }else if(s->pict_type == I_TYPE && bits != 0){
1801 printf("marker too long\n");
1803 }else if(s->pict_type == B_TYPE && bits != MAX(MAX(s->f_code, s->b_code)-1, 1)){
1804 printf("marker does not match f/b_code\n");
1807 //printf("%X\n", show_bits(gb, 24));
1809 if(s->shape != RECT_SHAPE){
1810 header_extension= get_bits1(gb);
1811 //FIXME more stuff here
1814 mb_num= get_bits(gb, mb_num_bits);
1815 if(mb_num < s->mb_x + s->mb_y*s->mb_width || mb_num>=s->mb_num){
1816 fprintf(stderr, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_x + s->mb_y*s->mb_width);
1820 if(s->shape != BIN_ONLY_SHAPE){
1821 s->next_resync_qscale= get_bits(gb, 5);
1822 if(s->next_resync_qscale==0)
1823 s->next_resync_qscale= s->qscale;
1824 if(s->next_resync_qscale==0){
1825 fprintf(stderr, "qscale==0\n");
1830 if(s->shape == RECT_SHAPE){
1831 header_extension= get_bits1(gb);
1833 if(header_extension){
1836 printf("header extension not supported\n");
1839 while (get_bits1(gb) != 0)
1842 check_marker(gb, "before time_increment in video packed header");
1843 time_increment= get_bits(gb, s->time_increment_bits);
1844 if(s->pict_type!=B_TYPE){
1845 s->last_time_base= s->time_base;
1846 s->time_base+= time_incr;
1847 s->time= s->time_base*s->time_increment_resolution + time_increment;
1848 s->pp_time= s->time - s->last_non_b_time;
1849 s->last_non_b_time= s->time;
1851 s->time= (s->last_time_base + time_incr)*s->time_increment_resolution + time_increment;
1852 s->bp_time= s->last_non_b_time - s->time;
1854 check_marker(gb, "before vop_coding_type in video packed header");
1856 skip_bits(gb, 2); /* vop coding type */
1857 //FIXME not rect stuff here
1859 if(s->shape != BIN_ONLY_SHAPE){
1860 skip_bits(gb, 3); /* intra dc vlc threshold */
1862 if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE && s->num_sprite_warping_points){
1863 mpeg4_decode_sprite_trajectory(s);
1866 //FIXME reduced res stuff here
1868 if (s->pict_type != I_TYPE) {
1869 s->f_code = get_bits(gb, 3); /* fcode_for */
1871 printf("Error, video packet header damaged or not MPEG4 header (f_code=0)\n");
1872 return -1; // makes no sense to continue, as the MV decoding will break very quickly
1875 if (s->pict_type == B_TYPE) {
1876 s->b_code = get_bits(gb, 3);
1880 //FIXME new-pred stuff
1882 //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));
1887 void ff_mpeg4_clean_buffers(MpegEncContext *s)
1889 int c_wrap, c_xy, l_wrap, l_xy;
1891 l_wrap= s->block_wrap[0];
1892 l_xy= s->mb_y*l_wrap*2 + s->mb_x*2;
1893 c_wrap= s->block_wrap[4];
1894 c_xy= s->mb_y*c_wrap + s->mb_x;
1897 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
1898 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
1899 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
1902 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(INT16));
1903 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(INT16));
1904 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(INT16));
1907 // we cant clear the MVs as they might be needed by a b frame
1908 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(INT16));
1909 // memset(s->motion_val, 0, 2*sizeof(INT16)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
1910 s->last_mv[0][0][0]=
1911 s->last_mv[0][0][1]=
1912 s->last_mv[1][0][0]=
1913 s->last_mv[1][0][1]= 0;
1916 /* searches for the next resync marker clears ac,dc,mc, and sets s->next_resync_gb, s->mb_num_left */
1917 int ff_mpeg4_resync(MpegEncContext *s)
1921 /* search & parse next resync marker */
1923 gb= s->next_resync_gb;
1924 align_get_bits(&gb);
1925 //printf("mpeg4_resync %d next:%d \n", get_bits_count(&gb), get_bits_count(&s->next_resync_gb));
1927 int v= show_bits(&gb, 24);
1928 if( get_bits_count(&gb) >= gb.size*8-24 || v == 1 /* start-code */){
1929 s->mb_num_left= s->mb_num - s->mb_x - s->mb_y*s->mb_width;
1930 //printf("mpeg4_resync end\n");
1931 s->gb= s->next_resync_gb; //continue at the next resync marker
1933 }else if(v>>8 == 0){
1935 s->next_resync_pos= get_bits_count(&gb);
1937 next= decode_video_packet_header(s, &gb);
1939 s->mb_num_left= next - s->mb_x - s->mb_y*s->mb_width;
1943 align_get_bits(&gb);
1947 s->next_resync_gb=gb;
1952 static inline void init_block_index(MpegEncContext *s)
1954 s->block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
1955 s->block_index[1]= s->block_wrap[0]*(s->mb_y*2 + 1) + s->mb_x*2;
1956 s->block_index[2]= s->block_wrap[0]*(s->mb_y*2 + 2) - 1 + s->mb_x*2;
1957 s->block_index[3]= s->block_wrap[0]*(s->mb_y*2 + 2) + s->mb_x*2;
1958 s->block_index[4]= s->block_wrap[4]*(s->mb_y + 1) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x;
1959 s->block_index[5]= s->block_wrap[4]*(s->mb_y + 1 + s->mb_height + 2) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x;
1962 static inline void update_block_index(MpegEncContext *s)
1964 s->block_index[0]+=2;
1965 s->block_index[1]+=2;
1966 s->block_index[2]+=2;
1967 s->block_index[3]+=2;
1968 s->block_index[4]++;
1969 s->block_index[5]++;
1973 * decodes the first & second partition
1974 * returns error type or 0 if no error
1976 int ff_mpeg4_decode_partitions(MpegEncContext *s)
1978 static const INT8 quant_tab[4] = { -1, -2, 1, 2 };
1981 /* decode first partition */
1983 s->first_slice_line=1;
1984 s->mb_x= s->resync_mb_x;
1985 for(s->mb_y= s->resync_mb_y; mb_num < s->mb_num_left; s->mb_y++){
1986 init_block_index(s);
1987 for(; mb_num < s->mb_num_left && s->mb_x<s->mb_width; s->mb_x++){
1988 const int xy= s->mb_x + s->mb_y*s->mb_width;
1993 update_block_index(s);
1994 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
1995 s->first_slice_line=0;
1997 if(s->mb_x==0) PRINT_MB_TYPE("\n");
1999 if(s->pict_type==I_TYPE){
2003 cbpc = get_vlc(&s->gb, &intra_MCBPC_vlc);
2005 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
2006 return DECODING_DESYNC;
2008 s->cbp_table[xy]= cbpc & 3;
2009 s->mb_type[xy]= MB_TYPE_INTRA;
2013 s->qscale += quant_tab[get_bits(&s->gb, 2)];
2016 else if (s->qscale > 31)
2020 s->qscale_table[xy]= s->qscale;
2022 s->mbintra_table[xy]= 1;
2025 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
2027 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
2028 return DECODING_DESYNC;
2031 if(dc_pred_dir) dir|=1;
2033 s->pred_dir_table[xy]= dir;
2034 }else{ /* P/S_TYPE */
2035 int mx, my, pred_x, pred_y;
2036 INT16 * const mot_val= s->motion_val[s->block_index[0]];
2037 const int stride= s->block_wrap[0]*2;
2039 if(get_bits1(&s->gb)){
2041 s->mb_type[xy]= MB_TYPE_SKIPED;
2042 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2043 const int a= s->sprite_warping_accuracy;
2045 if(s->divx_version==500 && s->divx_build==413){
2046 mx = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
2047 my = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2049 mx = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2050 my = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2051 s->mb_type[xy]= MB_TYPE_GMC | MB_TYPE_SKIPED;
2058 mot_val[0 ]= mot_val[2 ]=
2059 mot_val[0+stride]= mot_val[2+stride]= mx;
2060 mot_val[1 ]= mot_val[3 ]=
2061 mot_val[1+stride]= mot_val[3+stride]= my;
2063 if(s->mbintra_table[xy])
2064 ff_clean_intra_table_entries(s);
2068 cbpc = get_vlc(&s->gb, &inter_MCBPC_vlc);
2070 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
2071 return DECODING_DESYNC;
2075 else if (cbpc == 20)
2076 fprintf(stderr, "Stuffing !");
2077 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
2079 s->mb_intra = ((cbpc & 4) != 0);
2083 s->mbintra_table[xy]= 1;
2084 s->mb_type[xy]= MB_TYPE_INTRA;
2085 mot_val[0 ]= mot_val[2 ]=
2086 mot_val[0+stride]= mot_val[2+stride]= 0;
2087 mot_val[1 ]= mot_val[3 ]=
2088 mot_val[1+stride]= mot_val[3+stride]= 0;
2090 if(s->mbintra_table[xy])
2091 ff_clean_intra_table_entries(s);
2093 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
2094 s->mcsel= get_bits1(&s->gb);
2097 if ((cbpc & 16) == 0) {
2099 /* 16x16 motion prediction */
2100 s->mb_type[xy]= MB_TYPE_INTER;
2102 h263_pred_motion(s, 0, &pred_x, &pred_y);
2104 mx = h263_decode_motion(s, pred_x, s->f_code);
2106 const int a= s->sprite_warping_accuracy;
2107 if(s->divx_version==500 && s->divx_build==413){
2108 mx = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
2110 mx = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2114 return DECODING_DESYNC;
2117 my = h263_decode_motion(s, pred_y, s->f_code);
2119 const int a= s->sprite_warping_accuracy;
2120 if(s->divx_version==500 && s->divx_build==413){
2121 my = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2123 my = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2127 return DECODING_DESYNC;
2128 mot_val[0 ]= mot_val[2 ] =
2129 mot_val[0+stride]= mot_val[2+stride]= mx;
2130 mot_val[1 ]= mot_val[3 ]=
2131 mot_val[1+stride]= mot_val[3+stride]= my;
2135 s->mb_type[xy]= MB_TYPE_INTER4V;
2137 INT16 *mot_val= h263_pred_motion(s, i, &pred_x, &pred_y);
2138 mx = h263_decode_motion(s, pred_x, s->f_code);
2140 return DECODING_DESYNC;
2142 my = h263_decode_motion(s, pred_y, s->f_code);
2144 return DECODING_DESYNC;
2155 if (s->pict_type==I_TYPE && get_bits(&s->gb, 19)!=DC_MARKER ) s->decoding_error= DECODING_DESYNC;
2156 else if(s->pict_type!=I_TYPE && get_bits(&s->gb, 17)!=MOTION_MARKER) s->decoding_error= DECODING_DESYNC;
2157 if(s->decoding_error== DECODING_DESYNC){
2158 fprintf(stderr, "marker missing after first partition at %d %d\n", s->mb_x, s->mb_y);
2159 return DECODING_DESYNC;
2162 /* decode second partition */
2164 s->mb_x= s->resync_mb_x;
2165 for(s->mb_y= s->resync_mb_y; mb_num < s->mb_num_left; s->mb_y++){
2166 init_block_index(s);
2167 for(; mb_num < s->mb_num_left && s->mb_x<s->mb_width; s->mb_x++){
2168 const int xy= s->mb_x + s->mb_y*s->mb_width;
2171 update_block_index(s);
2173 if(s->pict_type==I_TYPE){
2174 int ac_pred= get_bits1(&s->gb);
2175 int cbpy = get_vlc(&s->gb, &cbpy_vlc);
2177 fprintf(stderr, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2178 return DECODING_AC_LOST;
2181 s->cbp_table[xy]|= cbpy<<2;
2182 s->pred_dir_table[xy]|= ac_pred<<7;
2183 }else{ /* P || S_TYPE */
2184 if(s->mb_type[xy]&MB_TYPE_INTRA){
2186 int ac_pred = get_bits1(&s->gb);
2187 int cbpy = get_vlc(&s->gb, &cbpy_vlc);
2190 fprintf(stderr, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2191 return DECODING_ACDC_LOST;
2194 if(s->cbp_table[xy] & 8) {
2195 s->qscale += quant_tab[get_bits(&s->gb, 2)];
2198 else if (s->qscale > 31)
2202 s->qscale_table[xy]= s->qscale;
2206 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
2208 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
2209 return DECODING_ACDC_LOST;
2212 if(dc_pred_dir) dir|=1;
2214 s->cbp_table[xy]&= 3; //remove dquant
2215 s->cbp_table[xy]|= cbpy<<2;
2216 s->pred_dir_table[xy]= dir | (ac_pred<<7);
2217 }else if(s->mb_type[xy]&MB_TYPE_SKIPED){
2218 s->qscale_table[xy]= s->qscale;
2219 s->cbp_table[xy]= 0;
2221 int cbpy = get_vlc(&s->gb, &cbpy_vlc);
2224 fprintf(stderr, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2225 return DECODING_ACDC_LOST;
2228 if(s->cbp_table[xy] & 8) {
2229 //fprintf(stderr, "dquant\n");
2230 s->qscale += quant_tab[get_bits(&s->gb, 2)];
2233 else if (s->qscale > 31)
2237 s->qscale_table[xy]= s->qscale;
2239 s->cbp_table[xy]&= 3; //remove dquant
2240 s->cbp_table[xy]|= (cbpy^0xf)<<2;
2251 static int mpeg4_decode_partitioned_mb(MpegEncContext *s,
2252 DCTELEM block[6][64])
2255 const int xy= s->mb_x + s->mb_y*s->mb_width;
2257 if(s->mb_x==s->resync_mb_x && s->mb_y==s->resync_mb_y){ //Note resync_mb_{x,y}==0 at the start
2259 int block_index_backup[6];
2260 int qscale= s->qscale;
2262 for(i=0; i<6; i++) block_index_backup[i]= s->block_index[i];
2264 s->decoding_error= ff_mpeg4_decode_partitions(s);
2266 for(i=0; i<6; i++) s->block_index[i]= block_index_backup[i];
2267 s->first_slice_line=1;
2268 s->mb_x= s->resync_mb_x;
2269 s->mb_y= s->resync_mb_y;
2273 if(s->decoding_error==DECODING_DESYNC) return -1;
2276 mb_type= s->mb_type[xy];
2277 if(s->decoding_error)
2280 cbp = s->cbp_table[xy];
2282 if(s->decoding_error!=DECODING_ACDC_LOST && s->qscale_table[xy] != s->qscale){
2283 s->qscale= s->qscale_table[xy];
2287 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
2290 s->mv[0][i][0] = s->motion_val[ s->block_index[i] ][0];
2291 s->mv[0][i][1] = s->motion_val[ s->block_index[i] ][1];
2293 s->mb_intra = mb_type&MB_TYPE_INTRA;
2295 if (mb_type&MB_TYPE_SKIPED) {
2298 s->block_last_index[i] = -1;
2299 s->mv_dir = MV_DIR_FORWARD;
2300 s->mv_type = MV_TYPE_16X16;
2301 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2309 }else if(s->mb_intra && s->decoding_error!=DECODING_ACDC_LOST){
2310 s->ac_pred = s->pred_dir_table[xy]>>7;
2312 /* decode each block */
2313 for (i = 0; i < 6; i++) {
2314 int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1);
2315 if(ret==DECODING_AC_LOST){
2316 fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y);
2317 s->decoding_error=DECODING_AC_LOST;
2319 }else if(ret==DECODING_ACDC_LOST){
2320 fprintf(stderr, "dc corrupted at %d %d (trying to continue with mc only)\n", s->mb_x, s->mb_y);
2321 s->decoding_error=DECODING_ACDC_LOST;
2325 }else if(!s->mb_intra){
2326 // s->mcsel= 0; //FIXME do we need to init that
2328 s->mv_dir = MV_DIR_FORWARD;
2329 if (mb_type&MB_TYPE_INTER4V) {
2330 s->mv_type = MV_TYPE_8X8;
2332 s->mv_type = MV_TYPE_16X16;
2334 if(s->decoding_error==0 && cbp){
2335 /* decode each block */
2336 for (i = 0; i < 6; i++) {
2337 int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1);
2338 if(ret==DECODING_AC_LOST){
2339 fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y);
2340 s->decoding_error=DECODING_AC_LOST;
2346 } else { /* I-Frame */
2349 s->ac_pred = s->pred_dir_table[xy]>>7;
2351 /* decode each block */
2352 for (i = 0; i < 6; i++) {
2353 int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1);
2354 if(ret==DECODING_AC_LOST){
2355 fprintf(stderr, "texture corrupted at %d %d (trying to continue with dc only)\n", s->mb_x, s->mb_y);
2356 s->decoding_error=DECODING_AC_LOST;
2358 }else if(ret==DECODING_ACDC_LOST){
2359 fprintf(stderr, "dc corrupted at %d %d\n", s->mb_x, s->mb_y);
2369 int h263_decode_mb(MpegEncContext *s,
2370 DCTELEM block[6][64])
2372 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
2374 static INT8 quant_tab[4] = { -1, -2, 1, 2 };
2376 if(s->mb_x==0) PRINT_MB_TYPE("\n")
2378 if(s->resync_marker){
2379 if(s->resync_mb_x == s->mb_x && s->resync_mb_y+1 == s->mb_y){
2380 s->first_slice_line=0;
2384 if(s->data_partitioning && s->pict_type!=B_TYPE)
2385 return mpeg4_decode_partitioned_mb(s, block);
2387 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
2388 if (get_bits1(&s->gb)) {
2392 s->block_last_index[i] = -1;
2393 s->mv_dir = MV_DIR_FORWARD;
2394 s->mv_type = MV_TYPE_16X16;
2395 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2396 const int a= s->sprite_warping_accuracy;
2397 // int l = (1 << (s->f_code - 1)) * 32;
2400 if(s->divx_version==500 && s->divx_build==413){
2401 s->mv[0][0][0] = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
2402 s->mv[0][0][1] = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2404 s->mv[0][0][0] = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2405 s->mv[0][0][1] = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2407 /* if (s->mv[0][0][0] < -l) s->mv[0][0][0]= -l;
2408 else if (s->mv[0][0][0] >= l) s->mv[0][0][0]= l-1;
2409 if (s->mv[0][0][1] < -l) s->mv[0][0][1]= -l;
2410 else if (s->mv[0][0][1] >= l) s->mv[0][0][1]= l-1;*/
2422 cbpc = get_vlc(&s->gb, &inter_MCBPC_vlc);
2423 //fprintf(stderr, "\tCBPC: %d", cbpc);
2428 else if (cbpc == 20)
2429 fprintf(stderr, "Stuffing !");
2432 s->mb_intra = ((cbpc & 4) != 0);
2433 if (s->mb_intra) goto intra;
2435 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
2436 s->mcsel= get_bits1(&s->gb);
2438 cbpy = get_vlc(&s->gb, &cbpy_vlc);
2439 cbp = (cbpc & 3) | ((cbpy ^ 0xf) << 2);
2441 s->qscale += quant_tab[get_bits(&s->gb, 2)];
2444 else if (s->qscale > 31)
2448 s->mv_dir = MV_DIR_FORWARD;
2449 if ((cbpc & 16) == 0) {
2451 /* 16x16 motion prediction */
2452 s->mv_type = MV_TYPE_16X16;
2453 h263_pred_motion(s, 0, &pred_x, &pred_y);
2455 mx = h263p_decode_umotion(s, pred_x);
2457 mx = h263_decode_motion(s, pred_x, s->f_code);
2459 const int a= s->sprite_warping_accuracy;
2460 // int l = (1 << (s->f_code - 1)) * 32;
2461 if(s->divx_version==500 && s->divx_build==413){
2462 mx = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
2464 mx = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2466 // if (mx < -l) mx= -l, printf("C");
2467 // else if (mx >= l) mx= l-1, printf("C");
2473 my = h263p_decode_umotion(s, pred_y);
2475 my = h263_decode_motion(s, pred_y, s->f_code);
2477 const int a= s->sprite_warping_accuracy;
2478 // int l = (1 << (s->f_code - 1)) * 32;
2479 if(s->divx_version==500 && s->divx_build==413){
2480 my = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2482 my = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2484 // if (my < -l) my= -l, printf("C");
2485 // else if (my >= l) my= l-1, printf("C");
2489 s->mv[0][0][0] = mx;
2490 s->mv[0][0][1] = my;
2491 /*fprintf(stderr, "\n MB %d", (s->mb_y * s->mb_width) + s->mb_x);
2492 fprintf(stderr, "\n\tmvx: %d\t\tpredx: %d", mx, pred_x);
2493 fprintf(stderr, "\n\tmvy: %d\t\tpredy: %d", my, pred_y);*/
2494 if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
2495 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
2499 s->mv_type = MV_TYPE_8X8;
2501 mot_val = h263_pred_motion(s, i, &pred_x, &pred_y);
2503 mx = h263p_decode_umotion(s, pred_x);
2505 mx = h263_decode_motion(s, pred_x, s->f_code);
2510 my = h263p_decode_umotion(s, pred_y);
2512 my = h263_decode_motion(s, pred_y, s->f_code);
2515 s->mv[0][i][0] = mx;
2516 s->mv[0][i][1] = my;
2517 if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
2518 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
2523 } else if(s->pict_type==B_TYPE) {
2524 int modb1; // first bit of modb
2525 int modb2; // second bit of modb
2531 s->mb_intra = 0; //B-frames never contain intra blocks
2532 s->mcsel=0; // ... true gmc blocks
2535 s->last_mv[0][0][0]=
2536 s->last_mv[0][0][1]=
2537 s->last_mv[1][0][0]=
2538 s->last_mv[1][0][1]= 0;
2541 /* if we skipped it in the future P Frame than skip it now too */
2542 s->mb_skiped= s->mbskip_table[s->mb_y * s->mb_width + s->mb_x]; // Note, skiptab=0 if last was GMC
2547 s->block_last_index[i] = -1;
2549 s->mv_dir = MV_DIR_FORWARD;
2550 s->mv_type = MV_TYPE_16X16;
2555 //FIXME is this correct?
2556 /* s->last_mv[0][0][0]=
2557 s->last_mv[0][0][1]=0;*/
2562 modb1= get_bits1(&s->gb);
2564 modb2= get_bits1(&s->gb);
2565 mb_type= get_vlc(&s->gb, &mb_type_b_vlc);
2566 if(modb2==0) cbp= get_bits(&s->gb, 6);
2568 if (mb_type && cbp) {
2569 if(get_bits1(&s->gb)){
2570 s->qscale +=get_bits1(&s->gb)*4 - 2;
2573 else if (s->qscale > 31)
2579 mb_type=4; //like 0 but no vectors coded
2582 s->mv_type = MV_TYPE_16X16; // we'll switch to 8x8 only if the last P frame had 8x8 for this MB and mb_type=0 here
2583 mx=my=0; //for case 4, we could put this to the mb_type=4 but than gcc compains about uninitalized mx/my
2586 case 0: /* direct */
2587 mx = h263_decode_motion(s, 0, 1);
2588 my = h263_decode_motion(s, 0, 1);
2589 case 4: /* direct with mx=my=0 */
2590 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2591 xy= s->block_index[0];
2592 time_pp= s->pp_time;
2593 time_pb= time_pp - s->bp_time;
2594 //if(time_pp>3000 )printf("%d %d ", time_pp, time_pb);
2596 //FIXME avoid divides
2597 s->mv[0][0][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
2598 s->mv[0][0][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
2599 s->mv[1][0][0] = mx ? s->mv[0][0][0] - s->motion_val[xy][0]
2600 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp + mx;
2601 s->mv[1][0][1] = my ? s->mv[0][0][1] - s->motion_val[xy][1]
2602 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp + my;
2606 s->mv[1][0][1] = 1000;*/
2610 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2611 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
2612 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
2613 s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
2614 s->last_mv[0][0][1]= s->mv[0][0][1] = my;
2616 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
2617 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
2618 s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
2619 s->last_mv[1][0][1]= s->mv[1][0][1] = my;
2623 s->mv_dir = MV_DIR_BACKWARD;
2624 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
2625 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
2626 s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
2627 s->last_mv[1][0][1]= s->mv[1][0][1] = my;
2631 s->mv_dir = MV_DIR_FORWARD;
2632 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
2633 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
2634 s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
2635 s->last_mv[0][0][1]= s->mv[0][0][1] = my;
2639 printf("illegal MB_type\n");
2642 } else { /* I-Frame */
2643 cbpc = get_vlc(&s->gb, &intra_MCBPC_vlc);
2651 if (s->h263_pred || s->h263_aic) {
2652 s->ac_pred = get_bits1(&s->gb);
2653 if (s->ac_pred && s->h263_aic)
2654 s->h263_aic_dir = get_bits1(&s->gb);
2657 s->y_dc_scale = 2 * s->qscale;
2658 s->c_dc_scale = 2 * s->qscale;
2660 cbpy = get_vlc(&s->gb, &cbpy_vlc);
2661 if(cbpy<0) return -1;
2662 cbp = (cbpc & 3) | (cbpy << 2);
2664 s->qscale += quant_tab[get_bits(&s->gb, 2)];
2667 else if (s->qscale > 31)
2673 /* decode each block */
2675 for (i = 0; i < 6; i++) {
2676 if (mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
2680 for (i = 0; i < 6; i++) {
2681 if (h263_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
2688 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
2690 int code, val, sign, shift, l, m;
2692 code = get_vlc(&s->gb, &mv_vlc);
2698 sign = get_bits1(&s->gb);
2700 val = (code - 1) << shift;
2702 val |= get_bits(&s->gb, shift);
2708 /* modulo decoding */
2709 if (!s->h263_long_vectors) {
2710 l = (1 << (f_code - 1)) * 32;
2714 } else if (val >= l) {
2718 /* horrible h263 long vector mode */
2719 if (pred < -31 && val < -63)
2721 if (pred > 32 && val > 63)
2728 /* Decodes RVLC of H.263+ UMV */
2729 static int h263p_decode_umotion(MpegEncContext * s, int pred)
2733 if (get_bits1(&s->gb)) /* Motion difference = 0 */
2736 code = 2 + get_bits1(&s->gb);
2738 while (get_bits1(&s->gb))
2741 code += get_bits1(&s->gb);
2746 code = (sign) ? (pred - code) : (pred + code);
2748 fprintf(stderr,"H.263+ UMV Motion = %d\n", code);
2754 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
2757 int code, level, i, j, last, run;
2758 RLTable *rl = &rl_inter;
2759 const UINT8 *scan_table;
2761 scan_table = zigzag_direct;
2762 if (s->h263_aic && s->mb_intra) {
2766 if (s->h263_aic_dir)
2767 scan_table = ff_alternate_vertical_scan; /* left */
2769 scan_table = ff_alternate_horizontal_scan; /* top */
2771 } else if (s->mb_intra) {
2773 if (s->h263_rv10 && s->rv10_version == 3 && s->pict_type == I_TYPE) {
2774 int component, diff;
2775 component = (n <= 3 ? 0 : n - 4 + 1);
2776 level = s->last_dc[component];
2777 if (s->rv10_first_dc_coded[component]) {
2778 diff = rv_decode_dc(s, n);
2782 level = level & 0xff; /* handle wrap round */
2783 s->last_dc[component] = level;
2785 s->rv10_first_dc_coded[component] = 1;
2788 level = get_bits(&s->gb, 8);
2798 if (s->mb_intra && s->h263_aic)
2800 s->block_last_index[n] = i - 1;
2805 code = get_vlc(&s->gb, &rl->vlc);
2808 if (code == rl->n) {
2810 last = get_bits1(&s->gb);
2811 run = get_bits(&s->gb, 6);
2812 level = (INT8)get_bits(&s->gb, 8);
2813 if (s->h263_rv10 && level == -128) {
2814 /* XXX: should patch encoder too */
2815 level = get_bits(&s->gb, 12);
2816 level = (level << 20) >> 20;
2819 run = rl->table_run[code];
2820 level = rl->table_level[code];
2821 last = code >= rl->last;
2822 if (get_bits1(&s->gb))
2835 if (s->mb_intra && s->h263_aic) {
2836 h263_pred_acdc(s, block, n);
2839 s->block_last_index[n] = i;
2843 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
2845 int level, pred, code;
2849 code = get_vlc(&s->gb, &dc_lum);
2851 code = get_vlc(&s->gb, &dc_chrom);
2852 if (code < 0 || code > 9 /* && s->nbit<9 */){
2853 fprintf(stderr, "illegal dc vlc\n");
2859 level = get_bits(&s->gb, code);
2860 if ((level >> (code - 1)) == 0) /* if MSB not set it is negative*/
2861 level = - (level ^ ((1 << code) - 1));
2863 if(get_bits1(&s->gb)==0){ /* marker */
2864 fprintf(stderr, "dc marker bit missing\n");
2870 pred = mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
2875 *dc_val = level * s->y_dc_scale;
2877 *dc_val = level * s->c_dc_scale;
2884 * returns 0 if everything went ok
2885 * returns DECODING_AC_LOST if an error was detected during AC decoding
2886 * returns DECODING_ACDC_LOST if an error was detected during DC decoding
2888 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
2891 int code, level, i, j, last, run;
2894 const UINT8 *scan_table;
2898 if(s->data_partitioning && s->pict_type!=B_TYPE){
2899 level = s->dc_val[0][ s->block_index[n] ];
2900 if(n<4) level= (level + (s->y_dc_scale>>1))/s->y_dc_scale; //FIXME optimizs
2901 else level= (level + (s->c_dc_scale>>1))/s->c_dc_scale;
2902 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_width]<<n)&32;
2904 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
2906 return DECODING_ACDC_LOST;
2914 if (dc_pred_dir == 0)
2915 scan_table = ff_alternate_vertical_scan; /* left */
2917 scan_table = ff_alternate_horizontal_scan; /* top */
2919 scan_table = zigzag_direct;
2924 s->block_last_index[n] = i - 1;
2928 scan_table = zigzag_direct;
2932 code = get_vlc(&s->gb, &rl->vlc);
2934 return DECODING_AC_LOST;
2935 if (code == rl->n) {
2937 if (get_bits1(&s->gb) != 0) {
2938 if (get_bits1(&s->gb) != 0) {
2940 last = get_bits1(&s->gb);
2941 run = get_bits(&s->gb, 6);
2942 if(get_bits1(&s->gb)==0){
2943 fprintf(stderr, "1. marker bit missing in 3. esc\n");
2944 return DECODING_AC_LOST;
2946 level = get_bits(&s->gb, 12);
2947 level = (level << 20) >> 20; /* sign extend */
2948 if(get_bits1(&s->gb)==0){
2949 fprintf(stderr, "2. marker bit missing in 3. esc\n");
2950 return DECODING_AC_LOST;
2952 if(level>512 || level<-512){ //FIXME check that QP=1 is ok with this too
2953 fprintf(stderr, "|level| overflow in 3. esc\n");
2954 return DECODING_AC_LOST;
2958 const int abs_level= ABS(level);
2960 if(abs_level<=MAX_LEVEL && run<=MAX_RUN && s->error_resilience>=0){
2961 if(abs_level <= rl->max_level[last][run]){
2962 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
2963 return DECODING_AC_LOST;
2965 if(abs_level <= rl->max_level[last][run]*2){
2966 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
2967 return DECODING_AC_LOST;
2969 run1 = run - rl->max_run[last][abs_level] - 1;
2970 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
2971 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
2972 return DECODING_AC_LOST;
2979 code = get_vlc(&s->gb, &rl->vlc);
2980 if (code < 0 || code >= rl->n)
2981 return DECODING_AC_LOST;
2982 run = rl->table_run[code];
2983 level = rl->table_level[code];
2984 last = code >= rl->last;
2985 run += rl->max_run[last][level] + 1;
2986 if (get_bits1(&s->gb))
2991 code = get_vlc(&s->gb, &rl->vlc);
2992 if (code < 0 || code >= rl->n)
2993 return DECODING_AC_LOST;
2994 run = rl->table_run[code];
2995 level = rl->table_level[code];
2996 last = code >= rl->last;
2997 level += rl->max_level[last][run];
2998 if (get_bits1(&s->gb))
3002 run = rl->table_run[code];
3003 level = rl->table_level[code];
3004 last = code >= rl->last;
3005 if (get_bits1(&s->gb))
3010 return DECODING_AC_LOST;
3019 mpeg4_pred_ac(s, block, n, dc_pred_dir);
3021 i = 64; /* XXX: not optimal */
3024 s->block_last_index[n] = i - 1;
3028 /* most is hardcoded. should extend to handle all h263 streams */
3029 int h263_decode_picture_header(MpegEncContext *s)
3031 int format, width, height;
3033 /* picture start code */
3034 if (get_bits(&s->gb, 22) != 0x20) {
3035 fprintf(stderr, "Bad picture start code\n");
3038 /* temporal reference */
3039 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
3041 /* PTYPE starts here */
3042 if (get_bits1(&s->gb) != 1) {
3044 fprintf(stderr, "Bad marker\n");
3047 if (get_bits1(&s->gb) != 0) {
3048 fprintf(stderr, "Bad H263 id\n");
3049 return -1; /* h263 id */
3051 skip_bits1(&s->gb); /* split screen off */
3052 skip_bits1(&s->gb); /* camera off */
3053 skip_bits1(&s->gb); /* freeze picture release off */
3055 /* Reset GOB number */
3058 format = get_bits(&s->gb, 3);
3063 7 extended PTYPE (PLUSPTYPE)
3066 if (format != 7 && format != 6) {
3069 width = h263_format[format][0];
3070 height = h263_format[format][1];
3076 s->pict_type = I_TYPE + get_bits1(&s->gb);
3078 s->unrestricted_mv = get_bits1(&s->gb);
3079 s->h263_long_vectors = s->unrestricted_mv;
3081 if (get_bits1(&s->gb) != 0) {
3082 fprintf(stderr, "H263 SAC not supported\n");
3083 return -1; /* SAC: off */
3085 if (get_bits1(&s->gb) != 0) {
3086 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
3089 if (get_bits1(&s->gb) != 0) {
3090 fprintf(stderr, "H263 PB frame not supported\n");
3091 return -1; /* not PB frame */
3093 s->qscale = get_bits(&s->gb, 5);
3094 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
3100 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
3102 /* ufep other than 0 and 1 are reserved */
3105 format = get_bits(&s->gb, 3);
3106 dprintf("ufep=1, format: %d\n", format);
3107 skip_bits(&s->gb,1); /* Custom PCF */
3108 s->umvplus_dec = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */
3109 skip_bits1(&s->gb); /* Syntax-based Arithmetic Coding (SAC) */
3110 if (get_bits1(&s->gb) != 0) {
3111 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
3113 if (get_bits1(&s->gb) != 0) { /* Advanced Intra Coding (AIC) */
3117 skip_bits(&s->gb, 7);
3118 /* these are the 7 bits: (in order of appearence */
3119 /* Deblocking Filter */
3120 /* Slice Structured */
3121 /* Reference Picture Selection */
3122 /* Independent Segment Decoding */
3123 /* Alternative Inter VLC */
3124 /* Modified Quantization */
3125 /* Prevent start code emulation */
3127 skip_bits(&s->gb, 3); /* Reserved */
3128 } else if (ufep != 0) {
3129 fprintf(stderr, "Bad UFEP type (%d)\n", ufep);
3134 s->pict_type = get_bits(&s->gb, 3) + I_TYPE;
3135 dprintf("pict_type: %d\n", s->pict_type);
3136 if (s->pict_type != I_TYPE &&
3137 s->pict_type != P_TYPE)
3139 skip_bits(&s->gb, 2);
3140 s->no_rounding = get_bits1(&s->gb);
3141 dprintf("RTYPE: %d\n", s->no_rounding);
3142 skip_bits(&s->gb, 4);
3144 /* Get the picture dimensions */
3147 /* Custom Picture Format (CPFMT) */
3148 s->aspect_ratio_info = get_bits(&s->gb, 4);
3149 dprintf("aspect: %d\n", s->aspect_ratio_info);
3154 3 - 10:11 (525-type 4:3)
3155 4 - 16:11 (CIF 16:9)
3156 5 - 40:33 (525-type 16:9)
3159 width = (get_bits(&s->gb, 9) + 1) * 4;
3161 height = get_bits(&s->gb, 9) * 4;
3162 dprintf("\nH.263+ Custom picture: %dx%d\n",width,height);
3163 if (s->aspect_ratio_info == EXTENDED_PAR) {
3164 /* aspected dimensions */
3165 skip_bits(&s->gb, 8); /* width */
3166 skip_bits(&s->gb, 8); /* height */
3169 width = h263_format[format][0];
3170 height = h263_format[format][1];
3172 if ((width == 0) || (height == 0))
3176 if (s->umvplus_dec) {
3177 skip_bits1(&s->gb); /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
3181 s->qscale = get_bits(&s->gb, 5);
3184 while (get_bits1(&s->gb) != 0) {
3185 skip_bits(&s->gb, 8);
3191 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s)
3194 int a= 2<<s->sprite_warping_accuracy;
3195 int rho= 3-s->sprite_warping_accuracy;
3197 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
3198 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
3199 int sprite_ref[4][2];
3200 int virtual_ref[2][2];
3202 int alpha=0, beta=0;
3205 //printf("SP %d\n", s->sprite_warping_accuracy);
3206 for(i=0; i<s->num_sprite_warping_points; i++){
3210 length= get_vlc(&s->gb, &sprite_trajectory);
3212 x= get_bits(&s->gb, length);
3213 //printf("lx %d %d\n", length, x);
3214 if ((x >> (length - 1)) == 0) /* if MSB not set it is negative*/
3215 x = - (x ^ ((1 << length) - 1));
3217 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(&s->gb); /* marker bit */
3219 length= get_vlc(&s->gb, &sprite_trajectory);
3221 y=get_bits(&s->gb, length);
3222 //printf("ly %d %d\n", length, y);
3223 if ((y >> (length - 1)) == 0) /* if MSB not set it is negative*/
3224 y = - (y ^ ((1 << length) - 1));
3226 skip_bits1(&s->gb); /* marker bit */
3227 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
3228 //if(i>0 && (x!=0 || y!=0)) printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n");
3234 while((1<<alpha)<w) alpha++;
3235 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
3239 // Note, the 4th point isnt used for GMC
3240 if(s->divx_version==500 && s->divx_build==413){
3241 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
3242 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
3243 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
3244 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
3245 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
3246 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
3248 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
3249 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
3250 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
3251 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
3252 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
3253 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
3255 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
3256 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
3258 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
3259 // perhaps it should be reordered to be more readable ...
3260 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
3261 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
3262 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
3263 + 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);
3264 virtual_ref[0][1]= 16*vop_ref[0][1]
3265 + 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);
3266 virtual_ref[1][0]= 16*vop_ref[0][0]
3267 + 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);
3268 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
3269 + 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);
3271 switch(s->num_sprite_warping_points)
3274 s->sprite_offset[0][0]= 0;
3275 s->sprite_offset[0][1]= 0;
3276 s->sprite_offset[1][0]= 0;
3277 s->sprite_offset[1][1]= 0;
3278 s->sprite_delta[0][0][0]= a;
3279 s->sprite_delta[0][0][1]= 0;
3280 s->sprite_delta[0][1][0]= 0;
3281 s->sprite_delta[0][1][1]= a;
3282 s->sprite_delta[1][0][0]= a;
3283 s->sprite_delta[1][0][1]= 0;
3284 s->sprite_delta[1][1][0]= 0;
3285 s->sprite_delta[1][1][1]= a;
3286 s->sprite_shift[0][0]= 0;
3287 s->sprite_shift[0][1]= 0;
3288 s->sprite_shift[1][0]= 0;
3289 s->sprite_shift[1][1]= 0;
3292 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
3293 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
3294 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
3295 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
3296 s->sprite_delta[0][0][0]= a;
3297 s->sprite_delta[0][0][1]= 0;
3298 s->sprite_delta[0][1][0]= 0;
3299 s->sprite_delta[0][1][1]= a;
3300 s->sprite_delta[1][0][0]= a;
3301 s->sprite_delta[1][0][1]= 0;
3302 s->sprite_delta[1][1][0]= 0;
3303 s->sprite_delta[1][1][1]= a;
3304 s->sprite_shift[0][0]= 0;
3305 s->sprite_shift[0][1]= 0;
3306 s->sprite_shift[1][0]= 0;
3307 s->sprite_shift[1][1]= 0;
3311 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
3312 + ((-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
3313 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1]));
3314 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
3315 + ((-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
3316 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1]));
3317 s->sprite_offset[1][0]= ((-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
3318 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
3319 +2*w2*r*sprite_ref[0][0] - 16*w2);
3320 s->sprite_offset[1][1]= ((-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
3321 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
3322 +2*w2*r*sprite_ref[0][1] - 16*w2);
3323 s->sprite_delta[0][0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
3324 s->sprite_delta[0][0][1]= ( r*sprite_ref[0][1] - virtual_ref[0][1]);
3325 s->sprite_delta[0][1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
3326 s->sprite_delta[0][1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
3327 s->sprite_delta[1][0][0]= 4*(-r*sprite_ref[0][0] + virtual_ref[0][0]);
3328 s->sprite_delta[1][0][1]= 4*( r*sprite_ref[0][1] - virtual_ref[0][1]);
3329 s->sprite_delta[1][1][0]= 4*(-r*sprite_ref[0][1] + virtual_ref[0][1]);
3330 s->sprite_delta[1][1][1]= 4*(-r*sprite_ref[0][0] + virtual_ref[0][0]);
3331 s->sprite_shift[0][0]= alpha+rho;
3332 s->sprite_shift[0][1]= alpha+rho;
3333 s->sprite_shift[1][0]= alpha+rho+2;
3334 s->sprite_shift[1][1]= alpha+rho+2;
3339 /*printf("%d %d\n", s->sprite_delta[0][0][0], a<<s->sprite_shift[0][0]);
3340 printf("%d %d\n", s->sprite_delta[0][0][1], 0);
3341 printf("%d %d\n", s->sprite_delta[0][1][0], 0);
3342 printf("%d %d\n", s->sprite_delta[0][1][1], a<<s->sprite_shift[0][1]);
3343 printf("%d %d\n", s->sprite_delta[1][0][0], a<<s->sprite_shift[1][0]);
3344 printf("%d %d\n", s->sprite_delta[1][0][1], 0);
3345 printf("%d %d\n", s->sprite_delta[1][1][0], 0);
3346 printf("%d %d\n", s->sprite_delta[1][1][1], a<<s->sprite_shift[1][1]);*/
3347 /* try to simplify the situation */
3348 if( s->sprite_delta[0][0][0] == a<<s->sprite_shift[0][0]
3349 && s->sprite_delta[0][0][1] == 0
3350 && s->sprite_delta[0][1][0] == 0
3351 && s->sprite_delta[0][1][1] == a<<s->sprite_shift[0][1]
3352 && s->sprite_delta[1][0][0] == a<<s->sprite_shift[1][0]
3353 && s->sprite_delta[1][0][1] == 0
3354 && s->sprite_delta[1][1][0] == 0
3355 && s->sprite_delta[1][1][1] == a<<s->sprite_shift[1][1])
3357 s->sprite_offset[0][0]>>=s->sprite_shift[0][0];
3358 s->sprite_offset[0][1]>>=s->sprite_shift[0][1];
3359 s->sprite_offset[1][0]>>=s->sprite_shift[1][0];
3360 s->sprite_offset[1][1]>>=s->sprite_shift[1][1];
3361 s->sprite_delta[0][0][0]= a;
3362 s->sprite_delta[0][0][1]= 0;
3363 s->sprite_delta[0][1][0]= 0;
3364 s->sprite_delta[0][1][1]= a;
3365 s->sprite_delta[1][0][0]= a;
3366 s->sprite_delta[1][0][1]= 0;
3367 s->sprite_delta[1][1][0]= 0;
3368 s->sprite_delta[1][1][1]= a;
3369 s->sprite_shift[0][0]= 0;
3370 s->sprite_shift[0][1]= 0;
3371 s->sprite_shift[1][0]= 0;
3372 s->sprite_shift[1][1]= 0;
3373 s->real_sprite_warping_points=1;
3376 s->real_sprite_warping_points= s->num_sprite_warping_points;
3378 //printf("%d %d %d %d\n", d[0][0], d[0][1], s->sprite_offset[0][0], s->sprite_offset[0][1]);
3381 /* decode mpeg4 VOP header */
3382 int mpeg4_decode_picture_header(MpegEncContext * s)
3384 int time_incr, startcode, state, v;
3388 /* search next start code */
3389 align_get_bits(&s->gb);
3392 v = get_bits(&s->gb, 8);
3393 if (state == 0x000001) {
3394 state = ((state << 8) | v) & 0xffffff;
3398 state = ((state << 8) | v) & 0xffffff;
3399 if( get_bits_count(&s->gb) > s->gb.size*8-32){
3401 printf("no VOP startcode found, frame size was=%d\n", s->gb.size);
3404 printf("frame skip\n");
3405 return FRAME_SKIPED;
3409 //printf("startcode %X %d\n", startcode, get_bits_count(&s->gb));
3410 if (startcode == 0x120) { // Video Object Layer
3411 int width, height, vo_ver_id;
3414 skip_bits(&s->gb, 1); /* random access */
3415 s->vo_type= get_bits(&s->gb, 8);
3416 if (get_bits1(&s->gb) != 0) { /* is_ol_id */
3417 vo_ver_id = get_bits(&s->gb, 4); /* vo_ver_id */
3418 skip_bits(&s->gb, 3); /* vo_priority */
3422 //printf("vo type:%d\n",s->vo_type);
3423 s->aspect_ratio_info= get_bits(&s->gb, 4);
3424 if(s->aspect_ratio_info == EXTENDED_PAR){
3425 skip_bits(&s->gb, 8); //par_width
3426 skip_bits(&s->gb, 8); // par_height
3429 if ((s->vol_control_parameters=get_bits1(&s->gb))) { /* vol control parameter */
3430 int chroma_format= get_bits(&s->gb, 2);
3431 if(chroma_format!=1){
3432 printf("illegal chroma format\n");
3434 s->low_delay= get_bits1(&s->gb);
3435 if(get_bits1(&s->gb)){ /* vbv parameters */
3436 printf("vbv parameters not supported\n");
3443 s->shape = get_bits(&s->gb, 2); /* vol shape */
3444 if(s->shape != RECT_SHAPE) printf("only rectangular vol supported\n");
3445 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
3446 printf("Gray shape not supported\n");
3447 skip_bits(&s->gb, 4); //video_object_layer_shape_extension
3450 skip_bits1(&s->gb); /* marker */
3452 s->time_increment_resolution = get_bits(&s->gb, 16);
3453 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
3454 if (s->time_increment_bits < 1)
3455 s->time_increment_bits = 1;
3456 skip_bits1(&s->gb); /* marker */
3458 if (get_bits1(&s->gb) != 0) { /* fixed_vop_rate */
3459 skip_bits(&s->gb, s->time_increment_bits);
3462 if (s->shape != BIN_ONLY_SHAPE) {
3463 if (s->shape == RECT_SHAPE) {
3464 skip_bits1(&s->gb); /* marker */
3465 width = get_bits(&s->gb, 13);
3466 skip_bits1(&s->gb); /* marker */
3467 height = get_bits(&s->gb, 13);
3468 skip_bits1(&s->gb); /* marker */
3469 if(width && height){ /* they should be non zero but who knows ... */
3472 // printf("width/height: %d %d\n", width, height);
3476 if(get_bits1(&s->gb)) printf("interlaced not supported\n"); /* interlaced */
3477 if(!get_bits1(&s->gb)) printf("OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */
3478 if (vo_ver_id == 1) {
3479 s->vol_sprite_usage = get_bits1(&s->gb); /* vol_sprite_usage */
3481 s->vol_sprite_usage = get_bits(&s->gb, 2); /* vol_sprite_usage */
3483 if(s->vol_sprite_usage==STATIC_SPRITE) printf("Static Sprites not supported\n");
3484 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
3485 if(s->vol_sprite_usage==STATIC_SPRITE){
3486 s->sprite_width = get_bits(&s->gb, 13);
3487 skip_bits1(&s->gb); /* marker */
3488 s->sprite_height= get_bits(&s->gb, 13);
3489 skip_bits1(&s->gb); /* marker */
3490 s->sprite_left = get_bits(&s->gb, 13);
3491 skip_bits1(&s->gb); /* marker */
3492 s->sprite_top = get_bits(&s->gb, 13);
3493 skip_bits1(&s->gb); /* marker */
3495 s->num_sprite_warping_points= get_bits(&s->gb, 6);
3496 s->sprite_warping_accuracy = get_bits(&s->gb, 2);
3497 s->sprite_brightness_change= get_bits1(&s->gb);
3498 if(s->vol_sprite_usage==STATIC_SPRITE)
3499 s->low_latency_sprite= get_bits1(&s->gb);
3501 // FIXME sadct disable bit if verid!=1 && shape not rect
3503 if (get_bits1(&s->gb) == 1) { /* not_8_bit */
3504 s->quant_precision = get_bits(&s->gb, 4); /* quant_precision */
3505 if(get_bits(&s->gb, 4)!=8) printf("N-bit not supported\n"); /* bits_per_pixel */
3506 if(s->quant_precision!=5) printf("quant precission %d\n", s->quant_precision);
3508 s->quant_precision = 5;
3511 // FIXME a bunch of grayscale shape things
3513 if(get_bits1(&s->gb)){ /* vol_quant_type */
3515 /* load default matrixes */
3516 for(i=0; i<64; i++){
3517 v= ff_mpeg4_default_intra_matrix[i];
3518 s->intra_matrix[i]= v;
3519 s->chroma_intra_matrix[i]= v;
3521 v= ff_mpeg4_default_non_intra_matrix[i];
3522 s->inter_matrix[i]= v;
3523 s->chroma_inter_matrix[i]= v;
3526 /* load custom intra matrix */
3527 if(get_bits1(&s->gb)){
3528 for(i=0; i<64; i++){
3529 v= get_bits(&s->gb, 8);
3532 j= zigzag_direct[i];
3533 s->intra_matrix[j]= v;
3534 s->chroma_intra_matrix[j]= v;
3538 /* load custom non intra matrix */
3539 if(get_bits1(&s->gb)){
3540 for(i=0; i<64; i++){
3541 v= get_bits(&s->gb, 8);
3544 j= zigzag_direct[i];
3545 s->inter_matrix[j]= v;
3546 s->chroma_inter_matrix[j]= v;
3549 /* replicate last value */
3551 j= zigzag_direct[i];
3552 s->inter_matrix[j]= v;
3553 s->chroma_inter_matrix[j]= v;
3557 s->dct_unquantize= s->dct_unquantize_mpeg2;
3559 // FIXME a bunch of grayscale shape things
3561 s->dct_unquantize= s->dct_unquantize_h263;
3564 s->quarter_sample= get_bits1(&s->gb);
3565 else s->quarter_sample=0;
3567 if(!get_bits1(&s->gb)) printf("Complexity estimation not supported\n");
3569 s->resync_marker= !get_bits1(&s->gb); /* resync_marker_disabled */
3571 s->data_partitioning= get_bits1(&s->gb);
3572 if(s->data_partitioning){
3573 s->rvlc= get_bits1(&s->gb);
3575 printf("reversible vlc not supported\n");
3579 if(vo_ver_id != 1) {
3580 s->new_pred= get_bits1(&s->gb);
3582 printf("new pred not supported\n");
3583 skip_bits(&s->gb, 2); /* requested upstream message type */
3584 skip_bits1(&s->gb); /* newpred segment type */
3586 s->reduced_res_vop= get_bits1(&s->gb);
3587 if(s->reduced_res_vop) printf("reduced resolution VOP not supported\n");
3591 s->reduced_res_vop= 0;
3594 s->scalability= get_bits1(&s->gb);
3595 if (s->scalability) {
3596 printf("scalability not supported\n");
3599 //printf("end Data %X %d\n", show_bits(&s->gb, 32), get_bits_count(&s->gb)&0x7);
3601 } else if (startcode == 0x1b2) { //userdata
3607 //printf("user Data %X\n", show_bits(&s->gb, 32));
3608 buf[0]= show_bits(&s->gb, 8);
3609 for(i=1; i<256; i++){
3610 buf[i]= show_bits(&s->gb, 16)&0xFF;
3611 if(buf[i]==0) break;
3612 skip_bits(&s->gb, 8);
3615 e=sscanf(buf, "DivX%dBuild%d", &ver, &build);
3617 e=sscanf(buf, "DivX%db%d", &ver, &build);
3619 s->divx_version= ver;
3620 s->divx_build= build;
3621 if(s->picture_number==0){
3622 printf("This file was encoded with DivX%d Build%d\n", ver, build);
3623 if(ver==500 && build==413){
3624 printf("WARNING: this version of DivX is not MPEG4 compatible, trying to workaround these bugs...\n");
3627 printf("hmm, i havnt seen that version of divx yet, lets assume they fixed these bugs ...\n"
3628 "using mpeg4 decoder, if it fails contact the developers (of ffmpeg)\n");
3633 //printf("User Data: %s\n", buf);
3635 } else if (startcode != 0x1b6) { //VOP
3639 s->pict_type = get_bits(&s->gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */
3640 //if(s->pict_type!=I_TYPE) return FRAME_SKIPED;
3641 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0){
3642 printf("low_delay flag set, but shouldnt, clearing it\n");
3645 // printf("pic: %d, qpel:%d\n", s->pict_type, s->quarter_sample);
3646 //printf("%d", s->pict_type);
3648 while (get_bits1(&s->gb) != 0)
3651 check_marker(&s->gb, "before time_increment");
3652 time_increment= get_bits(&s->gb, s->time_increment_bits);
3653 //printf(" type:%d incr:%d increment:%d\n", s->pict_type, time_incr, time_increment);
3654 if(s->pict_type!=B_TYPE){
3655 s->last_time_base= s->time_base;
3656 s->time_base+= time_incr;
3657 s->time= s->time_base*s->time_increment_resolution + time_increment;
3658 s->pp_time= s->time - s->last_non_b_time;
3659 s->last_non_b_time= s->time;
3661 s->time= (s->last_time_base + time_incr)*s->time_increment_resolution + time_increment;
3662 s->bp_time= s->last_non_b_time - s->time;
3663 if(s->pp_time <=s->bp_time){
3664 // printf("messed up order, seeking?, skiping current b frame\n");
3665 return FRAME_SKIPED;
3669 if(check_marker(&s->gb, "before vop_coded")==0 && s->picture_number==0){
3670 printf("hmm, seems the headers arnt complete, trying to guess time_increment_bits\n");
3671 for(s->time_increment_bits++ ;s->time_increment_bits<16; s->time_increment_bits++){
3672 if(get_bits1(&s->gb)) break;
3674 printf("my guess is %d bits ;)\n",s->time_increment_bits);
3677 if (get_bits1(&s->gb) != 1)
3679 //printf("time %d %d %d || %d %d %d\n", s->time_increment_bits, s->time_increment, s->time_base,
3680 //s->time, s->last_non_b_time[0], s->last_non_b_time[1]);
3681 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE
3682 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
3683 /* rounding type for motion estimation */
3684 s->no_rounding = get_bits1(&s->gb);
3688 //FIXME reduced res stuff
3690 if (s->shape != RECT_SHAPE) {
3691 if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) {
3692 int width, height, hor_spat_ref, ver_spat_ref;
3694 width = get_bits(&s->gb, 13);
3695 skip_bits1(&s->gb); /* marker */
3696 height = get_bits(&s->gb, 13);
3697 skip_bits1(&s->gb); /* marker */
3698 hor_spat_ref = get_bits(&s->gb, 13); /* hor_spat_ref */
3699 skip_bits1(&s->gb); /* marker */
3700 ver_spat_ref = get_bits(&s->gb, 13); /* ver_spat_ref */
3702 skip_bits1(&s->gb); /* change_CR_disable */
3704 if (get_bits1(&s->gb) != 0) {
3705 skip_bits(&s->gb, 8); /* constant_alpha_value */
3708 //FIXME complexity estimation stuff
3710 if (s->shape != BIN_ONLY_SHAPE) {
3712 t=get_bits(&s->gb, 3); /* intra dc VLC threshold */
3713 //printf("threshold %d\n", t);
3714 //FIXME interlaced specific bits
3717 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
3718 if(s->num_sprite_warping_points){
3719 mpeg4_decode_sprite_trajectory(s);
3721 if(s->sprite_brightness_change) printf("sprite_brightness_change not supported\n");
3722 if(s->vol_sprite_usage==STATIC_SPRITE) printf("static sprite not supported\n");
3725 if (s->shape != BIN_ONLY_SHAPE) {
3726 /* note: we do not use quant_precision to avoid problem if no
3727 MPEG4 vol header as it is found on some old opendivx
3729 s->qscale = get_bits(&s->gb, 5);
3731 printf("Error, header damaged or not MPEG4 header (qscale=0)\n");
3732 return -1; // makes no sense to continue, as there is nothing left from the image then
3735 if (s->pict_type != I_TYPE) {
3736 s->f_code = get_bits(&s->gb, 3); /* fcode_for */
3738 printf("Error, header damaged or not MPEG4 header (f_code=0)\n");
3739 return -1; // makes no sense to continue, as the MV decoding will break very quickly
3742 if (s->pict_type == B_TYPE) {
3743 s->b_code = get_bits(&s->gb, 3);
3744 //printf("b-code %d\n", s->b_code);
3746 //printf("quant:%d fcode:%d bcode:%d type:%d\n", s->qscale, s->f_code, s->b_code, s->pict_type);
3747 if(!s->scalability){
3748 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {
3749 skip_bits1(&s->gb); // vop shape coding type
3753 /* detect buggy encoders which dont set the low_delay flag (divx4/xvid/opendivx)*/
3754 // note we cannot detect divx5 without b-frames easyly (allthough its buggy too)
3755 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
3756 printf("looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
3760 s->picture_number++; // better than pic number==0 allways ;)
3766 /* don't understand why they choose a different header ! */
3767 int intel_h263_decode_picture_header(MpegEncContext *s)
3771 /* picture header */
3772 if (get_bits(&s->gb, 22) != 0x20) {
3773 fprintf(stderr, "Bad picture start code\n");
3776 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
3778 if (get_bits1(&s->gb) != 1) {
3779 fprintf(stderr, "Bad marker\n");
3780 return -1; /* marker */
3782 if (get_bits1(&s->gb) != 0) {
3783 fprintf(stderr, "Bad H263 id\n");
3784 return -1; /* h263 id */
3786 skip_bits1(&s->gb); /* split screen off */
3787 skip_bits1(&s->gb); /* camera off */
3788 skip_bits1(&s->gb); /* freeze picture release off */
3790 format = get_bits(&s->gb, 3);
3792 fprintf(stderr, "Intel H263 free format not supported\n");
3797 s->pict_type = I_TYPE + get_bits1(&s->gb);
3799 s->unrestricted_mv = get_bits1(&s->gb);
3800 s->h263_long_vectors = s->unrestricted_mv;
3802 if (get_bits1(&s->gb) != 0) {
3803 fprintf(stderr, "SAC not supported\n");
3804 return -1; /* SAC: off */
3806 if (get_bits1(&s->gb) != 0) {
3807 fprintf(stderr, "Advanced Prediction Mode not supported\n");
3808 return -1; /* advanced prediction mode: off */
3810 if (get_bits1(&s->gb) != 0) {
3811 fprintf(stderr, "PB frame mode no supported\n");
3812 return -1; /* PB frame mode */
3815 /* skip unknown header garbage */
3816 skip_bits(&s->gb, 41);
3818 s->qscale = get_bits(&s->gb, 5);
3819 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
3822 while (get_bits1(&s->gb) != 0) {
3823 skip_bits(&s->gb, 8);