2 * H263/MPEG4 backend for ffmpeg encoder and decoder
3 * Copyright (c) 2000,2001 Fabrice Bellard.
5 * Copyright (c) 2001 Juan J. Sierralta P.
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 * ac prediction encoding, b-frame support, error resilience, optimizations,
22 * qpel decoding, gmc decoding, interlaced decoding,
23 * by Michael Niedermayer <michaelni@gmx.at>
30 #include "mpegvideo.h"
32 #include "mpeg4data.h"
37 //rounded divison & shift
38 #define RSHIFT(a,b) ((a) > 0 ? ((a) + (1<<((b)-1)))>>(b) : ((a) + (1<<((b)-1))-1)>>(b))
41 #define PRINT_MB_TYPE(a) {}
43 #define PRINT_MB_TYPE(a) printf(a)
46 #define INTRA_MCBPC_VLC_BITS 6
47 #define INTER_MCBPC_VLC_BITS 6
48 #define CBPY_VLC_BITS 6
51 #define SPRITE_TRAJ_VLC_BITS 6
52 #define MB_TYPE_B_VLC_BITS 4
53 #define TEX_VLC_BITS 9
55 static void h263_encode_block(MpegEncContext * s, DCTELEM * block,
57 static void h263_encode_motion(MpegEncContext * s, int val, int fcode);
58 static void h263p_encode_umotion(MpegEncContext * s, int val);
59 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block,
60 int n, int dc, UINT8 *scan_table,
61 PutBitContext *dc_pb, PutBitContext *ac_pb);
62 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode);
63 static int h263p_decode_umotion(MpegEncContext * s, int pred);
64 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
66 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
67 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
68 int n, int coded, int intra);
69 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr);
70 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
72 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s);
74 extern UINT32 inverse[256];
76 static UINT16 mv_penalty[MAX_FCODE+1][MAX_MV*2+1];
77 static UINT8 fcode_tab[MAX_MV*2+1];
78 static UINT8 umv_fcode_tab[MAX_MV*2+1];
80 static UINT16 uni_DCtab_lum [512][2];
81 static UINT16 uni_DCtab_chrom[512][2];
82 static UINT32 uni_mpeg4_intra_rl_bits[64*64*2*2];
83 static UINT8 uni_mpeg4_intra_rl_len [64*64*2*2];
84 static UINT32 uni_mpeg4_inter_rl_bits[64*64*2*2];
85 static UINT8 uni_mpeg4_inter_rl_len [64*64*2*2];
86 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
87 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
99 int h263_get_picture_format(int width, int height)
103 if (width == 128 && height == 96)
105 else if (width == 176 && height == 144)
107 else if (width == 352 && height == 288)
109 else if (width == 704 && height == 576)
111 else if (width == 1408 && height == 1152)
118 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
122 align_put_bits(&s->pb);
124 /* Update the pointer to last GOB */
125 s->ptr_lastgob = pbBufPtr(&s->pb);
128 put_bits(&s->pb, 22, 0x20); /* PSC */
129 put_bits(&s->pb, 8, (((INT64)s->picture_number * 30 * FRAME_RATE_BASE) /
130 s->frame_rate) & 0xff);
132 put_bits(&s->pb, 1, 1); /* marker */
133 put_bits(&s->pb, 1, 0); /* h263 id */
134 put_bits(&s->pb, 1, 0); /* split screen off */
135 put_bits(&s->pb, 1, 0); /* camera off */
136 put_bits(&s->pb, 1, 0); /* freeze picture release off */
138 format = h263_get_picture_format(s->width, s->height);
141 put_bits(&s->pb, 3, format);
142 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
143 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
144 of H.263v1 UMV implies to check the predicted MV after
145 calculation of the current MB to see if we're on the limits */
146 put_bits(&s->pb, 1, 0); /* unrestricted motion vector: off */
147 put_bits(&s->pb, 1, 0); /* SAC: off */
148 put_bits(&s->pb, 1, 0); /* advanced prediction mode: off */
149 put_bits(&s->pb, 1, 0); /* not PB frame */
150 put_bits(&s->pb, 5, s->qscale);
151 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
154 /* H.263 Plus PTYPE */
155 put_bits(&s->pb, 3, 7);
156 put_bits(&s->pb,3,1); /* Update Full Extended PTYPE */
158 put_bits(&s->pb,3,6); /* Custom Source Format */
160 put_bits(&s->pb, 3, format);
162 put_bits(&s->pb,1,0); /* Custom PCF: off */
163 s->umvplus = (s->pict_type == P_TYPE) && s->unrestricted_mv;
164 put_bits(&s->pb, 1, s->umvplus); /* Unrestricted Motion Vector */
165 put_bits(&s->pb,1,0); /* SAC: off */
166 put_bits(&s->pb,1,0); /* Advanced Prediction Mode: off */
167 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
168 put_bits(&s->pb,1,0); /* Deblocking Filter: off */
169 put_bits(&s->pb,1,0); /* Slice Structured: off */
170 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
171 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
172 put_bits(&s->pb,1,0); /* Alternative Inter VLC: off */
173 put_bits(&s->pb,1,0); /* Modified Quantization: off */
174 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
175 put_bits(&s->pb,3,0); /* Reserved */
177 put_bits(&s->pb, 3, s->pict_type == P_TYPE);
179 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
180 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
181 if (s->pict_type == I_TYPE)
185 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
186 put_bits(&s->pb,2,0); /* Reserved */
187 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
189 /* This should be here if PLUSPTYPE */
190 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
193 /* Custom Picture Format (CPFMT) */
195 if (s->aspect_ratio_info)
196 put_bits(&s->pb,4,s->aspect_ratio_info);
198 put_bits(&s->pb,4,2); /* Aspect ratio: CIF 12:11 (4:3) picture */
199 put_bits(&s->pb,9,(s->width >> 2) - 1);
200 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
201 put_bits(&s->pb,9,(s->height >> 2));
202 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED)
204 put_bits(&s->pb, 8, s->aspected_width);
205 put_bits(&s->pb, 8, s->aspected_height);
209 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
211 put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
212 put_bits(&s->pb, 5, s->qscale);
215 put_bits(&s->pb, 1, 0); /* no PEI */
219 s->c_dc_scale_table= h263_aic_dc_scale_table;
222 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
226 int h263_encode_gob_header(MpegEncContext * s, int mb_line)
230 /* Check to see if we need to put a new GBSC */
231 /* for RTP packetization */
233 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
234 if (pdif >= s->rtp_payload_size) {
235 /* Bad luck, packet must be cut before */
236 align_put_bits(&s->pb);
237 flush_put_bits(&s->pb);
238 /* Call the RTP callback to send the last GOB */
239 if (s->rtp_callback) {
240 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
241 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
243 s->ptr_lastgob = pbBufPtr(&s->pb);
244 put_bits(&s->pb, 17, 1); /* GBSC */
245 s->gob_number = mb_line / s->gob_index;
246 put_bits(&s->pb, 5, s->gob_number); /* GN */
247 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
248 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
249 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
251 } else if (pdif + s->mb_line_avgsize >= s->rtp_payload_size) {
252 /* Cut the packet before we can't */
253 align_put_bits(&s->pb);
254 flush_put_bits(&s->pb);
255 /* Call the RTP callback to send the last GOB */
256 if (s->rtp_callback) {
257 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
258 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
260 s->ptr_lastgob = pbBufPtr(&s->pb);
261 put_bits(&s->pb, 17, 1); /* GBSC */
262 s->gob_number = mb_line / s->gob_index;
263 put_bits(&s->pb, 5, s->gob_number); /* GN */
264 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
265 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
266 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
273 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6])
275 int score0=0, score1=0;
279 INT16 *ac_val, *ac_val1;
281 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
284 const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width;
286 ac_val-= s->block_wrap[n]*16;
287 if(s->mb_y==0 || s->qscale == s->qscale_table[xy] || n==2 || n==3){
290 const int level= block[n][block_permute_op(i )];
292 score1+= ABS(level - ac_val[i+8]);
293 ac_val1[i ]= block[n][block_permute_op(i<<3)];
297 /* different qscale, we must rescale */
299 const int level= block[n][block_permute_op(i )];
301 score1+= ABS(level - ROUNDED_DIV(ac_val[i + 8]*s->qscale_table[xy], s->qscale));
302 ac_val1[i ]= block[n][block_permute_op(i<<3)];
307 const int xy= s->mb_x-1 + s->mb_y*s->mb_width;
308 /* left prediction */
310 if(s->mb_x==0 || s->qscale == s->qscale_table[xy] || n==1 || n==3){
313 const int level= block[n][block_permute_op(i<<3)];
315 score1+= ABS(level - ac_val[i]);
317 ac_val1[i+8]= block[n][block_permute_op(i )];
320 /* different qscale, we must rescale */
322 const int level= block[n][block_permute_op(i<<3)];
324 score1+= ABS(level - ROUNDED_DIV(ac_val[i]*s->qscale_table[xy], s->qscale));
326 ac_val1[i+8]= block[n][block_permute_op(i )];
332 return score0 > score1 ? 1 : 0;
335 void ff_clean_h263_qscales(MpegEncContext *s){
338 for(i=1; i<s->mb_num; i++){
339 if(s->qscale_table[i] - s->qscale_table[i-1] >2)
340 s->qscale_table[i]= s->qscale_table[i-1]+2;
342 for(i=s->mb_num-2; i>=0; i--){
343 if(s->qscale_table[i] - s->qscale_table[i+1] >2)
344 s->qscale_table[i]= s->qscale_table[i+1]+2;
348 void ff_clean_mpeg4_qscales(MpegEncContext *s){
351 ff_clean_h263_qscales(s);
353 for(i=1; i<s->mb_num; i++){
354 if(s->qscale_table[i] != s->qscale_table[i-1] && (s->mb_type[i]&MB_TYPE_INTER4V)){
355 s->mb_type[i]&= ~MB_TYPE_INTER4V;
356 s->mb_type[i]|= MB_TYPE_INTER;
360 if(s->pict_type== B_TYPE){
362 /* ok, come on, this isnt funny anymore, theres more code for handling this mpeg4 mess than
363 for the actual adaptive quantization */
365 for(i=0; i<s->mb_num; i++){
366 odd += s->qscale_table[i]&1;
369 if(2*odd > s->mb_num) odd=1;
372 for(i=0; i<s->mb_num; i++){
373 if((s->qscale_table[i]&1) != odd)
374 s->qscale_table[i]++;
375 if(s->qscale_table[i] > 31)
376 s->qscale_table[i]= 31;
379 for(i=1; i<s->mb_num; i++){
380 if(s->qscale_table[i] != s->qscale_table[i-1] && (s->mb_type[i]&MB_TYPE_DIRECT)){
381 s->mb_type[i]&= ~MB_TYPE_DIRECT;
382 s->mb_type[i]|= MB_TYPE_BIDIR;
388 void mpeg4_encode_mb(MpegEncContext * s,
389 DCTELEM block[6][64],
390 int motion_x, int motion_y)
392 int cbpc, cbpy, i, pred_x, pred_y;
394 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
395 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=B_TYPE ? &s->tex_pb : &s->pb;
396 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=I_TYPE ? &s->pb2 : &s->pb;
397 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
398 const int dquant_code[5]= {1,0,9,2,3};
400 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
404 for (i = 0; i < 6; i++) {
405 if (s->block_last_index[i] >= 0)
409 if(s->pict_type==B_TYPE){
410 static const int mb_type_table[8]= {-1, 2, 3, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
411 int mb_type= mb_type_table[s->mv_dir];
417 s->last_mv[1][0][1]= 0;
420 assert(s->dquant>=-2 && s->dquant<=2);
421 assert((s->dquant&1)==0);
424 /* nothing to do if this MB was skiped in the next P Frame */
425 if(s->mbskip_table[s->mb_y * s->mb_width + s->mb_x]){ //FIXME avoid DCT & ...
431 s->mv_dir= MV_DIR_FORWARD; //doesnt matter
432 s->qscale -= s->dquant;
436 if ((cbp | motion_x | motion_y | mb_type) ==0) {
437 /* direct MB with MV={0,0} */
438 assert(s->dquant==0);
440 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
442 if(interleaved_stats){
449 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
450 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
451 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we dont need it :)
452 if(cbp) put_bits(&s->pb, 6, cbp);
456 put_bits(&s->pb, 2, (s->dquant>>2)+3);
458 put_bits(&s->pb, 1, 0);
460 s->qscale -= s->dquant;
462 if(!s->progressive_sequence){
464 put_bits(&s->pb, 1, s->interlaced_dct);
465 if(mb_type) // not diect mode
466 put_bits(&s->pb, 1, 0); // no interlaced ME yet
469 if(interleaved_stats){
470 bits= get_bit_count(&s->pb);
471 s->misc_bits+= bits - s->last_bits;
478 h263_encode_motion(s, motion_x, 1);
479 h263_encode_motion(s, motion_y, 1);
484 h263_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code);
485 h263_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
486 h263_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code);
487 h263_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
488 s->last_mv[0][0][0]= s->mv[0][0][0];
489 s->last_mv[0][0][1]= s->mv[0][0][1];
490 s->last_mv[1][0][0]= s->mv[1][0][0];
491 s->last_mv[1][0][1]= s->mv[1][0][1];
495 case 2: /* backward */
496 h263_encode_motion(s, motion_x - s->last_mv[1][0][0], s->b_code);
497 h263_encode_motion(s, motion_y - s->last_mv[1][0][1], s->b_code);
498 s->last_mv[1][0][0]= motion_x;
499 s->last_mv[1][0][1]= motion_y;
502 case 3: /* forward */
503 h263_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);
504 h263_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);
505 s->last_mv[0][0][0]= motion_x;
506 s->last_mv[0][0][1]= motion_y;
510 printf("unknown mb type\n");
514 if(interleaved_stats){
515 bits= get_bit_count(&s->pb);
516 s->mv_bits+= bits - s->last_bits;
520 /* encode each block */
521 for (i = 0; i < 6; i++) {
522 mpeg4_encode_block(s, block[i], i, 0, zigzag_direct, NULL, &s->pb);
525 if(interleaved_stats){
526 bits= get_bit_count(&s->pb);
527 s->p_tex_bits+= bits - s->last_bits;
530 }else{ /* s->pict_type==B_TYPE */
531 if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
532 /* check if the B frames can skip it too, as we must skip it if we skip here
533 why didnt they just compress the skip-mb bits instead of reusing them ?! */
534 if(s->max_b_frames>0){
541 if(x+16 > s->width) x= s->width-16;
542 if(y+16 > s->height) y= s->height-16;
544 offset= x + y*s->linesize;
545 p_pic= s->new_picture[0] + offset;
548 for(i=0; i<s->max_b_frames; i++){
552 if(s->coded_order[i+1].pict_type!=B_TYPE) break;
554 b_pic= s->coded_order[i+1].picture[0] + offset;
555 diff= pix_abs16x16(p_pic, b_pic, s->linesize);
556 if(diff>s->qscale*70){ //FIXME check that 70 is optimal
565 /* skip macroblock */
566 put_bits(&s->pb, 1, 1);
568 if(interleaved_stats){
577 put_bits(&s->pb, 1, 0); /* mb coded */
578 if(s->mv_type==MV_TYPE_16X16){
580 if(s->dquant) cbpc+= 8;
582 inter_MCBPC_bits[cbpc],
583 inter_MCBPC_code[cbpc]);
587 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
589 put_bits(pb2, 2, dquant_code[s->dquant+2]);
591 if(!s->progressive_sequence){
593 put_bits(pb2, 1, s->interlaced_dct);
594 put_bits(pb2, 1, 0); // no interlaced ME yet
597 if(interleaved_stats){
598 bits= get_bit_count(&s->pb);
599 s->misc_bits+= bits - s->last_bits;
603 /* motion vectors: 16x16 mode */
604 h263_pred_motion(s, 0, &pred_x, &pred_y);
606 h263_encode_motion(s, motion_x - pred_x, s->f_code);
607 h263_encode_motion(s, motion_y - pred_y, s->f_code);
611 inter_MCBPC_bits[cbpc],
612 inter_MCBPC_code[cbpc]);
615 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
617 if(interleaved_stats){
618 bits= get_bit_count(&s->pb);
619 s->misc_bits+= bits - s->last_bits;
624 /* motion vectors: 8x8 mode*/
625 h263_pred_motion(s, i, &pred_x, &pred_y);
627 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][0] - pred_x, s->f_code);
628 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][1] - pred_y, s->f_code);
632 if(interleaved_stats){
633 bits= get_bit_count(&s->pb);
634 s->mv_bits+= bits - s->last_bits;
638 /* encode each block */
639 for (i = 0; i < 6; i++) {
640 mpeg4_encode_block(s, block[i], i, 0, zigzag_direct, NULL, tex_pb);
643 if(interleaved_stats){
644 bits= get_bit_count(&s->pb);
645 s->p_tex_bits+= bits - s->last_bits;
652 int dc_diff[6]; //dc values with the dc prediction subtracted
653 int dir[6]; //prediction direction
654 int zigzag_last_index[6];
655 UINT8 *scan_table[6];
658 const int level= block[i][0];
661 dc_diff[i]= level - ff_mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]);
663 *dc_ptr = level * s->y_dc_scale;
665 *dc_ptr = level * s->c_dc_scale;
669 s->ac_pred= decide_ac_pred(s, block, dir);
676 mpeg4_inv_pred_ac(s, block[i], i, dir[i]);
677 if (dir[i]==0) st = ff_alternate_vertical_scan; /* left */
678 else st = ff_alternate_horizontal_scan; /* top */
680 for(last_index=63; last_index>=0; last_index--) //FIXME optimize
681 if(block[i][st[last_index]]) break;
682 zigzag_last_index[i]= s->block_last_index[i];
683 s->block_last_index[i]= last_index;
688 scan_table[i]= zigzag_direct;
693 for (i = 0; i < 6; i++) {
694 if (s->block_last_index[i] >= 1)
699 if (s->pict_type == I_TYPE) {
700 if(s->dquant) cbpc+=4;
702 intra_MCBPC_bits[cbpc],
703 intra_MCBPC_code[cbpc]);
705 if(s->dquant) cbpc+=8;
706 put_bits(&s->pb, 1, 0); /* mb coded */
708 inter_MCBPC_bits[cbpc + 4],
709 inter_MCBPC_code[cbpc + 4]);
711 put_bits(pb2, 1, s->ac_pred);
713 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
715 put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
717 if(!s->progressive_sequence){
718 put_bits(dc_pb, 1, s->interlaced_dct);
721 if(interleaved_stats){
722 bits= get_bit_count(&s->pb);
723 s->misc_bits+= bits - s->last_bits;
727 /* encode each block */
728 for (i = 0; i < 6; i++) {
729 mpeg4_encode_block(s, block[i], i, dc_diff[i], scan_table[i], dc_pb, tex_pb);
732 if(interleaved_stats){
733 bits= get_bit_count(&s->pb);
734 s->i_tex_bits+= bits - s->last_bits;
739 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
745 ac_val = s->ac_val[0][0] + s->block_index[i] * 16;
749 block[i][block_permute_op(j )]= ac_val[j+8];
752 block[i][block_permute_op(j<<3)]= ac_val[j ];
754 s->block_last_index[i]= zigzag_last_index[i];
760 void h263_encode_mb(MpegEncContext * s,
761 DCTELEM block[6][64],
762 int motion_x, int motion_y)
764 int cbpc, cbpy, i, cbp, pred_x, pred_y;
766 INT16 rec_intradc[6];
768 const int dquant_code[5]= {1,0,9,2,3};
770 //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
774 for (i = 0; i < 6; i++) {
775 if (s->block_last_index[i] >= 0)
778 if ((cbp | motion_x | motion_y | s->dquant) == 0) {
779 /* skip macroblock */
780 put_bits(&s->pb, 1, 1);
783 put_bits(&s->pb, 1, 0); /* mb coded */
785 if(s->dquant) cbpc+= 8;
787 inter_MCBPC_bits[cbpc],
788 inter_MCBPC_code[cbpc]);
791 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
793 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
795 /* motion vectors: 16x16 mode only now */
796 h263_pred_motion(s, 0, &pred_x, &pred_y);
799 h263_encode_motion(s, motion_x - pred_x, s->f_code);
800 h263_encode_motion(s, motion_y - pred_y, s->f_code);
803 h263p_encode_umotion(s, motion_x - pred_x);
804 h263p_encode_umotion(s, motion_y - pred_y);
805 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
806 /* To prevent Start Code emulation */
807 put_bits(&s->pb,1,1);
810 int li = s->h263_aic ? 0 : 1;
815 if (s->h263_aic && s->mb_intra) {
816 INT16 level = block[i][0];
818 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
822 level = (level + (s->qscale >> 1))/(s->y_dc_scale);
824 level = (level - (s->qscale >> 1))/(s->y_dc_scale);
826 /* AIC can change CBP */
827 if (level == 0 && s->block_last_index[i] == 0)
828 s->block_last_index[i] = -1;
829 else if (level < -127)
831 else if (level > 127)
836 rec_intradc[i] = (s->y_dc_scale*level) + pred_dc;
839 //if ((rec_intradc[i] % 2) == 0)
842 if (rec_intradc[i] < 0)
844 else if (rec_intradc[i] > 2047)
845 rec_intradc[i] = 2047;
847 /* Update AC/DC tables */
848 *dc_ptr[i] = rec_intradc[i];
851 if (s->block_last_index[i] >= li)
856 if (s->pict_type == I_TYPE) {
857 if(s->dquant) cbpc+=4;
859 intra_MCBPC_bits[cbpc],
860 intra_MCBPC_code[cbpc]);
862 if(s->dquant) cbpc+=8;
863 put_bits(&s->pb, 1, 0); /* mb coded */
865 inter_MCBPC_bits[cbpc + 4],
866 inter_MCBPC_code[cbpc + 4]);
869 /* XXX: currently, we do not try to use ac prediction */
870 put_bits(&s->pb, 1, 0); /* no AC prediction */
873 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
875 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
879 /* encode each block */
880 h263_encode_block(s, block[i], i);
882 /* Update INTRADC for decoding */
883 if (s->h263_aic && s->mb_intra) {
884 block[i][0] = rec_intradc[i];
890 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr)
892 int x, y, wrap, a, c, pred_dc, scale;
893 INT16 *dc_val, *ac_val;
895 /* find prediction */
897 x = 2 * s->mb_x + 1 + (n & 1);
898 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
899 wrap = s->mb_width * 2 + 2;
900 dc_val = s->dc_val[0];
901 ac_val = s->ac_val[0][0];
902 scale = s->y_dc_scale;
906 wrap = s->mb_width + 2;
907 dc_val = s->dc_val[n - 4 + 1];
908 ac_val = s->ac_val[n - 4 + 1][0];
909 scale = s->c_dc_scale;
914 a = dc_val[(x - 1) + (y) * wrap];
915 c = dc_val[(x) + (y - 1) * wrap];
917 /* No prediction outside GOB boundary */
918 if (s->first_slice_line && ((n < 2) || (n > 3)))
921 /* just DC prediction */
922 if (a != 1024 && c != 1024)
923 pred_dc = (a + c) >> 1;
929 /* we assume pred is positive */
930 //pred_dc = (pred_dc + (scale >> 1)) / scale;
931 *dc_val_ptr = &dc_val[x + y * wrap];
936 void h263_pred_acdc(MpegEncContext * s, INT16 *block, int n)
938 int x, y, wrap, a, c, pred_dc, scale, i;
939 INT16 *dc_val, *ac_val, *ac_val1;
941 /* find prediction */
943 x = 2 * s->mb_x + 1 + (n & 1);
944 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
945 wrap = s->mb_width * 2 + 2;
946 dc_val = s->dc_val[0];
947 ac_val = s->ac_val[0][0];
948 scale = s->y_dc_scale;
952 wrap = s->mb_width + 2;
953 dc_val = s->dc_val[n - 4 + 1];
954 ac_val = s->ac_val[n - 4 + 1][0];
955 scale = s->c_dc_scale;
958 ac_val += ((y) * wrap + (x)) * 16;
964 a = dc_val[(x - 1) + (y) * wrap];
965 c = dc_val[(x) + (y - 1) * wrap];
967 /* No prediction outside GOB boundary */
968 if (s->first_slice_line && ((n < 2) || (n > 3)))
972 if (s->h263_aic_dir) {
973 /* left prediction */
977 block[block_permute_op(i*8)] += ac_val[i];
986 block[block_permute_op(i)] += ac_val[i + 8];
992 /* just DC prediction */
993 if (a != 1024 && c != 1024)
994 pred_dc = (a + c) >> 1;
1001 /* we assume pred is positive */
1002 block[0]=block[0]*scale + pred_dc;
1006 else if (!(block[0] & 1))
1009 /* Update AC/DC tables */
1010 dc_val[(x) + (y) * wrap] = block[0];
1014 ac_val1[i] = block[block_permute_op(i * 8)];
1017 ac_val1[8 + i] = block[block_permute_op(i)];
1020 INT16 *h263_pred_motion(MpegEncContext * s, int block,
1024 INT16 *A, *B, *C, *mot_val;
1025 static const int off[4]= {2, 1, 1, -1};
1027 wrap = s->block_wrap[0];
1028 xy = s->block_index[block];
1030 mot_val = s->motion_val[xy];
1032 A = s->motion_val[xy - 1];
1033 /* special case for first (slice) line */
1034 if ((s->mb_y == 0 || s->first_slice_line) && block<3) {
1035 // we cant just change some MVs to simulate that as we need them for the B frames (and ME)
1036 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
1037 if(block==0){ //most common case
1038 if(s->mb_x == s->resync_mb_x){ //rare
1040 }else if(s->mb_x + 1 == s->resync_mb_x){ //rare
1041 C = s->motion_val[xy + off[block] - wrap];
1046 *px = mid_pred(A[0], 0, C[0]);
1047 *py = mid_pred(A[1], 0, C[1]);
1054 if(s->mb_x + 1 == s->resync_mb_x){ //rare
1055 C = s->motion_val[xy + off[block] - wrap];
1056 *px = mid_pred(A[0], 0, C[0]);
1057 *py = mid_pred(A[1], 0, C[1]);
1062 }else{ /* block==2*/
1063 B = s->motion_val[xy - wrap];
1064 C = s->motion_val[xy + off[block] - wrap];
1065 if(s->mb_x == s->resync_mb_x) //rare
1068 *px = mid_pred(A[0], B[0], C[0]);
1069 *py = mid_pred(A[1], B[1], C[1]);
1072 B = s->motion_val[xy - wrap];
1073 C = s->motion_val[xy + off[block] - wrap];
1074 *px = mid_pred(A[0], B[0], C[0]);
1075 *py = mid_pred(A[1], B[1], C[1]);
1080 static void h263_encode_motion(MpegEncContext * s, int val, int f_code)
1082 int range, l, m, bit_size, sign, code, bits;
1087 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1089 bit_size = f_code - 1;
1090 range = 1 << bit_size;
1091 /* modulo encoding */
1096 } else if (val >= l) {
1099 assert(val>=-l && val<l);
1108 code = (val >> bit_size) + 1;
1109 bits = val & (range - 1);
1111 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1113 put_bits(&s->pb, bit_size, bits);
1118 /* Encode MV differences on H.263+ with Unrestricted MV mode */
1119 static void h263p_encode_umotion(MpegEncContext * s, int val)
1129 put_bits(&s->pb, 1, 1);
1131 put_bits(&s->pb, 3, 0);
1133 put_bits(&s->pb, 3, 2);
1136 sval = ((val < 0) ? (short)(-val):(short)val);
1139 while (temp_val != 0) {
1140 temp_val = temp_val >> 1;
1146 tcode = (sval & (1 << (i-1))) >> (i-1);
1147 tcode = (tcode << 1) | 1;
1148 code = (code << 2) | tcode;
1151 code = ((code << 1) | (val < 0)) << 1;
1152 put_bits(&s->pb, (2*n_bits)+1, code);
1153 //printf("\nVal = %d\tCode = %d", sval, code);
1157 static void init_mv_penalty_and_fcode(MpegEncContext *s)
1161 for(f_code=1; f_code<=MAX_FCODE; f_code++){
1162 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
1165 if(mv==0) len= mvtab[0][1];
1167 int val, bit_size, range, code;
1169 bit_size = s->f_code - 1;
1170 range = 1 << bit_size;
1176 code = (val >> bit_size) + 1;
1178 len= mvtab[code][1] + 1 + bit_size;
1180 len= mvtab[32][1] + 2 + bit_size;
1184 mv_penalty[f_code][mv+MAX_MV]= len;
1188 for(f_code=MAX_FCODE; f_code>0; f_code--){
1189 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
1190 fcode_tab[mv+MAX_MV]= f_code;
1194 for(mv=0; mv<MAX_MV*2+1; mv++){
1195 umv_fcode_tab[mv]= 1;
1199 static void init_uni_dc_tab(void)
1201 int level, uni_code, uni_len;
1203 for(level=-256; level<256; level++){
1205 /* find number of bits */
1214 l= (-level) ^ ((1 << size) - 1);
1219 uni_code= DCtab_lum[size][0];
1220 uni_len = DCtab_lum[size][1];
1223 uni_code<<=size; uni_code|=l;
1226 uni_code<<=1; uni_code|=1;
1230 uni_DCtab_lum[level+256][0]= uni_code;
1231 uni_DCtab_lum[level+256][1]= uni_len;
1234 uni_code= DCtab_chrom[size][0];
1235 uni_len = DCtab_chrom[size][1];
1238 uni_code<<=size; uni_code|=l;
1241 uni_code<<=1; uni_code|=1;
1245 uni_DCtab_chrom[level+256][0]= uni_code;
1246 uni_DCtab_chrom[level+256][1]= uni_len;
1251 static void init_uni_mpeg4_rl_tab(RLTable *rl, UINT32 *bits_tab, UINT8 *len_tab){
1252 int slevel, run, last;
1254 assert(MAX_LEVEL >= 64);
1255 assert(MAX_RUN >= 63);
1257 for(slevel=-64; slevel<64; slevel++){
1258 if(slevel==0) continue;
1259 for(run=0; run<64; run++){
1260 for(last=0; last<=1; last++){
1261 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1262 int level= slevel < 0 ? -slevel : slevel;
1263 int sign= slevel < 0 ? 1 : 0;
1264 int bits, len, code;
1267 len_tab[index]= 100;
1270 code= get_rl_index(rl, last, run, level);
1271 bits= rl->table_vlc[code][0];
1272 len= rl->table_vlc[code][1];
1273 bits=bits*2+sign; len++;
1275 if(code!=rl->n && len < len_tab[index]){
1276 bits_tab[index]= bits;
1277 len_tab [index]= len;
1281 bits= rl->table_vlc[rl->n][0];
1282 len= rl->table_vlc[rl->n][1];
1283 bits=bits*2; len++; //esc1
1284 level1= level - rl->max_level[last][run];
1286 code= get_rl_index(rl, last, run, level1);
1287 bits<<= rl->table_vlc[code][1];
1288 len += rl->table_vlc[code][1];
1289 bits += rl->table_vlc[code][0];
1290 bits=bits*2+sign; len++;
1292 if(code!=rl->n && len < len_tab[index]){
1293 bits_tab[index]= bits;
1294 len_tab [index]= len;
1300 bits= rl->table_vlc[rl->n][0];
1301 len= rl->table_vlc[rl->n][1];
1302 bits=bits*4+2; len+=2; //esc2
1303 run1 = run - rl->max_run[last][level] - 1;
1305 code= get_rl_index(rl, last, run1, level);
1306 bits<<= rl->table_vlc[code][1];
1307 len += rl->table_vlc[code][1];
1308 bits += rl->table_vlc[code][0];
1309 bits=bits*2+sign; len++;
1311 if(code!=rl->n && len < len_tab[index]){
1312 bits_tab[index]= bits;
1313 len_tab [index]= len;
1318 bits= rl->table_vlc[rl->n][0];
1319 len = rl->table_vlc[rl->n][1];
1320 bits=bits*4+3; len+=2; //esc3
1321 bits=bits*2+last; len++;
1322 bits=bits*64+run; len+=6;
1323 bits=bits*2+1; len++; //marker
1324 bits=bits*4096+(slevel&0xfff); len+=12;
1325 bits=bits*2+1; len++; //marker
1327 if(len < len_tab[index]){
1328 bits_tab[index]= bits;
1329 len_tab [index]= len;
1336 void h263_encode_init(MpegEncContext *s)
1338 static int done = 0;
1347 init_rl(&rl_intra_aic);
1349 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
1350 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
1352 init_mv_penalty_and_fcode(s);
1354 s->mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
1356 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
1357 switch(s->codec_id){
1358 case CODEC_ID_MPEG4:
1359 s->fcode_tab= fcode_tab;
1360 s->min_qcoeff= -2048;
1361 s->max_qcoeff= 2047;
1363 case CODEC_ID_H263P:
1364 s->fcode_tab= umv_fcode_tab;
1365 s->min_qcoeff= -128;
1368 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
1369 default: //nothing needed default table allready set in mpegvideo.c
1370 s->min_qcoeff= -128;
1372 s->y_dc_scale_table=
1373 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
1377 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
1378 s->inter_quant_bias= 0;
1380 s->intra_quant_bias=0;
1381 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
1385 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
1387 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
1391 if (s->mb_intra && !s->h263_aic) {
1394 /* 255 cannot be represented, so we clamp */
1399 /* 0 cannot be represented also */
1405 put_bits(&s->pb, 8, 0xff);
1407 put_bits(&s->pb, 8, level & 0xff);
1411 if (s->h263_aic && s->mb_intra)
1416 last_index = s->block_last_index[n];
1417 last_non_zero = i - 1;
1418 for (; i <= last_index; i++) {
1419 j = zigzag_direct[i];
1422 run = i - last_non_zero - 1;
1423 last = (i == last_index);
1430 code = get_rl_index(rl, last, run, level);
1431 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1432 if (code == rl->n) {
1433 put_bits(&s->pb, 1, last);
1434 put_bits(&s->pb, 6, run);
1435 put_bits(&s->pb, 8, slevel & 0xff);
1437 put_bits(&s->pb, 1, sign);
1444 /***************************************************/
1446 void ff_mpeg4_stuffing(PutBitContext * pbc)
1449 put_bits(pbc, 1, 0);
1450 length= (-get_bit_count(pbc))&7;
1451 if(length) put_bits(pbc, length, (1<<length)-1);
1454 /* must be called before writing the header */
1455 void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){
1456 int time_div, time_mod;
1458 if(s->pict_type==I_TYPE){ //we will encode a vol header
1459 s->time_increment_resolution= s->frame_rate/ff_gcd(s->frame_rate, FRAME_RATE_BASE);
1460 if(s->time_increment_resolution>=256*256) s->time_increment_resolution= 256*128;
1462 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
1466 s->time= (s->avctx->pts*s->time_increment_resolution + 500*1000)/(1000*1000);
1468 s->time= picture_number*(INT64)FRAME_RATE_BASE*s->time_increment_resolution/s->frame_rate;
1469 time_div= s->time/s->time_increment_resolution;
1470 time_mod= s->time%s->time_increment_resolution;
1472 if(s->pict_type==B_TYPE){
1473 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
1475 s->last_time_base= s->time_base;
1476 s->time_base= time_div;
1477 s->pp_time= s->time - s->last_non_b_time;
1478 s->last_non_b_time= s->time;
1482 static void mpeg4_encode_vol_header(MpegEncContext * s)
1484 int vo_ver_id=1; //must be 2 if we want GMC or q-pel
1487 s->vo_type= s->has_b_frames ? CORE_VO_TYPE : SIMPLE_VO_TYPE;
1489 put_bits(&s->pb, 16, 0);
1490 put_bits(&s->pb, 16, 0x100); /* video obj */
1491 put_bits(&s->pb, 16, 0);
1492 put_bits(&s->pb, 16, 0x120); /* video obj layer */
1494 put_bits(&s->pb, 1, 0); /* random access vol */
1495 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
1496 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
1497 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
1498 put_bits(&s->pb, 3, 1); /* is obj layer priority */
1499 if(s->aspect_ratio_info)
1500 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
1502 put_bits(&s->pb, 4, 1); /* aspect ratio info= sqare pixel */
1503 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED)
1505 put_bits(&s->pb, 8, s->aspected_width);
1506 put_bits(&s->pb, 8, s->aspected_height);
1510 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
1511 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
1512 put_bits(&s->pb, 1, s->low_delay);
1513 put_bits(&s->pb, 1, 0); /* vbv parameters= no */
1515 put_bits(&s->pb, 1, 0); /* vol control parameters= no */
1518 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
1519 put_bits(&s->pb, 1, 1); /* marker bit */
1521 put_bits(&s->pb, 16, s->time_increment_resolution);
1522 if (s->time_increment_bits < 1)
1523 s->time_increment_bits = 1;
1524 put_bits(&s->pb, 1, 1); /* marker bit */
1525 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
1526 put_bits(&s->pb, 1, 1); /* marker bit */
1527 put_bits(&s->pb, 13, s->width); /* vol width */
1528 put_bits(&s->pb, 1, 1); /* marker bit */
1529 put_bits(&s->pb, 13, s->height); /* vol height */
1530 put_bits(&s->pb, 1, 1); /* marker bit */
1531 put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
1532 put_bits(&s->pb, 1, 1); /* obmc disable */
1533 if (vo_ver_id == 1) {
1534 put_bits(&s->pb, 1, s->vol_sprite_usage=0); /* sprite enable */
1535 }else{ /* vo_ver_id == 2 */
1536 put_bits(&s->pb, 2, s->vol_sprite_usage=0); /* sprite enable */
1538 put_bits(&s->pb, 1, 0); /* not 8 bit */
1539 put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
1540 if(s->mpeg_quant) put_bits(&s->pb, 2, 0); /* no custom matrixes */
1543 put_bits(&s->pb, 1, s->quarter_sample=0);
1544 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
1545 s->resync_marker= s->rtp_mode;
1546 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
1547 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
1548 if(s->data_partitioning){
1549 put_bits(&s->pb, 1, 0); /* no rvlc */
1552 if (vo_ver_id != 1){
1553 put_bits(&s->pb, 1, 0); /* newpred */
1554 put_bits(&s->pb, 1, 0); /* reduced res vop */
1556 put_bits(&s->pb, 1, 0); /* scalability */
1558 ff_mpeg4_stuffing(&s->pb);
1562 put_bits(&s->pb, 16, 0);
1563 put_bits(&s->pb, 16, 0x1B2); /* user_data */
1564 sprintf(buf, "FFmpeg%sb%s", FFMPEG_VERSION, LIBAVCODEC_BUILD_STR);
1565 put_string(&s->pb, buf);
1566 ff_mpeg4_stuffing(&s->pb);
1570 /* write mpeg4 VOP header */
1571 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
1574 int time_div, time_mod;
1576 if(s->pict_type==I_TYPE){
1578 if(picture_number==0 || !s->strict_std_compliance)
1579 mpeg4_encode_vol_header(s);
1582 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->frame_rate, FRAME_RATE_BASE);
1584 put_bits(&s->pb, 16, 0); /* vop header */
1585 put_bits(&s->pb, 16, 0x1B6); /* vop header */
1586 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
1588 time_div= s->time/s->time_increment_resolution;
1589 time_mod= s->time%s->time_increment_resolution;
1590 time_incr= time_div - s->last_time_base;
1592 put_bits(&s->pb, 1, 1);
1594 put_bits(&s->pb, 1, 0);
1596 put_bits(&s->pb, 1, 1); /* marker */
1597 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
1598 put_bits(&s->pb, 1, 1); /* marker */
1599 put_bits(&s->pb, 1, 1); /* vop coded */
1600 if ( s->pict_type == P_TYPE
1601 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
1602 s->no_rounding ^= 1;
1603 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
1605 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
1606 if(!s->progressive_sequence){
1607 put_bits(&s->pb, 1, s->top_field_first);
1608 put_bits(&s->pb, 1, s->alternate_scan);
1610 //FIXME sprite stuff
1612 put_bits(&s->pb, 5, s->qscale);
1614 if (s->pict_type != I_TYPE)
1615 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
1616 if (s->pict_type == B_TYPE)
1617 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
1618 // printf("****frame %d\n", picture_number);
1620 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
1621 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
1622 s->h_edge_pos= s->width;
1623 s->v_edge_pos= s->height;
1626 static void change_qscale(MpegEncContext * s, int dquant)
1628 s->qscale += dquant;
1632 else if (s->qscale > 31)
1635 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
1636 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
1639 inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr)
1641 int a, b, c, wrap, pred, scale;
1645 /* find prediction */
1647 scale = s->y_dc_scale;
1649 scale = s->c_dc_scale;
1651 wrap= s->block_wrap[n];
1652 dc_val = s->dc_val[0] + s->block_index[n];
1658 b = dc_val[ - 1 - wrap];
1659 c = dc_val[ - wrap];
1661 if (abs(a - b) < abs(b - c)) {
1663 *dir_ptr = 1; /* top */
1666 *dir_ptr = 0; /* left */
1668 /* we assume pred is positive */
1671 "xorl %%edx, %%edx \n\t"
1673 : "=d" (pred), "=a"(dummy)
1674 : "a" (pred + (scale >> 1)), "c" (inverse[scale])
1677 pred = (pred + (scale >> 1)) / scale;
1680 /* prepare address for prediction update */
1681 *dc_val_ptr = &dc_val[0];
1686 void mpeg4_pred_ac(MpegEncContext * s, INT16 *block, int n,
1690 INT16 *ac_val, *ac_val1;
1692 /* find prediction */
1693 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1697 const int xy= s->mb_x-1 + s->mb_y*s->mb_width;
1698 /* left prediction */
1701 if(s->mb_x==0 || s->qscale == s->qscale_table[xy] || n==1 || n==3){
1704 block[block_permute_op(i*8)] += ac_val[i];
1707 /* different qscale, we must rescale */
1709 block[block_permute_op(i*8)] += ROUNDED_DIV(ac_val[i]*s->qscale_table[xy], s->qscale);
1713 const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width;
1714 /* top prediction */
1715 ac_val -= 16 * s->block_wrap[n];
1717 if(s->mb_y==0 || s->qscale == s->qscale_table[xy] || n==2 || n==3){
1720 block[block_permute_op(i)] += ac_val[i + 8];
1723 /* different qscale, we must rescale */
1725 block[block_permute_op(i)] += ROUNDED_DIV(ac_val[i + 8]*s->qscale_table[xy], s->qscale);
1732 ac_val1[i] = block[block_permute_op(i * 8)];
1736 ac_val1[8 + i] = block[block_permute_op(i)];
1740 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
1746 /* find prediction */
1747 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1750 const int xy= s->mb_x-1 + s->mb_y*s->mb_width;
1751 /* left prediction */
1753 if(s->mb_x==0 || s->qscale == s->qscale_table[xy] || n==1 || n==3){
1756 block[block_permute_op(i*8)] -= ac_val[i];
1759 /* different qscale, we must rescale */
1761 block[block_permute_op(i*8)] -= ROUNDED_DIV(ac_val[i]*s->qscale_table[xy], s->qscale);
1765 const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width;
1766 /* top prediction */
1767 ac_val -= 16 * s->block_wrap[n];
1768 if(s->mb_y==0 || s->qscale == s->qscale_table[xy] || n==2 || n==3){
1771 block[block_permute_op(i)] -= ac_val[i + 8];
1774 /* different qscale, we must rescale */
1776 block[block_permute_op(i)] -= ROUNDED_DIV(ac_val[i + 8]*s->qscale_table[xy], s->qscale);
1782 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
1785 // if(level<-255 || level>255) printf("dc overflow\n");
1789 put_bits(s, uni_DCtab_lum[level][1], uni_DCtab_lum[level][0]);
1792 put_bits(s, uni_DCtab_chrom[level][1], uni_DCtab_chrom[level][0]);
1796 /* find number of bits */
1806 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
1809 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
1812 /* encode remaining bits */
1815 level = (-level) ^ ((1 << size) - 1);
1816 put_bits(&s->pb, size, level);
1818 put_bits(&s->pb, 1, 1);
1823 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
1824 UINT8 *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
1826 int last, i, last_non_zero, sign;
1831 const int last_index = s->block_last_index[n];
1833 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
1834 /* mpeg4 based DC predictor */
1835 mpeg4_encode_dc(dc_pb, intra_dc, n);
1836 if(last_index<1) return;
1839 bits_tab= uni_mpeg4_intra_rl_bits;
1840 len_tab = uni_mpeg4_intra_rl_len;
1842 if(last_index<0) return;
1845 bits_tab= uni_mpeg4_inter_rl_bits;
1846 len_tab = uni_mpeg4_inter_rl_len;
1850 last_non_zero = i - 1;
1852 for (; i < last_index; i++) {
1853 int level = block[ scan_table[i] ];
1855 int run = i - last_non_zero - 1;
1857 if((level&(~127)) == 0){
1858 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
1859 put_bits(ac_pb, len_tab[index], bits_tab[index]);
1861 put_bits(ac_pb, 7+2+1+6+1+12+1, (3<<23)+(3<<21)+(0<<20)+(run<<14)+(1<<13)+(((level-64)&0xfff)<<1)+1);
1866 /*if(i<=last_index)*/{
1867 int level = block[ scan_table[i] ];
1868 int run = i - last_non_zero - 1;
1870 if((level&(~127)) == 0){
1871 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
1872 put_bits(ac_pb, len_tab[index], bits_tab[index]);
1874 put_bits(ac_pb, 7+2+1+6+1+12+1, (3<<23)+(3<<21)+(1<<20)+(run<<14)+(1<<13)+(((level-64)&0xfff)<<1)+1);
1878 for (; i <= last_index; i++) {
1879 const int slevel = block[ scan_table[i] ];
1882 int run = i - last_non_zero - 1;
1883 last = (i == last_index);
1890 code = get_rl_index(rl, last, run, level);
1891 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1892 if (code == rl->n) {
1894 level1 = level - rl->max_level[last][run];
1897 code = get_rl_index(rl, last, run, level1);
1898 if (code == rl->n) {
1900 put_bits(ac_pb, 1, 1);
1901 if (level > MAX_LEVEL)
1903 run1 = run - rl->max_run[last][level] - 1;
1906 code = get_rl_index(rl, last, run1, level);
1907 if (code == rl->n) {
1910 put_bits(ac_pb, 1, 1);
1911 put_bits(ac_pb, 1, last);
1912 put_bits(ac_pb, 6, run);
1913 put_bits(ac_pb, 1, 1);
1914 put_bits(ac_pb, 12, slevel & 0xfff);
1915 put_bits(ac_pb, 1, 1);
1918 put_bits(ac_pb, 1, 0);
1919 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1920 put_bits(ac_pb, 1, sign);
1924 put_bits(ac_pb, 1, 0);
1925 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1926 put_bits(ac_pb, 1, sign);
1929 put_bits(ac_pb, 1, sign);
1939 /***********************************************/
1942 static VLC intra_MCBPC_vlc;
1943 static VLC inter_MCBPC_vlc;
1944 static VLC cbpy_vlc;
1946 static VLC dc_lum, dc_chrom;
1947 static VLC sprite_trajectory;
1948 static VLC mb_type_b_vlc;
1950 void init_rl(RLTable *rl)
1952 INT8 max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
1953 UINT8 index_run[MAX_RUN+1];
1954 int last, run, level, start, end, i;
1956 /* compute max_level[], max_run[] and index_run[] */
1957 for(last=0;last<2;last++) {
1966 memset(max_level, 0, MAX_RUN + 1);
1967 memset(max_run, 0, MAX_LEVEL + 1);
1968 memset(index_run, rl->n, MAX_RUN + 1);
1969 for(i=start;i<end;i++) {
1970 run = rl->table_run[i];
1971 level = rl->table_level[i];
1972 if (index_run[run] == rl->n)
1974 if (level > max_level[run])
1975 max_level[run] = level;
1976 if (run > max_run[level])
1977 max_run[level] = run;
1979 rl->max_level[last] = av_malloc(MAX_RUN + 1);
1980 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1981 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1982 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1983 rl->index_run[last] = av_malloc(MAX_RUN + 1);
1984 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1988 void init_vlc_rl(RLTable *rl)
1992 init_vlc(&rl->vlc, 9, rl->n + 1,
1993 &rl->table_vlc[0][1], 4, 2,
1994 &rl->table_vlc[0][0], 4, 2);
1997 for(q=0; q<32; q++){
2006 rl->rl_vlc[q]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
2007 for(i=0; i<rl->vlc.table_size; i++){
2008 int code= rl->vlc.table[i][0];
2009 int len = rl->vlc.table[i][1];
2012 if(len==0){ // illegal code
2015 }else if(len<0){ //more bits needed
2019 if(code==rl->n){ //esc
2023 run= rl->table_run [code] + 1;
2024 level= rl->table_level[code] * qmul + qadd;
2025 if(code >= rl->last) run+=192;
2028 rl->rl_vlc[q][i].len= len;
2029 rl->rl_vlc[q][i].level= level;
2030 rl->rl_vlc[q][i].run= run;
2037 /* XXX: find a better solution to handle static init */
2038 void h263_decode_init_vlc(MpegEncContext *s)
2040 static int done = 0;
2045 init_vlc(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 8,
2046 intra_MCBPC_bits, 1, 1,
2047 intra_MCBPC_code, 1, 1);
2048 init_vlc(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 25,
2049 inter_MCBPC_bits, 1, 1,
2050 inter_MCBPC_code, 1, 1);
2051 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
2052 &cbpy_tab[0][1], 2, 1,
2053 &cbpy_tab[0][0], 2, 1);
2054 init_vlc(&mv_vlc, MV_VLC_BITS, 33,
2056 &mvtab[0][0], 2, 1);
2059 init_rl(&rl_intra_aic);
2060 init_vlc_rl(&rl_inter);
2061 init_vlc_rl(&rl_intra);
2062 init_vlc_rl(&rl_intra_aic);
2063 init_vlc(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
2064 &DCtab_lum[0][1], 2, 1,
2065 &DCtab_lum[0][0], 2, 1);
2066 init_vlc(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
2067 &DCtab_chrom[0][1], 2, 1,
2068 &DCtab_chrom[0][0], 2, 1);
2069 init_vlc(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
2070 &sprite_trajectory_tab[0][1], 4, 2,
2071 &sprite_trajectory_tab[0][0], 4, 2);
2072 init_vlc(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
2073 &mb_type_b_tab[0][1], 2, 1,
2074 &mb_type_b_tab[0][0], 2, 1);
2077 s->progressive_sequence=1; // set to most likely for the case of incomplete headers
2080 int h263_decode_gob_header(MpegEncContext *s)
2082 unsigned int val, gfid;
2084 /* Check for GOB Start Code */
2085 val = show_bits(&s->gb, 16);
2087 /* We have a GBSC probably with GSTUFF */
2088 skip_bits(&s->gb, 16); /* Drop the zeros */
2089 while (get_bits1(&s->gb) == 0); /* Seek the '1' bit */
2091 fprintf(stderr,"\nGOB Start Code at MB %d\n", (s->mb_y * s->mb_width) + s->mb_x);
2093 s->gob_number = get_bits(&s->gb, 5); /* GN */
2094 gfid = get_bits(&s->gb, 2); /* GFID */
2095 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
2097 fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", s->gob_number, gfid, s->qscale);
2105 static inline void memsetw(short *tab, int val, int n)
2112 void ff_mpeg4_init_partitions(MpegEncContext *s)
2114 init_put_bits(&s->tex_pb, s->tex_pb_buffer, PB_BUFFER_SIZE, NULL, NULL);
2115 init_put_bits(&s->pb2 , s->pb2_buffer , PB_BUFFER_SIZE, NULL, NULL);
2118 void ff_mpeg4_merge_partitions(MpegEncContext *s)
2120 const int pb2_len = get_bit_count(&s->pb2 );
2121 const int tex_pb_len= get_bit_count(&s->tex_pb);
2122 const int bits= get_bit_count(&s->pb);
2124 if(s->pict_type==I_TYPE){
2125 put_bits(&s->pb, 19, DC_MARKER);
2126 s->misc_bits+=19 + pb2_len + bits - s->last_bits;
2127 s->i_tex_bits+= tex_pb_len;
2129 put_bits(&s->pb, 17, MOTION_MARKER);
2130 s->misc_bits+=17 + pb2_len;;
2131 s->mv_bits+= bits - s->last_bits;
2132 s->p_tex_bits+= tex_pb_len;
2135 flush_put_bits(&s->pb2);
2136 flush_put_bits(&s->tex_pb);
2138 ff_copy_bits(&s->pb, s->pb2_buffer , pb2_len);
2139 ff_copy_bits(&s->pb, s->tex_pb_buffer, tex_pb_len);
2140 s->last_bits= get_bit_count(&s->pb);
2143 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
2145 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
2147 ff_mpeg4_stuffing(&s->pb);
2148 if(s->pict_type==I_TYPE)
2149 put_bits(&s->pb, 16, 0);
2150 else if(s->pict_type==B_TYPE)
2151 put_bits(&s->pb, MAX(MAX(s->f_code, s->b_code)+15, 17), 0);
2153 put_bits(&s->pb, s->f_code+15, 0);
2154 put_bits(&s->pb, 1, 1);
2156 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
2157 put_bits(&s->pb, 5, s->qscale);
2158 put_bits(&s->pb, 1, 0); /* no HEC */
2162 * decodes the next video packet and sets s->next_qscale
2163 * returns mb_num of the next packet or <0 if something went wrong
2165 static int decode_video_packet_header(MpegEncContext *s, GetBitContext *gb)
2168 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
2169 int header_extension=0, mb_num;
2170 //printf("%X\n", show_bits(&gb, 24));
2171 //printf("parse_video_packet_header\n");
2172 // if(show_aligned_bits(gb, 1, 16) != 0) return -1;
2174 /* is there enough space left for a video packet + header */
2175 if( get_bits_count(gb) > gb->size*8-20) return -1;
2177 //printf("resync at %d %d\n", s->mb_x, s->mb_y);
2178 // skip_bits(gb, 1);
2179 // align_get_bits(gb);
2180 if(get_bits(gb, 16)!=0){
2181 printf("internal error while decoding video packet header\n");
2184 //printf("%X\n", show_bits(gb, 24));
2186 while(!get_bits1(gb) && bits<30) bits++;
2187 if((s->pict_type == P_TYPE || s->pict_type == S_TYPE) && bits != s->f_code-1){
2188 printf("marker does not match f_code (is: %d should be: %d pos: %d end %d x: %d y: %d)\n",
2189 bits+1, s->f_code, get_bits_count(gb), gb->size*8, s->mb_x, s->mb_y);
2191 }else if(s->pict_type == I_TYPE && bits != 0){
2192 printf("marker too long\n");
2194 }else if(s->pict_type == B_TYPE && bits != MAX(MAX(s->f_code, s->b_code)-1, 1)){
2195 printf("marker does not match f/b_code\n");
2198 //printf("%X\n", show_bits(gb, 24));
2200 if(s->shape != RECT_SHAPE){
2201 header_extension= get_bits1(gb);
2202 //FIXME more stuff here
2205 mb_num= get_bits(gb, mb_num_bits);
2206 if(mb_num < s->mb_x + s->mb_y*s->mb_width || mb_num>=s->mb_num){
2207 fprintf(stderr, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_x + s->mb_y*s->mb_width);
2211 if(s->shape != BIN_ONLY_SHAPE){
2212 s->next_resync_qscale= get_bits(gb, 5);
2213 if(s->next_resync_qscale==0)
2214 s->next_resync_qscale= s->qscale;
2215 if(s->next_resync_qscale==0){
2216 fprintf(stderr, "qscale==0\n");
2221 if(s->shape == RECT_SHAPE){
2222 header_extension= get_bits1(gb);
2224 if(header_extension){
2228 while (get_bits1(gb) != 0)
2231 check_marker(gb, "before time_increment in video packed header");
2232 time_increment= get_bits(gb, s->time_increment_bits);
2233 check_marker(gb, "before vop_coding_type in video packed header");
2235 skip_bits(gb, 2); /* vop coding type */
2236 //FIXME not rect stuff here
2238 if(s->shape != BIN_ONLY_SHAPE){
2239 skip_bits(gb, 3); /* intra dc vlc threshold */
2241 if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE && s->num_sprite_warping_points){
2242 mpeg4_decode_sprite_trajectory(s);
2243 fprintf(stderr, "untested\n");
2246 //FIXME reduced res stuff here
2248 if (s->pict_type != I_TYPE) {
2249 int f_code = get_bits(gb, 3); /* fcode_for */
2251 printf("Error, video packet header damaged (f_code=0)\n");
2254 if (s->pict_type == B_TYPE) {
2255 int b_code = get_bits(gb, 3);
2257 printf("Error, video packet header damaged (b_code=0)\n");
2262 //FIXME new-pred stuff
2264 //printf("parse ok %d %d %d %d\n", mb_num, s->mb_x + s->mb_y*s->mb_width, get_bits_count(gb), get_bits_count(&s->gb));
2269 void ff_mpeg4_clean_buffers(MpegEncContext *s)
2271 int c_wrap, c_xy, l_wrap, l_xy;
2273 l_wrap= s->block_wrap[0];
2274 l_xy= s->mb_y*l_wrap*2 + s->mb_x*2;
2275 c_wrap= s->block_wrap[4];
2276 c_xy= s->mb_y*c_wrap + s->mb_x;
2279 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
2280 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
2281 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
2284 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(INT16));
2285 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(INT16));
2286 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(INT16));
2289 // we cant clear the MVs as they might be needed by a b frame
2290 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(INT16));
2291 // memset(s->motion_val, 0, 2*sizeof(INT16)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
2292 s->last_mv[0][0][0]=
2293 s->last_mv[0][0][1]=
2294 s->last_mv[1][0][0]=
2295 s->last_mv[1][0][1]= 0;
2298 /* searches for the next resync marker clears ac,dc,mc, and sets s->next_resync_gb, s->mb_num_left */
2299 int ff_mpeg4_resync(MpegEncContext *s)
2303 /* search & parse next resync marker */
2305 gb= s->next_resync_gb;
2306 align_get_bits(&gb);
2307 //printf("mpeg4_resync %d next:%d \n", get_bits_count(&gb), get_bits_count(&s->next_resync_gb));
2309 int v= show_bits(&gb, 24);
2310 if( get_bits_count(&gb) >= gb.size*8-24 || v == 1 /* start-code */){
2311 s->mb_num_left= s->mb_num - s->mb_x - s->mb_y*s->mb_width;
2312 //printf("mpeg4_resync end\n");
2313 s->gb= s->next_resync_gb; //continue at the next resync marker
2315 }else if(v>>8 == 0){
2317 s->next_resync_pos= get_bits_count(&gb);
2319 next= decode_video_packet_header(s, &gb);
2321 s->mb_num_left= next - s->mb_x - s->mb_y*s->mb_width;
2325 align_get_bits(&gb);
2329 s->next_resync_gb=gb;
2334 static inline void init_block_index(MpegEncContext *s)
2336 s->block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
2337 s->block_index[1]= s->block_wrap[0]*(s->mb_y*2 + 1) + s->mb_x*2;
2338 s->block_index[2]= s->block_wrap[0]*(s->mb_y*2 + 2) - 1 + s->mb_x*2;
2339 s->block_index[3]= s->block_wrap[0]*(s->mb_y*2 + 2) + s->mb_x*2;
2340 s->block_index[4]= s->block_wrap[4]*(s->mb_y + 1) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x;
2341 s->block_index[5]= s->block_wrap[4]*(s->mb_y + 1 + s->mb_height + 2) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x;
2344 static inline void update_block_index(MpegEncContext *s)
2346 s->block_index[0]+=2;
2347 s->block_index[1]+=2;
2348 s->block_index[2]+=2;
2349 s->block_index[3]+=2;
2350 s->block_index[4]++;
2351 s->block_index[5]++;
2355 * decodes the first & second partition
2356 * returns error type or 0 if no error
2358 int ff_mpeg4_decode_partitions(MpegEncContext *s)
2360 static const INT8 quant_tab[4] = { -1, -2, 1, 2 };
2363 /* decode first partition */
2365 s->first_slice_line=1;
2366 s->mb_x= s->resync_mb_x;
2367 for(s->mb_y= s->resync_mb_y; mb_num < s->mb_num_left; s->mb_y++){
2368 init_block_index(s);
2369 for(; mb_num < s->mb_num_left && s->mb_x<s->mb_width; s->mb_x++){
2370 const int xy= s->mb_x + s->mb_y*s->mb_width;
2375 update_block_index(s);
2376 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
2377 s->first_slice_line=0;
2379 if(s->mb_x==0) PRINT_MB_TYPE("\n");
2381 if(s->pict_type==I_TYPE){
2385 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
2387 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
2388 return DECODING_DESYNC;
2390 s->cbp_table[xy]= cbpc & 3;
2391 s->mb_type[xy]= MB_TYPE_INTRA;
2395 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2397 s->qscale_table[xy]= s->qscale;
2399 s->mbintra_table[xy]= 1;
2402 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
2404 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
2405 return DECODING_DESYNC;
2408 if(dc_pred_dir) dir|=1;
2410 s->pred_dir_table[xy]= dir;
2411 }else{ /* P/S_TYPE */
2412 int mx, my, pred_x, pred_y;
2413 INT16 * const mot_val= s->motion_val[s->block_index[0]];
2414 const int stride= s->block_wrap[0]*2;
2416 if(get_bits1(&s->gb)){
2418 s->mb_type[xy]= MB_TYPE_SKIPED;
2419 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2420 const int a= s->sprite_warping_accuracy;
2422 if(s->divx_version==500 && s->divx_build==413){
2423 mx = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
2424 my = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2426 mx = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2427 my = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2428 s->mb_type[xy]= MB_TYPE_GMC | MB_TYPE_SKIPED;
2435 mot_val[0 ]= mot_val[2 ]=
2436 mot_val[0+stride]= mot_val[2+stride]= mx;
2437 mot_val[1 ]= mot_val[3 ]=
2438 mot_val[1+stride]= mot_val[3+stride]= my;
2440 if(s->mbintra_table[xy])
2441 ff_clean_intra_table_entries(s);
2445 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
2447 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
2448 return DECODING_DESYNC;
2452 else if (cbpc == 20)
2453 fprintf(stderr, "Stuffing !");
2454 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
2456 s->mb_intra = ((cbpc & 4) != 0);
2460 s->mbintra_table[xy]= 1;
2461 s->mb_type[xy]= MB_TYPE_INTRA;
2462 mot_val[0 ]= mot_val[2 ]=
2463 mot_val[0+stride]= mot_val[2+stride]= 0;
2464 mot_val[1 ]= mot_val[3 ]=
2465 mot_val[1+stride]= mot_val[3+stride]= 0;
2467 if(s->mbintra_table[xy])
2468 ff_clean_intra_table_entries(s);
2470 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
2471 s->mcsel= get_bits1(&s->gb);
2474 if ((cbpc & 16) == 0) {
2476 /* 16x16 motion prediction */
2477 s->mb_type[xy]= MB_TYPE_INTER;
2479 h263_pred_motion(s, 0, &pred_x, &pred_y);
2481 mx = h263_decode_motion(s, pred_x, s->f_code);
2483 const int a= s->sprite_warping_accuracy;
2484 if(s->divx_version==500 && s->divx_build==413){
2485 mx = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
2487 mx = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2491 return DECODING_DESYNC;
2494 my = h263_decode_motion(s, pred_y, s->f_code);
2496 const int a= s->sprite_warping_accuracy;
2497 if(s->divx_version==500 && s->divx_build==413){
2498 my = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2500 my = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2504 return DECODING_DESYNC;
2505 mot_val[0 ]= mot_val[2 ] =
2506 mot_val[0+stride]= mot_val[2+stride]= mx;
2507 mot_val[1 ]= mot_val[3 ]=
2508 mot_val[1+stride]= mot_val[3+stride]= my;
2512 s->mb_type[xy]= MB_TYPE_INTER4V;
2514 INT16 *mot_val= h263_pred_motion(s, i, &pred_x, &pred_y);
2515 mx = h263_decode_motion(s, pred_x, s->f_code);
2517 return DECODING_DESYNC;
2519 my = h263_decode_motion(s, pred_y, s->f_code);
2521 return DECODING_DESYNC;
2532 if (s->pict_type==I_TYPE && get_bits(&s->gb, 19)!=DC_MARKER ) s->decoding_error= DECODING_DESYNC;
2533 else if(s->pict_type!=I_TYPE && get_bits(&s->gb, 17)!=MOTION_MARKER) s->decoding_error= DECODING_DESYNC;
2534 if(s->decoding_error== DECODING_DESYNC){
2535 fprintf(stderr, "marker missing after first partition at %d %d\n", s->mb_x, s->mb_y);
2536 return DECODING_DESYNC;
2539 /* decode second partition */
2541 s->mb_x= s->resync_mb_x;
2542 for(s->mb_y= s->resync_mb_y; mb_num < s->mb_num_left; s->mb_y++){
2543 init_block_index(s);
2544 for(; mb_num < s->mb_num_left && s->mb_x<s->mb_width; s->mb_x++){
2545 const int xy= s->mb_x + s->mb_y*s->mb_width;
2548 update_block_index(s);
2550 if(s->pict_type==I_TYPE){
2551 int ac_pred= get_bits1(&s->gb);
2552 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2554 fprintf(stderr, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2555 return DECODING_AC_LOST;
2558 s->cbp_table[xy]|= cbpy<<2;
2559 s->pred_dir_table[xy]|= ac_pred<<7;
2560 }else{ /* P || S_TYPE */
2561 if(s->mb_type[xy]&MB_TYPE_INTRA){
2563 int ac_pred = get_bits1(&s->gb);
2564 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2567 fprintf(stderr, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2568 return DECODING_ACDC_LOST;
2571 if(s->cbp_table[xy] & 8) {
2572 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2574 s->qscale_table[xy]= s->qscale;
2578 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
2580 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
2581 return DECODING_ACDC_LOST;
2584 if(dc_pred_dir) dir|=1;
2586 s->cbp_table[xy]&= 3; //remove dquant
2587 s->cbp_table[xy]|= cbpy<<2;
2588 s->pred_dir_table[xy]= dir | (ac_pred<<7);
2589 }else if(s->mb_type[xy]&MB_TYPE_SKIPED){
2590 s->qscale_table[xy]= s->qscale;
2591 s->cbp_table[xy]= 0;
2593 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2596 fprintf(stderr, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2597 return DECODING_ACDC_LOST;
2600 if(s->cbp_table[xy] & 8) {
2601 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2603 s->qscale_table[xy]= s->qscale;
2605 s->cbp_table[xy]&= 3; //remove dquant
2606 s->cbp_table[xy]|= (cbpy^0xf)<<2;
2617 static int mpeg4_decode_partitioned_mb(MpegEncContext *s,
2618 DCTELEM block[6][64])
2621 const int xy= s->mb_x + s->mb_y*s->mb_width;
2623 if(s->mb_x==s->resync_mb_x && s->mb_y==s->resync_mb_y){ //Note resync_mb_{x,y}==0 at the start
2625 int block_index_backup[6];
2626 int qscale= s->qscale;
2628 for(i=0; i<6; i++) block_index_backup[i]= s->block_index[i];
2630 s->decoding_error= ff_mpeg4_decode_partitions(s);
2632 for(i=0; i<6; i++) s->block_index[i]= block_index_backup[i];
2633 s->first_slice_line=1;
2634 s->mb_x= s->resync_mb_x;
2635 s->mb_y= s->resync_mb_y;
2637 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
2638 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
2640 if(s->decoding_error==DECODING_DESYNC) return -1;
2643 mb_type= s->mb_type[xy];
2644 if(s->decoding_error)
2647 cbp = s->cbp_table[xy];
2649 if(s->decoding_error!=DECODING_ACDC_LOST && s->qscale_table[xy] != s->qscale){
2650 s->qscale= s->qscale_table[xy];
2651 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
2652 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
2655 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
2658 s->mv[0][i][0] = s->motion_val[ s->block_index[i] ][0];
2659 s->mv[0][i][1] = s->motion_val[ s->block_index[i] ][1];
2661 s->mb_intra = mb_type&MB_TYPE_INTRA;
2663 if (mb_type&MB_TYPE_SKIPED) {
2666 s->block_last_index[i] = -1;
2667 s->mv_dir = MV_DIR_FORWARD;
2668 s->mv_type = MV_TYPE_16X16;
2669 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2677 }else if(s->mb_intra && s->decoding_error!=DECODING_ACDC_LOST){
2678 s->ac_pred = s->pred_dir_table[xy]>>7;
2680 /* decode each block */
2681 for (i = 0; i < 6; i++) {
2682 int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 1);
2683 if(ret==DECODING_AC_LOST){
2684 fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y);
2685 s->decoding_error=DECODING_AC_LOST;
2687 }else if(ret==DECODING_ACDC_LOST){
2688 fprintf(stderr, "dc corrupted at %d %d (trying to continue with mc only)\n", s->mb_x, s->mb_y);
2689 s->decoding_error=DECODING_ACDC_LOST;
2693 }else if(!s->mb_intra){
2694 // s->mcsel= 0; //FIXME do we need to init that
2696 s->mv_dir = MV_DIR_FORWARD;
2697 if (mb_type&MB_TYPE_INTER4V) {
2698 s->mv_type = MV_TYPE_8X8;
2700 s->mv_type = MV_TYPE_16X16;
2702 if(s->decoding_error==0 && cbp){
2703 /* decode each block */
2704 for (i = 0; i < 6; i++) {
2705 int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 0);
2706 if(ret==DECODING_AC_LOST){
2707 fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y);
2708 s->decoding_error=DECODING_AC_LOST;
2714 } else { /* I-Frame */
2717 s->ac_pred = s->pred_dir_table[xy]>>7;
2719 /* decode each block */
2720 for (i = 0; i < 6; i++) {
2721 int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 1);
2722 if(ret==DECODING_AC_LOST){
2723 fprintf(stderr, "texture corrupted at %d %d (trying to continue with dc only)\n", s->mb_x, s->mb_y);
2724 s->decoding_error=DECODING_AC_LOST;
2726 }else if(ret==DECODING_ACDC_LOST){
2727 fprintf(stderr, "dc corrupted at %d %d\n", s->mb_x, s->mb_y);
2736 static inline void decode_interlaced_info(MpegEncContext *s, int cbp, int mb_type){
2738 if(!s->progressive_sequence){
2739 if(cbp || s->mb_intra)
2740 s->interlaced_dct= get_bits1(&s->gb);
2743 if( s->pict_type==P_TYPE //FIXME check that 4MV is forbidden
2744 || (s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && !s->mcsel)
2745 || (s->pict_type==B_TYPE && mb_type!=0) ){
2747 if(get_bits1(&s->gb)){
2748 s->mv_type= MV_TYPE_FIELD;
2750 if( s->pict_type==P_TYPE
2751 || (s->pict_type==B_TYPE && mb_type!=2)){
2752 s->field_select[0][0]= get_bits1(&s->gb);
2753 s->field_select[0][1]= get_bits1(&s->gb);
2755 if(s->pict_type==B_TYPE && mb_type!=3){
2756 s->field_select[1][0]= get_bits1(&s->gb);
2757 s->field_select[1][1]= get_bits1(&s->gb);
2767 int h263_decode_mb(MpegEncContext *s,
2768 DCTELEM block[6][64])
2770 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
2772 static INT8 quant_tab[4] = { -1, -2, 1, 2 };
2774 if(s->mb_x==0) PRINT_MB_TYPE("\n");
2776 if(s->resync_marker){
2777 if(s->resync_mb_x == s->mb_x && s->resync_mb_y+1 == s->mb_y){
2778 s->first_slice_line=0;
2782 if(s->data_partitioning && s->pict_type!=B_TYPE)
2783 return mpeg4_decode_partitioned_mb(s, block);
2785 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
2786 if (get_bits1(&s->gb)) {
2790 s->block_last_index[i] = -1;
2791 s->mv_dir = MV_DIR_FORWARD;
2792 s->mv_type = MV_TYPE_16X16;
2793 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2794 const int a= s->sprite_warping_accuracy;
2795 // int l = (1 << (s->f_code - 1)) * 32;
2798 if(s->divx_version==500 && s->divx_build==413){
2799 s->mv[0][0][0] = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
2800 s->mv[0][0][1] = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2802 s->mv[0][0][0] = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2803 s->mv[0][0][1] = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2805 /* if (s->mv[0][0][0] < -l) s->mv[0][0][0]= -l;
2806 else if (s->mv[0][0][0] >= l) s->mv[0][0][0]= l-1;
2807 if (s->mv[0][0][1] < -l) s->mv[0][0][1]= -l;
2808 else if (s->mv[0][0][1] >= l) s->mv[0][0][1]= l-1;*/
2820 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
2821 //fprintf(stderr, "\tCBPC: %d", cbpc);
2826 else if (cbpc == 20)
2827 fprintf(stderr, "Stuffing !");
2830 s->mb_intra = ((cbpc & 4) != 0);
2831 if (s->mb_intra) goto intra;
2833 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
2834 s->mcsel= get_bits1(&s->gb);
2836 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2837 cbp = (cbpc & 3) | ((cbpy ^ 0xf) << 2);
2839 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2841 if((!s->progressive_sequence) && (cbp || s->workaround_bugs==2))
2842 s->interlaced_dct= get_bits1(&s->gb);
2844 s->mv_dir = MV_DIR_FORWARD;
2845 if ((cbpc & 16) == 0) {
2847 const int a= s->sprite_warping_accuracy;
2849 /* 16x16 global motion prediction */
2850 s->mv_type = MV_TYPE_16X16;
2851 // int l = (1 << (s->f_code - 1)) * 32;
2852 if(s->divx_version==500 && s->divx_build==413){
2853 mx = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
2854 my = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2856 mx = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2857 my = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2859 // int l = (1 << (s->f_code - 1)) * 32;
2860 s->mv[0][0][0] = mx;
2861 s->mv[0][0][1] = my;
2862 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
2864 /* 16x8 field motion prediction */
2865 s->mv_type= MV_TYPE_FIELD;
2867 s->field_select[0][0]= get_bits1(&s->gb);
2868 s->field_select[0][1]= get_bits1(&s->gb);
2870 h263_pred_motion(s, 0, &pred_x, &pred_y);
2873 mx = h263_decode_motion(s, pred_x, s->f_code);
2877 my = h263_decode_motion(s, pred_y/2, s->f_code);
2881 s->mv[0][i][0] = mx;
2882 s->mv[0][i][1] = my;
2886 /* 16x16 motion prediction */
2887 s->mv_type = MV_TYPE_16X16;
2888 h263_pred_motion(s, 0, &pred_x, &pred_y);
2890 mx = h263p_decode_umotion(s, pred_x);
2892 mx = h263_decode_motion(s, pred_x, s->f_code);
2898 my = h263p_decode_umotion(s, pred_y);
2900 my = h263_decode_motion(s, pred_y, s->f_code);
2904 s->mv[0][0][0] = mx;
2905 s->mv[0][0][1] = my;
2907 if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
2908 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
2912 s->mv_type = MV_TYPE_8X8;
2914 mot_val = h263_pred_motion(s, i, &pred_x, &pred_y);
2916 mx = h263p_decode_umotion(s, pred_x);
2918 mx = h263_decode_motion(s, pred_x, s->f_code);
2923 my = h263p_decode_umotion(s, pred_y);
2925 my = h263_decode_motion(s, pred_y, s->f_code);
2928 s->mv[0][i][0] = mx;
2929 s->mv[0][i][1] = my;
2930 if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
2931 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
2936 } else if(s->pict_type==B_TYPE) {
2937 int modb1; // first bit of modb
2938 int modb2; // second bit of modb
2944 s->mb_intra = 0; //B-frames never contain intra blocks
2945 s->mcsel=0; // ... true gmc blocks
2949 s->last_mv[i][0][0]=
2950 s->last_mv[i][0][1]=
2951 s->last_mv[i][1][0]=
2952 s->last_mv[i][1][1]= 0;
2956 /* if we skipped it in the future P Frame than skip it now too */
2957 s->mb_skiped= s->mbskip_table[s->mb_y * s->mb_width + s->mb_x]; // Note, skiptab=0 if last was GMC
2962 s->block_last_index[i] = -1;
2964 s->mv_dir = MV_DIR_FORWARD;
2965 s->mv_type = MV_TYPE_16X16;
2974 modb1= get_bits1(&s->gb);
2976 mb_type=4; //like MB_TYPE_B_DIRECT but no vectors coded
2981 modb2= get_bits1(&s->gb);
2982 mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
2984 else cbp= get_bits(&s->gb, 6);
2986 if (mb_type!=MB_TYPE_B_DIRECT && cbp) {
2987 if(get_bits1(&s->gb)){
2988 change_qscale(s, get_bits1(&s->gb)*4 - 2);
2993 if(!s->progressive_sequence){
2995 s->interlaced_dct= get_bits1(&s->gb);
2997 if(mb_type!=MB_TYPE_B_DIRECT && get_bits1(&s->gb)){
3000 if(mb_type!=MB_TYPE_B_BACKW){
3001 s->field_select[0][0]= get_bits1(&s->gb);
3002 s->field_select[0][1]= get_bits1(&s->gb);
3004 if(mb_type!=MB_TYPE_B_FORW){
3005 s->field_select[1][0]= get_bits1(&s->gb);
3006 s->field_select[1][1]= get_bits1(&s->gb);
3012 if(mb_type!=MB_TYPE_B_DIRECT && !field_mv){
3013 s->mv_type= MV_TYPE_16X16;
3014 if(mb_type!=MB_TYPE_B_BACKW){
3015 s->mv_dir = MV_DIR_FORWARD;
3017 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
3018 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
3019 s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
3020 s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
3023 if(mb_type!=MB_TYPE_B_FORW){
3024 s->mv_dir |= MV_DIR_BACKWARD;
3026 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
3027 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
3028 s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
3029 s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
3031 if(mb_type!=MB_TYPE_B_DIRECT)
3032 PRINT_MB_TYPE(mb_type==MB_TYPE_B_FORW ? "F" : (mb_type==MB_TYPE_B_BACKW ? "B" : "T"));
3033 }else if(mb_type!=MB_TYPE_B_DIRECT){
3034 s->mv_type= MV_TYPE_FIELD;
3036 if(mb_type!=MB_TYPE_B_BACKW){
3037 s->mv_dir = MV_DIR_FORWARD;
3040 mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code);
3041 my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
3042 s->last_mv[0][i][0]= s->mv[0][i][0] = mx;
3043 s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
3047 if(mb_type!=MB_TYPE_B_FORW){
3048 s->mv_dir |= MV_DIR_BACKWARD;
3051 mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code);
3052 my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
3053 s->last_mv[1][i][0]= s->mv[1][i][0] = mx;
3054 s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
3057 if(mb_type!=MB_TYPE_B_DIRECT)
3058 PRINT_MB_TYPE(mb_type==MB_TYPE_B_FORW ? "f" : (mb_type==MB_TYPE_B_BACKW ? "b" : "t"));
3062 if(mb_type==4 || mb_type==MB_TYPE_B_DIRECT){
3063 int mb_index= s->mb_x + s->mb_y*s->mb_width;
3069 mx = h263_decode_motion(s, 0, 1);
3070 my = h263_decode_motion(s, 0, 1);
3073 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3074 xy= s->block_index[0];
3075 time_pp= s->pp_time;
3076 time_pb= s->pb_time;
3078 //FIXME avoid divides
3079 switch(s->co_located_type_table[mb_index]){
3081 s->mv_type= MV_TYPE_16X16;
3082 s->mv[0][0][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
3083 s->mv[0][0][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
3084 s->mv[1][0][0] = mx ? s->mv[0][0][0] - s->motion_val[xy][0]
3085 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
3086 s->mv[1][0][1] = my ? s->mv[0][0][1] - s->motion_val[xy][1]
3087 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
3088 PRINT_MB_TYPE(mb_type==4 ? "D" : "S");
3090 case CO_LOCATED_TYPE_4MV:
3091 s->mv_type = MV_TYPE_8X8;
3093 xy= s->block_index[i];
3094 s->mv[0][i][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
3095 s->mv[0][i][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
3096 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->motion_val[xy][0]
3097 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
3098 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->motion_val[xy][1]
3099 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
3103 case CO_LOCATED_TYPE_FIELDMV:
3104 s->mv_type = MV_TYPE_FIELD;
3106 if(s->top_field_first){
3107 time_pp= s->pp_field_time - s->field_select_table[mb_index][i] + i;
3108 time_pb= s->pb_field_time - s->field_select_table[mb_index][i] + i;
3110 time_pp= s->pp_field_time + s->field_select_table[mb_index][i] - i;
3111 time_pb= s->pb_field_time + s->field_select_table[mb_index][i] - i;
3113 s->mv[0][i][0] = s->field_mv_table[mb_index][i][0]*time_pb/time_pp + mx;
3114 s->mv[0][i][1] = s->field_mv_table[mb_index][i][1]*time_pb/time_pp + my;
3115 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->field_mv_table[mb_index][i][0]
3116 : s->field_mv_table[mb_index][i][0]*(time_pb - time_pp)/time_pp;
3117 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->field_mv_table[mb_index][i][1]
3118 : s->field_mv_table[mb_index][i][1]*(time_pb - time_pp)/time_pp;
3125 if(mb_type<0 || mb_type>4){
3126 printf("illegal MB_type\n");
3129 } else { /* I-Frame */
3130 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
3137 if (s->h263_pred || s->h263_aic) {
3138 s->ac_pred = get_bits1(&s->gb);
3139 if (s->ac_pred && s->h263_aic)
3140 s->h263_aic_dir = get_bits1(&s->gb);
3142 PRINT_MB_TYPE(s->ac_pred ? "A" : "I");
3144 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3145 if(cbpy<0) return -1;
3146 cbp = (cbpc & 3) | (cbpy << 2);
3148 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
3150 if(!s->progressive_sequence)
3151 s->interlaced_dct= get_bits1(&s->gb);
3153 /* decode each block */
3155 for (i = 0; i < 6; i++) {
3156 if (mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 1) < 0)
3160 for (i = 0; i < 6; i++) {
3161 if (h263_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
3168 /* decode each block */
3170 for (i = 0; i < 6; i++) {
3171 if (mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 0) < 0)
3175 for (i = 0; i < 6; i++) {
3176 if (h263_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
3183 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
3185 int code, val, sign, shift, l;
3187 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
3193 sign = get_bits1(&s->gb);
3195 val = (code - 1) << shift;
3197 val |= get_bits(&s->gb, shift);
3203 /* modulo decoding */
3204 if (!s->h263_long_vectors) {
3205 l = (1 << (f_code - 1)) * 32;
3208 } else if (val >= l) {
3212 /* horrible h263 long vector mode */
3213 if (pred < -31 && val < -63)
3215 if (pred > 32 && val > 63)
3222 /* Decodes RVLC of H.263+ UMV */
3223 static int h263p_decode_umotion(MpegEncContext * s, int pred)
3227 if (get_bits1(&s->gb)) /* Motion difference = 0 */
3230 code = 2 + get_bits1(&s->gb);
3232 while (get_bits1(&s->gb))
3235 code += get_bits1(&s->gb);
3240 code = (sign) ? (pred - code) : (pred + code);
3242 fprintf(stderr,"H.263+ UMV Motion = %d\n", code);
3248 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
3251 int code, level, i, j, last, run;
3252 RLTable *rl = &rl_inter;
3253 const UINT8 *scan_table;
3255 scan_table = zigzag_direct;
3256 if (s->h263_aic && s->mb_intra) {
3260 if (s->h263_aic_dir)
3261 scan_table = ff_alternate_vertical_scan; /* left */
3263 scan_table = ff_alternate_horizontal_scan; /* top */
3265 } else if (s->mb_intra) {
3267 if (s->h263_rv10 && s->rv10_version == 3 && s->pict_type == I_TYPE) {
3268 int component, diff;
3269 component = (n <= 3 ? 0 : n - 4 + 1);
3270 level = s->last_dc[component];
3271 if (s->rv10_first_dc_coded[component]) {
3272 diff = rv_decode_dc(s, n);
3276 level = level & 0xff; /* handle wrap round */
3277 s->last_dc[component] = level;
3279 s->rv10_first_dc_coded[component] = 1;
3282 level = get_bits(&s->gb, 8);
3292 if (s->mb_intra && s->h263_aic)
3294 s->block_last_index[n] = i - 1;
3299 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
3302 if (code == rl->n) {
3304 last = get_bits1(&s->gb);
3305 run = get_bits(&s->gb, 6);
3306 level = (INT8)get_bits(&s->gb, 8);
3307 if (s->h263_rv10 && level == -128) {
3308 /* XXX: should patch encoder too */
3309 level = get_bits(&s->gb, 12);
3310 level= (level + ((-1)<<11)) ^ ((-1)<<11); //sign extension
3313 run = rl->table_run[code];
3314 level = rl->table_level[code];
3315 last = code >= rl->last;
3316 if (get_bits1(&s->gb))
3329 if (s->mb_intra && s->h263_aic) {
3330 h263_pred_acdc(s, block, n);
3333 s->block_last_index[n] = i;
3337 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
3339 int level, pred, code;
3343 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
3345 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
3346 if (code < 0 || code > 9 /* && s->nbit<9 */){
3347 fprintf(stderr, "illegal dc vlc\n");
3353 level = get_bits(&s->gb, code);
3354 if ((level >> (code - 1)) == 0) /* if MSB not set it is negative*/
3355 level = - (level ^ ((1 << code) - 1));
3357 if(get_bits1(&s->gb)==0){ /* marker */
3358 fprintf(stderr, "dc marker bit missing\n");
3364 pred = ff_mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
3369 *dc_val = level * s->y_dc_scale;
3371 *dc_val = level * s->c_dc_scale;
3378 * returns 0 if everything went ok
3379 * returns DECODING_AC_LOST if an error was detected during AC decoding
3380 * returns DECODING_ACDC_LOST if an error was detected during DC decoding
3382 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
3383 int n, int coded, int intra)
3385 int level, i, last, run;
3388 RL_VLC_ELEM * rl_vlc;
3389 const UINT8 * scan_table;
3394 if(s->data_partitioning && s->pict_type!=B_TYPE){
3395 level = s->dc_val[0][ s->block_index[n] ];
3396 if(n<4) level= (level + (s->y_dc_scale>>1))/s->y_dc_scale; //FIXME optimizs
3397 else level= (level + (s->c_dc_scale>>1))/s->c_dc_scale;
3398 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_width]<<n)&32;
3400 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
3402 return DECODING_ACDC_LOST;
3409 rl_vlc = rl_intra.rl_vlc[0];
3410 if(s->alternate_scan)
3411 scan_table = ff_alternate_vertical_scan; /* left */
3412 else if (s->ac_pred) {
3413 if (dc_pred_dir == 0)
3414 scan_table = ff_alternate_vertical_scan; /* left */
3416 scan_table = ff_alternate_horizontal_scan; /* top */
3418 scan_table = zigzag_direct;
3425 s->block_last_index[n] = i;
3430 if(s->alternate_scan)
3431 scan_table = ff_alternate_vertical_scan; /* left */
3433 scan_table = zigzag_direct;
3438 rl_vlc = rl_inter.rl_vlc[0];
3440 qmul = s->qscale << 1;
3441 qadd = (s->qscale - 1) | 1;
3442 rl_vlc = rl_inter.rl_vlc[s->qscale];
3446 OPEN_READER(re, &s->gb);
3448 UPDATE_CACHE(re, &s->gb);
3449 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
3452 cache= GET_CACHE(re, &s->gb);
3454 if (cache&0x80000000) {
3455 if (cache&0x40000000) {
3457 SKIP_CACHE(re, &s->gb, 2);
3458 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
3459 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
3460 SKIP_COUNTER(re, &s->gb, 2+1+6);
3461 UPDATE_CACHE(re, &s->gb);
3463 if(SHOW_UBITS(re, &s->gb, 1)==0){
3464 fprintf(stderr, "1. marker bit missing in 3. esc\n");
3465 return DECODING_AC_LOST;
3466 }; SKIP_CACHE(re, &s->gb, 1);
3468 level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
3470 if(SHOW_UBITS(re, &s->gb, 1)==0){
3471 fprintf(stderr, "2. marker bit missing in 3. esc\n");
3472 return DECODING_AC_LOST;
3473 }; LAST_SKIP_CACHE(re, &s->gb, 1);
3475 SKIP_COUNTER(re, &s->gb, 1+12+1);
3477 if(level*s->qscale>1024 || level*s->qscale<-1024){
3478 fprintf(stderr, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
3479 return DECODING_AC_LOST;
3483 const int abs_level= ABS(level);
3484 if(abs_level<=MAX_LEVEL && run<=MAX_RUN && s->error_resilience>=0){
3485 const int run1= run - rl->max_run[last][abs_level] - 1;
3486 if(abs_level <= rl->max_level[last][run]){
3487 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
3488 return DECODING_AC_LOST;
3490 if(abs_level <= rl->max_level[last][run]*2){
3491 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
3492 return DECODING_AC_LOST;
3494 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
3495 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
3496 return DECODING_AC_LOST;
3501 if (level>0) level= level * qmul + qadd;
3502 else level= level * qmul - qadd;
3508 #if MIN_CACHE_BITS < 20
3509 LAST_SKIP_BITS(re, &s->gb, 2);
3510 UPDATE_CACHE(re, &s->gb);
3512 SKIP_BITS(re, &s->gb, 2);
3514 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
3515 i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing
3516 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
3517 LAST_SKIP_BITS(re, &s->gb, 1);
3521 #if MIN_CACHE_BITS < 19
3522 LAST_SKIP_BITS(re, &s->gb, 1);
3523 UPDATE_CACHE(re, &s->gb);
3525 SKIP_BITS(re, &s->gb, 1);
3527 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
3529 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
3530 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
3531 LAST_SKIP_BITS(re, &s->gb, 1);
3535 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
3536 LAST_SKIP_BITS(re, &s->gb, 1);
3541 fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
3542 return DECODING_AC_LOST;
3545 block[scan_table[i]] = level;
3549 block[scan_table[i]] = level;
3551 CLOSE_READER(re, &s->gb);
3555 mpeg4_pred_ac(s, block, n, dc_pred_dir);
3557 i = 63; /* XXX: not optimal */
3560 s->block_last_index[n] = i;
3564 /* most is hardcoded. should extend to handle all h263 streams */
3565 int h263_decode_picture_header(MpegEncContext *s)
3567 int format, width, height;
3569 /* picture start code */
3570 if (get_bits(&s->gb, 22) != 0x20) {
3571 fprintf(stderr, "Bad picture start code\n");
3574 /* temporal reference */
3575 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
3577 /* PTYPE starts here */
3578 if (get_bits1(&s->gb) != 1) {
3580 fprintf(stderr, "Bad marker\n");
3583 if (get_bits1(&s->gb) != 0) {
3584 fprintf(stderr, "Bad H263 id\n");
3585 return -1; /* h263 id */
3587 skip_bits1(&s->gb); /* split screen off */
3588 skip_bits1(&s->gb); /* camera off */
3589 skip_bits1(&s->gb); /* freeze picture release off */
3591 /* Reset GOB number */
3594 format = get_bits(&s->gb, 3);
3599 7 extended PTYPE (PLUSPTYPE)
3602 if (format != 7 && format != 6) {
3605 width = h263_format[format][0];
3606 height = h263_format[format][1];
3612 s->pict_type = I_TYPE + get_bits1(&s->gb);
3614 s->unrestricted_mv = get_bits1(&s->gb);
3615 s->h263_long_vectors = s->unrestricted_mv;
3617 if (get_bits1(&s->gb) != 0) {
3618 fprintf(stderr, "H263 SAC not supported\n");
3619 return -1; /* SAC: off */
3621 if (get_bits1(&s->gb) != 0) {
3622 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
3625 if (get_bits1(&s->gb) != 0) {
3626 fprintf(stderr, "H263 PB frame not supported\n");
3627 return -1; /* not PB frame */
3629 s->qscale = get_bits(&s->gb, 5);
3630 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
3636 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
3638 /* ufep other than 0 and 1 are reserved */
3641 format = get_bits(&s->gb, 3);
3642 dprintf("ufep=1, format: %d\n", format);
3643 skip_bits(&s->gb,1); /* Custom PCF */
3644 s->umvplus_dec = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */
3645 skip_bits1(&s->gb); /* Syntax-based Arithmetic Coding (SAC) */
3646 if (get_bits1(&s->gb) != 0) {
3647 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
3649 if (get_bits1(&s->gb) != 0) { /* Advanced Intra Coding (AIC) */
3653 skip_bits(&s->gb, 7);
3654 /* these are the 7 bits: (in order of appearence */
3655 /* Deblocking Filter */
3656 /* Slice Structured */
3657 /* Reference Picture Selection */
3658 /* Independent Segment Decoding */
3659 /* Alternative Inter VLC */
3660 /* Modified Quantization */
3661 /* Prevent start code emulation */
3663 skip_bits(&s->gb, 3); /* Reserved */
3664 } else if (ufep != 0) {
3665 fprintf(stderr, "Bad UFEP type (%d)\n", ufep);
3670 s->pict_type = get_bits(&s->gb, 3) + I_TYPE;
3671 dprintf("pict_type: %d\n", s->pict_type);
3672 if (s->pict_type != I_TYPE &&
3673 s->pict_type != P_TYPE)
3675 skip_bits(&s->gb, 2);
3676 s->no_rounding = get_bits1(&s->gb);
3677 dprintf("RTYPE: %d\n", s->no_rounding);
3678 skip_bits(&s->gb, 4);
3680 /* Get the picture dimensions */
3683 /* Custom Picture Format (CPFMT) */
3684 s->aspect_ratio_info = get_bits(&s->gb, 4);
3685 dprintf("aspect: %d\n", s->aspect_ratio_info);
3690 3 - 10:11 (525-type 4:3)
3691 4 - 16:11 (CIF 16:9)
3692 5 - 40:33 (525-type 16:9)
3695 width = (get_bits(&s->gb, 9) + 1) * 4;
3697 height = get_bits(&s->gb, 9) * 4;
3698 dprintf("\nH.263+ Custom picture: %dx%d\n",width,height);
3699 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
3700 /* aspected dimensions */
3701 s->aspected_width = get_bits(&s->gb, 8);
3702 s->aspected_height = get_bits(&s->gb, 8);
3705 width = h263_format[format][0];
3706 height = h263_format[format][1];
3708 if ((width == 0) || (height == 0))
3712 if (s->umvplus_dec) {
3713 skip_bits1(&s->gb); /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
3717 s->qscale = get_bits(&s->gb, 5);
3720 while (get_bits1(&s->gb) != 0) {
3721 skip_bits(&s->gb, 8);
3726 s->y_dc_scale_table=
3727 s->c_dc_scale_table= h263_aic_dc_scale_table;
3729 s->y_dc_scale_table=
3730 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
3736 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s)
3739 int a= 2<<s->sprite_warping_accuracy;
3740 int rho= 3-s->sprite_warping_accuracy;
3742 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
3743 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
3744 int sprite_ref[4][2];
3745 int virtual_ref[2][2];
3747 int alpha=0, beta=0;
3750 //printf("SP %d\n", s->sprite_warping_accuracy);
3751 for(i=0; i<s->num_sprite_warping_points; i++){
3755 length= get_vlc(&s->gb, &sprite_trajectory);
3757 x= get_bits(&s->gb, length);
3758 //printf("lx %d %d\n", length, x);
3759 if ((x >> (length - 1)) == 0) /* if MSB not set it is negative*/
3760 x = - (x ^ ((1 << length) - 1));
3762 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(&s->gb); /* marker bit */
3764 length= get_vlc(&s->gb, &sprite_trajectory);
3766 y=get_bits(&s->gb, length);
3767 //printf("ly %d %d\n", length, y);
3768 if ((y >> (length - 1)) == 0) /* if MSB not set it is negative*/
3769 y = - (y ^ ((1 << length) - 1));
3771 skip_bits1(&s->gb); /* marker bit */
3772 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
3773 //if(i>0 && (x!=0 || y!=0)) printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n");
3779 while((1<<alpha)<w) alpha++;
3780 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
3784 // Note, the 4th point isnt used for GMC
3785 if(s->divx_version==500 && s->divx_build==413){
3786 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
3787 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
3788 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
3789 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
3790 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
3791 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
3793 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
3794 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
3795 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
3796 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
3797 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
3798 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
3800 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
3801 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
3803 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
3804 // perhaps it should be reordered to be more readable ...
3805 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
3806 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
3807 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
3808 + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + w2*(r*sprite_ref[1][0] - 16*vop_ref[1][0])),w);
3809 virtual_ref[0][1]= 16*vop_ref[0][1]
3810 + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + w2*(r*sprite_ref[1][1] - 16*vop_ref[1][1])),w);
3811 virtual_ref[1][0]= 16*vop_ref[0][0]
3812 + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + h2*(r*sprite_ref[2][0] - 16*vop_ref[2][0])),h);
3813 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
3814 + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + h2*(r*sprite_ref[2][1] - 16*vop_ref[2][1])),h);
3816 switch(s->num_sprite_warping_points)
3819 s->sprite_offset[0][0]= 0;
3820 s->sprite_offset[0][1]= 0;
3821 s->sprite_offset[1][0]= 0;
3822 s->sprite_offset[1][1]= 0;
3823 s->sprite_delta[0][0][0]= a;
3824 s->sprite_delta[0][0][1]= 0;
3825 s->sprite_delta[0][1][0]= 0;
3826 s->sprite_delta[0][1][1]= a;
3827 s->sprite_delta[1][0][0]= a;
3828 s->sprite_delta[1][0][1]= 0;
3829 s->sprite_delta[1][1][0]= 0;
3830 s->sprite_delta[1][1][1]= a;
3831 s->sprite_shift[0][0]= 0;
3832 s->sprite_shift[0][1]= 0;
3833 s->sprite_shift[1][0]= 0;
3834 s->sprite_shift[1][1]= 0;
3837 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
3838 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
3839 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
3840 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
3841 s->sprite_delta[0][0][0]= a;
3842 s->sprite_delta[0][0][1]= 0;
3843 s->sprite_delta[0][1][0]= 0;
3844 s->sprite_delta[0][1][1]= a;
3845 s->sprite_delta[1][0][0]= a;
3846 s->sprite_delta[1][0][1]= 0;
3847 s->sprite_delta[1][1][0]= 0;
3848 s->sprite_delta[1][1][1]= a;
3849 s->sprite_shift[0][0]= 0;
3850 s->sprite_shift[0][1]= 0;
3851 s->sprite_shift[1][0]= 0;
3852 s->sprite_shift[1][1]= 0;
3856 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
3857 + ((-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
3858 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1]));
3859 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
3860 + ((-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
3861 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1]));
3862 s->sprite_offset[1][0]= ((-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
3863 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
3864 +2*w2*r*sprite_ref[0][0] - 16*w2);
3865 s->sprite_offset[1][1]= ((-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
3866 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
3867 +2*w2*r*sprite_ref[0][1] - 16*w2);
3868 s->sprite_delta[0][0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
3869 s->sprite_delta[0][0][1]= ( r*sprite_ref[0][1] - virtual_ref[0][1]);
3870 s->sprite_delta[0][1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
3871 s->sprite_delta[0][1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
3872 s->sprite_delta[1][0][0]= 4*(-r*sprite_ref[0][0] + virtual_ref[0][0]);
3873 s->sprite_delta[1][0][1]= 4*( r*sprite_ref[0][1] - virtual_ref[0][1]);
3874 s->sprite_delta[1][1][0]= 4*(-r*sprite_ref[0][1] + virtual_ref[0][1]);
3875 s->sprite_delta[1][1][1]= 4*(-r*sprite_ref[0][0] + virtual_ref[0][0]);
3876 s->sprite_shift[0][0]= alpha+rho;
3877 s->sprite_shift[0][1]= alpha+rho;
3878 s->sprite_shift[1][0]= alpha+rho+2;
3879 s->sprite_shift[1][1]= alpha+rho+2;
3884 /*printf("%d %d\n", s->sprite_delta[0][0][0], a<<s->sprite_shift[0][0]);
3885 printf("%d %d\n", s->sprite_delta[0][0][1], 0);
3886 printf("%d %d\n", s->sprite_delta[0][1][0], 0);
3887 printf("%d %d\n", s->sprite_delta[0][1][1], a<<s->sprite_shift[0][1]);
3888 printf("%d %d\n", s->sprite_delta[1][0][0], a<<s->sprite_shift[1][0]);
3889 printf("%d %d\n", s->sprite_delta[1][0][1], 0);
3890 printf("%d %d\n", s->sprite_delta[1][1][0], 0);
3891 printf("%d %d\n", s->sprite_delta[1][1][1], a<<s->sprite_shift[1][1]);*/
3892 /* try to simplify the situation */
3893 if( s->sprite_delta[0][0][0] == a<<s->sprite_shift[0][0]
3894 && s->sprite_delta[0][0][1] == 0
3895 && s->sprite_delta[0][1][0] == 0
3896 && s->sprite_delta[0][1][1] == a<<s->sprite_shift[0][1]
3897 && s->sprite_delta[1][0][0] == a<<s->sprite_shift[1][0]
3898 && s->sprite_delta[1][0][1] == 0
3899 && s->sprite_delta[1][1][0] == 0
3900 && s->sprite_delta[1][1][1] == a<<s->sprite_shift[1][1])
3902 s->sprite_offset[0][0]>>=s->sprite_shift[0][0];
3903 s->sprite_offset[0][1]>>=s->sprite_shift[0][1];
3904 s->sprite_offset[1][0]>>=s->sprite_shift[1][0];
3905 s->sprite_offset[1][1]>>=s->sprite_shift[1][1];
3906 s->sprite_delta[0][0][0]= a;
3907 s->sprite_delta[0][0][1]= 0;
3908 s->sprite_delta[0][1][0]= 0;
3909 s->sprite_delta[0][1][1]= a;
3910 s->sprite_delta[1][0][0]= a;
3911 s->sprite_delta[1][0][1]= 0;
3912 s->sprite_delta[1][1][0]= 0;
3913 s->sprite_delta[1][1][1]= a;
3914 s->sprite_shift[0][0]= 0;
3915 s->sprite_shift[0][1]= 0;
3916 s->sprite_shift[1][0]= 0;
3917 s->sprite_shift[1][1]= 0;
3918 s->real_sprite_warping_points=1;
3921 s->real_sprite_warping_points= s->num_sprite_warping_points;
3923 //printf("%d %d %d %d\n", d[0][0], d[0][1], s->sprite_offset[0][0], s->sprite_offset[0][1]);
3926 /* decode mpeg4 VOP header */
3927 int mpeg4_decode_picture_header(MpegEncContext * s)
3929 int time_incr, startcode, state, v;
3933 /* search next start code */
3934 align_get_bits(&s->gb);
3937 v = get_bits(&s->gb, 8);
3938 if (state == 0x000001) {
3939 state = ((state << 8) | v) & 0xffffff;
3943 state = ((state << 8) | v) & 0xffffff;
3944 if( get_bits_count(&s->gb) > s->gb.size*8-32){
3946 printf("no VOP startcode found, frame size was=%d\n", s->gb.size);
3949 printf("frame skip\n");
3950 return FRAME_SKIPED;
3954 //printf("startcode %X %d\n", startcode, get_bits_count(&s->gb));
3955 if (startcode == 0x120) { // Video Object Layer
3956 int width, height, vo_ver_id;
3959 skip_bits(&s->gb, 1); /* random access */
3960 s->vo_type= get_bits(&s->gb, 8);
3961 if (get_bits1(&s->gb) != 0) { /* is_ol_id */
3962 vo_ver_id = get_bits(&s->gb, 4); /* vo_ver_id */
3963 skip_bits(&s->gb, 3); /* vo_priority */
3967 //printf("vo type:%d\n",s->vo_type);
3968 s->aspect_ratio_info= get_bits(&s->gb, 4);
3969 if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
3970 s->aspected_width = get_bits(&s->gb, 8); // par_width
3971 s->aspected_height = get_bits(&s->gb, 8); // par_height
3974 if ((s->vol_control_parameters=get_bits1(&s->gb))) { /* vol control parameter */
3975 int chroma_format= get_bits(&s->gb, 2);
3976 if(chroma_format!=1){
3977 printf("illegal chroma format\n");
3979 s->low_delay= get_bits1(&s->gb);
3980 if(get_bits1(&s->gb)){ /* vbv parameters */
3981 get_bits(&s->gb, 15); /* first_half_bitrate */
3982 skip_bits1(&s->gb); /* marker */
3983 get_bits(&s->gb, 15); /* latter_half_bitrate */
3984 skip_bits1(&s->gb); /* marker */
3985 get_bits(&s->gb, 15); /* first_half_vbv_buffer_size */
3986 skip_bits1(&s->gb); /* marker */
3987 get_bits(&s->gb, 3); /* latter_half_vbv_buffer_size */
3988 get_bits(&s->gb, 11); /* first_half_vbv_occupancy */
3989 skip_bits1(&s->gb); /* marker */
3990 get_bits(&s->gb, 15); /* latter_half_vbv_occupancy */
3991 skip_bits1(&s->gb); /* marker */
3994 // set low delay flag only once so the smart? low delay detection wont be overriden
3995 if(s->picture_number==0)
3999 s->shape = get_bits(&s->gb, 2); /* vol shape */
4000 if(s->shape != RECT_SHAPE) printf("only rectangular vol supported\n");
4001 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
4002 printf("Gray shape not supported\n");
4003 skip_bits(&s->gb, 4); //video_object_layer_shape_extension
4006 skip_bits1(&s->gb); /* marker */
4008 s->time_increment_resolution = get_bits(&s->gb, 16);
4010 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
4011 if (s->time_increment_bits < 1)
4012 s->time_increment_bits = 1;
4013 skip_bits1(&s->gb); /* marker */
4015 if (get_bits1(&s->gb) != 0) { /* fixed_vop_rate */
4016 skip_bits(&s->gb, s->time_increment_bits);
4019 if (s->shape != BIN_ONLY_SHAPE) {
4020 if (s->shape == RECT_SHAPE) {
4021 skip_bits1(&s->gb); /* marker */
4022 width = get_bits(&s->gb, 13);
4023 skip_bits1(&s->gb); /* marker */
4024 height = get_bits(&s->gb, 13);
4025 skip_bits1(&s->gb); /* marker */
4026 if(width && height){ /* they should be non zero but who knows ... */
4029 // printf("width/height: %d %d\n", width, height);
4033 s->progressive_sequence= get_bits1(&s->gb)^1;
4034 if(!get_bits1(&s->gb)) printf("OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */
4035 if (vo_ver_id == 1) {
4036 s->vol_sprite_usage = get_bits1(&s->gb); /* vol_sprite_usage */
4038 s->vol_sprite_usage = get_bits(&s->gb, 2); /* vol_sprite_usage */
4040 if(s->vol_sprite_usage==STATIC_SPRITE) printf("Static Sprites not supported\n");
4041 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
4042 if(s->vol_sprite_usage==STATIC_SPRITE){
4043 s->sprite_width = get_bits(&s->gb, 13);
4044 skip_bits1(&s->gb); /* marker */
4045 s->sprite_height= get_bits(&s->gb, 13);
4046 skip_bits1(&s->gb); /* marker */
4047 s->sprite_left = get_bits(&s->gb, 13);
4048 skip_bits1(&s->gb); /* marker */
4049 s->sprite_top = get_bits(&s->gb, 13);
4050 skip_bits1(&s->gb); /* marker */
4052 s->num_sprite_warping_points= get_bits(&s->gb, 6);
4053 s->sprite_warping_accuracy = get_bits(&s->gb, 2);
4054 s->sprite_brightness_change= get_bits1(&s->gb);
4055 if(s->vol_sprite_usage==STATIC_SPRITE)
4056 s->low_latency_sprite= get_bits1(&s->gb);
4058 // FIXME sadct disable bit if verid!=1 && shape not rect
4060 if (get_bits1(&s->gb) == 1) { /* not_8_bit */
4061 s->quant_precision = get_bits(&s->gb, 4); /* quant_precision */
4062 if(get_bits(&s->gb, 4)!=8) printf("N-bit not supported\n"); /* bits_per_pixel */
4063 if(s->quant_precision!=5) printf("quant precission %d\n", s->quant_precision);
4065 s->quant_precision = 5;
4068 // FIXME a bunch of grayscale shape things
4070 if((s->mpeg_quant=get_bits1(&s->gb))){ /* vol_quant_type */
4073 /* load default matrixes */
4074 for(i=0; i<64; i++){
4075 v= ff_mpeg4_default_intra_matrix[i];
4076 s->intra_matrix[i]= v;
4077 s->chroma_intra_matrix[i]= v;
4079 v= ff_mpeg4_default_non_intra_matrix[i];
4080 s->inter_matrix[i]= v;
4081 s->chroma_inter_matrix[i]= v;
4084 /* load custom intra matrix */
4085 if(get_bits1(&s->gb)){
4086 for(i=0; i<64; i++){
4087 v= get_bits(&s->gb, 8);
4090 j= zigzag_direct[i];
4091 s->intra_matrix[j]= v;
4092 s->chroma_intra_matrix[j]= v;
4096 /* load custom non intra matrix */
4097 if(get_bits1(&s->gb)){
4098 for(i=0; i<64; i++){
4099 v= get_bits(&s->gb, 8);
4102 j= zigzag_direct[i];
4103 s->inter_matrix[j]= v;
4104 s->chroma_inter_matrix[j]= v;
4107 /* replicate last value */
4109 j= zigzag_direct[i];
4110 s->inter_matrix[j]= v;
4111 s->chroma_inter_matrix[j]= v;
4115 // FIXME a bunch of grayscale shape things
4119 s->quarter_sample= get_bits1(&s->gb);
4120 else s->quarter_sample=0;
4122 if(!get_bits1(&s->gb)) printf("Complexity estimation not supported\n");
4124 s->resync_marker= !get_bits1(&s->gb); /* resync_marker_disabled */
4126 s->data_partitioning= get_bits1(&s->gb);
4127 if(s->data_partitioning){
4128 s->rvlc= get_bits1(&s->gb);
4130 printf("reversible vlc not supported\n");
4134 if(vo_ver_id != 1) {
4135 s->new_pred= get_bits1(&s->gb);
4137 printf("new pred not supported\n");
4138 skip_bits(&s->gb, 2); /* requested upstream message type */
4139 skip_bits1(&s->gb); /* newpred segment type */
4141 s->reduced_res_vop= get_bits1(&s->gb);
4142 if(s->reduced_res_vop) printf("reduced resolution VOP not supported\n");
4146 s->reduced_res_vop= 0;
4149 s->scalability= get_bits1(&s->gb);
4151 if (s->scalability) {
4152 GetBitContext bak= s->gb;
4153 int dummy= s->hierachy_type= get_bits1(&s->gb);
4154 int ref_layer_id= get_bits(&s->gb, 4);
4155 int ref_layer_sampling_dir= get_bits1(&s->gb);
4156 int h_sampling_factor_n= get_bits(&s->gb, 5);
4157 int h_sampling_factor_m= get_bits(&s->gb, 5);
4158 int v_sampling_factor_n= get_bits(&s->gb, 5);
4159 int v_sampling_factor_m= get_bits(&s->gb, 5);
4160 s->enhancement_type= get_bits1(&s->gb);
4162 if( h_sampling_factor_n==0 || h_sampling_factor_m==0
4163 || v_sampling_factor_n==0 || v_sampling_factor_m==0 || s->workaround_bugs==1){
4165 // fprintf(stderr, "illegal scalability header (VERY broken encoder), trying to workaround\n");
4172 // bin shape stuff FIXME
4173 printf("scalability not supported\n");
4176 //printf("end Data %X %d\n", show_bits(&s->gb, 32), get_bits_count(&s->gb)&0x7);
4178 } else if (startcode == 0x1b2) { //userdata
4184 //printf("user Data %X\n", show_bits(&s->gb, 32));
4185 buf[0]= show_bits(&s->gb, 8);
4186 for(i=1; i<256; i++){
4187 buf[i]= show_bits(&s->gb, 16)&0xFF;
4188 if(buf[i]==0) break;
4189 skip_bits(&s->gb, 8);
4192 e=sscanf(buf, "DivX%dBuild%d", &ver, &build);
4194 e=sscanf(buf, "DivX%db%d", &ver, &build);
4196 s->divx_version= ver;
4197 s->divx_build= build;
4198 if(s->picture_number==0){
4199 printf("This file was encoded with DivX%d Build%d\n", ver, build);
4200 if(ver==500 && build==413){
4201 printf("WARNING: this version of DivX is not MPEG4 compatible, trying to workaround these bugs...\n");
4205 //printf("User Data: %s\n", buf);
4207 } else if (startcode != 0x1b6) { //VOP
4211 s->pict_type = get_bits(&s->gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */
4212 //if(s->pict_type!=I_TYPE) return FRAME_SKIPED;
4213 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0){
4214 printf("low_delay flag set, but shouldnt, clearing it\n");
4217 // printf("pic: %d, qpel:%d part:%d resync:%d\n", s->pict_type, s->quarter_sample, s->data_partitioning, s->resync_marker);
4219 if(s->time_increment_resolution==0){
4220 s->time_increment_resolution=1;
4221 // fprintf(stderr, "time_increment_resolution is illegal\n");
4224 while (get_bits1(&s->gb) != 0)
4227 check_marker(&s->gb, "before time_increment");
4228 time_increment= get_bits(&s->gb, s->time_increment_bits);
4229 //printf(" type:%d modulo_time_base:%d increment:%d\n", s->pict_type, time_incr, time_increment);
4230 if(s->pict_type!=B_TYPE){
4231 s->last_time_base= s->time_base;
4232 s->time_base+= time_incr;
4233 s->time= s->time_base*s->time_increment_resolution + time_increment;
4234 if(s->workaround_bugs==3 || s->avctx->fourcc== 'U' + ('M'<<8) + ('P'<<16) + ('4'<<24)){
4235 if(s->time < s->last_non_b_time){
4236 // fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaround\n");
4238 s->time+= s->time_increment_resolution;
4241 s->pp_time= s->time - s->last_non_b_time;
4242 s->last_non_b_time= s->time;
4244 s->time= (s->last_time_base + time_incr)*s->time_increment_resolution + time_increment;
4245 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
4246 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
4247 // printf("messed up order, seeking?, skiping current b frame\n");
4248 return FRAME_SKIPED;
4251 if(s->t_frame==0) s->t_frame= s->time - s->last_time_base;
4252 if(s->t_frame==0) s->t_frame=1; // 1/0 protection
4253 //printf("%Ld %Ld %d %d\n", s->last_non_b_time, s->time, s->pp_time, s->t_frame); fflush(stdout);
4254 s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame)
4255 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
4256 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame)
4257 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
4260 s->avctx->pts= s->time*1000LL*1000LL / s->time_increment_resolution;
4262 if(check_marker(&s->gb, "before vop_coded")==0 && s->picture_number==0){
4263 printf("hmm, seems the headers arnt complete, trying to guess time_increment_bits\n");
4264 for(s->time_increment_bits++ ;s->time_increment_bits<16; s->time_increment_bits++){
4265 if(get_bits1(&s->gb)) break;
4267 printf("my guess is %d bits ;)\n",s->time_increment_bits);
4270 if (get_bits1(&s->gb) != 1)
4272 //printf("time %d %d %d || %Ld %Ld %Ld\n", s->time_increment_bits, s->time_increment_resolution, s->time_base,
4273 //s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time);
4274 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE
4275 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
4276 /* rounding type for motion estimation */
4277 s->no_rounding = get_bits1(&s->gb);
4281 //FIXME reduced res stuff
4283 if (s->shape != RECT_SHAPE) {
4284 if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) {
4285 int width, height, hor_spat_ref, ver_spat_ref;
4287 width = get_bits(&s->gb, 13);
4288 skip_bits1(&s->gb); /* marker */
4289 height = get_bits(&s->gb, 13);
4290 skip_bits1(&s->gb); /* marker */
4291 hor_spat_ref = get_bits(&s->gb, 13); /* hor_spat_ref */
4292 skip_bits1(&s->gb); /* marker */
4293 ver_spat_ref = get_bits(&s->gb, 13); /* ver_spat_ref */
4295 skip_bits1(&s->gb); /* change_CR_disable */
4297 if (get_bits1(&s->gb) != 0) {
4298 skip_bits(&s->gb, 8); /* constant_alpha_value */
4301 //FIXME complexity estimation stuff
4303 if (s->shape != BIN_ONLY_SHAPE) {
4305 t=get_bits(&s->gb, 3); /* intra dc VLC threshold */
4306 //printf("threshold %d\n", t);
4307 if(!s->progressive_sequence){
4308 s->top_field_first= get_bits1(&s->gb);
4309 s->alternate_scan= get_bits1(&s->gb);
4311 s->alternate_scan= 0;
4314 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
4315 if(s->num_sprite_warping_points){
4316 mpeg4_decode_sprite_trajectory(s);
4318 if(s->sprite_brightness_change) printf("sprite_brightness_change not supported\n");
4319 if(s->vol_sprite_usage==STATIC_SPRITE) printf("static sprite not supported\n");
4322 if (s->shape != BIN_ONLY_SHAPE) {
4323 /* note: we do not use quant_precision to avoid problem if no
4324 MPEG4 vol header as it is found on some old opendivx
4326 s->qscale = get_bits(&s->gb, 5);
4328 printf("Error, header damaged or not MPEG4 header (qscale=0)\n");
4329 return -1; // makes no sense to continue, as there is nothing left from the image then
4332 if (s->pict_type != I_TYPE) {
4333 s->f_code = get_bits(&s->gb, 3); /* fcode_for */
4335 printf("Error, header damaged or not MPEG4 header (f_code=0)\n");
4336 return -1; // makes no sense to continue, as the MV decoding will break very quickly
4341 if (s->pict_type == B_TYPE) {
4342 s->b_code = get_bits(&s->gb, 3);
4346 printf("qp:%d fc:%d bc:%d type:%s size:%d pro:%d alt:%d top:%d qpel:%d part:%d resync:%d\n",
4347 s->qscale, s->f_code, s->b_code,
4348 s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")),
4349 s->gb.size,s->progressive_sequence, s->alternate_scan, s->top_field_first,
4350 s->quarter_sample, s->data_partitioning, s->resync_marker);
4352 if(!s->scalability){
4353 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {
4354 skip_bits1(&s->gb); // vop shape coding type
4357 if(s->enhancement_type){
4358 int load_backward_shape= get_bits1(&s->gb);
4359 if(load_backward_shape){
4360 printf("load backward shape isnt supported\n");
4363 skip_bits(&s->gb, 2); //ref_select_code
4366 /* detect buggy encoders which dont set the low_delay flag (divx4/xvid/opendivx)*/
4367 // note we cannot detect divx5 without b-frames easyly (allthough its buggy too)
4368 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
4369 printf("looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
4373 s->picture_number++; // better than pic number==0 allways ;)
4375 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
4376 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
4378 if(s->divx_version==0 || s->divx_version < 500){
4379 s->h_edge_pos= s->width;
4380 s->v_edge_pos= s->height;
4385 /* don't understand why they choose a different header ! */
4386 int intel_h263_decode_picture_header(MpegEncContext *s)
4390 /* picture header */
4391 if (get_bits(&s->gb, 22) != 0x20) {
4392 fprintf(stderr, "Bad picture start code\n");
4395 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
4397 if (get_bits1(&s->gb) != 1) {
4398 fprintf(stderr, "Bad marker\n");
4399 return -1; /* marker */
4401 if (get_bits1(&s->gb) != 0) {
4402 fprintf(stderr, "Bad H263 id\n");
4403 return -1; /* h263 id */
4405 skip_bits1(&s->gb); /* split screen off */
4406 skip_bits1(&s->gb); /* camera off */
4407 skip_bits1(&s->gb); /* freeze picture release off */
4409 format = get_bits(&s->gb, 3);
4411 fprintf(stderr, "Intel H263 free format not supported\n");
4416 s->pict_type = I_TYPE + get_bits1(&s->gb);
4418 s->unrestricted_mv = get_bits1(&s->gb);
4419 s->h263_long_vectors = s->unrestricted_mv;
4421 if (get_bits1(&s->gb) != 0) {
4422 fprintf(stderr, "SAC not supported\n");
4423 return -1; /* SAC: off */
4425 if (get_bits1(&s->gb) != 0) {
4426 fprintf(stderr, "Advanced Prediction Mode not supported\n");
4427 return -1; /* advanced prediction mode: off */
4429 if (get_bits1(&s->gb) != 0) {
4430 fprintf(stderr, "PB frame mode no supported\n");
4431 return -1; /* PB frame mode */
4434 /* skip unknown header garbage */
4435 skip_bits(&s->gb, 41);
4437 s->qscale = get_bits(&s->gb, 5);
4438 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
4441 while (get_bits1(&s->gb) != 0) {
4442 skip_bits(&s->gb, 8);