2 * H263/MPEG4 backend for ffmpeg encoder and decoder
3 * Copyright (c) 2000,2001 Gerard Lantau.
5 * Copyright (c) 2001 Juan J. Sierralta P.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program 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
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 * ac prediction encoding by Michael Niedermayer <michaelni@gmx.at>
26 #include "mpegvideo.h"
28 #include "mpeg4data.h"
30 //rounded divison & shift
31 #define RDIV(a,b) ((a) > 0 ? ((a)+((b)>>1))/(b) : ((a)-((b)>>1))/(b))
32 #define RSHIFT(a,b) ((a) > 0 ? ((a) + (1<<((b)-1)))>>(b) : ((a) + (1<<((b)-1))-1)>>(b))
33 #define ABS(a) (((a)>=0)?(a):(-(a)))
35 static void h263_encode_block(MpegEncContext * s, DCTELEM * block,
37 static void h263_encode_motion(MpegEncContext * s, int val);
38 static void h263p_encode_umotion(MpegEncContext * s, int val);
39 static void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block,
40 int n, int dc, UINT8 *scan_table);
41 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode);
42 static int h263p_decode_umotion(MpegEncContext * s, int pred);
43 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
45 static int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
47 static inline int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr);
48 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
50 extern UINT32 inverse[256];
52 static UINT16 mv_penalty[MAX_FCODE][MAX_MV*2+1];
53 static UINT8 fcode_tab[MAX_MV*2+1];
55 int h263_get_picture_format(int width, int height)
59 if (width == 128 && height == 96)
61 else if (width == 176 && height == 144)
63 else if (width == 352 && height == 288)
65 else if (width == 704 && height == 576)
67 else if (width == 1408 && height == 1152)
74 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
78 align_put_bits(&s->pb);
80 /* Update the pointer to last GOB */
81 s->ptr_lastgob = pbBufPtr(&s->pb);
84 put_bits(&s->pb, 22, 0x20); /* PSC */
85 put_bits(&s->pb, 8, (((INT64)s->picture_number * 30 * FRAME_RATE_BASE) /
86 s->frame_rate) & 0xff);
88 put_bits(&s->pb, 1, 1); /* marker */
89 put_bits(&s->pb, 1, 0); /* h263 id */
90 put_bits(&s->pb, 1, 0); /* split screen off */
91 put_bits(&s->pb, 1, 0); /* camera off */
92 put_bits(&s->pb, 1, 0); /* freeze picture release off */
94 format = h263_get_picture_format(s->width, s->height);
97 put_bits(&s->pb, 3, format);
98 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
99 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
100 of H.263v1 UMV implies to check the predicted MV after
101 calculation of the current MB to see if we're on the limits */
102 put_bits(&s->pb, 1, 0); /* unrestricted motion vector: off */
103 put_bits(&s->pb, 1, 0); /* SAC: off */
104 put_bits(&s->pb, 1, 0); /* advanced prediction mode: off */
105 put_bits(&s->pb, 1, 0); /* not PB frame */
106 put_bits(&s->pb, 5, s->qscale);
107 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
110 /* H.263 Plus PTYPE */
111 put_bits(&s->pb, 3, 7);
112 put_bits(&s->pb,3,1); /* Update Full Extended PTYPE */
114 put_bits(&s->pb,3,6); /* Custom Source Format */
116 put_bits(&s->pb, 3, format);
118 put_bits(&s->pb,1,0); /* Custom PCF: off */
119 s->umvplus = (s->pict_type == P_TYPE) && s->unrestricted_mv;
120 put_bits(&s->pb, 1, s->umvplus); /* Unrestricted Motion Vector */
121 put_bits(&s->pb,1,0); /* SAC: off */
122 put_bits(&s->pb,1,0); /* Advanced Prediction Mode: off */
123 put_bits(&s->pb,1,0); /* Advanced Intra Coding: off */
124 put_bits(&s->pb,1,0); /* Deblocking Filter: off */
125 put_bits(&s->pb,1,0); /* Slice Structured: off */
126 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
127 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
128 put_bits(&s->pb,1,0); /* Alternative Inter VLC: off */
129 put_bits(&s->pb,1,0); /* Modified Quantization: off */
130 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
131 put_bits(&s->pb,3,0); /* Reserved */
133 put_bits(&s->pb, 3, s->pict_type == P_TYPE);
135 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
136 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
137 put_bits(&s->pb,1,0); /* Rounding Type */
138 put_bits(&s->pb,2,0); /* Reserved */
139 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
141 /* This should be here if PLUSPTYPE */
142 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
145 /* Custom Picture Format (CPFMT) */
147 put_bits(&s->pb,4,2); /* Aspect ratio: CIF 12:11 (4:3) picture */
148 put_bits(&s->pb,9,(s->width >> 2) - 1);
149 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
150 put_bits(&s->pb,9,(s->height >> 2));
153 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
155 put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
156 put_bits(&s->pb, 5, s->qscale);
159 put_bits(&s->pb, 1, 0); /* no PEI */
162 int h263_encode_gob_header(MpegEncContext * s, int mb_line)
166 /* Check to see if we need to put a new GBSC */
167 /* for RTP packetization */
169 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
170 if (pdif >= s->rtp_payload_size) {
171 /* Bad luck, packet must be cut before */
172 align_put_bits(&s->pb);
173 flush_put_bits(&s->pb);
174 /* Call the RTP callback to send the last GOB */
175 if (s->rtp_callback) {
176 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
177 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
179 s->ptr_lastgob = pbBufPtr(&s->pb);
180 put_bits(&s->pb, 17, 1); /* GBSC */
181 s->gob_number = mb_line / s->gob_index;
182 put_bits(&s->pb, 5, s->gob_number); /* GN */
183 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
184 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
185 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
187 } else if (pdif + s->mb_line_avgsize >= s->rtp_payload_size) {
188 /* Cut the packet before we can't */
189 align_put_bits(&s->pb);
190 flush_put_bits(&s->pb);
191 /* Call the RTP callback to send the last GOB */
192 if (s->rtp_callback) {
193 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
194 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
196 s->ptr_lastgob = pbBufPtr(&s->pb);
197 put_bits(&s->pb, 17, 1); /* GBSC */
198 s->gob_number = mb_line / s->gob_index;
199 put_bits(&s->pb, 5, s->gob_number); /* GN */
200 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
201 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
202 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
209 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6])
211 int score0=0, score1=0;
215 INT16 *ac_val, *ac_val1;
217 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
220 ac_val-= s->block_wrap[n]*16;
222 const int level= block[n][block_permute_op(i )];
224 score1+= ABS(level - ac_val[i+8]);
225 ac_val1[i ]= block[n][block_permute_op(i<<3)];
231 const int level= block[n][block_permute_op(i<<3)];
233 score1+= ABS(level - ac_val[i]);
235 ac_val1[i+8]= block[n][block_permute_op(i )];
240 return score0 > score1 ? 1 : 0;
243 void mpeg4_encode_mb(MpegEncContext * s,
244 DCTELEM block[6][64],
245 int motion_x, int motion_y)
247 int cbpc, cbpy, i, cbp, pred_x, pred_y;
249 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
253 for (i = 0; i < 6; i++) {
254 if (s->block_last_index[i] >= 0)
257 if ((cbp | motion_x | motion_y) == 0) {
258 /* skip macroblock */
259 put_bits(&s->pb, 1, 1);
262 put_bits(&s->pb, 1, 0); /* mb coded */
265 inter_MCBPC_bits[cbpc],
266 inter_MCBPC_code[cbpc]);
269 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
271 /* motion vectors: 16x16 mode only now */
272 h263_pred_motion(s, 0, &pred_x, &pred_y);
274 h263_encode_motion(s, motion_x - pred_x);
275 h263_encode_motion(s, motion_y - pred_y);
277 /* encode each block */
278 for (i = 0; i < 6; i++) {
279 mpeg4_encode_block(s, block[i], i, 0, zigzag_direct);
282 int dc_diff[6]; //dc values with the dc prediction subtracted
283 int dir[6]; //prediction direction
284 int zigzag_last_index[6];
285 UINT8 *scan_table[6];
288 const int level= block[i][0];
291 dc_diff[i]= level - mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]);
293 *dc_ptr = level * s->y_dc_scale;
295 *dc_ptr = level * s->c_dc_scale;
299 s->ac_pred= decide_ac_pred(s, block, dir);
306 mpeg4_inv_pred_ac(s, block[i], i, dir[i]);
307 if (dir[i]==0) st = ff_alternate_vertical_scan; /* left */
308 else st = ff_alternate_horizontal_scan; /* top */
310 for(last_index=63; last_index>=0; last_index--) //FIXME optimize
311 if(block[i][st[last_index]]) break;
312 zigzag_last_index[i]= s->block_last_index[i];
313 s->block_last_index[i]= last_index;
318 scan_table[i]= zigzag_direct;
323 for (i = 0; i < 6; i++) {
324 if (s->block_last_index[i] >= 1)
329 if (s->pict_type == I_TYPE) {
331 intra_MCBPC_bits[cbpc],
332 intra_MCBPC_code[cbpc]);
334 put_bits(&s->pb, 1, 0); /* mb coded */
336 inter_MCBPC_bits[cbpc + 4],
337 inter_MCBPC_code[cbpc + 4]);
339 put_bits(&s->pb, 1, s->ac_pred);
341 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
343 /* encode each block */
344 for (i = 0; i < 6; i++) {
345 mpeg4_encode_block(s, block[i], i, dc_diff[i], scan_table[i]);
348 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
354 ac_val = s->ac_val[0][0] + s->block_index[i] * 16;
358 block[i][block_permute_op(j )]= ac_val[j+8];
361 block[i][block_permute_op(j<<3)]= ac_val[j ];
363 s->block_last_index[i]= zigzag_last_index[i];
369 void h263_encode_mb(MpegEncContext * s,
370 DCTELEM block[6][64],
371 int motion_x, int motion_y)
373 int cbpc, cbpy, i, cbp, pred_x, pred_y;
375 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
379 for (i = 0; i < 6; i++) {
380 if (s->block_last_index[i] >= 0)
383 if ((cbp | motion_x | motion_y) == 0) {
384 /* skip macroblock */
385 put_bits(&s->pb, 1, 1);
388 put_bits(&s->pb, 1, 0); /* mb coded */
391 inter_MCBPC_bits[cbpc],
392 inter_MCBPC_code[cbpc]);
395 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
397 /* motion vectors: 16x16 mode only now */
398 h263_pred_motion(s, 0, &pred_x, &pred_y);
401 h263_encode_motion(s, motion_x - pred_x);
402 h263_encode_motion(s, motion_y - pred_y);
405 h263p_encode_umotion(s, motion_x - pred_x);
406 h263p_encode_umotion(s, motion_y - pred_y);
407 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
408 /* To prevent Start Code emulation */
409 put_bits(&s->pb,1,1);
414 for (i = 0; i < 6; i++) {
415 if (s->block_last_index[i] >= 1)
420 if (s->pict_type == I_TYPE) {
422 intra_MCBPC_bits[cbpc],
423 intra_MCBPC_code[cbpc]);
425 put_bits(&s->pb, 1, 0); /* mb coded */
427 inter_MCBPC_bits[cbpc + 4],
428 inter_MCBPC_code[cbpc + 4]);
431 /* XXX: currently, we do not try to use ac prediction */
432 put_bits(&s->pb, 1, 0); /* no ac prediction */
435 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
438 /* encode each block */
440 for (i = 0; i < 6; i++) {
441 // mpeg4_encode_block(s, block[i], i);
444 for (i = 0; i < 6; i++) {
445 h263_encode_block(s, block[i], i);
450 void h263_pred_acdc(MpegEncContext * s, INT16 *block, int n)
452 int x, y, wrap, a, c, pred_dc, scale, i;
453 INT16 *dc_val, *ac_val, *ac_val1;
455 /* find prediction */
457 x = 2 * s->mb_x + 1 + (n & 1);
458 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
459 wrap = s->mb_width * 2 + 2;
460 dc_val = s->dc_val[0];
461 ac_val = s->ac_val[0][0];
462 scale = s->y_dc_scale;
466 wrap = s->mb_width + 2;
467 dc_val = s->dc_val[n - 4 + 1];
468 ac_val = s->ac_val[n - 4 + 1][0];
469 scale = s->c_dc_scale;
472 ac_val += ((y) * wrap + (x)) * 16;
478 a = dc_val[(x - 1) + (y) * wrap];
479 c = dc_val[(x) + (y - 1) * wrap];
483 if (s->h263_aic_dir) {
484 /* left prediction */
488 block[block_permute_op(i*8)] += ac_val[i];
497 block[block_permute_op(i)] += ac_val[i + 8];
503 /* just DC prediction */
504 if (a != 1024 && c != 1024)
505 pred_dc = (a + c) >> 1;
512 /* we assume pred is positive */
513 block[0]=block[0]*scale + pred_dc;
517 else if (!(block[0] & 1))
520 /* Update AC/DC tables */
521 dc_val[(x) + (y) * wrap] = block[0];
525 ac_val1[i] = block[block_permute_op(i * 8)];
528 ac_val1[8 + i] = block[block_permute_op(i)];
531 INT16 *h263_pred_motion(MpegEncContext * s, int block,
535 INT16 *A, *B, *C, *mot_val;
536 static const int off[4]= {2, 1, 1, -1};
538 wrap = s->block_wrap[0];
539 xy = s->block_index[block];
541 mot_val = s->motion_val[xy];
543 /* special case for first line */
544 if ((s->mb_y == 0 || s->first_slice_line || s->first_gob_line) && block<2) {
545 A = s->motion_val[xy - 1];
549 A = s->motion_val[xy - 1];
550 B = s->motion_val[xy - wrap];
551 C = s->motion_val[xy + off[block] - wrap];
552 *px = mid_pred(A[0], B[0], C[0]);
553 *py = mid_pred(A[1], B[1], C[1]);
558 static void h263_encode_motion(MpegEncContext * s, int val)
560 int range, l, m, bit_size, sign, code, bits;
565 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
567 bit_size = s->f_code - 1;
568 range = 1 << bit_size;
569 /* modulo encoding */
574 } else if (val >= l) {
580 code = (val >> bit_size) + 1;
581 bits = val & (range - 1);
586 code = (val >> bit_size) + 1;
587 bits = val & (range - 1);
591 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
593 put_bits(&s->pb, bit_size, bits);
598 /* Encode MV differences on H.263+ with Unrestricted MV mode */
599 static void h263p_encode_umotion(MpegEncContext * s, int val)
609 put_bits(&s->pb, 1, 1);
611 put_bits(&s->pb, 3, 0);
613 put_bits(&s->pb, 3, 2);
616 sval = ((val < 0) ? (short)(-val):(short)val);
619 while (temp_val != 0) {
620 temp_val = temp_val >> 1;
626 tcode = (sval & (1 << (i-1))) >> (i-1);
627 tcode = (tcode << 1) | 1;
628 code = (code << 2) | tcode;
631 code = ((code << 1) | (val < 0)) << 1;
632 put_bits(&s->pb, (2*n_bits)+1, code);
633 //printf("\nVal = %d\tCode = %d", sval, code);
637 static void init_mv_penalty_and_fcode(MpegEncContext *s)
641 for(f_code=1; f_code<=MAX_FCODE; f_code++){
642 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
645 if(mv==0) len= mvtab[0][1];
647 int val, bit_size, range, code;
649 bit_size = s->f_code - 1;
650 range = 1 << bit_size;
656 code = (val >> bit_size) + 1;
658 len= mvtab[code][1] + 1 + bit_size;
660 len= mvtab[32][1] + 2 + bit_size;
664 mv_penalty[f_code][mv+MAX_MV]= len;
669 for(f_code=MAX_FCODE; f_code>0; f_code--){
670 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
671 fcode_tab[mv+MAX_MV]= f_code;
676 void h263_encode_init(MpegEncContext *s)
685 init_mv_penalty_and_fcode(s);
687 s->mv_penalty= mv_penalty;
689 // use fcodes >1 only for mpeg4 FIXME
690 if(!s->h263_msmpeg4 && s->h263_pred) s->fcode_tab= fcode_tab;
693 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
695 int level, run, last, i, j, last_index, last_non_zero, sign, slevel;
697 RLTable *rl = &rl_inter;
702 /* 255 cannot be represented, so we clamp */
707 /* 0 cannot be represented also */
713 put_bits(&s->pb, 8, 0xff);
715 put_bits(&s->pb, 8, level & 0xff);
722 last_index = s->block_last_index[n];
723 last_non_zero = i - 1;
724 for (; i <= last_index; i++) {
725 j = zigzag_direct[i];
728 run = i - last_non_zero - 1;
729 last = (i == last_index);
736 code = get_rl_index(rl, last, run, level);
737 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
739 put_bits(&s->pb, 1, last);
740 put_bits(&s->pb, 6, run);
741 put_bits(&s->pb, 8, slevel & 0xff);
743 put_bits(&s->pb, 1, sign);
750 /***************************************************/
752 static void mpeg4_stuffing(PutBitContext * pbc)
756 length= (-get_bit_count(pbc))&7;
757 put_bits(pbc, length, (1<<length)-1);
760 static void put_string(PutBitContext * pbc, char *s)
763 put_bits(pbc, 8, *s);
769 static void mpeg4_encode_vol_header(MpegEncContext * s)
771 int vo_ver_id=1; //must be 2 if we want GMC or q-pel
773 if(get_bit_count(&s->pb)!=0) mpeg4_stuffing(&s->pb);
774 put_bits(&s->pb, 16, 0);
775 put_bits(&s->pb, 16, 0x100); /* video obj */
776 put_bits(&s->pb, 16, 0);
777 put_bits(&s->pb, 16, 0x120); /* video obj layer */
779 put_bits(&s->pb, 1, 0); /* random access vol */
780 put_bits(&s->pb, 8, 1); /* video obj type indication= simple obj */
781 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
782 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
783 put_bits(&s->pb, 3, 1); /* is obj layer priority */
784 put_bits(&s->pb, 4, 1); /* aspect ratio info= sqare pixel */ //FIXME real aspect
785 put_bits(&s->pb, 1, 0); /* vol control parameters= no */
786 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
787 put_bits(&s->pb, 1, 1); /* marker bit */
788 put_bits(&s->pb, 16, s->time_increment_resolution=30000);
789 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
790 if (s->time_increment_bits < 1)
791 s->time_increment_bits = 1;
792 put_bits(&s->pb, 1, 1); /* marker bit */
793 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
794 put_bits(&s->pb, 1, 1); /* marker bit */
795 put_bits(&s->pb, 13, s->width); /* vol width */
796 put_bits(&s->pb, 1, 1); /* marker bit */
797 put_bits(&s->pb, 13, s->height); /* vol height */
798 put_bits(&s->pb, 1, 1); /* marker bit */
799 put_bits(&s->pb, 1, 0); /* interlace */
800 put_bits(&s->pb, 1, 1); /* obmc disable */
801 if (vo_ver_id == 1) {
802 put_bits(&s->pb, 1, s->vol_sprite_usage=0); /* sprite enable */
803 }else{ /* vo_ver_id == 2 */
804 put_bits(&s->pb, 2, s->vol_sprite_usage=0); /* sprite enable */
806 put_bits(&s->pb, 1, 0); /* not 8 bit */
807 put_bits(&s->pb, 1, 0); /* quant type= h263 style*/
809 put_bits(&s->pb, 1, s->quarter_sample=0);
810 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
811 put_bits(&s->pb, 1, 1); /* resync marker disable */
812 put_bits(&s->pb, 1, 0); /* data partitioned */
814 put_bits(&s->pb, 1, 0); /* newpred */
815 put_bits(&s->pb, 1, 0); /* reduced res vop */
817 put_bits(&s->pb, 1, 0); /* scalability */
819 mpeg4_stuffing(&s->pb);
820 put_bits(&s->pb, 16, 0);
821 put_bits(&s->pb, 16, 0x1B2); /* user_data */
822 put_string(&s->pb, "ffmpeg"); //FIXME append some version ...
827 /* write mpeg4 VOP header */
828 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
830 if(s->pict_type==I_TYPE) mpeg4_encode_vol_header(s);
832 if(get_bit_count(&s->pb)!=0) mpeg4_stuffing(&s->pb);
833 put_bits(&s->pb, 16, 0); /* vop header */
834 put_bits(&s->pb, 16, 0x1B6); /* vop header */
835 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
836 /* XXX: time base + 1 not always correct */
837 put_bits(&s->pb, 1, 1);
838 put_bits(&s->pb, 1, 0);
840 put_bits(&s->pb, 1, 1); /* marker */
841 put_bits(&s->pb, s->time_increment_bits, 1); /* XXX: correct time increment */
842 put_bits(&s->pb, 1, 1); /* marker */
843 put_bits(&s->pb, 1, 1); /* vop coded */
844 if ( s->pict_type == P_TYPE
845 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
847 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
849 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
852 put_bits(&s->pb, 5, s->qscale);
854 if (s->pict_type != I_TYPE)
855 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
856 if (s->pict_type == B_TYPE)
857 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
858 // printf("****frame %d\n", picture_number);
861 void h263_dc_scale(MpegEncContext * s)
864 const static UINT8 y_tab[32]={
865 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
866 0, 8, 8, 8, 8,10,12,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,34,36,38,40,42,44,46
868 const static UINT8 c_tab[32]={
869 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
870 0, 8, 8, 8, 8, 9, 9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,20,21,22,23,24,25
872 s->y_dc_scale = y_tab[s->qscale];
873 s->c_dc_scale = c_tab[s->qscale];
880 else if (quant > 4 && quant < 9)
881 s->y_dc_scale = (2 * quant);
882 else if (quant > 8 && quant < 25)
883 s->y_dc_scale = (quant + 8);
885 s->y_dc_scale = (2 * quant - 16);
889 else if (quant > 4 && quant < 25)
890 s->c_dc_scale = ((quant + 13) / 2);
892 s->c_dc_scale = (quant - 6);
896 static inline int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr)
898 int a, b, c, wrap, pred, scale;
902 /* find prediction */
904 scale = s->y_dc_scale;
906 scale = s->c_dc_scale;
908 wrap= s->block_wrap[n];
909 dc_val = s->dc_val[0] + s->block_index[n];
915 b = dc_val[ - 1 - wrap];
918 if (abs(a - b) < abs(b - c)) {
920 *dir_ptr = 1; /* top */
923 *dir_ptr = 0; /* left */
925 /* we assume pred is positive */
928 "xorl %%edx, %%edx \n\t"
930 : "=d" (pred), "=a"(dummy)
931 : "a" (pred + (scale >> 1)), "c" (inverse[scale])
934 pred = (pred + (scale >> 1)) / scale;
937 /* prepare address for prediction update */
938 *dc_val_ptr = &dc_val[0];
943 void mpeg4_pred_ac(MpegEncContext * s, INT16 *block, int n,
947 INT16 *ac_val, *ac_val1;
949 /* find prediction */
950 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
954 /* left prediction */
957 block[block_permute_op(i*8)] += ac_val[i];
961 ac_val -= 16 * s->block_wrap[n];
963 block[block_permute_op(i)] += ac_val[i + 8];
969 ac_val1[i] = block[block_permute_op(i * 8)];
972 ac_val1[8 + i] = block[block_permute_op(i)];
975 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
981 /* find prediction */
982 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
985 /* left prediction */
988 block[block_permute_op(i*8)] -= ac_val[i];
992 ac_val -= 16 * s->block_wrap[n];
994 block[block_permute_op(i)] -= ac_val[i + 8];
1000 static inline void mpeg4_encode_dc(MpegEncContext * s, int level, int n)
1003 /* find number of bits */
1013 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
1016 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
1019 /* encode remaining bits */
1022 level = (-level) ^ ((1 << size) - 1);
1023 put_bits(&s->pb, size, level);
1025 put_bits(&s->pb, 1, 1);
1029 static void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, UINT8 *scan_table)
1031 int level, run, last, i, j, last_index, last_non_zero, sign, slevel;
1036 /* mpeg4 based DC predictor */
1037 mpeg4_encode_dc(s, intra_dc, n);
1046 last_index = s->block_last_index[n];
1047 last_non_zero = i - 1;
1048 for (; i <= last_index; i++) {
1052 run = i - last_non_zero - 1;
1053 last = (i == last_index);
1060 code = get_rl_index(rl, last, run, level);
1061 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1062 if (code == rl->n) {
1064 level1 = level - rl->max_level[last][run];
1067 code = get_rl_index(rl, last, run, level1);
1068 if (code == rl->n) {
1070 put_bits(&s->pb, 1, 1);
1071 if (level > MAX_LEVEL)
1073 run1 = run - rl->max_run[last][level] - 1;
1076 code = get_rl_index(rl, last, run1, level);
1077 if (code == rl->n) {
1080 put_bits(&s->pb, 1, 1);
1081 put_bits(&s->pb, 1, last);
1082 put_bits(&s->pb, 6, run);
1083 put_bits(&s->pb, 1, 1);
1084 put_bits(&s->pb, 12, slevel & 0xfff);
1085 put_bits(&s->pb, 1, 1);
1088 put_bits(&s->pb, 1, 0);
1089 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1090 put_bits(&s->pb, 1, sign);
1094 put_bits(&s->pb, 1, 0);
1095 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1096 put_bits(&s->pb, 1, sign);
1099 put_bits(&s->pb, 1, sign);
1108 /***********************************************/
1111 static VLC intra_MCBPC_vlc;
1112 static VLC inter_MCBPC_vlc;
1113 static VLC cbpy_vlc;
1115 static VLC dc_lum, dc_chrom;
1116 static VLC sprite_trajectory;
1117 static VLC mb_type_b_vlc;
1119 void init_rl(RLTable *rl)
1121 INT8 max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
1122 UINT8 index_run[MAX_RUN+1];
1123 int last, run, level, start, end, i;
1125 /* compute max_level[], max_run[] and index_run[] */
1126 for(last=0;last<2;last++) {
1135 memset(max_level, 0, MAX_RUN + 1);
1136 memset(max_run, 0, MAX_LEVEL + 1);
1137 memset(index_run, rl->n, MAX_RUN + 1);
1138 for(i=start;i<end;i++) {
1139 run = rl->table_run[i];
1140 level = rl->table_level[i];
1141 if (index_run[run] == rl->n)
1143 if (level > max_level[run])
1144 max_level[run] = level;
1145 if (run > max_run[level])
1146 max_run[level] = run;
1148 rl->max_level[last] = malloc(MAX_RUN + 1);
1149 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1150 rl->max_run[last] = malloc(MAX_LEVEL + 1);
1151 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1152 rl->index_run[last] = malloc(MAX_RUN + 1);
1153 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1157 void init_vlc_rl(RLTable *rl)
1159 init_vlc(&rl->vlc, 9, rl->n + 1,
1160 &rl->table_vlc[0][1], 4, 2,
1161 &rl->table_vlc[0][0], 4, 2);
1166 /* XXX: find a better solution to handle static init */
1167 void h263_decode_init_vlc(MpegEncContext *s)
1169 static int done = 0;
1174 init_vlc(&intra_MCBPC_vlc, 6, 8,
1175 intra_MCBPC_bits, 1, 1,
1176 intra_MCBPC_code, 1, 1);
1177 init_vlc(&inter_MCBPC_vlc, 9, 25,
1178 inter_MCBPC_bits, 1, 1,
1179 inter_MCBPC_code, 1, 1);
1180 init_vlc(&cbpy_vlc, 6, 16,
1181 &cbpy_tab[0][1], 2, 1,
1182 &cbpy_tab[0][0], 2, 1);
1183 init_vlc(&mv_vlc, 9, 33,
1185 &mvtab[0][0], 2, 1);
1188 init_rl(&rl_intra_aic);
1189 init_vlc_rl(&rl_inter);
1190 init_vlc_rl(&rl_intra);
1191 init_vlc_rl(&rl_intra_aic);
1192 init_vlc(&dc_lum, 9, 13,
1193 &DCtab_lum[0][1], 2, 1,
1194 &DCtab_lum[0][0], 2, 1);
1195 init_vlc(&dc_chrom, 9, 13,
1196 &DCtab_chrom[0][1], 2, 1,
1197 &DCtab_chrom[0][0], 2, 1);
1198 init_vlc(&sprite_trajectory, 9, 15,
1199 &sprite_trajectory_tab[0][1], 4, 2,
1200 &sprite_trajectory_tab[0][0], 4, 2);
1201 init_vlc(&mb_type_b_vlc, 4, 4,
1202 &mb_type_b_tab[0][1], 2, 1,
1203 &mb_type_b_tab[0][0], 2, 1);
1207 int h263_decode_gob_header(MpegEncContext *s)
1209 unsigned int val, gfid;
1211 /* Check for GOB Start Code */
1212 val = show_bits(&s->gb, 16);
1214 /* We have a GBSC probably with GSTUFF */
1215 skip_bits(&s->gb, 16); /* Drop the zeros */
1216 while (get_bits1(&s->gb) == 0); /* Seek the '1' bit */
1218 fprintf(stderr,"\nGOB Start Code at MB %d\n", (s->mb_y * s->mb_width) + s->mb_x);
1220 s->gob_number = get_bits(&s->gb, 5); /* GN */
1221 gfid = get_bits(&s->gb, 2); /* GFID */
1222 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
1224 fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", s->gob_number, gfid, s->qscale);
1232 int h263_decode_mb(MpegEncContext *s,
1233 DCTELEM block[6][64])
1235 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
1237 static INT8 quant_tab[4] = { -1, -2, 1, 2 };
1239 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
1240 if (get_bits1(&s->gb)) {
1244 s->block_last_index[i] = -1;
1245 s->mv_dir = MV_DIR_FORWARD;
1246 s->mv_type = MV_TYPE_16X16;
1247 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
1248 const int a= s->sprite_warping_accuracy;
1249 // int l = (1 << (s->f_code - 1)) * 32;
1252 s->mv[0][0][0] = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
1253 s->mv[0][0][1] = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
1254 /* if (s->mv[0][0][0] < -l) s->mv[0][0][0]= -l;
1255 else if (s->mv[0][0][0] >= l) s->mv[0][0][0]= l-1;
1256 if (s->mv[0][0][1] < -l) s->mv[0][0][1]= -l;
1257 else if (s->mv[0][0][1] >= l) s->mv[0][0][1]= l-1;*/
1268 cbpc = get_vlc(&s->gb, &inter_MCBPC_vlc);
1269 //fprintf(stderr, "\tCBPC: %d", cbpc);
1274 else if (cbpc == 20)
1275 fprintf(stderr, "Stuffing !");
1278 s->mb_intra = ((cbpc & 4) != 0);
1279 if (s->mb_intra) goto intra;
1281 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
1282 s->mcsel= get_bits1(&s->gb);
1284 cbpy = get_vlc(&s->gb, &cbpy_vlc);
1285 cbp = (cbpc & 3) | ((cbpy ^ 0xf) << 2);
1287 s->qscale += quant_tab[get_bits(&s->gb, 2)];
1290 else if (s->qscale > 31)
1293 s->mv_dir = MV_DIR_FORWARD;
1294 if ((cbpc & 16) == 0) {
1295 /* 16x16 motion prediction */
1296 s->mv_type = MV_TYPE_16X16;
1297 h263_pred_motion(s, 0, &pred_x, &pred_y);
1299 mx = h263p_decode_umotion(s, pred_x);
1301 mx = h263_decode_motion(s, pred_x, s->f_code);
1303 const int a= s->sprite_warping_accuracy;
1304 // int l = (1 << (s->f_code - 1)) * 32;
1305 mx= RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
1306 // if (mx < -l) mx= -l;
1307 // else if (mx >= l) mx= l-1;
1313 my = h263p_decode_umotion(s, pred_y);
1315 my = h263_decode_motion(s, pred_y, s->f_code);
1317 const int a= s->sprite_warping_accuracy;
1318 // int l = (1 << (s->f_code - 1)) * 32;
1319 my= RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
1320 // if (my < -l) my= -l;
1321 // else if (my >= l) my= l-1;
1325 s->mv[0][0][0] = mx;
1326 s->mv[0][0][1] = my;
1327 /*fprintf(stderr, "\n MB %d", (s->mb_y * s->mb_width) + s->mb_x);
1328 fprintf(stderr, "\n\tmvx: %d\t\tpredx: %d", mx, pred_x);
1329 fprintf(stderr, "\n\tmvy: %d\t\tpredy: %d", my, pred_y);*/
1330 if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
1331 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
1334 s->mv_type = MV_TYPE_8X8;
1336 mot_val = h263_pred_motion(s, i, &pred_x, &pred_y);
1338 mx = h263p_decode_umotion(s, pred_x);
1340 mx = h263_decode_motion(s, pred_x, s->f_code);
1345 my = h263p_decode_umotion(s, pred_y);
1347 my = h263_decode_motion(s, pred_y, s->f_code);
1350 s->mv[0][i][0] = mx;
1351 s->mv[0][i][1] = my;
1352 if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
1353 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
1358 } else if(s->pict_type==B_TYPE) {
1359 int modb1; // first bit of modb
1360 int modb2; // second bit of modb
1366 s->mb_intra = 0; //B-frames never contain intra blocks
1367 s->mcsel=0; // ... true gmc blocks
1370 s->last_mv[0][0][0]=
1371 s->last_mv[0][0][1]=
1372 s->last_mv[1][0][0]=
1373 s->last_mv[1][0][1]= 0;
1376 /* if we skipped it in the future P Frame than skip it now too */
1377 s->mb_skiped= s->mbskip_table[s->mb_y * s->mb_width + s->mb_x]; // Note, skiptab=0 if last was GMC
1382 s->block_last_index[i] = -1;
1384 s->mv_dir = MV_DIR_FORWARD;
1385 s->mv_type = MV_TYPE_16X16;
1390 s->last_mv[0][0][0]=
1391 s->last_mv[0][0][1]=
1392 s->last_mv[1][0][0]=
1393 s->last_mv[1][0][1]= 0;
1398 modb1= get_bits1(&s->gb);
1400 modb2= get_bits1(&s->gb);
1401 mb_type= get_vlc(&s->gb, &mb_type_b_vlc);
1402 if(modb2==0) cbp= get_bits(&s->gb, 6);
1404 if (mb_type && cbp) {
1405 if(get_bits1(&s->gb)){
1406 s->qscale +=get_bits1(&s->gb)*4 - 2;
1409 else if (s->qscale > 31)
1414 mb_type=4; //like 0 but no vectors coded
1417 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
1418 mx=my=0; //for case 4, we could put this to the mb_type=4 but than gcc compains about uninitalized mx/my
1422 mx = h263_decode_motion(s, 0, 1);
1423 my = h263_decode_motion(s, 0, 1);
1425 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
1426 xy= s->block_index[0];
1427 time_pp= s->last_non_b_time[0] - s->last_non_b_time[1];
1428 time_pb= s->time - s->last_non_b_time[1];
1429 //if(time_pp>3000 )printf("%d %d ", time_pp, time_pb);
1431 //FIXME avoid divides
1432 s->mv[0][0][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
1433 s->mv[0][0][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
1434 s->mv[1][0][0] = mx ? s->mv[0][0][0] - s->motion_val[xy][0]
1435 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp + mx;
1436 s->mv[1][0][1] = my ? s->mv[0][0][1] - s->motion_val[xy][1]
1437 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp + my;
1441 s->mv[1][0][1] = 1000;*/
1444 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
1445 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
1446 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
1447 s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
1448 s->last_mv[0][0][1]= s->mv[0][0][1] = my;
1450 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
1451 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
1452 s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
1453 s->last_mv[1][0][1]= s->mv[1][0][1] = my;
1456 s->mv_dir = MV_DIR_BACKWARD;
1457 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
1458 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
1459 s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
1460 s->last_mv[1][0][1]= s->mv[1][0][1] = my;
1463 s->mv_dir = MV_DIR_FORWARD;
1464 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
1465 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
1466 s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
1467 s->last_mv[0][0][1]= s->mv[0][0][1] = my;
1471 } else { /* I-Frame */
1472 cbpc = get_vlc(&s->gb, &intra_MCBPC_vlc);
1479 if (s->h263_pred || s->h263_aic) {
1480 s->ac_pred = get_bits1(&s->gb);
1481 if (s->ac_pred && s->h263_aic)
1482 s->h263_aic_dir = get_bits1(&s->gb);
1485 s->y_dc_scale = 2 * s->qscale;
1486 s->c_dc_scale = 2 * s->qscale;
1488 cbpy = get_vlc(&s->gb, &cbpy_vlc);
1489 cbp = (cbpc & 3) | (cbpy << 2);
1491 s->qscale += quant_tab[get_bits(&s->gb, 2)];
1494 else if (s->qscale > 31)
1499 /* decode each block */
1501 for (i = 0; i < 6; i++) {
1502 if (mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
1506 for (i = 0; i < 6; i++) {
1507 if (h263_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
1514 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
1516 int code, val, sign, shift, l, m;
1518 code = get_vlc(&s->gb, &mv_vlc);
1524 sign = get_bits1(&s->gb);
1526 val = (code - 1) << shift;
1528 val |= get_bits(&s->gb, shift);
1534 /* modulo decoding */
1535 if (!s->h263_long_vectors) {
1536 l = (1 << (f_code - 1)) * 32;
1540 } else if (val >= l) {
1544 /* horrible h263 long vector mode */
1545 if (pred < -31 && val < -63)
1547 if (pred > 32 && val > 63)
1554 /* Decodes RVLC of H.263+ UMV */
1555 static int h263p_decode_umotion(MpegEncContext * s, int pred)
1559 if (get_bits1(&s->gb)) /* Motion difference = 0 */
1562 code = 2 + get_bits1(&s->gb);
1564 while (get_bits1(&s->gb))
1567 code += get_bits1(&s->gb);
1572 code = (sign) ? (pred - code) : (pred + code);
1574 fprintf(stderr,"H.263+ UMV Motion = %d\n", code);
1580 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
1583 int code, level, i, j, last, run;
1584 RLTable *rl = &rl_inter;
1585 const UINT8 *scan_table;
1587 scan_table = zigzag_direct;
1588 if (s->h263_aic && s->mb_intra) {
1592 if (s->h263_aic_dir)
1593 scan_table = ff_alternate_vertical_scan; /* left */
1595 scan_table = ff_alternate_horizontal_scan; /* top */
1597 } else if (s->mb_intra) {
1599 if (s->h263_rv10 && s->rv10_version == 3 && s->pict_type == I_TYPE) {
1600 int component, diff;
1601 component = (n <= 3 ? 0 : n - 4 + 1);
1602 level = s->last_dc[component];
1603 if (s->rv10_first_dc_coded[component]) {
1604 diff = rv_decode_dc(s, n);
1608 level = level & 0xff; /* handle wrap round */
1609 s->last_dc[component] = level;
1611 s->rv10_first_dc_coded[component] = 1;
1614 level = get_bits(&s->gb, 8);
1624 if (s->mb_intra && s->h263_aic)
1626 s->block_last_index[n] = i - 1;
1631 code = get_vlc(&s->gb, &rl->vlc);
1634 if (code == rl->n) {
1636 last = get_bits1(&s->gb);
1637 run = get_bits(&s->gb, 6);
1638 level = (INT8)get_bits(&s->gb, 8);
1639 if (s->h263_rv10 && level == -128) {
1640 /* XXX: should patch encoder too */
1641 level = get_bits(&s->gb, 12);
1642 level = (level << 20) >> 20;
1645 run = rl->table_run[code];
1646 level = rl->table_level[code];
1647 last = code >= rl->last;
1648 if (get_bits1(&s->gb))
1661 if (s->mb_intra && s->h263_aic) {
1662 h263_pred_acdc(s, block, n);
1665 s->block_last_index[n] = i;
1669 static int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
1671 int level, pred, code;
1675 code = get_vlc(&s->gb, &dc_lum);
1677 code = get_vlc(&s->gb, &dc_chrom);
1683 level = get_bits(&s->gb, code);
1684 if ((level >> (code - 1)) == 0) /* if MSB not set it is negative*/
1685 level = - (level ^ ((1 << code) - 1));
1687 skip_bits1(&s->gb); /* marker */
1690 pred = mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
1695 *dc_val = level * s->y_dc_scale;
1697 *dc_val = level * s->c_dc_scale;
1702 static int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
1705 int code, level, i, j, last, run;
1708 const UINT8 *scan_table;
1712 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
1721 if (dc_pred_dir == 0)
1722 scan_table = ff_alternate_vertical_scan; /* left */
1724 scan_table = ff_alternate_horizontal_scan; /* top */
1726 scan_table = zigzag_direct;
1731 s->block_last_index[n] = i - 1;
1735 scan_table = zigzag_direct;
1739 code = get_vlc(&s->gb, &rl->vlc);
1742 if (code == rl->n) {
1744 if (get_bits1(&s->gb) != 0) {
1745 if (get_bits1(&s->gb) != 0) {
1747 last = get_bits1(&s->gb);
1748 run = get_bits(&s->gb, 6);
1749 get_bits1(&s->gb); /* marker */
1750 level = get_bits(&s->gb, 12);
1751 level = (level << 20) >> 20; /* sign extend */
1752 skip_bits1(&s->gb); /* marker */
1755 code = get_vlc(&s->gb, &rl->vlc);
1756 if (code < 0 || code >= rl->n)
1758 run = rl->table_run[code];
1759 level = rl->table_level[code];
1760 last = code >= rl->last;
1761 run += rl->max_run[last][level] + 1;
1762 if (get_bits1(&s->gb))
1767 code = get_vlc(&s->gb, &rl->vlc);
1768 if (code < 0 || code >= rl->n)
1770 run = rl->table_run[code];
1771 level = rl->table_level[code];
1772 last = code >= rl->last;
1773 level += rl->max_level[last][run];
1774 if (get_bits1(&s->gb))
1778 run = rl->table_run[code];
1779 level = rl->table_level[code];
1780 last = code >= rl->last;
1781 if (get_bits1(&s->gb))
1795 mpeg4_pred_ac(s, block, n, dc_pred_dir);
1797 i = 64; /* XXX: not optimal */
1800 s->block_last_index[n] = i - 1;
1804 /* most is hardcoded. should extend to handle all h263 streams */
1805 int h263_decode_picture_header(MpegEncContext *s)
1807 int format, width, height;
1809 /* picture header */
1810 if (get_bits(&s->gb, 22) != 0x20)
1812 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
1814 if (get_bits1(&s->gb) != 1)
1815 return -1; /* marker */
1816 if (get_bits1(&s->gb) != 0)
1817 return -1; /* h263 id */
1818 skip_bits1(&s->gb); /* split screen off */
1819 skip_bits1(&s->gb); /* camera off */
1820 skip_bits1(&s->gb); /* freeze picture release off */
1822 /* Reset GOB number */
1825 format = get_bits(&s->gb, 3);
1827 if (format != 7 && format != 6) {
1830 width = h263_format[format][0];
1831 height = h263_format[format][1];
1837 s->pict_type = I_TYPE + get_bits1(&s->gb);
1839 s->unrestricted_mv = get_bits1(&s->gb);
1840 s->h263_long_vectors = s->unrestricted_mv;
1842 if (get_bits1(&s->gb) != 0)
1843 return -1; /* SAC: off */
1844 if (get_bits1(&s->gb) != 0) {
1845 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
1848 if (get_bits1(&s->gb) != 0)
1849 return -1; /* not PB frame */
1851 s->qscale = get_bits(&s->gb, 5);
1852 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
1858 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
1862 format = get_bits(&s->gb, 3);
1863 skip_bits(&s->gb,1); /* Custom PCF */
1864 s->umvplus_dec = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */
1865 skip_bits1(&s->gb); /* Syntax-based Arithmetic Coding (SAC) */
1866 if (get_bits1(&s->gb) != 0) {
1867 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
1869 if (get_bits1(&s->gb) != 0) { /* Advanced Intra Coding (AIC) */
1872 skip_bits(&s->gb, 7);
1873 skip_bits(&s->gb, 3); /* Reserved */
1874 } else if (ufep != 0)
1878 s->pict_type = get_bits(&s->gb, 3) + 1;
1879 if (s->pict_type != I_TYPE &&
1880 s->pict_type != P_TYPE)
1882 skip_bits(&s->gb, 2);
1883 s->no_rounding = get_bits1(&s->gb);
1884 //fprintf(stderr, "\nRTYPE: %d", s->no_rounding);
1885 skip_bits(&s->gb, 4);
1887 /* Get the picture dimensions */
1890 /* Custom Picture Format (CPFMT) */
1891 skip_bits(&s->gb, 4); /* aspect ratio */
1892 width = (get_bits(&s->gb, 9) + 1) * 4;
1894 height = get_bits(&s->gb, 9) * 4;
1896 fprintf(stderr,"\nH.263+ Custom picture: %dx%d\n",width,height);
1900 width = h263_format[format][0];
1901 height = h263_format[format][1];
1903 if ((width == 0) || (height == 0))
1907 if (s->umvplus_dec) {
1908 skip_bits1(&s->gb); /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
1912 s->qscale = get_bits(&s->gb, 5);
1915 while (get_bits1(&s->gb) != 0) {
1916 skip_bits(&s->gb, 8);
1922 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s)
1925 int a= 2<<s->sprite_warping_accuracy;
1926 int rho= 3-s->sprite_warping_accuracy;
1928 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
1929 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
1930 int sprite_ref[4][2];
1931 int virtual_ref[2][2];
1933 int alpha=0, beta=0;
1936 //printf("SP %d\n", s->sprite_warping_accuracy);
1937 for(i=0; i<s->num_sprite_warping_points; i++){
1941 length= get_vlc(&s->gb, &sprite_trajectory);
1943 x= get_bits(&s->gb, length);
1944 //printf("lx %d %d\n", length, x);
1945 if ((x >> (length - 1)) == 0) /* if MSB not set it is negative*/
1946 x = - (x ^ ((1 << length) - 1));
1948 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(&s->gb); /* marker bit */
1950 length= get_vlc(&s->gb, &sprite_trajectory);
1952 y=get_bits(&s->gb, length);
1953 //printf("ly %d %d\n", length, y);
1954 if ((y >> (length - 1)) == 0) /* if MSB not set it is negative*/
1955 y = - (y ^ ((1 << length) - 1));
1957 skip_bits1(&s->gb); /* marker bit */
1958 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
1959 //if(i>0 && (x!=0 || y!=0)) printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n");
1965 while((1<<alpha)<w) alpha++;
1966 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
1970 // Note, the 4th point isnt used for GMC
1971 if(s->divx_version==500 && s->divx_build==413){
1972 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
1973 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
1974 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
1975 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
1976 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
1977 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
1979 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
1980 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
1981 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
1982 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
1983 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
1984 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
1986 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
1987 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
1989 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
1990 // perhaps it should be reordered to be more readable ...
1991 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
1992 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
1993 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
1994 + RDIV(((w - w2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + w2*(r*sprite_ref[1][0] - 16*vop_ref[1][0])),w);
1995 virtual_ref[0][1]= 16*vop_ref[0][1]
1996 + RDIV(((w - w2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + w2*(r*sprite_ref[1][1] - 16*vop_ref[1][1])),w);
1997 virtual_ref[1][0]= 16*vop_ref[0][0]
1998 + RDIV(((h - h2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + h2*(r*sprite_ref[2][0] - 16*vop_ref[2][0])),h);
1999 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
2000 + RDIV(((h - h2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + h2*(r*sprite_ref[2][1] - 16*vop_ref[2][1])),h);
2002 switch(s->num_sprite_warping_points)
2005 s->sprite_offset[0][0]= 0;
2006 s->sprite_offset[0][1]= 0;
2007 s->sprite_offset[1][0]= 0;
2008 s->sprite_offset[1][1]= 0;
2009 s->sprite_delta[0][0][0]= a;
2010 s->sprite_delta[0][0][1]= 0;
2011 s->sprite_delta[0][1][0]= 0;
2012 s->sprite_delta[0][1][1]= a;
2013 s->sprite_delta[1][0][0]= a;
2014 s->sprite_delta[1][0][1]= 0;
2015 s->sprite_delta[1][1][0]= 0;
2016 s->sprite_delta[1][1][1]= a;
2017 s->sprite_shift[0][0]= 0;
2018 s->sprite_shift[0][1]= 0;
2019 s->sprite_shift[1][0]= 0;
2020 s->sprite_shift[1][1]= 0;
2023 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
2024 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
2025 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
2026 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
2027 s->sprite_delta[0][0][0]= a;
2028 s->sprite_delta[0][0][1]= 0;
2029 s->sprite_delta[0][1][0]= 0;
2030 s->sprite_delta[0][1][1]= a;
2031 s->sprite_delta[1][0][0]= a;
2032 s->sprite_delta[1][0][1]= 0;
2033 s->sprite_delta[1][1][0]= 0;
2034 s->sprite_delta[1][1][1]= a;
2035 s->sprite_shift[0][0]= 0;
2036 s->sprite_shift[0][1]= 0;
2037 s->sprite_shift[1][0]= 0;
2038 s->sprite_shift[1][1]= 0;
2042 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
2043 + ((-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
2044 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1]));
2045 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
2046 + ((-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
2047 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1]));
2048 s->sprite_offset[1][0]= ((-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
2049 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
2050 +2*w2*r*sprite_ref[0][0] - 16*w2);
2051 s->sprite_offset[1][1]= ((-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
2052 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
2053 +2*w2*r*sprite_ref[0][1] - 16*w2);
2054 s->sprite_delta[0][0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
2055 s->sprite_delta[0][0][1]= ( r*sprite_ref[0][1] - virtual_ref[0][1]);
2056 s->sprite_delta[0][1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
2057 s->sprite_delta[0][1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
2058 s->sprite_delta[1][0][0]= 4*(-r*sprite_ref[0][0] + virtual_ref[0][0]);
2059 s->sprite_delta[1][0][1]= 4*( r*sprite_ref[0][1] - virtual_ref[0][1]);
2060 s->sprite_delta[1][1][0]= 4*(-r*sprite_ref[0][1] + virtual_ref[0][1]);
2061 s->sprite_delta[1][1][1]= 4*(-r*sprite_ref[0][0] + virtual_ref[0][0]);
2062 s->sprite_shift[0][0]= alpha+rho;
2063 s->sprite_shift[0][1]= alpha+rho;
2064 s->sprite_shift[1][0]= alpha+rho+2;
2065 s->sprite_shift[1][1]= alpha+rho+2;
2070 /*printf("%d %d\n", s->sprite_delta[0][0][0], a<<s->sprite_shift[0][0]);
2071 printf("%d %d\n", s->sprite_delta[0][0][1], 0);
2072 printf("%d %d\n", s->sprite_delta[0][1][0], 0);
2073 printf("%d %d\n", s->sprite_delta[0][1][1], a<<s->sprite_shift[0][1]);
2074 printf("%d %d\n", s->sprite_delta[1][0][0], a<<s->sprite_shift[1][0]);
2075 printf("%d %d\n", s->sprite_delta[1][0][1], 0);
2076 printf("%d %d\n", s->sprite_delta[1][1][0], 0);
2077 printf("%d %d\n", s->sprite_delta[1][1][1], a<<s->sprite_shift[1][1]);*/
2078 /* try to simplify the situation */
2079 if( s->sprite_delta[0][0][0] == a<<s->sprite_shift[0][0]
2080 && s->sprite_delta[0][0][1] == 0
2081 && s->sprite_delta[0][1][0] == 0
2082 && s->sprite_delta[0][1][1] == a<<s->sprite_shift[0][1]
2083 && s->sprite_delta[1][0][0] == a<<s->sprite_shift[1][0]
2084 && s->sprite_delta[1][0][1] == 0
2085 && s->sprite_delta[1][1][0] == 0
2086 && s->sprite_delta[1][1][1] == a<<s->sprite_shift[1][1])
2088 s->sprite_offset[0][0]>>=s->sprite_shift[0][0];
2089 s->sprite_offset[0][1]>>=s->sprite_shift[0][1];
2090 s->sprite_offset[1][0]>>=s->sprite_shift[1][0];
2091 s->sprite_offset[1][1]>>=s->sprite_shift[1][1];
2092 s->sprite_delta[0][0][0]= a;
2093 s->sprite_delta[0][0][1]= 0;
2094 s->sprite_delta[0][1][0]= 0;
2095 s->sprite_delta[0][1][1]= a;
2096 s->sprite_delta[1][0][0]= a;
2097 s->sprite_delta[1][0][1]= 0;
2098 s->sprite_delta[1][1][0]= 0;
2099 s->sprite_delta[1][1][1]= a;
2100 s->sprite_shift[0][0]= 0;
2101 s->sprite_shift[0][1]= 0;
2102 s->sprite_shift[1][0]= 0;
2103 s->sprite_shift[1][1]= 0;
2104 s->real_sprite_warping_points=1;
2107 s->real_sprite_warping_points= s->num_sprite_warping_points;
2111 /* decode mpeg4 VOP header */
2112 int mpeg4_decode_picture_header(MpegEncContext * s)
2114 int time_incr, startcode, state, v;
2117 /* search next start code */
2118 align_get_bits(&s->gb);
2121 v = get_bits(&s->gb, 8);
2122 if (state == 0x000001) {
2123 state = ((state << 8) | v) & 0xffffff;
2127 state = ((state << 8) | v) & 0xffffff;
2128 if( get_bits_count(&s->gb) > s->gb.size*8-32){
2129 printf("no VOP startcode found\n");
2133 //printf("startcode %X %d\n", startcode, get_bits_count(&s->gb));
2134 if (startcode == 0x120) { // Video Object Layer
2135 int width, height, vo_ver_id;
2138 skip_bits(&s->gb, 1); /* random access */
2139 skip_bits(&s->gb, 8); /* vo_type */
2140 if (get_bits1(&s->gb) != 0) { /* is_ol_id */
2141 vo_ver_id = get_bits(&s->gb, 4); /* vo_ver_id */
2142 skip_bits(&s->gb, 3); /* vo_priority */
2147 s->aspect_ratio_info= get_bits(&s->gb, 4);
2148 if(s->aspect_ratio_info == EXTENDET_PAR){
2149 skip_bits(&s->gb, 8); //par_width
2150 skip_bits(&s->gb, 8); // par_height
2152 if(get_bits1(&s->gb)){ /* vol control parameter */
2153 printf("vol control parameter not supported\n");
2156 s->shape = get_bits(&s->gb, 2); /* vol shape */
2157 if(s->shape != RECT_SHAPE) printf("only rectangular vol supported\n");
2158 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
2159 printf("Gray shape not supported\n");
2160 skip_bits(&s->gb, 4); //video_object_layer_shape_extension
2163 skip_bits1(&s->gb); /* marker */
2165 s->time_increment_resolution = get_bits(&s->gb, 16);
2166 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
2167 if (s->time_increment_bits < 1)
2168 s->time_increment_bits = 1;
2169 skip_bits1(&s->gb); /* marker */
2171 if (get_bits1(&s->gb) != 0) { /* fixed_vop_rate */
2172 skip_bits(&s->gb, s->time_increment_bits);
2175 if (s->shape != BIN_ONLY_SHAPE) {
2176 if (s->shape == RECT_SHAPE) {
2177 skip_bits1(&s->gb); /* marker */
2178 width = get_bits(&s->gb, 13);
2179 skip_bits1(&s->gb); /* marker */
2180 height = get_bits(&s->gb, 13);
2181 skip_bits1(&s->gb); /* marker */
2182 if(width && height){ /* they should be non zero but who knows ... */
2185 // printf("%d %d\n", width, height);
2189 if(get_bits1(&s->gb)) printf("interlaced not supported\n"); /* interlaced */
2190 if(!get_bits1(&s->gb)) printf("OBMC not supported\n"); /* OBMC Disable */
2191 if (vo_ver_id == 1) {
2192 s->vol_sprite_usage = get_bits1(&s->gb); /* vol_sprite_usage */
2194 s->vol_sprite_usage = get_bits(&s->gb, 2); /* vol_sprite_usage */
2196 if(s->vol_sprite_usage==STATIC_SPRITE) printf("Static Sprites not supported\n");
2197 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
2198 if(s->vol_sprite_usage==STATIC_SPRITE){
2199 s->sprite_width = get_bits(&s->gb, 13);
2200 skip_bits1(&s->gb); /* marker */
2201 s->sprite_height= get_bits(&s->gb, 13);
2202 skip_bits1(&s->gb); /* marker */
2203 s->sprite_left = get_bits(&s->gb, 13);
2204 skip_bits1(&s->gb); /* marker */
2205 s->sprite_top = get_bits(&s->gb, 13);
2206 skip_bits1(&s->gb); /* marker */
2208 s->num_sprite_warping_points= get_bits(&s->gb, 6);
2209 s->sprite_warping_accuracy = get_bits(&s->gb, 2);
2210 s->sprite_brightness_change= get_bits1(&s->gb);
2211 if(s->vol_sprite_usage==STATIC_SPRITE)
2212 s->low_latency_sprite= get_bits1(&s->gb);
2214 // FIXME sadct disable bit if verid!=1 && shape not rect
2216 if (get_bits1(&s->gb) == 1) { /* not_8_bit */
2217 s->quant_precision = get_bits(&s->gb, 4); /* quant_precision */
2218 if(get_bits(&s->gb, 4)!=8) printf("N-bit not supported\n"); /* bits_per_pixel */
2220 s->quant_precision = 5;
2223 // FIXME a bunch of grayscale shape things
2224 if(get_bits1(&s->gb)) printf("Quant-Type not supported\n"); /* vol_quant_type */ //FIXME
2226 s->quarter_sample= get_bits1(&s->gb);
2227 else s->quarter_sample=0;
2229 if(!get_bits1(&s->gb)) printf("Complexity estimation not supported\n");
2231 if(get_bits1(&s->gb)) printf("resync disable\n");
2233 skip_bits1(&s->gb); /* resync_marker_disabled */
2235 s->data_partioning= get_bits1(&s->gb);
2236 if(s->data_partioning){
2237 printf("data partitioning not supported\n");
2238 skip_bits1(&s->gb); // reversible vlc
2241 if(vo_ver_id != 1) {
2242 s->new_pred= get_bits1(&s->gb);
2244 printf("new pred not supported\n");
2245 skip_bits(&s->gb, 2); /* requested upstream message type */
2246 skip_bits1(&s->gb); /* newpred segment type */
2248 s->reduced_res_vop= get_bits1(&s->gb);
2249 if(s->reduced_res_vop) printf("reduced resolution VOP not supported\n");
2253 s->reduced_res_vop= 0;
2256 s->scalability= get_bits1(&s->gb);
2257 if (s->scalability) {
2258 printf("bad scalability!!!\n");
2262 //printf("end Data %X %d\n", show_bits(&s->gb, 32), get_bits_count(&s->gb)&0x7);
2264 } else if (startcode == 0x1b2) { //userdata
2270 //printf("user Data %X\n", show_bits(&s->gb, 32));
2271 buf[0]= show_bits(&s->gb, 8);
2272 for(i=1; i<256; i++){
2273 buf[i]= show_bits(&s->gb, 16)&0xFF;
2274 if(buf[i]==0) break;
2275 skip_bits(&s->gb, 8);
2278 e=sscanf(buf, "DivX%dBuild%d", &ver, &build);
2280 s->divx_version= ver;
2281 s->divx_build= build;
2282 if(s->picture_number==0){
2283 printf("This file was encoded with DivX%d Build%d\n", ver, build);
2284 if(ver==500 && build==413){ //most likely all version are indeed totally buggy but i dunno for sure ...
2285 printf("WARNING: this version of DivX is not MPEG4 compatible, trying to workaround these bugs...\n");
2287 printf("hmm, i havnt seen that version of divx yet, lets assume they fixed these bugs ...\n"
2288 "using mpeg4 decoder, if it fails contact the developers (of ffmpeg)\n");
2292 //printf("User Data: %s\n", buf);
2294 } else if (startcode != 0x1b6) { //VOP
2298 s->pict_type = get_bits(&s->gb, 2) + 1; /* pict type: I = 0 , P = 1 */
2299 //printf("pic: %d\n", s->pict_type);
2301 while (get_bits1(&s->gb) != 0)
2304 check_marker(&s->gb, "before time_increment");
2305 s->time_increment= get_bits(&s->gb, s->time_increment_bits);
2306 if(s->pict_type!=B_TYPE){
2307 s->time_base+= time_incr;
2308 s->last_non_b_time[1]= s->last_non_b_time[0];
2309 s->last_non_b_time[0]= s->time_base*s->time_increment_resolution + s->time_increment;
2311 s->time= (s->last_non_b_time[1]/s->time_increment_resolution + time_incr)*s->time_increment_resolution;
2312 s->time+= s->time_increment;
2315 if(check_marker(&s->gb, "before vop_coded")==0 && s->picture_number==0){
2316 printf("hmm, seems the headers arnt complete, trying to guess time_increment_bits\n");
2317 for(s->time_increment_bits++ ;s->time_increment_bits<16; s->time_increment_bits++){
2318 if(get_bits1(&s->gb)) break;
2320 printf("my guess is %d bits ;)\n",s->time_increment_bits);
2323 if (get_bits1(&s->gb) != 1)
2325 //printf("time %d %d %d || %d %d %d\n", s->time_increment_bits, s->time_increment, s->time_base,
2326 //s->time, s->last_non_b_time[0], s->last_non_b_time[1]);
2327 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE
2328 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
2329 /* rounding type for motion estimation */
2330 s->no_rounding = get_bits1(&s->gb);
2334 //FIXME reduced res stuff
2336 if (s->shape != RECT_SHAPE) {
2337 if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) {
2338 int width, height, hor_spat_ref, ver_spat_ref;
2340 width = get_bits(&s->gb, 13);
2341 skip_bits1(&s->gb); /* marker */
2342 height = get_bits(&s->gb, 13);
2343 skip_bits1(&s->gb); /* marker */
2344 hor_spat_ref = get_bits(&s->gb, 13); /* hor_spat_ref */
2345 skip_bits1(&s->gb); /* marker */
2346 ver_spat_ref = get_bits(&s->gb, 13); /* ver_spat_ref */
2348 skip_bits1(&s->gb); /* change_CR_disable */
2350 if (get_bits1(&s->gb) != 0) {
2351 skip_bits(&s->gb, 8); /* constant_alpha_value */
2354 //FIXME complexity estimation stuff
2356 if (s->shape != BIN_ONLY_SHAPE) {
2357 skip_bits(&s->gb, 3); /* intra dc VLC threshold */
2358 //FIXME interlaced specific bits
2361 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
2362 if(s->num_sprite_warping_points){
2363 mpeg4_decode_sprite_trajectory(s);
2365 if(s->sprite_brightness_change) printf("sprite_brightness_change not supported\n");
2366 if(s->vol_sprite_usage==STATIC_SPRITE) printf("static sprite not supported\n");
2369 if (s->shape != BIN_ONLY_SHAPE) {
2370 /* note: we do not use quant_precision to avoid problem if no
2371 MPEG4 vol header as it is found on some old opendivx
2373 s->qscale = get_bits(&s->gb, 5);
2375 printf("Error, header damaged or not MPEG4 header (qscale=0)\n");
2376 return -1; // makes no sense to continue, as there is nothing left from the image then
2379 if (s->pict_type != I_TYPE) {
2380 s->f_code = get_bits(&s->gb, 3); /* fcode_for */
2382 printf("Error, header damaged or not MPEG4 header (f_code=0)\n");
2383 return -1; // makes no sense to continue, as the MV decoding will break very quickly
2386 if (s->pict_type == B_TYPE) {
2387 s->b_code = get_bits(&s->gb, 3);
2388 //printf("b-code %d\n", s->b_code);
2390 //printf("quant:%d fcode:%d\n", s->qscale, s->f_code);
2392 if(!s->scalability){
2393 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {
2394 skip_bits1(&s->gb); // vop shape coding type
2398 s->picture_number++; // better than pic number==0 allways ;)
2402 /* don't understand why they choose a different header ! */
2403 int intel_h263_decode_picture_header(MpegEncContext *s)
2407 /* picture header */
2408 if (get_bits(&s->gb, 22) != 0x20)
2410 skip_bits(&s->gb, 8); /* picture timestamp */
2412 if (get_bits1(&s->gb) != 1)
2413 return -1; /* marker */
2414 if (get_bits1(&s->gb) != 0)
2415 return -1; /* h263 id */
2416 skip_bits1(&s->gb); /* split screen off */
2417 skip_bits1(&s->gb); /* camera off */
2418 skip_bits1(&s->gb); /* freeze picture release off */
2420 format = get_bits(&s->gb, 3);
2426 s->pict_type = I_TYPE + get_bits1(&s->gb);
2428 s->unrestricted_mv = get_bits1(&s->gb);
2429 s->h263_long_vectors = s->unrestricted_mv;
2431 if (get_bits1(&s->gb) != 0)
2432 return -1; /* SAC: off */
2433 if (get_bits1(&s->gb) != 0)
2434 return -1; /* advanced prediction mode: off */
2435 if (get_bits1(&s->gb) != 0)
2436 return -1; /* not PB frame */
2438 /* skip unknown header garbage */
2439 skip_bits(&s->gb, 41);
2441 s->qscale = get_bits(&s->gb, 5);
2442 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
2445 while (get_bits1(&s->gb) != 0) {
2446 skip_bits(&s->gb, 8);