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, 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 */
1098 val= (val^sign)-sign;
1103 } else if (val >= l) {
1107 assert(val>=-l && val<l);
1117 code = (val >> bit_size) + 1;
1118 bits = val & (range - 1);
1120 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1122 put_bits(&s->pb, bit_size, bits);
1127 /* Encode MV differences on H.263+ with Unrestricted MV mode */
1128 static void h263p_encode_umotion(MpegEncContext * s, int val)
1138 put_bits(&s->pb, 1, 1);
1140 put_bits(&s->pb, 3, 0);
1142 put_bits(&s->pb, 3, 2);
1145 sval = ((val < 0) ? (short)(-val):(short)val);
1148 while (temp_val != 0) {
1149 temp_val = temp_val >> 1;
1155 tcode = (sval & (1 << (i-1))) >> (i-1);
1156 tcode = (tcode << 1) | 1;
1157 code = (code << 2) | tcode;
1160 code = ((code << 1) | (val < 0)) << 1;
1161 put_bits(&s->pb, (2*n_bits)+1, code);
1162 //printf("\nVal = %d\tCode = %d", sval, code);
1166 static void init_mv_penalty_and_fcode(MpegEncContext *s)
1170 for(f_code=1; f_code<=MAX_FCODE; f_code++){
1171 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
1174 if(mv==0) len= mvtab[0][1];
1176 int val, bit_size, range, code;
1178 bit_size = s->f_code - 1;
1179 range = 1 << bit_size;
1185 code = (val >> bit_size) + 1;
1187 len= mvtab[code][1] + 1 + bit_size;
1189 len= mvtab[32][1] + 2 + bit_size;
1193 mv_penalty[f_code][mv+MAX_MV]= len;
1197 for(f_code=MAX_FCODE; f_code>0; f_code--){
1198 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
1199 fcode_tab[mv+MAX_MV]= f_code;
1203 for(mv=0; mv<MAX_MV*2+1; mv++){
1204 umv_fcode_tab[mv]= 1;
1208 static void init_uni_dc_tab(void)
1210 int level, uni_code, uni_len;
1212 for(level=-256; level<256; level++){
1214 /* find number of bits */
1223 l= (-level) ^ ((1 << size) - 1);
1228 uni_code= DCtab_lum[size][0];
1229 uni_len = DCtab_lum[size][1];
1232 uni_code<<=size; uni_code|=l;
1235 uni_code<<=1; uni_code|=1;
1239 uni_DCtab_lum[level+256][0]= uni_code;
1240 uni_DCtab_lum[level+256][1]= uni_len;
1243 uni_code= DCtab_chrom[size][0];
1244 uni_len = DCtab_chrom[size][1];
1247 uni_code<<=size; uni_code|=l;
1250 uni_code<<=1; uni_code|=1;
1254 uni_DCtab_chrom[level+256][0]= uni_code;
1255 uni_DCtab_chrom[level+256][1]= uni_len;
1260 static void init_uni_mpeg4_rl_tab(RLTable *rl, UINT32 *bits_tab, UINT8 *len_tab){
1261 int slevel, run, last;
1263 assert(MAX_LEVEL >= 64);
1264 assert(MAX_RUN >= 63);
1266 for(slevel=-64; slevel<64; slevel++){
1267 if(slevel==0) continue;
1268 for(run=0; run<64; run++){
1269 for(last=0; last<=1; last++){
1270 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1271 int level= slevel < 0 ? -slevel : slevel;
1272 int sign= slevel < 0 ? 1 : 0;
1273 int bits, len, code;
1276 len_tab[index]= 100;
1279 code= get_rl_index(rl, last, run, level);
1280 bits= rl->table_vlc[code][0];
1281 len= rl->table_vlc[code][1];
1282 bits=bits*2+sign; len++;
1284 if(code!=rl->n && len < len_tab[index]){
1285 bits_tab[index]= bits;
1286 len_tab [index]= len;
1290 bits= rl->table_vlc[rl->n][0];
1291 len= rl->table_vlc[rl->n][1];
1292 bits=bits*2; len++; //esc1
1293 level1= level - rl->max_level[last][run];
1295 code= get_rl_index(rl, last, run, level1);
1296 bits<<= rl->table_vlc[code][1];
1297 len += rl->table_vlc[code][1];
1298 bits += rl->table_vlc[code][0];
1299 bits=bits*2+sign; len++;
1301 if(code!=rl->n && len < len_tab[index]){
1302 bits_tab[index]= bits;
1303 len_tab [index]= len;
1309 bits= rl->table_vlc[rl->n][0];
1310 len= rl->table_vlc[rl->n][1];
1311 bits=bits*4+2; len+=2; //esc2
1312 run1 = run - rl->max_run[last][level] - 1;
1314 code= get_rl_index(rl, last, run1, level);
1315 bits<<= rl->table_vlc[code][1];
1316 len += rl->table_vlc[code][1];
1317 bits += rl->table_vlc[code][0];
1318 bits=bits*2+sign; len++;
1320 if(code!=rl->n && len < len_tab[index]){
1321 bits_tab[index]= bits;
1322 len_tab [index]= len;
1327 bits= rl->table_vlc[rl->n][0];
1328 len = rl->table_vlc[rl->n][1];
1329 bits=bits*4+3; len+=2; //esc3
1330 bits=bits*2+last; len++;
1331 bits=bits*64+run; len+=6;
1332 bits=bits*2+1; len++; //marker
1333 bits=bits*4096+(slevel&0xfff); len+=12;
1334 bits=bits*2+1; len++; //marker
1336 if(len < len_tab[index]){
1337 bits_tab[index]= bits;
1338 len_tab [index]= len;
1345 void h263_encode_init(MpegEncContext *s)
1347 static int done = 0;
1356 init_rl(&rl_intra_aic);
1358 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
1359 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
1361 init_mv_penalty_and_fcode(s);
1363 s->mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
1365 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
1366 switch(s->codec_id){
1367 case CODEC_ID_MPEG4:
1368 s->fcode_tab= fcode_tab;
1369 s->min_qcoeff= -2048;
1370 s->max_qcoeff= 2047;
1372 case CODEC_ID_H263P:
1373 s->fcode_tab= umv_fcode_tab;
1374 s->min_qcoeff= -128;
1377 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
1378 default: //nothing needed default table allready set in mpegvideo.c
1379 s->min_qcoeff= -128;
1381 s->y_dc_scale_table=
1382 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
1386 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
1387 s->inter_quant_bias= 0;
1389 s->intra_quant_bias=0;
1390 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
1394 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
1396 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
1400 if (s->mb_intra && !s->h263_aic) {
1403 /* 255 cannot be represented, so we clamp */
1408 /* 0 cannot be represented also */
1414 put_bits(&s->pb, 8, 0xff);
1416 put_bits(&s->pb, 8, level & 0xff);
1420 if (s->h263_aic && s->mb_intra)
1425 last_index = s->block_last_index[n];
1426 last_non_zero = i - 1;
1427 for (; i <= last_index; i++) {
1428 j = zigzag_direct[i];
1431 run = i - last_non_zero - 1;
1432 last = (i == last_index);
1439 code = get_rl_index(rl, last, run, level);
1440 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1441 if (code == rl->n) {
1442 put_bits(&s->pb, 1, last);
1443 put_bits(&s->pb, 6, run);
1444 put_bits(&s->pb, 8, slevel & 0xff);
1446 put_bits(&s->pb, 1, sign);
1453 /***************************************************/
1455 void ff_mpeg4_stuffing(PutBitContext * pbc)
1458 put_bits(pbc, 1, 0);
1459 length= (-get_bit_count(pbc))&7;
1460 if(length) put_bits(pbc, length, (1<<length)-1);
1463 /* must be called before writing the header */
1464 void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){
1465 int time_div, time_mod;
1467 if(s->pict_type==I_TYPE){ //we will encode a vol header
1468 s->time_increment_resolution= s->frame_rate/ff_gcd(s->frame_rate, FRAME_RATE_BASE);
1469 if(s->time_increment_resolution>=256*256) s->time_increment_resolution= 256*128;
1471 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
1475 s->time= (s->avctx->pts*s->time_increment_resolution + 500*1000)/(1000*1000);
1477 s->time= picture_number*(INT64)FRAME_RATE_BASE*s->time_increment_resolution/s->frame_rate;
1478 time_div= s->time/s->time_increment_resolution;
1479 time_mod= s->time%s->time_increment_resolution;
1481 if(s->pict_type==B_TYPE){
1482 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
1484 s->last_time_base= s->time_base;
1485 s->time_base= time_div;
1486 s->pp_time= s->time - s->last_non_b_time;
1487 s->last_non_b_time= s->time;
1491 static void mpeg4_encode_vol_header(MpegEncContext * s)
1493 int vo_ver_id=1; //must be 2 if we want GMC or q-pel
1496 s->vo_type= s->has_b_frames ? CORE_VO_TYPE : SIMPLE_VO_TYPE;
1498 put_bits(&s->pb, 16, 0);
1499 put_bits(&s->pb, 16, 0x100); /* video obj */
1500 put_bits(&s->pb, 16, 0);
1501 put_bits(&s->pb, 16, 0x120); /* video obj layer */
1503 put_bits(&s->pb, 1, 0); /* random access vol */
1504 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
1505 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
1506 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
1507 put_bits(&s->pb, 3, 1); /* is obj layer priority */
1508 if(s->aspect_ratio_info)
1509 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
1511 put_bits(&s->pb, 4, 1); /* aspect ratio info= sqare pixel */
1512 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED)
1514 put_bits(&s->pb, 8, s->aspected_width);
1515 put_bits(&s->pb, 8, s->aspected_height);
1519 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
1520 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
1521 put_bits(&s->pb, 1, s->low_delay);
1522 put_bits(&s->pb, 1, 0); /* vbv parameters= no */
1524 put_bits(&s->pb, 1, 0); /* vol control parameters= no */
1527 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
1528 put_bits(&s->pb, 1, 1); /* marker bit */
1530 put_bits(&s->pb, 16, s->time_increment_resolution);
1531 if (s->time_increment_bits < 1)
1532 s->time_increment_bits = 1;
1533 put_bits(&s->pb, 1, 1); /* marker bit */
1534 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
1535 put_bits(&s->pb, 1, 1); /* marker bit */
1536 put_bits(&s->pb, 13, s->width); /* vol width */
1537 put_bits(&s->pb, 1, 1); /* marker bit */
1538 put_bits(&s->pb, 13, s->height); /* vol height */
1539 put_bits(&s->pb, 1, 1); /* marker bit */
1540 put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
1541 put_bits(&s->pb, 1, 1); /* obmc disable */
1542 if (vo_ver_id == 1) {
1543 put_bits(&s->pb, 1, s->vol_sprite_usage=0); /* sprite enable */
1544 }else{ /* vo_ver_id == 2 */
1545 put_bits(&s->pb, 2, s->vol_sprite_usage=0); /* sprite enable */
1547 put_bits(&s->pb, 1, 0); /* not 8 bit */
1548 put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
1549 if(s->mpeg_quant) put_bits(&s->pb, 2, 0); /* no custom matrixes */
1552 put_bits(&s->pb, 1, s->quarter_sample=0);
1553 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
1554 s->resync_marker= s->rtp_mode;
1555 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
1556 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
1557 if(s->data_partitioning){
1558 put_bits(&s->pb, 1, 0); /* no rvlc */
1561 if (vo_ver_id != 1){
1562 put_bits(&s->pb, 1, 0); /* newpred */
1563 put_bits(&s->pb, 1, 0); /* reduced res vop */
1565 put_bits(&s->pb, 1, 0); /* scalability */
1567 ff_mpeg4_stuffing(&s->pb);
1571 put_bits(&s->pb, 16, 0);
1572 put_bits(&s->pb, 16, 0x1B2); /* user_data */
1573 sprintf(buf, "FFmpeg%sb%s", FFMPEG_VERSION, LIBAVCODEC_BUILD_STR);
1574 put_string(&s->pb, buf);
1575 ff_mpeg4_stuffing(&s->pb);
1579 /* write mpeg4 VOP header */
1580 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
1583 int time_div, time_mod;
1585 if(s->pict_type==I_TYPE){
1587 if(picture_number==0 || !s->strict_std_compliance)
1588 mpeg4_encode_vol_header(s);
1591 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->frame_rate, FRAME_RATE_BASE);
1593 put_bits(&s->pb, 16, 0); /* vop header */
1594 put_bits(&s->pb, 16, 0x1B6); /* vop header */
1595 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
1597 time_div= s->time/s->time_increment_resolution;
1598 time_mod= s->time%s->time_increment_resolution;
1599 time_incr= time_div - s->last_time_base;
1601 put_bits(&s->pb, 1, 1);
1603 put_bits(&s->pb, 1, 0);
1605 put_bits(&s->pb, 1, 1); /* marker */
1606 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
1607 put_bits(&s->pb, 1, 1); /* marker */
1608 put_bits(&s->pb, 1, 1); /* vop coded */
1609 if ( s->pict_type == P_TYPE
1610 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
1611 s->no_rounding ^= 1;
1612 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
1614 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
1615 if(!s->progressive_sequence){
1616 put_bits(&s->pb, 1, s->top_field_first);
1617 put_bits(&s->pb, 1, s->alternate_scan);
1619 //FIXME sprite stuff
1621 put_bits(&s->pb, 5, s->qscale);
1623 if (s->pict_type != I_TYPE)
1624 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
1625 if (s->pict_type == B_TYPE)
1626 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
1627 // printf("****frame %d\n", picture_number);
1629 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
1630 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
1631 s->h_edge_pos= s->width;
1632 s->v_edge_pos= s->height;
1635 static void change_qscale(MpegEncContext * s, int dquant)
1637 s->qscale += dquant;
1641 else if (s->qscale > 31)
1644 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
1645 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
1648 inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr)
1650 int a, b, c, wrap, pred, scale;
1654 /* find prediction */
1656 scale = s->y_dc_scale;
1658 scale = s->c_dc_scale;
1660 wrap= s->block_wrap[n];
1661 dc_val = s->dc_val[0] + s->block_index[n];
1667 b = dc_val[ - 1 - wrap];
1668 c = dc_val[ - wrap];
1670 if (abs(a - b) < abs(b - c)) {
1672 *dir_ptr = 1; /* top */
1675 *dir_ptr = 0; /* left */
1677 /* we assume pred is positive */
1680 "xorl %%edx, %%edx \n\t"
1682 : "=d" (pred), "=a"(dummy)
1683 : "a" (pred + (scale >> 1)), "c" (inverse[scale])
1686 pred = (pred + (scale >> 1)) / scale;
1689 /* prepare address for prediction update */
1690 *dc_val_ptr = &dc_val[0];
1695 void mpeg4_pred_ac(MpegEncContext * s, INT16 *block, int n,
1699 INT16 *ac_val, *ac_val1;
1701 /* find prediction */
1702 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1706 const int xy= s->mb_x-1 + s->mb_y*s->mb_width;
1707 /* left prediction */
1710 if(s->mb_x==0 || s->qscale == s->qscale_table[xy] || n==1 || n==3){
1713 block[block_permute_op(i*8)] += ac_val[i];
1716 /* different qscale, we must rescale */
1718 block[block_permute_op(i*8)] += ROUNDED_DIV(ac_val[i]*s->qscale_table[xy], s->qscale);
1722 const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width;
1723 /* top prediction */
1724 ac_val -= 16 * s->block_wrap[n];
1726 if(s->mb_y==0 || s->qscale == s->qscale_table[xy] || n==2 || n==3){
1729 block[block_permute_op(i)] += ac_val[i + 8];
1732 /* different qscale, we must rescale */
1734 block[block_permute_op(i)] += ROUNDED_DIV(ac_val[i + 8]*s->qscale_table[xy], s->qscale);
1741 ac_val1[i] = block[block_permute_op(i * 8)];
1745 ac_val1[8 + i] = block[block_permute_op(i)];
1749 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
1755 /* find prediction */
1756 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1759 const int xy= s->mb_x-1 + s->mb_y*s->mb_width;
1760 /* left prediction */
1762 if(s->mb_x==0 || s->qscale == s->qscale_table[xy] || n==1 || n==3){
1765 block[block_permute_op(i*8)] -= ac_val[i];
1768 /* different qscale, we must rescale */
1770 block[block_permute_op(i*8)] -= ROUNDED_DIV(ac_val[i]*s->qscale_table[xy], s->qscale);
1774 const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width;
1775 /* top prediction */
1776 ac_val -= 16 * s->block_wrap[n];
1777 if(s->mb_y==0 || s->qscale == s->qscale_table[xy] || n==2 || n==3){
1780 block[block_permute_op(i)] -= ac_val[i + 8];
1783 /* different qscale, we must rescale */
1785 block[block_permute_op(i)] -= ROUNDED_DIV(ac_val[i + 8]*s->qscale_table[xy], s->qscale);
1791 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
1794 // if(level<-255 || level>255) printf("dc overflow\n");
1798 put_bits(s, uni_DCtab_lum[level][1], uni_DCtab_lum[level][0]);
1801 put_bits(s, uni_DCtab_chrom[level][1], uni_DCtab_chrom[level][0]);
1805 /* find number of bits */
1815 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
1818 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
1821 /* encode remaining bits */
1824 level = (-level) ^ ((1 << size) - 1);
1825 put_bits(&s->pb, size, level);
1827 put_bits(&s->pb, 1, 1);
1832 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
1833 UINT8 *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
1835 int last, i, last_non_zero, sign;
1840 const int last_index = s->block_last_index[n];
1842 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
1843 /* mpeg4 based DC predictor */
1844 mpeg4_encode_dc(dc_pb, intra_dc, n);
1845 if(last_index<1) return;
1848 bits_tab= uni_mpeg4_intra_rl_bits;
1849 len_tab = uni_mpeg4_intra_rl_len;
1851 if(last_index<0) return;
1854 bits_tab= uni_mpeg4_inter_rl_bits;
1855 len_tab = uni_mpeg4_inter_rl_len;
1859 last_non_zero = i - 1;
1861 for (; i < last_index; i++) {
1862 int level = block[ scan_table[i] ];
1864 int run = i - last_non_zero - 1;
1866 if((level&(~127)) == 0){
1867 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
1868 put_bits(ac_pb, len_tab[index], bits_tab[index]);
1870 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);
1875 /*if(i<=last_index)*/{
1876 int level = block[ scan_table[i] ];
1877 int run = i - last_non_zero - 1;
1879 if((level&(~127)) == 0){
1880 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
1881 put_bits(ac_pb, len_tab[index], bits_tab[index]);
1883 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);
1887 for (; i <= last_index; i++) {
1888 const int slevel = block[ scan_table[i] ];
1891 int run = i - last_non_zero - 1;
1892 last = (i == last_index);
1899 code = get_rl_index(rl, last, run, level);
1900 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1901 if (code == rl->n) {
1903 level1 = level - rl->max_level[last][run];
1906 code = get_rl_index(rl, last, run, level1);
1907 if (code == rl->n) {
1909 put_bits(ac_pb, 1, 1);
1910 if (level > MAX_LEVEL)
1912 run1 = run - rl->max_run[last][level] - 1;
1915 code = get_rl_index(rl, last, run1, level);
1916 if (code == rl->n) {
1919 put_bits(ac_pb, 1, 1);
1920 put_bits(ac_pb, 1, last);
1921 put_bits(ac_pb, 6, run);
1922 put_bits(ac_pb, 1, 1);
1923 put_bits(ac_pb, 12, slevel & 0xfff);
1924 put_bits(ac_pb, 1, 1);
1927 put_bits(ac_pb, 1, 0);
1928 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1929 put_bits(ac_pb, 1, sign);
1933 put_bits(ac_pb, 1, 0);
1934 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1935 put_bits(ac_pb, 1, sign);
1938 put_bits(ac_pb, 1, sign);
1948 /***********************************************/
1951 static VLC intra_MCBPC_vlc;
1952 static VLC inter_MCBPC_vlc;
1953 static VLC cbpy_vlc;
1955 static VLC dc_lum, dc_chrom;
1956 static VLC sprite_trajectory;
1957 static VLC mb_type_b_vlc;
1959 void init_rl(RLTable *rl)
1961 INT8 max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
1962 UINT8 index_run[MAX_RUN+1];
1963 int last, run, level, start, end, i;
1965 /* compute max_level[], max_run[] and index_run[] */
1966 for(last=0;last<2;last++) {
1975 memset(max_level, 0, MAX_RUN + 1);
1976 memset(max_run, 0, MAX_LEVEL + 1);
1977 memset(index_run, rl->n, MAX_RUN + 1);
1978 for(i=start;i<end;i++) {
1979 run = rl->table_run[i];
1980 level = rl->table_level[i];
1981 if (index_run[run] == rl->n)
1983 if (level > max_level[run])
1984 max_level[run] = level;
1985 if (run > max_run[level])
1986 max_run[level] = run;
1988 rl->max_level[last] = av_malloc(MAX_RUN + 1);
1989 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1990 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1991 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1992 rl->index_run[last] = av_malloc(MAX_RUN + 1);
1993 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1997 void init_vlc_rl(RLTable *rl)
2001 init_vlc(&rl->vlc, 9, rl->n + 1,
2002 &rl->table_vlc[0][1], 4, 2,
2003 &rl->table_vlc[0][0], 4, 2);
2006 for(q=0; q<32; q++){
2015 rl->rl_vlc[q]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
2016 for(i=0; i<rl->vlc.table_size; i++){
2017 int code= rl->vlc.table[i][0];
2018 int len = rl->vlc.table[i][1];
2021 if(len==0){ // illegal code
2024 }else if(len<0){ //more bits needed
2028 if(code==rl->n){ //esc
2032 run= rl->table_run [code] + 1;
2033 level= rl->table_level[code] * qmul + qadd;
2034 if(code >= rl->last) run+=192;
2037 rl->rl_vlc[q][i].len= len;
2038 rl->rl_vlc[q][i].level= level;
2039 rl->rl_vlc[q][i].run= run;
2046 /* XXX: find a better solution to handle static init */
2047 void h263_decode_init_vlc(MpegEncContext *s)
2049 static int done = 0;
2054 init_vlc(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 8,
2055 intra_MCBPC_bits, 1, 1,
2056 intra_MCBPC_code, 1, 1);
2057 init_vlc(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 25,
2058 inter_MCBPC_bits, 1, 1,
2059 inter_MCBPC_code, 1, 1);
2060 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
2061 &cbpy_tab[0][1], 2, 1,
2062 &cbpy_tab[0][0], 2, 1);
2063 init_vlc(&mv_vlc, MV_VLC_BITS, 33,
2065 &mvtab[0][0], 2, 1);
2068 init_rl(&rl_intra_aic);
2069 init_vlc_rl(&rl_inter);
2070 init_vlc_rl(&rl_intra);
2071 init_vlc_rl(&rl_intra_aic);
2072 init_vlc(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
2073 &DCtab_lum[0][1], 2, 1,
2074 &DCtab_lum[0][0], 2, 1);
2075 init_vlc(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
2076 &DCtab_chrom[0][1], 2, 1,
2077 &DCtab_chrom[0][0], 2, 1);
2078 init_vlc(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
2079 &sprite_trajectory_tab[0][1], 4, 2,
2080 &sprite_trajectory_tab[0][0], 4, 2);
2081 init_vlc(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
2082 &mb_type_b_tab[0][1], 2, 1,
2083 &mb_type_b_tab[0][0], 2, 1);
2086 s->progressive_sequence=1; // set to most likely for the case of incomplete headers
2089 int h263_decode_gob_header(MpegEncContext *s)
2091 unsigned int val, gfid;
2093 /* Check for GOB Start Code */
2094 val = show_bits(&s->gb, 16);
2096 /* We have a GBSC probably with GSTUFF */
2097 skip_bits(&s->gb, 16); /* Drop the zeros */
2098 while (get_bits1(&s->gb) == 0); /* Seek the '1' bit */
2100 fprintf(stderr,"\nGOB Start Code at MB %d\n", (s->mb_y * s->mb_width) + s->mb_x);
2102 s->gob_number = get_bits(&s->gb, 5); /* GN */
2103 gfid = get_bits(&s->gb, 2); /* GFID */
2104 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
2106 fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", s->gob_number, gfid, s->qscale);
2114 static inline void memsetw(short *tab, int val, int n)
2121 void ff_mpeg4_init_partitions(MpegEncContext *s)
2123 init_put_bits(&s->tex_pb, s->tex_pb_buffer, PB_BUFFER_SIZE, NULL, NULL);
2124 init_put_bits(&s->pb2 , s->pb2_buffer , PB_BUFFER_SIZE, NULL, NULL);
2127 void ff_mpeg4_merge_partitions(MpegEncContext *s)
2129 const int pb2_len = get_bit_count(&s->pb2 );
2130 const int tex_pb_len= get_bit_count(&s->tex_pb);
2131 const int bits= get_bit_count(&s->pb);
2133 if(s->pict_type==I_TYPE){
2134 put_bits(&s->pb, 19, DC_MARKER);
2135 s->misc_bits+=19 + pb2_len + bits - s->last_bits;
2136 s->i_tex_bits+= tex_pb_len;
2138 put_bits(&s->pb, 17, MOTION_MARKER);
2139 s->misc_bits+=17 + pb2_len;;
2140 s->mv_bits+= bits - s->last_bits;
2141 s->p_tex_bits+= tex_pb_len;
2144 flush_put_bits(&s->pb2);
2145 flush_put_bits(&s->tex_pb);
2147 ff_copy_bits(&s->pb, s->pb2_buffer , pb2_len);
2148 ff_copy_bits(&s->pb, s->tex_pb_buffer, tex_pb_len);
2149 s->last_bits= get_bit_count(&s->pb);
2152 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
2154 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
2156 ff_mpeg4_stuffing(&s->pb);
2157 if(s->pict_type==I_TYPE)
2158 put_bits(&s->pb, 16, 0);
2159 else if(s->pict_type==B_TYPE)
2160 put_bits(&s->pb, MAX(MAX(s->f_code, s->b_code)+15, 17), 0);
2162 put_bits(&s->pb, s->f_code+15, 0);
2163 put_bits(&s->pb, 1, 1);
2165 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
2166 put_bits(&s->pb, 5, s->qscale);
2167 put_bits(&s->pb, 1, 0); /* no HEC */
2171 * decodes the next video packet and sets s->next_qscale
2172 * returns mb_num of the next packet or <0 if something went wrong
2174 static int decode_video_packet_header(MpegEncContext *s, GetBitContext *gb)
2177 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
2178 int header_extension=0, mb_num;
2179 //printf("%X\n", show_bits(&gb, 24));
2180 //printf("parse_video_packet_header\n");
2181 // if(show_aligned_bits(gb, 1, 16) != 0) return -1;
2183 /* is there enough space left for a video packet + header */
2184 if( get_bits_count(gb) > gb->size*8-20) return -1;
2186 //printf("resync at %d %d\n", s->mb_x, s->mb_y);
2187 // skip_bits(gb, 1);
2188 // align_get_bits(gb);
2189 if(get_bits(gb, 16)!=0){
2190 printf("internal error while decoding video packet header\n");
2193 //printf("%X\n", show_bits(gb, 24));
2195 while(!get_bits1(gb) && bits<30) bits++;
2196 if((s->pict_type == P_TYPE || s->pict_type == S_TYPE) && bits != s->f_code-1){
2197 printf("marker does not match f_code (is: %d should be: %d pos: %d end %d x: %d y: %d)\n",
2198 bits+1, s->f_code, get_bits_count(gb), gb->size*8, s->mb_x, s->mb_y);
2200 }else if(s->pict_type == I_TYPE && bits != 0){
2201 printf("marker too long\n");
2203 }else if(s->pict_type == B_TYPE && bits != MAX(MAX(s->f_code, s->b_code)-1, 1)){
2204 printf("marker does not match f/b_code\n");
2207 //printf("%X\n", show_bits(gb, 24));
2209 if(s->shape != RECT_SHAPE){
2210 header_extension= get_bits1(gb);
2211 //FIXME more stuff here
2214 mb_num= get_bits(gb, mb_num_bits);
2215 if(mb_num < s->mb_x + s->mb_y*s->mb_width || mb_num>=s->mb_num){
2216 fprintf(stderr, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_x + s->mb_y*s->mb_width);
2220 if(s->shape != BIN_ONLY_SHAPE){
2221 s->next_resync_qscale= get_bits(gb, 5);
2222 if(s->next_resync_qscale==0)
2223 s->next_resync_qscale= s->qscale;
2224 if(s->next_resync_qscale==0){
2225 fprintf(stderr, "qscale==0\n");
2230 if(s->shape == RECT_SHAPE){
2231 header_extension= get_bits1(gb);
2233 if(header_extension){
2237 while (get_bits1(gb) != 0)
2240 check_marker(gb, "before time_increment in video packed header");
2241 time_increment= get_bits(gb, s->time_increment_bits);
2242 check_marker(gb, "before vop_coding_type in video packed header");
2244 skip_bits(gb, 2); /* vop coding type */
2245 //FIXME not rect stuff here
2247 if(s->shape != BIN_ONLY_SHAPE){
2248 skip_bits(gb, 3); /* intra dc vlc threshold */
2250 if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE && s->num_sprite_warping_points){
2251 mpeg4_decode_sprite_trajectory(s);
2252 fprintf(stderr, "untested\n");
2255 //FIXME reduced res stuff here
2257 if (s->pict_type != I_TYPE) {
2258 int f_code = get_bits(gb, 3); /* fcode_for */
2260 printf("Error, video packet header damaged (f_code=0)\n");
2263 if (s->pict_type == B_TYPE) {
2264 int b_code = get_bits(gb, 3);
2266 printf("Error, video packet header damaged (b_code=0)\n");
2271 //FIXME new-pred stuff
2273 //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));
2278 void ff_mpeg4_clean_buffers(MpegEncContext *s)
2280 int c_wrap, c_xy, l_wrap, l_xy;
2282 l_wrap= s->block_wrap[0];
2283 l_xy= s->mb_y*l_wrap*2 + s->mb_x*2;
2284 c_wrap= s->block_wrap[4];
2285 c_xy= s->mb_y*c_wrap + s->mb_x;
2288 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
2289 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
2290 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
2293 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(INT16));
2294 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(INT16));
2295 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(INT16));
2298 // we cant clear the MVs as they might be needed by a b frame
2299 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(INT16));
2300 // memset(s->motion_val, 0, 2*sizeof(INT16)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
2301 s->last_mv[0][0][0]=
2302 s->last_mv[0][0][1]=
2303 s->last_mv[1][0][0]=
2304 s->last_mv[1][0][1]= 0;
2307 /* searches for the next resync marker clears ac,dc,mc, and sets s->next_resync_gb, s->mb_num_left */
2308 int ff_mpeg4_resync(MpegEncContext *s)
2312 /* search & parse next resync marker */
2314 gb= s->next_resync_gb;
2315 align_get_bits(&gb);
2316 //printf("mpeg4_resync %d next:%d \n", get_bits_count(&gb), get_bits_count(&s->next_resync_gb));
2318 int v= show_bits(&gb, 24);
2319 if( get_bits_count(&gb) >= gb.size*8-24 || v == 1 /* start-code */){
2320 s->mb_num_left= s->mb_num - s->mb_x - s->mb_y*s->mb_width;
2321 //printf("mpeg4_resync end\n");
2322 s->gb= s->next_resync_gb; //continue at the next resync marker
2324 }else if(v>>8 == 0){
2326 s->next_resync_pos= get_bits_count(&gb);
2328 next= decode_video_packet_header(s, &gb);
2330 s->mb_num_left= next - s->mb_x - s->mb_y*s->mb_width;
2334 align_get_bits(&gb);
2338 s->next_resync_gb=gb;
2343 static inline void init_block_index(MpegEncContext *s)
2345 s->block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
2346 s->block_index[1]= s->block_wrap[0]*(s->mb_y*2 + 1) + s->mb_x*2;
2347 s->block_index[2]= s->block_wrap[0]*(s->mb_y*2 + 2) - 1 + s->mb_x*2;
2348 s->block_index[3]= s->block_wrap[0]*(s->mb_y*2 + 2) + s->mb_x*2;
2349 s->block_index[4]= s->block_wrap[4]*(s->mb_y + 1) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x;
2350 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;
2353 static inline void update_block_index(MpegEncContext *s)
2355 s->block_index[0]+=2;
2356 s->block_index[1]+=2;
2357 s->block_index[2]+=2;
2358 s->block_index[3]+=2;
2359 s->block_index[4]++;
2360 s->block_index[5]++;
2364 * decodes the first & second partition
2365 * returns error type or 0 if no error
2367 int ff_mpeg4_decode_partitions(MpegEncContext *s)
2369 static const INT8 quant_tab[4] = { -1, -2, 1, 2 };
2372 /* decode first partition */
2374 s->first_slice_line=1;
2375 s->mb_x= s->resync_mb_x;
2376 for(s->mb_y= s->resync_mb_y; mb_num < s->mb_num_left; s->mb_y++){
2377 init_block_index(s);
2378 for(; mb_num < s->mb_num_left && s->mb_x<s->mb_width; s->mb_x++){
2379 const int xy= s->mb_x + s->mb_y*s->mb_width;
2384 update_block_index(s);
2385 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
2386 s->first_slice_line=0;
2388 if(s->mb_x==0) PRINT_MB_TYPE("\n");
2390 if(s->pict_type==I_TYPE){
2394 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
2396 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
2397 return DECODING_DESYNC;
2399 s->cbp_table[xy]= cbpc & 3;
2400 s->mb_type[xy]= MB_TYPE_INTRA;
2404 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2406 s->qscale_table[xy]= s->qscale;
2408 s->mbintra_table[xy]= 1;
2411 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
2413 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
2414 return DECODING_DESYNC;
2417 if(dc_pred_dir) dir|=1;
2419 s->pred_dir_table[xy]= dir;
2420 }else{ /* P/S_TYPE */
2421 int mx, my, pred_x, pred_y;
2422 INT16 * const mot_val= s->motion_val[s->block_index[0]];
2423 const int stride= s->block_wrap[0]*2;
2425 if(get_bits1(&s->gb)){
2427 s->mb_type[xy]= MB_TYPE_SKIPED;
2428 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2429 const int a= s->sprite_warping_accuracy;
2431 if(s->divx_version==500 && s->divx_build==413){
2432 mx = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
2433 my = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2435 mx = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2436 my = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2437 s->mb_type[xy]= MB_TYPE_GMC | MB_TYPE_SKIPED;
2444 mot_val[0 ]= mot_val[2 ]=
2445 mot_val[0+stride]= mot_val[2+stride]= mx;
2446 mot_val[1 ]= mot_val[3 ]=
2447 mot_val[1+stride]= mot_val[3+stride]= my;
2449 if(s->mbintra_table[xy])
2450 ff_clean_intra_table_entries(s);
2454 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
2456 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
2457 return DECODING_DESYNC;
2461 else if (cbpc == 20)
2462 fprintf(stderr, "Stuffing !");
2463 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
2465 s->mb_intra = ((cbpc & 4) != 0);
2469 s->mbintra_table[xy]= 1;
2470 s->mb_type[xy]= MB_TYPE_INTRA;
2471 mot_val[0 ]= mot_val[2 ]=
2472 mot_val[0+stride]= mot_val[2+stride]= 0;
2473 mot_val[1 ]= mot_val[3 ]=
2474 mot_val[1+stride]= mot_val[3+stride]= 0;
2476 if(s->mbintra_table[xy])
2477 ff_clean_intra_table_entries(s);
2479 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
2480 s->mcsel= get_bits1(&s->gb);
2483 if ((cbpc & 16) == 0) {
2485 /* 16x16 motion prediction */
2486 s->mb_type[xy]= MB_TYPE_INTER;
2488 h263_pred_motion(s, 0, &pred_x, &pred_y);
2490 mx = h263_decode_motion(s, pred_x, s->f_code);
2492 const int a= s->sprite_warping_accuracy;
2493 if(s->divx_version==500 && s->divx_build==413){
2494 mx = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
2496 mx = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2500 return DECODING_DESYNC;
2503 my = h263_decode_motion(s, pred_y, s->f_code);
2505 const int a= s->sprite_warping_accuracy;
2506 if(s->divx_version==500 && s->divx_build==413){
2507 my = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2509 my = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2513 return DECODING_DESYNC;
2514 mot_val[0 ]= mot_val[2 ] =
2515 mot_val[0+stride]= mot_val[2+stride]= mx;
2516 mot_val[1 ]= mot_val[3 ]=
2517 mot_val[1+stride]= mot_val[3+stride]= my;
2521 s->mb_type[xy]= MB_TYPE_INTER4V;
2523 INT16 *mot_val= h263_pred_motion(s, i, &pred_x, &pred_y);
2524 mx = h263_decode_motion(s, pred_x, s->f_code);
2526 return DECODING_DESYNC;
2528 my = h263_decode_motion(s, pred_y, s->f_code);
2530 return DECODING_DESYNC;
2541 if (s->pict_type==I_TYPE && get_bits(&s->gb, 19)!=DC_MARKER ) s->decoding_error= DECODING_DESYNC;
2542 else if(s->pict_type!=I_TYPE && get_bits(&s->gb, 17)!=MOTION_MARKER) s->decoding_error= DECODING_DESYNC;
2543 if(s->decoding_error== DECODING_DESYNC){
2544 fprintf(stderr, "marker missing after first partition at %d %d\n", s->mb_x, s->mb_y);
2545 return DECODING_DESYNC;
2548 /* decode second partition */
2550 s->mb_x= s->resync_mb_x;
2551 for(s->mb_y= s->resync_mb_y; mb_num < s->mb_num_left; s->mb_y++){
2552 init_block_index(s);
2553 for(; mb_num < s->mb_num_left && s->mb_x<s->mb_width; s->mb_x++){
2554 const int xy= s->mb_x + s->mb_y*s->mb_width;
2557 update_block_index(s);
2559 if(s->pict_type==I_TYPE){
2560 int ac_pred= get_bits1(&s->gb);
2561 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2563 fprintf(stderr, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2564 return DECODING_AC_LOST;
2567 s->cbp_table[xy]|= cbpy<<2;
2568 s->pred_dir_table[xy]|= ac_pred<<7;
2569 }else{ /* P || S_TYPE */
2570 if(s->mb_type[xy]&MB_TYPE_INTRA){
2572 int ac_pred = get_bits1(&s->gb);
2573 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2576 fprintf(stderr, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2577 return DECODING_ACDC_LOST;
2580 if(s->cbp_table[xy] & 8) {
2581 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2583 s->qscale_table[xy]= s->qscale;
2587 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
2589 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
2590 return DECODING_ACDC_LOST;
2593 if(dc_pred_dir) dir|=1;
2595 s->cbp_table[xy]&= 3; //remove dquant
2596 s->cbp_table[xy]|= cbpy<<2;
2597 s->pred_dir_table[xy]= dir | (ac_pred<<7);
2598 }else if(s->mb_type[xy]&MB_TYPE_SKIPED){
2599 s->qscale_table[xy]= s->qscale;
2600 s->cbp_table[xy]= 0;
2602 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2605 fprintf(stderr, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2606 return DECODING_ACDC_LOST;
2609 if(s->cbp_table[xy] & 8) {
2610 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2612 s->qscale_table[xy]= s->qscale;
2614 s->cbp_table[xy]&= 3; //remove dquant
2615 s->cbp_table[xy]|= (cbpy^0xf)<<2;
2626 static int mpeg4_decode_partitioned_mb(MpegEncContext *s,
2627 DCTELEM block[6][64])
2630 const int xy= s->mb_x + s->mb_y*s->mb_width;
2632 if(s->mb_x==s->resync_mb_x && s->mb_y==s->resync_mb_y){ //Note resync_mb_{x,y}==0 at the start
2634 int block_index_backup[6];
2635 int qscale= s->qscale;
2637 for(i=0; i<6; i++) block_index_backup[i]= s->block_index[i];
2639 s->decoding_error= ff_mpeg4_decode_partitions(s);
2641 for(i=0; i<6; i++) s->block_index[i]= block_index_backup[i];
2642 s->first_slice_line=1;
2643 s->mb_x= s->resync_mb_x;
2644 s->mb_y= s->resync_mb_y;
2646 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
2647 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
2649 if(s->decoding_error==DECODING_DESYNC) return -1;
2652 mb_type= s->mb_type[xy];
2653 if(s->decoding_error)
2656 cbp = s->cbp_table[xy];
2658 if(s->decoding_error!=DECODING_ACDC_LOST && s->qscale_table[xy] != s->qscale){
2659 s->qscale= s->qscale_table[xy];
2660 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
2661 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
2664 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
2667 s->mv[0][i][0] = s->motion_val[ s->block_index[i] ][0];
2668 s->mv[0][i][1] = s->motion_val[ s->block_index[i] ][1];
2670 s->mb_intra = mb_type&MB_TYPE_INTRA;
2672 if (mb_type&MB_TYPE_SKIPED) {
2675 s->block_last_index[i] = -1;
2676 s->mv_dir = MV_DIR_FORWARD;
2677 s->mv_type = MV_TYPE_16X16;
2678 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2686 }else if(s->mb_intra && s->decoding_error!=DECODING_ACDC_LOST){
2687 s->ac_pred = s->pred_dir_table[xy]>>7;
2689 /* decode each block */
2690 for (i = 0; i < 6; i++) {
2691 int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 1);
2692 if(ret==DECODING_AC_LOST){
2693 fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y);
2694 s->decoding_error=DECODING_AC_LOST;
2696 }else if(ret==DECODING_ACDC_LOST){
2697 fprintf(stderr, "dc corrupted at %d %d (trying to continue with mc only)\n", s->mb_x, s->mb_y);
2698 s->decoding_error=DECODING_ACDC_LOST;
2702 }else if(!s->mb_intra){
2703 // s->mcsel= 0; //FIXME do we need to init that
2705 s->mv_dir = MV_DIR_FORWARD;
2706 if (mb_type&MB_TYPE_INTER4V) {
2707 s->mv_type = MV_TYPE_8X8;
2709 s->mv_type = MV_TYPE_16X16;
2711 if(s->decoding_error==0 && cbp){
2712 /* decode each block */
2713 for (i = 0; i < 6; i++) {
2714 int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 0);
2715 if(ret==DECODING_AC_LOST){
2716 fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y);
2717 s->decoding_error=DECODING_AC_LOST;
2723 } else { /* I-Frame */
2726 s->ac_pred = s->pred_dir_table[xy]>>7;
2728 /* decode each block */
2729 for (i = 0; i < 6; i++) {
2730 int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 1);
2731 if(ret==DECODING_AC_LOST){
2732 fprintf(stderr, "texture corrupted at %d %d (trying to continue with dc only)\n", s->mb_x, s->mb_y);
2733 s->decoding_error=DECODING_AC_LOST;
2735 }else if(ret==DECODING_ACDC_LOST){
2736 fprintf(stderr, "dc corrupted at %d %d\n", s->mb_x, s->mb_y);
2745 static inline void decode_interlaced_info(MpegEncContext *s, int cbp, int mb_type){
2747 if(!s->progressive_sequence){
2748 if(cbp || s->mb_intra)
2749 s->interlaced_dct= get_bits1(&s->gb);
2752 if( s->pict_type==P_TYPE //FIXME check that 4MV is forbidden
2753 || (s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && !s->mcsel)
2754 || (s->pict_type==B_TYPE && mb_type!=0) ){
2756 if(get_bits1(&s->gb)){
2757 s->mv_type= MV_TYPE_FIELD;
2759 if( s->pict_type==P_TYPE
2760 || (s->pict_type==B_TYPE && mb_type!=2)){
2761 s->field_select[0][0]= get_bits1(&s->gb);
2762 s->field_select[0][1]= get_bits1(&s->gb);
2764 if(s->pict_type==B_TYPE && mb_type!=3){
2765 s->field_select[1][0]= get_bits1(&s->gb);
2766 s->field_select[1][1]= get_bits1(&s->gb);
2776 int h263_decode_mb(MpegEncContext *s,
2777 DCTELEM block[6][64])
2779 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
2781 static INT8 quant_tab[4] = { -1, -2, 1, 2 };
2783 if(s->mb_x==0) PRINT_MB_TYPE("\n");
2785 if(s->resync_marker){
2786 if(s->resync_mb_x == s->mb_x && s->resync_mb_y+1 == s->mb_y){
2787 s->first_slice_line=0;
2791 if(s->data_partitioning && s->pict_type!=B_TYPE)
2792 return mpeg4_decode_partitioned_mb(s, block);
2794 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
2795 if (get_bits1(&s->gb)) {
2799 s->block_last_index[i] = -1;
2800 s->mv_dir = MV_DIR_FORWARD;
2801 s->mv_type = MV_TYPE_16X16;
2802 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2803 const int a= s->sprite_warping_accuracy;
2804 // int l = (1 << (s->f_code - 1)) * 32;
2807 if(s->divx_version==500 && s->divx_build==413){
2808 s->mv[0][0][0] = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
2809 s->mv[0][0][1] = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2811 s->mv[0][0][0] = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2812 s->mv[0][0][1] = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2814 /* if (s->mv[0][0][0] < -l) s->mv[0][0][0]= -l;
2815 else if (s->mv[0][0][0] >= l) s->mv[0][0][0]= l-1;
2816 if (s->mv[0][0][1] < -l) s->mv[0][0][1]= -l;
2817 else if (s->mv[0][0][1] >= l) s->mv[0][0][1]= l-1;*/
2829 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
2830 //fprintf(stderr, "\tCBPC: %d", cbpc);
2835 else if (cbpc == 20)
2836 fprintf(stderr, "Stuffing !");
2839 s->mb_intra = ((cbpc & 4) != 0);
2840 if (s->mb_intra) goto intra;
2842 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
2843 s->mcsel= get_bits1(&s->gb);
2845 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2846 cbp = (cbpc & 3) | ((cbpy ^ 0xf) << 2);
2848 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2850 if((!s->progressive_sequence) && (cbp || s->workaround_bugs==2))
2851 s->interlaced_dct= get_bits1(&s->gb);
2853 s->mv_dir = MV_DIR_FORWARD;
2854 if ((cbpc & 16) == 0) {
2856 const int a= s->sprite_warping_accuracy;
2858 /* 16x16 global motion prediction */
2859 s->mv_type = MV_TYPE_16X16;
2860 // int l = (1 << (s->f_code - 1)) * 32;
2861 if(s->divx_version==500 && s->divx_build==413){
2862 mx = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
2863 my = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
2865 mx = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2866 my = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
2868 // int l = (1 << (s->f_code - 1)) * 32;
2869 s->mv[0][0][0] = mx;
2870 s->mv[0][0][1] = my;
2871 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
2873 /* 16x8 field motion prediction */
2874 s->mv_type= MV_TYPE_FIELD;
2876 s->field_select[0][0]= get_bits1(&s->gb);
2877 s->field_select[0][1]= get_bits1(&s->gb);
2879 h263_pred_motion(s, 0, &pred_x, &pred_y);
2882 mx = h263_decode_motion(s, pred_x, s->f_code);
2886 my = h263_decode_motion(s, pred_y/2, s->f_code);
2890 s->mv[0][i][0] = mx;
2891 s->mv[0][i][1] = my;
2895 /* 16x16 motion prediction */
2896 s->mv_type = MV_TYPE_16X16;
2897 h263_pred_motion(s, 0, &pred_x, &pred_y);
2899 mx = h263p_decode_umotion(s, pred_x);
2901 mx = h263_decode_motion(s, pred_x, s->f_code);
2907 my = h263p_decode_umotion(s, pred_y);
2909 my = h263_decode_motion(s, pred_y, s->f_code);
2913 s->mv[0][0][0] = mx;
2914 s->mv[0][0][1] = my;
2916 if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
2917 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
2921 s->mv_type = MV_TYPE_8X8;
2923 mot_val = h263_pred_motion(s, i, &pred_x, &pred_y);
2925 mx = h263p_decode_umotion(s, pred_x);
2927 mx = h263_decode_motion(s, pred_x, s->f_code);
2932 my = h263p_decode_umotion(s, pred_y);
2934 my = h263_decode_motion(s, pred_y, s->f_code);
2937 s->mv[0][i][0] = mx;
2938 s->mv[0][i][1] = my;
2939 if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
2940 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
2945 } else if(s->pict_type==B_TYPE) {
2946 int modb1; // first bit of modb
2947 int modb2; // second bit of modb
2953 s->mb_intra = 0; //B-frames never contain intra blocks
2954 s->mcsel=0; // ... true gmc blocks
2958 s->last_mv[i][0][0]=
2959 s->last_mv[i][0][1]=
2960 s->last_mv[i][1][0]=
2961 s->last_mv[i][1][1]= 0;
2965 /* if we skipped it in the future P Frame than skip it now too */
2966 s->mb_skiped= s->mbskip_table[s->mb_y * s->mb_width + s->mb_x]; // Note, skiptab=0 if last was GMC
2971 s->block_last_index[i] = -1;
2973 s->mv_dir = MV_DIR_FORWARD;
2974 s->mv_type = MV_TYPE_16X16;
2983 modb1= get_bits1(&s->gb);
2985 mb_type=4; //like MB_TYPE_B_DIRECT but no vectors coded
2990 modb2= get_bits1(&s->gb);
2991 mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
2993 else cbp= get_bits(&s->gb, 6);
2995 if (mb_type!=MB_TYPE_B_DIRECT && cbp) {
2996 if(get_bits1(&s->gb)){
2997 change_qscale(s, get_bits1(&s->gb)*4 - 2);
3002 if(!s->progressive_sequence){
3004 s->interlaced_dct= get_bits1(&s->gb);
3006 if(mb_type!=MB_TYPE_B_DIRECT && get_bits1(&s->gb)){
3009 if(mb_type!=MB_TYPE_B_BACKW){
3010 s->field_select[0][0]= get_bits1(&s->gb);
3011 s->field_select[0][1]= get_bits1(&s->gb);
3013 if(mb_type!=MB_TYPE_B_FORW){
3014 s->field_select[1][0]= get_bits1(&s->gb);
3015 s->field_select[1][1]= get_bits1(&s->gb);
3021 if(mb_type!=MB_TYPE_B_DIRECT && !field_mv){
3022 s->mv_type= MV_TYPE_16X16;
3023 if(mb_type!=MB_TYPE_B_BACKW){
3024 s->mv_dir = MV_DIR_FORWARD;
3026 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
3027 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
3028 s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
3029 s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
3032 if(mb_type!=MB_TYPE_B_FORW){
3033 s->mv_dir |= MV_DIR_BACKWARD;
3035 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
3036 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
3037 s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
3038 s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
3040 if(mb_type!=MB_TYPE_B_DIRECT)
3041 PRINT_MB_TYPE(mb_type==MB_TYPE_B_FORW ? "F" : (mb_type==MB_TYPE_B_BACKW ? "B" : "T"));
3042 }else if(mb_type!=MB_TYPE_B_DIRECT){
3043 s->mv_type= MV_TYPE_FIELD;
3045 if(mb_type!=MB_TYPE_B_BACKW){
3046 s->mv_dir = MV_DIR_FORWARD;
3049 mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code);
3050 my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
3051 s->last_mv[0][i][0]= s->mv[0][i][0] = mx;
3052 s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
3056 if(mb_type!=MB_TYPE_B_FORW){
3057 s->mv_dir |= MV_DIR_BACKWARD;
3060 mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code);
3061 my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
3062 s->last_mv[1][i][0]= s->mv[1][i][0] = mx;
3063 s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
3066 if(mb_type!=MB_TYPE_B_DIRECT)
3067 PRINT_MB_TYPE(mb_type==MB_TYPE_B_FORW ? "f" : (mb_type==MB_TYPE_B_BACKW ? "b" : "t"));
3071 if(mb_type==4 || mb_type==MB_TYPE_B_DIRECT){
3072 int mb_index= s->mb_x + s->mb_y*s->mb_width;
3078 mx = h263_decode_motion(s, 0, 1);
3079 my = h263_decode_motion(s, 0, 1);
3082 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3083 xy= s->block_index[0];
3084 time_pp= s->pp_time;
3085 time_pb= s->pb_time;
3087 //FIXME avoid divides
3088 switch(s->co_located_type_table[mb_index]){
3090 s->mv_type= MV_TYPE_16X16;
3091 s->mv[0][0][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
3092 s->mv[0][0][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
3093 s->mv[1][0][0] = mx ? s->mv[0][0][0] - s->motion_val[xy][0]
3094 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
3095 s->mv[1][0][1] = my ? s->mv[0][0][1] - s->motion_val[xy][1]
3096 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
3097 PRINT_MB_TYPE(mb_type==4 ? "D" : "S");
3099 case CO_LOCATED_TYPE_4MV:
3100 s->mv_type = MV_TYPE_8X8;
3102 xy= s->block_index[i];
3103 s->mv[0][i][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
3104 s->mv[0][i][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
3105 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->motion_val[xy][0]
3106 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
3107 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->motion_val[xy][1]
3108 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
3112 case CO_LOCATED_TYPE_FIELDMV:
3113 s->mv_type = MV_TYPE_FIELD;
3115 if(s->top_field_first){
3116 time_pp= s->pp_field_time - s->field_select_table[mb_index][i] + i;
3117 time_pb= s->pb_field_time - s->field_select_table[mb_index][i] + i;
3119 time_pp= s->pp_field_time + s->field_select_table[mb_index][i] - i;
3120 time_pb= s->pb_field_time + s->field_select_table[mb_index][i] - i;
3122 s->mv[0][i][0] = s->field_mv_table[mb_index][i][0]*time_pb/time_pp + mx;
3123 s->mv[0][i][1] = s->field_mv_table[mb_index][i][1]*time_pb/time_pp + my;
3124 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->field_mv_table[mb_index][i][0]
3125 : s->field_mv_table[mb_index][i][0]*(time_pb - time_pp)/time_pp;
3126 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->field_mv_table[mb_index][i][1]
3127 : s->field_mv_table[mb_index][i][1]*(time_pb - time_pp)/time_pp;
3134 if(mb_type<0 || mb_type>4){
3135 printf("illegal MB_type\n");
3138 } else { /* I-Frame */
3139 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
3146 if (s->h263_pred || s->h263_aic) {
3147 s->ac_pred = get_bits1(&s->gb);
3148 if (s->ac_pred && s->h263_aic)
3149 s->h263_aic_dir = get_bits1(&s->gb);
3151 PRINT_MB_TYPE(s->ac_pred ? "A" : "I");
3153 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3154 if(cbpy<0) return -1;
3155 cbp = (cbpc & 3) | (cbpy << 2);
3157 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
3159 if(!s->progressive_sequence)
3160 s->interlaced_dct= get_bits1(&s->gb);
3162 /* decode each block */
3164 for (i = 0; i < 6; i++) {
3165 if (mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 1) < 0)
3169 for (i = 0; i < 6; i++) {
3170 if (h263_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
3177 /* decode each block */
3179 for (i = 0; i < 6; i++) {
3180 if (mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 0) < 0)
3184 for (i = 0; i < 6; i++) {
3185 if (h263_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
3192 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
3194 int code, val, sign, shift, l;
3196 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
3202 sign = get_bits1(&s->gb);
3204 val = (code - 1) << shift;
3206 val |= get_bits(&s->gb, shift);
3212 /* modulo decoding */
3213 if (!s->h263_long_vectors) {
3214 l = (1 << (f_code - 1)) * 32;
3217 } else if (val >= l) {
3221 /* horrible h263 long vector mode */
3222 if (pred < -31 && val < -63)
3224 if (pred > 32 && val > 63)
3231 /* Decodes RVLC of H.263+ UMV */
3232 static int h263p_decode_umotion(MpegEncContext * s, int pred)
3236 if (get_bits1(&s->gb)) /* Motion difference = 0 */
3239 code = 2 + get_bits1(&s->gb);
3241 while (get_bits1(&s->gb))
3244 code += get_bits1(&s->gb);
3249 code = (sign) ? (pred - code) : (pred + code);
3251 fprintf(stderr,"H.263+ UMV Motion = %d\n", code);
3257 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
3260 int code, level, i, j, last, run;
3261 RLTable *rl = &rl_inter;
3262 const UINT8 *scan_table;
3264 scan_table = zigzag_direct;
3265 if (s->h263_aic && s->mb_intra) {
3269 if (s->h263_aic_dir)
3270 scan_table = ff_alternate_vertical_scan; /* left */
3272 scan_table = ff_alternate_horizontal_scan; /* top */
3274 } else if (s->mb_intra) {
3276 if (s->h263_rv10 && s->rv10_version == 3 && s->pict_type == I_TYPE) {
3277 int component, diff;
3278 component = (n <= 3 ? 0 : n - 4 + 1);
3279 level = s->last_dc[component];
3280 if (s->rv10_first_dc_coded[component]) {
3281 diff = rv_decode_dc(s, n);
3285 level = level & 0xff; /* handle wrap round */
3286 s->last_dc[component] = level;
3288 s->rv10_first_dc_coded[component] = 1;
3291 level = get_bits(&s->gb, 8);
3301 if (s->mb_intra && s->h263_aic)
3303 s->block_last_index[n] = i - 1;
3308 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
3311 if (code == rl->n) {
3313 last = get_bits1(&s->gb);
3314 run = get_bits(&s->gb, 6);
3315 level = (INT8)get_bits(&s->gb, 8);
3316 if (s->h263_rv10 && level == -128) {
3317 /* XXX: should patch encoder too */
3318 level = get_bits(&s->gb, 12);
3319 level= (level + ((-1)<<11)) ^ ((-1)<<11); //sign extension
3322 run = rl->table_run[code];
3323 level = rl->table_level[code];
3324 last = code >= rl->last;
3325 if (get_bits1(&s->gb))
3338 if (s->mb_intra && s->h263_aic) {
3339 h263_pred_acdc(s, block, n);
3342 s->block_last_index[n] = i;
3346 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
3348 int level, pred, code;
3352 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
3354 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
3355 if (code < 0 || code > 9 /* && s->nbit<9 */){
3356 fprintf(stderr, "illegal dc vlc\n");
3362 level = get_bits(&s->gb, code);
3363 if ((level >> (code - 1)) == 0) /* if MSB not set it is negative*/
3364 level = - (level ^ ((1 << code) - 1));
3366 if(get_bits1(&s->gb)==0){ /* marker */
3367 fprintf(stderr, "dc marker bit missing\n");
3373 pred = ff_mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
3378 *dc_val = level * s->y_dc_scale;
3380 *dc_val = level * s->c_dc_scale;
3387 * returns 0 if everything went ok
3388 * returns DECODING_AC_LOST if an error was detected during AC decoding
3389 * returns DECODING_ACDC_LOST if an error was detected during DC decoding
3391 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
3392 int n, int coded, int intra)
3394 int level, i, last, run;
3397 RL_VLC_ELEM * rl_vlc;
3398 const UINT8 * scan_table;
3403 if(s->data_partitioning && s->pict_type!=B_TYPE){
3404 level = s->dc_val[0][ s->block_index[n] ];
3405 if(n<4) level= (level + (s->y_dc_scale>>1))/s->y_dc_scale; //FIXME optimizs
3406 else level= (level + (s->c_dc_scale>>1))/s->c_dc_scale;
3407 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_width]<<n)&32;
3409 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
3411 return DECODING_ACDC_LOST;
3418 rl_vlc = rl_intra.rl_vlc[0];
3419 if(s->alternate_scan)
3420 scan_table = ff_alternate_vertical_scan; /* left */
3421 else if (s->ac_pred) {
3422 if (dc_pred_dir == 0)
3423 scan_table = ff_alternate_vertical_scan; /* left */
3425 scan_table = ff_alternate_horizontal_scan; /* top */
3427 scan_table = zigzag_direct;
3434 s->block_last_index[n] = i;
3439 if(s->alternate_scan)
3440 scan_table = ff_alternate_vertical_scan; /* left */
3442 scan_table = zigzag_direct;
3447 rl_vlc = rl_inter.rl_vlc[0];
3449 qmul = s->qscale << 1;
3450 qadd = (s->qscale - 1) | 1;
3451 rl_vlc = rl_inter.rl_vlc[s->qscale];
3455 OPEN_READER(re, &s->gb);
3457 UPDATE_CACHE(re, &s->gb);
3458 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
3461 cache= GET_CACHE(re, &s->gb);
3463 if (cache&0x80000000) {
3464 if (cache&0x40000000) {
3466 SKIP_CACHE(re, &s->gb, 2);
3467 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
3468 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
3469 SKIP_COUNTER(re, &s->gb, 2+1+6);
3470 UPDATE_CACHE(re, &s->gb);
3472 if(SHOW_UBITS(re, &s->gb, 1)==0){
3473 fprintf(stderr, "1. marker bit missing in 3. esc\n");
3474 return DECODING_AC_LOST;
3475 }; SKIP_CACHE(re, &s->gb, 1);
3477 level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
3479 if(SHOW_UBITS(re, &s->gb, 1)==0){
3480 fprintf(stderr, "2. marker bit missing in 3. esc\n");
3481 return DECODING_AC_LOST;
3482 }; LAST_SKIP_CACHE(re, &s->gb, 1);
3484 SKIP_COUNTER(re, &s->gb, 1+12+1);
3486 if(level*s->qscale>1024 || level*s->qscale<-1024){
3487 fprintf(stderr, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
3488 return DECODING_AC_LOST;
3492 const int abs_level= ABS(level);
3493 if(abs_level<=MAX_LEVEL && run<=MAX_RUN && s->error_resilience>=0){
3494 const int run1= run - rl->max_run[last][abs_level] - 1;
3495 if(abs_level <= rl->max_level[last][run]){
3496 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
3497 return DECODING_AC_LOST;
3499 if(abs_level <= rl->max_level[last][run]*2){
3500 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
3501 return DECODING_AC_LOST;
3503 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
3504 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
3505 return DECODING_AC_LOST;
3510 if (level>0) level= level * qmul + qadd;
3511 else level= level * qmul - qadd;
3517 #if MIN_CACHE_BITS < 20
3518 LAST_SKIP_BITS(re, &s->gb, 2);
3519 UPDATE_CACHE(re, &s->gb);
3521 SKIP_BITS(re, &s->gb, 2);
3523 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
3524 i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing
3525 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
3526 LAST_SKIP_BITS(re, &s->gb, 1);
3530 #if MIN_CACHE_BITS < 19
3531 LAST_SKIP_BITS(re, &s->gb, 1);
3532 UPDATE_CACHE(re, &s->gb);
3534 SKIP_BITS(re, &s->gb, 1);
3536 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
3538 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
3539 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
3540 LAST_SKIP_BITS(re, &s->gb, 1);
3544 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
3545 LAST_SKIP_BITS(re, &s->gb, 1);
3550 fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
3551 return DECODING_AC_LOST;
3554 block[scan_table[i]] = level;
3558 block[scan_table[i]] = level;
3560 CLOSE_READER(re, &s->gb);
3564 mpeg4_pred_ac(s, block, n, dc_pred_dir);
3566 i = 63; /* XXX: not optimal */
3569 s->block_last_index[n] = i;
3573 /* most is hardcoded. should extend to handle all h263 streams */
3574 int h263_decode_picture_header(MpegEncContext *s)
3576 int format, width, height;
3578 /* picture start code */
3579 if (get_bits(&s->gb, 22) != 0x20) {
3580 fprintf(stderr, "Bad picture start code\n");
3583 /* temporal reference */
3584 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
3586 /* PTYPE starts here */
3587 if (get_bits1(&s->gb) != 1) {
3589 fprintf(stderr, "Bad marker\n");
3592 if (get_bits1(&s->gb) != 0) {
3593 fprintf(stderr, "Bad H263 id\n");
3594 return -1; /* h263 id */
3596 skip_bits1(&s->gb); /* split screen off */
3597 skip_bits1(&s->gb); /* camera off */
3598 skip_bits1(&s->gb); /* freeze picture release off */
3600 /* Reset GOB number */
3603 format = get_bits(&s->gb, 3);
3608 7 extended PTYPE (PLUSPTYPE)
3611 if (format != 7 && format != 6) {
3614 width = h263_format[format][0];
3615 height = h263_format[format][1];
3621 s->pict_type = I_TYPE + get_bits1(&s->gb);
3623 s->unrestricted_mv = get_bits1(&s->gb);
3624 s->h263_long_vectors = s->unrestricted_mv;
3626 if (get_bits1(&s->gb) != 0) {
3627 fprintf(stderr, "H263 SAC not supported\n");
3628 return -1; /* SAC: off */
3630 if (get_bits1(&s->gb) != 0) {
3631 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
3634 if (get_bits1(&s->gb) != 0) {
3635 fprintf(stderr, "H263 PB frame not supported\n");
3636 return -1; /* not PB frame */
3638 s->qscale = get_bits(&s->gb, 5);
3639 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
3645 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
3647 /* ufep other than 0 and 1 are reserved */
3650 format = get_bits(&s->gb, 3);
3651 dprintf("ufep=1, format: %d\n", format);
3652 skip_bits(&s->gb,1); /* Custom PCF */
3653 s->umvplus_dec = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */
3654 skip_bits1(&s->gb); /* Syntax-based Arithmetic Coding (SAC) */
3655 if (get_bits1(&s->gb) != 0) {
3656 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
3658 if (get_bits1(&s->gb) != 0) { /* Advanced Intra Coding (AIC) */
3662 skip_bits(&s->gb, 7);
3663 /* these are the 7 bits: (in order of appearence */
3664 /* Deblocking Filter */
3665 /* Slice Structured */
3666 /* Reference Picture Selection */
3667 /* Independent Segment Decoding */
3668 /* Alternative Inter VLC */
3669 /* Modified Quantization */
3670 /* Prevent start code emulation */
3672 skip_bits(&s->gb, 3); /* Reserved */
3673 } else if (ufep != 0) {
3674 fprintf(stderr, "Bad UFEP type (%d)\n", ufep);
3679 s->pict_type = get_bits(&s->gb, 3) + I_TYPE;
3680 dprintf("pict_type: %d\n", s->pict_type);
3681 if (s->pict_type != I_TYPE &&
3682 s->pict_type != P_TYPE)
3684 skip_bits(&s->gb, 2);
3685 s->no_rounding = get_bits1(&s->gb);
3686 dprintf("RTYPE: %d\n", s->no_rounding);
3687 skip_bits(&s->gb, 4);
3689 /* Get the picture dimensions */
3692 /* Custom Picture Format (CPFMT) */
3693 s->aspect_ratio_info = get_bits(&s->gb, 4);
3694 dprintf("aspect: %d\n", s->aspect_ratio_info);
3699 3 - 10:11 (525-type 4:3)
3700 4 - 16:11 (CIF 16:9)
3701 5 - 40:33 (525-type 16:9)
3704 width = (get_bits(&s->gb, 9) + 1) * 4;
3706 height = get_bits(&s->gb, 9) * 4;
3707 dprintf("\nH.263+ Custom picture: %dx%d\n",width,height);
3708 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
3709 /* aspected dimensions */
3710 s->aspected_width = get_bits(&s->gb, 8);
3711 s->aspected_height = get_bits(&s->gb, 8);
3714 width = h263_format[format][0];
3715 height = h263_format[format][1];
3717 if ((width == 0) || (height == 0))
3721 if (s->umvplus_dec) {
3722 skip_bits1(&s->gb); /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
3726 s->qscale = get_bits(&s->gb, 5);
3729 while (get_bits1(&s->gb) != 0) {
3730 skip_bits(&s->gb, 8);
3735 s->y_dc_scale_table=
3736 s->c_dc_scale_table= h263_aic_dc_scale_table;
3738 s->y_dc_scale_table=
3739 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
3745 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s)
3748 int a= 2<<s->sprite_warping_accuracy;
3749 int rho= 3-s->sprite_warping_accuracy;
3751 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
3752 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
3753 int sprite_ref[4][2];
3754 int virtual_ref[2][2];
3756 int alpha=0, beta=0;
3759 //printf("SP %d\n", s->sprite_warping_accuracy);
3760 for(i=0; i<s->num_sprite_warping_points; i++){
3764 length= get_vlc(&s->gb, &sprite_trajectory);
3766 x= get_bits(&s->gb, length);
3767 //printf("lx %d %d\n", length, x);
3768 if ((x >> (length - 1)) == 0) /* if MSB not set it is negative*/
3769 x = - (x ^ ((1 << length) - 1));
3771 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(&s->gb); /* marker bit */
3773 length= get_vlc(&s->gb, &sprite_trajectory);
3775 y=get_bits(&s->gb, length);
3776 //printf("ly %d %d\n", length, y);
3777 if ((y >> (length - 1)) == 0) /* if MSB not set it is negative*/
3778 y = - (y ^ ((1 << length) - 1));
3780 skip_bits1(&s->gb); /* marker bit */
3781 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
3782 //if(i>0 && (x!=0 || y!=0)) printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n");
3788 while((1<<alpha)<w) alpha++;
3789 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
3793 // Note, the 4th point isnt used for GMC
3794 if(s->divx_version==500 && s->divx_build==413){
3795 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
3796 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
3797 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
3798 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
3799 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
3800 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
3802 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
3803 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
3804 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
3805 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
3806 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
3807 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
3809 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
3810 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
3812 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
3813 // perhaps it should be reordered to be more readable ...
3814 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
3815 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
3816 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
3817 + 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);
3818 virtual_ref[0][1]= 16*vop_ref[0][1]
3819 + 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);
3820 virtual_ref[1][0]= 16*vop_ref[0][0]
3821 + 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);
3822 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
3823 + 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);
3825 switch(s->num_sprite_warping_points)
3828 s->sprite_offset[0][0]= 0;
3829 s->sprite_offset[0][1]= 0;
3830 s->sprite_offset[1][0]= 0;
3831 s->sprite_offset[1][1]= 0;
3832 s->sprite_delta[0][0][0]= a;
3833 s->sprite_delta[0][0][1]= 0;
3834 s->sprite_delta[0][1][0]= 0;
3835 s->sprite_delta[0][1][1]= a;
3836 s->sprite_delta[1][0][0]= a;
3837 s->sprite_delta[1][0][1]= 0;
3838 s->sprite_delta[1][1][0]= 0;
3839 s->sprite_delta[1][1][1]= a;
3840 s->sprite_shift[0][0]= 0;
3841 s->sprite_shift[0][1]= 0;
3842 s->sprite_shift[1][0]= 0;
3843 s->sprite_shift[1][1]= 0;
3846 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
3847 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
3848 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
3849 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
3850 s->sprite_delta[0][0][0]= a;
3851 s->sprite_delta[0][0][1]= 0;
3852 s->sprite_delta[0][1][0]= 0;
3853 s->sprite_delta[0][1][1]= a;
3854 s->sprite_delta[1][0][0]= a;
3855 s->sprite_delta[1][0][1]= 0;
3856 s->sprite_delta[1][1][0]= 0;
3857 s->sprite_delta[1][1][1]= a;
3858 s->sprite_shift[0][0]= 0;
3859 s->sprite_shift[0][1]= 0;
3860 s->sprite_shift[1][0]= 0;
3861 s->sprite_shift[1][1]= 0;
3865 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
3866 + ((-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
3867 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1]));
3868 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
3869 + ((-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
3870 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1]));
3871 s->sprite_offset[1][0]= ((-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
3872 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
3873 +2*w2*r*sprite_ref[0][0] - 16*w2);
3874 s->sprite_offset[1][1]= ((-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
3875 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
3876 +2*w2*r*sprite_ref[0][1] - 16*w2);
3877 s->sprite_delta[0][0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
3878 s->sprite_delta[0][0][1]= ( r*sprite_ref[0][1] - virtual_ref[0][1]);
3879 s->sprite_delta[0][1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
3880 s->sprite_delta[0][1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
3881 s->sprite_delta[1][0][0]= 4*(-r*sprite_ref[0][0] + virtual_ref[0][0]);
3882 s->sprite_delta[1][0][1]= 4*( r*sprite_ref[0][1] - virtual_ref[0][1]);
3883 s->sprite_delta[1][1][0]= 4*(-r*sprite_ref[0][1] + virtual_ref[0][1]);
3884 s->sprite_delta[1][1][1]= 4*(-r*sprite_ref[0][0] + virtual_ref[0][0]);
3885 s->sprite_shift[0][0]= alpha+rho;
3886 s->sprite_shift[0][1]= alpha+rho;
3887 s->sprite_shift[1][0]= alpha+rho+2;
3888 s->sprite_shift[1][1]= alpha+rho+2;
3893 /*printf("%d %d\n", s->sprite_delta[0][0][0], a<<s->sprite_shift[0][0]);
3894 printf("%d %d\n", s->sprite_delta[0][0][1], 0);
3895 printf("%d %d\n", s->sprite_delta[0][1][0], 0);
3896 printf("%d %d\n", s->sprite_delta[0][1][1], a<<s->sprite_shift[0][1]);
3897 printf("%d %d\n", s->sprite_delta[1][0][0], a<<s->sprite_shift[1][0]);
3898 printf("%d %d\n", s->sprite_delta[1][0][1], 0);
3899 printf("%d %d\n", s->sprite_delta[1][1][0], 0);
3900 printf("%d %d\n", s->sprite_delta[1][1][1], a<<s->sprite_shift[1][1]);*/
3901 /* try to simplify the situation */
3902 if( s->sprite_delta[0][0][0] == a<<s->sprite_shift[0][0]
3903 && s->sprite_delta[0][0][1] == 0
3904 && s->sprite_delta[0][1][0] == 0
3905 && s->sprite_delta[0][1][1] == a<<s->sprite_shift[0][1]
3906 && s->sprite_delta[1][0][0] == a<<s->sprite_shift[1][0]
3907 && s->sprite_delta[1][0][1] == 0
3908 && s->sprite_delta[1][1][0] == 0
3909 && s->sprite_delta[1][1][1] == a<<s->sprite_shift[1][1])
3911 s->sprite_offset[0][0]>>=s->sprite_shift[0][0];
3912 s->sprite_offset[0][1]>>=s->sprite_shift[0][1];
3913 s->sprite_offset[1][0]>>=s->sprite_shift[1][0];
3914 s->sprite_offset[1][1]>>=s->sprite_shift[1][1];
3915 s->sprite_delta[0][0][0]= a;
3916 s->sprite_delta[0][0][1]= 0;
3917 s->sprite_delta[0][1][0]= 0;
3918 s->sprite_delta[0][1][1]= a;
3919 s->sprite_delta[1][0][0]= a;
3920 s->sprite_delta[1][0][1]= 0;
3921 s->sprite_delta[1][1][0]= 0;
3922 s->sprite_delta[1][1][1]= a;
3923 s->sprite_shift[0][0]= 0;
3924 s->sprite_shift[0][1]= 0;
3925 s->sprite_shift[1][0]= 0;
3926 s->sprite_shift[1][1]= 0;
3927 s->real_sprite_warping_points=1;
3930 s->real_sprite_warping_points= s->num_sprite_warping_points;
3932 //printf("%d %d %d %d\n", d[0][0], d[0][1], s->sprite_offset[0][0], s->sprite_offset[0][1]);
3935 /* decode mpeg4 VOP header */
3936 int mpeg4_decode_picture_header(MpegEncContext * s)
3938 int time_incr, startcode, state, v;
3942 /* search next start code */
3943 align_get_bits(&s->gb);
3946 v = get_bits(&s->gb, 8);
3947 if (state == 0x000001) {
3948 state = ((state << 8) | v) & 0xffffff;
3952 state = ((state << 8) | v) & 0xffffff;
3953 if( get_bits_count(&s->gb) > s->gb.size*8-32){
3955 printf("no VOP startcode found, frame size was=%d\n", s->gb.size);
3958 printf("frame skip\n");
3959 return FRAME_SKIPED;
3963 //printf("startcode %X %d\n", startcode, get_bits_count(&s->gb));
3964 if (startcode == 0x120) { // Video Object Layer
3965 int width, height, vo_ver_id;
3968 skip_bits(&s->gb, 1); /* random access */
3969 s->vo_type= get_bits(&s->gb, 8);
3970 if (get_bits1(&s->gb) != 0) { /* is_ol_id */
3971 vo_ver_id = get_bits(&s->gb, 4); /* vo_ver_id */
3972 skip_bits(&s->gb, 3); /* vo_priority */
3976 //printf("vo type:%d\n",s->vo_type);
3977 s->aspect_ratio_info= get_bits(&s->gb, 4);
3978 if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
3979 s->aspected_width = get_bits(&s->gb, 8); // par_width
3980 s->aspected_height = get_bits(&s->gb, 8); // par_height
3983 if ((s->vol_control_parameters=get_bits1(&s->gb))) { /* vol control parameter */
3984 int chroma_format= get_bits(&s->gb, 2);
3985 if(chroma_format!=1){
3986 printf("illegal chroma format\n");
3988 s->low_delay= get_bits1(&s->gb);
3989 if(get_bits1(&s->gb)){ /* vbv parameters */
3990 get_bits(&s->gb, 15); /* first_half_bitrate */
3991 skip_bits1(&s->gb); /* marker */
3992 get_bits(&s->gb, 15); /* latter_half_bitrate */
3993 skip_bits1(&s->gb); /* marker */
3994 get_bits(&s->gb, 15); /* first_half_vbv_buffer_size */
3995 skip_bits1(&s->gb); /* marker */
3996 get_bits(&s->gb, 3); /* latter_half_vbv_buffer_size */
3997 get_bits(&s->gb, 11); /* first_half_vbv_occupancy */
3998 skip_bits1(&s->gb); /* marker */
3999 get_bits(&s->gb, 15); /* latter_half_vbv_occupancy */
4000 skip_bits1(&s->gb); /* marker */
4003 // set low delay flag only once so the smart? low delay detection wont be overriden
4004 if(s->picture_number==0)
4008 s->shape = get_bits(&s->gb, 2); /* vol shape */
4009 if(s->shape != RECT_SHAPE) printf("only rectangular vol supported\n");
4010 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
4011 printf("Gray shape not supported\n");
4012 skip_bits(&s->gb, 4); //video_object_layer_shape_extension
4015 skip_bits1(&s->gb); /* marker */
4017 s->time_increment_resolution = get_bits(&s->gb, 16);
4019 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
4020 if (s->time_increment_bits < 1)
4021 s->time_increment_bits = 1;
4022 skip_bits1(&s->gb); /* marker */
4024 if (get_bits1(&s->gb) != 0) { /* fixed_vop_rate */
4025 skip_bits(&s->gb, s->time_increment_bits);
4028 if (s->shape != BIN_ONLY_SHAPE) {
4029 if (s->shape == RECT_SHAPE) {
4030 skip_bits1(&s->gb); /* marker */
4031 width = get_bits(&s->gb, 13);
4032 skip_bits1(&s->gb); /* marker */
4033 height = get_bits(&s->gb, 13);
4034 skip_bits1(&s->gb); /* marker */
4035 if(width && height){ /* they should be non zero but who knows ... */
4038 // printf("width/height: %d %d\n", width, height);
4042 s->progressive_sequence= get_bits1(&s->gb)^1;
4043 if(!get_bits1(&s->gb)) printf("OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */
4044 if (vo_ver_id == 1) {
4045 s->vol_sprite_usage = get_bits1(&s->gb); /* vol_sprite_usage */
4047 s->vol_sprite_usage = get_bits(&s->gb, 2); /* vol_sprite_usage */
4049 if(s->vol_sprite_usage==STATIC_SPRITE) printf("Static Sprites not supported\n");
4050 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
4051 if(s->vol_sprite_usage==STATIC_SPRITE){
4052 s->sprite_width = get_bits(&s->gb, 13);
4053 skip_bits1(&s->gb); /* marker */
4054 s->sprite_height= get_bits(&s->gb, 13);
4055 skip_bits1(&s->gb); /* marker */
4056 s->sprite_left = get_bits(&s->gb, 13);
4057 skip_bits1(&s->gb); /* marker */
4058 s->sprite_top = get_bits(&s->gb, 13);
4059 skip_bits1(&s->gb); /* marker */
4061 s->num_sprite_warping_points= get_bits(&s->gb, 6);
4062 s->sprite_warping_accuracy = get_bits(&s->gb, 2);
4063 s->sprite_brightness_change= get_bits1(&s->gb);
4064 if(s->vol_sprite_usage==STATIC_SPRITE)
4065 s->low_latency_sprite= get_bits1(&s->gb);
4067 // FIXME sadct disable bit if verid!=1 && shape not rect
4069 if (get_bits1(&s->gb) == 1) { /* not_8_bit */
4070 s->quant_precision = get_bits(&s->gb, 4); /* quant_precision */
4071 if(get_bits(&s->gb, 4)!=8) printf("N-bit not supported\n"); /* bits_per_pixel */
4072 if(s->quant_precision!=5) printf("quant precission %d\n", s->quant_precision);
4074 s->quant_precision = 5;
4077 // FIXME a bunch of grayscale shape things
4079 if((s->mpeg_quant=get_bits1(&s->gb))){ /* vol_quant_type */
4082 /* load default matrixes */
4083 for(i=0; i<64; i++){
4084 v= ff_mpeg4_default_intra_matrix[i];
4085 s->intra_matrix[i]= v;
4086 s->chroma_intra_matrix[i]= v;
4088 v= ff_mpeg4_default_non_intra_matrix[i];
4089 s->inter_matrix[i]= v;
4090 s->chroma_inter_matrix[i]= v;
4093 /* load custom intra matrix */
4094 if(get_bits1(&s->gb)){
4095 for(i=0; i<64; i++){
4096 v= get_bits(&s->gb, 8);
4099 j= zigzag_direct[i];
4100 s->intra_matrix[j]= v;
4101 s->chroma_intra_matrix[j]= v;
4105 /* load custom non intra matrix */
4106 if(get_bits1(&s->gb)){
4107 for(i=0; i<64; i++){
4108 v= get_bits(&s->gb, 8);
4111 j= zigzag_direct[i];
4112 s->inter_matrix[j]= v;
4113 s->chroma_inter_matrix[j]= v;
4116 /* replicate last value */
4118 j= zigzag_direct[i];
4119 s->inter_matrix[j]= v;
4120 s->chroma_inter_matrix[j]= v;
4124 // FIXME a bunch of grayscale shape things
4128 s->quarter_sample= get_bits1(&s->gb);
4129 else s->quarter_sample=0;
4131 if(!get_bits1(&s->gb)) printf("Complexity estimation not supported\n");
4133 s->resync_marker= !get_bits1(&s->gb); /* resync_marker_disabled */
4135 s->data_partitioning= get_bits1(&s->gb);
4136 if(s->data_partitioning){
4137 s->rvlc= get_bits1(&s->gb);
4139 printf("reversible vlc not supported\n");
4143 if(vo_ver_id != 1) {
4144 s->new_pred= get_bits1(&s->gb);
4146 printf("new pred not supported\n");
4147 skip_bits(&s->gb, 2); /* requested upstream message type */
4148 skip_bits1(&s->gb); /* newpred segment type */
4150 s->reduced_res_vop= get_bits1(&s->gb);
4151 if(s->reduced_res_vop) printf("reduced resolution VOP not supported\n");
4155 s->reduced_res_vop= 0;
4158 s->scalability= get_bits1(&s->gb);
4160 if (s->scalability) {
4161 GetBitContext bak= s->gb;
4162 int dummy= s->hierachy_type= get_bits1(&s->gb);
4163 int ref_layer_id= get_bits(&s->gb, 4);
4164 int ref_layer_sampling_dir= get_bits1(&s->gb);
4165 int h_sampling_factor_n= get_bits(&s->gb, 5);
4166 int h_sampling_factor_m= get_bits(&s->gb, 5);
4167 int v_sampling_factor_n= get_bits(&s->gb, 5);
4168 int v_sampling_factor_m= get_bits(&s->gb, 5);
4169 s->enhancement_type= get_bits1(&s->gb);
4171 if( h_sampling_factor_n==0 || h_sampling_factor_m==0
4172 || v_sampling_factor_n==0 || v_sampling_factor_m==0 || s->workaround_bugs==1){
4174 // fprintf(stderr, "illegal scalability header (VERY broken encoder), trying to workaround\n");
4181 // bin shape stuff FIXME
4182 printf("scalability not supported\n");
4185 //printf("end Data %X %d\n", show_bits(&s->gb, 32), get_bits_count(&s->gb)&0x7);
4187 } else if (startcode == 0x1b2) { //userdata
4193 //printf("user Data %X\n", show_bits(&s->gb, 32));
4194 buf[0]= show_bits(&s->gb, 8);
4195 for(i=1; i<256; i++){
4196 buf[i]= show_bits(&s->gb, 16)&0xFF;
4197 if(buf[i]==0) break;
4198 skip_bits(&s->gb, 8);
4201 e=sscanf(buf, "DivX%dBuild%d", &ver, &build);
4203 e=sscanf(buf, "DivX%db%d", &ver, &build);
4205 s->divx_version= ver;
4206 s->divx_build= build;
4207 if(s->picture_number==0){
4208 printf("This file was encoded with DivX%d Build%d\n", ver, build);
4209 if(ver==500 && build==413){
4210 printf("WARNING: this version of DivX is not MPEG4 compatible, trying to workaround these bugs...\n");
4214 //printf("User Data: %s\n", buf);
4216 } else if (startcode != 0x1b6) { //VOP
4220 s->pict_type = get_bits(&s->gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */
4221 //if(s->pict_type!=I_TYPE) return FRAME_SKIPED;
4222 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0){
4223 printf("low_delay flag set, but shouldnt, clearing it\n");
4226 // printf("pic: %d, qpel:%d part:%d resync:%d\n", s->pict_type, s->quarter_sample, s->data_partitioning, s->resync_marker);
4228 if(s->time_increment_resolution==0){
4229 s->time_increment_resolution=1;
4230 // fprintf(stderr, "time_increment_resolution is illegal\n");
4233 while (get_bits1(&s->gb) != 0)
4236 check_marker(&s->gb, "before time_increment");
4237 time_increment= get_bits(&s->gb, s->time_increment_bits);
4238 //printf(" type:%d modulo_time_base:%d increment:%d\n", s->pict_type, time_incr, time_increment);
4239 if(s->pict_type!=B_TYPE){
4240 s->last_time_base= s->time_base;
4241 s->time_base+= time_incr;
4242 s->time= s->time_base*s->time_increment_resolution + time_increment;
4243 if(s->workaround_bugs==3 || s->avctx->fourcc == ff_get_fourcc("UMP4")){
4244 if(s->time < s->last_non_b_time){
4245 // fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaround\n");
4247 s->time+= s->time_increment_resolution;
4250 s->pp_time= s->time - s->last_non_b_time;
4251 s->last_non_b_time= s->time;
4253 s->time= (s->last_time_base + time_incr)*s->time_increment_resolution + time_increment;
4254 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
4255 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
4256 // printf("messed up order, seeking?, skiping current b frame\n");
4257 return FRAME_SKIPED;
4260 if(s->t_frame==0) s->t_frame= s->time - s->last_time_base;
4261 if(s->t_frame==0) s->t_frame=1; // 1/0 protection
4262 //printf("%Ld %Ld %d %d\n", s->last_non_b_time, s->time, s->pp_time, s->t_frame); fflush(stdout);
4263 s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame)
4264 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
4265 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame)
4266 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
4269 s->avctx->pts= s->time*1000LL*1000LL / s->time_increment_resolution;
4271 if(check_marker(&s->gb, "before vop_coded")==0 && s->picture_number==0){
4272 printf("hmm, seems the headers arnt complete, trying to guess time_increment_bits\n");
4273 for(s->time_increment_bits++ ;s->time_increment_bits<16; s->time_increment_bits++){
4274 if(get_bits1(&s->gb)) break;
4276 printf("my guess is %d bits ;)\n",s->time_increment_bits);
4279 if (get_bits1(&s->gb) != 1)
4281 //printf("time %d %d %d || %Ld %Ld %Ld\n", s->time_increment_bits, s->time_increment_resolution, s->time_base,
4282 //s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time);
4283 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE
4284 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
4285 /* rounding type for motion estimation */
4286 s->no_rounding = get_bits1(&s->gb);
4290 //FIXME reduced res stuff
4292 if (s->shape != RECT_SHAPE) {
4293 if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) {
4294 int width, height, hor_spat_ref, ver_spat_ref;
4296 width = get_bits(&s->gb, 13);
4297 skip_bits1(&s->gb); /* marker */
4298 height = get_bits(&s->gb, 13);
4299 skip_bits1(&s->gb); /* marker */
4300 hor_spat_ref = get_bits(&s->gb, 13); /* hor_spat_ref */
4301 skip_bits1(&s->gb); /* marker */
4302 ver_spat_ref = get_bits(&s->gb, 13); /* ver_spat_ref */
4304 skip_bits1(&s->gb); /* change_CR_disable */
4306 if (get_bits1(&s->gb) != 0) {
4307 skip_bits(&s->gb, 8); /* constant_alpha_value */
4310 //FIXME complexity estimation stuff
4312 if (s->shape != BIN_ONLY_SHAPE) {
4314 t=get_bits(&s->gb, 3); /* intra dc VLC threshold */
4315 //printf("threshold %d\n", t);
4316 if(!s->progressive_sequence){
4317 s->top_field_first= get_bits1(&s->gb);
4318 s->alternate_scan= get_bits1(&s->gb);
4320 s->alternate_scan= 0;
4323 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
4324 if(s->num_sprite_warping_points){
4325 mpeg4_decode_sprite_trajectory(s);
4327 if(s->sprite_brightness_change) printf("sprite_brightness_change not supported\n");
4328 if(s->vol_sprite_usage==STATIC_SPRITE) printf("static sprite not supported\n");
4331 if (s->shape != BIN_ONLY_SHAPE) {
4332 /* note: we do not use quant_precision to avoid problem if no
4333 MPEG4 vol header as it is found on some old opendivx
4335 s->qscale = get_bits(&s->gb, 5);
4337 printf("Error, header damaged or not MPEG4 header (qscale=0)\n");
4338 return -1; // makes no sense to continue, as there is nothing left from the image then
4341 if (s->pict_type != I_TYPE) {
4342 s->f_code = get_bits(&s->gb, 3); /* fcode_for */
4344 printf("Error, header damaged or not MPEG4 header (f_code=0)\n");
4345 return -1; // makes no sense to continue, as the MV decoding will break very quickly
4350 if (s->pict_type == B_TYPE) {
4351 s->b_code = get_bits(&s->gb, 3);
4355 printf("qp:%d fc:%d bc:%d type:%s size:%d pro:%d alt:%d top:%d qpel:%d part:%d resync:%d\n",
4356 s->qscale, s->f_code, s->b_code,
4357 s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")),
4358 s->gb.size,s->progressive_sequence, s->alternate_scan, s->top_field_first,
4359 s->quarter_sample, s->data_partitioning, s->resync_marker);
4361 if(!s->scalability){
4362 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {
4363 skip_bits1(&s->gb); // vop shape coding type
4366 if(s->enhancement_type){
4367 int load_backward_shape= get_bits1(&s->gb);
4368 if(load_backward_shape){
4369 printf("load backward shape isnt supported\n");
4372 skip_bits(&s->gb, 2); //ref_select_code
4375 /* detect buggy encoders which dont set the low_delay flag (divx4/xvid/opendivx)*/
4376 // note we cannot detect divx5 without b-frames easyly (allthough its buggy too)
4377 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
4378 printf("looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
4382 s->picture_number++; // better than pic number==0 allways ;)
4384 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
4385 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
4387 if(s->divx_version==0 || s->divx_version < 500){
4388 s->h_edge_pos= s->width;
4389 s->v_edge_pos= s->height;
4394 /* don't understand why they choose a different header ! */
4395 int intel_h263_decode_picture_header(MpegEncContext *s)
4399 /* picture header */
4400 if (get_bits(&s->gb, 22) != 0x20) {
4401 fprintf(stderr, "Bad picture start code\n");
4404 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
4406 if (get_bits1(&s->gb) != 1) {
4407 fprintf(stderr, "Bad marker\n");
4408 return -1; /* marker */
4410 if (get_bits1(&s->gb) != 0) {
4411 fprintf(stderr, "Bad H263 id\n");
4412 return -1; /* h263 id */
4414 skip_bits1(&s->gb); /* split screen off */
4415 skip_bits1(&s->gb); /* camera off */
4416 skip_bits1(&s->gb); /* freeze picture release off */
4418 format = get_bits(&s->gb, 3);
4420 fprintf(stderr, "Intel H263 free format not supported\n");
4425 s->pict_type = I_TYPE + get_bits1(&s->gb);
4427 s->unrestricted_mv = get_bits1(&s->gb);
4428 s->h263_long_vectors = s->unrestricted_mv;
4430 if (get_bits1(&s->gb) != 0) {
4431 fprintf(stderr, "SAC not supported\n");
4432 return -1; /* SAC: off */
4434 if (get_bits1(&s->gb) != 0) {
4435 fprintf(stderr, "Advanced Prediction Mode not supported\n");
4436 return -1; /* advanced prediction mode: off */
4438 if (get_bits1(&s->gb) != 0) {
4439 fprintf(stderr, "PB frame mode no supported\n");
4440 return -1; /* PB frame mode */
4443 /* skip unknown header garbage */
4444 skip_bits(&s->gb, 41);
4446 s->qscale = get_bits(&s->gb, 5);
4447 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
4450 while (get_bits1(&s->gb) != 0) {
4451 skip_bits(&s->gb, 8);