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 void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
55 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s);
57 extern UINT32 inverse[256];
59 static UINT16 mv_penalty[MAX_FCODE+1][MAX_MV*2+1];
60 static UINT8 fcode_tab[MAX_MV*2+1];
61 static UINT8 umv_fcode_tab[MAX_MV*2+1];
63 static UINT16 uni_DCtab_lum [512][2];
64 static UINT16 uni_DCtab_chrom[512][2];
66 int h263_get_picture_format(int width, int height)
70 if (width == 128 && height == 96)
72 else if (width == 176 && height == 144)
74 else if (width == 352 && height == 288)
76 else if (width == 704 && height == 576)
78 else if (width == 1408 && height == 1152)
85 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
89 align_put_bits(&s->pb);
91 /* Update the pointer to last GOB */
92 s->ptr_lastgob = pbBufPtr(&s->pb);
95 put_bits(&s->pb, 22, 0x20); /* PSC */
96 put_bits(&s->pb, 8, (((INT64)s->picture_number * 30 * FRAME_RATE_BASE) /
97 s->frame_rate) & 0xff);
99 put_bits(&s->pb, 1, 1); /* marker */
100 put_bits(&s->pb, 1, 0); /* h263 id */
101 put_bits(&s->pb, 1, 0); /* split screen off */
102 put_bits(&s->pb, 1, 0); /* camera off */
103 put_bits(&s->pb, 1, 0); /* freeze picture release off */
105 format = h263_get_picture_format(s->width, s->height);
108 put_bits(&s->pb, 3, format);
109 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
110 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
111 of H.263v1 UMV implies to check the predicted MV after
112 calculation of the current MB to see if we're on the limits */
113 put_bits(&s->pb, 1, 0); /* unrestricted motion vector: off */
114 put_bits(&s->pb, 1, 0); /* SAC: off */
115 put_bits(&s->pb, 1, 0); /* advanced prediction mode: off */
116 put_bits(&s->pb, 1, 0); /* not PB frame */
117 put_bits(&s->pb, 5, s->qscale);
118 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
121 /* H.263 Plus PTYPE */
122 put_bits(&s->pb, 3, 7);
123 put_bits(&s->pb,3,1); /* Update Full Extended PTYPE */
125 put_bits(&s->pb,3,6); /* Custom Source Format */
127 put_bits(&s->pb, 3, format);
129 put_bits(&s->pb,1,0); /* Custom PCF: off */
130 s->umvplus = (s->pict_type == P_TYPE) && s->unrestricted_mv;
131 put_bits(&s->pb, 1, s->umvplus); /* Unrestricted Motion Vector */
132 put_bits(&s->pb,1,0); /* SAC: off */
133 put_bits(&s->pb,1,0); /* Advanced Prediction Mode: off */
134 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
135 put_bits(&s->pb,1,0); /* Deblocking Filter: off */
136 put_bits(&s->pb,1,0); /* Slice Structured: off */
137 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
138 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
139 put_bits(&s->pb,1,0); /* Alternative Inter VLC: off */
140 put_bits(&s->pb,1,0); /* Modified Quantization: off */
141 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
142 put_bits(&s->pb,3,0); /* Reserved */
144 put_bits(&s->pb, 3, s->pict_type == P_TYPE);
146 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
147 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
148 if (s->pict_type == I_TYPE)
152 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
153 put_bits(&s->pb,2,0); /* Reserved */
154 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
156 /* This should be here if PLUSPTYPE */
157 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
160 /* Custom Picture Format (CPFMT) */
162 if (s->aspect_ratio_info)
163 put_bits(&s->pb,4,s->aspect_ratio_info);
165 put_bits(&s->pb,4,2); /* Aspect ratio: CIF 12:11 (4:3) picture */
166 put_bits(&s->pb,9,(s->width >> 2) - 1);
167 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
168 put_bits(&s->pb,9,(s->height >> 2));
171 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
173 put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
174 put_bits(&s->pb, 5, s->qscale);
177 put_bits(&s->pb, 1, 0); /* no PEI */
181 s->c_dc_scale_table= h263_aic_dc_scale_table;
184 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
188 int h263_encode_gob_header(MpegEncContext * s, int mb_line)
192 /* Check to see if we need to put a new GBSC */
193 /* for RTP packetization */
195 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
196 if (pdif >= s->rtp_payload_size) {
197 /* Bad luck, packet must be cut before */
198 align_put_bits(&s->pb);
199 flush_put_bits(&s->pb);
200 /* Call the RTP callback to send the last GOB */
201 if (s->rtp_callback) {
202 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
203 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
205 s->ptr_lastgob = pbBufPtr(&s->pb);
206 put_bits(&s->pb, 17, 1); /* GBSC */
207 s->gob_number = mb_line / s->gob_index;
208 put_bits(&s->pb, 5, s->gob_number); /* GN */
209 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
210 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
211 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
213 } else if (pdif + s->mb_line_avgsize >= s->rtp_payload_size) {
214 /* Cut the packet before we can't */
215 align_put_bits(&s->pb);
216 flush_put_bits(&s->pb);
217 /* Call the RTP callback to send the last GOB */
218 if (s->rtp_callback) {
219 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
220 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
222 s->ptr_lastgob = pbBufPtr(&s->pb);
223 put_bits(&s->pb, 17, 1); /* GBSC */
224 s->gob_number = mb_line / s->gob_index;
225 put_bits(&s->pb, 5, s->gob_number); /* GN */
226 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
227 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
228 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
235 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6])
237 int score0=0, score1=0;
241 INT16 *ac_val, *ac_val1;
243 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
246 ac_val-= s->block_wrap[n]*16;
248 const int level= block[n][block_permute_op(i )];
250 score1+= ABS(level - ac_val[i+8]);
251 ac_val1[i ]= block[n][block_permute_op(i<<3)];
257 const int level= block[n][block_permute_op(i<<3)];
259 score1+= ABS(level - ac_val[i]);
261 ac_val1[i+8]= block[n][block_permute_op(i )];
266 return score0 > score1 ? 1 : 0;
269 void mpeg4_encode_mb(MpegEncContext * s,
270 DCTELEM block[6][64],
271 int motion_x, int motion_y)
273 int cbpc, cbpy, i, pred_x, pred_y;
275 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
276 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=B_TYPE ? &s->tex_pb : &s->pb;
277 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=I_TYPE ? &s->pb2 : &s->pb;
278 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
280 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
284 for (i = 0; i < 6; i++) {
285 if (s->block_last_index[i] >= 0)
289 if(s->pict_type==B_TYPE){
290 static const int mb_type_table[8]= {-1, 2, 3, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
291 int mb_type= mb_type_table[s->mv_dir];
297 s->last_mv[1][0][1]= 0;
300 /* nothing to do if this MB was skiped in the next P Frame */
301 if(s->mbskip_table[s->mb_y * s->mb_width + s->mb_x]){
307 s->mv_dir= MV_DIR_FORWARD; //doesnt matter
311 if ((cbp | motion_x | motion_y | mb_type) ==0) {
312 /* direct MB with MV={0,0} */
313 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
315 if(interleaved_stats){
322 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
323 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
324 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we dont need it :)
325 if(cbp) put_bits(&s->pb, 6, cbp);
328 put_bits(&s->pb, 1, 0); /* no q-scale change */
330 if(interleaved_stats){
331 bits= get_bit_count(&s->pb);
332 s->misc_bits+= bits - s->last_bits;
339 h263_encode_motion(s, motion_x, 1);
340 h263_encode_motion(s, motion_y, 1);
343 h263_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code);
344 h263_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
345 h263_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code);
346 h263_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
347 s->last_mv[0][0][0]= s->mv[0][0][0];
348 s->last_mv[0][0][1]= s->mv[0][0][1];
349 s->last_mv[1][0][0]= s->mv[1][0][0];
350 s->last_mv[1][0][1]= s->mv[1][0][1];
352 case 2: /* backward */
353 h263_encode_motion(s, motion_x - s->last_mv[1][0][0], s->b_code);
354 h263_encode_motion(s, motion_y - s->last_mv[1][0][1], s->b_code);
355 s->last_mv[1][0][0]= motion_x;
356 s->last_mv[1][0][1]= motion_y;
358 case 3: /* forward */
359 h263_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);
360 h263_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);
361 s->last_mv[0][0][0]= motion_x;
362 s->last_mv[0][0][1]= motion_y;
365 printf("unknown mb type\n");
369 if(interleaved_stats){
370 bits= get_bit_count(&s->pb);
371 s->mv_bits+= bits - s->last_bits;
375 /* encode each block */
376 for (i = 0; i < 6; i++) {
377 mpeg4_encode_block(s, block[i], i, 0, zigzag_direct, NULL, &s->pb);
380 if(interleaved_stats){
381 bits= get_bit_count(&s->pb);
382 s->p_tex_bits+= bits - s->last_bits;
385 }else{ /* s->pict_type==B_TYPE */
386 if ((cbp | motion_x | motion_y) == 0 && s->mv_type==MV_TYPE_16X16) {
387 /* check if the B frames can skip it too, as we must skip it if we skip here
388 why didnt they just compress the skip-mb bits instead of reusing them ?! */
389 if(s->max_b_frames>0){
396 if(x+16 > s->width) x= s->width-16;
397 if(y+16 > s->height) y= s->height-16;
399 offset= x + y*s->linesize;
400 p_pic= s->new_picture[0] + offset;
403 for(i=0; i<s->max_b_frames; i++){
407 if(s->coded_order[i+1].pict_type!=B_TYPE) break;
409 b_pic= s->coded_order[i+1].picture[0] + offset;
410 diff= pix_abs16x16(p_pic, b_pic, s->linesize);
411 if(diff>s->qscale*70){ //FIXME check that 70 is optimal
420 /* skip macroblock */
421 put_bits(&s->pb, 1, 1);
423 if(interleaved_stats){
432 put_bits(&s->pb, 1, 0); /* mb coded */
433 if(s->mv_type==MV_TYPE_16X16){
436 inter_MCBPC_bits[cbpc],
437 inter_MCBPC_code[cbpc]);
440 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
442 if(interleaved_stats){
443 bits= get_bit_count(&s->pb);
444 s->misc_bits+= bits - s->last_bits;
448 /* motion vectors: 16x16 mode */
449 h263_pred_motion(s, 0, &pred_x, &pred_y);
451 h263_encode_motion(s, motion_x - pred_x, s->f_code);
452 h263_encode_motion(s, motion_y - pred_y, s->f_code);
456 inter_MCBPC_bits[cbpc],
457 inter_MCBPC_code[cbpc]);
460 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
462 if(interleaved_stats){
463 bits= get_bit_count(&s->pb);
464 s->misc_bits+= bits - s->last_bits;
469 /* motion vectors: 8x8 mode*/
470 h263_pred_motion(s, i, &pred_x, &pred_y);
472 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][0] - pred_x, s->f_code);
473 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][1] - pred_y, s->f_code);
477 if(interleaved_stats){
478 bits= get_bit_count(&s->pb);
479 s->mv_bits+= bits - s->last_bits;
483 /* encode each block */
484 for (i = 0; i < 6; i++) {
485 mpeg4_encode_block(s, block[i], i, 0, zigzag_direct, NULL, tex_pb);
488 if(interleaved_stats){
489 bits= get_bit_count(&s->pb);
490 s->p_tex_bits+= bits - s->last_bits;
497 int dc_diff[6]; //dc values with the dc prediction subtracted
498 int dir[6]; //prediction direction
499 int zigzag_last_index[6];
500 UINT8 *scan_table[6];
503 const int level= block[i][0];
506 dc_diff[i]= level - ff_mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]);
508 *dc_ptr = level * s->y_dc_scale;
510 *dc_ptr = level * s->c_dc_scale;
514 s->ac_pred= decide_ac_pred(s, block, dir);
521 mpeg4_inv_pred_ac(s, block[i], i, dir[i]);
522 if (dir[i]==0) st = ff_alternate_vertical_scan; /* left */
523 else st = ff_alternate_horizontal_scan; /* top */
525 for(last_index=63; last_index>=0; last_index--) //FIXME optimize
526 if(block[i][st[last_index]]) break;
527 zigzag_last_index[i]= s->block_last_index[i];
528 s->block_last_index[i]= last_index;
533 scan_table[i]= zigzag_direct;
538 for (i = 0; i < 6; i++) {
539 if (s->block_last_index[i] >= 1)
544 if (s->pict_type == I_TYPE) {
546 intra_MCBPC_bits[cbpc],
547 intra_MCBPC_code[cbpc]);
549 put_bits(&s->pb, 1, 0); /* mb coded */
551 inter_MCBPC_bits[cbpc + 4],
552 inter_MCBPC_code[cbpc + 4]);
554 put_bits(pb2, 1, s->ac_pred);
556 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
558 if(interleaved_stats){
559 bits= get_bit_count(&s->pb);
560 s->misc_bits+= bits - s->last_bits;
564 /* encode each block */
565 for (i = 0; i < 6; i++) {
566 mpeg4_encode_block(s, block[i], i, dc_diff[i], scan_table[i], dc_pb, tex_pb);
569 if(interleaved_stats){
570 bits= get_bit_count(&s->pb);
571 s->i_tex_bits+= bits - s->last_bits;
576 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
582 ac_val = s->ac_val[0][0] + s->block_index[i] * 16;
586 block[i][block_permute_op(j )]= ac_val[j+8];
589 block[i][block_permute_op(j<<3)]= ac_val[j ];
591 s->block_last_index[i]= zigzag_last_index[i];
597 void h263_encode_mb(MpegEncContext * s,
598 DCTELEM block[6][64],
599 int motion_x, int motion_y)
601 int cbpc, cbpy, i, cbp, pred_x, pred_y;
603 INT16 rec_intradc[6];
606 //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
610 for (i = 0; i < 6; i++) {
611 if (s->block_last_index[i] >= 0)
614 if ((cbp | motion_x | motion_y) == 0) {
615 /* skip macroblock */
616 put_bits(&s->pb, 1, 1);
619 put_bits(&s->pb, 1, 0); /* mb coded */
622 inter_MCBPC_bits[cbpc],
623 inter_MCBPC_code[cbpc]);
626 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
628 /* motion vectors: 16x16 mode only now */
629 h263_pred_motion(s, 0, &pred_x, &pred_y);
632 h263_encode_motion(s, motion_x - pred_x, s->f_code);
633 h263_encode_motion(s, motion_y - pred_y, s->f_code);
636 h263p_encode_umotion(s, motion_x - pred_x);
637 h263p_encode_umotion(s, motion_y - pred_y);
638 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
639 /* To prevent Start Code emulation */
640 put_bits(&s->pb,1,1);
643 int li = s->h263_aic ? 0 : 1;
648 if (s->h263_aic && s->mb_intra) {
649 INT16 level = block[i][0];
651 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
655 level = (level + (s->qscale >> 1))/(s->y_dc_scale);
657 level = (level - (s->qscale >> 1))/(s->y_dc_scale);
659 /* AIC can change CBP */
660 if (level == 0 && s->block_last_index[i] == 0)
661 s->block_last_index[i] = -1;
662 else if (level < -127)
664 else if (level > 127)
669 rec_intradc[i] = (s->y_dc_scale*level) + pred_dc;
672 //if ((rec_intradc[i] % 2) == 0)
675 if (rec_intradc[i] < 0)
677 else if (rec_intradc[i] > 2047)
678 rec_intradc[i] = 2047;
680 /* Update AC/DC tables */
681 *dc_ptr[i] = rec_intradc[i];
684 if (s->block_last_index[i] >= li)
689 if (s->pict_type == I_TYPE) {
691 intra_MCBPC_bits[cbpc],
692 intra_MCBPC_code[cbpc]);
694 put_bits(&s->pb, 1, 0); /* mb coded */
696 inter_MCBPC_bits[cbpc + 4],
697 inter_MCBPC_code[cbpc + 4]);
700 /* XXX: currently, we do not try to use ac prediction */
701 put_bits(&s->pb, 1, 0); /* no AC prediction */
704 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
708 /* encode each block */
709 h263_encode_block(s, block[i], i);
711 /* Update INTRADC for decoding */
712 if (s->h263_aic && s->mb_intra) {
713 block[i][0] = rec_intradc[i];
719 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr)
721 int x, y, wrap, a, c, pred_dc, scale;
722 INT16 *dc_val, *ac_val;
724 /* find prediction */
726 x = 2 * s->mb_x + 1 + (n & 1);
727 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
728 wrap = s->mb_width * 2 + 2;
729 dc_val = s->dc_val[0];
730 ac_val = s->ac_val[0][0];
731 scale = s->y_dc_scale;
735 wrap = s->mb_width + 2;
736 dc_val = s->dc_val[n - 4 + 1];
737 ac_val = s->ac_val[n - 4 + 1][0];
738 scale = s->c_dc_scale;
743 a = dc_val[(x - 1) + (y) * wrap];
744 c = dc_val[(x) + (y - 1) * wrap];
746 /* No prediction outside GOB boundary */
747 if (s->first_slice_line && ((n < 2) || (n > 3)))
750 /* just DC prediction */
751 if (a != 1024 && c != 1024)
752 pred_dc = (a + c) >> 1;
758 /* we assume pred is positive */
759 //pred_dc = (pred_dc + (scale >> 1)) / scale;
760 *dc_val_ptr = &dc_val[x + y * wrap];
765 void h263_pred_acdc(MpegEncContext * s, INT16 *block, int n)
767 int x, y, wrap, a, c, pred_dc, scale, i;
768 INT16 *dc_val, *ac_val, *ac_val1;
770 /* find prediction */
772 x = 2 * s->mb_x + 1 + (n & 1);
773 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
774 wrap = s->mb_width * 2 + 2;
775 dc_val = s->dc_val[0];
776 ac_val = s->ac_val[0][0];
777 scale = s->y_dc_scale;
781 wrap = s->mb_width + 2;
782 dc_val = s->dc_val[n - 4 + 1];
783 ac_val = s->ac_val[n - 4 + 1][0];
784 scale = s->c_dc_scale;
787 ac_val += ((y) * wrap + (x)) * 16;
793 a = dc_val[(x - 1) + (y) * wrap];
794 c = dc_val[(x) + (y - 1) * wrap];
796 /* No prediction outside GOB boundary */
797 if (s->first_slice_line && ((n < 2) || (n > 3)))
801 if (s->h263_aic_dir) {
802 /* left prediction */
806 block[block_permute_op(i*8)] += ac_val[i];
815 block[block_permute_op(i)] += ac_val[i + 8];
821 /* just DC prediction */
822 if (a != 1024 && c != 1024)
823 pred_dc = (a + c) >> 1;
830 /* we assume pred is positive */
831 block[0]=block[0]*scale + pred_dc;
835 else if (!(block[0] & 1))
838 /* Update AC/DC tables */
839 dc_val[(x) + (y) * wrap] = block[0];
843 ac_val1[i] = block[block_permute_op(i * 8)];
846 ac_val1[8 + i] = block[block_permute_op(i)];
849 INT16 *h263_pred_motion(MpegEncContext * s, int block,
853 INT16 *A, *B, *C, *mot_val;
854 static const int off[4]= {2, 1, 1, -1};
856 wrap = s->block_wrap[0];
857 xy = s->block_index[block];
859 mot_val = s->motion_val[xy];
861 A = s->motion_val[xy - 1];
862 /* special case for first (slice) line */
863 if ((s->mb_y == 0 || s->first_slice_line) && block<3) {
864 // we cant just change some MVs to simulate that as we need them for the B frames (and ME)
865 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
866 if(block==0){ //most common case
867 if(s->mb_x == s->resync_mb_x){ //rare
869 }else if(s->mb_x + 1 == s->resync_mb_x){ //rare
870 C = s->motion_val[xy + off[block] - wrap];
875 *px = mid_pred(A[0], 0, C[0]);
876 *py = mid_pred(A[1], 0, C[1]);
883 if(s->mb_x + 1 == s->resync_mb_x){ //rare
884 C = s->motion_val[xy + off[block] - wrap];
885 *px = mid_pred(A[0], 0, C[0]);
886 *py = mid_pred(A[1], 0, C[1]);
892 B = s->motion_val[xy - wrap];
893 C = s->motion_val[xy + off[block] - wrap];
894 if(s->mb_x == s->resync_mb_x) //rare
897 *px = mid_pred(A[0], B[0], C[0]);
898 *py = mid_pred(A[1], B[1], C[1]);
901 B = s->motion_val[xy - wrap];
902 C = s->motion_val[xy + off[block] - wrap];
903 *px = mid_pred(A[0], B[0], C[0]);
904 *py = mid_pred(A[1], B[1], C[1]);
909 static void h263_encode_motion(MpegEncContext * s, int val, int f_code)
911 int range, l, m, bit_size, sign, code, bits;
916 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
918 bit_size = f_code - 1;
919 range = 1 << bit_size;
920 /* modulo encoding */
925 } else if (val >= l) {
936 code = (val >> bit_size) + 1;
937 bits = val & (range - 1);
939 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
941 put_bits(&s->pb, bit_size, bits);
946 /* Encode MV differences on H.263+ with Unrestricted MV mode */
947 static void h263p_encode_umotion(MpegEncContext * s, int val)
957 put_bits(&s->pb, 1, 1);
959 put_bits(&s->pb, 3, 0);
961 put_bits(&s->pb, 3, 2);
964 sval = ((val < 0) ? (short)(-val):(short)val);
967 while (temp_val != 0) {
968 temp_val = temp_val >> 1;
974 tcode = (sval & (1 << (i-1))) >> (i-1);
975 tcode = (tcode << 1) | 1;
976 code = (code << 2) | tcode;
979 code = ((code << 1) | (val < 0)) << 1;
980 put_bits(&s->pb, (2*n_bits)+1, code);
981 //printf("\nVal = %d\tCode = %d", sval, code);
985 static void init_mv_penalty_and_fcode(MpegEncContext *s)
989 for(f_code=1; f_code<=MAX_FCODE; f_code++){
990 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
993 if(mv==0) len= mvtab[0][1];
995 int val, bit_size, range, code;
997 bit_size = s->f_code - 1;
998 range = 1 << bit_size;
1004 code = (val >> bit_size) + 1;
1006 len= mvtab[code][1] + 1 + bit_size;
1008 len= mvtab[32][1] + 2 + bit_size;
1012 mv_penalty[f_code][mv+MAX_MV]= len;
1016 for(f_code=MAX_FCODE; f_code>0; f_code--){
1017 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
1018 fcode_tab[mv+MAX_MV]= f_code;
1022 for(mv=0; mv<MAX_MV*2+1; mv++){
1023 umv_fcode_tab[mv]= 1;
1027 static void init_uni_dc_tab(void)
1029 int level, uni_code, uni_len;
1031 for(level=-256; level<256; level++){
1033 /* find number of bits */
1042 l= (-level) ^ ((1 << size) - 1);
1047 uni_code= DCtab_lum[size][0];
1048 uni_len = DCtab_lum[size][1];
1051 uni_code<<=size; uni_code|=l;
1054 uni_code<<=1; uni_code|=1;
1058 uni_DCtab_lum[level+256][0]= uni_code;
1059 uni_DCtab_lum[level+256][1]= uni_len;
1062 uni_code= DCtab_chrom[size][0];
1063 uni_len = DCtab_chrom[size][1];
1066 uni_code<<=size; uni_code|=l;
1069 uni_code<<=1; uni_code|=1;
1073 uni_DCtab_chrom[level+256][0]= uni_code;
1074 uni_DCtab_chrom[level+256][1]= uni_len;
1079 void h263_encode_init(MpegEncContext *s)
1081 static int done = 0;
1090 init_rl(&rl_intra_aic);
1092 init_mv_penalty_and_fcode(s);
1094 s->mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
1096 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
1097 switch(s->codec_id){
1098 case CODEC_ID_MPEG4:
1099 s->fcode_tab= fcode_tab;
1100 s->min_qcoeff= -2048;
1101 s->max_qcoeff= 2047;
1103 case CODEC_ID_H263P:
1104 s->fcode_tab= umv_fcode_tab;
1105 s->min_qcoeff= -128;
1108 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
1109 default: //nothing needed default table allready set in mpegvideo.c
1110 s->min_qcoeff= -128;
1112 s->y_dc_scale_table=
1113 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
1116 /* h263 type bias */
1117 //FIXME mpeg4 mpeg quantizer
1118 s->intra_quant_bias=0;
1119 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
1122 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
1124 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
1128 if (s->mb_intra && !s->h263_aic) {
1131 /* 255 cannot be represented, so we clamp */
1136 /* 0 cannot be represented also */
1142 put_bits(&s->pb, 8, 0xff);
1144 put_bits(&s->pb, 8, level & 0xff);
1148 if (s->h263_aic && s->mb_intra)
1153 last_index = s->block_last_index[n];
1154 last_non_zero = i - 1;
1155 for (; i <= last_index; i++) {
1156 j = zigzag_direct[i];
1159 run = i - last_non_zero - 1;
1160 last = (i == last_index);
1167 code = get_rl_index(rl, last, run, level);
1168 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1169 if (code == rl->n) {
1170 put_bits(&s->pb, 1, last);
1171 put_bits(&s->pb, 6, run);
1172 put_bits(&s->pb, 8, slevel & 0xff);
1174 put_bits(&s->pb, 1, sign);
1181 /***************************************************/
1183 void ff_mpeg4_stuffing(PutBitContext * pbc)
1186 put_bits(pbc, 1, 0);
1187 length= (-get_bit_count(pbc))&7;
1188 if(length) put_bits(pbc, length, (1<<length)-1);
1191 /* must be called before writing the header */
1192 void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){
1193 int time_div, time_mod;
1195 if(s->pict_type==I_TYPE){ //we will encode a vol header
1196 s->time_increment_resolution= s->frame_rate/ff_gcd(s->frame_rate, FRAME_RATE_BASE);
1197 if(s->time_increment_resolution>=256*256) s->time_increment_resolution= 256*128;
1199 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
1202 s->time= picture_number*(INT64)FRAME_RATE_BASE*s->time_increment_resolution/s->frame_rate;
1203 time_div= s->time/s->time_increment_resolution;
1204 time_mod= s->time%s->time_increment_resolution;
1206 if(s->pict_type==B_TYPE){
1207 s->bp_time= s->last_non_b_time - s->time;
1209 s->last_time_base= s->time_base;
1210 s->time_base= time_div;
1211 s->pp_time= s->time - s->last_non_b_time;
1212 s->last_non_b_time= s->time;
1216 static void mpeg4_encode_vol_header(MpegEncContext * s)
1218 int vo_ver_id=1; //must be 2 if we want GMC or q-pel
1221 s->vo_type= s->has_b_frames ? CORE_VO_TYPE : SIMPLE_VO_TYPE;
1223 put_bits(&s->pb, 16, 0);
1224 put_bits(&s->pb, 16, 0x100); /* video obj */
1225 put_bits(&s->pb, 16, 0);
1226 put_bits(&s->pb, 16, 0x120); /* video obj layer */
1228 put_bits(&s->pb, 1, 0); /* random access vol */
1229 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
1230 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
1231 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
1232 put_bits(&s->pb, 3, 1); /* is obj layer priority */
1233 if(s->aspect_ratio_info)
1234 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
1236 put_bits(&s->pb, 4, 1); /* aspect ratio info= sqare pixel */
1239 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
1240 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
1241 put_bits(&s->pb, 1, s->low_delay);
1242 put_bits(&s->pb, 1, 0); /* vbv parameters= no */
1244 put_bits(&s->pb, 1, 0); /* vol control parameters= no */
1247 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
1248 put_bits(&s->pb, 1, 1); /* marker bit */
1250 put_bits(&s->pb, 16, s->time_increment_resolution);
1251 if (s->time_increment_bits < 1)
1252 s->time_increment_bits = 1;
1253 put_bits(&s->pb, 1, 1); /* marker bit */
1254 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
1255 put_bits(&s->pb, 1, 1); /* marker bit */
1256 put_bits(&s->pb, 13, s->width); /* vol width */
1257 put_bits(&s->pb, 1, 1); /* marker bit */
1258 put_bits(&s->pb, 13, s->height); /* vol height */
1259 put_bits(&s->pb, 1, 1); /* marker bit */
1260 put_bits(&s->pb, 1, 0); /* interlace */
1261 put_bits(&s->pb, 1, 1); /* obmc disable */
1262 if (vo_ver_id == 1) {
1263 put_bits(&s->pb, 1, s->vol_sprite_usage=0); /* sprite enable */
1264 }else{ /* vo_ver_id == 2 */
1265 put_bits(&s->pb, 2, s->vol_sprite_usage=0); /* sprite enable */
1267 put_bits(&s->pb, 1, 0); /* not 8 bit */
1268 put_bits(&s->pb, 1, 0); /* quant type= h263 style*/
1270 put_bits(&s->pb, 1, s->quarter_sample=0);
1271 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
1272 s->resync_marker= s->rtp_mode;
1273 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
1274 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
1275 if(s->data_partitioning){
1276 put_bits(&s->pb, 1, 0); /* no rvlc */
1279 if (vo_ver_id != 1){
1280 put_bits(&s->pb, 1, 0); /* newpred */
1281 put_bits(&s->pb, 1, 0); /* reduced res vop */
1283 put_bits(&s->pb, 1, 0); /* scalability */
1285 ff_mpeg4_stuffing(&s->pb);
1286 put_bits(&s->pb, 16, 0);
1287 put_bits(&s->pb, 16, 0x1B2); /* user_data */
1288 sprintf(buf, "FFmpeg%sb%s", FFMPEG_VERSION, LIBAVCODEC_BUILD_STR);
1289 put_string(&s->pb, buf);
1291 ff_mpeg4_stuffing(&s->pb);
1294 /* write mpeg4 VOP header */
1295 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
1298 int time_div, time_mod;
1300 if(s->pict_type==I_TYPE){
1302 if(picture_number==0 || !s->strict_std_compliance)
1303 mpeg4_encode_vol_header(s);
1306 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->frame_rate, FRAME_RATE_BASE);
1308 put_bits(&s->pb, 16, 0); /* vop header */
1309 put_bits(&s->pb, 16, 0x1B6); /* vop header */
1310 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
1312 time_div= s->time/s->time_increment_resolution;
1313 time_mod= s->time%s->time_increment_resolution;
1314 time_incr= time_div - s->last_time_base;
1316 put_bits(&s->pb, 1, 1);
1318 put_bits(&s->pb, 1, 0);
1320 put_bits(&s->pb, 1, 1); /* marker */
1321 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
1322 put_bits(&s->pb, 1, 1); /* marker */
1323 put_bits(&s->pb, 1, 1); /* vop coded */
1324 if ( s->pict_type == P_TYPE
1325 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
1326 s->no_rounding ^= 1;
1327 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
1329 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
1330 //FIXME sprite stuff
1332 put_bits(&s->pb, 5, s->qscale);
1334 if (s->pict_type != I_TYPE)
1335 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
1336 if (s->pict_type == B_TYPE)
1337 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
1338 // printf("****frame %d\n", picture_number);
1340 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
1341 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
1344 static void h263_dc_scale(MpegEncContext * s)
1346 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
1347 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
1350 inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr)
1352 int a, b, c, wrap, pred, scale;
1356 /* find prediction */
1358 scale = s->y_dc_scale;
1360 scale = s->c_dc_scale;
1362 wrap= s->block_wrap[n];
1363 dc_val = s->dc_val[0] + s->block_index[n];
1369 b = dc_val[ - 1 - wrap];
1370 c = dc_val[ - wrap];
1372 if (abs(a - b) < abs(b - c)) {
1374 *dir_ptr = 1; /* top */
1377 *dir_ptr = 0; /* left */
1379 /* we assume pred is positive */
1382 "xorl %%edx, %%edx \n\t"
1384 : "=d" (pred), "=a"(dummy)
1385 : "a" (pred + (scale >> 1)), "c" (inverse[scale])
1388 pred = (pred + (scale >> 1)) / scale;
1391 /* prepare address for prediction update */
1392 *dc_val_ptr = &dc_val[0];
1397 void mpeg4_pred_ac(MpegEncContext * s, INT16 *block, int n,
1401 INT16 *ac_val, *ac_val1;
1403 /* find prediction */
1404 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1408 /* left prediction */
1411 block[block_permute_op(i*8)] += ac_val[i];
1414 /* top prediction */
1415 ac_val -= 16 * s->block_wrap[n];
1417 block[block_permute_op(i)] += ac_val[i + 8];
1423 ac_val1[i] = block[block_permute_op(i * 8)];
1426 ac_val1[8 + i] = block[block_permute_op(i)];
1429 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
1435 /* find prediction */
1436 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1439 /* left prediction */
1442 block[block_permute_op(i*8)] -= ac_val[i];
1445 /* top prediction */
1446 ac_val -= 16 * s->block_wrap[n];
1448 block[block_permute_op(i)] -= ac_val[i + 8];
1453 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
1456 // if(level<-255 || level>255) printf("dc overflow\n");
1460 put_bits(s, uni_DCtab_lum[level][1], uni_DCtab_lum[level][0]);
1463 put_bits(s, uni_DCtab_chrom[level][1], uni_DCtab_chrom[level][0]);
1467 /* find number of bits */
1477 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
1480 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
1483 /* encode remaining bits */
1486 level = (-level) ^ ((1 << size) - 1);
1487 put_bits(&s->pb, size, level);
1489 put_bits(&s->pb, 1, 1);
1494 static void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
1495 UINT8 *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
1497 int level, run, last, i, j, last_index, last_non_zero, sign, slevel;
1502 /* mpeg4 based DC predictor */
1503 mpeg4_encode_dc(dc_pb, intra_dc, n);
1512 last_index = s->block_last_index[n];
1513 last_non_zero = i - 1;
1514 for (; i <= last_index; i++) {
1518 run = i - last_non_zero - 1;
1519 last = (i == last_index);
1526 code = get_rl_index(rl, last, run, level);
1527 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1528 if (code == rl->n) {
1530 level1 = level - rl->max_level[last][run];
1533 code = get_rl_index(rl, last, run, level1);
1534 if (code == rl->n) {
1536 put_bits(ac_pb, 1, 1);
1537 if (level > MAX_LEVEL)
1539 run1 = run - rl->max_run[last][level] - 1;
1542 code = get_rl_index(rl, last, run1, level);
1543 if (code == rl->n) {
1546 put_bits(ac_pb, 1, 1);
1547 put_bits(ac_pb, 1, last);
1548 put_bits(ac_pb, 6, run);
1549 put_bits(ac_pb, 1, 1);
1550 put_bits(ac_pb, 12, slevel & 0xfff);
1551 put_bits(ac_pb, 1, 1);
1554 put_bits(ac_pb, 1, 0);
1555 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1556 put_bits(ac_pb, 1, sign);
1560 put_bits(ac_pb, 1, 0);
1561 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1562 put_bits(ac_pb, 1, sign);
1565 put_bits(ac_pb, 1, sign);
1574 /***********************************************/
1577 static VLC intra_MCBPC_vlc;
1578 static VLC inter_MCBPC_vlc;
1579 static VLC cbpy_vlc;
1581 static VLC dc_lum, dc_chrom;
1582 static VLC sprite_trajectory;
1583 static VLC mb_type_b_vlc;
1585 void init_rl(RLTable *rl)
1587 INT8 max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
1588 UINT8 index_run[MAX_RUN+1];
1589 int last, run, level, start, end, i;
1591 /* compute max_level[], max_run[] and index_run[] */
1592 for(last=0;last<2;last++) {
1601 memset(max_level, 0, MAX_RUN + 1);
1602 memset(max_run, 0, MAX_LEVEL + 1);
1603 memset(index_run, rl->n, MAX_RUN + 1);
1604 for(i=start;i<end;i++) {
1605 run = rl->table_run[i];
1606 level = rl->table_level[i];
1607 if (index_run[run] == rl->n)
1609 if (level > max_level[run])
1610 max_level[run] = level;
1611 if (run > max_run[level])
1612 max_run[level] = run;
1614 rl->max_level[last] = av_malloc(MAX_RUN + 1);
1615 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1616 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1617 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1618 rl->index_run[last] = av_malloc(MAX_RUN + 1);
1619 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1623 void init_vlc_rl(RLTable *rl)
1625 init_vlc(&rl->vlc, 9, rl->n + 1,
1626 &rl->table_vlc[0][1], 4, 2,
1627 &rl->table_vlc[0][0], 4, 2);
1632 /* XXX: find a better solution to handle static init */
1633 void h263_decode_init_vlc(MpegEncContext *s)
1635 static int done = 0;
1640 init_vlc(&intra_MCBPC_vlc, 6, 8,
1641 intra_MCBPC_bits, 1, 1,
1642 intra_MCBPC_code, 1, 1);
1643 init_vlc(&inter_MCBPC_vlc, 9, 25,
1644 inter_MCBPC_bits, 1, 1,
1645 inter_MCBPC_code, 1, 1);
1646 init_vlc(&cbpy_vlc, 6, 16,
1647 &cbpy_tab[0][1], 2, 1,
1648 &cbpy_tab[0][0], 2, 1);
1649 init_vlc(&mv_vlc, 9, 33,
1651 &mvtab[0][0], 2, 1);
1654 init_rl(&rl_intra_aic);
1655 init_vlc_rl(&rl_inter);
1656 init_vlc_rl(&rl_intra);
1657 init_vlc_rl(&rl_intra_aic);
1658 init_vlc(&dc_lum, 9, 13,
1659 &DCtab_lum[0][1], 2, 1,
1660 &DCtab_lum[0][0], 2, 1);
1661 init_vlc(&dc_chrom, 9, 13,
1662 &DCtab_chrom[0][1], 2, 1,
1663 &DCtab_chrom[0][0], 2, 1);
1664 init_vlc(&sprite_trajectory, 9, 15,
1665 &sprite_trajectory_tab[0][1], 4, 2,
1666 &sprite_trajectory_tab[0][0], 4, 2);
1667 init_vlc(&mb_type_b_vlc, 4, 4,
1668 &mb_type_b_tab[0][1], 2, 1,
1669 &mb_type_b_tab[0][0], 2, 1);
1673 int h263_decode_gob_header(MpegEncContext *s)
1675 unsigned int val, gfid;
1677 /* Check for GOB Start Code */
1678 val = show_bits(&s->gb, 16);
1680 /* We have a GBSC probably with GSTUFF */
1681 skip_bits(&s->gb, 16); /* Drop the zeros */
1682 while (get_bits1(&s->gb) == 0); /* Seek the '1' bit */
1684 fprintf(stderr,"\nGOB Start Code at MB %d\n", (s->mb_y * s->mb_width) + s->mb_x);
1686 s->gob_number = get_bits(&s->gb, 5); /* GN */
1687 gfid = get_bits(&s->gb, 2); /* GFID */
1688 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
1690 fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", s->gob_number, gfid, s->qscale);
1698 static inline void memsetw(short *tab, int val, int n)
1705 void ff_mpeg4_init_partitions(MpegEncContext *s)
1707 init_put_bits(&s->tex_pb, s->tex_pb_buffer, PB_BUFFER_SIZE, NULL, NULL);
1708 init_put_bits(&s->pb2 , s->pb2_buffer , PB_BUFFER_SIZE, NULL, NULL);
1711 void ff_mpeg4_merge_partitions(MpegEncContext *s)
1713 const int pb2_len = get_bit_count(&s->pb2 );
1714 const int tex_pb_len= get_bit_count(&s->tex_pb);
1715 const int bits= get_bit_count(&s->pb);
1717 if(s->pict_type==I_TYPE){
1718 put_bits(&s->pb, 19, DC_MARKER);
1719 s->misc_bits+=19 + pb2_len + bits - s->last_bits;
1720 s->i_tex_bits+= tex_pb_len;
1722 put_bits(&s->pb, 17, MOTION_MARKER);
1723 s->misc_bits+=17 + pb2_len;;
1724 s->mv_bits+= bits - s->last_bits;
1725 s->p_tex_bits+= tex_pb_len;
1728 flush_put_bits(&s->pb2);
1729 flush_put_bits(&s->tex_pb);
1731 ff_copy_bits(&s->pb, s->pb2_buffer , pb2_len);
1732 ff_copy_bits(&s->pb, s->tex_pb_buffer, tex_pb_len);
1733 s->last_bits= get_bit_count(&s->pb);
1736 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
1738 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
1740 ff_mpeg4_stuffing(&s->pb);
1741 if(s->pict_type==I_TYPE)
1742 put_bits(&s->pb, 16, 0);
1743 else if(s->pict_type==B_TYPE)
1744 put_bits(&s->pb, MAX(MAX(s->f_code, s->b_code)+15, 17), 0);
1746 put_bits(&s->pb, s->f_code+15, 0);
1747 put_bits(&s->pb, 1, 1);
1749 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
1750 put_bits(&s->pb, 5, s->qscale);
1751 put_bits(&s->pb, 1, 0); /* no HEC */
1755 * decodes the next video packet and sets s->next_qscale
1756 * returns mb_num of the next packet or <0 if something went wrong
1758 static int decode_video_packet_header(MpegEncContext *s, GetBitContext *gb)
1761 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
1762 int header_extension=0, mb_num;
1763 //printf("%X\n", show_bits(&gb, 24));
1764 //printf("parse_video_packet_header\n");
1765 // if(show_aligned_bits(gb, 1, 16) != 0) return -1;
1767 /* is there enough space left for a video packet + header */
1768 if( get_bits_count(gb) > gb->size*8-20) return -1;
1770 //printf("resync at %d %d\n", s->mb_x, s->mb_y);
1771 // skip_bits(gb, 1);
1772 // align_get_bits(gb);
1773 if(get_bits(gb, 16)!=0){
1774 printf("internal error while decoding video packet header\n");
1777 //printf("%X\n", show_bits(gb, 24));
1779 while(!get_bits1(gb) && bits<30) bits++;
1780 if((s->pict_type == P_TYPE || s->pict_type == S_TYPE) && bits != s->f_code-1){
1781 printf("marker does not match f_code (is: %d should be: %d pos: %d end %d x: %d y: %d)\n",
1782 bits+1, s->f_code, get_bits_count(gb), gb->size*8, s->mb_x, s->mb_y);
1784 }else if(s->pict_type == I_TYPE && bits != 0){
1785 printf("marker too long\n");
1787 }else if(s->pict_type == B_TYPE && bits != MAX(MAX(s->f_code, s->b_code)-1, 1)){
1788 printf("marker does not match f/b_code\n");
1791 //printf("%X\n", show_bits(gb, 24));
1793 if(s->shape != RECT_SHAPE){
1794 header_extension= get_bits1(gb);
1795 //FIXME more stuff here
1798 mb_num= get_bits(gb, mb_num_bits);
1799 if(mb_num < s->mb_x + s->mb_y*s->mb_width || mb_num>=s->mb_num){
1800 fprintf(stderr, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_x + s->mb_y*s->mb_width);
1804 if(s->shape != BIN_ONLY_SHAPE){
1805 s->next_resync_qscale= get_bits(gb, 5);
1806 if(s->next_resync_qscale==0)
1807 s->next_resync_qscale= s->qscale;
1808 if(s->next_resync_qscale==0){
1809 fprintf(stderr, "qscale==0\n");
1814 if(s->shape == RECT_SHAPE){
1815 header_extension= get_bits1(gb);
1817 if(header_extension){
1820 printf("header extension not supported\n");
1823 while (get_bits1(gb) != 0)
1826 check_marker(gb, "before time_increment in video packed header");
1827 time_increment= get_bits(gb, s->time_increment_bits);
1828 if(s->pict_type!=B_TYPE){
1829 s->last_time_base= s->time_base;
1830 s->time_base+= time_incr;
1831 s->time= s->time_base*s->time_increment_resolution + time_increment;
1832 s->pp_time= s->time - s->last_non_b_time;
1833 s->last_non_b_time= s->time;
1835 s->time= (s->last_time_base + time_incr)*s->time_increment_resolution + time_increment;
1836 s->bp_time= s->last_non_b_time - s->time;
1838 check_marker(gb, "before vop_coding_type in video packed header");
1840 skip_bits(gb, 2); /* vop coding type */
1841 //FIXME not rect stuff here
1843 if(s->shape != BIN_ONLY_SHAPE){
1844 skip_bits(gb, 3); /* intra dc vlc threshold */
1846 if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE && s->num_sprite_warping_points){
1847 mpeg4_decode_sprite_trajectory(s);
1850 //FIXME reduced res stuff here
1852 if (s->pict_type != I_TYPE) {
1853 s->f_code = get_bits(gb, 3); /* fcode_for */
1855 printf("Error, video packet header damaged or not MPEG4 header (f_code=0)\n");
1856 return -1; // makes no sense to continue, as the MV decoding will break very quickly
1859 if (s->pict_type == B_TYPE) {
1860 s->b_code = get_bits(gb, 3);
1864 //FIXME new-pred stuff
1866 //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));
1871 void ff_mpeg4_clean_buffers(MpegEncContext *s)
1873 int c_wrap, c_xy, l_wrap, l_xy;
1875 l_wrap= s->block_wrap[0];
1876 l_xy= s->mb_y*l_wrap*2 + s->mb_x*2;
1877 c_wrap= s->block_wrap[4];
1878 c_xy= s->mb_y*c_wrap + s->mb_x;
1881 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
1882 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
1883 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
1886 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(INT16));
1887 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(INT16));
1888 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(INT16));
1891 // we cant clear the MVs as they might be needed by a b frame
1892 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(INT16));
1893 // memset(s->motion_val, 0, 2*sizeof(INT16)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
1894 s->last_mv[0][0][0]=
1895 s->last_mv[0][0][1]=
1896 s->last_mv[1][0][0]=
1897 s->last_mv[1][0][1]= 0;
1900 /* searches for the next resync marker clears ac,dc,mc, and sets s->next_resync_gb, s->mb_num_left */
1901 int ff_mpeg4_resync(MpegEncContext *s)
1905 /* search & parse next resync marker */
1907 gb= s->next_resync_gb;
1908 align_get_bits(&gb);
1909 //printf("mpeg4_resync %d next:%d \n", get_bits_count(&gb), get_bits_count(&s->next_resync_gb));
1911 int v= show_bits(&gb, 24);
1912 if( get_bits_count(&gb) >= gb.size*8-24 || v == 1 /* start-code */){
1913 s->mb_num_left= s->mb_num - s->mb_x - s->mb_y*s->mb_width;
1914 //printf("mpeg4_resync end\n");
1915 s->gb= s->next_resync_gb; //continue at the next resync marker
1917 }else if(v>>8 == 0){
1919 s->next_resync_pos= get_bits_count(&gb);
1921 next= decode_video_packet_header(s, &gb);
1923 s->mb_num_left= next - s->mb_x - s->mb_y*s->mb_width;
1927 align_get_bits(&gb);
1931 s->next_resync_gb=gb;
1936 static inline void init_block_index(MpegEncContext *s)
1938 s->block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
1939 s->block_index[1]= s->block_wrap[0]*(s->mb_y*2 + 1) + s->mb_x*2;
1940 s->block_index[2]= s->block_wrap[0]*(s->mb_y*2 + 2) - 1 + s->mb_x*2;
1941 s->block_index[3]= s->block_wrap[0]*(s->mb_y*2 + 2) + s->mb_x*2;
1942 s->block_index[4]= s->block_wrap[4]*(s->mb_y + 1) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x;
1943 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;
1946 static inline void update_block_index(MpegEncContext *s)
1948 s->block_index[0]+=2;
1949 s->block_index[1]+=2;
1950 s->block_index[2]+=2;
1951 s->block_index[3]+=2;
1952 s->block_index[4]++;
1953 s->block_index[5]++;
1957 * decodes the first & second partition
1958 * returns error type or 0 if no error
1960 int ff_mpeg4_decode_partitions(MpegEncContext *s)
1962 static const INT8 quant_tab[4] = { -1, -2, 1, 2 };
1965 /* decode first partition */
1967 s->first_slice_line=1;
1968 s->mb_x= s->resync_mb_x;
1969 for(s->mb_y= s->resync_mb_y; mb_num < s->mb_num_left; s->mb_y++){
1970 init_block_index(s);
1971 for(; mb_num < s->mb_num_left && s->mb_x<s->mb_width; s->mb_x++){
1972 const int xy= s->mb_x + s->mb_y*s->mb_width;
1977 update_block_index(s);
1978 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
1979 s->first_slice_line=0;
1981 if(s->mb_x==0) PRINT_MB_TYPE("\n");
1983 if(s->pict_type==I_TYPE){
1987 cbpc = get_vlc(&s->gb, &intra_MCBPC_vlc);
1989 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
1990 return DECODING_DESYNC;
1992 s->cbp_table[xy]= cbpc & 3;
1993 s->mb_type[xy]= MB_TYPE_INTRA;
1997 s->qscale += quant_tab[get_bits(&s->gb, 2)];
2000 else if (s->qscale > 31)
2004 s->qscale_table[xy]= s->qscale;
2006 s->mbintra_table[xy]= 1;
2009 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
2011 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
2012 return DECODING_DESYNC;
2015 if(dc_pred_dir) dir|=1;
2017 s->pred_dir_table[xy]= dir;
2018 }else{ /* P/S_TYPE */
2019 int mx, my, pred_x, pred_y;
2020 INT16 * const mot_val= s->motion_val[s->block_index[0]];
2021 const int stride= s->block_wrap[0]*2;
2023 if(get_bits1(&s->gb)){
2025 s->mb_type[xy]= MB_TYPE_SKIPED;
2026 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2027 const int a= s->sprite_warping_accuracy;
2029 if(s->divx_version==500 && s->divx_build==413){
2030 mx = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
2031 my = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2033 mx = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2034 my = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2035 s->mb_type[xy]= MB_TYPE_GMC | MB_TYPE_SKIPED;
2042 mot_val[0 ]= mot_val[2 ]=
2043 mot_val[0+stride]= mot_val[2+stride]= mx;
2044 mot_val[1 ]= mot_val[3 ]=
2045 mot_val[1+stride]= mot_val[3+stride]= my;
2047 if(s->mbintra_table[xy])
2048 ff_clean_intra_table_entries(s);
2052 cbpc = get_vlc(&s->gb, &inter_MCBPC_vlc);
2054 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
2055 return DECODING_DESYNC;
2059 else if (cbpc == 20)
2060 fprintf(stderr, "Stuffing !");
2061 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
2063 s->mb_intra = ((cbpc & 4) != 0);
2067 s->mbintra_table[xy]= 1;
2068 s->mb_type[xy]= MB_TYPE_INTRA;
2069 mot_val[0 ]= mot_val[2 ]=
2070 mot_val[0+stride]= mot_val[2+stride]= 0;
2071 mot_val[1 ]= mot_val[3 ]=
2072 mot_val[1+stride]= mot_val[3+stride]= 0;
2074 if(s->mbintra_table[xy])
2075 ff_clean_intra_table_entries(s);
2077 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
2078 s->mcsel= get_bits1(&s->gb);
2081 if ((cbpc & 16) == 0) {
2083 /* 16x16 motion prediction */
2084 s->mb_type[xy]= MB_TYPE_INTER;
2086 h263_pred_motion(s, 0, &pred_x, &pred_y);
2088 mx = h263_decode_motion(s, pred_x, s->f_code);
2090 const int a= s->sprite_warping_accuracy;
2091 if(s->divx_version==500 && s->divx_build==413){
2092 mx = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
2094 mx = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2098 return DECODING_DESYNC;
2101 my = h263_decode_motion(s, pred_y, s->f_code);
2103 const int a= s->sprite_warping_accuracy;
2104 if(s->divx_version==500 && s->divx_build==413){
2105 my = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2107 my = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2111 return DECODING_DESYNC;
2112 mot_val[0 ]= mot_val[2 ] =
2113 mot_val[0+stride]= mot_val[2+stride]= mx;
2114 mot_val[1 ]= mot_val[3 ]=
2115 mot_val[1+stride]= mot_val[3+stride]= my;
2119 s->mb_type[xy]= MB_TYPE_INTER4V;
2121 INT16 *mot_val= h263_pred_motion(s, i, &pred_x, &pred_y);
2122 mx = h263_decode_motion(s, pred_x, s->f_code);
2124 return DECODING_DESYNC;
2126 my = h263_decode_motion(s, pred_y, s->f_code);
2128 return DECODING_DESYNC;
2139 if (s->pict_type==I_TYPE && get_bits(&s->gb, 19)!=DC_MARKER ) s->decoding_error= DECODING_DESYNC;
2140 else if(s->pict_type!=I_TYPE && get_bits(&s->gb, 17)!=MOTION_MARKER) s->decoding_error= DECODING_DESYNC;
2141 if(s->decoding_error== DECODING_DESYNC){
2142 fprintf(stderr, "marker missing after first partition at %d %d\n", s->mb_x, s->mb_y);
2143 return DECODING_DESYNC;
2146 /* decode second partition */
2148 s->mb_x= s->resync_mb_x;
2149 for(s->mb_y= s->resync_mb_y; mb_num < s->mb_num_left; s->mb_y++){
2150 init_block_index(s);
2151 for(; mb_num < s->mb_num_left && s->mb_x<s->mb_width; s->mb_x++){
2152 const int xy= s->mb_x + s->mb_y*s->mb_width;
2155 update_block_index(s);
2157 if(s->pict_type==I_TYPE){
2158 int ac_pred= get_bits1(&s->gb);
2159 int cbpy = get_vlc(&s->gb, &cbpy_vlc);
2161 fprintf(stderr, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2162 return DECODING_AC_LOST;
2165 s->cbp_table[xy]|= cbpy<<2;
2166 s->pred_dir_table[xy]|= ac_pred<<7;
2167 }else{ /* P || S_TYPE */
2168 if(s->mb_type[xy]&MB_TYPE_INTRA){
2170 int ac_pred = get_bits1(&s->gb);
2171 int cbpy = get_vlc(&s->gb, &cbpy_vlc);
2174 fprintf(stderr, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2175 return DECODING_ACDC_LOST;
2178 if(s->cbp_table[xy] & 8) {
2179 s->qscale += quant_tab[get_bits(&s->gb, 2)];
2182 else if (s->qscale > 31)
2186 s->qscale_table[xy]= s->qscale;
2190 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
2192 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
2193 return DECODING_ACDC_LOST;
2196 if(dc_pred_dir) dir|=1;
2198 s->cbp_table[xy]&= 3; //remove dquant
2199 s->cbp_table[xy]|= cbpy<<2;
2200 s->pred_dir_table[xy]= dir | (ac_pred<<7);
2201 }else if(s->mb_type[xy]&MB_TYPE_SKIPED){
2202 s->qscale_table[xy]= s->qscale;
2203 s->cbp_table[xy]= 0;
2205 int cbpy = get_vlc(&s->gb, &cbpy_vlc);
2208 fprintf(stderr, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2209 return DECODING_ACDC_LOST;
2212 if(s->cbp_table[xy] & 8) {
2213 //fprintf(stderr, "dquant\n");
2214 s->qscale += quant_tab[get_bits(&s->gb, 2)];
2217 else if (s->qscale > 31)
2221 s->qscale_table[xy]= s->qscale;
2223 s->cbp_table[xy]&= 3; //remove dquant
2224 s->cbp_table[xy]|= (cbpy^0xf)<<2;
2235 static int mpeg4_decode_partitioned_mb(MpegEncContext *s,
2236 DCTELEM block[6][64])
2239 const int xy= s->mb_x + s->mb_y*s->mb_width;
2241 if(s->mb_x==s->resync_mb_x && s->mb_y==s->resync_mb_y){ //Note resync_mb_{x,y}==0 at the start
2243 int block_index_backup[6];
2244 int qscale= s->qscale;
2246 for(i=0; i<6; i++) block_index_backup[i]= s->block_index[i];
2248 s->decoding_error= ff_mpeg4_decode_partitions(s);
2250 for(i=0; i<6; i++) s->block_index[i]= block_index_backup[i];
2251 s->first_slice_line=1;
2252 s->mb_x= s->resync_mb_x;
2253 s->mb_y= s->resync_mb_y;
2257 if(s->decoding_error==DECODING_DESYNC) return -1;
2260 mb_type= s->mb_type[xy];
2261 if(s->decoding_error)
2264 cbp = s->cbp_table[xy];
2266 if(s->decoding_error!=DECODING_ACDC_LOST && s->qscale_table[xy] != s->qscale){
2267 s->qscale= s->qscale_table[xy];
2271 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
2274 s->mv[0][i][0] = s->motion_val[ s->block_index[i] ][0];
2275 s->mv[0][i][1] = s->motion_val[ s->block_index[i] ][1];
2277 s->mb_intra = mb_type&MB_TYPE_INTRA;
2279 if (mb_type&MB_TYPE_SKIPED) {
2282 s->block_last_index[i] = -1;
2283 s->mv_dir = MV_DIR_FORWARD;
2284 s->mv_type = MV_TYPE_16X16;
2285 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2293 }else if(s->mb_intra && s->decoding_error!=DECODING_ACDC_LOST){
2294 s->ac_pred = s->pred_dir_table[xy]>>7;
2296 /* decode each block */
2297 for (i = 0; i < 6; i++) {
2298 int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1);
2299 if(ret==DECODING_AC_LOST){
2300 fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y);
2301 s->decoding_error=DECODING_AC_LOST;
2303 }else if(ret==DECODING_ACDC_LOST){
2304 fprintf(stderr, "dc corrupted at %d %d (trying to continue with mc only)\n", s->mb_x, s->mb_y);
2305 s->decoding_error=DECODING_ACDC_LOST;
2309 }else if(!s->mb_intra){
2310 // s->mcsel= 0; //FIXME do we need to init that
2312 s->mv_dir = MV_DIR_FORWARD;
2313 if (mb_type&MB_TYPE_INTER4V) {
2314 s->mv_type = MV_TYPE_8X8;
2316 s->mv_type = MV_TYPE_16X16;
2318 if(s->decoding_error==0 && cbp){
2319 /* decode each block */
2320 for (i = 0; i < 6; i++) {
2321 int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1);
2322 if(ret==DECODING_AC_LOST){
2323 fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y);
2324 s->decoding_error=DECODING_AC_LOST;
2330 } else { /* I-Frame */
2333 s->ac_pred = s->pred_dir_table[xy]>>7;
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 dc only)\n", s->mb_x, s->mb_y);
2340 s->decoding_error=DECODING_AC_LOST;
2342 }else if(ret==DECODING_ACDC_LOST){
2343 fprintf(stderr, "dc corrupted at %d %d\n", s->mb_x, s->mb_y);
2353 int h263_decode_mb(MpegEncContext *s,
2354 DCTELEM block[6][64])
2356 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
2358 static INT8 quant_tab[4] = { -1, -2, 1, 2 };
2360 if(s->mb_x==0) PRINT_MB_TYPE("\n");
2362 if(s->resync_marker){
2363 if(s->resync_mb_x == s->mb_x && s->resync_mb_y+1 == s->mb_y){
2364 s->first_slice_line=0;
2368 if(s->data_partitioning && s->pict_type!=B_TYPE)
2369 return mpeg4_decode_partitioned_mb(s, block);
2371 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
2372 if (get_bits1(&s->gb)) {
2376 s->block_last_index[i] = -1;
2377 s->mv_dir = MV_DIR_FORWARD;
2378 s->mv_type = MV_TYPE_16X16;
2379 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2380 const int a= s->sprite_warping_accuracy;
2381 // int l = (1 << (s->f_code - 1)) * 32;
2384 if(s->divx_version==500 && s->divx_build==413){
2385 s->mv[0][0][0] = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
2386 s->mv[0][0][1] = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2388 s->mv[0][0][0] = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2389 s->mv[0][0][1] = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2391 /* if (s->mv[0][0][0] < -l) s->mv[0][0][0]= -l;
2392 else if (s->mv[0][0][0] >= l) s->mv[0][0][0]= l-1;
2393 if (s->mv[0][0][1] < -l) s->mv[0][0][1]= -l;
2394 else if (s->mv[0][0][1] >= l) s->mv[0][0][1]= l-1;*/
2406 cbpc = get_vlc(&s->gb, &inter_MCBPC_vlc);
2407 //fprintf(stderr, "\tCBPC: %d", cbpc);
2412 else if (cbpc == 20)
2413 fprintf(stderr, "Stuffing !");
2416 s->mb_intra = ((cbpc & 4) != 0);
2417 if (s->mb_intra) goto intra;
2419 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
2420 s->mcsel= get_bits1(&s->gb);
2422 cbpy = get_vlc(&s->gb, &cbpy_vlc);
2423 cbp = (cbpc & 3) | ((cbpy ^ 0xf) << 2);
2425 s->qscale += quant_tab[get_bits(&s->gb, 2)];
2428 else if (s->qscale > 31)
2432 s->mv_dir = MV_DIR_FORWARD;
2433 if ((cbpc & 16) == 0) {
2435 /* 16x16 motion prediction */
2436 s->mv_type = MV_TYPE_16X16;
2437 h263_pred_motion(s, 0, &pred_x, &pred_y);
2439 mx = h263p_decode_umotion(s, pred_x);
2441 mx = h263_decode_motion(s, pred_x, s->f_code);
2443 const int a= s->sprite_warping_accuracy;
2444 // int l = (1 << (s->f_code - 1)) * 32;
2445 if(s->divx_version==500 && s->divx_build==413){
2446 mx = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
2448 mx = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2450 // if (mx < -l) mx= -l, printf("C");
2451 // else if (mx >= l) mx= l-1, printf("C");
2457 my = h263p_decode_umotion(s, pred_y);
2459 my = h263_decode_motion(s, pred_y, s->f_code);
2461 const int a= s->sprite_warping_accuracy;
2462 // int l = (1 << (s->f_code - 1)) * 32;
2463 if(s->divx_version==500 && s->divx_build==413){
2464 my = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2466 my = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2468 // if (my < -l) my= -l, printf("C");
2469 // else if (my >= l) my= l-1, printf("C");
2473 s->mv[0][0][0] = mx;
2474 s->mv[0][0][1] = my;
2475 /*fprintf(stderr, "\n MB %d", (s->mb_y * s->mb_width) + s->mb_x);
2476 fprintf(stderr, "\n\tmvx: %d\t\tpredx: %d", mx, pred_x);
2477 fprintf(stderr, "\n\tmvy: %d\t\tpredy: %d", my, pred_y);*/
2478 if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
2479 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
2483 s->mv_type = MV_TYPE_8X8;
2485 mot_val = h263_pred_motion(s, i, &pred_x, &pred_y);
2487 mx = h263p_decode_umotion(s, pred_x);
2489 mx = h263_decode_motion(s, pred_x, s->f_code);
2494 my = h263p_decode_umotion(s, pred_y);
2496 my = h263_decode_motion(s, pred_y, s->f_code);
2499 s->mv[0][i][0] = mx;
2500 s->mv[0][i][1] = my;
2501 if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
2502 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
2507 } else if(s->pict_type==B_TYPE) {
2508 int modb1; // first bit of modb
2509 int modb2; // second bit of modb
2515 s->mb_intra = 0; //B-frames never contain intra blocks
2516 s->mcsel=0; // ... true gmc blocks
2519 s->last_mv[0][0][0]=
2520 s->last_mv[0][0][1]=
2521 s->last_mv[1][0][0]=
2522 s->last_mv[1][0][1]= 0;
2525 /* if we skipped it in the future P Frame than skip it now too */
2526 s->mb_skiped= s->mbskip_table[s->mb_y * s->mb_width + s->mb_x]; // Note, skiptab=0 if last was GMC
2531 s->block_last_index[i] = -1;
2533 s->mv_dir = MV_DIR_FORWARD;
2534 s->mv_type = MV_TYPE_16X16;
2539 //FIXME is this correct?
2540 /* s->last_mv[0][0][0]=
2541 s->last_mv[0][0][1]=0;*/
2546 modb1= get_bits1(&s->gb);
2548 modb2= get_bits1(&s->gb);
2549 mb_type= get_vlc(&s->gb, &mb_type_b_vlc);
2550 if(modb2==0) cbp= get_bits(&s->gb, 6);
2552 if (mb_type && cbp) {
2553 if(get_bits1(&s->gb)){
2554 s->qscale +=get_bits1(&s->gb)*4 - 2;
2557 else if (s->qscale > 31)
2563 mb_type=4; //like 0 but no vectors coded
2566 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
2567 mx=my=0; //for case 4, we could put this to the mb_type=4 but than gcc compains about uninitalized mx/my
2570 case 0: /* direct */
2571 mx = h263_decode_motion(s, 0, 1);
2572 my = h263_decode_motion(s, 0, 1);
2573 case 4: /* direct with mx=my=0 */
2574 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2575 xy= s->block_index[0];
2576 time_pp= s->pp_time;
2577 time_pb= time_pp - s->bp_time;
2578 //if(time_pp>3000 )printf("%d %d ", time_pp, time_pb);
2580 //FIXME avoid divides
2581 s->mv[0][0][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
2582 s->mv[0][0][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
2583 s->mv[1][0][0] = mx ? s->mv[0][0][0] - s->motion_val[xy][0]
2584 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp + mx;
2585 s->mv[1][0][1] = my ? s->mv[0][0][1] - s->motion_val[xy][1]
2586 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp + my;
2590 s->mv[1][0][1] = 1000;*/
2594 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2595 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
2596 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
2597 s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
2598 s->last_mv[0][0][1]= s->mv[0][0][1] = my;
2600 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
2601 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
2602 s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
2603 s->last_mv[1][0][1]= s->mv[1][0][1] = my;
2607 s->mv_dir = MV_DIR_BACKWARD;
2608 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
2609 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
2610 s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
2611 s->last_mv[1][0][1]= s->mv[1][0][1] = my;
2615 s->mv_dir = MV_DIR_FORWARD;
2616 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
2617 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
2618 s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
2619 s->last_mv[0][0][1]= s->mv[0][0][1] = my;
2623 printf("illegal MB_type\n");
2626 } else { /* I-Frame */
2627 cbpc = get_vlc(&s->gb, &intra_MCBPC_vlc);
2635 if (s->h263_pred || s->h263_aic) {
2636 s->ac_pred = get_bits1(&s->gb);
2637 if (s->ac_pred && s->h263_aic)
2638 s->h263_aic_dir = get_bits1(&s->gb);
2640 cbpy = get_vlc(&s->gb, &cbpy_vlc);
2641 if(cbpy<0) return -1;
2642 cbp = (cbpc & 3) | (cbpy << 2);
2644 s->qscale += quant_tab[get_bits(&s->gb, 2)];
2647 else if (s->qscale > 31)
2653 /* decode each block */
2655 for (i = 0; i < 6; i++) {
2656 if (mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
2660 for (i = 0; i < 6; i++) {
2661 if (h263_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
2668 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
2670 int code, val, sign, shift, l, m;
2672 code = get_vlc(&s->gb, &mv_vlc);
2678 sign = get_bits1(&s->gb);
2680 val = (code - 1) << shift;
2682 val |= get_bits(&s->gb, shift);
2688 /* modulo decoding */
2689 if (!s->h263_long_vectors) {
2690 l = (1 << (f_code - 1)) * 32;
2694 } else if (val >= l) {
2698 /* horrible h263 long vector mode */
2699 if (pred < -31 && val < -63)
2701 if (pred > 32 && val > 63)
2708 /* Decodes RVLC of H.263+ UMV */
2709 static int h263p_decode_umotion(MpegEncContext * s, int pred)
2713 if (get_bits1(&s->gb)) /* Motion difference = 0 */
2716 code = 2 + get_bits1(&s->gb);
2718 while (get_bits1(&s->gb))
2721 code += get_bits1(&s->gb);
2726 code = (sign) ? (pred - code) : (pred + code);
2728 fprintf(stderr,"H.263+ UMV Motion = %d\n", code);
2734 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
2737 int code, level, i, j, last, run;
2738 RLTable *rl = &rl_inter;
2739 const UINT8 *scan_table;
2741 scan_table = zigzag_direct;
2742 if (s->h263_aic && s->mb_intra) {
2746 if (s->h263_aic_dir)
2747 scan_table = ff_alternate_vertical_scan; /* left */
2749 scan_table = ff_alternate_horizontal_scan; /* top */
2751 } else if (s->mb_intra) {
2753 if (s->h263_rv10 && s->rv10_version == 3 && s->pict_type == I_TYPE) {
2754 int component, diff;
2755 component = (n <= 3 ? 0 : n - 4 + 1);
2756 level = s->last_dc[component];
2757 if (s->rv10_first_dc_coded[component]) {
2758 diff = rv_decode_dc(s, n);
2762 level = level & 0xff; /* handle wrap round */
2763 s->last_dc[component] = level;
2765 s->rv10_first_dc_coded[component] = 1;
2768 level = get_bits(&s->gb, 8);
2778 if (s->mb_intra && s->h263_aic)
2780 s->block_last_index[n] = i - 1;
2785 code = get_vlc(&s->gb, &rl->vlc);
2788 if (code == rl->n) {
2790 last = get_bits1(&s->gb);
2791 run = get_bits(&s->gb, 6);
2792 level = (INT8)get_bits(&s->gb, 8);
2793 if (s->h263_rv10 && level == -128) {
2794 /* XXX: should patch encoder too */
2795 level = get_bits(&s->gb, 12);
2796 level = (level << 20) >> 20;
2799 run = rl->table_run[code];
2800 level = rl->table_level[code];
2801 last = code >= rl->last;
2802 if (get_bits1(&s->gb))
2815 if (s->mb_intra && s->h263_aic) {
2816 h263_pred_acdc(s, block, n);
2819 s->block_last_index[n] = i;
2823 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
2825 int level, pred, code;
2829 code = get_vlc(&s->gb, &dc_lum);
2831 code = get_vlc(&s->gb, &dc_chrom);
2832 if (code < 0 || code > 9 /* && s->nbit<9 */){
2833 fprintf(stderr, "illegal dc vlc\n");
2839 level = get_bits(&s->gb, code);
2840 if ((level >> (code - 1)) == 0) /* if MSB not set it is negative*/
2841 level = - (level ^ ((1 << code) - 1));
2843 if(get_bits1(&s->gb)==0){ /* marker */
2844 fprintf(stderr, "dc marker bit missing\n");
2850 pred = ff_mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
2855 *dc_val = level * s->y_dc_scale;
2857 *dc_val = level * s->c_dc_scale;
2864 * returns 0 if everything went ok
2865 * returns DECODING_AC_LOST if an error was detected during AC decoding
2866 * returns DECODING_ACDC_LOST if an error was detected during DC decoding
2868 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
2871 int code, level, i, j, last, run;
2874 const UINT8 *scan_table;
2878 if(s->data_partitioning && s->pict_type!=B_TYPE){
2879 level = s->dc_val[0][ s->block_index[n] ];
2880 if(n<4) level= (level + (s->y_dc_scale>>1))/s->y_dc_scale; //FIXME optimizs
2881 else level= (level + (s->c_dc_scale>>1))/s->c_dc_scale;
2882 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_width]<<n)&32;
2884 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
2886 return DECODING_ACDC_LOST;
2894 if (dc_pred_dir == 0)
2895 scan_table = ff_alternate_vertical_scan; /* left */
2897 scan_table = ff_alternate_horizontal_scan; /* top */
2899 scan_table = zigzag_direct;
2904 s->block_last_index[n] = i - 1;
2908 scan_table = zigzag_direct;
2912 code = get_vlc(&s->gb, &rl->vlc);
2914 return DECODING_AC_LOST;
2915 if (code == rl->n) {
2917 if (get_bits1(&s->gb) != 0) {
2918 if (get_bits1(&s->gb) != 0) {
2920 last = get_bits1(&s->gb);
2921 run = get_bits(&s->gb, 6);
2922 if(get_bits1(&s->gb)==0){
2923 fprintf(stderr, "1. marker bit missing in 3. esc\n");
2924 return DECODING_AC_LOST;
2926 level = get_bits(&s->gb, 12);
2927 level = (level << 20) >> 20; /* sign extend */
2928 if(get_bits1(&s->gb)==0){
2929 fprintf(stderr, "2. marker bit missing in 3. esc\n");
2930 return DECODING_AC_LOST;
2932 if(level>512 || level<-512){ //FIXME check that QP=1 is ok with this too
2933 fprintf(stderr, "|level| overflow in 3. esc\n");
2934 return DECODING_AC_LOST;
2938 const int abs_level= ABS(level);
2939 if(abs_level<=MAX_LEVEL && run<=MAX_RUN && s->error_resilience>=0){
2940 const int run1= run - rl->max_run[last][abs_level] - 1;
2941 if(abs_level <= rl->max_level[last][run]){
2942 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
2943 return DECODING_AC_LOST;
2945 if(abs_level <= rl->max_level[last][run]*2){
2946 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
2947 return DECODING_AC_LOST;
2949 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
2950 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
2951 return DECODING_AC_LOST;
2958 code = get_vlc(&s->gb, &rl->vlc);
2959 if (code < 0 || code >= rl->n)
2960 return DECODING_AC_LOST;
2961 run = rl->table_run[code];
2962 level = rl->table_level[code];
2963 last = code >= rl->last;
2964 run += rl->max_run[last][level] + 1;
2965 if (get_bits1(&s->gb))
2970 code = get_vlc(&s->gb, &rl->vlc);
2971 if (code < 0 || code >= rl->n)
2972 return DECODING_AC_LOST;
2973 run = rl->table_run[code];
2974 level = rl->table_level[code];
2975 last = code >= rl->last;
2976 level += rl->max_level[last][run];
2977 if (get_bits1(&s->gb))
2981 run = rl->table_run[code];
2982 level = rl->table_level[code];
2983 last = code >= rl->last;
2984 if (get_bits1(&s->gb))
2989 return DECODING_AC_LOST;
2998 mpeg4_pred_ac(s, block, n, dc_pred_dir);
3000 i = 64; /* XXX: not optimal */
3003 s->block_last_index[n] = i - 1;
3007 /* most is hardcoded. should extend to handle all h263 streams */
3008 int h263_decode_picture_header(MpegEncContext *s)
3010 int format, width, height;
3012 /* picture start code */
3013 if (get_bits(&s->gb, 22) != 0x20) {
3014 fprintf(stderr, "Bad picture start code\n");
3017 /* temporal reference */
3018 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
3020 /* PTYPE starts here */
3021 if (get_bits1(&s->gb) != 1) {
3023 fprintf(stderr, "Bad marker\n");
3026 if (get_bits1(&s->gb) != 0) {
3027 fprintf(stderr, "Bad H263 id\n");
3028 return -1; /* h263 id */
3030 skip_bits1(&s->gb); /* split screen off */
3031 skip_bits1(&s->gb); /* camera off */
3032 skip_bits1(&s->gb); /* freeze picture release off */
3034 /* Reset GOB number */
3037 format = get_bits(&s->gb, 3);
3042 7 extended PTYPE (PLUSPTYPE)
3045 if (format != 7 && format != 6) {
3048 width = h263_format[format][0];
3049 height = h263_format[format][1];
3055 s->pict_type = I_TYPE + get_bits1(&s->gb);
3057 s->unrestricted_mv = get_bits1(&s->gb);
3058 s->h263_long_vectors = s->unrestricted_mv;
3060 if (get_bits1(&s->gb) != 0) {
3061 fprintf(stderr, "H263 SAC not supported\n");
3062 return -1; /* SAC: off */
3064 if (get_bits1(&s->gb) != 0) {
3065 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
3068 if (get_bits1(&s->gb) != 0) {
3069 fprintf(stderr, "H263 PB frame not supported\n");
3070 return -1; /* not PB frame */
3072 s->qscale = get_bits(&s->gb, 5);
3073 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
3079 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
3081 /* ufep other than 0 and 1 are reserved */
3084 format = get_bits(&s->gb, 3);
3085 dprintf("ufep=1, format: %d\n", format);
3086 skip_bits(&s->gb,1); /* Custom PCF */
3087 s->umvplus_dec = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */
3088 skip_bits1(&s->gb); /* Syntax-based Arithmetic Coding (SAC) */
3089 if (get_bits1(&s->gb) != 0) {
3090 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
3092 if (get_bits1(&s->gb) != 0) { /* Advanced Intra Coding (AIC) */
3096 skip_bits(&s->gb, 7);
3097 /* these are the 7 bits: (in order of appearence */
3098 /* Deblocking Filter */
3099 /* Slice Structured */
3100 /* Reference Picture Selection */
3101 /* Independent Segment Decoding */
3102 /* Alternative Inter VLC */
3103 /* Modified Quantization */
3104 /* Prevent start code emulation */
3106 skip_bits(&s->gb, 3); /* Reserved */
3107 } else if (ufep != 0) {
3108 fprintf(stderr, "Bad UFEP type (%d)\n", ufep);
3113 s->pict_type = get_bits(&s->gb, 3) + I_TYPE;
3114 dprintf("pict_type: %d\n", s->pict_type);
3115 if (s->pict_type != I_TYPE &&
3116 s->pict_type != P_TYPE)
3118 skip_bits(&s->gb, 2);
3119 s->no_rounding = get_bits1(&s->gb);
3120 dprintf("RTYPE: %d\n", s->no_rounding);
3121 skip_bits(&s->gb, 4);
3123 /* Get the picture dimensions */
3126 /* Custom Picture Format (CPFMT) */
3127 s->aspect_ratio_info = get_bits(&s->gb, 4);
3128 dprintf("aspect: %d\n", s->aspect_ratio_info);
3133 3 - 10:11 (525-type 4:3)
3134 4 - 16:11 (CIF 16:9)
3135 5 - 40:33 (525-type 16:9)
3138 width = (get_bits(&s->gb, 9) + 1) * 4;
3140 height = get_bits(&s->gb, 9) * 4;
3141 dprintf("\nH.263+ Custom picture: %dx%d\n",width,height);
3142 if (s->aspect_ratio_info == EXTENDED_PAR) {
3143 /* aspected dimensions */
3144 skip_bits(&s->gb, 8); /* width */
3145 skip_bits(&s->gb, 8); /* height */
3148 width = h263_format[format][0];
3149 height = h263_format[format][1];
3151 if ((width == 0) || (height == 0))
3155 if (s->umvplus_dec) {
3156 skip_bits1(&s->gb); /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
3160 s->qscale = get_bits(&s->gb, 5);
3163 while (get_bits1(&s->gb) != 0) {
3164 skip_bits(&s->gb, 8);
3169 s->y_dc_scale_table=
3170 s->c_dc_scale_table= h263_aic_dc_scale_table;
3172 s->y_dc_scale_table=
3173 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
3179 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s)
3182 int a= 2<<s->sprite_warping_accuracy;
3183 int rho= 3-s->sprite_warping_accuracy;
3185 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
3186 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
3187 int sprite_ref[4][2];
3188 int virtual_ref[2][2];
3190 int alpha=0, beta=0;
3193 //printf("SP %d\n", s->sprite_warping_accuracy);
3194 for(i=0; i<s->num_sprite_warping_points; i++){
3198 length= get_vlc(&s->gb, &sprite_trajectory);
3200 x= get_bits(&s->gb, length);
3201 //printf("lx %d %d\n", length, x);
3202 if ((x >> (length - 1)) == 0) /* if MSB not set it is negative*/
3203 x = - (x ^ ((1 << length) - 1));
3205 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(&s->gb); /* marker bit */
3207 length= get_vlc(&s->gb, &sprite_trajectory);
3209 y=get_bits(&s->gb, length);
3210 //printf("ly %d %d\n", length, y);
3211 if ((y >> (length - 1)) == 0) /* if MSB not set it is negative*/
3212 y = - (y ^ ((1 << length) - 1));
3214 skip_bits1(&s->gb); /* marker bit */
3215 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
3216 //if(i>0 && (x!=0 || y!=0)) printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n");
3222 while((1<<alpha)<w) alpha++;
3223 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
3227 // Note, the 4th point isnt used for GMC
3228 if(s->divx_version==500 && s->divx_build==413){
3229 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
3230 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
3231 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
3232 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
3233 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
3234 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
3236 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
3237 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
3238 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
3239 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
3240 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
3241 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
3243 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
3244 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
3246 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
3247 // perhaps it should be reordered to be more readable ...
3248 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
3249 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
3250 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
3251 + 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);
3252 virtual_ref[0][1]= 16*vop_ref[0][1]
3253 + 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);
3254 virtual_ref[1][0]= 16*vop_ref[0][0]
3255 + 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);
3256 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
3257 + 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);
3259 switch(s->num_sprite_warping_points)
3262 s->sprite_offset[0][0]= 0;
3263 s->sprite_offset[0][1]= 0;
3264 s->sprite_offset[1][0]= 0;
3265 s->sprite_offset[1][1]= 0;
3266 s->sprite_delta[0][0][0]= a;
3267 s->sprite_delta[0][0][1]= 0;
3268 s->sprite_delta[0][1][0]= 0;
3269 s->sprite_delta[0][1][1]= a;
3270 s->sprite_delta[1][0][0]= a;
3271 s->sprite_delta[1][0][1]= 0;
3272 s->sprite_delta[1][1][0]= 0;
3273 s->sprite_delta[1][1][1]= a;
3274 s->sprite_shift[0][0]= 0;
3275 s->sprite_shift[0][1]= 0;
3276 s->sprite_shift[1][0]= 0;
3277 s->sprite_shift[1][1]= 0;
3280 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
3281 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
3282 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
3283 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
3284 s->sprite_delta[0][0][0]= a;
3285 s->sprite_delta[0][0][1]= 0;
3286 s->sprite_delta[0][1][0]= 0;
3287 s->sprite_delta[0][1][1]= a;
3288 s->sprite_delta[1][0][0]= a;
3289 s->sprite_delta[1][0][1]= 0;
3290 s->sprite_delta[1][1][0]= 0;
3291 s->sprite_delta[1][1][1]= a;
3292 s->sprite_shift[0][0]= 0;
3293 s->sprite_shift[0][1]= 0;
3294 s->sprite_shift[1][0]= 0;
3295 s->sprite_shift[1][1]= 0;
3299 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
3300 + ((-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
3301 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1]));
3302 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
3303 + ((-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
3304 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1]));
3305 s->sprite_offset[1][0]= ((-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
3306 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
3307 +2*w2*r*sprite_ref[0][0] - 16*w2);
3308 s->sprite_offset[1][1]= ((-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
3309 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
3310 +2*w2*r*sprite_ref[0][1] - 16*w2);
3311 s->sprite_delta[0][0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
3312 s->sprite_delta[0][0][1]= ( r*sprite_ref[0][1] - virtual_ref[0][1]);
3313 s->sprite_delta[0][1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
3314 s->sprite_delta[0][1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
3315 s->sprite_delta[1][0][0]= 4*(-r*sprite_ref[0][0] + virtual_ref[0][0]);
3316 s->sprite_delta[1][0][1]= 4*( r*sprite_ref[0][1] - virtual_ref[0][1]);
3317 s->sprite_delta[1][1][0]= 4*(-r*sprite_ref[0][1] + virtual_ref[0][1]);
3318 s->sprite_delta[1][1][1]= 4*(-r*sprite_ref[0][0] + virtual_ref[0][0]);
3319 s->sprite_shift[0][0]= alpha+rho;
3320 s->sprite_shift[0][1]= alpha+rho;
3321 s->sprite_shift[1][0]= alpha+rho+2;
3322 s->sprite_shift[1][1]= alpha+rho+2;
3327 /*printf("%d %d\n", s->sprite_delta[0][0][0], a<<s->sprite_shift[0][0]);
3328 printf("%d %d\n", s->sprite_delta[0][0][1], 0);
3329 printf("%d %d\n", s->sprite_delta[0][1][0], 0);
3330 printf("%d %d\n", s->sprite_delta[0][1][1], a<<s->sprite_shift[0][1]);
3331 printf("%d %d\n", s->sprite_delta[1][0][0], a<<s->sprite_shift[1][0]);
3332 printf("%d %d\n", s->sprite_delta[1][0][1], 0);
3333 printf("%d %d\n", s->sprite_delta[1][1][0], 0);
3334 printf("%d %d\n", s->sprite_delta[1][1][1], a<<s->sprite_shift[1][1]);*/
3335 /* try to simplify the situation */
3336 if( s->sprite_delta[0][0][0] == a<<s->sprite_shift[0][0]
3337 && s->sprite_delta[0][0][1] == 0
3338 && s->sprite_delta[0][1][0] == 0
3339 && s->sprite_delta[0][1][1] == a<<s->sprite_shift[0][1]
3340 && s->sprite_delta[1][0][0] == a<<s->sprite_shift[1][0]
3341 && s->sprite_delta[1][0][1] == 0
3342 && s->sprite_delta[1][1][0] == 0
3343 && s->sprite_delta[1][1][1] == a<<s->sprite_shift[1][1])
3345 s->sprite_offset[0][0]>>=s->sprite_shift[0][0];
3346 s->sprite_offset[0][1]>>=s->sprite_shift[0][1];
3347 s->sprite_offset[1][0]>>=s->sprite_shift[1][0];
3348 s->sprite_offset[1][1]>>=s->sprite_shift[1][1];
3349 s->sprite_delta[0][0][0]= a;
3350 s->sprite_delta[0][0][1]= 0;
3351 s->sprite_delta[0][1][0]= 0;
3352 s->sprite_delta[0][1][1]= a;
3353 s->sprite_delta[1][0][0]= a;
3354 s->sprite_delta[1][0][1]= 0;
3355 s->sprite_delta[1][1][0]= 0;
3356 s->sprite_delta[1][1][1]= a;
3357 s->sprite_shift[0][0]= 0;
3358 s->sprite_shift[0][1]= 0;
3359 s->sprite_shift[1][0]= 0;
3360 s->sprite_shift[1][1]= 0;
3361 s->real_sprite_warping_points=1;
3364 s->real_sprite_warping_points= s->num_sprite_warping_points;
3366 //printf("%d %d %d %d\n", d[0][0], d[0][1], s->sprite_offset[0][0], s->sprite_offset[0][1]);
3369 /* decode mpeg4 VOP header */
3370 int mpeg4_decode_picture_header(MpegEncContext * s)
3372 int time_incr, startcode, state, v;
3376 /* search next start code */
3377 align_get_bits(&s->gb);
3380 v = get_bits(&s->gb, 8);
3381 if (state == 0x000001) {
3382 state = ((state << 8) | v) & 0xffffff;
3386 state = ((state << 8) | v) & 0xffffff;
3387 if( get_bits_count(&s->gb) > s->gb.size*8-32){
3389 printf("no VOP startcode found, frame size was=%d\n", s->gb.size);
3392 printf("frame skip\n");
3393 return FRAME_SKIPED;
3397 //printf("startcode %X %d\n", startcode, get_bits_count(&s->gb));
3398 if (startcode == 0x120) { // Video Object Layer
3399 int width, height, vo_ver_id;
3402 skip_bits(&s->gb, 1); /* random access */
3403 s->vo_type= get_bits(&s->gb, 8);
3404 if (get_bits1(&s->gb) != 0) { /* is_ol_id */
3405 vo_ver_id = get_bits(&s->gb, 4); /* vo_ver_id */
3406 skip_bits(&s->gb, 3); /* vo_priority */
3410 //printf("vo type:%d\n",s->vo_type);
3411 s->aspect_ratio_info= get_bits(&s->gb, 4);
3412 if(s->aspect_ratio_info == EXTENDED_PAR){
3413 skip_bits(&s->gb, 8); //par_width
3414 skip_bits(&s->gb, 8); // par_height
3417 if ((s->vol_control_parameters=get_bits1(&s->gb))) { /* vol control parameter */
3418 int chroma_format= get_bits(&s->gb, 2);
3419 if(chroma_format!=1){
3420 printf("illegal chroma format\n");
3422 s->low_delay= get_bits1(&s->gb);
3423 if(get_bits1(&s->gb)){ /* vbv parameters */
3424 printf("vbv parameters not supported\n");
3431 s->shape = get_bits(&s->gb, 2); /* vol shape */
3432 if(s->shape != RECT_SHAPE) printf("only rectangular vol supported\n");
3433 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
3434 printf("Gray shape not supported\n");
3435 skip_bits(&s->gb, 4); //video_object_layer_shape_extension
3438 skip_bits1(&s->gb); /* marker */
3440 s->time_increment_resolution = get_bits(&s->gb, 16);
3441 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
3442 if (s->time_increment_bits < 1)
3443 s->time_increment_bits = 1;
3444 skip_bits1(&s->gb); /* marker */
3446 if (get_bits1(&s->gb) != 0) { /* fixed_vop_rate */
3447 skip_bits(&s->gb, s->time_increment_bits);
3450 if (s->shape != BIN_ONLY_SHAPE) {
3451 if (s->shape == RECT_SHAPE) {
3452 skip_bits1(&s->gb); /* marker */
3453 width = get_bits(&s->gb, 13);
3454 skip_bits1(&s->gb); /* marker */
3455 height = get_bits(&s->gb, 13);
3456 skip_bits1(&s->gb); /* marker */
3457 if(width && height){ /* they should be non zero but who knows ... */
3460 // printf("width/height: %d %d\n", width, height);
3464 if(get_bits1(&s->gb)) printf("interlaced not supported\n"); /* interlaced */
3465 if(!get_bits1(&s->gb)) printf("OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */
3466 if (vo_ver_id == 1) {
3467 s->vol_sprite_usage = get_bits1(&s->gb); /* vol_sprite_usage */
3469 s->vol_sprite_usage = get_bits(&s->gb, 2); /* vol_sprite_usage */
3471 if(s->vol_sprite_usage==STATIC_SPRITE) printf("Static Sprites not supported\n");
3472 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
3473 if(s->vol_sprite_usage==STATIC_SPRITE){
3474 s->sprite_width = get_bits(&s->gb, 13);
3475 skip_bits1(&s->gb); /* marker */
3476 s->sprite_height= get_bits(&s->gb, 13);
3477 skip_bits1(&s->gb); /* marker */
3478 s->sprite_left = get_bits(&s->gb, 13);
3479 skip_bits1(&s->gb); /* marker */
3480 s->sprite_top = get_bits(&s->gb, 13);
3481 skip_bits1(&s->gb); /* marker */
3483 s->num_sprite_warping_points= get_bits(&s->gb, 6);
3484 s->sprite_warping_accuracy = get_bits(&s->gb, 2);
3485 s->sprite_brightness_change= get_bits1(&s->gb);
3486 if(s->vol_sprite_usage==STATIC_SPRITE)
3487 s->low_latency_sprite= get_bits1(&s->gb);
3489 // FIXME sadct disable bit if verid!=1 && shape not rect
3491 if (get_bits1(&s->gb) == 1) { /* not_8_bit */
3492 s->quant_precision = get_bits(&s->gb, 4); /* quant_precision */
3493 if(get_bits(&s->gb, 4)!=8) printf("N-bit not supported\n"); /* bits_per_pixel */
3494 if(s->quant_precision!=5) printf("quant precission %d\n", s->quant_precision);
3496 s->quant_precision = 5;
3499 // FIXME a bunch of grayscale shape things
3501 if(get_bits1(&s->gb)){ /* vol_quant_type */
3503 /* load default matrixes */
3504 for(i=0; i<64; i++){
3505 v= ff_mpeg4_default_intra_matrix[i];
3506 s->intra_matrix[i]= v;
3507 s->chroma_intra_matrix[i]= v;
3509 v= ff_mpeg4_default_non_intra_matrix[i];
3510 s->inter_matrix[i]= v;
3511 s->chroma_inter_matrix[i]= v;
3514 /* load custom intra matrix */
3515 if(get_bits1(&s->gb)){
3516 for(i=0; i<64; i++){
3517 v= get_bits(&s->gb, 8);
3520 j= zigzag_direct[i];
3521 s->intra_matrix[j]= v;
3522 s->chroma_intra_matrix[j]= v;
3526 /* load custom non 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->inter_matrix[j]= v;
3534 s->chroma_inter_matrix[j]= v;
3537 /* replicate last value */
3539 j= zigzag_direct[i];
3540 s->inter_matrix[j]= v;
3541 s->chroma_inter_matrix[j]= v;
3545 s->dct_unquantize= s->dct_unquantize_mpeg2;
3547 // FIXME a bunch of grayscale shape things
3549 s->dct_unquantize= s->dct_unquantize_h263;
3552 s->quarter_sample= get_bits1(&s->gb);
3553 else s->quarter_sample=0;
3555 if(!get_bits1(&s->gb)) printf("Complexity estimation not supported\n");
3557 s->resync_marker= !get_bits1(&s->gb); /* resync_marker_disabled */
3559 s->data_partitioning= get_bits1(&s->gb);
3560 if(s->data_partitioning){
3561 s->rvlc= get_bits1(&s->gb);
3563 printf("reversible vlc not supported\n");
3567 if(vo_ver_id != 1) {
3568 s->new_pred= get_bits1(&s->gb);
3570 printf("new pred not supported\n");
3571 skip_bits(&s->gb, 2); /* requested upstream message type */
3572 skip_bits1(&s->gb); /* newpred segment type */
3574 s->reduced_res_vop= get_bits1(&s->gb);
3575 if(s->reduced_res_vop) printf("reduced resolution VOP not supported\n");
3579 s->reduced_res_vop= 0;
3582 s->scalability= get_bits1(&s->gb);
3583 if (s->scalability) {
3584 printf("scalability not supported\n");
3587 //printf("end Data %X %d\n", show_bits(&s->gb, 32), get_bits_count(&s->gb)&0x7);
3589 } else if (startcode == 0x1b2) { //userdata
3595 //printf("user Data %X\n", show_bits(&s->gb, 32));
3596 buf[0]= show_bits(&s->gb, 8);
3597 for(i=1; i<256; i++){
3598 buf[i]= show_bits(&s->gb, 16)&0xFF;
3599 if(buf[i]==0) break;
3600 skip_bits(&s->gb, 8);
3603 e=sscanf(buf, "DivX%dBuild%d", &ver, &build);
3605 e=sscanf(buf, "DivX%db%d", &ver, &build);
3607 s->divx_version= ver;
3608 s->divx_build= build;
3609 if(s->picture_number==0){
3610 printf("This file was encoded with DivX%d Build%d\n", ver, build);
3611 if(ver==500 && build==413){
3612 printf("WARNING: this version of DivX is not MPEG4 compatible, trying to workaround these bugs...\n");
3615 printf("hmm, i havnt seen that version of divx yet, lets assume they fixed these bugs ...\n"
3616 "using mpeg4 decoder, if it fails contact the developers (of ffmpeg)\n");
3621 //printf("User Data: %s\n", buf);
3623 } else if (startcode != 0x1b6) { //VOP
3627 s->pict_type = get_bits(&s->gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */
3628 //if(s->pict_type!=I_TYPE) return FRAME_SKIPED;
3629 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0){
3630 printf("low_delay flag set, but shouldnt, clearing it\n");
3633 // printf("pic: %d, qpel:%d\n", s->pict_type, s->quarter_sample);
3634 //printf("%d", s->pict_type);
3636 while (get_bits1(&s->gb) != 0)
3639 check_marker(&s->gb, "before time_increment");
3640 time_increment= get_bits(&s->gb, s->time_increment_bits);
3641 //printf(" type:%d incr:%d increment:%d\n", s->pict_type, time_incr, time_increment);
3642 if(s->pict_type!=B_TYPE){
3643 s->last_time_base= s->time_base;
3644 s->time_base+= time_incr;
3645 s->time= s->time_base*s->time_increment_resolution + time_increment;
3646 s->pp_time= s->time - s->last_non_b_time;
3647 s->last_non_b_time= s->time;
3649 s->time= (s->last_time_base + time_incr)*s->time_increment_resolution + time_increment;
3650 s->bp_time= s->last_non_b_time - s->time;
3651 if(s->pp_time <=s->bp_time){
3652 // printf("messed up order, seeking?, skiping current b frame\n");
3653 return FRAME_SKIPED;
3657 if(check_marker(&s->gb, "before vop_coded")==0 && s->picture_number==0){
3658 printf("hmm, seems the headers arnt complete, trying to guess time_increment_bits\n");
3659 for(s->time_increment_bits++ ;s->time_increment_bits<16; s->time_increment_bits++){
3660 if(get_bits1(&s->gb)) break;
3662 printf("my guess is %d bits ;)\n",s->time_increment_bits);
3665 if (get_bits1(&s->gb) != 1)
3667 //printf("time %d %d %d || %d %d %d\n", s->time_increment_bits, s->time_increment, s->time_base,
3668 //s->time, s->last_non_b_time[0], s->last_non_b_time[1]);
3669 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE
3670 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
3671 /* rounding type for motion estimation */
3672 s->no_rounding = get_bits1(&s->gb);
3676 //FIXME reduced res stuff
3678 if (s->shape != RECT_SHAPE) {
3679 if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) {
3680 int width, height, hor_spat_ref, ver_spat_ref;
3682 width = get_bits(&s->gb, 13);
3683 skip_bits1(&s->gb); /* marker */
3684 height = get_bits(&s->gb, 13);
3685 skip_bits1(&s->gb); /* marker */
3686 hor_spat_ref = get_bits(&s->gb, 13); /* hor_spat_ref */
3687 skip_bits1(&s->gb); /* marker */
3688 ver_spat_ref = get_bits(&s->gb, 13); /* ver_spat_ref */
3690 skip_bits1(&s->gb); /* change_CR_disable */
3692 if (get_bits1(&s->gb) != 0) {
3693 skip_bits(&s->gb, 8); /* constant_alpha_value */
3696 //FIXME complexity estimation stuff
3698 if (s->shape != BIN_ONLY_SHAPE) {
3700 t=get_bits(&s->gb, 3); /* intra dc VLC threshold */
3701 //printf("threshold %d\n", t);
3702 //FIXME interlaced specific bits
3705 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
3706 if(s->num_sprite_warping_points){
3707 mpeg4_decode_sprite_trajectory(s);
3709 if(s->sprite_brightness_change) printf("sprite_brightness_change not supported\n");
3710 if(s->vol_sprite_usage==STATIC_SPRITE) printf("static sprite not supported\n");
3713 if (s->shape != BIN_ONLY_SHAPE) {
3714 /* note: we do not use quant_precision to avoid problem if no
3715 MPEG4 vol header as it is found on some old opendivx
3717 s->qscale = get_bits(&s->gb, 5);
3719 printf("Error, header damaged or not MPEG4 header (qscale=0)\n");
3720 return -1; // makes no sense to continue, as there is nothing left from the image then
3723 if (s->pict_type != I_TYPE) {
3724 s->f_code = get_bits(&s->gb, 3); /* fcode_for */
3726 printf("Error, header damaged or not MPEG4 header (f_code=0)\n");
3727 return -1; // makes no sense to continue, as the MV decoding will break very quickly
3730 if (s->pict_type == B_TYPE) {
3731 s->b_code = get_bits(&s->gb, 3);
3732 //printf("b-code %d\n", s->b_code);
3734 //printf("quant:%d fcode:%d bcode:%d type:%d\n", s->qscale, s->f_code, s->b_code, s->pict_type);
3735 if(!s->scalability){
3736 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {
3737 skip_bits1(&s->gb); // vop shape coding type
3741 /* detect buggy encoders which dont set the low_delay flag (divx4/xvid/opendivx)*/
3742 // note we cannot detect divx5 without b-frames easyly (allthough its buggy too)
3743 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
3744 printf("looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
3748 s->picture_number++; // better than pic number==0 allways ;)
3751 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
3752 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
3757 /* don't understand why they choose a different header ! */
3758 int intel_h263_decode_picture_header(MpegEncContext *s)
3762 /* picture header */
3763 if (get_bits(&s->gb, 22) != 0x20) {
3764 fprintf(stderr, "Bad picture start code\n");
3767 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
3769 if (get_bits1(&s->gb) != 1) {
3770 fprintf(stderr, "Bad marker\n");
3771 return -1; /* marker */
3773 if (get_bits1(&s->gb) != 0) {
3774 fprintf(stderr, "Bad H263 id\n");
3775 return -1; /* h263 id */
3777 skip_bits1(&s->gb); /* split screen off */
3778 skip_bits1(&s->gb); /* camera off */
3779 skip_bits1(&s->gb); /* freeze picture release off */
3781 format = get_bits(&s->gb, 3);
3783 fprintf(stderr, "Intel H263 free format not supported\n");
3788 s->pict_type = I_TYPE + get_bits1(&s->gb);
3790 s->unrestricted_mv = get_bits1(&s->gb);
3791 s->h263_long_vectors = s->unrestricted_mv;
3793 if (get_bits1(&s->gb) != 0) {
3794 fprintf(stderr, "SAC not supported\n");
3795 return -1; /* SAC: off */
3797 if (get_bits1(&s->gb) != 0) {
3798 fprintf(stderr, "Advanced Prediction Mode not supported\n");
3799 return -1; /* advanced prediction mode: off */
3801 if (get_bits1(&s->gb) != 0) {
3802 fprintf(stderr, "PB frame mode no supported\n");
3803 return -1; /* PB frame mode */
3806 /* skip unknown header garbage */
3807 skip_bits(&s->gb, 41);
3809 s->qscale = get_bits(&s->gb, 5);
3810 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
3813 while (get_bits1(&s->gb) != 0) {
3814 skip_bits(&s->gb, 8);