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 & b-frame support 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)))
34 #define MAX(a,b) ((a) > (b) ? (a) : (b))
35 #define MIN(a,b) ((a) < (b) ? (a) : (b))
37 static void h263_encode_block(MpegEncContext * s, DCTELEM * block,
39 static void h263_encode_motion(MpegEncContext * s, int val, int fcode);
40 static void h263p_encode_umotion(MpegEncContext * s, int val);
41 static void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block,
42 int n, int dc, UINT8 *scan_table);
43 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode);
44 static int h263p_decode_umotion(MpegEncContext * s, int pred);
45 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
47 static int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
49 static inline int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr);
50 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
52 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s);
54 extern UINT32 inverse[256];
56 static UINT16 mv_penalty[MAX_FCODE+1][MAX_MV*2+1];
57 static UINT8 fcode_tab[MAX_MV*2+1];
58 static UINT8 umv_fcode_tab[MAX_MV*2+1];
60 static UINT16 uni_DCtab_lum [512][2];
61 static UINT16 uni_DCtab_chrom[512][2];
63 int h263_get_picture_format(int width, int height)
67 if (width == 128 && height == 96)
69 else if (width == 176 && height == 144)
71 else if (width == 352 && height == 288)
73 else if (width == 704 && height == 576)
75 else if (width == 1408 && height == 1152)
82 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
86 align_put_bits(&s->pb);
88 /* Update the pointer to last GOB */
89 s->ptr_lastgob = pbBufPtr(&s->pb);
92 put_bits(&s->pb, 22, 0x20); /* PSC */
93 put_bits(&s->pb, 8, (((INT64)s->picture_number * 30 * FRAME_RATE_BASE) /
94 s->frame_rate) & 0xff);
96 put_bits(&s->pb, 1, 1); /* marker */
97 put_bits(&s->pb, 1, 0); /* h263 id */
98 put_bits(&s->pb, 1, 0); /* split screen off */
99 put_bits(&s->pb, 1, 0); /* camera off */
100 put_bits(&s->pb, 1, 0); /* freeze picture release off */
102 format = h263_get_picture_format(s->width, s->height);
105 put_bits(&s->pb, 3, format);
106 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
107 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
108 of H.263v1 UMV implies to check the predicted MV after
109 calculation of the current MB to see if we're on the limits */
110 put_bits(&s->pb, 1, 0); /* unrestricted motion vector: off */
111 put_bits(&s->pb, 1, 0); /* SAC: off */
112 put_bits(&s->pb, 1, 0); /* advanced prediction mode: off */
113 put_bits(&s->pb, 1, 0); /* not PB frame */
114 put_bits(&s->pb, 5, s->qscale);
115 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
118 /* H.263 Plus PTYPE */
119 put_bits(&s->pb, 3, 7);
120 put_bits(&s->pb,3,1); /* Update Full Extended PTYPE */
122 put_bits(&s->pb,3,6); /* Custom Source Format */
124 put_bits(&s->pb, 3, format);
126 put_bits(&s->pb,1,0); /* Custom PCF: off */
127 s->umvplus = (s->pict_type == P_TYPE) && s->unrestricted_mv;
128 put_bits(&s->pb, 1, s->umvplus); /* Unrestricted Motion Vector */
129 put_bits(&s->pb,1,0); /* SAC: off */
130 put_bits(&s->pb,1,0); /* Advanced Prediction Mode: off */
131 put_bits(&s->pb,1,0); /* Advanced Intra Coding: off */
132 put_bits(&s->pb,1,0); /* Deblocking Filter: off */
133 put_bits(&s->pb,1,0); /* Slice Structured: off */
134 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
135 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
136 put_bits(&s->pb,1,0); /* Alternative Inter VLC: off */
137 put_bits(&s->pb,1,0); /* Modified Quantization: off */
138 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
139 put_bits(&s->pb,3,0); /* Reserved */
141 put_bits(&s->pb, 3, s->pict_type == P_TYPE);
143 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
144 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
145 put_bits(&s->pb,1,0); /* Rounding Type */
146 put_bits(&s->pb,2,0); /* Reserved */
147 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
149 /* This should be here if PLUSPTYPE */
150 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
153 /* Custom Picture Format (CPFMT) */
155 put_bits(&s->pb,4,2); /* Aspect ratio: CIF 12:11 (4:3) picture */
156 put_bits(&s->pb,9,(s->width >> 2) - 1);
157 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
158 put_bits(&s->pb,9,(s->height >> 2));
161 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
163 put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
164 put_bits(&s->pb, 5, s->qscale);
167 put_bits(&s->pb, 1, 0); /* no PEI */
170 int h263_encode_gob_header(MpegEncContext * s, int mb_line)
174 /* Check to see if we need to put a new GBSC */
175 /* for RTP packetization */
177 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
178 if (pdif >= s->rtp_payload_size) {
179 /* Bad luck, packet must be cut before */
180 align_put_bits(&s->pb);
181 flush_put_bits(&s->pb);
182 /* Call the RTP callback to send the last GOB */
183 if (s->rtp_callback) {
184 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
185 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
187 s->ptr_lastgob = pbBufPtr(&s->pb);
188 put_bits(&s->pb, 17, 1); /* GBSC */
189 s->gob_number = mb_line / s->gob_index;
190 put_bits(&s->pb, 5, s->gob_number); /* GN */
191 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
192 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
193 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
195 } else if (pdif + s->mb_line_avgsize >= s->rtp_payload_size) {
196 /* Cut the packet before we can't */
197 align_put_bits(&s->pb);
198 flush_put_bits(&s->pb);
199 /* Call the RTP callback to send the last GOB */
200 if (s->rtp_callback) {
201 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
202 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
204 s->ptr_lastgob = pbBufPtr(&s->pb);
205 put_bits(&s->pb, 17, 1); /* GBSC */
206 s->gob_number = mb_line / s->gob_index;
207 put_bits(&s->pb, 5, s->gob_number); /* GN */
208 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
209 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
210 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
217 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6])
219 int score0=0, score1=0;
223 INT16 *ac_val, *ac_val1;
225 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
228 ac_val-= s->block_wrap[n]*16;
230 const int level= block[n][block_permute_op(i )];
232 score1+= ABS(level - ac_val[i+8]);
233 ac_val1[i ]= block[n][block_permute_op(i<<3)];
239 const int level= block[n][block_permute_op(i<<3)];
241 score1+= ABS(level - ac_val[i]);
243 ac_val1[i+8]= block[n][block_permute_op(i )];
248 return score0 > score1 ? 1 : 0;
251 void mpeg4_encode_mb(MpegEncContext * s,
252 DCTELEM block[6][64],
253 int motion_x, int motion_y)
255 int cbpc, cbpy, i, pred_x, pred_y;
258 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
262 for (i = 0; i < 6; i++) {
263 if (s->block_last_index[i] >= 0)
267 if(s->pict_type==B_TYPE){
268 static const int mb_type_table[8]= {-1, 2, 3, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
269 int mb_type= mb_type_table[s->mv_dir];
275 s->last_mv[1][0][1]= 0;
278 /* nothing to do if this MB was skiped in the next P Frame */
279 if(s->mbskip_table[s->mb_y * s->mb_width + s->mb_x]){
285 s->mv_dir= MV_DIR_FORWARD; //doesnt matter
289 if ((cbp | motion_x | motion_y | mb_type) ==0) {
290 /* direct MB with MV={0,0} */
291 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
297 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
298 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
299 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we dont need it :)
300 if(cbp) put_bits(&s->pb, 6, cbp);
303 put_bits(&s->pb, 1, 0); /* no q-scale change */
305 bits= get_bit_count(&s->pb);
306 s->misc_bits+= bits - s->last_bits;
312 h263_encode_motion(s, motion_x, 1);
313 h263_encode_motion(s, motion_y, 1);
316 h263_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code);
317 h263_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
318 h263_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code);
319 h263_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
320 s->last_mv[0][0][0]= s->mv[0][0][0];
321 s->last_mv[0][0][1]= s->mv[0][0][1];
322 s->last_mv[1][0][0]= s->mv[1][0][0];
323 s->last_mv[1][0][1]= s->mv[1][0][1];
325 case 2: /* backward */
326 h263_encode_motion(s, motion_x - s->last_mv[1][0][0], s->b_code);
327 h263_encode_motion(s, motion_y - s->last_mv[1][0][1], s->b_code);
328 s->last_mv[1][0][0]= motion_x;
329 s->last_mv[1][0][1]= motion_y;
331 case 3: /* forward */
332 h263_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);
333 h263_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);
334 s->last_mv[0][0][0]= motion_x;
335 s->last_mv[0][0][1]= motion_y;
338 printf("unknown mb type\n");
341 bits= get_bit_count(&s->pb);
342 s->mv_bits+= bits - s->last_bits;
345 /* encode each block */
346 for (i = 0; i < 6; i++) {
347 mpeg4_encode_block(s, block[i], i, 0, zigzag_direct);
349 bits= get_bit_count(&s->pb);
350 s->p_tex_bits+= bits - s->last_bits;
352 }else{ /* s->pict_type==B_TYPE */
353 if ((cbp | motion_x | motion_y) == 0 && s->mv_type==MV_TYPE_16X16) {
354 /* check if the B frames can skip it too, as we must skip it if we skip here
355 why didnt they just compress the skip-mb bits instead of reusing them ?! */
356 if(s->max_b_frames>0){
358 const int offset= (s->mb_x + s->mb_y*s->linesize)*16;
359 uint8_t *p_pic= s->new_picture[0] + offset;
361 for(i=0; i<s->max_b_frames; i++){
362 uint8_t *b_pic= s->coded_order[i+1].picture[0] + offset;
363 int diff= pix_abs16x16(p_pic, b_pic, s->linesize);
364 if(diff>s->qscale*70){
373 /* skip macroblock */
374 put_bits(&s->pb, 1, 1);
381 put_bits(&s->pb, 1, 0); /* mb coded */
382 if(s->mv_type==MV_TYPE_16X16){
385 inter_MCBPC_bits[cbpc],
386 inter_MCBPC_code[cbpc]);
389 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
391 bits= get_bit_count(&s->pb);
392 s->misc_bits+= bits - s->last_bits;
395 /* motion vectors: 16x16 mode */
396 h263_pred_motion(s, 0, &pred_x, &pred_y);
398 h263_encode_motion(s, motion_x - pred_x, s->f_code);
399 h263_encode_motion(s, motion_y - pred_y, s->f_code);
403 inter_MCBPC_bits[cbpc],
404 inter_MCBPC_code[cbpc]);
407 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
409 bits= get_bit_count(&s->pb);
410 s->misc_bits+= bits - s->last_bits;
414 /* motion vectors: 8x8 mode*/
415 h263_pred_motion(s, i, &pred_x, &pred_y);
417 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][0] - pred_x, s->f_code);
418 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][1] - pred_y, s->f_code);
421 bits= get_bit_count(&s->pb);
422 s->mv_bits+= bits - s->last_bits;
425 /* encode each block */
426 for (i = 0; i < 6; i++) {
427 mpeg4_encode_block(s, block[i], i, 0, zigzag_direct);
429 bits= get_bit_count(&s->pb);
430 s->p_tex_bits+= bits - s->last_bits;
436 int dc_diff[6]; //dc values with the dc prediction subtracted
437 int dir[6]; //prediction direction
438 int zigzag_last_index[6];
439 UINT8 *scan_table[6];
442 const int level= block[i][0];
445 dc_diff[i]= level - mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]);
447 *dc_ptr = level * s->y_dc_scale;
449 *dc_ptr = level * s->c_dc_scale;
453 s->ac_pred= decide_ac_pred(s, block, dir);
460 mpeg4_inv_pred_ac(s, block[i], i, dir[i]);
461 if (dir[i]==0) st = ff_alternate_vertical_scan; /* left */
462 else st = ff_alternate_horizontal_scan; /* top */
464 for(last_index=63; last_index>=0; last_index--) //FIXME optimize
465 if(block[i][st[last_index]]) break;
466 zigzag_last_index[i]= s->block_last_index[i];
467 s->block_last_index[i]= last_index;
472 scan_table[i]= zigzag_direct;
477 for (i = 0; i < 6; i++) {
478 if (s->block_last_index[i] >= 1)
483 if (s->pict_type == I_TYPE) {
485 intra_MCBPC_bits[cbpc],
486 intra_MCBPC_code[cbpc]);
488 put_bits(&s->pb, 1, 0); /* mb coded */
490 inter_MCBPC_bits[cbpc + 4],
491 inter_MCBPC_code[cbpc + 4]);
493 put_bits(&s->pb, 1, s->ac_pred);
495 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
497 bits= get_bit_count(&s->pb);
498 s->misc_bits+= bits - s->last_bits;
501 /* encode each block */
502 for (i = 0; i < 6; i++) {
503 mpeg4_encode_block(s, block[i], i, dc_diff[i], scan_table[i]);
506 bits= get_bit_count(&s->pb);
507 s->i_tex_bits+= bits - s->last_bits;
511 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
517 ac_val = s->ac_val[0][0] + s->block_index[i] * 16;
521 block[i][block_permute_op(j )]= ac_val[j+8];
524 block[i][block_permute_op(j<<3)]= ac_val[j ];
526 s->block_last_index[i]= zigzag_last_index[i];
532 void h263_encode_mb(MpegEncContext * s,
533 DCTELEM block[6][64],
534 int motion_x, int motion_y)
536 int cbpc, cbpy, i, cbp, pred_x, pred_y;
538 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
542 for (i = 0; i < 6; i++) {
543 if (s->block_last_index[i] >= 0)
546 if ((cbp | motion_x | motion_y) == 0) {
547 /* skip macroblock */
548 put_bits(&s->pb, 1, 1);
551 put_bits(&s->pb, 1, 0); /* mb coded */
554 inter_MCBPC_bits[cbpc],
555 inter_MCBPC_code[cbpc]);
558 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
560 /* motion vectors: 16x16 mode only now */
561 h263_pred_motion(s, 0, &pred_x, &pred_y);
564 h263_encode_motion(s, motion_x - pred_x, s->f_code);
565 h263_encode_motion(s, motion_y - pred_y, s->f_code);
568 h263p_encode_umotion(s, motion_x - pred_x);
569 h263p_encode_umotion(s, motion_y - pred_y);
570 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
571 /* To prevent Start Code emulation */
572 put_bits(&s->pb,1,1);
577 for (i = 0; i < 6; i++) {
578 if (s->block_last_index[i] >= 1)
583 if (s->pict_type == I_TYPE) {
585 intra_MCBPC_bits[cbpc],
586 intra_MCBPC_code[cbpc]);
588 put_bits(&s->pb, 1, 0); /* mb coded */
590 inter_MCBPC_bits[cbpc + 4],
591 inter_MCBPC_code[cbpc + 4]);
594 /* XXX: currently, we do not try to use ac prediction */
595 put_bits(&s->pb, 1, 0); /* no ac prediction */
598 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
601 /* encode each block */
602 for (i = 0; i < 6; i++) {
603 h263_encode_block(s, block[i], i);
607 void h263_pred_acdc(MpegEncContext * s, INT16 *block, int n)
609 int x, y, wrap, a, c, pred_dc, scale, i;
610 INT16 *dc_val, *ac_val, *ac_val1;
612 /* find prediction */
614 x = 2 * s->mb_x + 1 + (n & 1);
615 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
616 wrap = s->mb_width * 2 + 2;
617 dc_val = s->dc_val[0];
618 ac_val = s->ac_val[0][0];
619 scale = s->y_dc_scale;
623 wrap = s->mb_width + 2;
624 dc_val = s->dc_val[n - 4 + 1];
625 ac_val = s->ac_val[n - 4 + 1][0];
626 scale = s->c_dc_scale;
629 ac_val += ((y) * wrap + (x)) * 16;
635 a = dc_val[(x - 1) + (y) * wrap];
636 c = dc_val[(x) + (y - 1) * wrap];
640 if (s->h263_aic_dir) {
641 /* left prediction */
645 block[block_permute_op(i*8)] += ac_val[i];
654 block[block_permute_op(i)] += ac_val[i + 8];
660 /* just DC prediction */
661 if (a != 1024 && c != 1024)
662 pred_dc = (a + c) >> 1;
669 /* we assume pred is positive */
670 block[0]=block[0]*scale + pred_dc;
674 else if (!(block[0] & 1))
677 /* Update AC/DC tables */
678 dc_val[(x) + (y) * wrap] = block[0];
682 ac_val1[i] = block[block_permute_op(i * 8)];
685 ac_val1[8 + i] = block[block_permute_op(i)];
688 INT16 *h263_pred_motion(MpegEncContext * s, int block,
692 INT16 *A, *B, *C, *mot_val;
693 static const int off[4]= {2, 1, 1, -1};
695 wrap = s->block_wrap[0];
696 xy = s->block_index[block];
698 mot_val = s->motion_val[xy];
700 /* special case for first line */
701 if ((s->mb_y == 0 || s->first_slice_line || s->first_gob_line) && block<2) {
702 A = s->motion_val[xy - 1];
706 A = s->motion_val[xy - 1];
707 B = s->motion_val[xy - wrap];
708 C = s->motion_val[xy + off[block] - wrap];
709 *px = mid_pred(A[0], B[0], C[0]);
710 *py = mid_pred(A[1], B[1], C[1]);
715 static void h263_encode_motion(MpegEncContext * s, int val, int f_code)
717 int range, l, m, bit_size, sign, code, bits;
722 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
724 bit_size = f_code - 1;
725 range = 1 << bit_size;
726 /* modulo encoding */
731 } else if (val >= l) {
742 code = (val >> bit_size) + 1;
743 bits = val & (range - 1);
745 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
747 put_bits(&s->pb, bit_size, bits);
752 /* Encode MV differences on H.263+ with Unrestricted MV mode */
753 static void h263p_encode_umotion(MpegEncContext * s, int val)
763 put_bits(&s->pb, 1, 1);
765 put_bits(&s->pb, 3, 0);
767 put_bits(&s->pb, 3, 2);
770 sval = ((val < 0) ? (short)(-val):(short)val);
773 while (temp_val != 0) {
774 temp_val = temp_val >> 1;
780 tcode = (sval & (1 << (i-1))) >> (i-1);
781 tcode = (tcode << 1) | 1;
782 code = (code << 2) | tcode;
785 code = ((code << 1) | (val < 0)) << 1;
786 put_bits(&s->pb, (2*n_bits)+1, code);
787 //printf("\nVal = %d\tCode = %d", sval, code);
791 static void init_mv_penalty_and_fcode(MpegEncContext *s)
795 for(f_code=1; f_code<=MAX_FCODE; f_code++){
796 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
799 if(mv==0) len= mvtab[0][1];
801 int val, bit_size, range, code;
803 bit_size = s->f_code - 1;
804 range = 1 << bit_size;
810 code = (val >> bit_size) + 1;
812 len= mvtab[code][1] + 1 + bit_size;
814 len= mvtab[32][1] + 2 + bit_size;
818 mv_penalty[f_code][mv+MAX_MV]= len;
822 for(f_code=MAX_FCODE; f_code>0; f_code--){
823 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
824 fcode_tab[mv+MAX_MV]= f_code;
828 for(mv=0; mv<MAX_MV*2+1; mv++){
829 umv_fcode_tab[mv]= 1;
833 static void init_uni_dc_tab()
835 int level, uni_code, uni_len;
837 for(level=-256; level<256; level++){
839 /* find number of bits */
848 l= (-level) ^ ((1 << size) - 1);
853 uni_code= DCtab_lum[size][0];
854 uni_len = DCtab_lum[size][1];
857 uni_code<<=size; uni_code|=l;
860 uni_code<<=1; uni_code|=1;
864 uni_DCtab_lum[level+256][0]= uni_code;
865 uni_DCtab_lum[level+256][1]= uni_len;
868 uni_code= DCtab_chrom[size][0];
869 uni_len = DCtab_chrom[size][1];
872 uni_code<<=size; uni_code|=l;
875 uni_code<<=1; uni_code|=1;
879 uni_DCtab_chrom[level+256][0]= uni_code;
880 uni_DCtab_chrom[level+256][1]= uni_len;
885 void h263_encode_init(MpegEncContext *s)
897 init_mv_penalty_and_fcode(s);
899 s->mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
901 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
902 if(s->h263_plus) s->fcode_tab= umv_fcode_tab;
903 else if(s->h263_pred && !s->h263_msmpeg4) s->fcode_tab= fcode_tab;
906 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
908 int level, run, last, i, j, last_index, last_non_zero, sign, slevel;
910 RLTable *rl = &rl_inter;
915 /* 255 cannot be represented, so we clamp */
920 /* 0 cannot be represented also */
926 put_bits(&s->pb, 8, 0xff);
928 put_bits(&s->pb, 8, level & 0xff);
935 last_index = s->block_last_index[n];
936 last_non_zero = i - 1;
937 for (; i <= last_index; i++) {
938 j = zigzag_direct[i];
941 run = i - last_non_zero - 1;
942 last = (i == last_index);
949 code = get_rl_index(rl, last, run, level);
950 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
952 put_bits(&s->pb, 1, last);
953 put_bits(&s->pb, 6, run);
954 put_bits(&s->pb, 8, slevel & 0xff);
956 put_bits(&s->pb, 1, sign);
963 /***************************************************/
965 static void mpeg4_stuffing(PutBitContext * pbc)
969 length= (-get_bit_count(pbc))&7;
970 put_bits(pbc, length, (1<<length)-1);
973 static void put_string(PutBitContext * pbc, char *s)
976 put_bits(pbc, 8, *s);
982 /* must be called before writing the header */
983 void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){
984 int time_div, time_mod;
986 if(s->pict_type==I_TYPE){ //we will encode a vol header
987 s->time_increment_resolution= s->frame_rate/ff_gcd(s->frame_rate, FRAME_RATE_BASE);
988 if(s->time_increment_resolution>=256*256) s->time_increment_resolution= 256*128;
990 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
993 s->time= picture_number*(int64_t)FRAME_RATE_BASE*s->time_increment_resolution/s->frame_rate;
994 time_div= s->time/s->time_increment_resolution;
995 time_mod= s->time%s->time_increment_resolution;
997 if(s->pict_type==B_TYPE){
998 s->bp_time= s->last_non_b_time - s->time;
1000 s->last_time_base= s->time_base;
1001 s->time_base= time_div;
1002 s->pp_time= s->time - s->last_non_b_time;
1003 s->last_non_b_time= s->time;
1007 static void mpeg4_encode_vol_header(MpegEncContext * s)
1009 int vo_ver_id=1; //must be 2 if we want GMC or q-pel
1012 s->vo_type= s->has_b_frames ? CORE_VO_TYPE : SIMPLE_VO_TYPE;
1014 if(get_bit_count(&s->pb)!=0) mpeg4_stuffing(&s->pb);
1015 put_bits(&s->pb, 16, 0);
1016 put_bits(&s->pb, 16, 0x100); /* video obj */
1017 put_bits(&s->pb, 16, 0);
1018 put_bits(&s->pb, 16, 0x120); /* video obj layer */
1020 put_bits(&s->pb, 1, 0); /* random access vol */
1021 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
1022 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
1023 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
1024 put_bits(&s->pb, 3, 1); /* is obj layer priority */
1025 if(s->aspect_ratio_info)
1026 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
1028 put_bits(&s->pb, 4, 1); /* aspect ratio info= sqare pixel */
1031 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
1032 put_bits(&s->pb, 2, 1); /* chroma format 422 */
1033 put_bits(&s->pb, 1, s->low_delay);
1034 put_bits(&s->pb, 1, 0); /* vbv parameters= no */
1036 put_bits(&s->pb, 1, 0); /* vol control parameters= no */
1039 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
1040 put_bits(&s->pb, 1, 1); /* marker bit */
1042 put_bits(&s->pb, 16, s->time_increment_resolution);
1043 if (s->time_increment_bits < 1)
1044 s->time_increment_bits = 1;
1045 put_bits(&s->pb, 1, 1); /* marker bit */
1046 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
1047 put_bits(&s->pb, 1, 1); /* marker bit */
1048 put_bits(&s->pb, 13, s->width); /* vol width */
1049 put_bits(&s->pb, 1, 1); /* marker bit */
1050 put_bits(&s->pb, 13, s->height); /* vol height */
1051 put_bits(&s->pb, 1, 1); /* marker bit */
1052 put_bits(&s->pb, 1, 0); /* interlace */
1053 put_bits(&s->pb, 1, 1); /* obmc disable */
1054 if (vo_ver_id == 1) {
1055 put_bits(&s->pb, 1, s->vol_sprite_usage=0); /* sprite enable */
1056 }else{ /* vo_ver_id == 2 */
1057 put_bits(&s->pb, 2, s->vol_sprite_usage=0); /* sprite enable */
1059 put_bits(&s->pb, 1, 0); /* not 8 bit */
1060 put_bits(&s->pb, 1, 0); /* quant type= h263 style*/
1062 put_bits(&s->pb, 1, s->quarter_sample=0);
1063 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
1064 put_bits(&s->pb, 1, 1); /* resync marker disable */
1065 put_bits(&s->pb, 1, 0); /* data partitioned */
1066 if (vo_ver_id != 1){
1067 put_bits(&s->pb, 1, 0); /* newpred */
1068 put_bits(&s->pb, 1, 0); /* reduced res vop */
1070 put_bits(&s->pb, 1, 0); /* scalability */
1072 mpeg4_stuffing(&s->pb);
1073 put_bits(&s->pb, 16, 0);
1074 put_bits(&s->pb, 16, 0x1B2); /* user_data */
1075 sprintf(buf, "FFmpeg v%s / libavcodec build: %s", FFMPEG_VERSION, LIBAVCODEC_BUILD_STR);
1076 put_string(&s->pb, buf);
1081 /* write mpeg4 VOP header */
1082 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
1085 int time_div, time_mod;
1087 if(s->pict_type==I_TYPE) mpeg4_encode_vol_header(s);
1089 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->frame_rate, FRAME_RATE_BASE);
1091 if(get_bit_count(&s->pb)!=0) mpeg4_stuffing(&s->pb);
1092 put_bits(&s->pb, 16, 0); /* vop header */
1093 put_bits(&s->pb, 16, 0x1B6); /* vop header */
1094 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
1096 time_div= s->time/s->time_increment_resolution;
1097 time_mod= s->time%s->time_increment_resolution;
1098 time_incr= time_div - s->last_time_base;
1100 put_bits(&s->pb, 1, 1);
1102 put_bits(&s->pb, 1, 0);
1104 put_bits(&s->pb, 1, 1); /* marker */
1105 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
1106 put_bits(&s->pb, 1, 1); /* marker */
1107 put_bits(&s->pb, 1, 1); /* vop coded */
1108 if ( s->pict_type == P_TYPE
1109 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
1110 s->no_rounding ^= 1;
1111 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
1113 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
1114 //FIXME sprite stuff
1116 put_bits(&s->pb, 5, s->qscale);
1118 if (s->pict_type != I_TYPE)
1119 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
1120 if (s->pict_type == B_TYPE)
1121 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
1122 // printf("****frame %d\n", picture_number);
1125 void h263_dc_scale(MpegEncContext * s)
1128 const static UINT8 y_tab[32]={
1129 // 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
1130 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
1132 const static UINT8 c_tab[32]={
1133 // 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
1134 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
1136 s->y_dc_scale = y_tab[s->qscale];
1137 s->c_dc_scale = c_tab[s->qscale];
1144 else if (quant > 4 && quant < 9)
1145 s->y_dc_scale = (2 * quant);
1146 else if (quant > 8 && quant < 25)
1147 s->y_dc_scale = (quant + 8);
1149 s->y_dc_scale = (2 * quant - 16);
1153 else if (quant > 4 && quant < 25)
1154 s->c_dc_scale = ((quant + 13) / 2);
1156 s->c_dc_scale = (quant - 6);
1160 static inline int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr)
1162 int a, b, c, wrap, pred, scale;
1166 /* find prediction */
1168 scale = s->y_dc_scale;
1170 scale = s->c_dc_scale;
1172 wrap= s->block_wrap[n];
1173 dc_val = s->dc_val[0] + s->block_index[n];
1179 b = dc_val[ - 1 - wrap];
1180 c = dc_val[ - wrap];
1182 if (abs(a - b) < abs(b - c)) {
1184 *dir_ptr = 1; /* top */
1187 *dir_ptr = 0; /* left */
1189 /* we assume pred is positive */
1192 "xorl %%edx, %%edx \n\t"
1194 : "=d" (pred), "=a"(dummy)
1195 : "a" (pred + (scale >> 1)), "c" (inverse[scale])
1198 pred = (pred + (scale >> 1)) / scale;
1201 /* prepare address for prediction update */
1202 *dc_val_ptr = &dc_val[0];
1207 void mpeg4_pred_ac(MpegEncContext * s, INT16 *block, int n,
1211 INT16 *ac_val, *ac_val1;
1213 /* find prediction */
1214 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1218 /* left prediction */
1221 block[block_permute_op(i*8)] += ac_val[i];
1224 /* top prediction */
1225 ac_val -= 16 * s->block_wrap[n];
1227 block[block_permute_op(i)] += ac_val[i + 8];
1233 ac_val1[i] = block[block_permute_op(i * 8)];
1236 ac_val1[8 + i] = block[block_permute_op(i)];
1239 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
1245 /* find prediction */
1246 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1249 /* left prediction */
1252 block[block_permute_op(i*8)] -= ac_val[i];
1255 /* top prediction */
1256 ac_val -= 16 * s->block_wrap[n];
1258 block[block_permute_op(i)] -= ac_val[i + 8];
1263 static inline void mpeg4_encode_dc(MpegEncContext * s, int level, int n)
1269 put_bits(&s->pb, uni_DCtab_lum[level][1], uni_DCtab_lum[level][0]);
1272 put_bits(&s->pb, uni_DCtab_chrom[level][1], uni_DCtab_chrom[level][0]);
1276 /* find number of bits */
1286 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
1289 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
1292 /* encode remaining bits */
1295 level = (-level) ^ ((1 << size) - 1);
1296 put_bits(&s->pb, size, level);
1298 put_bits(&s->pb, 1, 1);
1303 static void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, UINT8 *scan_table)
1305 int level, run, last, i, j, last_index, last_non_zero, sign, slevel;
1310 /* mpeg4 based DC predictor */
1311 mpeg4_encode_dc(s, intra_dc, n);
1320 last_index = s->block_last_index[n];
1321 last_non_zero = i - 1;
1322 for (; i <= last_index; i++) {
1326 run = i - last_non_zero - 1;
1327 last = (i == last_index);
1334 code = get_rl_index(rl, last, run, level);
1335 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1336 if (code == rl->n) {
1338 level1 = level - rl->max_level[last][run];
1341 code = get_rl_index(rl, last, run, level1);
1342 if (code == rl->n) {
1344 put_bits(&s->pb, 1, 1);
1345 if (level > MAX_LEVEL)
1347 run1 = run - rl->max_run[last][level] - 1;
1350 code = get_rl_index(rl, last, run1, level);
1351 if (code == rl->n) {
1354 put_bits(&s->pb, 1, 1);
1355 put_bits(&s->pb, 1, last);
1356 put_bits(&s->pb, 6, run);
1357 put_bits(&s->pb, 1, 1);
1358 put_bits(&s->pb, 12, slevel & 0xfff);
1359 put_bits(&s->pb, 1, 1);
1362 put_bits(&s->pb, 1, 0);
1363 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1364 put_bits(&s->pb, 1, sign);
1368 put_bits(&s->pb, 1, 0);
1369 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1370 put_bits(&s->pb, 1, sign);
1373 put_bits(&s->pb, 1, sign);
1382 /***********************************************/
1385 static VLC intra_MCBPC_vlc;
1386 static VLC inter_MCBPC_vlc;
1387 static VLC cbpy_vlc;
1389 static VLC dc_lum, dc_chrom;
1390 static VLC sprite_trajectory;
1391 static VLC mb_type_b_vlc;
1393 void init_rl(RLTable *rl)
1395 INT8 max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
1396 UINT8 index_run[MAX_RUN+1];
1397 int last, run, level, start, end, i;
1399 /* compute max_level[], max_run[] and index_run[] */
1400 for(last=0;last<2;last++) {
1409 memset(max_level, 0, MAX_RUN + 1);
1410 memset(max_run, 0, MAX_LEVEL + 1);
1411 memset(index_run, rl->n, MAX_RUN + 1);
1412 for(i=start;i<end;i++) {
1413 run = rl->table_run[i];
1414 level = rl->table_level[i];
1415 if (index_run[run] == rl->n)
1417 if (level > max_level[run])
1418 max_level[run] = level;
1419 if (run > max_run[level])
1420 max_run[level] = run;
1422 rl->max_level[last] = malloc(MAX_RUN + 1);
1423 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1424 rl->max_run[last] = malloc(MAX_LEVEL + 1);
1425 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1426 rl->index_run[last] = malloc(MAX_RUN + 1);
1427 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1431 void init_vlc_rl(RLTable *rl)
1433 init_vlc(&rl->vlc, 9, rl->n + 1,
1434 &rl->table_vlc[0][1], 4, 2,
1435 &rl->table_vlc[0][0], 4, 2);
1440 /* XXX: find a better solution to handle static init */
1441 void h263_decode_init_vlc(MpegEncContext *s)
1443 static int done = 0;
1448 init_vlc(&intra_MCBPC_vlc, 6, 8,
1449 intra_MCBPC_bits, 1, 1,
1450 intra_MCBPC_code, 1, 1);
1451 init_vlc(&inter_MCBPC_vlc, 9, 25,
1452 inter_MCBPC_bits, 1, 1,
1453 inter_MCBPC_code, 1, 1);
1454 init_vlc(&cbpy_vlc, 6, 16,
1455 &cbpy_tab[0][1], 2, 1,
1456 &cbpy_tab[0][0], 2, 1);
1457 init_vlc(&mv_vlc, 9, 33,
1459 &mvtab[0][0], 2, 1);
1462 init_rl(&rl_intra_aic);
1463 init_vlc_rl(&rl_inter);
1464 init_vlc_rl(&rl_intra);
1465 init_vlc_rl(&rl_intra_aic);
1466 init_vlc(&dc_lum, 9, 13,
1467 &DCtab_lum[0][1], 2, 1,
1468 &DCtab_lum[0][0], 2, 1);
1469 init_vlc(&dc_chrom, 9, 13,
1470 &DCtab_chrom[0][1], 2, 1,
1471 &DCtab_chrom[0][0], 2, 1);
1472 init_vlc(&sprite_trajectory, 9, 15,
1473 &sprite_trajectory_tab[0][1], 4, 2,
1474 &sprite_trajectory_tab[0][0], 4, 2);
1475 init_vlc(&mb_type_b_vlc, 4, 4,
1476 &mb_type_b_tab[0][1], 2, 1,
1477 &mb_type_b_tab[0][0], 2, 1);
1481 int h263_decode_gob_header(MpegEncContext *s)
1483 unsigned int val, gfid;
1485 /* Check for GOB Start Code */
1486 val = show_bits(&s->gb, 16);
1488 /* We have a GBSC probably with GSTUFF */
1489 skip_bits(&s->gb, 16); /* Drop the zeros */
1490 while (get_bits1(&s->gb) == 0); /* Seek the '1' bit */
1492 fprintf(stderr,"\nGOB Start Code at MB %d\n", (s->mb_y * s->mb_width) + s->mb_x);
1494 s->gob_number = get_bits(&s->gb, 5); /* GN */
1495 gfid = get_bits(&s->gb, 2); /* GFID */
1496 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
1498 fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", s->gob_number, gfid, s->qscale);
1506 static inline void memsetw(short *tab, int val, int n)
1513 static int mpeg4_resync(MpegEncContext *s)
1516 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
1517 int header_extension=0, mb_num;
1518 int c_wrap, c_xy, l_wrap, l_xy;
1520 //printf("resync at %d %d\n", s->mb_x, s->mb_y);
1521 //printf("%X\n", show_bits(&s->gb, 24));
1523 if( get_bits_count(&s->gb) > s->gb.size*8-32)
1526 align_get_bits(&s->gb);
1529 v = get_bits(&s->gb, 8);
1531 state = ((state << 8) | v) & 0xffff;
1532 if (state == 0) break;
1533 if( get_bits_count(&s->gb) > s->gb.size*8-32){
1534 printf("resync failed\n");
1538 //printf("%X\n", show_bits(&s->gb, 24));
1540 while(!get_bits1(&s->gb) && bits<30) bits++;
1541 if(s->pict_type == P_TYPE && bits != s->f_code-1)
1542 printf("marker does not match f_code\n");
1543 //FIXME check bits for B-framess
1544 //printf("%X\n", show_bits(&s->gb, 24));
1546 if(s->shape != RECT_SHAPE){
1547 header_extension= get_bits1(&s->gb);
1548 //FIXME more stuff here
1551 mb_num= get_bits(&s->gb, mb_num_bits);
1552 if(mb_num != s->mb_x + s->mb_y*s->mb_width){
1553 printf("MB-num change not supported %d %d\n", mb_num, s->mb_x + s->mb_y*s->mb_width);
1554 // s->mb_x= mb_num % s->mb_width;
1555 // s->mb_y= mb_num / s->mb_width;
1556 //FIXME many vars are wrong now
1559 if(s->shape != BIN_ONLY_SHAPE){
1560 s->qscale= get_bits(&s->gb, 5);
1564 if(s->shape == RECT_SHAPE){
1565 header_extension= get_bits1(&s->gb);
1567 if(header_extension){
1569 printf("header extension not really supported\n");
1570 while (get_bits1(&s->gb) != 0)
1573 check_marker(&s->gb, "before time_increment in video packed header");
1574 time_increment= get_bits(&s->gb, s->time_increment_bits);
1575 if(s->pict_type!=B_TYPE){
1576 s->last_time_base= s->time_base;
1577 s->time_base+= time_incr;
1578 s->time= s->time_base*s->time_increment_resolution + time_increment;
1579 s->pp_time= s->time - s->last_non_b_time;
1580 s->last_non_b_time= s->time;
1582 s->time= (s->last_time_base + time_incr)*s->time_increment_resolution + time_increment;
1583 s->bp_time= s->last_non_b_time - s->time;
1585 check_marker(&s->gb, "before vop_coding_type in video packed header");
1587 skip_bits(&s->gb, 2); /* vop coding type */
1588 //FIXME not rect stuff here
1590 if(s->shape != BIN_ONLY_SHAPE){
1591 skip_bits(&s->gb, 3); /* intra dc vlc threshold */
1593 if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE && s->num_sprite_warping_points){
1594 mpeg4_decode_sprite_trajectory(s);
1597 //FIXME reduced res stuff here
1599 if (s->pict_type != I_TYPE) {
1600 s->f_code = get_bits(&s->gb, 3); /* fcode_for */
1602 printf("Error, video packet header damaged or not MPEG4 header (f_code=0)\n");
1603 return -1; // makes no sense to continue, as the MV decoding will break very quickly
1606 if (s->pict_type == B_TYPE) {
1607 s->b_code = get_bits(&s->gb, 3);
1612 //FIXME new-pred stuff
1614 l_wrap= s->block_wrap[0];
1615 l_xy= s->mb_y*l_wrap*2;
1616 c_wrap= s->block_wrap[4];
1617 c_xy= s->mb_y*c_wrap;
1620 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*3);
1621 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap*2);
1622 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap*2);
1625 memset(s->ac_val[0] + l_xy, 0, l_wrap*3*16*sizeof(INT16));
1626 memset(s->ac_val[1] + c_xy, 0, c_wrap*2*16*sizeof(INT16));
1627 memset(s->ac_val[2] + c_xy, 0, c_wrap*2*16*sizeof(INT16));
1630 memset(s->motion_val + l_xy, 0, l_wrap*3*2*sizeof(INT16));
1631 // memset(s->motion_val, 0, 2*sizeof(INT16)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
1632 s->resync_x_pos= s->mb_x;
1633 s->first_slice_line=1;
1638 int h263_decode_mb(MpegEncContext *s,
1639 DCTELEM block[6][64])
1641 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
1643 static INT8 quant_tab[4] = { -1, -2, 1, 2 };
1645 if(s->resync_marker){
1646 if( s->resync_x_pos == s->mb_x+1
1647 || s->resync_x_pos == s->mb_x){
1649 this is here so we dont need to slowdown h263_pred_motion with it */
1650 if(s->resync_x_pos == s->mb_x+1 && s->mb_x==0){
1651 int xy= s->block_index[0] - s->block_wrap[0];
1652 s->motion_val[xy][0]= s->motion_val[xy+2][0];
1653 s->motion_val[xy][1]= s->motion_val[xy+2][1];
1656 s->first_slice_line=0;
1657 s->resync_x_pos=0; // isnt needed but for cleanness sake ;)
1660 if(show_aligned_bits(&s->gb, 1, 16) == 0){
1661 if( mpeg4_resync(s) < 0 ) return -1;
1666 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
1667 if (get_bits1(&s->gb)) {
1671 s->block_last_index[i] = -1;
1672 s->mv_dir = MV_DIR_FORWARD;
1673 s->mv_type = MV_TYPE_16X16;
1674 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
1675 const int a= s->sprite_warping_accuracy;
1676 // int l = (1 << (s->f_code - 1)) * 32;
1679 if(s->divx_version==500 && s->divx_build==413){
1680 s->mv[0][0][0] = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
1681 s->mv[0][0][1] = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
1683 s->mv[0][0][0] = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
1684 s->mv[0][0][1] = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
1686 /* if (s->mv[0][0][0] < -l) s->mv[0][0][0]= -l;
1687 else if (s->mv[0][0][0] >= l) s->mv[0][0][0]= l-1;
1688 if (s->mv[0][0][1] < -l) s->mv[0][0][1]= -l;
1689 else if (s->mv[0][0][1] >= l) s->mv[0][0][1]= l-1;*/
1700 cbpc = get_vlc(&s->gb, &inter_MCBPC_vlc);
1701 //fprintf(stderr, "\tCBPC: %d", cbpc);
1706 else if (cbpc == 20)
1707 fprintf(stderr, "Stuffing !");
1710 s->mb_intra = ((cbpc & 4) != 0);
1711 if (s->mb_intra) goto intra;
1713 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
1714 s->mcsel= get_bits1(&s->gb);
1716 cbpy = get_vlc(&s->gb, &cbpy_vlc);
1717 cbp = (cbpc & 3) | ((cbpy ^ 0xf) << 2);
1719 s->qscale += quant_tab[get_bits(&s->gb, 2)];
1722 else if (s->qscale > 31)
1726 s->mv_dir = MV_DIR_FORWARD;
1727 if ((cbpc & 16) == 0) {
1728 /* 16x16 motion prediction */
1729 s->mv_type = MV_TYPE_16X16;
1730 h263_pred_motion(s, 0, &pred_x, &pred_y);
1732 mx = h263p_decode_umotion(s, pred_x);
1734 mx = h263_decode_motion(s, pred_x, s->f_code);
1736 const int a= s->sprite_warping_accuracy;
1737 // int l = (1 << (s->f_code - 1)) * 32;
1738 if(s->divx_version==500 && s->divx_build==413){
1739 mx = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
1741 mx = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
1743 // if (mx < -l) mx= -l, printf("C");
1744 // else if (mx >= l) mx= l-1, printf("C");
1750 my = h263p_decode_umotion(s, pred_y);
1752 my = h263_decode_motion(s, pred_y, s->f_code);
1754 const int a= s->sprite_warping_accuracy;
1755 // int l = (1 << (s->f_code - 1)) * 32;
1756 if(s->divx_version==500 && s->divx_build==413){
1757 my = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
1759 my = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
1761 // if (my < -l) my= -l, printf("C");
1762 // else if (my >= l) my= l-1, printf("C");
1766 s->mv[0][0][0] = mx;
1767 s->mv[0][0][1] = my;
1768 /*fprintf(stderr, "\n MB %d", (s->mb_y * s->mb_width) + s->mb_x);
1769 fprintf(stderr, "\n\tmvx: %d\t\tpredx: %d", mx, pred_x);
1770 fprintf(stderr, "\n\tmvy: %d\t\tpredy: %d", my, pred_y);*/
1771 if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
1772 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
1775 s->mv_type = MV_TYPE_8X8;
1777 mot_val = h263_pred_motion(s, i, &pred_x, &pred_y);
1779 mx = h263p_decode_umotion(s, pred_x);
1781 mx = h263_decode_motion(s, pred_x, s->f_code);
1786 my = h263p_decode_umotion(s, pred_y);
1788 my = h263_decode_motion(s, pred_y, s->f_code);
1791 s->mv[0][i][0] = mx;
1792 s->mv[0][i][1] = my;
1793 if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
1794 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
1799 } else if(s->pict_type==B_TYPE) {
1800 int modb1; // first bit of modb
1801 int modb2; // second bit of modb
1807 s->mb_intra = 0; //B-frames never contain intra blocks
1808 s->mcsel=0; // ... true gmc blocks
1811 s->last_mv[0][0][0]=
1812 s->last_mv[0][0][1]=
1813 s->last_mv[1][0][0]=
1814 s->last_mv[1][0][1]= 0;
1818 /* if we skipped it in the future P Frame than skip it now too */
1819 s->mb_skiped= s->mbskip_table[s->mb_y * s->mb_width + s->mb_x]; // Note, skiptab=0 if last was GMC
1824 s->block_last_index[i] = -1;
1826 s->mv_dir = MV_DIR_FORWARD;
1827 s->mv_type = MV_TYPE_16X16;
1832 //FIXME is this correct?
1833 /* s->last_mv[0][0][0]=
1834 s->last_mv[0][0][1]=0;*/
1839 modb1= get_bits1(&s->gb);
1841 modb2= get_bits1(&s->gb);
1842 mb_type= get_vlc(&s->gb, &mb_type_b_vlc);
1843 if(modb2==0) cbp= get_bits(&s->gb, 6);
1845 if (mb_type && cbp) {
1846 if(get_bits1(&s->gb)){
1847 s->qscale +=get_bits1(&s->gb)*4 - 2;
1850 else if (s->qscale > 31)
1856 mb_type=4; //like 0 but no vectors coded
1859 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
1860 mx=my=0; //for case 4, we could put this to the mb_type=4 but than gcc compains about uninitalized mx/my
1863 case 0: /* direct */
1864 mx = h263_decode_motion(s, 0, 1);
1865 my = h263_decode_motion(s, 0, 1);
1866 case 4: /* direct with mx=my=0 */
1867 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
1868 xy= s->block_index[0];
1869 time_pp= s->pp_time;
1870 time_pb= time_pp - s->bp_time;
1871 //if(time_pp>3000 )printf("%d %d ", time_pp, time_pb);
1873 //FIXME avoid divides
1874 s->mv[0][0][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
1875 s->mv[0][0][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
1876 s->mv[1][0][0] = mx ? s->mv[0][0][0] - s->motion_val[xy][0]
1877 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp + mx;
1878 s->mv[1][0][1] = my ? s->mv[0][0][1] - s->motion_val[xy][1]
1879 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp + my;
1883 s->mv[1][0][1] = 1000;*/
1887 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
1888 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
1889 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
1890 s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
1891 s->last_mv[0][0][1]= s->mv[0][0][1] = my;
1893 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
1894 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
1895 s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
1896 s->last_mv[1][0][1]= s->mv[1][0][1] = my;
1900 s->mv_dir = MV_DIR_BACKWARD;
1901 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
1902 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
1903 s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
1904 s->last_mv[1][0][1]= s->mv[1][0][1] = my;
1908 s->mv_dir = MV_DIR_FORWARD;
1909 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
1910 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
1911 s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
1912 s->last_mv[0][0][1]= s->mv[0][0][1] = my;
1917 } else { /* I-Frame */
1918 cbpc = get_vlc(&s->gb, &intra_MCBPC_vlc);
1925 if (s->h263_pred || s->h263_aic) {
1926 s->ac_pred = get_bits1(&s->gb);
1927 if (s->ac_pred && s->h263_aic)
1928 s->h263_aic_dir = get_bits1(&s->gb);
1931 s->y_dc_scale = 2 * s->qscale;
1932 s->c_dc_scale = 2 * s->qscale;
1934 cbpy = get_vlc(&s->gb, &cbpy_vlc);
1935 cbp = (cbpc & 3) | (cbpy << 2);
1937 s->qscale += quant_tab[get_bits(&s->gb, 2)];
1940 else if (s->qscale > 31)
1946 /* decode each block */
1948 for (i = 0; i < 6; i++) {
1949 if (mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
1953 for (i = 0; i < 6; i++) {
1954 if (h263_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
1961 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
1963 int code, val, sign, shift, l, m;
1965 code = get_vlc(&s->gb, &mv_vlc);
1971 sign = get_bits1(&s->gb);
1973 val = (code - 1) << shift;
1975 val |= get_bits(&s->gb, shift);
1981 /* modulo decoding */
1982 if (!s->h263_long_vectors) {
1983 l = (1 << (f_code - 1)) * 32;
1987 } else if (val >= l) {
1991 /* horrible h263 long vector mode */
1992 if (pred < -31 && val < -63)
1994 if (pred > 32 && val > 63)
2001 /* Decodes RVLC of H.263+ UMV */
2002 static int h263p_decode_umotion(MpegEncContext * s, int pred)
2006 if (get_bits1(&s->gb)) /* Motion difference = 0 */
2009 code = 2 + get_bits1(&s->gb);
2011 while (get_bits1(&s->gb))
2014 code += get_bits1(&s->gb);
2019 code = (sign) ? (pred - code) : (pred + code);
2021 fprintf(stderr,"H.263+ UMV Motion = %d\n", code);
2027 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
2030 int code, level, i, j, last, run;
2031 RLTable *rl = &rl_inter;
2032 const UINT8 *scan_table;
2034 scan_table = zigzag_direct;
2035 if (s->h263_aic && s->mb_intra) {
2039 if (s->h263_aic_dir)
2040 scan_table = ff_alternate_vertical_scan; /* left */
2042 scan_table = ff_alternate_horizontal_scan; /* top */
2044 } else if (s->mb_intra) {
2046 if (s->h263_rv10 && s->rv10_version == 3 && s->pict_type == I_TYPE) {
2047 int component, diff;
2048 component = (n <= 3 ? 0 : n - 4 + 1);
2049 level = s->last_dc[component];
2050 if (s->rv10_first_dc_coded[component]) {
2051 diff = rv_decode_dc(s, n);
2055 level = level & 0xff; /* handle wrap round */
2056 s->last_dc[component] = level;
2058 s->rv10_first_dc_coded[component] = 1;
2061 level = get_bits(&s->gb, 8);
2071 if (s->mb_intra && s->h263_aic)
2073 s->block_last_index[n] = i - 1;
2078 code = get_vlc(&s->gb, &rl->vlc);
2081 if (code == rl->n) {
2083 last = get_bits1(&s->gb);
2084 run = get_bits(&s->gb, 6);
2085 level = (INT8)get_bits(&s->gb, 8);
2086 if (s->h263_rv10 && level == -128) {
2087 /* XXX: should patch encoder too */
2088 level = get_bits(&s->gb, 12);
2089 level = (level << 20) >> 20;
2092 run = rl->table_run[code];
2093 level = rl->table_level[code];
2094 last = code >= rl->last;
2095 if (get_bits1(&s->gb))
2108 if (s->mb_intra && s->h263_aic) {
2109 h263_pred_acdc(s, block, n);
2112 s->block_last_index[n] = i;
2116 static int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
2118 int level, pred, code;
2122 code = get_vlc(&s->gb, &dc_lum);
2124 code = get_vlc(&s->gb, &dc_chrom);
2130 level = get_bits(&s->gb, code);
2131 if ((level >> (code - 1)) == 0) /* if MSB not set it is negative*/
2132 level = - (level ^ ((1 << code) - 1));
2134 skip_bits1(&s->gb); /* marker */
2137 pred = mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
2142 *dc_val = level * s->y_dc_scale;
2144 *dc_val = level * s->c_dc_scale;
2149 static int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
2152 int code, level, i, j, last, run;
2155 const UINT8 *scan_table;
2159 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
2168 if (dc_pred_dir == 0)
2169 scan_table = ff_alternate_vertical_scan; /* left */
2171 scan_table = ff_alternate_horizontal_scan; /* top */
2173 scan_table = zigzag_direct;
2178 s->block_last_index[n] = i - 1;
2182 scan_table = zigzag_direct;
2186 code = get_vlc(&s->gb, &rl->vlc);
2189 if (code == rl->n) {
2191 if (get_bits1(&s->gb) != 0) {
2192 if (get_bits1(&s->gb) != 0) {
2194 last = get_bits1(&s->gb);
2195 run = get_bits(&s->gb, 6);
2196 get_bits1(&s->gb); /* marker */
2197 level = get_bits(&s->gb, 12);
2198 level = (level << 20) >> 20; /* sign extend */
2199 skip_bits1(&s->gb); /* marker */
2202 code = get_vlc(&s->gb, &rl->vlc);
2203 if (code < 0 || code >= rl->n)
2205 run = rl->table_run[code];
2206 level = rl->table_level[code];
2207 last = code >= rl->last;
2208 run += rl->max_run[last][level] + 1;
2209 if (get_bits1(&s->gb))
2214 code = get_vlc(&s->gb, &rl->vlc);
2215 if (code < 0 || code >= rl->n)
2217 run = rl->table_run[code];
2218 level = rl->table_level[code];
2219 last = code >= rl->last;
2220 level += rl->max_level[last][run];
2221 if (get_bits1(&s->gb))
2225 run = rl->table_run[code];
2226 level = rl->table_level[code];
2227 last = code >= rl->last;
2228 if (get_bits1(&s->gb))
2242 mpeg4_pred_ac(s, block, n, dc_pred_dir);
2244 i = 64; /* XXX: not optimal */
2247 s->block_last_index[n] = i - 1;
2251 /* most is hardcoded. should extend to handle all h263 streams */
2252 int h263_decode_picture_header(MpegEncContext *s)
2254 int format, width, height;
2256 /* picture header */
2257 if (get_bits(&s->gb, 22) != 0x20)
2259 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
2261 if (get_bits1(&s->gb) != 1)
2262 return -1; /* marker */
2263 if (get_bits1(&s->gb) != 0)
2264 return -1; /* h263 id */
2265 skip_bits1(&s->gb); /* split screen off */
2266 skip_bits1(&s->gb); /* camera off */
2267 skip_bits1(&s->gb); /* freeze picture release off */
2269 /* Reset GOB number */
2272 format = get_bits(&s->gb, 3);
2274 if (format != 7 && format != 6) {
2277 width = h263_format[format][0];
2278 height = h263_format[format][1];
2284 s->pict_type = I_TYPE + get_bits1(&s->gb);
2286 s->unrestricted_mv = get_bits1(&s->gb);
2287 s->h263_long_vectors = s->unrestricted_mv;
2289 if (get_bits1(&s->gb) != 0)
2290 return -1; /* SAC: off */
2291 if (get_bits1(&s->gb) != 0) {
2292 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
2295 if (get_bits1(&s->gb) != 0)
2296 return -1; /* not PB frame */
2298 s->qscale = get_bits(&s->gb, 5);
2299 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
2305 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
2309 format = get_bits(&s->gb, 3);
2310 skip_bits(&s->gb,1); /* Custom PCF */
2311 s->umvplus_dec = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */
2312 skip_bits1(&s->gb); /* Syntax-based Arithmetic Coding (SAC) */
2313 if (get_bits1(&s->gb) != 0) {
2314 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
2316 if (get_bits1(&s->gb) != 0) { /* Advanced Intra Coding (AIC) */
2319 skip_bits(&s->gb, 7);
2320 skip_bits(&s->gb, 3); /* Reserved */
2321 } else if (ufep != 0)
2325 s->pict_type = get_bits(&s->gb, 3) + 1;
2326 if (s->pict_type != I_TYPE &&
2327 s->pict_type != P_TYPE)
2329 skip_bits(&s->gb, 2);
2330 s->no_rounding = get_bits1(&s->gb);
2331 //fprintf(stderr, "\nRTYPE: %d", s->no_rounding);
2332 skip_bits(&s->gb, 4);
2334 /* Get the picture dimensions */
2337 /* Custom Picture Format (CPFMT) */
2338 skip_bits(&s->gb, 4); /* aspect ratio */
2339 width = (get_bits(&s->gb, 9) + 1) * 4;
2341 height = get_bits(&s->gb, 9) * 4;
2343 fprintf(stderr,"\nH.263+ Custom picture: %dx%d\n",width,height);
2347 width = h263_format[format][0];
2348 height = h263_format[format][1];
2350 if ((width == 0) || (height == 0))
2354 if (s->umvplus_dec) {
2355 skip_bits1(&s->gb); /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
2359 s->qscale = get_bits(&s->gb, 5);
2362 while (get_bits1(&s->gb) != 0) {
2363 skip_bits(&s->gb, 8);
2369 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s)
2372 int a= 2<<s->sprite_warping_accuracy;
2373 int rho= 3-s->sprite_warping_accuracy;
2375 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
2376 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
2377 int sprite_ref[4][2];
2378 int virtual_ref[2][2];
2380 int alpha=0, beta=0;
2383 //printf("SP %d\n", s->sprite_warping_accuracy);
2384 for(i=0; i<s->num_sprite_warping_points; i++){
2388 length= get_vlc(&s->gb, &sprite_trajectory);
2390 x= get_bits(&s->gb, length);
2391 //printf("lx %d %d\n", length, x);
2392 if ((x >> (length - 1)) == 0) /* if MSB not set it is negative*/
2393 x = - (x ^ ((1 << length) - 1));
2395 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(&s->gb); /* marker bit */
2397 length= get_vlc(&s->gb, &sprite_trajectory);
2399 y=get_bits(&s->gb, length);
2400 //printf("ly %d %d\n", length, y);
2401 if ((y >> (length - 1)) == 0) /* if MSB not set it is negative*/
2402 y = - (y ^ ((1 << length) - 1));
2404 skip_bits1(&s->gb); /* marker bit */
2405 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
2406 //if(i>0 && (x!=0 || y!=0)) printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n");
2412 while((1<<alpha)<w) alpha++;
2413 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
2417 // Note, the 4th point isnt used for GMC
2418 if(s->divx_version==500 && s->divx_build==413){
2419 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
2420 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
2421 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
2422 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
2423 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
2424 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
2426 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
2427 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
2428 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
2429 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
2430 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
2431 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
2433 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
2434 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
2436 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
2437 // perhaps it should be reordered to be more readable ...
2438 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
2439 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
2440 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
2441 + 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);
2442 virtual_ref[0][1]= 16*vop_ref[0][1]
2443 + 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);
2444 virtual_ref[1][0]= 16*vop_ref[0][0]
2445 + 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);
2446 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
2447 + 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);
2449 switch(s->num_sprite_warping_points)
2452 s->sprite_offset[0][0]= 0;
2453 s->sprite_offset[0][1]= 0;
2454 s->sprite_offset[1][0]= 0;
2455 s->sprite_offset[1][1]= 0;
2456 s->sprite_delta[0][0][0]= a;
2457 s->sprite_delta[0][0][1]= 0;
2458 s->sprite_delta[0][1][0]= 0;
2459 s->sprite_delta[0][1][1]= a;
2460 s->sprite_delta[1][0][0]= a;
2461 s->sprite_delta[1][0][1]= 0;
2462 s->sprite_delta[1][1][0]= 0;
2463 s->sprite_delta[1][1][1]= a;
2464 s->sprite_shift[0][0]= 0;
2465 s->sprite_shift[0][1]= 0;
2466 s->sprite_shift[1][0]= 0;
2467 s->sprite_shift[1][1]= 0;
2470 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
2471 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
2472 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
2473 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
2474 s->sprite_delta[0][0][0]= a;
2475 s->sprite_delta[0][0][1]= 0;
2476 s->sprite_delta[0][1][0]= 0;
2477 s->sprite_delta[0][1][1]= a;
2478 s->sprite_delta[1][0][0]= a;
2479 s->sprite_delta[1][0][1]= 0;
2480 s->sprite_delta[1][1][0]= 0;
2481 s->sprite_delta[1][1][1]= a;
2482 s->sprite_shift[0][0]= 0;
2483 s->sprite_shift[0][1]= 0;
2484 s->sprite_shift[1][0]= 0;
2485 s->sprite_shift[1][1]= 0;
2489 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
2490 + ((-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
2491 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1]));
2492 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
2493 + ((-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
2494 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1]));
2495 s->sprite_offset[1][0]= ((-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
2496 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
2497 +2*w2*r*sprite_ref[0][0] - 16*w2);
2498 s->sprite_offset[1][1]= ((-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
2499 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
2500 +2*w2*r*sprite_ref[0][1] - 16*w2);
2501 s->sprite_delta[0][0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
2502 s->sprite_delta[0][0][1]= ( r*sprite_ref[0][1] - virtual_ref[0][1]);
2503 s->sprite_delta[0][1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
2504 s->sprite_delta[0][1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
2505 s->sprite_delta[1][0][0]= 4*(-r*sprite_ref[0][0] + virtual_ref[0][0]);
2506 s->sprite_delta[1][0][1]= 4*( r*sprite_ref[0][1] - virtual_ref[0][1]);
2507 s->sprite_delta[1][1][0]= 4*(-r*sprite_ref[0][1] + virtual_ref[0][1]);
2508 s->sprite_delta[1][1][1]= 4*(-r*sprite_ref[0][0] + virtual_ref[0][0]);
2509 s->sprite_shift[0][0]= alpha+rho;
2510 s->sprite_shift[0][1]= alpha+rho;
2511 s->sprite_shift[1][0]= alpha+rho+2;
2512 s->sprite_shift[1][1]= alpha+rho+2;
2517 /*printf("%d %d\n", s->sprite_delta[0][0][0], a<<s->sprite_shift[0][0]);
2518 printf("%d %d\n", s->sprite_delta[0][0][1], 0);
2519 printf("%d %d\n", s->sprite_delta[0][1][0], 0);
2520 printf("%d %d\n", s->sprite_delta[0][1][1], a<<s->sprite_shift[0][1]);
2521 printf("%d %d\n", s->sprite_delta[1][0][0], a<<s->sprite_shift[1][0]);
2522 printf("%d %d\n", s->sprite_delta[1][0][1], 0);
2523 printf("%d %d\n", s->sprite_delta[1][1][0], 0);
2524 printf("%d %d\n", s->sprite_delta[1][1][1], a<<s->sprite_shift[1][1]);*/
2525 /* try to simplify the situation */
2526 if( s->sprite_delta[0][0][0] == a<<s->sprite_shift[0][0]
2527 && s->sprite_delta[0][0][1] == 0
2528 && s->sprite_delta[0][1][0] == 0
2529 && s->sprite_delta[0][1][1] == a<<s->sprite_shift[0][1]
2530 && s->sprite_delta[1][0][0] == a<<s->sprite_shift[1][0]
2531 && s->sprite_delta[1][0][1] == 0
2532 && s->sprite_delta[1][1][0] == 0
2533 && s->sprite_delta[1][1][1] == a<<s->sprite_shift[1][1])
2535 s->sprite_offset[0][0]>>=s->sprite_shift[0][0];
2536 s->sprite_offset[0][1]>>=s->sprite_shift[0][1];
2537 s->sprite_offset[1][0]>>=s->sprite_shift[1][0];
2538 s->sprite_offset[1][1]>>=s->sprite_shift[1][1];
2539 s->sprite_delta[0][0][0]= a;
2540 s->sprite_delta[0][0][1]= 0;
2541 s->sprite_delta[0][1][0]= 0;
2542 s->sprite_delta[0][1][1]= a;
2543 s->sprite_delta[1][0][0]= a;
2544 s->sprite_delta[1][0][1]= 0;
2545 s->sprite_delta[1][1][0]= 0;
2546 s->sprite_delta[1][1][1]= a;
2547 s->sprite_shift[0][0]= 0;
2548 s->sprite_shift[0][1]= 0;
2549 s->sprite_shift[1][0]= 0;
2550 s->sprite_shift[1][1]= 0;
2551 s->real_sprite_warping_points=1;
2554 s->real_sprite_warping_points= s->num_sprite_warping_points;
2556 //printf("%d %d %d %d\n", d[0][0], d[0][1], s->sprite_offset[0][0], s->sprite_offset[0][1]);
2559 /* decode mpeg4 VOP header */
2560 int mpeg4_decode_picture_header(MpegEncContext * s)
2562 int time_incr, startcode, state, v;
2566 /* search next start code */
2567 align_get_bits(&s->gb);
2570 v = get_bits(&s->gb, 8);
2571 if (state == 0x000001) {
2572 state = ((state << 8) | v) & 0xffffff;
2576 state = ((state << 8) | v) & 0xffffff;
2577 if( get_bits_count(&s->gb) > s->gb.size*8-32){
2579 printf("no VOP startcode found, frame size was=%d\n", s->gb.size);
2582 printf("frame skip\n");
2583 return FRAME_SKIPED;
2587 //printf("startcode %X %d\n", startcode, get_bits_count(&s->gb));
2588 if (startcode == 0x120) { // Video Object Layer
2589 int width, height, vo_ver_id;
2592 skip_bits(&s->gb, 1); /* random access */
2593 s->vo_type= get_bits(&s->gb, 8);
2594 if (get_bits1(&s->gb) != 0) { /* is_ol_id */
2595 vo_ver_id = get_bits(&s->gb, 4); /* vo_ver_id */
2596 skip_bits(&s->gb, 3); /* vo_priority */
2601 s->aspect_ratio_info= get_bits(&s->gb, 4);
2602 if(s->aspect_ratio_info == EXTENDET_PAR){
2603 skip_bits(&s->gb, 8); //par_width
2604 skip_bits(&s->gb, 8); // par_height
2607 if(get_bits1(&s->gb)){ /* vol control parameter */
2608 int chroma_format= get_bits(&s->gb, 2);
2609 if(chroma_format!=1){
2610 printf("illegal chroma format\n");
2612 s->low_delay= get_bits1(&s->gb);
2613 if(get_bits1(&s->gb)){ /* vbv parameters */
2614 printf("vbv parameters not supported\n");
2621 s->shape = get_bits(&s->gb, 2); /* vol shape */
2622 if(s->shape != RECT_SHAPE) printf("only rectangular vol supported\n");
2623 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
2624 printf("Gray shape not supported\n");
2625 skip_bits(&s->gb, 4); //video_object_layer_shape_extension
2628 skip_bits1(&s->gb); /* marker */
2630 s->time_increment_resolution = get_bits(&s->gb, 16);
2631 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
2632 if (s->time_increment_bits < 1)
2633 s->time_increment_bits = 1;
2634 skip_bits1(&s->gb); /* marker */
2636 if (get_bits1(&s->gb) != 0) { /* fixed_vop_rate */
2637 skip_bits(&s->gb, s->time_increment_bits);
2640 if (s->shape != BIN_ONLY_SHAPE) {
2641 if (s->shape == RECT_SHAPE) {
2642 skip_bits1(&s->gb); /* marker */
2643 width = get_bits(&s->gb, 13);
2644 skip_bits1(&s->gb); /* marker */
2645 height = get_bits(&s->gb, 13);
2646 skip_bits1(&s->gb); /* marker */
2647 if(width && height){ /* they should be non zero but who knows ... */
2650 // printf("width/height: %d %d\n", width, height);
2654 if(get_bits1(&s->gb)) printf("interlaced not supported\n"); /* interlaced */
2655 if(!get_bits1(&s->gb)) printf("OBMC not supported\n"); /* OBMC Disable */
2656 if (vo_ver_id == 1) {
2657 s->vol_sprite_usage = get_bits1(&s->gb); /* vol_sprite_usage */
2659 s->vol_sprite_usage = get_bits(&s->gb, 2); /* vol_sprite_usage */
2661 if(s->vol_sprite_usage==STATIC_SPRITE) printf("Static Sprites not supported\n");
2662 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
2663 if(s->vol_sprite_usage==STATIC_SPRITE){
2664 s->sprite_width = get_bits(&s->gb, 13);
2665 skip_bits1(&s->gb); /* marker */
2666 s->sprite_height= get_bits(&s->gb, 13);
2667 skip_bits1(&s->gb); /* marker */
2668 s->sprite_left = get_bits(&s->gb, 13);
2669 skip_bits1(&s->gb); /* marker */
2670 s->sprite_top = get_bits(&s->gb, 13);
2671 skip_bits1(&s->gb); /* marker */
2673 s->num_sprite_warping_points= get_bits(&s->gb, 6);
2674 s->sprite_warping_accuracy = get_bits(&s->gb, 2);
2675 s->sprite_brightness_change= get_bits1(&s->gb);
2676 if(s->vol_sprite_usage==STATIC_SPRITE)
2677 s->low_latency_sprite= get_bits1(&s->gb);
2679 // FIXME sadct disable bit if verid!=1 && shape not rect
2681 if (get_bits1(&s->gb) == 1) { /* not_8_bit */
2682 s->quant_precision = get_bits(&s->gb, 4); /* quant_precision */
2683 if(get_bits(&s->gb, 4)!=8) printf("N-bit not supported\n"); /* bits_per_pixel */
2684 if(s->quant_precision!=5) printf("quant precission %d\n", s->quant_precision);
2686 s->quant_precision = 5;
2689 // FIXME a bunch of grayscale shape things
2691 if(get_bits1(&s->gb)){ /* vol_quant_type */
2693 /* load default matrixes */
2694 for(i=0; i<64; i++){
2695 v= ff_mpeg4_default_intra_matrix[i];
2696 s->intra_matrix[i]= v;
2697 s->chroma_intra_matrix[i]= v;
2699 v= ff_mpeg4_default_non_intra_matrix[i];
2700 s->non_intra_matrix[i]= v;
2701 s->chroma_non_intra_matrix[i]= v;
2704 /* load custom intra matrix */
2705 if(get_bits1(&s->gb)){
2706 for(i=0; i<64; i++){
2707 v= get_bits(&s->gb, 8);
2710 j= zigzag_direct[i];
2711 s->intra_matrix[j]= v;
2712 s->chroma_intra_matrix[j]= v;
2716 /* load custom non intra matrix */
2717 if(get_bits1(&s->gb)){
2718 for(i=0; i<64; i++){
2719 v= get_bits(&s->gb, 8);
2722 j= zigzag_direct[i];
2723 s->non_intra_matrix[j]= v;
2724 s->chroma_non_intra_matrix[j]= v;
2727 /* replicate last value */
2729 j= zigzag_direct[i];
2730 s->non_intra_matrix[j]= v;
2731 s->chroma_non_intra_matrix[j]= v;
2735 s->dct_unquantize= s->dct_unquantize_mpeg2;
2737 // FIXME a bunch of grayscale shape things
2739 s->dct_unquantize= s->dct_unquantize_h263;
2742 s->quarter_sample= get_bits1(&s->gb);
2743 else s->quarter_sample=0;
2745 if(!get_bits1(&s->gb)) printf("Complexity estimation not supported\n");
2747 s->resync_marker= !get_bits1(&s->gb); /* resync_marker_disabled */
2749 s->data_partioning= get_bits1(&s->gb);
2750 if(s->data_partioning){
2751 printf("data partitioning not supported\n");
2752 skip_bits1(&s->gb); // reversible vlc
2755 if(vo_ver_id != 1) {
2756 s->new_pred= get_bits1(&s->gb);
2758 printf("new pred not supported\n");
2759 skip_bits(&s->gb, 2); /* requested upstream message type */
2760 skip_bits1(&s->gb); /* newpred segment type */
2762 s->reduced_res_vop= get_bits1(&s->gb);
2763 if(s->reduced_res_vop) printf("reduced resolution VOP not supported\n");
2767 s->reduced_res_vop= 0;
2770 s->scalability= get_bits1(&s->gb);
2771 if (s->scalability) {
2772 printf("scalability not supported\n");
2775 //printf("end Data %X %d\n", show_bits(&s->gb, 32), get_bits_count(&s->gb)&0x7);
2777 } else if (startcode == 0x1b2) { //userdata
2783 //printf("user Data %X\n", show_bits(&s->gb, 32));
2784 buf[0]= show_bits(&s->gb, 8);
2785 for(i=1; i<256; i++){
2786 buf[i]= show_bits(&s->gb, 16)&0xFF;
2787 if(buf[i]==0) break;
2788 skip_bits(&s->gb, 8);
2791 e=sscanf(buf, "DivX%dBuild%d", &ver, &build);
2793 e=sscanf(buf, "DivX%db%d", &ver, &build);
2795 s->divx_version= ver;
2796 s->divx_build= build;
2797 if(s->picture_number==0){
2798 printf("This file was encoded with DivX%d Build%d\n", ver, build);
2799 if(ver==500 && build==413){
2800 printf("WARNING: this version of DivX is not MPEG4 compatible, trying to workaround these bugs...\n");
2803 printf("hmm, i havnt seen that version of divx yet, lets assume they fixed these bugs ...\n"
2804 "using mpeg4 decoder, if it fails contact the developers (of ffmpeg)\n");
2809 //printf("User Data: %s\n", buf);
2811 } else if (startcode != 0x1b6) { //VOP
2815 s->pict_type = get_bits(&s->gb, 2) + 1; /* pict type: I = 0 , P = 1 */
2816 // printf("pic: %d, qpel:%d\n", s->pict_type, s->quarter_sample);
2818 while (get_bits1(&s->gb) != 0)
2821 check_marker(&s->gb, "before time_increment");
2822 time_increment= get_bits(&s->gb, s->time_increment_bits);
2823 //printf(" type:%d incr:%d increment:%d\n", s->pict_type, time_incr, time_increment);
2824 if(s->pict_type!=B_TYPE){
2825 s->last_time_base= s->time_base;
2826 s->time_base+= time_incr;
2827 s->time= s->time_base*s->time_increment_resolution + time_increment;
2828 s->pp_time= s->time - s->last_non_b_time;
2829 s->last_non_b_time= s->time;
2831 s->time= (s->last_time_base + time_incr)*s->time_increment_resolution + time_increment;
2832 s->bp_time= s->last_non_b_time - s->time;
2833 if(s->pp_time <=s->bp_time){
2834 // printf("messed up order, seeking?, skiping current b frame\n");
2835 return FRAME_SKIPED;
2839 if(check_marker(&s->gb, "before vop_coded")==0 && s->picture_number==0){
2840 printf("hmm, seems the headers arnt complete, trying to guess time_increment_bits\n");
2841 for(s->time_increment_bits++ ;s->time_increment_bits<16; s->time_increment_bits++){
2842 if(get_bits1(&s->gb)) break;
2844 printf("my guess is %d bits ;)\n",s->time_increment_bits);
2847 if (get_bits1(&s->gb) != 1)
2849 //printf("time %d %d %d || %d %d %d\n", s->time_increment_bits, s->time_increment, s->time_base,
2850 //s->time, s->last_non_b_time[0], s->last_non_b_time[1]);
2851 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE
2852 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
2853 /* rounding type for motion estimation */
2854 s->no_rounding = get_bits1(&s->gb);
2858 //FIXME reduced res stuff
2860 if (s->shape != RECT_SHAPE) {
2861 if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) {
2862 int width, height, hor_spat_ref, ver_spat_ref;
2864 width = get_bits(&s->gb, 13);
2865 skip_bits1(&s->gb); /* marker */
2866 height = get_bits(&s->gb, 13);
2867 skip_bits1(&s->gb); /* marker */
2868 hor_spat_ref = get_bits(&s->gb, 13); /* hor_spat_ref */
2869 skip_bits1(&s->gb); /* marker */
2870 ver_spat_ref = get_bits(&s->gb, 13); /* ver_spat_ref */
2872 skip_bits1(&s->gb); /* change_CR_disable */
2874 if (get_bits1(&s->gb) != 0) {
2875 skip_bits(&s->gb, 8); /* constant_alpha_value */
2878 //FIXME complexity estimation stuff
2880 if (s->shape != BIN_ONLY_SHAPE) {
2882 t=get_bits(&s->gb, 3); /* intra dc VLC threshold */
2883 //printf("threshold %d\n", t);
2884 //FIXME interlaced specific bits
2887 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
2888 if(s->num_sprite_warping_points){
2889 mpeg4_decode_sprite_trajectory(s);
2891 if(s->sprite_brightness_change) printf("sprite_brightness_change not supported\n");
2892 if(s->vol_sprite_usage==STATIC_SPRITE) printf("static sprite not supported\n");
2895 if (s->shape != BIN_ONLY_SHAPE) {
2896 /* note: we do not use quant_precision to avoid problem if no
2897 MPEG4 vol header as it is found on some old opendivx
2899 s->qscale = get_bits(&s->gb, 5);
2901 printf("Error, header damaged or not MPEG4 header (qscale=0)\n");
2902 return -1; // makes no sense to continue, as there is nothing left from the image then
2905 if (s->pict_type != I_TYPE) {
2906 s->f_code = get_bits(&s->gb, 3); /* fcode_for */
2908 printf("Error, header damaged or not MPEG4 header (f_code=0)\n");
2909 return -1; // makes no sense to continue, as the MV decoding will break very quickly
2912 if (s->pict_type == B_TYPE) {
2913 s->b_code = get_bits(&s->gb, 3);
2914 //printf("b-code %d\n", s->b_code);
2916 //printf("quant:%d fcode:%d bcode:%d type:%d\n", s->qscale, s->f_code, s->b_code, s->pict_type);
2917 if(!s->scalability){
2918 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {
2919 skip_bits1(&s->gb); // vop shape coding type
2923 s->picture_number++; // better than pic number==0 allways ;)
2928 /* don't understand why they choose a different header ! */
2929 int intel_h263_decode_picture_header(MpegEncContext *s)
2933 /* picture header */
2934 if (get_bits(&s->gb, 22) != 0x20)
2936 skip_bits(&s->gb, 8); /* picture timestamp */
2938 if (get_bits1(&s->gb) != 1)
2939 return -1; /* marker */
2940 if (get_bits1(&s->gb) != 0)
2941 return -1; /* h263 id */
2942 skip_bits1(&s->gb); /* split screen off */
2943 skip_bits1(&s->gb); /* camera off */
2944 skip_bits1(&s->gb); /* freeze picture release off */
2946 format = get_bits(&s->gb, 3);
2952 s->pict_type = I_TYPE + get_bits1(&s->gb);
2954 s->unrestricted_mv = get_bits1(&s->gb);
2955 s->h263_long_vectors = s->unrestricted_mv;
2957 if (get_bits1(&s->gb) != 0)
2958 return -1; /* SAC: off */
2959 if (get_bits1(&s->gb) != 0)
2960 return -1; /* advanced prediction mode: off */
2961 if (get_bits1(&s->gb) != 0)
2962 return -1; /* not PB frame */
2964 /* skip unknown header garbage */
2965 skip_bits(&s->gb, 41);
2967 s->qscale = get_bits(&s->gb, 5);
2968 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
2971 while (get_bits1(&s->gb) != 0) {
2972 skip_bits(&s->gb, 8);