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>
28 * @brief h263/mpeg4 codec
36 #include "mpegvideo.h"
38 #include "mpeg4data.h"
44 #define PRINT_MB_TYPE(a) {}
46 #define PRINT_MB_TYPE(a) printf(a)
49 #define INTRA_MCBPC_VLC_BITS 6
50 #define INTER_MCBPC_VLC_BITS 6
51 #define CBPY_VLC_BITS 6
54 #define SPRITE_TRAJ_VLC_BITS 6
55 #define MB_TYPE_B_VLC_BITS 4
56 #define TEX_VLC_BITS 9
58 #ifdef CONFIG_ENCODERS
59 static void h263_encode_block(MpegEncContext * s, DCTELEM * block,
61 static void h263_encode_motion(MpegEncContext * s, int val, int fcode);
62 static void h263p_encode_umotion(MpegEncContext * s, int val);
63 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block,
64 int n, int dc, UINT8 *scan_table,
65 PutBitContext *dc_pb, PutBitContext *ac_pb);
68 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode);
69 static int h263p_decode_umotion(MpegEncContext * s, int pred);
70 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
72 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
73 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
74 int n, int coded, int intra);
75 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr);
76 static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
78 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s);
79 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr);
81 extern UINT32 inverse[256];
83 static UINT8 uni_DCtab_lum_len[512];
84 static UINT8 uni_DCtab_chrom_len[512];
85 static UINT16 uni_DCtab_lum_bits[512];
86 static UINT16 uni_DCtab_chrom_bits[512];
88 #ifdef CONFIG_ENCODERS
89 static UINT16 (*mv_penalty)[MAX_MV*2+1]= NULL;
90 static UINT8 fcode_tab[MAX_MV*2+1];
91 static UINT8 umv_fcode_tab[MAX_MV*2+1];
93 static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2];
94 static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2];
95 static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2];
96 static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2];
97 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
98 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
99 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
113 int h263_get_picture_format(int width, int height)
117 if (width == 128 && height == 96)
119 else if (width == 176 && height == 144)
121 else if (width == 352 && height == 288)
123 else if (width == 704 && height == 576)
125 else if (width == 1408 && height == 1152)
132 static void float_aspect_to_info(MpegEncContext * s, float aspect){
135 aspect*= s->height/(double)s->width;
136 //printf("%f\n", aspect);
138 if(aspect==0) aspect= 1.0;
140 ff_float2fraction(&s->aspected_width, &s->aspected_height, aspect, 255);
142 //printf("%d %d\n", s->aspected_width, s->aspected_height);
144 if(s->aspected_width == pixel_aspect[i][0] && s->aspected_height== pixel_aspect[i][1]){
145 s->aspect_ratio_info=i;
150 s->aspect_ratio_info= FF_ASPECT_EXTENDED;
153 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
157 align_put_bits(&s->pb);
159 /* Update the pointer to last GOB */
160 s->ptr_lastgob = pbBufPtr(&s->pb);
163 put_bits(&s->pb, 22, 0x20); /* PSC */
164 put_bits(&s->pb, 8, (((INT64)s->picture_number * 30 * FRAME_RATE_BASE) /
165 s->frame_rate) & 0xff);
167 put_bits(&s->pb, 1, 1); /* marker */
168 put_bits(&s->pb, 1, 0); /* h263 id */
169 put_bits(&s->pb, 1, 0); /* split screen off */
170 put_bits(&s->pb, 1, 0); /* camera off */
171 put_bits(&s->pb, 1, 0); /* freeze picture release off */
173 format = h263_get_picture_format(s->width, s->height);
176 put_bits(&s->pb, 3, format);
177 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
178 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
179 of H.263v1 UMV implies to check the predicted MV after
180 calculation of the current MB to see if we're on the limits */
181 put_bits(&s->pb, 1, 0); /* unrestricted motion vector: off */
182 put_bits(&s->pb, 1, 0); /* SAC: off */
183 put_bits(&s->pb, 1, 0); /* advanced prediction mode: off */
184 put_bits(&s->pb, 1, 0); /* not PB frame */
185 put_bits(&s->pb, 5, s->qscale);
186 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
189 /* H.263 Plus PTYPE */
190 put_bits(&s->pb, 3, 7);
191 put_bits(&s->pb,3,1); /* Update Full Extended PTYPE */
193 put_bits(&s->pb,3,6); /* Custom Source Format */
195 put_bits(&s->pb, 3, format);
197 put_bits(&s->pb,1,0); /* Custom PCF: off */
198 s->umvplus = (s->pict_type == P_TYPE) && s->unrestricted_mv;
199 put_bits(&s->pb, 1, s->umvplus); /* Unrestricted Motion Vector */
200 put_bits(&s->pb,1,0); /* SAC: off */
201 put_bits(&s->pb,1,0); /* Advanced Prediction Mode: off */
202 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
203 put_bits(&s->pb,1,0); /* Deblocking Filter: off */
204 put_bits(&s->pb,1,0); /* Slice Structured: off */
205 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
206 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
207 put_bits(&s->pb,1,0); /* Alternative Inter VLC: off */
208 put_bits(&s->pb,1,0); /* Modified Quantization: off */
209 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
210 put_bits(&s->pb,3,0); /* Reserved */
212 put_bits(&s->pb, 3, s->pict_type == P_TYPE);
214 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
215 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
216 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
217 put_bits(&s->pb,2,0); /* Reserved */
218 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
220 /* This should be here if PLUSPTYPE */
221 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
224 /* Custom Picture Format (CPFMT) */
225 float_aspect_to_info(s, s->avctx->aspect_ratio);
227 put_bits(&s->pb,4,s->aspect_ratio_info);
228 put_bits(&s->pb,9,(s->width >> 2) - 1);
229 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
230 put_bits(&s->pb,9,(s->height >> 2));
231 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED)
233 put_bits(&s->pb, 8, s->aspected_width);
234 put_bits(&s->pb, 8, s->aspected_height);
238 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
240 put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
241 put_bits(&s->pb, 5, s->qscale);
244 put_bits(&s->pb, 1, 0); /* no PEI */
248 s->c_dc_scale_table= h263_aic_dc_scale_table;
251 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
256 * Encodes a group of blocks header.
258 int h263_encode_gob_header(MpegEncContext * s, int mb_line)
260 align_put_bits(&s->pb);
261 flush_put_bits(&s->pb);
262 /* Call the RTP callback to send the last GOB */
263 if (s->rtp_callback) {
264 int pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
265 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
267 put_bits(&s->pb, 17, 1); /* GBSC */
268 s->gob_number = mb_line / s->gob_index;
269 put_bits(&s->pb, 5, s->gob_number); /* GN */
270 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
271 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
272 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
276 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6])
278 int score0=0, score1=0;
280 int8_t * const qscale_table= s->current_picture.qscale_table;
283 INT16 *ac_val, *ac_val1;
285 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
288 const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width;
290 ac_val-= s->block_wrap[n]*16;
291 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
294 const int level= block[n][s->idct_permutation[i ]];
296 score1+= ABS(level - ac_val[i+8]);
297 ac_val1[i ]= block[n][s->idct_permutation[i<<3]];
301 /* different qscale, we must rescale */
303 const int level= block[n][s->idct_permutation[i ]];
305 score1+= ABS(level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale));
306 ac_val1[i ]= block[n][s->idct_permutation[i<<3]];
311 const int xy= s->mb_x-1 + s->mb_y*s->mb_width;
312 /* left prediction */
314 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
317 const int level= block[n][s->idct_permutation[i<<3]];
319 score1+= ABS(level - ac_val[i]);
321 ac_val1[i+8]= block[n][s->idct_permutation[i ]];
324 /* different qscale, we must rescale */
326 const int level= block[n][s->idct_permutation[i<<3]];
328 score1+= ABS(level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale));
330 ac_val1[i+8]= block[n][s->idct_permutation[i ]];
336 return score0 > score1 ? 1 : 0;
340 * modify qscale so that encoding is acually possible in h263 (limit difference to -2..2)
342 void ff_clean_h263_qscales(MpegEncContext *s){
344 int8_t * const qscale_table= s->current_picture.qscale_table;
346 for(i=1; i<s->mb_num; i++){
347 if(qscale_table[i] - qscale_table[i-1] >2)
348 qscale_table[i]= qscale_table[i-1]+2;
350 for(i=s->mb_num-2; i>=0; i--){
351 if(qscale_table[i] - qscale_table[i+1] >2)
352 qscale_table[i]= qscale_table[i+1]+2;
357 * modify mb_type & qscale so that encoding is acually possible in mpeg4
359 void ff_clean_mpeg4_qscales(MpegEncContext *s){
361 int8_t * const qscale_table= s->current_picture.qscale_table;
363 ff_clean_h263_qscales(s);
365 for(i=1; i<s->mb_num; i++){
366 if(qscale_table[i] != qscale_table[i-1] && (s->mb_type[i]&MB_TYPE_INTER4V)){
367 s->mb_type[i]&= ~MB_TYPE_INTER4V;
368 s->mb_type[i]|= MB_TYPE_INTER;
372 if(s->pict_type== B_TYPE){
374 /* ok, come on, this isnt funny anymore, theres more code for handling this mpeg4 mess than
375 for the actual adaptive quantization */
377 for(i=0; i<s->mb_num; i++){
378 odd += qscale_table[i]&1;
381 if(2*odd > s->mb_num) odd=1;
384 for(i=0; i<s->mb_num; i++){
385 if((qscale_table[i]&1) != odd)
387 if(qscale_table[i] > 31)
391 for(i=1; i<s->mb_num; i++){
392 if(qscale_table[i] != qscale_table[i-1] && (s->mb_type[i]&MB_TYPE_DIRECT)){
393 s->mb_type[i]&= ~MB_TYPE_DIRECT;
394 s->mb_type[i]|= MB_TYPE_BIDIR;
400 void ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){
401 const int mb_index= s->mb_x + s->mb_y*s->mb_width;
402 int xy= s->block_index[0];
403 uint16_t time_pp= s->pp_time;
404 uint16_t time_pb= s->pb_time;
407 //FIXME avoid divides
408 switch(s->co_located_type_table[mb_index]){
410 s->mv_type= MV_TYPE_16X16;
411 s->mv[0][0][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
412 s->mv[0][0][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
413 s->mv[1][0][0] = mx ? s->mv[0][0][0] - s->motion_val[xy][0]
414 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
415 s->mv[1][0][1] = my ? s->mv[0][0][1] - s->motion_val[xy][1]
416 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
418 case CO_LOCATED_TYPE_4MV:
419 s->mv_type = MV_TYPE_8X8;
421 xy= s->block_index[i];
422 s->mv[0][i][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
423 s->mv[0][i][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
424 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->motion_val[xy][0]
425 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
426 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->motion_val[xy][1]
427 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
430 case CO_LOCATED_TYPE_FIELDMV:
431 s->mv_type = MV_TYPE_FIELD;
433 if(s->top_field_first){
434 time_pp= s->pp_field_time - s->field_select_table[mb_index][i] + i;
435 time_pb= s->pb_field_time - s->field_select_table[mb_index][i] + i;
437 time_pp= s->pp_field_time + s->field_select_table[mb_index][i] - i;
438 time_pb= s->pb_field_time + s->field_select_table[mb_index][i] - i;
440 s->mv[0][i][0] = s->field_mv_table[mb_index][i][0]*time_pb/time_pp + mx;
441 s->mv[0][i][1] = s->field_mv_table[mb_index][i][1]*time_pb/time_pp + my;
442 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->field_mv_table[mb_index][i][0]
443 : s->field_mv_table[mb_index][i][0]*(time_pb - time_pp)/time_pp;
444 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->field_mv_table[mb_index][i][1]
445 : s->field_mv_table[mb_index][i][1]*(time_pb - time_pp)/time_pp;
451 #ifdef CONFIG_ENCODERS
452 void mpeg4_encode_mb(MpegEncContext * s,
453 DCTELEM block[6][64],
454 int motion_x, int motion_y)
456 int cbpc, cbpy, i, pred_x, pred_y;
458 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
459 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=B_TYPE ? &s->tex_pb : &s->pb;
460 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=I_TYPE ? &s->pb2 : &s->pb;
461 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
462 const int dquant_code[5]= {1,0,9,2,3};
464 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
468 for (i = 0; i < 6; i++) {
469 if (s->block_last_index[i] >= 0)
473 if(s->pict_type==B_TYPE){
474 static const int mb_type_table[8]= {-1, 2, 3, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
475 int mb_type= mb_type_table[s->mv_dir];
481 s->last_mv[1][0][1]= 0;
484 assert(s->dquant>=-2 && s->dquant<=2);
485 assert((s->dquant&1)==0);
488 /* nothing to do if this MB was skiped in the next P Frame */
489 if(s->next_picture.mbskip_table[s->mb_y * s->mb_width + s->mb_x]){ //FIXME avoid DCT & ...
495 s->mv_dir= MV_DIR_FORWARD; //doesnt matter
496 s->qscale -= s->dquant;
502 if ((cbp | motion_x | motion_y | mb_type) ==0) {
503 /* direct MB with MV={0,0} */
504 assert(s->dquant==0);
506 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
508 if(interleaved_stats){
516 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
517 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
518 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we dont need it :)
519 if(cbp) put_bits(&s->pb, 6, cbp);
523 put_bits(&s->pb, 2, (s->dquant>>2)+3);
525 put_bits(&s->pb, 1, 0);
527 s->qscale -= s->dquant;
529 if(!s->progressive_sequence){
531 put_bits(&s->pb, 1, s->interlaced_dct);
532 if(mb_type) // not diect mode
533 put_bits(&s->pb, 1, 0); // no interlaced ME yet
536 if(interleaved_stats){
537 bits= get_bit_count(&s->pb);
538 s->misc_bits+= bits - s->last_bits;
545 h263_encode_motion(s, motion_x, 1);
546 h263_encode_motion(s, motion_y, 1);
551 h263_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code);
552 h263_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
553 h263_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code);
554 h263_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
555 s->last_mv[0][0][0]= s->mv[0][0][0];
556 s->last_mv[0][0][1]= s->mv[0][0][1];
557 s->last_mv[1][0][0]= s->mv[1][0][0];
558 s->last_mv[1][0][1]= s->mv[1][0][1];
562 case 2: /* backward */
563 h263_encode_motion(s, motion_x - s->last_mv[1][0][0], s->b_code);
564 h263_encode_motion(s, motion_y - s->last_mv[1][0][1], s->b_code);
565 s->last_mv[1][0][0]= motion_x;
566 s->last_mv[1][0][1]= motion_y;
569 case 3: /* forward */
570 h263_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);
571 h263_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);
572 s->last_mv[0][0][0]= motion_x;
573 s->last_mv[0][0][1]= motion_y;
577 printf("unknown mb type\n");
581 if(interleaved_stats){
582 bits= get_bit_count(&s->pb);
583 s->mv_bits+= bits - s->last_bits;
587 /* encode each block */
588 for (i = 0; i < 6; i++) {
589 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, NULL, &s->pb);
592 if(interleaved_stats){
593 bits= get_bit_count(&s->pb);
594 s->p_tex_bits+= bits - s->last_bits;
597 }else{ /* s->pict_type==B_TYPE */
598 if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
599 /* check if the B frames can skip it too, as we must skip it if we skip here
600 why didnt they just compress the skip-mb bits instead of reusing them ?! */
601 if(s->max_b_frames>0){
608 if(x+16 > s->width) x= s->width-16;
609 if(y+16 > s->height) y= s->height-16;
611 offset= x + y*s->linesize;
612 p_pic= s->new_picture.data[0] + offset;
615 for(i=0; i<s->max_b_frames; i++){
618 Picture *pic= s->reordered_input_picture[i+1];
620 if(pic==NULL || pic->pict_type!=B_TYPE) break;
622 b_pic= pic->data[0] + offset + 16; //FIXME +16
623 diff= s->dsp.pix_abs16x16(p_pic, b_pic, s->linesize);
624 if(diff>s->qscale*70){ //FIXME check that 70 is optimal
633 /* skip macroblock */
634 put_bits(&s->pb, 1, 1);
636 if(interleaved_stats){
645 put_bits(&s->pb, 1, 0); /* mb coded */
646 if(s->mv_type==MV_TYPE_16X16){
648 if(s->dquant) cbpc+= 8;
650 inter_MCBPC_bits[cbpc],
651 inter_MCBPC_code[cbpc]);
655 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
657 put_bits(pb2, 2, dquant_code[s->dquant+2]);
659 if(!s->progressive_sequence){
661 put_bits(pb2, 1, s->interlaced_dct);
662 put_bits(pb2, 1, 0); // no interlaced ME yet
665 if(interleaved_stats){
666 bits= get_bit_count(&s->pb);
667 s->misc_bits+= bits - s->last_bits;
671 /* motion vectors: 16x16 mode */
672 h263_pred_motion(s, 0, &pred_x, &pred_y);
674 h263_encode_motion(s, motion_x - pred_x, s->f_code);
675 h263_encode_motion(s, motion_y - pred_y, s->f_code);
679 inter_MCBPC_bits[cbpc],
680 inter_MCBPC_code[cbpc]);
683 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
685 if(!s->progressive_sequence){
687 put_bits(pb2, 1, s->interlaced_dct);
690 if(interleaved_stats){
691 bits= get_bit_count(&s->pb);
692 s->misc_bits+= bits - s->last_bits;
697 /* motion vectors: 8x8 mode*/
698 h263_pred_motion(s, i, &pred_x, &pred_y);
700 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][0] - pred_x, s->f_code);
701 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][1] - pred_y, s->f_code);
705 if(interleaved_stats){
706 bits= get_bit_count(&s->pb);
707 s->mv_bits+= bits - s->last_bits;
711 /* encode each block */
712 for (i = 0; i < 6; i++) {
713 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, NULL, tex_pb);
716 if(interleaved_stats){
717 bits= get_bit_count(&s->pb);
718 s->p_tex_bits+= bits - s->last_bits;
725 int dc_diff[6]; //dc values with the dc prediction subtracted
726 int dir[6]; //prediction direction
727 int zigzag_last_index[6];
728 UINT8 *scan_table[6];
731 const int level= block[i][0];
734 dc_diff[i]= level - ff_mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]);
736 *dc_ptr = level * s->y_dc_scale;
738 *dc_ptr = level * s->c_dc_scale;
742 s->ac_pred= decide_ac_pred(s, block, dir);
749 mpeg4_inv_pred_ac(s, block[i], i, dir[i]);
750 if (dir[i]==0) st = s->intra_v_scantable.permutated; /* left */
751 else st = s->intra_h_scantable.permutated; /* top */
753 for(last_index=63; last_index>=0; last_index--) //FIXME optimize
754 if(block[i][st[last_index]]) break;
755 zigzag_last_index[i]= s->block_last_index[i];
756 s->block_last_index[i]= last_index;
761 scan_table[i]= s->intra_scantable.permutated;
766 for (i = 0; i < 6; i++) {
767 if (s->block_last_index[i] >= 1)
772 if (s->pict_type == I_TYPE) {
773 if(s->dquant) cbpc+=4;
775 intra_MCBPC_bits[cbpc],
776 intra_MCBPC_code[cbpc]);
778 if(s->dquant) cbpc+=8;
779 put_bits(&s->pb, 1, 0); /* mb coded */
781 inter_MCBPC_bits[cbpc + 4],
782 inter_MCBPC_code[cbpc + 4]);
784 put_bits(pb2, 1, s->ac_pred);
786 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
788 put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
790 if(!s->progressive_sequence){
791 put_bits(dc_pb, 1, s->interlaced_dct);
794 if(interleaved_stats){
795 bits= get_bit_count(&s->pb);
796 s->misc_bits+= bits - s->last_bits;
800 /* encode each block */
801 for (i = 0; i < 6; i++) {
802 mpeg4_encode_block(s, block[i], i, dc_diff[i], scan_table[i], dc_pb, tex_pb);
805 if(interleaved_stats){
806 bits= get_bit_count(&s->pb);
807 s->i_tex_bits+= bits - s->last_bits;
812 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
818 ac_val = s->ac_val[0][0] + s->block_index[i] * 16;
822 block[i][s->idct_permutation[j ]]= ac_val[j+8];
825 block[i][s->idct_permutation[j<<3]]= ac_val[j ];
827 s->block_last_index[i]= zigzag_last_index[i];
833 void h263_encode_mb(MpegEncContext * s,
834 DCTELEM block[6][64],
835 int motion_x, int motion_y)
837 int cbpc, cbpy, i, cbp, pred_x, pred_y;
839 INT16 rec_intradc[6];
841 const int dquant_code[5]= {1,0,9,2,3};
843 //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
847 for (i = 0; i < 6; i++) {
848 if (s->block_last_index[i] >= 0)
851 if ((cbp | motion_x | motion_y | s->dquant) == 0) {
852 /* skip macroblock */
853 put_bits(&s->pb, 1, 1);
856 put_bits(&s->pb, 1, 0); /* mb coded */
858 if(s->dquant) cbpc+= 8;
860 inter_MCBPC_bits[cbpc],
861 inter_MCBPC_code[cbpc]);
864 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
866 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
868 /* motion vectors: 16x16 mode only now */
869 h263_pred_motion(s, 0, &pred_x, &pred_y);
872 h263_encode_motion(s, motion_x - pred_x, s->f_code);
873 h263_encode_motion(s, motion_y - pred_y, s->f_code);
876 h263p_encode_umotion(s, motion_x - pred_x);
877 h263p_encode_umotion(s, motion_y - pred_y);
878 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
879 /* To prevent Start Code emulation */
880 put_bits(&s->pb,1,1);
883 int li = s->h263_aic ? 0 : 1;
888 if (s->h263_aic && s->mb_intra) {
889 INT16 level = block[i][0];
891 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
895 level = (level + (s->qscale >> 1))/(s->y_dc_scale);
897 level = (level - (s->qscale >> 1))/(s->y_dc_scale);
899 /* AIC can change CBP */
900 if (level == 0 && s->block_last_index[i] == 0)
901 s->block_last_index[i] = -1;
902 else if (level < -127)
904 else if (level > 127)
909 rec_intradc[i] = (s->y_dc_scale*level) + pred_dc;
912 //if ((rec_intradc[i] % 2) == 0)
915 if (rec_intradc[i] < 0)
917 else if (rec_intradc[i] > 2047)
918 rec_intradc[i] = 2047;
920 /* Update AC/DC tables */
921 *dc_ptr[i] = rec_intradc[i];
924 if (s->block_last_index[i] >= li)
929 if (s->pict_type == I_TYPE) {
930 if(s->dquant) cbpc+=4;
932 intra_MCBPC_bits[cbpc],
933 intra_MCBPC_code[cbpc]);
935 if(s->dquant) cbpc+=8;
936 put_bits(&s->pb, 1, 0); /* mb coded */
938 inter_MCBPC_bits[cbpc + 4],
939 inter_MCBPC_code[cbpc + 4]);
942 /* XXX: currently, we do not try to use ac prediction */
943 put_bits(&s->pb, 1, 0); /* no AC prediction */
946 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
948 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
952 /* encode each block */
953 h263_encode_block(s, block[i], i);
955 /* Update INTRADC for decoding */
956 if (s->h263_aic && s->mb_intra) {
957 block[i][0] = rec_intradc[i];
964 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr)
966 int x, y, wrap, a, c, pred_dc, scale;
967 INT16 *dc_val, *ac_val;
969 /* find prediction */
971 x = 2 * s->mb_x + 1 + (n & 1);
972 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
973 wrap = s->mb_width * 2 + 2;
974 dc_val = s->dc_val[0];
975 ac_val = s->ac_val[0][0];
976 scale = s->y_dc_scale;
980 wrap = s->mb_width + 2;
981 dc_val = s->dc_val[n - 4 + 1];
982 ac_val = s->ac_val[n - 4 + 1][0];
983 scale = s->c_dc_scale;
988 a = dc_val[(x - 1) + (y) * wrap];
989 c = dc_val[(x) + (y - 1) * wrap];
991 /* No prediction outside GOB boundary */
992 if (s->first_slice_line && ((n < 2) || (n > 3)))
995 /* just DC prediction */
996 if (a != 1024 && c != 1024)
997 pred_dc = (a + c) >> 1;
1003 /* we assume pred is positive */
1004 //pred_dc = (pred_dc + (scale >> 1)) / scale;
1005 *dc_val_ptr = &dc_val[x + y * wrap];
1010 void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n)
1012 int x, y, wrap, a, c, pred_dc, scale, i;
1013 INT16 *dc_val, *ac_val, *ac_val1;
1015 /* find prediction */
1017 x = 2 * s->mb_x + 1 + (n & 1);
1018 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
1019 wrap = s->mb_width * 2 + 2;
1020 dc_val = s->dc_val[0];
1021 ac_val = s->ac_val[0][0];
1022 scale = s->y_dc_scale;
1026 wrap = s->mb_width + 2;
1027 dc_val = s->dc_val[n - 4 + 1];
1028 ac_val = s->ac_val[n - 4 + 1][0];
1029 scale = s->c_dc_scale;
1032 ac_val += ((y) * wrap + (x)) * 16;
1038 a = dc_val[(x - 1) + (y) * wrap];
1039 c = dc_val[(x) + (y - 1) * wrap];
1041 /* No prediction outside GOB boundary */
1042 if (s->first_slice_line && ((n < 2) || (n > 3)))
1046 if (s->h263_aic_dir) {
1047 /* left prediction */
1051 block[s->idct_permutation[i<<3]] += ac_val[i];
1056 /* top prediction */
1058 ac_val -= 16 * wrap;
1060 block[s->idct_permutation[i ]] += ac_val[i + 8];
1066 /* just DC prediction */
1067 if (a != 1024 && c != 1024)
1068 pred_dc = (a + c) >> 1;
1075 /* we assume pred is positive */
1076 block[0]=block[0]*scale + pred_dc;
1080 else if (!(block[0] & 1))
1083 /* Update AC/DC tables */
1084 dc_val[(x) + (y) * wrap] = block[0];
1088 ac_val1[i ] = block[s->idct_permutation[i<<3]];
1091 ac_val1[8 + i] = block[s->idct_permutation[i ]];
1094 INT16 *h263_pred_motion(MpegEncContext * s, int block,
1098 INT16 *A, *B, *C, *mot_val;
1099 static const int off[4]= {2, 1, 1, -1};
1101 wrap = s->block_wrap[0];
1102 xy = s->block_index[block];
1104 mot_val = s->motion_val[xy];
1106 A = s->motion_val[xy - 1];
1107 /* special case for first (slice) line */
1108 if (s->first_slice_line && block<3) {
1109 // we cant just change some MVs to simulate that as we need them for the B frames (and ME)
1110 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
1111 if(block==0){ //most common case
1112 if(s->mb_x == s->resync_mb_x){ //rare
1114 }else if(s->mb_x + 1 == s->resync_mb_x){ //rare
1115 C = s->motion_val[xy + off[block] - wrap];
1120 *px = mid_pred(A[0], 0, C[0]);
1121 *py = mid_pred(A[1], 0, C[1]);
1128 if(s->mb_x + 1 == s->resync_mb_x){ //rare
1129 C = s->motion_val[xy + off[block] - wrap];
1130 *px = mid_pred(A[0], 0, C[0]);
1131 *py = mid_pred(A[1], 0, C[1]);
1136 }else{ /* block==2*/
1137 B = s->motion_val[xy - wrap];
1138 C = s->motion_val[xy + off[block] - wrap];
1139 if(s->mb_x == s->resync_mb_x) //rare
1142 *px = mid_pred(A[0], B[0], C[0]);
1143 *py = mid_pred(A[1], B[1], C[1]);
1146 B = s->motion_val[xy - wrap];
1147 C = s->motion_val[xy + off[block] - wrap];
1148 *px = mid_pred(A[0], B[0], C[0]);
1149 *py = mid_pred(A[1], B[1], C[1]);
1154 #ifdef CONFIG_ENCODERS
1155 static void h263_encode_motion(MpegEncContext * s, int val, int f_code)
1157 int range, l, bit_size, sign, code, bits;
1162 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1164 bit_size = f_code - 1;
1165 range = 1 << bit_size;
1166 /* modulo encoding */
1173 val= (val^sign)-sign;
1178 } else if (val >= l) {
1182 assert(val>=-l && val<l);
1192 code = (val >> bit_size) + 1;
1193 bits = val & (range - 1);
1195 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1197 put_bits(&s->pb, bit_size, bits);
1203 /* Encode MV differences on H.263+ with Unrestricted MV mode */
1204 static void h263p_encode_umotion(MpegEncContext * s, int val)
1214 put_bits(&s->pb, 1, 1);
1216 put_bits(&s->pb, 3, 0);
1218 put_bits(&s->pb, 3, 2);
1221 sval = ((val < 0) ? (short)(-val):(short)val);
1224 while (temp_val != 0) {
1225 temp_val = temp_val >> 1;
1231 tcode = (sval & (1 << (i-1))) >> (i-1);
1232 tcode = (tcode << 1) | 1;
1233 code = (code << 2) | tcode;
1236 code = ((code << 1) | (val < 0)) << 1;
1237 put_bits(&s->pb, (2*n_bits)+1, code);
1238 //printf("\nVal = %d\tCode = %d", sval, code);
1242 static void init_mv_penalty_and_fcode(MpegEncContext *s)
1247 if(mv_penalty==NULL)
1248 mv_penalty= av_mallocz( sizeof(UINT16)*(MAX_FCODE+1)*(2*MAX_MV+1) );
1250 for(f_code=1; f_code<=MAX_FCODE; f_code++){
1251 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
1254 if(mv==0) len= mvtab[0][1];
1256 int val, bit_size, range, code;
1258 bit_size = s->f_code - 1;
1259 range = 1 << bit_size;
1265 code = (val >> bit_size) + 1;
1267 len= mvtab[code][1] + 1 + bit_size;
1269 len= mvtab[32][1] + 2 + bit_size;
1273 mv_penalty[f_code][mv+MAX_MV]= len;
1277 for(f_code=MAX_FCODE; f_code>0; f_code--){
1278 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
1279 fcode_tab[mv+MAX_MV]= f_code;
1283 for(mv=0; mv<MAX_MV*2+1; mv++){
1284 umv_fcode_tab[mv]= 1;
1289 static void init_uni_dc_tab(void)
1291 int level, uni_code, uni_len;
1293 for(level=-256; level<256; level++){
1295 /* find number of bits */
1304 l= (-level) ^ ((1 << size) - 1);
1309 uni_code= DCtab_lum[size][0];
1310 uni_len = DCtab_lum[size][1];
1313 uni_code<<=size; uni_code|=l;
1316 uni_code<<=1; uni_code|=1;
1320 uni_DCtab_lum_bits[level+256]= uni_code;
1321 uni_DCtab_lum_len [level+256]= uni_len;
1324 uni_code= DCtab_chrom[size][0];
1325 uni_len = DCtab_chrom[size][1];
1328 uni_code<<=size; uni_code|=l;
1331 uni_code<<=1; uni_code|=1;
1335 uni_DCtab_chrom_bits[level+256]= uni_code;
1336 uni_DCtab_chrom_len [level+256]= uni_len;
1341 #ifdef CONFIG_ENCODERS
1342 static void init_uni_mpeg4_rl_tab(RLTable *rl, UINT32 *bits_tab, UINT8 *len_tab){
1343 int slevel, run, last;
1345 assert(MAX_LEVEL >= 64);
1346 assert(MAX_RUN >= 63);
1348 for(slevel=-64; slevel<64; slevel++){
1349 if(slevel==0) continue;
1350 for(run=0; run<64; run++){
1351 for(last=0; last<=1; last++){
1352 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1353 int level= slevel < 0 ? -slevel : slevel;
1354 int sign= slevel < 0 ? 1 : 0;
1355 int bits, len, code;
1358 len_tab[index]= 100;
1361 code= get_rl_index(rl, last, run, level);
1362 bits= rl->table_vlc[code][0];
1363 len= rl->table_vlc[code][1];
1364 bits=bits*2+sign; len++;
1366 if(code!=rl->n && len < len_tab[index]){
1367 bits_tab[index]= bits;
1368 len_tab [index]= len;
1372 bits= rl->table_vlc[rl->n][0];
1373 len= rl->table_vlc[rl->n][1];
1374 bits=bits*2; len++; //esc1
1375 level1= level - rl->max_level[last][run];
1377 code= get_rl_index(rl, last, run, level1);
1378 bits<<= rl->table_vlc[code][1];
1379 len += rl->table_vlc[code][1];
1380 bits += rl->table_vlc[code][0];
1381 bits=bits*2+sign; len++;
1383 if(code!=rl->n && len < len_tab[index]){
1384 bits_tab[index]= bits;
1385 len_tab [index]= len;
1391 bits= rl->table_vlc[rl->n][0];
1392 len= rl->table_vlc[rl->n][1];
1393 bits=bits*4+2; len+=2; //esc2
1394 run1 = run - rl->max_run[last][level] - 1;
1396 code= get_rl_index(rl, last, run1, level);
1397 bits<<= rl->table_vlc[code][1];
1398 len += rl->table_vlc[code][1];
1399 bits += rl->table_vlc[code][0];
1400 bits=bits*2+sign; len++;
1402 if(code!=rl->n && len < len_tab[index]){
1403 bits_tab[index]= bits;
1404 len_tab [index]= len;
1409 bits= rl->table_vlc[rl->n][0];
1410 len = rl->table_vlc[rl->n][1];
1411 bits=bits*4+3; len+=2; //esc3
1412 bits=bits*2+last; len++;
1413 bits=bits*64+run; len+=6;
1414 bits=bits*2+1; len++; //marker
1415 bits=bits*4096+(slevel&0xfff); len+=12;
1416 bits=bits*2+1; len++; //marker
1418 if(len < len_tab[index]){
1419 bits_tab[index]= bits;
1420 len_tab [index]= len;
1427 void h263_encode_init(MpegEncContext *s)
1429 static int done = 0;
1438 init_rl(&rl_intra_aic);
1440 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
1441 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
1443 init_mv_penalty_and_fcode(s);
1445 s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
1447 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
1448 switch(s->codec_id){
1449 case CODEC_ID_MPEG4:
1450 s->fcode_tab= fcode_tab;
1451 s->min_qcoeff= -2048;
1452 s->max_qcoeff= 2047;
1453 s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len;
1454 s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64;
1455 s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len;
1456 s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64;
1457 s->luma_dc_vlc_length= uni_DCtab_lum_len;
1458 s->chroma_dc_vlc_length= uni_DCtab_chrom_len;
1459 s->ac_esc_length= 7+2+1+6+1+12+1;
1461 case CODEC_ID_H263P:
1462 s->fcode_tab= umv_fcode_tab;
1463 s->min_qcoeff= -128;
1466 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
1467 default: //nothing needed default table allready set in mpegvideo.c
1468 s->min_qcoeff= -128;
1470 s->y_dc_scale_table=
1471 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
1475 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
1476 s->inter_quant_bias= 0;
1478 s->intra_quant_bias=0;
1479 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
1484 * encodes a 8x8 block.
1485 * @param block the 8x8 block
1486 * @param n block index (0-3 are luma, 4-5 are chroma)
1488 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
1490 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
1494 if (s->mb_intra && !s->h263_aic) {
1497 /* 255 cannot be represented, so we clamp */
1502 /* 0 cannot be represented also */
1508 put_bits(&s->pb, 8, 0xff);
1510 put_bits(&s->pb, 8, level & 0xff);
1514 if (s->h263_aic && s->mb_intra)
1519 last_index = s->block_last_index[n];
1520 last_non_zero = i - 1;
1521 for (; i <= last_index; i++) {
1522 j = s->intra_scantable.permutated[i];
1525 run = i - last_non_zero - 1;
1526 last = (i == last_index);
1533 code = get_rl_index(rl, last, run, level);
1534 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1535 if (code == rl->n) {
1536 put_bits(&s->pb, 1, last);
1537 put_bits(&s->pb, 6, run);
1538 put_bits(&s->pb, 8, slevel & 0xff);
1540 put_bits(&s->pb, 1, sign);
1548 /***************************************************/
1550 * add mpeg4 stuffing bits (01...1)
1552 void ff_mpeg4_stuffing(PutBitContext * pbc)
1555 put_bits(pbc, 1, 0);
1556 length= (-get_bit_count(pbc))&7;
1557 if(length) put_bits(pbc, length, (1<<length)-1);
1560 /* must be called before writing the header */
1561 void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){
1562 int time_div, time_mod;
1564 if(s->pict_type==I_TYPE){ //we will encode a vol header
1565 s->time_increment_resolution= s->frame_rate/ff_gcd(s->frame_rate, FRAME_RATE_BASE);
1566 if(s->time_increment_resolution>=256*256) s->time_increment_resolution= 256*128;
1568 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
1571 if(s->current_picture.pts)
1572 s->time= (s->current_picture.pts*s->time_increment_resolution + 500*1000)/(1000*1000);
1574 s->time= picture_number*(INT64)FRAME_RATE_BASE*s->time_increment_resolution/s->frame_rate;
1575 time_div= s->time/s->time_increment_resolution;
1576 time_mod= s->time%s->time_increment_resolution;
1578 if(s->pict_type==B_TYPE){
1579 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
1581 s->last_time_base= s->time_base;
1582 s->time_base= time_div;
1583 s->pp_time= s->time - s->last_non_b_time;
1584 s->last_non_b_time= s->time;
1588 static void mpeg4_encode_gop_header(MpegEncContext * s){
1589 int hours, minutes, seconds;
1591 put_bits(&s->pb, 16, 0);
1592 put_bits(&s->pb, 16, GOP_STARTCODE);
1594 seconds= s->time/s->time_increment_resolution;
1595 minutes= seconds/60; seconds %= 60;
1596 hours= minutes/60; minutes %= 60;
1599 put_bits(&s->pb, 5, hours);
1600 put_bits(&s->pb, 6, minutes);
1601 put_bits(&s->pb, 1, 1);
1602 put_bits(&s->pb, 6, seconds);
1604 put_bits(&s->pb, 1, 0); //closed gov == NO
1605 put_bits(&s->pb, 1, 0); //broken link == NO
1607 ff_mpeg4_stuffing(&s->pb);
1610 static void mpeg4_encode_visual_object_header(MpegEncContext * s){
1611 int profile_and_level_indication;
1614 if(s->max_b_frames || s->quarter_sample){
1615 profile_and_level_indication= 0xF1; // adv simple level 1
1618 profile_and_level_indication= 0x01; // simple level 1
1623 put_bits(&s->pb, 16, 0);
1624 put_bits(&s->pb, 16, VOS_STARTCODE);
1626 put_bits(&s->pb, 8, profile_and_level_indication);
1628 put_bits(&s->pb, 16, 0);
1629 put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);
1631 put_bits(&s->pb, 1, 1);
1632 put_bits(&s->pb, 4, vo_ver_id);
1633 put_bits(&s->pb, 3, 1); //priority
1635 put_bits(&s->pb, 4, 1); //visual obj type== video obj
1637 put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME
1639 ff_mpeg4_stuffing(&s->pb);
1642 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number)
1647 if(s->max_b_frames || s->quarter_sample){
1649 s->vo_type= ADV_SIMPLE_VO_TYPE;
1652 s->vo_type= SIMPLE_VO_TYPE;
1655 put_bits(&s->pb, 16, 0);
1656 put_bits(&s->pb, 16, 0x100 + vo_number); /* video obj */
1657 put_bits(&s->pb, 16, 0);
1658 put_bits(&s->pb, 16, 0x120 + vol_number); /* video obj layer */
1660 put_bits(&s->pb, 1, 0); /* random access vol */
1661 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
1662 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
1663 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
1664 put_bits(&s->pb, 3, 1); /* is obj layer priority */
1666 float_aspect_to_info(s, s->avctx->aspect_ratio);
1668 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
1669 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED)
1671 put_bits(&s->pb, 8, s->aspected_width);
1672 put_bits(&s->pb, 8, s->aspected_height);
1676 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
1677 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
1678 put_bits(&s->pb, 1, s->low_delay);
1679 put_bits(&s->pb, 1, 0); /* vbv parameters= no */
1681 put_bits(&s->pb, 1, 0); /* vol control parameters= no */
1684 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
1685 put_bits(&s->pb, 1, 1); /* marker bit */
1687 put_bits(&s->pb, 16, s->time_increment_resolution);
1688 if (s->time_increment_bits < 1)
1689 s->time_increment_bits = 1;
1690 put_bits(&s->pb, 1, 1); /* marker bit */
1691 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
1692 put_bits(&s->pb, 1, 1); /* marker bit */
1693 put_bits(&s->pb, 13, s->width); /* vol width */
1694 put_bits(&s->pb, 1, 1); /* marker bit */
1695 put_bits(&s->pb, 13, s->height); /* vol height */
1696 put_bits(&s->pb, 1, 1); /* marker bit */
1697 put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
1698 put_bits(&s->pb, 1, 1); /* obmc disable */
1699 if (vo_ver_id == 1) {
1700 put_bits(&s->pb, 1, s->vol_sprite_usage=0); /* sprite enable */
1702 put_bits(&s->pb, 2, s->vol_sprite_usage=0); /* sprite enable */
1705 s->quant_precision=5;
1706 put_bits(&s->pb, 1, 0); /* not 8 bit == false */
1707 put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
1708 if(s->mpeg_quant) put_bits(&s->pb, 2, 0); /* no custom matrixes */
1711 put_bits(&s->pb, 1, s->quarter_sample);
1712 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
1713 s->resync_marker= s->rtp_mode;
1714 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
1715 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
1716 if(s->data_partitioning){
1717 put_bits(&s->pb, 1, 0); /* no rvlc */
1720 if (vo_ver_id != 1){
1721 put_bits(&s->pb, 1, 0); /* newpred */
1722 put_bits(&s->pb, 1, 0); /* reduced res vop */
1724 put_bits(&s->pb, 1, 0); /* scalability */
1726 ff_mpeg4_stuffing(&s->pb);
1730 put_bits(&s->pb, 16, 0);
1731 put_bits(&s->pb, 16, 0x1B2); /* user_data */
1732 sprintf(buf, "FFmpeg%sb%s", FFMPEG_VERSION, LIBAVCODEC_BUILD_STR);
1733 put_string(&s->pb, buf);
1734 ff_mpeg4_stuffing(&s->pb);
1738 /* write mpeg4 VOP header */
1739 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
1742 int time_div, time_mod;
1744 if(s->pict_type==I_TYPE){
1745 if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
1746 mpeg4_encode_visual_object_header(s);
1747 mpeg4_encode_vol_header(s, 0, 0);
1749 mpeg4_encode_gop_header(s);
1752 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
1754 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->frame_rate, FRAME_RATE_BASE);
1756 put_bits(&s->pb, 16, 0); /* vop header */
1757 put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */
1758 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
1760 time_div= s->time/s->time_increment_resolution;
1761 time_mod= s->time%s->time_increment_resolution;
1762 time_incr= time_div - s->last_time_base;
1764 put_bits(&s->pb, 1, 1);
1766 put_bits(&s->pb, 1, 0);
1768 put_bits(&s->pb, 1, 1); /* marker */
1769 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
1770 put_bits(&s->pb, 1, 1); /* marker */
1771 put_bits(&s->pb, 1, 1); /* vop coded */
1772 if ( s->pict_type == P_TYPE
1773 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
1774 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
1776 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
1777 if(!s->progressive_sequence){
1778 put_bits(&s->pb, 1, s->top_field_first);
1779 put_bits(&s->pb, 1, s->alternate_scan);
1781 //FIXME sprite stuff
1783 put_bits(&s->pb, 5, s->qscale);
1785 if (s->pict_type != I_TYPE)
1786 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
1787 if (s->pict_type == B_TYPE)
1788 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
1789 // printf("****frame %d\n", picture_number);
1791 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
1792 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
1793 s->h_edge_pos= s->width;
1794 s->v_edge_pos= s->height;
1798 * change qscale by given dquant and update qscale dependant variables.
1800 static void change_qscale(MpegEncContext * s, int dquant)
1802 s->qscale += dquant;
1806 else if (s->qscale > 31)
1809 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
1810 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
1815 * @param n block index (0-3 are luma, 4-5 are chroma)
1816 * @param dc_val_ptr a pointer to the dc_val entry for the current MB will be stored here
1817 * @param dir_ptr pointer to an integer where the prediction direction will be stored
1818 * @return the quantized predicted dc
1820 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr)
1822 int a, b, c, wrap, pred, scale;
1826 /* find prediction */
1828 scale = s->y_dc_scale;
1830 scale = s->c_dc_scale;
1832 wrap= s->block_wrap[n];
1833 dc_val = s->dc_val[0] + s->block_index[n];
1839 b = dc_val[ - 1 - wrap];
1840 c = dc_val[ - wrap];
1842 /* outside slice handling (we cant do that by memset as we need the dc for error resilience) */
1843 if(s->first_slice_line && n!=3){
1845 if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
1847 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
1848 if(n==0 || n==4 || n==5)
1852 if (abs(a - b) < abs(b - c)) {
1854 *dir_ptr = 1; /* top */
1857 *dir_ptr = 0; /* left */
1859 /* we assume pred is positive */
1862 "xorl %%edx, %%edx \n\t"
1864 : "=d" (pred), "=a"(dummy)
1865 : "a" (pred + (scale >> 1)), "c" (inverse[scale])
1868 pred = (pred + (scale >> 1)) / scale;
1871 /* prepare address for prediction update */
1872 *dc_val_ptr = &dc_val[0];
1879 * @param n block index (0-3 are luma, 4-5 are chroma)
1880 * @param dir the ac prediction direction
1882 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
1886 INT16 *ac_val, *ac_val1;
1887 int8_t * const qscale_table= s->current_picture.qscale_table;
1889 /* find prediction */
1890 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1894 const int xy= s->mb_x-1 + s->mb_y*s->mb_width;
1895 /* left prediction */
1898 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
1901 block[s->idct_permutation[i<<3]] += ac_val[i];
1904 /* different qscale, we must rescale */
1906 block[s->idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
1910 const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width;
1911 /* top prediction */
1912 ac_val -= 16 * s->block_wrap[n];
1914 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
1917 block[s->idct_permutation[i]] += ac_val[i + 8];
1920 /* different qscale, we must rescale */
1922 block[s->idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
1929 ac_val1[i ] = block[s->idct_permutation[i<<3]];
1933 ac_val1[8 + i] = block[s->idct_permutation[i ]];
1937 static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
1942 int8_t * const qscale_table= s->current_picture.qscale_table;
1944 /* find prediction */
1945 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1948 const int xy= s->mb_x-1 + s->mb_y*s->mb_width;
1949 /* left prediction */
1951 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
1954 block[s->idct_permutation[i<<3]] -= ac_val[i];
1957 /* different qscale, we must rescale */
1959 block[s->idct_permutation[i<<3]] -= ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
1963 const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width;
1964 /* top prediction */
1965 ac_val -= 16 * s->block_wrap[n];
1966 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
1969 block[s->idct_permutation[i]] -= ac_val[i + 8];
1972 /* different qscale, we must rescale */
1974 block[s->idct_permutation[i]] -= ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
1981 * encodes the dc value.
1982 * @param n block index (0-3 are luma, 4-5 are chroma)
1984 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
1987 // if(level<-255 || level>255) printf("dc overflow\n");
1991 put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]);
1994 put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]);
1998 /* find number of bits */
2008 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
2011 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
2014 /* encode remaining bits */
2017 level = (-level) ^ ((1 << size) - 1);
2018 put_bits(&s->pb, size, level);
2020 put_bits(&s->pb, 1, 1);
2024 #ifdef CONFIG_ENCODERS
2026 * encodes a 8x8 block
2027 * @param n block index (0-3 are luma, 4-5 are chroma)
2029 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2030 UINT8 *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
2032 int i, last_non_zero;
2033 #if 0 //variables for the outcommented version
2034 int code, sign, last;
2039 const int last_index = s->block_last_index[n];
2041 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2042 /* mpeg4 based DC predictor */
2043 mpeg4_encode_dc(dc_pb, intra_dc, n);
2044 if(last_index<1) return;
2047 bits_tab= uni_mpeg4_intra_rl_bits;
2048 len_tab = uni_mpeg4_intra_rl_len;
2050 if(last_index<0) return;
2053 bits_tab= uni_mpeg4_inter_rl_bits;
2054 len_tab = uni_mpeg4_inter_rl_len;
2058 last_non_zero = i - 1;
2060 for (; i < last_index; i++) {
2061 int level = block[ scan_table[i] ];
2063 int run = i - last_non_zero - 1;
2065 if((level&(~127)) == 0){
2066 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2067 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2069 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);
2074 /*if(i<=last_index)*/{
2075 int level = block[ scan_table[i] ];
2076 int run = i - last_non_zero - 1;
2078 if((level&(~127)) == 0){
2079 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2080 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2082 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);
2086 for (; i <= last_index; i++) {
2087 const int slevel = block[ scan_table[i] ];
2090 int run = i - last_non_zero - 1;
2091 last = (i == last_index);
2098 code = get_rl_index(rl, last, run, level);
2099 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2100 if (code == rl->n) {
2102 level1 = level - rl->max_level[last][run];
2105 code = get_rl_index(rl, last, run, level1);
2106 if (code == rl->n) {
2108 put_bits(ac_pb, 1, 1);
2109 if (level > MAX_LEVEL)
2111 run1 = run - rl->max_run[last][level] - 1;
2114 code = get_rl_index(rl, last, run1, level);
2115 if (code == rl->n) {
2118 put_bits(ac_pb, 1, 1);
2119 put_bits(ac_pb, 1, last);
2120 put_bits(ac_pb, 6, run);
2121 put_bits(ac_pb, 1, 1);
2122 put_bits(ac_pb, 12, slevel & 0xfff);
2123 put_bits(ac_pb, 1, 1);
2126 put_bits(ac_pb, 1, 0);
2127 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2128 put_bits(ac_pb, 1, sign);
2132 put_bits(ac_pb, 1, 0);
2133 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2134 put_bits(ac_pb, 1, sign);
2137 put_bits(ac_pb, 1, sign);
2145 static inline int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2148 int i, last_non_zero;
2151 const int last_index = s->block_last_index[n];
2154 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2155 /* mpeg4 based DC predictor */
2156 //mpeg4_encode_dc(dc_pb, intra_dc, n); //FIXME
2157 if(last_index<1) return len;
2160 len_tab = uni_mpeg4_intra_rl_len;
2162 if(last_index<0) return 0;
2165 len_tab = uni_mpeg4_inter_rl_len;
2169 last_non_zero = i - 1;
2170 for (; i < last_index; i++) {
2171 int level = block[ scan_table[i] ];
2173 int run = i - last_non_zero - 1;
2175 if((level&(~127)) == 0){
2176 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2177 len += len_tab[index];
2179 len += 7+2+1+6+1+12+1;
2184 /*if(i<=last_index)*/{
2185 int level = block[ scan_table[i] ];
2186 int run = i - last_non_zero - 1;
2188 if((level&(~127)) == 0){
2189 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2190 len += len_tab[index];
2192 len += 7+2+1+6+1+12+1;
2202 /***********************************************/
2205 static VLC intra_MCBPC_vlc;
2206 static VLC inter_MCBPC_vlc;
2207 static VLC cbpy_vlc;
2209 static VLC dc_lum, dc_chrom;
2210 static VLC sprite_trajectory;
2211 static VLC mb_type_b_vlc;
2213 void init_vlc_rl(RLTable *rl)
2217 init_vlc(&rl->vlc, 9, rl->n + 1,
2218 &rl->table_vlc[0][1], 4, 2,
2219 &rl->table_vlc[0][0], 4, 2);
2222 for(q=0; q<32; q++){
2231 rl->rl_vlc[q]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
2232 for(i=0; i<rl->vlc.table_size; i++){
2233 int code= rl->vlc.table[i][0];
2234 int len = rl->vlc.table[i][1];
2237 if(len==0){ // illegal code
2240 }else if(len<0){ //more bits needed
2244 if(code==rl->n){ //esc
2248 run= rl->table_run [code] + 1;
2249 level= rl->table_level[code] * qmul + qadd;
2250 if(code >= rl->last) run+=192;
2253 rl->rl_vlc[q][i].len= len;
2254 rl->rl_vlc[q][i].level= level;
2255 rl->rl_vlc[q][i].run= run;
2262 /* XXX: find a better solution to handle static init */
2263 void h263_decode_init_vlc(MpegEncContext *s)
2265 static int done = 0;
2270 init_vlc(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 8,
2271 intra_MCBPC_bits, 1, 1,
2272 intra_MCBPC_code, 1, 1);
2273 init_vlc(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 25,
2274 inter_MCBPC_bits, 1, 1,
2275 inter_MCBPC_code, 1, 1);
2276 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
2277 &cbpy_tab[0][1], 2, 1,
2278 &cbpy_tab[0][0], 2, 1);
2279 init_vlc(&mv_vlc, MV_VLC_BITS, 33,
2281 &mvtab[0][0], 2, 1);
2284 init_rl(&rl_intra_aic);
2285 init_vlc_rl(&rl_inter);
2286 init_vlc_rl(&rl_intra);
2287 init_vlc_rl(&rl_intra_aic);
2288 init_vlc(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
2289 &DCtab_lum[0][1], 2, 1,
2290 &DCtab_lum[0][0], 2, 1);
2291 init_vlc(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
2292 &DCtab_chrom[0][1], 2, 1,
2293 &DCtab_chrom[0][0], 2, 1);
2294 init_vlc(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
2295 &sprite_trajectory_tab[0][1], 4, 2,
2296 &sprite_trajectory_tab[0][0], 4, 2);
2297 init_vlc(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
2298 &mb_type_b_tab[0][1], 2, 1,
2299 &mb_type_b_tab[0][0], 2, 1);
2304 * Get the GOB height based on picture height.
2306 int ff_h263_get_gob_height(MpegEncContext *s){
2307 if (s->height <= 400)
2309 else if (s->height <= 800)
2316 * decodes the group of blocks header.
2317 * @return <0 if an error occured
2319 static int h263_decode_gob_header(MpegEncContext *s)
2321 unsigned int val, gfid;
2324 /* Check for GOB Start Code */
2325 val = show_bits(&s->gb, 16);
2329 /* We have a GBSC probably with GSTUFF */
2330 skip_bits(&s->gb, 16); /* Drop the zeros */
2331 left= s->gb.size_in_bits - get_bits_count(&s->gb);
2332 //MN: we must check the bits left or we might end in a infinite loop (or segfault)
2333 for(;left>13; left--){
2334 if(get_bits1(&s->gb)) break; /* Seek the '1' bit */
2340 fprintf(stderr,"\nGOB Start Code at MB %d\n", (s->mb_y * s->mb_width) + s->mb_x);
2342 s->gob_number = get_bits(&s->gb, 5); /* GN */
2343 gfid = get_bits(&s->gb, 2); /* GFID */
2344 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
2348 s->mb_y= s->gob_index* s->gob_number;
2350 fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", s->gob_number, gfid, s->qscale);
2355 static inline void memsetw(short *tab, int val, int n)
2362 void ff_mpeg4_init_partitions(MpegEncContext *s)
2364 init_put_bits(&s->tex_pb, s->tex_pb_buffer, PB_BUFFER_SIZE, NULL, NULL);
2365 init_put_bits(&s->pb2 , s->pb2_buffer , PB_BUFFER_SIZE, NULL, NULL);
2368 void ff_mpeg4_merge_partitions(MpegEncContext *s)
2370 const int pb2_len = get_bit_count(&s->pb2 );
2371 const int tex_pb_len= get_bit_count(&s->tex_pb);
2372 const int bits= get_bit_count(&s->pb);
2374 if(s->pict_type==I_TYPE){
2375 put_bits(&s->pb, 19, DC_MARKER);
2376 s->misc_bits+=19 + pb2_len + bits - s->last_bits;
2377 s->i_tex_bits+= tex_pb_len;
2379 put_bits(&s->pb, 17, MOTION_MARKER);
2380 s->misc_bits+=17 + pb2_len;
2381 s->mv_bits+= bits - s->last_bits;
2382 s->p_tex_bits+= tex_pb_len;
2385 flush_put_bits(&s->pb2);
2386 flush_put_bits(&s->tex_pb);
2388 ff_copy_bits(&s->pb, s->pb2_buffer , pb2_len);
2389 ff_copy_bits(&s->pb, s->tex_pb_buffer, tex_pb_len);
2390 s->last_bits= get_bit_count(&s->pb);
2393 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
2394 switch(s->pict_type){
2399 return s->f_code+15;
2401 return FFMAX(FFMAX(s->f_code, s->b_code)+15, 17);
2407 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
2409 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
2411 ff_mpeg4_stuffing(&s->pb);
2412 put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0);
2413 put_bits(&s->pb, 1, 1);
2415 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
2416 put_bits(&s->pb, s->quant_precision, s->qscale);
2417 put_bits(&s->pb, 1, 0); /* no HEC */
2421 * check if the next stuff is a resync marker or the end.
2424 static inline int mpeg4_is_resync(MpegEncContext *s){
2425 const int bits_count= get_bits_count(&s->gb);
2427 if(s->workaround_bugs&FF_BUG_NO_PADDING){
2431 if(bits_count + 8 >= s->gb.size_in_bits){
2432 int v= show_bits(&s->gb, 8);
2433 v|= 0x7F >> (7-(bits_count&7));
2438 if(show_bits(&s->gb, 16) == ff_mpeg4_resync_prefix[bits_count&7]){
2440 GetBitContext gb= s->gb;
2442 skip_bits(&s->gb, 1);
2443 align_get_bits(&s->gb);
2445 for(len=0; len<32; len++){
2446 if(get_bits1(&s->gb)) break;
2451 if(len>=ff_mpeg4_get_video_packet_prefix_length(s))
2459 * decodes the next video packet.
2460 * @return <0 if something went wrong
2462 static int mpeg4_decode_video_packet_header(MpegEncContext *s)
2464 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
2465 int header_extension=0, mb_num, len;
2467 /* is there enough space left for a video packet + header */
2468 if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1;
2470 for(len=0; len<32; len++){
2471 if(get_bits1(&s->gb)) break;
2474 if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
2475 printf("marker does not match f_code\n");
2479 if(s->shape != RECT_SHAPE){
2480 header_extension= get_bits1(&s->gb);
2481 //FIXME more stuff here
2484 mb_num= get_bits(&s->gb, mb_num_bits);
2485 if(mb_num>=s->mb_num){
2486 fprintf(stderr, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);
2489 s->mb_x= mb_num % s->mb_width;
2490 s->mb_y= mb_num / s->mb_width;
2492 if(s->shape != BIN_ONLY_SHAPE){
2493 int qscale= get_bits(&s->gb, s->quant_precision);
2498 if(s->shape == RECT_SHAPE){
2499 header_extension= get_bits1(&s->gb);
2501 if(header_extension){
2505 while (get_bits1(&s->gb) != 0)
2508 check_marker(&s->gb, "before time_increment in video packed header");
2509 time_increment= get_bits(&s->gb, s->time_increment_bits);
2510 check_marker(&s->gb, "before vop_coding_type in video packed header");
2512 skip_bits(&s->gb, 2); /* vop coding type */
2513 //FIXME not rect stuff here
2515 if(s->shape != BIN_ONLY_SHAPE){
2516 skip_bits(&s->gb, 3); /* intra dc vlc threshold */
2517 //FIXME dont just ignore everything
2518 if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2519 mpeg4_decode_sprite_trajectory(s);
2520 fprintf(stderr, "untested\n");
2523 //FIXME reduced res stuff here
2525 if (s->pict_type != I_TYPE) {
2526 int f_code = get_bits(&s->gb, 3); /* fcode_for */
2528 printf("Error, video packet header damaged (f_code=0)\n");
2531 if (s->pict_type == B_TYPE) {
2532 int b_code = get_bits(&s->gb, 3);
2534 printf("Error, video packet header damaged (b_code=0)\n");
2539 //FIXME new-pred stuff
2541 //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));
2546 void ff_mpeg4_clean_buffers(MpegEncContext *s)
2548 int c_wrap, c_xy, l_wrap, l_xy;
2550 l_wrap= s->block_wrap[0];
2551 l_xy= s->mb_y*l_wrap*2 + s->mb_x*2;
2552 c_wrap= s->block_wrap[4];
2553 c_xy= s->mb_y*c_wrap + s->mb_x;
2557 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
2558 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
2559 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
2563 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(INT16));
2564 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(INT16));
2565 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(INT16));
2568 // we cant clear the MVs as they might be needed by a b frame
2569 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(INT16));
2570 // memset(s->motion_val, 0, 2*sizeof(INT16)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
2571 s->last_mv[0][0][0]=
2572 s->last_mv[0][0][1]=
2573 s->last_mv[1][0][0]=
2574 s->last_mv[1][0][1]= 0;
2578 * decodes the group of blocks / video packet header.
2579 * @return <0 if no resync found
2581 int ff_h263_resync(MpegEncContext *s){
2584 if(s->codec_id==CODEC_ID_MPEG4)
2587 align_get_bits(&s->gb);
2589 if(show_bits(&s->gb, 16)==0){
2590 if(s->codec_id==CODEC_ID_MPEG4)
2591 ret= mpeg4_decode_video_packet_header(s);
2593 ret= h263_decode_gob_header(s);
2597 //ok, its not where its supposed to be ...
2598 s->gb= s->last_resync_gb;
2599 align_get_bits(&s->gb);
2600 left= s->gb.size_in_bits - get_bits_count(&s->gb);
2602 for(;left>16+1+5+5; left-=8){
2603 if(show_bits(&s->gb, 16)==0){
2604 GetBitContext bak= s->gb;
2606 if(s->codec_id==CODEC_ID_MPEG4)
2607 ret= mpeg4_decode_video_packet_header(s);
2609 ret= h263_decode_gob_header(s);
2615 skip_bits(&s->gb, 8);
2622 * gets the average motion vector for a GMC MB.
2623 * @param n either 0 for the x component or 1 for y
2624 * @returns the average MV for a GMC MB
2626 static inline int get_amv(MpegEncContext *s, int n){
2627 int x, y, mb_v, sum, dx, dy, shift;
2628 int len = 1 << (s->f_code + 4);
2629 const int a= s->sprite_warping_accuracy;
2631 if(s->real_sprite_warping_points==1){
2632 if(s->divx_version==500 && s->divx_build==413)
2633 sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample));
2635 sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a);
2637 dx= s->sprite_delta[n][0];
2638 dy= s->sprite_delta[n][1];
2639 shift= s->sprite_shift[0];
2640 if(n) dy -= 1<<(shift + a + 1);
2641 else dx -= 1<<(shift + a + 1);
2642 mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16;
2645 for(y=0; y<16; y++){
2649 //XXX FIXME optimize
2650 for(x=0; x<16; x++){
2655 sum= RSHIFT(sum, a+8-s->quarter_sample);
2658 if (sum < -len) sum= -len;
2659 else if (sum >= len) sum= len-1;
2665 * decodes first partition.
2666 * @return number of MBs decoded or <0 if an error occured
2668 static int mpeg4_decode_partition_a(MpegEncContext *s){
2670 static const INT8 quant_tab[4] = { -1, -2, 1, 2 };
2672 /* decode first partition */
2674 s->first_slice_line=1;
2675 for(; s->mb_y<s->mb_height; s->mb_y++){
2676 ff_init_block_index(s);
2677 for(; s->mb_x<s->mb_width; s->mb_x++){
2678 const int xy= s->mb_x + s->mb_y*s->mb_width;
2683 ff_update_block_index(s);
2684 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
2685 s->first_slice_line=0;
2687 if(s->mb_x==0) PRINT_MB_TYPE("\n");
2689 if(s->pict_type==I_TYPE){
2692 if(show_bits(&s->gb, 19)==DC_MARKER){
2697 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
2700 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
2703 s->cbp_table[xy]= cbpc & 3;
2704 s->mb_type[xy]= MB_TYPE_INTRA;
2708 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2710 s->current_picture.qscale_table[xy]= s->qscale;
2712 s->mbintra_table[xy]= 1;
2715 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
2717 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
2721 if(dc_pred_dir) dir|=1;
2723 s->pred_dir_table[xy]= dir;
2725 s->error_status_table[xy]= AC_ERROR;
2726 }else{ /* P/S_TYPE */
2727 int mx, my, pred_x, pred_y, bits;
2728 INT16 * const mot_val= s->motion_val[s->block_index[0]];
2729 const int stride= s->block_wrap[0]*2;
2731 bits= show_bits(&s->gb, 17);
2732 if(bits==MOTION_MARKER){
2738 s->mb_type[xy]= MB_TYPE_SKIPED;
2739 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2747 mot_val[0 ]= mot_val[2 ]=
2748 mot_val[0+stride]= mot_val[2+stride]= mx;
2749 mot_val[1 ]= mot_val[3 ]=
2750 mot_val[1+stride]= mot_val[3+stride]= my;
2752 if(s->mbintra_table[xy])
2753 ff_clean_intra_table_entries(s);
2755 s->error_status_table[xy]= AC_ERROR;
2758 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
2760 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
2765 else if (cbpc == 20)
2766 fprintf(stderr, "Stuffing !");
2767 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
2769 s->mb_intra = ((cbpc & 4) != 0);
2773 s->mbintra_table[xy]= 1;
2774 s->mb_type[xy]= MB_TYPE_INTRA;
2775 mot_val[0 ]= mot_val[2 ]=
2776 mot_val[0+stride]= mot_val[2+stride]= 0;
2777 mot_val[1 ]= mot_val[3 ]=
2778 mot_val[1+stride]= mot_val[3+stride]= 0;
2779 s->error_status_table[xy]= DC_ERROR|AC_ERROR;
2781 if(s->mbintra_table[xy])
2782 ff_clean_intra_table_entries(s);
2784 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
2785 s->mcsel= get_bits1(&s->gb);
2788 if ((cbpc & 16) == 0) {
2790 /* 16x16 motion prediction */
2791 s->mb_type[xy]= MB_TYPE_INTER;
2793 h263_pred_motion(s, 0, &pred_x, &pred_y);
2795 mx = h263_decode_motion(s, pred_x, s->f_code);
2799 my = h263_decode_motion(s, pred_y, s->f_code);
2807 mot_val[0 ]= mot_val[2 ] =
2808 mot_val[0+stride]= mot_val[2+stride]= mx;
2809 mot_val[1 ]= mot_val[3 ]=
2810 mot_val[1+stride]= mot_val[3+stride]= my;
2814 s->mb_type[xy]= MB_TYPE_INTER4V;
2816 INT16 *mot_val= h263_pred_motion(s, i, &pred_x, &pred_y);
2817 mx = h263_decode_motion(s, pred_x, s->f_code);
2821 my = h263_decode_motion(s, pred_y, s->f_code);
2828 s->error_status_table[xy]= AC_ERROR;
2839 * decode second partition.
2840 * @return <0 if an error occured
2842 static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
2844 static const INT8 quant_tab[4] = { -1, -2, 1, 2 };
2846 s->mb_x= s->resync_mb_x;
2847 s->first_slice_line=1;
2848 for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
2849 ff_init_block_index(s);
2850 for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
2851 const int xy= s->mb_x + s->mb_y*s->mb_width;
2854 ff_update_block_index(s);
2855 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
2856 s->first_slice_line=0;
2858 if(s->pict_type==I_TYPE){
2859 int ac_pred= get_bits1(&s->gb);
2860 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2862 fprintf(stderr, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2866 s->cbp_table[xy]|= cbpy<<2;
2867 s->pred_dir_table[xy]|= ac_pred<<7;
2868 }else{ /* P || S_TYPE */
2869 if(s->mb_type[xy]&MB_TYPE_INTRA){
2871 int ac_pred = get_bits1(&s->gb);
2872 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2875 fprintf(stderr, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2879 if(s->cbp_table[xy] & 8) {
2880 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2882 s->current_picture.qscale_table[xy]= s->qscale;
2886 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
2888 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
2892 if(dc_pred_dir) dir|=1;
2894 s->cbp_table[xy]&= 3; //remove dquant
2895 s->cbp_table[xy]|= cbpy<<2;
2896 s->pred_dir_table[xy]= dir | (ac_pred<<7);
2897 s->error_status_table[xy]&= ~DC_ERROR;
2898 }else if(s->mb_type[xy]&MB_TYPE_SKIPED){
2899 s->current_picture.qscale_table[xy]= s->qscale;
2900 s->cbp_table[xy]= 0;
2902 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2905 fprintf(stderr, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2909 if(s->cbp_table[xy] & 8) {
2910 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2912 s->current_picture.qscale_table[xy]= s->qscale;
2914 s->cbp_table[xy]&= 3; //remove dquant
2915 s->cbp_table[xy]|= (cbpy^0xf)<<2;
2919 if(mb_num >= mb_count) return 0;
2926 * decodes the first & second partition
2927 * @return <0 if error (and sets error type in the error_status_table)
2929 int ff_mpeg4_decode_partitions(MpegEncContext *s)
2933 mb_num= mpeg4_decode_partition_a(s);
2937 if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
2938 fprintf(stderr, "slice below monitor ...\n");
2942 s->mb_num_left= mb_num;
2944 if(s->pict_type==I_TYPE){
2945 if(get_bits(&s->gb, 19)!=DC_MARKER){
2946 fprintf(stderr, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
2949 s->error_status_table[s->mb_x + s->mb_y*s->mb_width-1]|= MV_END|DC_END;
2951 if(get_bits(&s->gb, 17)!=MOTION_MARKER){
2952 fprintf(stderr, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
2955 s->error_status_table[s->mb_x + s->mb_y*s->mb_width-1]|= MV_END;
2958 if( mpeg4_decode_partition_b(s, mb_num) < 0){
2962 s->error_status_table[s->mb_x + s->mb_y*s->mb_width-1]|= DC_END;
2968 * decode partition C of one MB.
2969 * @return <0 if an error occured
2971 static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64])
2974 const int xy= s->mb_x + s->mb_y*s->mb_width;
2976 mb_type= s->mb_type[xy];
2977 cbp = s->cbp_table[xy];
2979 if(s->current_picture.qscale_table[xy] != s->qscale){
2980 s->qscale= s->current_picture.qscale_table[xy];
2981 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
2982 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
2985 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
2988 s->mv[0][i][0] = s->motion_val[ s->block_index[i] ][0];
2989 s->mv[0][i][1] = s->motion_val[ s->block_index[i] ][1];
2991 s->mb_intra = mb_type&MB_TYPE_INTRA;
2993 if (mb_type&MB_TYPE_SKIPED) {
2996 s->block_last_index[i] = -1;
2997 s->mv_dir = MV_DIR_FORWARD;
2998 s->mv_type = MV_TYPE_16X16;
2999 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3006 }else if(s->mb_intra){
3007 s->ac_pred = s->pred_dir_table[xy]>>7;
3009 /* decode each block */
3010 for (i = 0; i < 6; i++) {
3011 if(mpeg4_decode_block(s, block[i], i, cbp&32, 1) < 0){
3012 fprintf(stderr, "texture corrupted at %d %d\n", s->mb_x, s->mb_y);
3017 }else if(!s->mb_intra){
3018 // s->mcsel= 0; //FIXME do we need to init that
3020 s->mv_dir = MV_DIR_FORWARD;
3021 if (mb_type&MB_TYPE_INTER4V) {
3022 s->mv_type = MV_TYPE_8X8;
3024 s->mv_type = MV_TYPE_16X16;
3026 /* decode each block */
3027 for (i = 0; i < 6; i++) {
3028 if(mpeg4_decode_block(s, block[i], i, cbp&32, 0) < 0){
3029 fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y);
3035 } else { /* I-Frame */
3038 s->ac_pred = s->pred_dir_table[xy]>>7;
3040 /* decode each block */
3041 for (i = 0; i < 6; i++) {
3042 if(mpeg4_decode_block(s, block[i], i, cbp&32, 1) < 0){
3043 fprintf(stderr, "texture corrupted at %d %d (trying to continue with dc only)\n", s->mb_x, s->mb_y);
3050 s->error_status_table[xy]&= ~AC_ERROR;
3052 /* per-MB end of slice check */
3054 if(--s->mb_num_left <= 0){
3055 //printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb));
3056 if(mpeg4_is_resync(s))
3061 if(s->cbp_table[xy+1] && mpeg4_is_resync(s))
3068 int ff_h263_decode_mb(MpegEncContext *s,
3069 DCTELEM block[6][64])
3071 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
3073 static INT8 quant_tab[4] = { -1, -2, 1, 2 };
3075 s->error_status_table[s->mb_x + s->mb_y*s->mb_width]= 0;
3077 if(s->mb_x==0) PRINT_MB_TYPE("\n");
3079 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
3080 if (get_bits1(&s->gb)) {
3084 s->block_last_index[i] = -1;
3085 s->mv_dir = MV_DIR_FORWARD;
3086 s->mv_type = MV_TYPE_16X16;
3087 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3090 s->mv[0][0][0]= get_amv(s, 0);
3091 s->mv[0][0][1]= get_amv(s, 1);
3103 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3104 //fprintf(stderr, "\tCBPC: %d", cbpc);
3109 else if (cbpc == 20)
3110 fprintf(stderr, "Stuffing !");
3113 s->mb_intra = ((cbpc & 4) != 0);
3114 if (s->mb_intra) goto intra;
3116 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
3117 s->mcsel= get_bits1(&s->gb);
3119 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3120 cbp = (cbpc & 3) | ((cbpy ^ 0xf) << 2);
3122 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
3124 if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE)))
3125 s->interlaced_dct= get_bits1(&s->gb);
3127 s->mv_dir = MV_DIR_FORWARD;
3128 if ((cbpc & 16) == 0) {
3131 /* 16x16 global motion prediction */
3132 s->mv_type = MV_TYPE_16X16;
3135 s->mv[0][0][0] = mx;
3136 s->mv[0][0][1] = my;
3137 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
3139 /* 16x8 field motion prediction */
3140 s->mv_type= MV_TYPE_FIELD;
3142 s->field_select[0][0]= get_bits1(&s->gb);
3143 s->field_select[0][1]= get_bits1(&s->gb);
3145 h263_pred_motion(s, 0, &pred_x, &pred_y);
3148 mx = h263_decode_motion(s, pred_x, s->f_code);
3152 my = h263_decode_motion(s, pred_y/2, s->f_code);
3156 s->mv[0][i][0] = mx;
3157 s->mv[0][i][1] = my;
3161 /* 16x16 motion prediction */
3162 s->mv_type = MV_TYPE_16X16;
3163 h263_pred_motion(s, 0, &pred_x, &pred_y);
3165 mx = h263p_decode_umotion(s, pred_x);
3167 mx = h263_decode_motion(s, pred_x, s->f_code);
3173 my = h263p_decode_umotion(s, pred_y);
3175 my = h263_decode_motion(s, pred_y, s->f_code);
3179 s->mv[0][0][0] = mx;
3180 s->mv[0][0][1] = my;
3182 if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
3183 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3187 s->mv_type = MV_TYPE_8X8;
3189 mot_val = h263_pred_motion(s, i, &pred_x, &pred_y);
3191 mx = h263p_decode_umotion(s, pred_x);
3193 mx = h263_decode_motion(s, pred_x, s->f_code);
3198 my = h263p_decode_umotion(s, pred_y);
3200 my = h263_decode_motion(s, pred_y, s->f_code);
3203 s->mv[0][i][0] = mx;
3204 s->mv[0][i][1] = my;
3205 if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
3206 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3211 } else if(s->pict_type==B_TYPE) {
3212 int modb1; // first bit of modb
3213 int modb2; // second bit of modb
3217 s->mb_intra = 0; //B-frames never contain intra blocks
3218 s->mcsel=0; // ... true gmc blocks
3222 s->last_mv[i][0][0]=
3223 s->last_mv[i][0][1]=
3224 s->last_mv[i][1][0]=
3225 s->last_mv[i][1][1]= 0;
3229 /* if we skipped it in the future P Frame than skip it now too */
3230 s->mb_skiped= s->next_picture.mbskip_table[s->mb_y * s->mb_width + s->mb_x]; // Note, skiptab=0 if last was GMC
3235 s->block_last_index[i] = -1;
3237 s->mv_dir = MV_DIR_FORWARD;
3238 s->mv_type = MV_TYPE_16X16;
3247 modb1= get_bits1(&s->gb);
3249 mb_type=4; //like MB_TYPE_B_DIRECT but no vectors coded
3254 modb2= get_bits1(&s->gb);
3255 mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
3257 else cbp= get_bits(&s->gb, 6);
3259 if (mb_type!=MB_TYPE_B_DIRECT && cbp) {
3260 if(get_bits1(&s->gb)){
3261 change_qscale(s, get_bits1(&s->gb)*4 - 2);
3266 if(!s->progressive_sequence){
3268 s->interlaced_dct= get_bits1(&s->gb);
3270 if(mb_type!=MB_TYPE_B_DIRECT && get_bits1(&s->gb)){
3273 if(mb_type!=MB_TYPE_B_BACKW){
3274 s->field_select[0][0]= get_bits1(&s->gb);
3275 s->field_select[0][1]= get_bits1(&s->gb);
3277 if(mb_type!=MB_TYPE_B_FORW){
3278 s->field_select[1][0]= get_bits1(&s->gb);
3279 s->field_select[1][1]= get_bits1(&s->gb);
3285 if(mb_type!=MB_TYPE_B_DIRECT && !field_mv){
3286 s->mv_type= MV_TYPE_16X16;
3287 if(mb_type!=MB_TYPE_B_BACKW){
3288 s->mv_dir = MV_DIR_FORWARD;
3290 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
3291 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
3292 s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
3293 s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
3296 if(mb_type!=MB_TYPE_B_FORW){
3297 s->mv_dir |= MV_DIR_BACKWARD;
3299 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
3300 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
3301 s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
3302 s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
3304 if(mb_type!=MB_TYPE_B_DIRECT)
3305 PRINT_MB_TYPE(mb_type==MB_TYPE_B_FORW ? "F" : (mb_type==MB_TYPE_B_BACKW ? "B" : "T"));
3306 }else if(mb_type!=MB_TYPE_B_DIRECT){
3307 s->mv_type= MV_TYPE_FIELD;
3309 if(mb_type!=MB_TYPE_B_BACKW){
3310 s->mv_dir = MV_DIR_FORWARD;
3313 mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code);
3314 my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
3315 s->last_mv[0][i][0]= s->mv[0][i][0] = mx;
3316 s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
3320 if(mb_type!=MB_TYPE_B_FORW){
3321 s->mv_dir |= MV_DIR_BACKWARD;
3324 mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code);
3325 my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
3326 s->last_mv[1][i][0]= s->mv[1][i][0] = mx;
3327 s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
3330 if(mb_type!=MB_TYPE_B_DIRECT)
3331 PRINT_MB_TYPE(mb_type==MB_TYPE_B_FORW ? "f" : (mb_type==MB_TYPE_B_BACKW ? "b" : "t"));
3335 if(mb_type==4 || mb_type==MB_TYPE_B_DIRECT){
3339 mx = h263_decode_motion(s, 0, 1);
3340 my = h263_decode_motion(s, 0, 1);
3343 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3344 ff_mpeg4_set_direct_mv(s, mx, my);
3347 if(mb_type<0 || mb_type>4){
3348 printf("illegal MB_type\n");
3351 } else { /* I-Frame */
3352 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
3359 if (s->h263_pred || s->h263_aic) {
3360 s->ac_pred = get_bits1(&s->gb);
3361 if (s->ac_pred && s->h263_aic)
3362 s->h263_aic_dir = get_bits1(&s->gb);
3364 PRINT_MB_TYPE(s->ac_pred ? "A" : "I");
3366 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3367 if(cbpy<0) return -1;
3368 cbp = (cbpc & 3) | (cbpy << 2);
3370 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
3373 if(!s->progressive_sequence)
3374 s->interlaced_dct= get_bits1(&s->gb);
3376 /* decode each block */
3378 for (i = 0; i < 6; i++) {
3379 if (mpeg4_decode_block(s, block[i], i, cbp&32, 1) < 0)
3384 for (i = 0; i < 6; i++) {
3385 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
3393 /* decode each block */
3395 for (i = 0; i < 6; i++) {
3396 if (mpeg4_decode_block(s, block[i], i, cbp&32, 0) < 0)
3401 for (i = 0; i < 6; i++) {
3402 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
3409 /* per-MB end of slice check */
3410 if(s->codec_id==CODEC_ID_MPEG4){
3411 if(mpeg4_is_resync(s)){
3412 if(s->pict_type==B_TYPE && s->next_picture.mbskip_table[s->mb_y * s->mb_width + s->mb_x+1])
3417 int v= show_bits(&s->gb, 16);
3419 if(get_bits_count(&s->gb) + 16 > s->gb.size_in_bits){
3420 v>>= get_bits_count(&s->gb) + 16 - s->gb.size_in_bits;
3430 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
3432 int code, val, sign, shift, l;
3433 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
3440 sign = get_bits1(&s->gb);
3442 val = (code - 1) << shift;
3444 val |= get_bits(&s->gb, shift);
3450 /* modulo decoding */
3451 if (!s->h263_long_vectors) {
3452 l = 1 << (f_code + 4);
3455 } else if (val >= l) {
3459 /* horrible h263 long vector mode */
3460 if (pred < -31 && val < -63)
3462 if (pred > 32 && val > 63)
3469 /* Decodes RVLC of H.263+ UMV */
3470 static int h263p_decode_umotion(MpegEncContext * s, int pred)
3474 if (get_bits1(&s->gb)) /* Motion difference = 0 */
3477 code = 2 + get_bits1(&s->gb);
3479 while (get_bits1(&s->gb))
3482 code += get_bits1(&s->gb);
3487 code = (sign) ? (pred - code) : (pred + code);
3489 fprintf(stderr,"H.263+ UMV Motion = %d\n", code);
3495 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
3498 int code, level, i, j, last, run;
3499 RLTable *rl = &rl_inter;
3500 const UINT8 *scan_table;
3502 scan_table = s->intra_scantable.permutated;
3503 if (s->h263_aic && s->mb_intra) {
3507 if (s->h263_aic_dir)
3508 scan_table = s->intra_v_scantable.permutated; /* left */
3510 scan_table = s->intra_h_scantable.permutated; /* top */
3512 } else if (s->mb_intra) {
3514 if (s->h263_rv10 && s->rv10_version == 3 && s->pict_type == I_TYPE) {
3515 int component, diff;
3516 component = (n <= 3 ? 0 : n - 4 + 1);
3517 level = s->last_dc[component];
3518 if (s->rv10_first_dc_coded[component]) {
3519 diff = rv_decode_dc(s, n);
3523 level = level & 0xff; /* handle wrap round */
3524 s->last_dc[component] = level;
3526 s->rv10_first_dc_coded[component] = 1;
3529 level = get_bits(&s->gb, 8);
3539 if (s->mb_intra && s->h263_aic)
3541 s->block_last_index[n] = i - 1;
3546 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
3548 fprintf(stderr, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
3551 if (code == rl->n) {
3553 last = get_bits1(&s->gb);
3554 run = get_bits(&s->gb, 6);
3555 level = (INT8)get_bits(&s->gb, 8);
3556 if (s->h263_rv10 && level == -128) {
3557 /* XXX: should patch encoder too */
3558 level = get_bits(&s->gb, 12);
3559 level= (level + ((-1)<<11)) ^ ((-1)<<11); //sign extension
3562 run = rl->table_run[code];
3563 level = rl->table_level[code];
3564 last = code >= rl->last;
3565 if (get_bits1(&s->gb))
3570 fprintf(stderr, "run overflow at %dx%d\n", s->mb_x, s->mb_y);
3580 if (s->mb_intra && s->h263_aic) {
3581 h263_pred_acdc(s, block, n);
3584 s->block_last_index[n] = i;
3589 * decodes the dc value.
3590 * @param n block index (0-3 are luma, 4-5 are chroma)
3591 * @param dir_ptr the prediction direction will be stored here
3592 * @return the quantized dc
3594 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
3596 int level, pred, code;
3600 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
3602 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
3603 if (code < 0 || code > 9 /* && s->nbit<9 */){
3604 fprintf(stderr, "illegal dc vlc\n");
3610 level = get_bits(&s->gb, code);
3611 if ((level >> (code - 1)) == 0) /* if MSB not set it is negative*/
3612 level = - (level ^ ((1 << code) - 1));
3614 if(get_bits1(&s->gb)==0){ /* marker */
3615 if(s->error_resilience>=2){
3616 fprintf(stderr, "dc marker bit missing\n");
3622 pred = ff_mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
3625 if(s->error_resilience>=3){
3626 fprintf(stderr, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
3632 *dc_val = level * s->y_dc_scale;
3634 *dc_val = level * s->c_dc_scale;
3636 if(s->error_resilience>=3){
3637 if(*dc_val > 2048 + s->y_dc_scale + s->c_dc_scale){
3638 fprintf(stderr, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
3647 * @return <0 if an error occured
3649 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
3650 int n, int coded, int intra)
3652 int level, i, last, run;
3655 RL_VLC_ELEM * rl_vlc;
3656 const UINT8 * scan_table;
3661 if(s->partitioned_frame){
3662 level = s->dc_val[0][ s->block_index[n] ];
3663 if(n<4) level= (level + (s->y_dc_scale>>1))/s->y_dc_scale; //FIXME optimizs
3664 else level= (level + (s->c_dc_scale>>1))/s->c_dc_scale;
3665 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_width]<<n)&32;
3667 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
3676 rl_vlc = rl_intra.rl_vlc[0];
3678 if (dc_pred_dir == 0)
3679 scan_table = s->intra_v_scantable.permutated; /* left */
3681 scan_table = s->intra_h_scantable.permutated; /* top */
3683 scan_table = s->intra_scantable.permutated;
3690 s->block_last_index[n] = i;
3695 scan_table = s->intra_scantable.permutated;
3700 rl_vlc = rl_inter.rl_vlc[0];
3702 qmul = s->qscale << 1;
3703 qadd = (s->qscale - 1) | 1;
3704 rl_vlc = rl_inter.rl_vlc[s->qscale];
3708 OPEN_READER(re, &s->gb);
3710 UPDATE_CACHE(re, &s->gb);
3711 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
3714 cache= GET_CACHE(re, &s->gb);
3716 if (cache&0x80000000) {
3717 if (cache&0x40000000) {
3719 SKIP_CACHE(re, &s->gb, 2);
3720 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
3721 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
3722 SKIP_COUNTER(re, &s->gb, 2+1+6);
3723 UPDATE_CACHE(re, &s->gb);
3725 if(SHOW_UBITS(re, &s->gb, 1)==0){
3726 fprintf(stderr, "1. marker bit missing in 3. esc\n");
3728 }; SKIP_CACHE(re, &s->gb, 1);
3730 level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
3732 if(SHOW_UBITS(re, &s->gb, 1)==0){
3733 fprintf(stderr, "2. marker bit missing in 3. esc\n");
3735 }; LAST_SKIP_CACHE(re, &s->gb, 1);
3737 SKIP_COUNTER(re, &s->gb, 1+12+1);
3739 if(level*s->qscale>1024 || level*s->qscale<-1024){
3740 fprintf(stderr, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
3745 const int abs_level= ABS(level);
3746 if(abs_level<=MAX_LEVEL && run<=MAX_RUN && !(s->workaround_bugs&FF_BUG_AC_VLC)){
3747 const int run1= run - rl->max_run[last][abs_level] - 1;
3748 if(abs_level <= rl->max_level[last][run]){
3749 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
3752 if(s->error_resilience > FF_ER_COMPLIANT){
3753 if(abs_level <= rl->max_level[last][run]*2){
3754 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
3757 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
3758 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
3765 if (level>0) level= level * qmul + qadd;
3766 else level= level * qmul - qadd;
3772 #if MIN_CACHE_BITS < 20
3773 LAST_SKIP_BITS(re, &s->gb, 2);
3774 UPDATE_CACHE(re, &s->gb);
3776 SKIP_BITS(re, &s->gb, 2);
3778 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
3779 i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing
3780 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
3781 LAST_SKIP_BITS(re, &s->gb, 1);
3785 #if MIN_CACHE_BITS < 19
3786 LAST_SKIP_BITS(re, &s->gb, 1);
3787 UPDATE_CACHE(re, &s->gb);
3789 SKIP_BITS(re, &s->gb, 1);
3791 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
3793 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
3794 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
3795 LAST_SKIP_BITS(re, &s->gb, 1);
3799 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
3800 LAST_SKIP_BITS(re, &s->gb, 1);
3805 fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
3809 block[scan_table[i]] = level;
3813 block[scan_table[i]] = level;
3815 CLOSE_READER(re, &s->gb);
3819 mpeg4_pred_ac(s, block, n, dc_pred_dir);
3821 i = 63; /* XXX: not optimal */
3824 s->block_last_index[n] = i;
3828 /* most is hardcoded. should extend to handle all h263 streams */
3829 int h263_decode_picture_header(MpegEncContext *s)
3831 int format, width, height;
3833 /* picture start code */
3834 if (get_bits(&s->gb, 22) != 0x20) {
3835 fprintf(stderr, "Bad picture start code\n");
3838 /* temporal reference */
3839 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
3841 /* PTYPE starts here */
3842 if (get_bits1(&s->gb) != 1) {
3844 fprintf(stderr, "Bad marker\n");
3847 if (get_bits1(&s->gb) != 0) {
3848 fprintf(stderr, "Bad H263 id\n");
3849 return -1; /* h263 id */
3851 skip_bits1(&s->gb); /* split screen off */
3852 skip_bits1(&s->gb); /* camera off */
3853 skip_bits1(&s->gb); /* freeze picture release off */
3855 /* Reset GOB number */
3858 format = get_bits(&s->gb, 3);
3863 7 extended PTYPE (PLUSPTYPE)
3866 if (format != 7 && format != 6) {
3869 width = h263_format[format][0];
3870 height = h263_format[format][1];
3876 s->pict_type = I_TYPE + get_bits1(&s->gb);
3878 s->unrestricted_mv = get_bits1(&s->gb);
3879 s->h263_long_vectors = s->unrestricted_mv;
3881 if (get_bits1(&s->gb) != 0) {
3882 fprintf(stderr, "H263 SAC not supported\n");
3883 return -1; /* SAC: off */
3885 if (get_bits1(&s->gb) != 0) {
3886 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
3889 if (get_bits1(&s->gb) != 0) {
3890 fprintf(stderr, "H263 PB frame not supported\n");
3891 return -1; /* not PB frame */
3893 s->qscale = get_bits(&s->gb, 5);
3894 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
3900 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
3902 /* ufep other than 0 and 1 are reserved */
3905 format = get_bits(&s->gb, 3);
3906 dprintf("ufep=1, format: %d\n", format);
3907 skip_bits(&s->gb,1); /* Custom PCF */
3908 s->umvplus_dec = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */
3909 skip_bits1(&s->gb); /* Syntax-based Arithmetic Coding (SAC) */
3910 if (get_bits1(&s->gb) != 0) {
3911 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
3913 if (get_bits1(&s->gb) != 0) { /* Advanced Intra Coding (AIC) */
3917 skip_bits(&s->gb, 7);
3918 /* these are the 7 bits: (in order of appearence */
3919 /* Deblocking Filter */
3920 /* Slice Structured */
3921 /* Reference Picture Selection */
3922 /* Independent Segment Decoding */
3923 /* Alternative Inter VLC */
3924 /* Modified Quantization */
3925 /* Prevent start code emulation */
3927 skip_bits(&s->gb, 3); /* Reserved */
3928 } else if (ufep != 0) {
3929 fprintf(stderr, "Bad UFEP type (%d)\n", ufep);
3934 s->pict_type = get_bits(&s->gb, 3) + I_TYPE;
3935 dprintf("pict_type: %d\n", s->pict_type);
3936 if (s->pict_type != I_TYPE &&
3937 s->pict_type != P_TYPE)
3939 skip_bits(&s->gb, 2);
3940 s->no_rounding = get_bits1(&s->gb);
3941 dprintf("RTYPE: %d\n", s->no_rounding);
3942 skip_bits(&s->gb, 4);
3944 /* Get the picture dimensions */
3947 /* Custom Picture Format (CPFMT) */
3948 s->aspect_ratio_info = get_bits(&s->gb, 4);
3949 dprintf("aspect: %d\n", s->aspect_ratio_info);
3954 3 - 10:11 (525-type 4:3)
3955 4 - 16:11 (CIF 16:9)
3956 5 - 40:33 (525-type 16:9)
3959 width = (get_bits(&s->gb, 9) + 1) * 4;
3961 height = get_bits(&s->gb, 9) * 4;
3962 dprintf("\nH.263+ Custom picture: %dx%d\n",width,height);
3963 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
3964 /* aspected dimensions */
3965 s->aspected_width = get_bits(&s->gb, 8);
3966 s->aspected_height = get_bits(&s->gb, 8);
3968 s->aspected_width = pixel_aspect[s->aspect_ratio_info][0];
3969 s->aspected_height= pixel_aspect[s->aspect_ratio_info][1];
3972 width = h263_format[format][0];
3973 height = h263_format[format][1];
3975 if ((width == 0) || (height == 0))
3979 if (s->umvplus_dec) {
3980 skip_bits1(&s->gb); /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
3984 s->qscale = get_bits(&s->gb, 5);
3987 while (get_bits1(&s->gb) != 0) {
3988 skip_bits(&s->gb, 8);
3993 s->y_dc_scale_table=
3994 s->c_dc_scale_table= h263_aic_dc_scale_table;
3996 s->y_dc_scale_table=
3997 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
4003 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s)
4006 int a= 2<<s->sprite_warping_accuracy;
4007 int rho= 3-s->sprite_warping_accuracy;
4009 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
4010 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
4011 int sprite_ref[4][2];
4012 int virtual_ref[2][2];
4014 int alpha=0, beta=0;
4019 for(i=0; i<s->num_sprite_warping_points; i++){
4023 length= get_vlc(&s->gb, &sprite_trajectory);
4025 x= get_bits(&s->gb, length);
4027 if ((x >> (length - 1)) == 0) /* if MSB not set it is negative*/
4028 x = - (x ^ ((1 << length) - 1));
4030 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(&s->gb); /* marker bit */
4032 length= get_vlc(&s->gb, &sprite_trajectory);
4034 y=get_bits(&s->gb, length);
4036 if ((y >> (length - 1)) == 0) /* if MSB not set it is negative*/
4037 y = - (y ^ ((1 << length) - 1));
4039 skip_bits1(&s->gb); /* marker bit */
4040 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
4045 while((1<<alpha)<w) alpha++;
4046 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
4050 // Note, the 4th point isnt used for GMC
4051 if(s->divx_version==500 && s->divx_build==413){
4052 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
4053 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
4054 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
4055 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
4056 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
4057 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
4059 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
4060 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
4061 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
4062 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
4063 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
4064 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
4066 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
4067 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
4069 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
4070 // perhaps it should be reordered to be more readable ...
4071 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
4072 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
4073 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
4074 + 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);
4075 virtual_ref[0][1]= 16*vop_ref[0][1]
4076 + 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);
4077 virtual_ref[1][0]= 16*vop_ref[0][0]
4078 + 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);
4079 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
4080 + 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);
4082 switch(s->num_sprite_warping_points)
4085 s->sprite_offset[0][0]= 0;
4086 s->sprite_offset[0][1]= 0;
4087 s->sprite_offset[1][0]= 0;
4088 s->sprite_offset[1][1]= 0;
4089 s->sprite_delta[0][0]= a;
4090 s->sprite_delta[0][1]= 0;
4091 s->sprite_delta[1][0]= 0;
4092 s->sprite_delta[1][1]= a;
4093 s->sprite_shift[0]= 0;
4094 s->sprite_shift[1]= 0;
4097 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
4098 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
4099 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
4100 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
4101 s->sprite_delta[0][0]= a;
4102 s->sprite_delta[0][1]= 0;
4103 s->sprite_delta[1][0]= 0;
4104 s->sprite_delta[1][1]= a;
4105 s->sprite_shift[0]= 0;
4106 s->sprite_shift[1]= 0;
4109 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
4110 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
4111 + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])
4112 + (1<<(alpha+rho-1));
4113 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
4114 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
4115 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])
4116 + (1<<(alpha+rho-1));
4117 s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
4118 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
4119 +2*w2*r*sprite_ref[0][0]
4121 + (1<<(alpha+rho+1)));
4122 s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
4123 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
4124 +2*w2*r*sprite_ref[0][1]
4126 + (1<<(alpha+rho+1)));
4127 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
4128 s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]);
4129 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
4130 s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
4132 s->sprite_shift[0]= alpha+rho;
4133 s->sprite_shift[1]= alpha+rho+2;
4136 min_ab= FFMIN(alpha, beta);
4139 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
4140 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])
4141 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])
4142 + (1<<(alpha+beta+rho-min_ab-1));
4143 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))
4144 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])
4145 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])
4146 + (1<<(alpha+beta+rho-min_ab-1));
4147 s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)
4148 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)
4149 + 2*w2*h3*r*sprite_ref[0][0]
4151 + (1<<(alpha+beta+rho-min_ab+1));
4152 s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)
4153 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)
4154 + 2*w2*h3*r*sprite_ref[0][1]
4156 + (1<<(alpha+beta+rho-min_ab+1));
4157 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;
4158 s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;
4159 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;
4160 s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;
4162 s->sprite_shift[0]= alpha + beta + rho - min_ab;
4163 s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;
4166 /* try to simplify the situation */
4167 if( s->sprite_delta[0][0] == a<<s->sprite_shift[0]
4168 && s->sprite_delta[0][1] == 0
4169 && s->sprite_delta[1][0] == 0
4170 && s->sprite_delta[1][1] == a<<s->sprite_shift[0])
4172 s->sprite_offset[0][0]>>=s->sprite_shift[0];
4173 s->sprite_offset[0][1]>>=s->sprite_shift[0];
4174 s->sprite_offset[1][0]>>=s->sprite_shift[1];
4175 s->sprite_offset[1][1]>>=s->sprite_shift[1];
4176 s->sprite_delta[0][0]= a;
4177 s->sprite_delta[0][1]= 0;
4178 s->sprite_delta[1][0]= 0;
4179 s->sprite_delta[1][1]= a;
4180 s->sprite_shift[0]= 0;
4181 s->sprite_shift[1]= 0;
4182 s->real_sprite_warping_points=1;
4185 int shift_y= 16 - s->sprite_shift[0];
4186 int shift_c= 16 - s->sprite_shift[1];
4187 //printf("shifts %d %d\n", shift_y, shift_c);
4189 s->sprite_offset[0][i]<<= shift_y;
4190 s->sprite_offset[1][i]<<= shift_c;
4191 s->sprite_delta[0][i]<<= shift_y;
4192 s->sprite_delta[1][i]<<= shift_y;
4193 s->sprite_shift[i]= 16;
4195 s->real_sprite_warping_points= s->num_sprite_warping_points;
4198 printf("vop:%d:%d %d:%d %d:%d, sprite:%d:%d %d:%d %d:%d, virtual: %d:%d %d:%d\n",
4199 vop_ref[0][0], vop_ref[0][1],
4200 vop_ref[1][0], vop_ref[1][1],
4201 vop_ref[2][0], vop_ref[2][1],
4202 sprite_ref[0][0], sprite_ref[0][1],
4203 sprite_ref[1][0], sprite_ref[1][1],
4204 sprite_ref[2][0], sprite_ref[2][1],
4205 virtual_ref[0][0], virtual_ref[0][1],
4206 virtual_ref[1][0], virtual_ref[1][1]
4209 printf("offset: %d:%d , delta: %d %d %d %d, shift %d\n",
4210 s->sprite_offset[0][0], s->sprite_offset[0][1],
4211 s->sprite_delta[0][0], s->sprite_delta[0][1],
4212 s->sprite_delta[1][0], s->sprite_delta[1][1],
4218 static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
4219 int hours, minutes, seconds;
4221 hours= get_bits(gb, 5);
4222 minutes= get_bits(gb, 6);
4224 seconds= get_bits(gb, 6);
4226 s->time_base= seconds + 60*(minutes + 60*hours);
4234 static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
4235 int width, height, vo_ver_id;
4238 skip_bits(gb, 1); /* random access */
4239 s->vo_type= get_bits(gb, 8);
4240 if (get_bits1(gb) != 0) { /* is_ol_id */
4241 vo_ver_id = get_bits(gb, 4); /* vo_ver_id */
4242 skip_bits(gb, 3); /* vo_priority */
4246 //printf("vo type:%d\n",s->vo_type);
4247 s->aspect_ratio_info= get_bits(gb, 4);
4248 if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
4249 s->aspected_width = get_bits(gb, 8); // par_width
4250 s->aspected_height = get_bits(gb, 8); // par_height
4252 s->aspected_width = pixel_aspect[s->aspect_ratio_info][0];
4253 s->aspected_height= pixel_aspect[s->aspect_ratio_info][1];
4256 if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
4257 int chroma_format= get_bits(gb, 2);
4258 if(chroma_format!=1){
4259 printf("illegal chroma format\n");
4261 s->low_delay= get_bits1(gb);
4262 if(get_bits1(gb)){ /* vbv parameters */
4263 get_bits(gb, 15); /* first_half_bitrate */
4264 skip_bits1(gb); /* marker */
4265 get_bits(gb, 15); /* latter_half_bitrate */
4266 skip_bits1(gb); /* marker */
4267 get_bits(gb, 15); /* first_half_vbv_buffer_size */
4268 skip_bits1(gb); /* marker */
4269 get_bits(gb, 3); /* latter_half_vbv_buffer_size */
4270 get_bits(gb, 11); /* first_half_vbv_occupancy */
4271 skip_bits1(gb); /* marker */
4272 get_bits(gb, 15); /* latter_half_vbv_occupancy */
4273 skip_bits1(gb); /* marker */
4276 // set low delay flag only once so the smart? low delay detection wont be overriden
4277 if(s->picture_number==0)
4281 s->shape = get_bits(gb, 2); /* vol shape */
4282 if(s->shape != RECT_SHAPE) printf("only rectangular vol supported\n");
4283 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
4284 printf("Gray shape not supported\n");
4285 skip_bits(gb, 4); //video_object_layer_shape_extension
4288 skip_bits1(gb); /* marker */
4290 s->time_increment_resolution = get_bits(gb, 16);
4292 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
4293 if (s->time_increment_bits < 1)
4294 s->time_increment_bits = 1;
4295 skip_bits1(gb); /* marker */
4297 if (get_bits1(gb) != 0) { /* fixed_vop_rate */
4298 skip_bits(gb, s->time_increment_bits);
4301 if (s->shape != BIN_ONLY_SHAPE) {
4302 if (s->shape == RECT_SHAPE) {
4303 skip_bits1(gb); /* marker */
4304 width = get_bits(gb, 13);
4305 skip_bits1(gb); /* marker */
4306 height = get_bits(gb, 13);
4307 skip_bits1(gb); /* marker */
4308 if(width && height){ /* they should be non zero but who knows ... */
4311 // printf("width/height: %d %d\n", width, height);
4315 s->progressive_sequence= get_bits1(gb)^1;
4316 if(!get_bits1(gb)) printf("OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */
4317 if (vo_ver_id == 1) {
4318 s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */
4320 s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */
4322 if(s->vol_sprite_usage==STATIC_SPRITE) printf("Static Sprites not supported\n");
4323 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
4324 if(s->vol_sprite_usage==STATIC_SPRITE){
4325 s->sprite_width = get_bits(gb, 13);
4326 skip_bits1(gb); /* marker */
4327 s->sprite_height= get_bits(gb, 13);
4328 skip_bits1(gb); /* marker */
4329 s->sprite_left = get_bits(gb, 13);
4330 skip_bits1(gb); /* marker */
4331 s->sprite_top = get_bits(gb, 13);
4332 skip_bits1(gb); /* marker */
4334 s->num_sprite_warping_points= get_bits(gb, 6);
4335 s->sprite_warping_accuracy = get_bits(gb, 2);
4336 s->sprite_brightness_change= get_bits1(gb);
4337 if(s->vol_sprite_usage==STATIC_SPRITE)
4338 s->low_latency_sprite= get_bits1(gb);
4340 // FIXME sadct disable bit if verid!=1 && shape not rect
4342 if (get_bits1(gb) == 1) { /* not_8_bit */
4343 s->quant_precision = get_bits(gb, 4); /* quant_precision */
4344 if(get_bits(gb, 4)!=8) printf("N-bit not supported\n"); /* bits_per_pixel */
4345 if(s->quant_precision!=5) printf("quant precission %d\n", s->quant_precision);
4347 s->quant_precision = 5;
4350 // FIXME a bunch of grayscale shape things
4352 if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */
4355 /* load default matrixes */
4356 for(i=0; i<64; i++){
4357 int j= s->idct_permutation[i];
4358 v= ff_mpeg4_default_intra_matrix[i];
4359 s->intra_matrix[j]= v;
4360 s->chroma_intra_matrix[j]= v;
4362 v= ff_mpeg4_default_non_intra_matrix[i];
4363 s->inter_matrix[j]= v;
4364 s->chroma_inter_matrix[j]= v;
4367 /* load custom intra matrix */
4370 for(i=0; i<64; i++){
4375 j= s->idct_permutation[ ff_zigzag_direct[i] ];
4376 s->intra_matrix[j]= v;
4377 s->chroma_intra_matrix[j]= v;
4380 /* replicate last value */
4382 j= s->idct_permutation[ ff_zigzag_direct[i] ];
4383 s->intra_matrix[j]= v;
4384 s->chroma_intra_matrix[j]= v;
4388 /* load custom non intra matrix */
4391 for(i=0; i<64; i++){
4396 j= s->idct_permutation[ ff_zigzag_direct[i] ];
4397 s->inter_matrix[j]= v;
4398 s->chroma_inter_matrix[j]= v;
4401 /* replicate last value */
4403 j= s->idct_permutation[ ff_zigzag_direct[i] ];
4404 s->inter_matrix[j]= last;
4405 s->chroma_inter_matrix[j]= last;
4409 // FIXME a bunch of grayscale shape things
4413 s->quarter_sample= get_bits1(gb);
4414 else s->quarter_sample=0;
4416 if(!get_bits1(gb)) printf("Complexity estimation not supported\n");
4418 s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */
4420 s->data_partitioning= get_bits1(gb);
4421 if(s->data_partitioning){
4422 s->rvlc= get_bits1(gb);
4424 printf("reversible vlc not supported\n");
4428 if(vo_ver_id != 1) {
4429 s->new_pred= get_bits1(gb);
4431 printf("new pred not supported\n");
4432 skip_bits(gb, 2); /* requested upstream message type */
4433 skip_bits1(gb); /* newpred segment type */
4435 s->reduced_res_vop= get_bits1(gb);
4436 if(s->reduced_res_vop) printf("reduced resolution VOP not supported\n");
4440 s->reduced_res_vop= 0;
4443 s->scalability= get_bits1(gb);
4445 if (s->scalability) {
4446 GetBitContext bak= *gb;
4448 int ref_layer_sampling_dir;
4449 int h_sampling_factor_n;
4450 int h_sampling_factor_m;
4451 int v_sampling_factor_n;
4452 int v_sampling_factor_m;
4454 s->hierachy_type= get_bits1(gb);
4455 ref_layer_id= get_bits(gb, 4);
4456 ref_layer_sampling_dir= get_bits1(gb);
4457 h_sampling_factor_n= get_bits(gb, 5);
4458 h_sampling_factor_m= get_bits(gb, 5);
4459 v_sampling_factor_n= get_bits(gb, 5);
4460 v_sampling_factor_m= get_bits(gb, 5);
4461 s->enhancement_type= get_bits1(gb);
4463 if( h_sampling_factor_n==0 || h_sampling_factor_m==0
4464 || v_sampling_factor_n==0 || v_sampling_factor_m==0){
4466 // fprintf(stderr, "illegal scalability header (VERY broken encoder), trying to workaround\n");
4471 printf("scalability not supported\n");
4473 // bin shape stuff FIXME
4480 * decodes the user data stuff in the header.
4481 * allso inits divx/xvid/lavc_version/build
4483 static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
4487 int ver, build, ver2, ver3;
4489 buf[0]= show_bits(gb, 8);
4490 for(i=1; i<256; i++){
4491 buf[i]= show_bits(gb, 16)&0xFF;
4492 if(buf[i]==0) break;
4497 /* divx detection */
4498 e=sscanf(buf, "DivX%dBuild%d", &ver, &build);
4500 e=sscanf(buf, "DivX%db%d", &ver, &build);
4502 s->divx_version= ver;
4503 s->divx_build= build;
4504 if(s->picture_number==0){
4505 printf("This file was encoded with DivX%d Build%d\n", ver, build);
4509 /* ffmpeg detection */
4510 e=sscanf(buf, "FFmpeg%d.%d.%db%d", &ver, &ver2, &ver3, &build);
4512 e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
4514 if(strcmp(buf, "ffmpeg")==0){
4515 s->ffmpeg_version= 0x000406;
4516 s->lavc_build= 4600;
4520 s->ffmpeg_version= ver*256*256 + ver2*256 + ver3;
4521 s->lavc_build= build;
4522 if(s->picture_number==0)
4523 printf("This file was encoded with libavcodec build %d\n", build);
4526 /* xvid detection */
4527 e=sscanf(buf, "XviD%d", &build);
4529 s->xvid_build= build;
4530 if(s->picture_number==0)
4531 printf("This file was encoded with XviD build %d\n", build);
4534 //printf("User Data: %s\n", buf);
4538 static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
4539 int time_incr, time_increment;
4541 s->pict_type = get_bits(gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */
4542 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0){
4543 printf("low_delay flag set, but shouldnt, clearing it\n");
4547 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
4548 if(s->partitioned_frame)
4549 s->decode_mb= mpeg4_decode_partitioned_mb;
4551 s->decode_mb= ff_h263_decode_mb;
4553 if(s->time_increment_resolution==0){
4554 s->time_increment_resolution=1;
4555 // fprintf(stderr, "time_increment_resolution is illegal\n");
4558 while (get_bits1(gb) != 0)
4561 check_marker(gb, "before time_increment");
4562 time_increment= get_bits(gb, s->time_increment_bits);
4563 //printf(" type:%d modulo_time_base:%d increment:%d\n", s->pict_type, time_incr, time_increment);
4564 if(s->pict_type!=B_TYPE){
4565 s->last_time_base= s->time_base;
4566 s->time_base+= time_incr;
4567 s->time= s->time_base*s->time_increment_resolution + time_increment;
4568 if(s->workaround_bugs&FF_BUG_UMP4){
4569 if(s->time < s->last_non_b_time){
4570 // fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaround\n");
4572 s->time+= s->time_increment_resolution;
4575 s->pp_time= s->time - s->last_non_b_time;
4576 s->last_non_b_time= s->time;
4578 s->time= (s->last_time_base + time_incr)*s->time_increment_resolution + time_increment;
4579 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
4580 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
4581 // printf("messed up order, seeking?, skiping current b frame\n");
4582 return FRAME_SKIPED;
4585 if(s->t_frame==0) s->t_frame= s->time - s->last_time_base;
4586 if(s->t_frame==0) s->t_frame=1; // 1/0 protection
4587 //printf("%Ld %Ld %d %d\n", s->last_non_b_time, s->time, s->pp_time, s->t_frame); fflush(stdout);
4588 s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame)
4589 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
4590 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame)
4591 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
4594 s->current_picture.pts= s->time*1000LL*1000LL / s->time_increment_resolution;
4595 if(s->avctx->debug&FF_DEBUG_PTS)
4596 printf("MPEG4 PTS: %f\n", s->current_picture.pts/(1000.0*1000.0));
4598 if(check_marker(gb, "before vop_coded")==0 && s->picture_number==0){
4599 printf("hmm, seems the headers arnt complete, trying to guess time_increment_bits\n");
4600 for(s->time_increment_bits++ ;s->time_increment_bits<16; s->time_increment_bits++){
4601 if(get_bits1(gb)) break;
4603 printf("my guess is %d bits ;)\n",s->time_increment_bits);
4606 if (get_bits1(gb) != 1){
4607 printf("vop not coded\n");
4608 return FRAME_SKIPED;
4610 //printf("time %d %d %d || %Ld %Ld %Ld\n", s->time_increment_bits, s->time_increment_resolution, s->time_base,
4611 //s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time);
4612 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE
4613 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
4614 /* rounding type for motion estimation */
4615 s->no_rounding = get_bits1(gb);
4619 //FIXME reduced res stuff
4621 if (s->shape != RECT_SHAPE) {
4622 if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) {
4623 int width, height, hor_spat_ref, ver_spat_ref;
4625 width = get_bits(gb, 13);
4626 skip_bits1(gb); /* marker */
4627 height = get_bits(gb, 13);
4628 skip_bits1(gb); /* marker */
4629 hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */
4630 skip_bits1(gb); /* marker */
4631 ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */
4633 skip_bits1(gb); /* change_CR_disable */
4635 if (get_bits1(gb) != 0) {
4636 skip_bits(gb, 8); /* constant_alpha_value */
4639 //FIXME complexity estimation stuff
4641 if (s->shape != BIN_ONLY_SHAPE) {
4643 t=get_bits(gb, 3); /* intra dc VLC threshold */
4644 //printf("threshold %d\n", t);
4645 if(!s->progressive_sequence){
4646 s->top_field_first= get_bits1(gb);
4647 s->alternate_scan= get_bits1(gb);
4649 s->alternate_scan= 0;
4652 if(s->alternate_scan){
4653 ff_init_scantable(s, &s->inter_scantable , ff_alternate_vertical_scan);
4654 ff_init_scantable(s, &s->intra_scantable , ff_alternate_vertical_scan);
4655 ff_init_scantable(s, &s->intra_h_scantable, ff_alternate_vertical_scan);
4656 ff_init_scantable(s, &s->intra_v_scantable, ff_alternate_vertical_scan);
4658 ff_init_scantable(s, &s->inter_scantable , ff_zigzag_direct);
4659 ff_init_scantable(s, &s->intra_scantable , ff_zigzag_direct);
4660 ff_init_scantable(s, &s->intra_h_scantable, ff_alternate_horizontal_scan);
4661 ff_init_scantable(s, &s->intra_v_scantable, ff_alternate_vertical_scan);
4664 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
4665 mpeg4_decode_sprite_trajectory(s);
4666 if(s->sprite_brightness_change) printf("sprite_brightness_change not supported\n");
4667 if(s->vol_sprite_usage==STATIC_SPRITE) printf("static sprite not supported\n");
4670 if (s->shape != BIN_ONLY_SHAPE) {
4671 s->qscale = get_bits(gb, s->quant_precision);
4673 printf("Error, header damaged or not MPEG4 header (qscale=0)\n");
4674 return -1; // makes no sense to continue, as there is nothing left from the image then
4677 if (s->pict_type != I_TYPE) {
4678 s->f_code = get_bits(gb, 3); /* fcode_for */
4680 printf("Error, header damaged or not MPEG4 header (f_code=0)\n");
4681 return -1; // makes no sense to continue, as the MV decoding will break very quickly
4686 if (s->pict_type == B_TYPE) {
4687 s->b_code = get_bits(gb, 3);
4691 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
4692 printf("qp:%d fc:%d,%d %s size:%d pro:%d alt:%d top:%d %spel part:%d resync:%d w:%d a:%d\n",
4693 s->qscale, s->f_code, s->b_code,
4694 s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")),
4695 gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first,
4696 s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,
4697 s->sprite_warping_accuracy);
4700 if(!s->scalability){
4701 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {
4702 skip_bits1(gb); // vop shape coding type
4705 if(s->enhancement_type){
4706 int load_backward_shape= get_bits1(gb);
4707 if(load_backward_shape){
4708 printf("load backward shape isnt supported\n");
4711 skip_bits(gb, 2); //ref_select_code
4714 /* detect buggy encoders which dont set the low_delay flag (divx4/xvid/opendivx)*/
4715 // note we cannot detect divx5 without b-frames easyly (allthough its buggy too)
4716 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
4717 printf("looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
4721 s->picture_number++; // better than pic number==0 allways ;)
4723 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
4724 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
4726 if(s->divx_version==0 || s->divx_version < 500){
4727 s->h_edge_pos= s->width;
4728 s->v_edge_pos= s->height;
4734 * decode mpeg4 headers
4735 * @return <0 if no VOP found (or a damaged one)
4736 * FRAME_SKIPPED if a not coded VOP is found
4737 * 0 if a VOP is found
4739 int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb)
4743 /* search next start code */
4747 v = get_bits(gb, 8);
4748 startcode = ((startcode << 8) | v) & 0xffffffff;
4750 if(get_bits_count(gb) >= gb->size_in_bits){
4751 if(gb->size_in_bits==8 && s->divx_version){
4752 printf("frame skip %d\n", gb->size_in_bits);
4753 return FRAME_SKIPED; //divx bug
4755 return -1; //end of stream
4758 if((startcode&0xFFFFFF00) != 0x100)
4759 continue; //no startcode
4761 if(s->avctx->debug&FF_DEBUG_STARTCODE){
4762 printf("startcode: %3X ", startcode);
4763 if (startcode<=0x11F) printf("Video Object Start");
4764 else if(startcode<=0x12F) printf("Video Object Layer Start");
4765 else if(startcode<=0x13F) printf("Reserved");
4766 else if(startcode<=0x15F) printf("FGS bp start");
4767 else if(startcode<=0x1AF) printf("Reserved");
4768 else if(startcode==0x1B0) printf("Visual Object Seq Start");
4769 else if(startcode==0x1B1) printf("Visual Object Seq End");
4770 else if(startcode==0x1B2) printf("User Data");
4771 else if(startcode==0x1B3) printf("Group of VOP start");
4772 else if(startcode==0x1B4) printf("Video Session Error");
4773 else if(startcode==0x1B5) printf("Visual Object Start");
4774 else if(startcode==0x1B6) printf("Video Object Plane start");
4775 else if(startcode==0x1B7) printf("slice start");
4776 else if(startcode==0x1B8) printf("extension start");
4777 else if(startcode==0x1B9) printf("fgs start");
4778 else if(startcode==0x1BA) printf("FBA Object start");
4779 else if(startcode==0x1BB) printf("FBA Object Plane start");
4780 else if(startcode==0x1BC) printf("Mesh Object start");
4781 else if(startcode==0x1BD) printf("Mesh Object Plane start");
4782 else if(startcode==0x1BE) printf("Still Textutre Object start");
4783 else if(startcode==0x1BF) printf("Textutre Spatial Layer start");
4784 else if(startcode==0x1C0) printf("Textutre SNR Layer start");
4785 else if(startcode==0x1C1) printf("Textutre Tile start");
4786 else if(startcode==0x1C2) printf("Textutre Shape Layer start");
4787 else if(startcode==0x1C3) printf("stuffing start");
4788 else if(startcode<=0x1C5) printf("reserved");
4789 else if(startcode<=0x1FF) printf("System start");
4790 printf(" at %d\n", get_bits_count(gb));
4795 decode_vol_header(s, gb);
4797 case USER_DATA_STARTCODE:
4798 decode_user_data(s, gb);
4801 mpeg4_decode_gop_header(s, gb);
4804 return decode_vop_header(s, gb);
4814 /* don't understand why they choose a different header ! */
4815 int intel_h263_decode_picture_header(MpegEncContext *s)
4819 /* picture header */
4820 if (get_bits(&s->gb, 22) != 0x20) {
4821 fprintf(stderr, "Bad picture start code\n");
4824 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
4826 if (get_bits1(&s->gb) != 1) {
4827 fprintf(stderr, "Bad marker\n");
4828 return -1; /* marker */
4830 if (get_bits1(&s->gb) != 0) {
4831 fprintf(stderr, "Bad H263 id\n");
4832 return -1; /* h263 id */
4834 skip_bits1(&s->gb); /* split screen off */
4835 skip_bits1(&s->gb); /* camera off */
4836 skip_bits1(&s->gb); /* freeze picture release off */
4838 format = get_bits(&s->gb, 3);
4840 fprintf(stderr, "Intel H263 free format not supported\n");
4845 s->pict_type = I_TYPE + get_bits1(&s->gb);
4847 s->unrestricted_mv = get_bits1(&s->gb);
4848 s->h263_long_vectors = s->unrestricted_mv;
4850 if (get_bits1(&s->gb) != 0) {
4851 fprintf(stderr, "SAC not supported\n");
4852 return -1; /* SAC: off */
4854 if (get_bits1(&s->gb) != 0) {
4855 fprintf(stderr, "Advanced Prediction Mode not supported\n");
4856 return -1; /* advanced prediction mode: off */
4858 if (get_bits1(&s->gb) != 0) {
4859 fprintf(stderr, "PB frame mode no supported\n");
4860 return -1; /* PB frame mode */
4863 /* skip unknown header garbage */
4864 skip_bits(&s->gb, 41);
4866 s->qscale = get_bits(&s->gb, 5);
4867 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
4870 while (get_bits1(&s->gb) != 0) {
4871 skip_bits(&s->gb, 8);
4875 s->y_dc_scale_table=
4876 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;