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_t *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_t **dc_val_ptr);
76 #ifdef CONFIG_ENCODERS
77 static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
79 #endif //CONFIG_ENCODERS
80 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s);
81 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr, int *dir_ptr);
83 extern uint32_t inverse[256];
85 #ifdef CONFIG_ENCODERS
86 static uint8_t uni_DCtab_lum_len[512];
87 static uint8_t uni_DCtab_chrom_len[512];
88 static uint16_t uni_DCtab_lum_bits[512];
89 static uint16_t uni_DCtab_chrom_bits[512];
91 static uint16_t (*mv_penalty)[MAX_MV*2+1]= NULL;
92 static uint8_t fcode_tab[MAX_MV*2+1];
93 static uint8_t umv_fcode_tab[MAX_MV*2+1];
95 static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2];
96 static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2];
97 static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2];
98 static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2];
99 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
100 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
101 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
115 int h263_get_picture_format(int width, int height)
119 if (width == 128 && height == 96)
121 else if (width == 176 && height == 144)
123 else if (width == 352 && height == 288)
125 else if (width == 704 && height == 576)
127 else if (width == 1408 && height == 1152)
134 #ifdef CONFIG_ENCODERS
136 static void float_aspect_to_info(MpegEncContext * s, float aspect){
139 aspect*= s->height/(double)s->width;
140 //printf("%f\n", aspect);
142 if(aspect==0) aspect= 1.0;
144 ff_float2fraction(&s->aspected_width, &s->aspected_height, aspect, 255);
146 //printf("%d %d\n", s->aspected_width, s->aspected_height);
148 if(s->aspected_width == pixel_aspect[i][0] && s->aspected_height== pixel_aspect[i][1]){
149 s->aspect_ratio_info=i;
154 s->aspect_ratio_info= FF_ASPECT_EXTENDED;
157 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
161 align_put_bits(&s->pb);
163 /* Update the pointer to last GOB */
164 s->ptr_lastgob = pbBufPtr(&s->pb);
167 put_bits(&s->pb, 22, 0x20); /* PSC */
168 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * FRAME_RATE_BASE) /
169 s->frame_rate) & 0xff);
171 put_bits(&s->pb, 1, 1); /* marker */
172 put_bits(&s->pb, 1, 0); /* h263 id */
173 put_bits(&s->pb, 1, 0); /* split screen off */
174 put_bits(&s->pb, 1, 0); /* camera off */
175 put_bits(&s->pb, 1, 0); /* freeze picture release off */
177 format = h263_get_picture_format(s->width, s->height);
180 put_bits(&s->pb, 3, format);
181 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
182 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
183 of H.263v1 UMV implies to check the predicted MV after
184 calculation of the current MB to see if we're on the limits */
185 put_bits(&s->pb, 1, 0); /* unrestricted motion vector: off */
186 put_bits(&s->pb, 1, 0); /* SAC: off */
187 put_bits(&s->pb, 1, 0); /* advanced prediction mode: off */
188 put_bits(&s->pb, 1, 0); /* not PB frame */
189 put_bits(&s->pb, 5, s->qscale);
190 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
193 /* H.263 Plus PTYPE */
194 put_bits(&s->pb, 3, 7);
195 put_bits(&s->pb,3,1); /* Update Full Extended PTYPE */
197 put_bits(&s->pb,3,6); /* Custom Source Format */
199 put_bits(&s->pb, 3, format);
201 put_bits(&s->pb,1,0); /* Custom PCF: off */
202 s->umvplus = s->unrestricted_mv;
203 put_bits(&s->pb, 1, s->umvplus); /* Unrestricted Motion Vector */
204 put_bits(&s->pb,1,0); /* SAC: off */
205 put_bits(&s->pb,1,0); /* Advanced Prediction Mode: off */
206 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
207 put_bits(&s->pb,1,0); /* Deblocking Filter: off */
208 put_bits(&s->pb,1,0); /* Slice Structured: off */
209 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
210 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
211 put_bits(&s->pb,1,0); /* Alternative Inter VLC: off */
212 put_bits(&s->pb,1,0); /* Modified Quantization: off */
213 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
214 put_bits(&s->pb,3,0); /* Reserved */
216 put_bits(&s->pb, 3, s->pict_type == P_TYPE);
218 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
219 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
220 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
221 put_bits(&s->pb,2,0); /* Reserved */
222 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
224 /* This should be here if PLUSPTYPE */
225 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
228 /* Custom Picture Format (CPFMT) */
229 float_aspect_to_info(s, s->avctx->aspect_ratio);
231 put_bits(&s->pb,4,s->aspect_ratio_info);
232 put_bits(&s->pb,9,(s->width >> 2) - 1);
233 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
234 put_bits(&s->pb,9,(s->height >> 2));
235 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED)
237 put_bits(&s->pb, 8, s->aspected_width);
238 put_bits(&s->pb, 8, s->aspected_height);
242 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
244 // put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
245 put_bits(&s->pb,2,1); /* unlimited */
247 put_bits(&s->pb, 5, s->qscale);
250 put_bits(&s->pb, 1, 0); /* no PEI */
254 s->c_dc_scale_table= h263_aic_dc_scale_table;
257 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
262 * Encodes a group of blocks header.
264 int h263_encode_gob_header(MpegEncContext * s, int mb_line)
266 align_put_bits(&s->pb);
267 flush_put_bits(&s->pb);
268 /* Call the RTP callback to send the last GOB */
269 if (s->rtp_callback) {
270 int pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
271 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
273 put_bits(&s->pb, 17, 1); /* GBSC */
274 s->gob_number = mb_line / s->gob_index;
275 put_bits(&s->pb, 5, s->gob_number); /* GN */
276 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
277 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
278 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
282 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6])
284 int score0=0, score1=0;
286 int8_t * const qscale_table= s->current_picture.qscale_table;
289 int16_t *ac_val, *ac_val1;
291 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
294 const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width;
296 ac_val-= s->block_wrap[n]*16;
297 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
300 const int level= block[n][s->dsp.idct_permutation[i ]];
302 score1+= ABS(level - ac_val[i+8]);
303 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
307 /* different qscale, we must rescale */
309 const int level= block[n][s->dsp.idct_permutation[i ]];
311 score1+= ABS(level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale));
312 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
317 const int xy= s->mb_x-1 + s->mb_y*s->mb_width;
318 /* left prediction */
320 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
323 const int level= block[n][s->dsp.idct_permutation[i<<3]];
325 score1+= ABS(level - ac_val[i]);
327 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
330 /* different qscale, we must rescale */
332 const int level= block[n][s->dsp.idct_permutation[i<<3]];
334 score1+= ABS(level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale));
336 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
342 return score0 > score1 ? 1 : 0;
346 * modify qscale so that encoding is acually possible in h263 (limit difference to -2..2)
348 void ff_clean_h263_qscales(MpegEncContext *s){
350 int8_t * const qscale_table= s->current_picture.qscale_table;
352 for(i=1; i<s->mb_num; i++){
353 if(qscale_table[i] - qscale_table[i-1] >2)
354 qscale_table[i]= qscale_table[i-1]+2;
356 for(i=s->mb_num-2; i>=0; i--){
357 if(qscale_table[i] - qscale_table[i+1] >2)
358 qscale_table[i]= qscale_table[i+1]+2;
363 * modify mb_type & qscale so that encoding is acually possible in mpeg4
365 void ff_clean_mpeg4_qscales(MpegEncContext *s){
367 int8_t * const qscale_table= s->current_picture.qscale_table;
369 ff_clean_h263_qscales(s);
371 for(i=1; i<s->mb_num; i++){
372 if(qscale_table[i] != qscale_table[i-1] && (s->mb_type[i]&MB_TYPE_INTER4V)){
373 s->mb_type[i]&= ~MB_TYPE_INTER4V;
374 s->mb_type[i]|= MB_TYPE_INTER;
378 if(s->pict_type== B_TYPE){
380 /* ok, come on, this isnt funny anymore, theres more code for handling this mpeg4 mess than
381 for the actual adaptive quantization */
383 for(i=0; i<s->mb_num; i++){
384 odd += qscale_table[i]&1;
387 if(2*odd > s->mb_num) odd=1;
390 for(i=0; i<s->mb_num; i++){
391 if((qscale_table[i]&1) != odd)
393 if(qscale_table[i] > 31)
397 for(i=1; i<s->mb_num; i++){
398 if(qscale_table[i] != qscale_table[i-1] && (s->mb_type[i]&MB_TYPE_DIRECT)){
399 s->mb_type[i]&= ~MB_TYPE_DIRECT;
400 s->mb_type[i]|= MB_TYPE_BIDIR;
406 #endif //CONFIG_ENCODERS
408 void ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){
409 const int mb_index= s->mb_x + s->mb_y*s->mb_width;
410 int xy= s->block_index[0];
411 uint16_t time_pp= s->pp_time;
412 uint16_t time_pb= s->pb_time;
415 //FIXME avoid divides
416 switch(s->co_located_type_table[mb_index]){
418 s->mv[0][0][0] = s->mv[0][1][0] = s->mv[0][2][0] = s->mv[0][3][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
419 s->mv[0][0][1] = s->mv[0][1][1] = s->mv[0][2][1] = s->mv[0][3][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
420 s->mv[1][0][0] = s->mv[1][1][0] = s->mv[1][2][0] = s->mv[1][3][0] = mx ? s->mv[0][0][0] - s->motion_val[xy][0]
421 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
422 s->mv[1][0][1] = s->mv[1][1][1] = s->mv[1][2][1] = s->mv[1][3][1] = my ? s->mv[0][0][1] - s->motion_val[xy][1]
423 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
424 if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample)
425 s->mv_type= MV_TYPE_16X16;
427 s->mv_type= MV_TYPE_8X8;
429 case CO_LOCATED_TYPE_4MV:
430 s->mv_type = MV_TYPE_8X8;
432 xy= s->block_index[i];
433 s->mv[0][i][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
434 s->mv[0][i][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
435 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->motion_val[xy][0]
436 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
437 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->motion_val[xy][1]
438 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
441 case CO_LOCATED_TYPE_FIELDMV:
442 s->mv_type = MV_TYPE_FIELD;
444 if(s->top_field_first){
445 time_pp= s->pp_field_time - s->field_select_table[mb_index][i] + i;
446 time_pb= s->pb_field_time - s->field_select_table[mb_index][i] + i;
448 time_pp= s->pp_field_time + s->field_select_table[mb_index][i] - i;
449 time_pb= s->pb_field_time + s->field_select_table[mb_index][i] - i;
451 s->mv[0][i][0] = s->field_mv_table[mb_index][i][0]*time_pb/time_pp + mx;
452 s->mv[0][i][1] = s->field_mv_table[mb_index][i][1]*time_pb/time_pp + my;
453 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->field_mv_table[mb_index][i][0]
454 : s->field_mv_table[mb_index][i][0]*(time_pb - time_pp)/time_pp;
455 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->field_mv_table[mb_index][i][1]
456 : s->field_mv_table[mb_index][i][1]*(time_pb - time_pp)/time_pp;
462 #ifdef CONFIG_ENCODERS
463 void mpeg4_encode_mb(MpegEncContext * s,
464 DCTELEM block[6][64],
465 int motion_x, int motion_y)
467 int cbpc, cbpy, pred_x, pred_y;
469 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
470 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=B_TYPE ? &s->tex_pb : &s->pb;
471 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=I_TYPE ? &s->pb2 : &s->pb;
472 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
473 const int dquant_code[5]= {1,0,9,2,3};
475 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
479 for (i = 0; i < 6; i++) {
480 if (s->block_last_index[i] >= 0)
484 if(s->pict_type==B_TYPE){
485 static const int mb_type_table[8]= {-1, 2, 3, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
486 int mb_type= mb_type_table[s->mv_dir];
492 s->last_mv[1][0][1]= 0;
495 assert(s->dquant>=-2 && s->dquant<=2);
496 assert((s->dquant&1)==0);
499 /* nothing to do if this MB was skiped in the next P Frame */
500 if(s->next_picture.mbskip_table[s->mb_y * s->mb_width + s->mb_x]){ //FIXME avoid DCT & ...
506 s->mv_dir= MV_DIR_FORWARD; //doesnt matter
507 s->qscale -= s->dquant;
513 if ((cbp | motion_x | motion_y | mb_type) ==0) {
514 /* direct MB with MV={0,0} */
515 assert(s->dquant==0);
517 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
519 if(interleaved_stats){
527 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
528 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
529 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we dont need it :)
530 if(cbp) put_bits(&s->pb, 6, cbp);
534 put_bits(&s->pb, 2, (s->dquant>>2)+3);
536 put_bits(&s->pb, 1, 0);
538 s->qscale -= s->dquant;
540 if(!s->progressive_sequence){
542 put_bits(&s->pb, 1, s->interlaced_dct);
543 if(mb_type) // not diect mode
544 put_bits(&s->pb, 1, 0); // no interlaced ME yet
547 if(interleaved_stats){
548 bits= get_bit_count(&s->pb);
549 s->misc_bits+= bits - s->last_bits;
556 h263_encode_motion(s, motion_x, 1);
557 h263_encode_motion(s, motion_y, 1);
562 h263_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code);
563 h263_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
564 h263_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code);
565 h263_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
566 s->last_mv[0][0][0]= s->mv[0][0][0];
567 s->last_mv[0][0][1]= s->mv[0][0][1];
568 s->last_mv[1][0][0]= s->mv[1][0][0];
569 s->last_mv[1][0][1]= s->mv[1][0][1];
573 case 2: /* backward */
574 h263_encode_motion(s, motion_x - s->last_mv[1][0][0], s->b_code);
575 h263_encode_motion(s, motion_y - s->last_mv[1][0][1], s->b_code);
576 s->last_mv[1][0][0]= motion_x;
577 s->last_mv[1][0][1]= motion_y;
580 case 3: /* forward */
581 h263_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);
582 h263_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);
583 s->last_mv[0][0][0]= motion_x;
584 s->last_mv[0][0][1]= motion_y;
588 printf("unknown mb type\n");
592 if(interleaved_stats){
593 bits= get_bit_count(&s->pb);
594 s->mv_bits+= bits - s->last_bits;
598 /* encode each block */
599 for (i = 0; i < 6; i++) {
600 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, NULL, &s->pb);
603 if(interleaved_stats){
604 bits= get_bit_count(&s->pb);
605 s->p_tex_bits+= bits - s->last_bits;
608 }else{ /* s->pict_type==B_TYPE */
609 if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
610 /* check if the B frames can skip it too, as we must skip it if we skip here
611 why didnt they just compress the skip-mb bits instead of reusing them ?! */
612 if(s->max_b_frames>0){
619 if(x+16 > s->width) x= s->width-16;
620 if(y+16 > s->height) y= s->height-16;
622 offset= x + y*s->linesize;
623 p_pic= s->new_picture.data[0] + offset;
626 for(i=0; i<s->max_b_frames; i++){
629 Picture *pic= s->reordered_input_picture[i+1];
631 if(pic==NULL || pic->pict_type!=B_TYPE) break;
633 b_pic= pic->data[0] + offset + 16; //FIXME +16
634 diff= s->dsp.pix_abs16x16(p_pic, b_pic, s->linesize);
635 if(diff>s->qscale*70){ //FIXME check that 70 is optimal
644 /* skip macroblock */
645 put_bits(&s->pb, 1, 1);
647 if(interleaved_stats){
656 put_bits(&s->pb, 1, 0); /* mb coded */
657 if(s->mv_type==MV_TYPE_16X16){
659 if(s->dquant) cbpc+= 8;
661 inter_MCBPC_bits[cbpc],
662 inter_MCBPC_code[cbpc]);
666 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
668 put_bits(pb2, 2, dquant_code[s->dquant+2]);
670 if(!s->progressive_sequence){
672 put_bits(pb2, 1, s->interlaced_dct);
673 put_bits(pb2, 1, 0); // no interlaced ME yet
676 if(interleaved_stats){
677 bits= get_bit_count(&s->pb);
678 s->misc_bits+= bits - s->last_bits;
682 /* motion vectors: 16x16 mode */
683 h263_pred_motion(s, 0, &pred_x, &pred_y);
685 h263_encode_motion(s, motion_x - pred_x, s->f_code);
686 h263_encode_motion(s, motion_y - pred_y, s->f_code);
690 inter_MCBPC_bits[cbpc],
691 inter_MCBPC_code[cbpc]);
694 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
696 if(!s->progressive_sequence){
698 put_bits(pb2, 1, s->interlaced_dct);
701 if(interleaved_stats){
702 bits= get_bit_count(&s->pb);
703 s->misc_bits+= bits - s->last_bits;
708 /* motion vectors: 8x8 mode*/
709 h263_pred_motion(s, i, &pred_x, &pred_y);
711 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][0] - pred_x, s->f_code);
712 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][1] - pred_y, s->f_code);
716 if(interleaved_stats){
717 bits= get_bit_count(&s->pb);
718 s->mv_bits+= bits - s->last_bits;
722 /* encode each block */
723 for (i = 0; i < 6; i++) {
724 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, NULL, tex_pb);
727 if(interleaved_stats){
728 bits= get_bit_count(&s->pb);
729 s->p_tex_bits+= bits - s->last_bits;
736 int dc_diff[6]; //dc values with the dc prediction subtracted
737 int dir[6]; //prediction direction
738 int zigzag_last_index[6];
739 uint8_t *scan_table[6];
743 const int level= block[i][0];
746 dc_diff[i]= level - ff_mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]);
748 *dc_ptr = level * s->y_dc_scale;
750 *dc_ptr = level * s->c_dc_scale;
754 s->ac_pred= decide_ac_pred(s, block, dir);
761 mpeg4_inv_pred_ac(s, block[i], i, dir[i]);
762 if (dir[i]==0) st = s->intra_v_scantable.permutated; /* left */
763 else st = s->intra_h_scantable.permutated; /* top */
765 for(last_index=63; last_index>=0; last_index--) //FIXME optimize
766 if(block[i][st[last_index]]) break;
767 zigzag_last_index[i]= s->block_last_index[i];
768 s->block_last_index[i]= last_index;
773 scan_table[i]= s->intra_scantable.permutated;
778 for (i = 0; i < 6; i++) {
779 if (s->block_last_index[i] >= 1)
784 if (s->pict_type == I_TYPE) {
785 if(s->dquant) cbpc+=4;
787 intra_MCBPC_bits[cbpc],
788 intra_MCBPC_code[cbpc]);
790 if(s->dquant) cbpc+=8;
791 put_bits(&s->pb, 1, 0); /* mb coded */
793 inter_MCBPC_bits[cbpc + 4],
794 inter_MCBPC_code[cbpc + 4]);
796 put_bits(pb2, 1, s->ac_pred);
798 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
800 put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
802 if(!s->progressive_sequence){
803 put_bits(dc_pb, 1, s->interlaced_dct);
806 if(interleaved_stats){
807 bits= get_bit_count(&s->pb);
808 s->misc_bits+= bits - s->last_bits;
812 /* encode each block */
813 for (i = 0; i < 6; i++) {
814 mpeg4_encode_block(s, block[i], i, dc_diff[i], scan_table[i], dc_pb, tex_pb);
817 if(interleaved_stats){
818 bits= get_bit_count(&s->pb);
819 s->i_tex_bits+= bits - s->last_bits;
824 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
830 ac_val = s->ac_val[0][0] + s->block_index[i] * 16;
834 block[i][s->dsp.idct_permutation[j ]]= ac_val[j+8];
837 block[i][s->dsp.idct_permutation[j<<3]]= ac_val[j ];
839 s->block_last_index[i]= zigzag_last_index[i];
845 void h263_encode_mb(MpegEncContext * s,
846 DCTELEM block[6][64],
847 int motion_x, int motion_y)
849 int cbpc, cbpy, i, cbp, pred_x, pred_y;
851 int16_t rec_intradc[6];
853 const int dquant_code[5]= {1,0,9,2,3};
855 //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
859 for (i = 0; i < 6; i++) {
860 if (s->block_last_index[i] >= 0)
863 if ((cbp | motion_x | motion_y | s->dquant) == 0) {
864 /* skip macroblock */
865 put_bits(&s->pb, 1, 1);
868 put_bits(&s->pb, 1, 0); /* mb coded */
870 if(s->dquant) cbpc+= 8;
872 inter_MCBPC_bits[cbpc],
873 inter_MCBPC_code[cbpc]);
876 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
878 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
880 /* motion vectors: 16x16 mode only now */
881 h263_pred_motion(s, 0, &pred_x, &pred_y);
884 h263_encode_motion(s, motion_x - pred_x, s->f_code);
885 h263_encode_motion(s, motion_y - pred_y, s->f_code);
888 h263p_encode_umotion(s, motion_x - pred_x);
889 h263p_encode_umotion(s, motion_y - pred_y);
890 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
891 /* To prevent Start Code emulation */
892 put_bits(&s->pb,1,1);
895 int li = s->h263_aic ? 0 : 1;
900 if (s->h263_aic && s->mb_intra) {
901 int16_t level = block[i][0];
903 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
907 level = (level + (s->qscale >> 1))/(s->y_dc_scale);
909 level = (level - (s->qscale >> 1))/(s->y_dc_scale);
911 /* AIC can change CBP */
912 if (level == 0 && s->block_last_index[i] == 0)
913 s->block_last_index[i] = -1;
914 else if (level < -127)
916 else if (level > 127)
921 rec_intradc[i] = (s->y_dc_scale*level) + pred_dc;
924 //if ((rec_intradc[i] % 2) == 0)
927 if (rec_intradc[i] < 0)
929 else if (rec_intradc[i] > 2047)
930 rec_intradc[i] = 2047;
932 /* Update AC/DC tables */
933 *dc_ptr[i] = rec_intradc[i];
936 if (s->block_last_index[i] >= li)
941 if (s->pict_type == I_TYPE) {
942 if(s->dquant) cbpc+=4;
944 intra_MCBPC_bits[cbpc],
945 intra_MCBPC_code[cbpc]);
947 if(s->dquant) cbpc+=8;
948 put_bits(&s->pb, 1, 0); /* mb coded */
950 inter_MCBPC_bits[cbpc + 4],
951 inter_MCBPC_code[cbpc + 4]);
954 /* XXX: currently, we do not try to use ac prediction */
955 put_bits(&s->pb, 1, 0); /* no AC prediction */
958 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
960 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
964 /* encode each block */
965 h263_encode_block(s, block[i], i);
967 /* Update INTRADC for decoding */
968 if (s->h263_aic && s->mb_intra) {
969 block[i][0] = rec_intradc[i];
976 static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr)
978 int x, y, wrap, a, c, pred_dc, scale;
979 int16_t *dc_val, *ac_val;
981 /* find prediction */
983 x = 2 * s->mb_x + 1 + (n & 1);
984 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
985 wrap = s->mb_width * 2 + 2;
986 dc_val = s->dc_val[0];
987 ac_val = s->ac_val[0][0];
988 scale = s->y_dc_scale;
992 wrap = s->mb_width + 2;
993 dc_val = s->dc_val[n - 4 + 1];
994 ac_val = s->ac_val[n - 4 + 1][0];
995 scale = s->c_dc_scale;
1000 a = dc_val[(x - 1) + (y) * wrap];
1001 c = dc_val[(x) + (y - 1) * wrap];
1003 /* No prediction outside GOB boundary */
1004 if (s->first_slice_line && ((n < 2) || (n > 3)))
1007 /* just DC prediction */
1008 if (a != 1024 && c != 1024)
1009 pred_dc = (a + c) >> 1;
1015 /* we assume pred is positive */
1016 //pred_dc = (pred_dc + (scale >> 1)) / scale;
1017 *dc_val_ptr = &dc_val[x + y * wrap];
1021 static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n)
1023 int x, y, wrap, a, c, pred_dc, scale, i;
1024 int16_t *dc_val, *ac_val, *ac_val1;
1026 /* find prediction */
1028 x = 2 * s->mb_x + 1 + (n & 1);
1029 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
1030 wrap = s->mb_width * 2 + 2;
1031 dc_val = s->dc_val[0];
1032 ac_val = s->ac_val[0][0];
1033 scale = s->y_dc_scale;
1037 wrap = s->mb_width + 2;
1038 dc_val = s->dc_val[n - 4 + 1];
1039 ac_val = s->ac_val[n - 4 + 1][0];
1040 scale = s->c_dc_scale;
1043 ac_val += ((y) * wrap + (x)) * 16;
1049 a = dc_val[(x - 1) + (y) * wrap];
1050 c = dc_val[(x) + (y - 1) * wrap];
1052 /* No prediction outside GOB boundary */
1053 if (s->first_slice_line && ((n < 2) || (n > 3)))
1057 if (s->h263_aic_dir) {
1058 /* left prediction */
1062 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
1067 /* top prediction */
1069 ac_val -= 16 * wrap;
1071 block[s->dsp.idct_permutation[i ]] += ac_val[i + 8];
1077 /* just DC prediction */
1078 if (a != 1024 && c != 1024)
1079 pred_dc = (a + c) >> 1;
1086 /* we assume pred is positive */
1087 block[0]=block[0]*scale + pred_dc;
1091 else if (!(block[0] & 1))
1094 /* Update AC/DC tables */
1095 dc_val[(x) + (y) * wrap] = block[0];
1099 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
1102 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
1105 int16_t *h263_pred_motion(MpegEncContext * s, int block,
1109 int16_t *A, *B, *C, *mot_val;
1110 static const int off[4]= {2, 1, 1, -1};
1112 wrap = s->block_wrap[0];
1113 xy = s->block_index[block];
1115 mot_val = s->motion_val[xy];
1117 A = s->motion_val[xy - 1];
1118 /* special case for first (slice) line */
1119 if (s->first_slice_line && block<3) {
1120 // we cant just change some MVs to simulate that as we need them for the B frames (and ME)
1121 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
1122 if(block==0){ //most common case
1123 if(s->mb_x == s->resync_mb_x){ //rare
1125 }else if(s->mb_x + 1 == s->resync_mb_x){ //rare
1126 C = s->motion_val[xy + off[block] - wrap];
1131 *px = mid_pred(A[0], 0, C[0]);
1132 *py = mid_pred(A[1], 0, C[1]);
1139 if(s->mb_x + 1 == s->resync_mb_x){ //rare
1140 C = s->motion_val[xy + off[block] - wrap];
1141 *px = mid_pred(A[0], 0, C[0]);
1142 *py = mid_pred(A[1], 0, C[1]);
1147 }else{ /* block==2*/
1148 B = s->motion_val[xy - wrap];
1149 C = s->motion_val[xy + off[block] - wrap];
1150 if(s->mb_x == s->resync_mb_x) //rare
1153 *px = mid_pred(A[0], B[0], C[0]);
1154 *py = mid_pred(A[1], B[1], C[1]);
1157 B = s->motion_val[xy - wrap];
1158 C = s->motion_val[xy + off[block] - wrap];
1159 *px = mid_pred(A[0], B[0], C[0]);
1160 *py = mid_pred(A[1], B[1], C[1]);
1165 #ifdef CONFIG_ENCODERS
1166 static void h263_encode_motion(MpegEncContext * s, int val, int f_code)
1168 int range, l, bit_size, sign, code, bits;
1173 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1175 bit_size = f_code - 1;
1176 range = 1 << bit_size;
1177 /* modulo encoding */
1184 val= (val^sign)-sign;
1189 } else if (val >= l) {
1193 assert(val>=-l && val<l);
1203 code = (val >> bit_size) + 1;
1204 bits = val & (range - 1);
1206 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1208 put_bits(&s->pb, bit_size, bits);
1214 /* Encode MV differences on H.263+ with Unrestricted MV mode */
1215 static void h263p_encode_umotion(MpegEncContext * s, int val)
1225 put_bits(&s->pb, 1, 1);
1227 put_bits(&s->pb, 3, 0);
1229 put_bits(&s->pb, 3, 2);
1232 sval = ((val < 0) ? (short)(-val):(short)val);
1235 while (temp_val != 0) {
1236 temp_val = temp_val >> 1;
1242 tcode = (sval & (1 << (i-1))) >> (i-1);
1243 tcode = (tcode << 1) | 1;
1244 code = (code << 2) | tcode;
1247 code = ((code << 1) | (val < 0)) << 1;
1248 put_bits(&s->pb, (2*n_bits)+1, code);
1249 //printf("\nVal = %d\tCode = %d", sval, code);
1253 static void init_mv_penalty_and_fcode(MpegEncContext *s)
1258 if(mv_penalty==NULL)
1259 mv_penalty= av_mallocz( sizeof(uint16_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
1261 for(f_code=1; f_code<=MAX_FCODE; f_code++){
1262 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
1265 if(mv==0) len= mvtab[0][1];
1267 int val, bit_size, range, code;
1269 bit_size = s->f_code - 1;
1270 range = 1 << bit_size;
1276 code = (val >> bit_size) + 1;
1278 len= mvtab[code][1] + 1 + bit_size;
1280 len= mvtab[32][1] + 2 + bit_size;
1284 mv_penalty[f_code][mv+MAX_MV]= len;
1288 for(f_code=MAX_FCODE; f_code>0; f_code--){
1289 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
1290 fcode_tab[mv+MAX_MV]= f_code;
1294 for(mv=0; mv<MAX_MV*2+1; mv++){
1295 umv_fcode_tab[mv]= 1;
1300 #ifdef CONFIG_ENCODERS
1302 static void init_uni_dc_tab(void)
1304 int level, uni_code, uni_len;
1306 for(level=-256; level<256; level++){
1308 /* find number of bits */
1317 l= (-level) ^ ((1 << size) - 1);
1322 uni_code= DCtab_lum[size][0];
1323 uni_len = DCtab_lum[size][1];
1326 uni_code<<=size; uni_code|=l;
1329 uni_code<<=1; uni_code|=1;
1333 uni_DCtab_lum_bits[level+256]= uni_code;
1334 uni_DCtab_lum_len [level+256]= uni_len;
1337 uni_code= DCtab_chrom[size][0];
1338 uni_len = DCtab_chrom[size][1];
1341 uni_code<<=size; uni_code|=l;
1344 uni_code<<=1; uni_code|=1;
1348 uni_DCtab_chrom_bits[level+256]= uni_code;
1349 uni_DCtab_chrom_len [level+256]= uni_len;
1354 #endif //CONFIG_ENCODERS
1356 #ifdef CONFIG_ENCODERS
1357 static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1358 int slevel, run, last;
1360 assert(MAX_LEVEL >= 64);
1361 assert(MAX_RUN >= 63);
1363 for(slevel=-64; slevel<64; slevel++){
1364 if(slevel==0) continue;
1365 for(run=0; run<64; run++){
1366 for(last=0; last<=1; last++){
1367 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1368 int level= slevel < 0 ? -slevel : slevel;
1369 int sign= slevel < 0 ? 1 : 0;
1370 int bits, len, code;
1373 len_tab[index]= 100;
1376 code= get_rl_index(rl, last, run, level);
1377 bits= rl->table_vlc[code][0];
1378 len= rl->table_vlc[code][1];
1379 bits=bits*2+sign; len++;
1381 if(code!=rl->n && len < len_tab[index]){
1382 bits_tab[index]= bits;
1383 len_tab [index]= len;
1387 bits= rl->table_vlc[rl->n][0];
1388 len= rl->table_vlc[rl->n][1];
1389 bits=bits*2; len++; //esc1
1390 level1= level - rl->max_level[last][run];
1392 code= get_rl_index(rl, last, run, level1);
1393 bits<<= rl->table_vlc[code][1];
1394 len += rl->table_vlc[code][1];
1395 bits += rl->table_vlc[code][0];
1396 bits=bits*2+sign; len++;
1398 if(code!=rl->n && len < len_tab[index]){
1399 bits_tab[index]= bits;
1400 len_tab [index]= len;
1406 bits= rl->table_vlc[rl->n][0];
1407 len= rl->table_vlc[rl->n][1];
1408 bits=bits*4+2; len+=2; //esc2
1409 run1 = run - rl->max_run[last][level] - 1;
1411 code= get_rl_index(rl, last, run1, level);
1412 bits<<= rl->table_vlc[code][1];
1413 len += rl->table_vlc[code][1];
1414 bits += rl->table_vlc[code][0];
1415 bits=bits*2+sign; len++;
1417 if(code!=rl->n && len < len_tab[index]){
1418 bits_tab[index]= bits;
1419 len_tab [index]= len;
1424 bits= rl->table_vlc[rl->n][0];
1425 len = rl->table_vlc[rl->n][1];
1426 bits=bits*4+3; len+=2; //esc3
1427 bits=bits*2+last; len++;
1428 bits=bits*64+run; len+=6;
1429 bits=bits*2+1; len++; //marker
1430 bits=bits*4096+(slevel&0xfff); len+=12;
1431 bits=bits*2+1; len++; //marker
1433 if(len < len_tab[index]){
1434 bits_tab[index]= bits;
1435 len_tab [index]= len;
1442 void h263_encode_init(MpegEncContext *s)
1444 static int done = 0;
1453 init_rl(&rl_intra_aic);
1455 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
1456 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
1458 init_mv_penalty_and_fcode(s);
1460 s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
1462 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
1463 switch(s->codec_id){
1464 case CODEC_ID_MPEG4:
1465 s->fcode_tab= fcode_tab;
1466 s->min_qcoeff= -2048;
1467 s->max_qcoeff= 2047;
1468 s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len;
1469 s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64;
1470 s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len;
1471 s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64;
1472 s->luma_dc_vlc_length= uni_DCtab_lum_len;
1473 s->chroma_dc_vlc_length= uni_DCtab_chrom_len;
1474 s->ac_esc_length= 7+2+1+6+1+12+1;
1476 case CODEC_ID_H263P:
1477 s->fcode_tab= umv_fcode_tab;
1478 s->min_qcoeff= -127;
1481 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
1482 default: //nothing needed default table allready set in mpegvideo.c
1483 s->min_qcoeff= -127;
1485 s->y_dc_scale_table=
1486 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
1490 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
1491 s->inter_quant_bias= 0;
1493 s->intra_quant_bias=0;
1494 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
1499 * encodes a 8x8 block.
1500 * @param block the 8x8 block
1501 * @param n block index (0-3 are luma, 4-5 are chroma)
1503 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
1505 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
1509 if (s->mb_intra && !s->h263_aic) {
1512 /* 255 cannot be represented, so we clamp */
1517 /* 0 cannot be represented also */
1518 else if (level < 1) {
1522 if (level == 128) //FIXME check rv10
1523 put_bits(&s->pb, 8, 0xff);
1525 put_bits(&s->pb, 8, level & 0xff);
1529 if (s->h263_aic && s->mb_intra)
1534 last_index = s->block_last_index[n];
1535 last_non_zero = i - 1;
1536 for (; i <= last_index; i++) {
1537 j = s->intra_scantable.permutated[i];
1540 run = i - last_non_zero - 1;
1541 last = (i == last_index);
1548 code = get_rl_index(rl, last, run, level);
1549 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1550 if (code == rl->n) {
1551 put_bits(&s->pb, 1, last);
1552 put_bits(&s->pb, 6, run);
1554 assert(slevel != 0);
1556 if(slevel < 128 && slevel > -128)
1557 put_bits(&s->pb, 8, slevel & 0xff);
1559 put_bits(&s->pb, 8, 128);
1560 put_bits(&s->pb, 5, slevel & 0x1f);
1561 put_bits(&s->pb, 6, (slevel>>5)&0x3f);
1564 put_bits(&s->pb, 1, sign);
1572 #ifdef CONFIG_ENCODERS
1574 /***************************************************/
1576 * add mpeg4 stuffing bits (01...1)
1578 void ff_mpeg4_stuffing(PutBitContext * pbc)
1581 put_bits(pbc, 1, 0);
1582 length= (-get_bit_count(pbc))&7;
1583 if(length) put_bits(pbc, length, (1<<length)-1);
1586 /* must be called before writing the header */
1587 void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){
1588 int time_div, time_mod;
1590 if(s->pict_type==I_TYPE){ //we will encode a vol header
1591 s->time_increment_resolution= s->frame_rate/ff_gcd(s->frame_rate, FRAME_RATE_BASE);
1592 if(s->time_increment_resolution>=256*256) s->time_increment_resolution= 256*128;
1594 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
1597 if(s->current_picture.pts)
1598 s->time= (s->current_picture.pts*s->time_increment_resolution + 500*1000)/(1000*1000);
1600 s->time= picture_number*(int64_t)FRAME_RATE_BASE*s->time_increment_resolution/s->frame_rate;
1601 time_div= s->time/s->time_increment_resolution;
1602 time_mod= s->time%s->time_increment_resolution;
1604 if(s->pict_type==B_TYPE){
1605 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
1607 s->last_time_base= s->time_base;
1608 s->time_base= time_div;
1609 s->pp_time= s->time - s->last_non_b_time;
1610 s->last_non_b_time= s->time;
1614 static void mpeg4_encode_gop_header(MpegEncContext * s){
1615 int hours, minutes, seconds;
1617 put_bits(&s->pb, 16, 0);
1618 put_bits(&s->pb, 16, GOP_STARTCODE);
1620 seconds= s->time/s->time_increment_resolution;
1621 minutes= seconds/60; seconds %= 60;
1622 hours= minutes/60; minutes %= 60;
1625 put_bits(&s->pb, 5, hours);
1626 put_bits(&s->pb, 6, minutes);
1627 put_bits(&s->pb, 1, 1);
1628 put_bits(&s->pb, 6, seconds);
1630 put_bits(&s->pb, 1, 0); //closed gov == NO
1631 put_bits(&s->pb, 1, 0); //broken link == NO
1633 ff_mpeg4_stuffing(&s->pb);
1636 static void mpeg4_encode_visual_object_header(MpegEncContext * s){
1637 int profile_and_level_indication;
1640 if(s->max_b_frames || s->quarter_sample){
1641 profile_and_level_indication= 0xF1; // adv simple level 1
1644 profile_and_level_indication= 0x01; // simple level 1
1649 put_bits(&s->pb, 16, 0);
1650 put_bits(&s->pb, 16, VOS_STARTCODE);
1652 put_bits(&s->pb, 8, profile_and_level_indication);
1654 put_bits(&s->pb, 16, 0);
1655 put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);
1657 put_bits(&s->pb, 1, 1);
1658 put_bits(&s->pb, 4, vo_ver_id);
1659 put_bits(&s->pb, 3, 1); //priority
1661 put_bits(&s->pb, 4, 1); //visual obj type== video obj
1663 put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME
1665 ff_mpeg4_stuffing(&s->pb);
1668 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number)
1673 if(s->max_b_frames || s->quarter_sample){
1675 s->vo_type= ADV_SIMPLE_VO_TYPE;
1678 s->vo_type= SIMPLE_VO_TYPE;
1681 put_bits(&s->pb, 16, 0);
1682 put_bits(&s->pb, 16, 0x100 + vo_number); /* video obj */
1683 put_bits(&s->pb, 16, 0);
1684 put_bits(&s->pb, 16, 0x120 + vol_number); /* video obj layer */
1686 put_bits(&s->pb, 1, 0); /* random access vol */
1687 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
1688 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
1689 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
1690 put_bits(&s->pb, 3, 1); /* is obj layer priority */
1692 float_aspect_to_info(s, s->avctx->aspect_ratio);
1694 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
1695 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED)
1697 put_bits(&s->pb, 8, s->aspected_width);
1698 put_bits(&s->pb, 8, s->aspected_height);
1702 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
1703 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
1704 put_bits(&s->pb, 1, s->low_delay);
1705 put_bits(&s->pb, 1, 0); /* vbv parameters= no */
1707 put_bits(&s->pb, 1, 0); /* vol control parameters= no */
1710 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
1711 put_bits(&s->pb, 1, 1); /* marker bit */
1713 put_bits(&s->pb, 16, s->time_increment_resolution);
1714 if (s->time_increment_bits < 1)
1715 s->time_increment_bits = 1;
1716 put_bits(&s->pb, 1, 1); /* marker bit */
1717 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
1718 put_bits(&s->pb, 1, 1); /* marker bit */
1719 put_bits(&s->pb, 13, s->width); /* vol width */
1720 put_bits(&s->pb, 1, 1); /* marker bit */
1721 put_bits(&s->pb, 13, s->height); /* vol height */
1722 put_bits(&s->pb, 1, 1); /* marker bit */
1723 put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
1724 put_bits(&s->pb, 1, 1); /* obmc disable */
1725 if (vo_ver_id == 1) {
1726 put_bits(&s->pb, 1, s->vol_sprite_usage=0); /* sprite enable */
1728 put_bits(&s->pb, 2, s->vol_sprite_usage=0); /* sprite enable */
1731 s->quant_precision=5;
1732 put_bits(&s->pb, 1, 0); /* not 8 bit == false */
1733 put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
1734 if(s->mpeg_quant) put_bits(&s->pb, 2, 0); /* no custom matrixes */
1737 put_bits(&s->pb, 1, s->quarter_sample);
1738 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
1739 s->resync_marker= s->rtp_mode;
1740 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
1741 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
1742 if(s->data_partitioning){
1743 put_bits(&s->pb, 1, 0); /* no rvlc */
1746 if (vo_ver_id != 1){
1747 put_bits(&s->pb, 1, 0); /* newpred */
1748 put_bits(&s->pb, 1, 0); /* reduced res vop */
1750 put_bits(&s->pb, 1, 0); /* scalability */
1752 ff_mpeg4_stuffing(&s->pb);
1755 if(!(s->flags & CODEC_FLAG_BITEXACT)){
1756 put_bits(&s->pb, 16, 0);
1757 put_bits(&s->pb, 16, 0x1B2); /* user_data */
1758 sprintf(buf, "FFmpeg%sb%s", FFMPEG_VERSION, LIBAVCODEC_BUILD_STR);
1759 put_string(&s->pb, buf);
1760 ff_mpeg4_stuffing(&s->pb);
1764 /* write mpeg4 VOP header */
1765 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
1768 int time_div, time_mod;
1770 if(s->pict_type==I_TYPE){
1771 if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
1772 mpeg4_encode_visual_object_header(s);
1773 mpeg4_encode_vol_header(s, 0, 0);
1775 mpeg4_encode_gop_header(s);
1778 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
1780 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->frame_rate, FRAME_RATE_BASE);
1782 put_bits(&s->pb, 16, 0); /* vop header */
1783 put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */
1784 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
1786 time_div= s->time/s->time_increment_resolution;
1787 time_mod= s->time%s->time_increment_resolution;
1788 time_incr= time_div - s->last_time_base;
1790 put_bits(&s->pb, 1, 1);
1792 put_bits(&s->pb, 1, 0);
1794 put_bits(&s->pb, 1, 1); /* marker */
1795 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
1796 put_bits(&s->pb, 1, 1); /* marker */
1797 put_bits(&s->pb, 1, 1); /* vop coded */
1798 if ( s->pict_type == P_TYPE
1799 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
1800 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
1802 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
1803 if(!s->progressive_sequence){
1804 put_bits(&s->pb, 1, s->top_field_first);
1805 put_bits(&s->pb, 1, s->alternate_scan);
1807 //FIXME sprite stuff
1809 put_bits(&s->pb, 5, s->qscale);
1811 if (s->pict_type != I_TYPE)
1812 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
1813 if (s->pict_type == B_TYPE)
1814 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
1815 // printf("****frame %d\n", picture_number);
1817 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
1818 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
1819 s->h_edge_pos= s->width;
1820 s->v_edge_pos= s->height;
1823 #endif //CONFIG_ENCODERS
1826 * change qscale by given dquant and update qscale dependant variables.
1828 static void change_qscale(MpegEncContext * s, int dquant)
1830 s->qscale += dquant;
1834 else if (s->qscale > 31)
1837 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
1838 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
1843 * @param n block index (0-3 are luma, 4-5 are chroma)
1844 * @param dc_val_ptr a pointer to the dc_val entry for the current MB will be stored here
1845 * @param dir_ptr pointer to an integer where the prediction direction will be stored
1846 * @return the quantized predicted dc
1848 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr, int *dir_ptr)
1850 int a, b, c, wrap, pred, scale;
1854 /* find prediction */
1856 scale = s->y_dc_scale;
1858 scale = s->c_dc_scale;
1860 wrap= s->block_wrap[n];
1861 dc_val = s->dc_val[0] + s->block_index[n];
1867 b = dc_val[ - 1 - wrap];
1868 c = dc_val[ - wrap];
1870 /* outside slice handling (we cant do that by memset as we need the dc for error resilience) */
1871 if(s->first_slice_line && n!=3){
1873 if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
1875 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
1876 if(n==0 || n==4 || n==5)
1880 if (abs(a - b) < abs(b - c)) {
1882 *dir_ptr = 1; /* top */
1885 *dir_ptr = 0; /* left */
1887 /* we assume pred is positive */
1890 "xorl %%edx, %%edx \n\t"
1892 : "=d" (pred), "=a"(dummy)
1893 : "a" (pred + (scale >> 1)), "c" (inverse[scale])
1896 pred = (pred + (scale >> 1)) / scale;
1899 /* prepare address for prediction update */
1900 *dc_val_ptr = &dc_val[0];
1907 * @param n block index (0-3 are luma, 4-5 are chroma)
1908 * @param dir the ac prediction direction
1910 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
1914 int16_t *ac_val, *ac_val1;
1915 int8_t * const qscale_table= s->current_picture.qscale_table;
1917 /* find prediction */
1918 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1922 const int xy= s->mb_x-1 + s->mb_y*s->mb_width;
1923 /* left prediction */
1926 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
1929 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
1932 /* different qscale, we must rescale */
1934 block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
1938 const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width;
1939 /* top prediction */
1940 ac_val -= 16 * s->block_wrap[n];
1942 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
1945 block[s->dsp.idct_permutation[i]] += ac_val[i + 8];
1948 /* different qscale, we must rescale */
1950 block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
1957 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
1961 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
1965 #ifdef CONFIG_ENCODERS
1967 static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
1972 int8_t * const qscale_table= s->current_picture.qscale_table;
1974 /* find prediction */
1975 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1978 const int xy= s->mb_x-1 + s->mb_y*s->mb_width;
1979 /* left prediction */
1981 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
1984 block[s->dsp.idct_permutation[i<<3]] -= ac_val[i];
1987 /* different qscale, we must rescale */
1989 block[s->dsp.idct_permutation[i<<3]] -= ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
1993 const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width;
1994 /* top prediction */
1995 ac_val -= 16 * s->block_wrap[n];
1996 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
1999 block[s->dsp.idct_permutation[i]] -= ac_val[i + 8];
2002 /* different qscale, we must rescale */
2004 block[s->dsp.idct_permutation[i]] -= ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
2011 * encodes the dc value.
2012 * @param n block index (0-3 are luma, 4-5 are chroma)
2014 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
2017 // if(level<-255 || level>255) printf("dc overflow\n");
2021 put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]);
2024 put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]);
2028 /* find number of bits */
2038 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
2041 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
2044 /* encode remaining bits */
2047 level = (-level) ^ ((1 << size) - 1);
2048 put_bits(&s->pb, size, level);
2050 put_bits(&s->pb, 1, 1);
2056 * encodes a 8x8 block
2057 * @param n block index (0-3 are luma, 4-5 are chroma)
2059 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2060 uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
2062 int i, last_non_zero;
2063 #if 0 //variables for the outcommented version
2064 int code, sign, last;
2069 const int last_index = s->block_last_index[n];
2071 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2072 /* mpeg4 based DC predictor */
2073 mpeg4_encode_dc(dc_pb, intra_dc, n);
2074 if(last_index<1) return;
2077 bits_tab= uni_mpeg4_intra_rl_bits;
2078 len_tab = uni_mpeg4_intra_rl_len;
2080 if(last_index<0) return;
2083 bits_tab= uni_mpeg4_inter_rl_bits;
2084 len_tab = uni_mpeg4_inter_rl_len;
2088 last_non_zero = i - 1;
2090 for (; i < last_index; i++) {
2091 int level = block[ scan_table[i] ];
2093 int run = i - last_non_zero - 1;
2095 if((level&(~127)) == 0){
2096 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2097 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2099 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);
2104 /*if(i<=last_index)*/{
2105 int level = block[ scan_table[i] ];
2106 int run = i - last_non_zero - 1;
2108 if((level&(~127)) == 0){
2109 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2110 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2112 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);
2116 for (; i <= last_index; i++) {
2117 const int slevel = block[ scan_table[i] ];
2120 int run = i - last_non_zero - 1;
2121 last = (i == last_index);
2128 code = get_rl_index(rl, last, run, level);
2129 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2130 if (code == rl->n) {
2132 level1 = level - rl->max_level[last][run];
2135 code = get_rl_index(rl, last, run, level1);
2136 if (code == rl->n) {
2138 put_bits(ac_pb, 1, 1);
2139 if (level > MAX_LEVEL)
2141 run1 = run - rl->max_run[last][level] - 1;
2144 code = get_rl_index(rl, last, run1, level);
2145 if (code == rl->n) {
2148 put_bits(ac_pb, 1, 1);
2149 put_bits(ac_pb, 1, last);
2150 put_bits(ac_pb, 6, run);
2151 put_bits(ac_pb, 1, 1);
2152 put_bits(ac_pb, 12, slevel & 0xfff);
2153 put_bits(ac_pb, 1, 1);
2156 put_bits(ac_pb, 1, 0);
2157 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2158 put_bits(ac_pb, 1, sign);
2162 put_bits(ac_pb, 1, 0);
2163 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2164 put_bits(ac_pb, 1, sign);
2167 put_bits(ac_pb, 1, sign);
2175 static inline int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2176 uint8_t *scan_table)
2178 int i, last_non_zero;
2181 const int last_index = s->block_last_index[n];
2184 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2185 /* mpeg4 based DC predictor */
2186 //mpeg4_encode_dc(dc_pb, intra_dc, n); //FIXME
2187 if(last_index<1) return len;
2190 len_tab = uni_mpeg4_intra_rl_len;
2192 if(last_index<0) return 0;
2195 len_tab = uni_mpeg4_inter_rl_len;
2199 last_non_zero = i - 1;
2200 for (; i < last_index; i++) {
2201 int level = block[ scan_table[i] ];
2203 int run = i - last_non_zero - 1;
2205 if((level&(~127)) == 0){
2206 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2207 len += len_tab[index];
2209 len += 7+2+1+6+1+12+1;
2214 /*if(i<=last_index)*/{
2215 int level = block[ scan_table[i] ];
2216 int run = i - last_non_zero - 1;
2218 if((level&(~127)) == 0){
2219 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2220 len += len_tab[index];
2222 len += 7+2+1+6+1+12+1;
2232 /***********************************************/
2235 static VLC intra_MCBPC_vlc;
2236 static VLC inter_MCBPC_vlc;
2237 static VLC cbpy_vlc;
2239 static VLC dc_lum, dc_chrom;
2240 static VLC sprite_trajectory;
2241 static VLC mb_type_b_vlc;
2243 void init_vlc_rl(RLTable *rl)
2247 init_vlc(&rl->vlc, 9, rl->n + 1,
2248 &rl->table_vlc[0][1], 4, 2,
2249 &rl->table_vlc[0][0], 4, 2);
2252 for(q=0; q<32; q++){
2261 rl->rl_vlc[q]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
2262 for(i=0; i<rl->vlc.table_size; i++){
2263 int code= rl->vlc.table[i][0];
2264 int len = rl->vlc.table[i][1];
2267 if(len==0){ // illegal code
2270 }else if(len<0){ //more bits needed
2274 if(code==rl->n){ //esc
2278 run= rl->table_run [code] + 1;
2279 level= rl->table_level[code] * qmul + qadd;
2280 if(code >= rl->last) run+=192;
2283 rl->rl_vlc[q][i].len= len;
2284 rl->rl_vlc[q][i].level= level;
2285 rl->rl_vlc[q][i].run= run;
2292 /* XXX: find a better solution to handle static init */
2293 void h263_decode_init_vlc(MpegEncContext *s)
2295 static int done = 0;
2300 init_vlc(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 8,
2301 intra_MCBPC_bits, 1, 1,
2302 intra_MCBPC_code, 1, 1);
2303 init_vlc(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 25,
2304 inter_MCBPC_bits, 1, 1,
2305 inter_MCBPC_code, 1, 1);
2306 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
2307 &cbpy_tab[0][1], 2, 1,
2308 &cbpy_tab[0][0], 2, 1);
2309 init_vlc(&mv_vlc, MV_VLC_BITS, 33,
2311 &mvtab[0][0], 2, 1);
2314 init_rl(&rl_intra_aic);
2315 init_vlc_rl(&rl_inter);
2316 init_vlc_rl(&rl_intra);
2317 init_vlc_rl(&rl_intra_aic);
2318 init_vlc(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
2319 &DCtab_lum[0][1], 2, 1,
2320 &DCtab_lum[0][0], 2, 1);
2321 init_vlc(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
2322 &DCtab_chrom[0][1], 2, 1,
2323 &DCtab_chrom[0][0], 2, 1);
2324 init_vlc(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
2325 &sprite_trajectory_tab[0][1], 4, 2,
2326 &sprite_trajectory_tab[0][0], 4, 2);
2327 init_vlc(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
2328 &mb_type_b_tab[0][1], 2, 1,
2329 &mb_type_b_tab[0][0], 2, 1);
2334 * Get the GOB height based on picture height.
2336 int ff_h263_get_gob_height(MpegEncContext *s){
2337 if (s->height <= 400)
2339 else if (s->height <= 800)
2346 * decodes the group of blocks header.
2347 * @return <0 if an error occured
2349 static int h263_decode_gob_header(MpegEncContext *s)
2351 unsigned int val, gfid;
2354 /* Check for GOB Start Code */
2355 val = show_bits(&s->gb, 16);
2359 /* We have a GBSC probably with GSTUFF */
2360 skip_bits(&s->gb, 16); /* Drop the zeros */
2361 left= s->gb.size_in_bits - get_bits_count(&s->gb);
2362 //MN: we must check the bits left or we might end in a infinite loop (or segfault)
2363 for(;left>13; left--){
2364 if(get_bits1(&s->gb)) break; /* Seek the '1' bit */
2370 fprintf(stderr,"\nGOB Start Code at MB %d\n", (s->mb_y * s->mb_width) + s->mb_x);
2372 s->gob_number = get_bits(&s->gb, 5); /* GN */
2373 gfid = get_bits(&s->gb, 2); /* GFID */
2374 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
2378 s->mb_y= s->gob_index* s->gob_number;
2380 fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", s->gob_number, gfid, s->qscale);
2385 static inline void memsetw(short *tab, int val, int n)
2392 #ifdef CONFIG_ENCODERS
2394 void ff_mpeg4_init_partitions(MpegEncContext *s)
2396 init_put_bits(&s->tex_pb, s->tex_pb_buffer, PB_BUFFER_SIZE, NULL, NULL);
2397 init_put_bits(&s->pb2 , s->pb2_buffer , PB_BUFFER_SIZE, NULL, NULL);
2400 void ff_mpeg4_merge_partitions(MpegEncContext *s)
2402 const int pb2_len = get_bit_count(&s->pb2 );
2403 const int tex_pb_len= get_bit_count(&s->tex_pb);
2404 const int bits= get_bit_count(&s->pb);
2406 if(s->pict_type==I_TYPE){
2407 put_bits(&s->pb, 19, DC_MARKER);
2408 s->misc_bits+=19 + pb2_len + bits - s->last_bits;
2409 s->i_tex_bits+= tex_pb_len;
2411 put_bits(&s->pb, 17, MOTION_MARKER);
2412 s->misc_bits+=17 + pb2_len;
2413 s->mv_bits+= bits - s->last_bits;
2414 s->p_tex_bits+= tex_pb_len;
2417 flush_put_bits(&s->pb2);
2418 flush_put_bits(&s->tex_pb);
2420 ff_copy_bits(&s->pb, s->pb2_buffer , pb2_len);
2421 ff_copy_bits(&s->pb, s->tex_pb_buffer, tex_pb_len);
2422 s->last_bits= get_bit_count(&s->pb);
2425 #endif //CONFIG_ENCODERS
2427 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
2428 switch(s->pict_type){
2433 return s->f_code+15;
2435 return FFMAX(FFMAX(s->f_code, s->b_code)+15, 17);
2441 #ifdef CONFIG_ENCODERS
2443 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
2445 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
2447 ff_mpeg4_stuffing(&s->pb);
2448 put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0);
2449 put_bits(&s->pb, 1, 1);
2451 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
2452 put_bits(&s->pb, s->quant_precision, s->qscale);
2453 put_bits(&s->pb, 1, 0); /* no HEC */
2456 #endif //CONFIG_ENCODERS
2459 * check if the next stuff is a resync marker or the end.
2462 static inline int mpeg4_is_resync(MpegEncContext *s){
2463 const int bits_count= get_bits_count(&s->gb);
2465 if(s->workaround_bugs&FF_BUG_NO_PADDING){
2469 if(bits_count + 8 >= s->gb.size_in_bits){
2470 int v= show_bits(&s->gb, 8);
2471 v|= 0x7F >> (7-(bits_count&7));
2476 if(show_bits(&s->gb, 16) == ff_mpeg4_resync_prefix[bits_count&7]){
2478 GetBitContext gb= s->gb;
2480 skip_bits(&s->gb, 1);
2481 align_get_bits(&s->gb);
2483 for(len=0; len<32; len++){
2484 if(get_bits1(&s->gb)) break;
2489 if(len>=ff_mpeg4_get_video_packet_prefix_length(s))
2497 * decodes the next video packet.
2498 * @return <0 if something went wrong
2500 static int mpeg4_decode_video_packet_header(MpegEncContext *s)
2502 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
2503 int header_extension=0, mb_num, len;
2505 /* is there enough space left for a video packet + header */
2506 if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1;
2508 for(len=0; len<32; len++){
2509 if(get_bits1(&s->gb)) break;
2512 if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
2513 printf("marker does not match f_code\n");
2517 if(s->shape != RECT_SHAPE){
2518 header_extension= get_bits1(&s->gb);
2519 //FIXME more stuff here
2522 mb_num= get_bits(&s->gb, mb_num_bits);
2523 if(mb_num>=s->mb_num){
2524 fprintf(stderr, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);
2527 s->mb_x= mb_num % s->mb_width;
2528 s->mb_y= mb_num / s->mb_width;
2530 if(s->shape != BIN_ONLY_SHAPE){
2531 int qscale= get_bits(&s->gb, s->quant_precision);
2536 if(s->shape == RECT_SHAPE){
2537 header_extension= get_bits1(&s->gb);
2539 if(header_extension){
2543 while (get_bits1(&s->gb) != 0)
2546 check_marker(&s->gb, "before time_increment in video packed header");
2547 time_increment= get_bits(&s->gb, s->time_increment_bits);
2548 check_marker(&s->gb, "before vop_coding_type in video packed header");
2550 skip_bits(&s->gb, 2); /* vop coding type */
2551 //FIXME not rect stuff here
2553 if(s->shape != BIN_ONLY_SHAPE){
2554 skip_bits(&s->gb, 3); /* intra dc vlc threshold */
2555 //FIXME dont just ignore everything
2556 if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2557 mpeg4_decode_sprite_trajectory(s);
2558 fprintf(stderr, "untested\n");
2561 //FIXME reduced res stuff here
2563 if (s->pict_type != I_TYPE) {
2564 int f_code = get_bits(&s->gb, 3); /* fcode_for */
2566 printf("Error, video packet header damaged (f_code=0)\n");
2569 if (s->pict_type == B_TYPE) {
2570 int b_code = get_bits(&s->gb, 3);
2572 printf("Error, video packet header damaged (b_code=0)\n");
2577 //FIXME new-pred stuff
2579 //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));
2584 void ff_mpeg4_clean_buffers(MpegEncContext *s)
2586 int c_wrap, c_xy, l_wrap, l_xy;
2588 l_wrap= s->block_wrap[0];
2589 l_xy= s->mb_y*l_wrap*2 + s->mb_x*2;
2590 c_wrap= s->block_wrap[4];
2591 c_xy= s->mb_y*c_wrap + s->mb_x;
2595 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
2596 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
2597 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
2601 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t));
2602 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
2603 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
2606 // we cant clear the MVs as they might be needed by a b frame
2607 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t));
2608 // memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
2609 s->last_mv[0][0][0]=
2610 s->last_mv[0][0][1]=
2611 s->last_mv[1][0][0]=
2612 s->last_mv[1][0][1]= 0;
2616 * decodes the group of blocks / video packet header.
2617 * @return <0 if no resync found
2619 int ff_h263_resync(MpegEncContext *s){
2622 if(s->codec_id==CODEC_ID_MPEG4)
2625 align_get_bits(&s->gb);
2627 if(show_bits(&s->gb, 16)==0){
2628 if(s->codec_id==CODEC_ID_MPEG4)
2629 ret= mpeg4_decode_video_packet_header(s);
2631 ret= h263_decode_gob_header(s);
2635 //ok, its not where its supposed to be ...
2636 s->gb= s->last_resync_gb;
2637 align_get_bits(&s->gb);
2638 left= s->gb.size_in_bits - get_bits_count(&s->gb);
2640 for(;left>16+1+5+5; left-=8){
2641 if(show_bits(&s->gb, 16)==0){
2642 GetBitContext bak= s->gb;
2644 if(s->codec_id==CODEC_ID_MPEG4)
2645 ret= mpeg4_decode_video_packet_header(s);
2647 ret= h263_decode_gob_header(s);
2653 skip_bits(&s->gb, 8);
2660 * gets the average motion vector for a GMC MB.
2661 * @param n either 0 for the x component or 1 for y
2662 * @returns the average MV for a GMC MB
2664 static inline int get_amv(MpegEncContext *s, int n){
2665 int x, y, mb_v, sum, dx, dy, shift;
2666 int len = 1 << (s->f_code + 4);
2667 const int a= s->sprite_warping_accuracy;
2669 if(s->real_sprite_warping_points==1){
2670 if(s->divx_version==500 && s->divx_build==413)
2671 sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample));
2673 sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a);
2675 dx= s->sprite_delta[n][0];
2676 dy= s->sprite_delta[n][1];
2677 shift= s->sprite_shift[0];
2678 if(n) dy -= 1<<(shift + a + 1);
2679 else dx -= 1<<(shift + a + 1);
2680 mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16;
2683 for(y=0; y<16; y++){
2687 //XXX FIXME optimize
2688 for(x=0; x<16; x++){
2693 sum= RSHIFT(sum, a+8-s->quarter_sample);
2696 if (sum < -len) sum= -len;
2697 else if (sum >= len) sum= len-1;
2703 * decodes first partition.
2704 * @return number of MBs decoded or <0 if an error occured
2706 static int mpeg4_decode_partition_a(MpegEncContext *s){
2708 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
2710 /* decode first partition */
2712 s->first_slice_line=1;
2713 for(; s->mb_y<s->mb_height; s->mb_y++){
2714 ff_init_block_index(s);
2715 for(; s->mb_x<s->mb_width; s->mb_x++){
2716 const int xy= s->mb_x + s->mb_y*s->mb_width;
2721 ff_update_block_index(s);
2722 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
2723 s->first_slice_line=0;
2725 if(s->mb_x==0) PRINT_MB_TYPE("\n");
2727 if(s->pict_type==I_TYPE){
2730 if(show_bits(&s->gb, 19)==DC_MARKER){
2735 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
2738 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
2741 s->cbp_table[xy]= cbpc & 3;
2742 s->mb_type[xy]= MB_TYPE_INTRA;
2746 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2748 s->current_picture.qscale_table[xy]= s->qscale;
2750 s->mbintra_table[xy]= 1;
2753 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
2755 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
2759 if(dc_pred_dir) dir|=1;
2761 s->pred_dir_table[xy]= dir;
2763 s->error_status_table[xy]= AC_ERROR;
2764 }else{ /* P/S_TYPE */
2765 int mx, my, pred_x, pred_y, bits;
2766 int16_t * const mot_val= s->motion_val[s->block_index[0]];
2767 const int stride= s->block_wrap[0]*2;
2769 bits= show_bits(&s->gb, 17);
2770 if(bits==MOTION_MARKER){
2776 s->mb_type[xy]= MB_TYPE_SKIPED;
2777 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2785 mot_val[0 ]= mot_val[2 ]=
2786 mot_val[0+stride]= mot_val[2+stride]= mx;
2787 mot_val[1 ]= mot_val[3 ]=
2788 mot_val[1+stride]= mot_val[3+stride]= my;
2790 if(s->mbintra_table[xy])
2791 ff_clean_intra_table_entries(s);
2793 s->error_status_table[xy]= AC_ERROR;
2796 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
2798 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
2803 else if (cbpc == 20)
2804 fprintf(stderr, "Stuffing !");
2805 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
2807 s->mb_intra = ((cbpc & 4) != 0);
2811 s->mbintra_table[xy]= 1;
2812 s->mb_type[xy]= MB_TYPE_INTRA;
2813 mot_val[0 ]= mot_val[2 ]=
2814 mot_val[0+stride]= mot_val[2+stride]= 0;
2815 mot_val[1 ]= mot_val[3 ]=
2816 mot_val[1+stride]= mot_val[3+stride]= 0;
2817 s->error_status_table[xy]= DC_ERROR|AC_ERROR;
2819 if(s->mbintra_table[xy])
2820 ff_clean_intra_table_entries(s);
2822 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
2823 s->mcsel= get_bits1(&s->gb);
2826 if ((cbpc & 16) == 0) {
2828 /* 16x16 motion prediction */
2829 s->mb_type[xy]= MB_TYPE_INTER;
2831 h263_pred_motion(s, 0, &pred_x, &pred_y);
2833 mx = h263_decode_motion(s, pred_x, s->f_code);
2837 my = h263_decode_motion(s, pred_y, s->f_code);
2845 mot_val[0 ]= mot_val[2 ] =
2846 mot_val[0+stride]= mot_val[2+stride]= mx;
2847 mot_val[1 ]= mot_val[3 ]=
2848 mot_val[1+stride]= mot_val[3+stride]= my;
2852 s->mb_type[xy]= MB_TYPE_INTER4V;
2854 int16_t *mot_val= h263_pred_motion(s, i, &pred_x, &pred_y);
2855 mx = h263_decode_motion(s, pred_x, s->f_code);
2859 my = h263_decode_motion(s, pred_y, s->f_code);
2866 s->error_status_table[xy]= AC_ERROR;
2877 * decode second partition.
2878 * @return <0 if an error occured
2880 static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
2882 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
2884 s->mb_x= s->resync_mb_x;
2885 s->first_slice_line=1;
2886 for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
2887 ff_init_block_index(s);
2888 for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
2889 const int xy= s->mb_x + s->mb_y*s->mb_width;
2892 ff_update_block_index(s);
2893 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
2894 s->first_slice_line=0;
2896 if(s->pict_type==I_TYPE){
2897 int ac_pred= get_bits1(&s->gb);
2898 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2900 fprintf(stderr, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2904 s->cbp_table[xy]|= cbpy<<2;
2905 s->pred_dir_table[xy]|= ac_pred<<7;
2906 }else{ /* P || S_TYPE */
2907 if(s->mb_type[xy]&MB_TYPE_INTRA){
2909 int ac_pred = get_bits1(&s->gb);
2910 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2913 fprintf(stderr, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2917 if(s->cbp_table[xy] & 8) {
2918 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2920 s->current_picture.qscale_table[xy]= s->qscale;
2924 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
2926 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
2930 if(dc_pred_dir) dir|=1;
2932 s->cbp_table[xy]&= 3; //remove dquant
2933 s->cbp_table[xy]|= cbpy<<2;
2934 s->pred_dir_table[xy]= dir | (ac_pred<<7);
2935 s->error_status_table[xy]&= ~DC_ERROR;
2936 }else if(s->mb_type[xy]&MB_TYPE_SKIPED){
2937 s->current_picture.qscale_table[xy]= s->qscale;
2938 s->cbp_table[xy]= 0;
2940 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2943 fprintf(stderr, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2947 if(s->cbp_table[xy] & 8) {
2948 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2950 s->current_picture.qscale_table[xy]= s->qscale;
2952 s->cbp_table[xy]&= 3; //remove dquant
2953 s->cbp_table[xy]|= (cbpy^0xf)<<2;
2957 if(mb_num >= mb_count) return 0;
2964 * decodes the first & second partition
2965 * @return <0 if error (and sets error type in the error_status_table)
2967 int ff_mpeg4_decode_partitions(MpegEncContext *s)
2971 mb_num= mpeg4_decode_partition_a(s);
2975 if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
2976 fprintf(stderr, "slice below monitor ...\n");
2980 s->mb_num_left= mb_num;
2982 if(s->pict_type==I_TYPE){
2983 if(get_bits(&s->gb, 19)!=DC_MARKER){
2984 fprintf(stderr, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
2987 s->error_status_table[s->mb_x + s->mb_y*s->mb_width-1]|= MV_END|DC_END;
2989 if(get_bits(&s->gb, 17)!=MOTION_MARKER){
2990 fprintf(stderr, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
2993 s->error_status_table[s->mb_x + s->mb_y*s->mb_width-1]|= MV_END;
2996 if( mpeg4_decode_partition_b(s, mb_num) < 0){
3000 s->error_status_table[s->mb_x + s->mb_y*s->mb_width-1]|= DC_END;
3006 * decode partition C of one MB.
3007 * @return <0 if an error occured
3009 static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64])
3012 const int xy= s->mb_x + s->mb_y*s->mb_width;
3014 mb_type= s->mb_type[xy];
3015 cbp = s->cbp_table[xy];
3017 if(s->current_picture.qscale_table[xy] != s->qscale){
3018 s->qscale= s->current_picture.qscale_table[xy];
3019 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
3020 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
3023 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
3026 s->mv[0][i][0] = s->motion_val[ s->block_index[i] ][0];
3027 s->mv[0][i][1] = s->motion_val[ s->block_index[i] ][1];
3029 s->mb_intra = mb_type&MB_TYPE_INTRA;
3031 if (mb_type&MB_TYPE_SKIPED) {
3034 s->block_last_index[i] = -1;
3035 s->mv_dir = MV_DIR_FORWARD;
3036 s->mv_type = MV_TYPE_16X16;
3037 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3044 }else if(s->mb_intra){
3045 s->ac_pred = s->pred_dir_table[xy]>>7;
3047 /* decode each block */
3048 for (i = 0; i < 6; i++) {
3049 if(mpeg4_decode_block(s, block[i], i, cbp&32, 1) < 0){
3050 fprintf(stderr, "texture corrupted at %d %d\n", s->mb_x, s->mb_y);
3055 }else if(!s->mb_intra){
3056 // s->mcsel= 0; //FIXME do we need to init that
3058 s->mv_dir = MV_DIR_FORWARD;
3059 if (mb_type&MB_TYPE_INTER4V) {
3060 s->mv_type = MV_TYPE_8X8;
3062 s->mv_type = MV_TYPE_16X16;
3064 /* decode each block */
3065 for (i = 0; i < 6; i++) {
3066 if(mpeg4_decode_block(s, block[i], i, cbp&32, 0) < 0){
3067 fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y);
3073 } else { /* I-Frame */
3076 s->ac_pred = s->pred_dir_table[xy]>>7;
3078 /* decode each block */
3079 for (i = 0; i < 6; i++) {
3080 if(mpeg4_decode_block(s, block[i], i, cbp&32, 1) < 0){
3081 fprintf(stderr, "texture corrupted at %d %d (trying to continue with dc only)\n", s->mb_x, s->mb_y);
3088 s->error_status_table[xy]&= ~AC_ERROR;
3090 /* per-MB end of slice check */
3092 if(--s->mb_num_left <= 0){
3093 //printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb));
3094 if(mpeg4_is_resync(s))
3099 if(s->cbp_table[xy+1] && mpeg4_is_resync(s))
3106 int ff_h263_decode_mb(MpegEncContext *s,
3107 DCTELEM block[6][64])
3109 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
3111 static int8_t quant_tab[4] = { -1, -2, 1, 2 };
3113 s->error_status_table[s->mb_x + s->mb_y*s->mb_width]= 0;
3115 if(s->mb_x==0) PRINT_MB_TYPE("\n");
3117 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
3118 if (get_bits1(&s->gb)) {
3122 s->block_last_index[i] = -1;
3123 s->mv_dir = MV_DIR_FORWARD;
3124 s->mv_type = MV_TYPE_16X16;
3125 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3128 s->mv[0][0][0]= get_amv(s, 0);
3129 s->mv[0][0][1]= get_amv(s, 1);
3141 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3142 //fprintf(stderr, "\tCBPC: %d", cbpc);
3147 else if (cbpc == 20)
3148 fprintf(stderr, "Stuffing !");
3151 s->mb_intra = ((cbpc & 4) != 0);
3152 if (s->mb_intra) goto intra;
3154 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
3155 s->mcsel= get_bits1(&s->gb);
3157 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3158 cbp = (cbpc & 3) | ((cbpy ^ 0xf) << 2);
3160 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
3162 if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE)))
3163 s->interlaced_dct= get_bits1(&s->gb);
3165 s->mv_dir = MV_DIR_FORWARD;
3166 if ((cbpc & 16) == 0) {
3169 /* 16x16 global motion prediction */
3170 s->mv_type = MV_TYPE_16X16;
3173 s->mv[0][0][0] = mx;
3174 s->mv[0][0][1] = my;
3175 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
3177 /* 16x8 field motion prediction */
3178 s->mv_type= MV_TYPE_FIELD;
3180 s->field_select[0][0]= get_bits1(&s->gb);
3181 s->field_select[0][1]= get_bits1(&s->gb);
3183 h263_pred_motion(s, 0, &pred_x, &pred_y);
3186 mx = h263_decode_motion(s, pred_x, s->f_code);
3190 my = h263_decode_motion(s, pred_y/2, s->f_code);
3194 s->mv[0][i][0] = mx;
3195 s->mv[0][i][1] = my;
3199 /* 16x16 motion prediction */
3200 s->mv_type = MV_TYPE_16X16;
3201 h263_pred_motion(s, 0, &pred_x, &pred_y);
3203 mx = h263p_decode_umotion(s, pred_x);
3205 mx = h263_decode_motion(s, pred_x, s->f_code);
3211 my = h263p_decode_umotion(s, pred_y);
3213 my = h263_decode_motion(s, pred_y, s->f_code);
3217 s->mv[0][0][0] = mx;
3218 s->mv[0][0][1] = my;
3220 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3221 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3225 s->mv_type = MV_TYPE_8X8;
3227 mot_val = h263_pred_motion(s, i, &pred_x, &pred_y);
3229 mx = h263p_decode_umotion(s, pred_x);
3231 mx = h263_decode_motion(s, pred_x, s->f_code);
3236 my = h263p_decode_umotion(s, pred_y);
3238 my = h263_decode_motion(s, pred_y, s->f_code);
3241 s->mv[0][i][0] = mx;
3242 s->mv[0][i][1] = my;
3243 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3244 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3249 } else if(s->pict_type==B_TYPE) {
3250 int modb1; // first bit of modb
3251 int modb2; // second bit of modb
3254 s->mb_intra = 0; //B-frames never contain intra blocks
3255 s->mcsel=0; // ... true gmc blocks
3259 s->last_mv[i][0][0]=
3260 s->last_mv[i][0][1]=
3261 s->last_mv[i][1][0]=
3262 s->last_mv[i][1][1]= 0;
3266 /* if we skipped it in the future P Frame than skip it now too */
3267 s->mb_skiped= s->next_picture.mbskip_table[s->mb_y * s->mb_width + s->mb_x]; // Note, skiptab=0 if last was GMC
3272 s->block_last_index[i] = -1;
3274 s->mv_dir = MV_DIR_FORWARD;
3275 s->mv_type = MV_TYPE_16X16;
3284 modb1= get_bits1(&s->gb);
3286 mb_type=4; //like MB_TYPE_B_DIRECT but no vectors coded
3291 modb2= get_bits1(&s->gb);
3292 mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
3294 else cbp= get_bits(&s->gb, 6);
3296 if (mb_type!=MB_TYPE_B_DIRECT && cbp) {
3297 if(get_bits1(&s->gb)){
3298 change_qscale(s, get_bits1(&s->gb)*4 - 2);
3303 if(!s->progressive_sequence){
3305 s->interlaced_dct= get_bits1(&s->gb);
3307 if(mb_type!=MB_TYPE_B_DIRECT && get_bits1(&s->gb)){
3310 if(mb_type!=MB_TYPE_B_BACKW){
3311 s->field_select[0][0]= get_bits1(&s->gb);
3312 s->field_select[0][1]= get_bits1(&s->gb);
3314 if(mb_type!=MB_TYPE_B_FORW){
3315 s->field_select[1][0]= get_bits1(&s->gb);
3316 s->field_select[1][1]= get_bits1(&s->gb);
3322 if(mb_type!=MB_TYPE_B_DIRECT && !field_mv){
3323 s->mv_type= MV_TYPE_16X16;
3324 if(mb_type!=MB_TYPE_B_BACKW){
3325 s->mv_dir = MV_DIR_FORWARD;
3327 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
3328 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
3329 s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
3330 s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
3333 if(mb_type!=MB_TYPE_B_FORW){
3334 s->mv_dir |= MV_DIR_BACKWARD;
3336 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
3337 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
3338 s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
3339 s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
3341 if(mb_type!=MB_TYPE_B_DIRECT)
3342 PRINT_MB_TYPE(mb_type==MB_TYPE_B_FORW ? "F" : (mb_type==MB_TYPE_B_BACKW ? "B" : "T"));
3343 }else if(mb_type!=MB_TYPE_B_DIRECT){
3344 s->mv_type= MV_TYPE_FIELD;
3346 if(mb_type!=MB_TYPE_B_BACKW){
3347 s->mv_dir = MV_DIR_FORWARD;
3350 mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code);
3351 my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
3352 s->last_mv[0][i][0]= s->mv[0][i][0] = mx;
3353 s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
3357 if(mb_type!=MB_TYPE_B_FORW){
3358 s->mv_dir |= MV_DIR_BACKWARD;
3361 mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code);
3362 my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
3363 s->last_mv[1][i][0]= s->mv[1][i][0] = mx;
3364 s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
3367 if(mb_type!=MB_TYPE_B_DIRECT)
3368 PRINT_MB_TYPE(mb_type==MB_TYPE_B_FORW ? "f" : (mb_type==MB_TYPE_B_BACKW ? "b" : "t"));
3372 if(mb_type==4 || mb_type==MB_TYPE_B_DIRECT){
3376 mx = h263_decode_motion(s, 0, 1);
3377 my = h263_decode_motion(s, 0, 1);
3380 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3381 ff_mpeg4_set_direct_mv(s, mx, my);
3384 if(mb_type<0 || mb_type>4){
3385 printf("illegal MB_type\n");
3388 } else { /* I-Frame */
3389 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
3396 if (s->h263_pred || s->h263_aic) {
3397 s->ac_pred = get_bits1(&s->gb);
3398 if (s->ac_pred && s->h263_aic)
3399 s->h263_aic_dir = get_bits1(&s->gb);
3401 PRINT_MB_TYPE(s->ac_pred ? "A" : "I");
3403 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3404 if(cbpy<0) return -1;
3405 cbp = (cbpc & 3) | (cbpy << 2);
3407 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
3410 if(!s->progressive_sequence)
3411 s->interlaced_dct= get_bits1(&s->gb);
3413 /* decode each block */
3415 for (i = 0; i < 6; i++) {
3416 if (mpeg4_decode_block(s, block[i], i, cbp&32, 1) < 0)
3421 for (i = 0; i < 6; i++) {
3422 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
3430 /* decode each block */
3432 for (i = 0; i < 6; i++) {
3433 if (mpeg4_decode_block(s, block[i], i, cbp&32, 0) < 0)
3438 for (i = 0; i < 6; i++) {
3439 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
3446 /* per-MB end of slice check */
3447 if(s->codec_id==CODEC_ID_MPEG4){
3448 if(mpeg4_is_resync(s)){
3449 if(s->pict_type==B_TYPE && s->next_picture.mbskip_table[s->mb_y * s->mb_width + s->mb_x+1])
3454 int v= show_bits(&s->gb, 16);
3456 if(get_bits_count(&s->gb) + 16 > s->gb.size_in_bits){
3457 v>>= get_bits_count(&s->gb) + 16 - s->gb.size_in_bits;
3467 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
3469 int code, val, sign, shift, l;
3470 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
3477 sign = get_bits1(&s->gb);
3479 val = (code - 1) << shift;
3481 val |= get_bits(&s->gb, shift);
3487 /* modulo decoding */
3488 if (!s->h263_long_vectors) {
3489 l = 1 << (f_code + 4);
3492 } else if (val >= l) {
3496 /* horrible h263 long vector mode */
3497 if (pred < -31 && val < -63)
3499 if (pred > 32 && val > 63)
3506 /* Decodes RVLC of H.263+ UMV */
3507 static int h263p_decode_umotion(MpegEncContext * s, int pred)
3511 if (get_bits1(&s->gb)) /* Motion difference = 0 */
3514 code = 2 + get_bits1(&s->gb);
3516 while (get_bits1(&s->gb))
3519 code += get_bits1(&s->gb);
3524 code = (sign) ? (pred - code) : (pred + code);
3526 fprintf(stderr,"H.263+ UMV Motion = %d\n", code);
3532 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
3535 int code, level, i, j, last, run;
3536 RLTable *rl = &rl_inter;
3537 const uint8_t *scan_table;
3539 scan_table = s->intra_scantable.permutated;
3540 if (s->h263_aic && s->mb_intra) {
3544 if (s->h263_aic_dir)
3545 scan_table = s->intra_v_scantable.permutated; /* left */
3547 scan_table = s->intra_h_scantable.permutated; /* top */
3549 } else if (s->mb_intra) {
3552 if (s->rv10_version == 3 && s->pict_type == I_TYPE) {
3553 int component, diff;
3554 component = (n <= 3 ? 0 : n - 4 + 1);
3555 level = s->last_dc[component];
3556 if (s->rv10_first_dc_coded[component]) {
3557 diff = rv_decode_dc(s, n);
3561 level = level & 0xff; /* handle wrap round */
3562 s->last_dc[component] = level;
3564 s->rv10_first_dc_coded[component] = 1;
3567 level = get_bits(&s->gb, 8);
3570 level = get_bits(&s->gb, 8);
3571 if((level&0x7F) == 0){
3572 fprintf(stderr, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y);
3584 if (s->mb_intra && s->h263_aic)
3586 s->block_last_index[n] = i - 1;
3591 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
3593 fprintf(stderr, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
3596 if (code == rl->n) {
3598 last = get_bits1(&s->gb);
3599 run = get_bits(&s->gb, 6);
3600 level = (int8_t)get_bits(&s->gb, 8);
3603 /* XXX: should patch encoder too */
3604 level = get_bits(&s->gb, 12);
3605 level= (level + ((-1)<<11)) ^ ((-1)<<11); //sign extension
3607 level = get_bits(&s->gb, 5);
3608 level += get_bits(&s->gb, 6)<<5;
3609 level= (level + ((-1)<<10)) ^ ((-1)<<10); //sign extension
3613 run = rl->table_run[code];
3614 level = rl->table_level[code];
3615 last = code >= rl->last;
3616 if (get_bits1(&s->gb))
3621 fprintf(stderr, "run overflow at %dx%d\n", s->mb_x, s->mb_y);
3631 if (s->mb_intra && s->h263_aic) {
3632 h263_pred_acdc(s, block, n);
3635 s->block_last_index[n] = i;
3640 * decodes the dc value.
3641 * @param n block index (0-3 are luma, 4-5 are chroma)
3642 * @param dir_ptr the prediction direction will be stored here
3643 * @return the quantized dc
3645 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
3647 int level, pred, code;
3651 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
3653 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
3654 if (code < 0 || code > 9 /* && s->nbit<9 */){
3655 fprintf(stderr, "illegal dc vlc\n");
3661 level = get_bits(&s->gb, code);
3662 if ((level >> (code - 1)) == 0) /* if MSB not set it is negative*/
3663 level = - (level ^ ((1 << code) - 1));
3665 if(get_bits1(&s->gb)==0){ /* marker */
3666 if(s->error_resilience>=2){
3667 fprintf(stderr, "dc marker bit missing\n");
3673 pred = ff_mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
3676 if(s->error_resilience>=3){
3677 fprintf(stderr, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
3683 *dc_val = level * s->y_dc_scale;
3685 *dc_val = level * s->c_dc_scale;
3687 if(s->error_resilience>=3){
3688 if(*dc_val > 2048 + s->y_dc_scale + s->c_dc_scale){
3689 fprintf(stderr, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
3698 * @return <0 if an error occured
3700 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
3701 int n, int coded, int intra)
3703 int level, i, last, run;
3706 RL_VLC_ELEM * rl_vlc;
3707 const uint8_t * scan_table;
3712 if(s->partitioned_frame){
3713 level = s->dc_val[0][ s->block_index[n] ];
3714 if(n<4) level= (level + (s->y_dc_scale>>1))/s->y_dc_scale; //FIXME optimizs
3715 else level= (level + (s->c_dc_scale>>1))/s->c_dc_scale;
3716 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_width]<<n)&32;
3718 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
3727 rl_vlc = rl_intra.rl_vlc[0];
3729 if (dc_pred_dir == 0)
3730 scan_table = s->intra_v_scantable.permutated; /* left */
3732 scan_table = s->intra_h_scantable.permutated; /* top */
3734 scan_table = s->intra_scantable.permutated;
3741 s->block_last_index[n] = i;
3746 scan_table = s->intra_scantable.permutated;
3751 rl_vlc = rl_inter.rl_vlc[0];
3753 qmul = s->qscale << 1;
3754 qadd = (s->qscale - 1) | 1;
3755 rl_vlc = rl_inter.rl_vlc[s->qscale];
3759 OPEN_READER(re, &s->gb);
3761 UPDATE_CACHE(re, &s->gb);
3762 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
3765 cache= GET_CACHE(re, &s->gb);
3767 if (cache&0x80000000) {
3768 if (cache&0x40000000) {
3770 SKIP_CACHE(re, &s->gb, 2);
3771 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
3772 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
3773 SKIP_COUNTER(re, &s->gb, 2+1+6);
3774 UPDATE_CACHE(re, &s->gb);
3776 if(SHOW_UBITS(re, &s->gb, 1)==0){
3777 fprintf(stderr, "1. marker bit missing in 3. esc\n");
3779 }; SKIP_CACHE(re, &s->gb, 1);
3781 level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
3783 if(SHOW_UBITS(re, &s->gb, 1)==0){
3784 fprintf(stderr, "2. marker bit missing in 3. esc\n");
3786 }; LAST_SKIP_CACHE(re, &s->gb, 1);
3788 SKIP_COUNTER(re, &s->gb, 1+12+1);
3790 if(level*s->qscale>1024 || level*s->qscale<-1024){
3791 fprintf(stderr, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
3796 const int abs_level= ABS(level);
3797 if(abs_level<=MAX_LEVEL && run<=MAX_RUN && !(s->workaround_bugs&FF_BUG_AC_VLC)){
3798 const int run1= run - rl->max_run[last][abs_level] - 1;
3799 if(abs_level <= rl->max_level[last][run]){
3800 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
3803 if(s->error_resilience > FF_ER_COMPLIANT){
3804 if(abs_level <= rl->max_level[last][run]*2){
3805 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
3808 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
3809 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
3816 if (level>0) level= level * qmul + qadd;
3817 else level= level * qmul - qadd;
3823 #if MIN_CACHE_BITS < 20
3824 LAST_SKIP_BITS(re, &s->gb, 2);
3825 UPDATE_CACHE(re, &s->gb);
3827 SKIP_BITS(re, &s->gb, 2);
3829 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
3830 i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing
3831 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
3832 LAST_SKIP_BITS(re, &s->gb, 1);
3836 #if MIN_CACHE_BITS < 19
3837 LAST_SKIP_BITS(re, &s->gb, 1);
3838 UPDATE_CACHE(re, &s->gb);
3840 SKIP_BITS(re, &s->gb, 1);
3842 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
3844 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
3845 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
3846 LAST_SKIP_BITS(re, &s->gb, 1);
3850 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
3851 LAST_SKIP_BITS(re, &s->gb, 1);
3856 fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
3860 block[scan_table[i]] = level;
3864 block[scan_table[i]] = level;
3866 CLOSE_READER(re, &s->gb);
3870 mpeg4_pred_ac(s, block, n, dc_pred_dir);
3872 i = 63; /* XXX: not optimal */
3875 s->block_last_index[n] = i;
3879 /* most is hardcoded. should extend to handle all h263 streams */
3880 int h263_decode_picture_header(MpegEncContext *s)
3882 int format, width, height;
3884 /* picture start code */
3885 if (get_bits(&s->gb, 22) != 0x20) {
3886 fprintf(stderr, "Bad picture start code\n");
3889 /* temporal reference */
3890 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
3892 /* PTYPE starts here */
3893 if (get_bits1(&s->gb) != 1) {
3895 fprintf(stderr, "Bad marker\n");
3898 if (get_bits1(&s->gb) != 0) {
3899 fprintf(stderr, "Bad H263 id\n");
3900 return -1; /* h263 id */
3902 skip_bits1(&s->gb); /* split screen off */
3903 skip_bits1(&s->gb); /* camera off */
3904 skip_bits1(&s->gb); /* freeze picture release off */
3906 /* Reset GOB number */
3909 format = get_bits(&s->gb, 3);
3914 7 extended PTYPE (PLUSPTYPE)
3917 if (format != 7 && format != 6) {
3920 width = h263_format[format][0];
3921 height = h263_format[format][1];
3927 s->pict_type = I_TYPE + get_bits1(&s->gb);
3929 s->unrestricted_mv = get_bits1(&s->gb);
3930 s->h263_long_vectors = s->unrestricted_mv;
3932 if (get_bits1(&s->gb) != 0) {
3933 fprintf(stderr, "H263 SAC not supported\n");
3934 return -1; /* SAC: off */
3936 if (get_bits1(&s->gb) != 0) {
3937 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
3940 if (get_bits1(&s->gb) != 0) {
3941 fprintf(stderr, "H263 PB frame not supported\n");
3942 return -1; /* not PB frame */
3944 s->qscale = get_bits(&s->gb, 5);
3945 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
3951 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
3953 /* ufep other than 0 and 1 are reserved */
3956 format = get_bits(&s->gb, 3);
3957 dprintf("ufep=1, format: %d\n", format);
3958 skip_bits(&s->gb,1); /* Custom PCF */
3959 s->umvplus = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */
3960 skip_bits1(&s->gb); /* Syntax-based Arithmetic Coding (SAC) */
3961 if (get_bits1(&s->gb) != 0) {
3962 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
3964 if (get_bits1(&s->gb) != 0) { /* Advanced Intra Coding (AIC) */
3968 skip_bits(&s->gb, 7);
3969 /* these are the 7 bits: (in order of appearence */
3970 /* Deblocking Filter */
3971 /* Slice Structured */
3972 /* Reference Picture Selection */
3973 /* Independent Segment Decoding */
3974 /* Alternative Inter VLC */
3975 /* Modified Quantization */
3976 /* Prevent start code emulation */
3978 skip_bits(&s->gb, 3); /* Reserved */
3979 } else if (ufep != 0) {
3980 fprintf(stderr, "Bad UFEP type (%d)\n", ufep);
3985 s->pict_type = get_bits(&s->gb, 3) + I_TYPE;
3986 dprintf("pict_type: %d\n", s->pict_type);
3987 if (s->pict_type != I_TYPE &&
3988 s->pict_type != P_TYPE)
3990 skip_bits(&s->gb, 2);
3991 s->no_rounding = get_bits1(&s->gb);
3992 dprintf("RTYPE: %d\n", s->no_rounding);
3993 skip_bits(&s->gb, 4);
3995 /* Get the picture dimensions */
3998 /* Custom Picture Format (CPFMT) */
3999 s->aspect_ratio_info = get_bits(&s->gb, 4);
4000 dprintf("aspect: %d\n", s->aspect_ratio_info);
4005 3 - 10:11 (525-type 4:3)
4006 4 - 16:11 (CIF 16:9)
4007 5 - 40:33 (525-type 16:9)
4010 width = (get_bits(&s->gb, 9) + 1) * 4;
4012 height = get_bits(&s->gb, 9) * 4;
4013 dprintf("\nH.263+ Custom picture: %dx%d\n",width,height);
4014 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
4015 /* aspected dimensions */
4016 s->aspected_width = get_bits(&s->gb, 8);
4017 s->aspected_height = get_bits(&s->gb, 8);
4019 s->aspected_width = pixel_aspect[s->aspect_ratio_info][0];
4020 s->aspected_height= pixel_aspect[s->aspect_ratio_info][1];
4023 width = h263_format[format][0];
4024 height = h263_format[format][1];
4026 if ((width == 0) || (height == 0))
4031 if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
4036 s->qscale = get_bits(&s->gb, 5);
4039 while (get_bits1(&s->gb) != 0) {
4040 skip_bits(&s->gb, 8);
4045 s->y_dc_scale_table=
4046 s->c_dc_scale_table= h263_aic_dc_scale_table;
4048 s->y_dc_scale_table=
4049 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
4055 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s)
4058 int a= 2<<s->sprite_warping_accuracy;
4059 int rho= 3-s->sprite_warping_accuracy;
4061 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
4062 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
4063 int sprite_ref[4][2];
4064 int virtual_ref[2][2];
4066 int alpha=0, beta=0;
4071 for(i=0; i<s->num_sprite_warping_points; i++){
4075 length= get_vlc(&s->gb, &sprite_trajectory);
4077 x= get_bits(&s->gb, length);
4079 if ((x >> (length - 1)) == 0) /* if MSB not set it is negative*/
4080 x = - (x ^ ((1 << length) - 1));
4082 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(&s->gb); /* marker bit */
4084 length= get_vlc(&s->gb, &sprite_trajectory);
4086 y=get_bits(&s->gb, length);
4088 if ((y >> (length - 1)) == 0) /* if MSB not set it is negative*/
4089 y = - (y ^ ((1 << length) - 1));
4091 skip_bits1(&s->gb); /* marker bit */
4092 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
4097 while((1<<alpha)<w) alpha++;
4098 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
4102 // Note, the 4th point isnt used for GMC
4103 if(s->divx_version==500 && s->divx_build==413){
4104 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
4105 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
4106 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
4107 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
4108 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
4109 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
4111 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
4112 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
4113 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
4114 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
4115 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
4116 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
4118 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
4119 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
4121 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
4122 // perhaps it should be reordered to be more readable ...
4123 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
4124 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
4125 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
4126 + 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);
4127 virtual_ref[0][1]= 16*vop_ref[0][1]
4128 + 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);
4129 virtual_ref[1][0]= 16*vop_ref[0][0]
4130 + 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);
4131 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
4132 + 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);
4134 switch(s->num_sprite_warping_points)
4137 s->sprite_offset[0][0]= 0;
4138 s->sprite_offset[0][1]= 0;
4139 s->sprite_offset[1][0]= 0;
4140 s->sprite_offset[1][1]= 0;
4141 s->sprite_delta[0][0]= a;
4142 s->sprite_delta[0][1]= 0;
4143 s->sprite_delta[1][0]= 0;
4144 s->sprite_delta[1][1]= a;
4145 s->sprite_shift[0]= 0;
4146 s->sprite_shift[1]= 0;
4149 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
4150 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
4151 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
4152 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
4153 s->sprite_delta[0][0]= a;
4154 s->sprite_delta[0][1]= 0;
4155 s->sprite_delta[1][0]= 0;
4156 s->sprite_delta[1][1]= a;
4157 s->sprite_shift[0]= 0;
4158 s->sprite_shift[1]= 0;
4161 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
4162 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
4163 + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])
4164 + (1<<(alpha+rho-1));
4165 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
4166 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
4167 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])
4168 + (1<<(alpha+rho-1));
4169 s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
4170 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
4171 +2*w2*r*sprite_ref[0][0]
4173 + (1<<(alpha+rho+1)));
4174 s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
4175 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
4176 +2*w2*r*sprite_ref[0][1]
4178 + (1<<(alpha+rho+1)));
4179 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
4180 s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]);
4181 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
4182 s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
4184 s->sprite_shift[0]= alpha+rho;
4185 s->sprite_shift[1]= alpha+rho+2;
4188 min_ab= FFMIN(alpha, beta);
4191 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
4192 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])
4193 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])
4194 + (1<<(alpha+beta+rho-min_ab-1));
4195 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))
4196 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])
4197 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])
4198 + (1<<(alpha+beta+rho-min_ab-1));
4199 s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)
4200 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)
4201 + 2*w2*h3*r*sprite_ref[0][0]
4203 + (1<<(alpha+beta+rho-min_ab+1));
4204 s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)
4205 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)
4206 + 2*w2*h3*r*sprite_ref[0][1]
4208 + (1<<(alpha+beta+rho-min_ab+1));
4209 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;
4210 s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;
4211 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;
4212 s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;
4214 s->sprite_shift[0]= alpha + beta + rho - min_ab;
4215 s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;
4218 /* try to simplify the situation */
4219 if( s->sprite_delta[0][0] == a<<s->sprite_shift[0]
4220 && s->sprite_delta[0][1] == 0
4221 && s->sprite_delta[1][0] == 0
4222 && s->sprite_delta[1][1] == a<<s->sprite_shift[0])
4224 s->sprite_offset[0][0]>>=s->sprite_shift[0];
4225 s->sprite_offset[0][1]>>=s->sprite_shift[0];
4226 s->sprite_offset[1][0]>>=s->sprite_shift[1];
4227 s->sprite_offset[1][1]>>=s->sprite_shift[1];
4228 s->sprite_delta[0][0]= a;
4229 s->sprite_delta[0][1]= 0;
4230 s->sprite_delta[1][0]= 0;
4231 s->sprite_delta[1][1]= a;
4232 s->sprite_shift[0]= 0;
4233 s->sprite_shift[1]= 0;
4234 s->real_sprite_warping_points=1;
4237 int shift_y= 16 - s->sprite_shift[0];
4238 int shift_c= 16 - s->sprite_shift[1];
4239 //printf("shifts %d %d\n", shift_y, shift_c);
4241 s->sprite_offset[0][i]<<= shift_y;
4242 s->sprite_offset[1][i]<<= shift_c;
4243 s->sprite_delta[0][i]<<= shift_y;
4244 s->sprite_delta[1][i]<<= shift_y;
4245 s->sprite_shift[i]= 16;
4247 s->real_sprite_warping_points= s->num_sprite_warping_points;
4250 printf("vop:%d:%d %d:%d %d:%d, sprite:%d:%d %d:%d %d:%d, virtual: %d:%d %d:%d\n",
4251 vop_ref[0][0], vop_ref[0][1],
4252 vop_ref[1][0], vop_ref[1][1],
4253 vop_ref[2][0], vop_ref[2][1],
4254 sprite_ref[0][0], sprite_ref[0][1],
4255 sprite_ref[1][0], sprite_ref[1][1],
4256 sprite_ref[2][0], sprite_ref[2][1],
4257 virtual_ref[0][0], virtual_ref[0][1],
4258 virtual_ref[1][0], virtual_ref[1][1]
4261 printf("offset: %d:%d , delta: %d %d %d %d, shift %d\n",
4262 s->sprite_offset[0][0], s->sprite_offset[0][1],
4263 s->sprite_delta[0][0], s->sprite_delta[0][1],
4264 s->sprite_delta[1][0], s->sprite_delta[1][1],
4270 static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
4271 int hours, minutes, seconds;
4273 hours= get_bits(gb, 5);
4274 minutes= get_bits(gb, 6);
4276 seconds= get_bits(gb, 6);
4278 s->time_base= seconds + 60*(minutes + 60*hours);
4286 static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
4287 int width, height, vo_ver_id;
4290 skip_bits(gb, 1); /* random access */
4291 s->vo_type= get_bits(gb, 8);
4292 if (get_bits1(gb) != 0) { /* is_ol_id */
4293 vo_ver_id = get_bits(gb, 4); /* vo_ver_id */
4294 skip_bits(gb, 3); /* vo_priority */
4298 //printf("vo type:%d\n",s->vo_type);
4299 s->aspect_ratio_info= get_bits(gb, 4);
4300 if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
4301 s->aspected_width = get_bits(gb, 8); // par_width
4302 s->aspected_height = get_bits(gb, 8); // par_height
4304 s->aspected_width = pixel_aspect[s->aspect_ratio_info][0];
4305 s->aspected_height= pixel_aspect[s->aspect_ratio_info][1];
4308 if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
4309 int chroma_format= get_bits(gb, 2);
4310 if(chroma_format!=1){
4311 printf("illegal chroma format\n");
4313 s->low_delay= get_bits1(gb);
4314 if(get_bits1(gb)){ /* vbv parameters */
4315 get_bits(gb, 15); /* first_half_bitrate */
4316 skip_bits1(gb); /* marker */
4317 get_bits(gb, 15); /* latter_half_bitrate */
4318 skip_bits1(gb); /* marker */
4319 get_bits(gb, 15); /* first_half_vbv_buffer_size */
4320 skip_bits1(gb); /* marker */
4321 get_bits(gb, 3); /* latter_half_vbv_buffer_size */
4322 get_bits(gb, 11); /* first_half_vbv_occupancy */
4323 skip_bits1(gb); /* marker */
4324 get_bits(gb, 15); /* latter_half_vbv_occupancy */
4325 skip_bits1(gb); /* marker */
4328 // set low delay flag only once so the smart? low delay detection wont be overriden
4329 if(s->picture_number==0)
4333 s->shape = get_bits(gb, 2); /* vol shape */
4334 if(s->shape != RECT_SHAPE) printf("only rectangular vol supported\n");
4335 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
4336 printf("Gray shape not supported\n");
4337 skip_bits(gb, 4); //video_object_layer_shape_extension
4340 skip_bits1(gb); /* marker */
4342 s->time_increment_resolution = get_bits(gb, 16);
4344 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
4345 if (s->time_increment_bits < 1)
4346 s->time_increment_bits = 1;
4347 skip_bits1(gb); /* marker */
4349 if (get_bits1(gb) != 0) { /* fixed_vop_rate */
4350 skip_bits(gb, s->time_increment_bits);
4353 if (s->shape != BIN_ONLY_SHAPE) {
4354 if (s->shape == RECT_SHAPE) {
4355 skip_bits1(gb); /* marker */
4356 width = get_bits(gb, 13);
4357 skip_bits1(gb); /* marker */
4358 height = get_bits(gb, 13);
4359 skip_bits1(gb); /* marker */
4360 if(width && height){ /* they should be non zero but who knows ... */
4363 // printf("width/height: %d %d\n", width, height);
4367 s->progressive_sequence= get_bits1(gb)^1;
4368 if(!get_bits1(gb)) printf("OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */
4369 if (vo_ver_id == 1) {
4370 s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */
4372 s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */
4374 if(s->vol_sprite_usage==STATIC_SPRITE) printf("Static Sprites not supported\n");
4375 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
4376 if(s->vol_sprite_usage==STATIC_SPRITE){
4377 s->sprite_width = get_bits(gb, 13);
4378 skip_bits1(gb); /* marker */
4379 s->sprite_height= get_bits(gb, 13);
4380 skip_bits1(gb); /* marker */
4381 s->sprite_left = get_bits(gb, 13);
4382 skip_bits1(gb); /* marker */
4383 s->sprite_top = get_bits(gb, 13);
4384 skip_bits1(gb); /* marker */
4386 s->num_sprite_warping_points= get_bits(gb, 6);
4387 s->sprite_warping_accuracy = get_bits(gb, 2);
4388 s->sprite_brightness_change= get_bits1(gb);
4389 if(s->vol_sprite_usage==STATIC_SPRITE)
4390 s->low_latency_sprite= get_bits1(gb);
4392 // FIXME sadct disable bit if verid!=1 && shape not rect
4394 if (get_bits1(gb) == 1) { /* not_8_bit */
4395 s->quant_precision = get_bits(gb, 4); /* quant_precision */
4396 if(get_bits(gb, 4)!=8) printf("N-bit not supported\n"); /* bits_per_pixel */
4397 if(s->quant_precision!=5) printf("quant precission %d\n", s->quant_precision);
4399 s->quant_precision = 5;
4402 // FIXME a bunch of grayscale shape things
4404 if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */
4407 /* load default matrixes */
4408 for(i=0; i<64; i++){
4409 int j= s->dsp.idct_permutation[i];
4410 v= ff_mpeg4_default_intra_matrix[i];
4411 s->intra_matrix[j]= v;
4412 s->chroma_intra_matrix[j]= v;
4414 v= ff_mpeg4_default_non_intra_matrix[i];
4415 s->inter_matrix[j]= v;
4416 s->chroma_inter_matrix[j]= v;
4419 /* load custom intra matrix */
4422 for(i=0; i<64; i++){
4428 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
4429 s->intra_matrix[j]= v;
4430 s->chroma_intra_matrix[j]= v;
4433 /* replicate last value */
4435 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
4436 s->intra_matrix[j]= v;
4437 s->chroma_intra_matrix[j]= v;
4441 /* load custom non intra matrix */
4444 for(i=0; i<64; i++){
4450 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
4451 s->inter_matrix[j]= v;
4452 s->chroma_inter_matrix[j]= v;
4455 /* replicate last value */
4457 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
4458 s->inter_matrix[j]= last;
4459 s->chroma_inter_matrix[j]= last;
4463 // FIXME a bunch of grayscale shape things
4467 s->quarter_sample= get_bits1(gb);
4468 else s->quarter_sample=0;
4470 if(!get_bits1(gb)) printf("Complexity estimation not supported\n");
4472 s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */
4474 s->data_partitioning= get_bits1(gb);
4475 if(s->data_partitioning){
4476 s->rvlc= get_bits1(gb);
4478 printf("reversible vlc not supported\n");
4482 if(vo_ver_id != 1) {
4483 s->new_pred= get_bits1(gb);
4485 printf("new pred not supported\n");
4486 skip_bits(gb, 2); /* requested upstream message type */
4487 skip_bits1(gb); /* newpred segment type */
4489 s->reduced_res_vop= get_bits1(gb);
4490 if(s->reduced_res_vop) printf("reduced resolution VOP not supported\n");
4494 s->reduced_res_vop= 0;
4497 s->scalability= get_bits1(gb);
4499 if (s->scalability) {
4500 GetBitContext bak= *gb;
4502 int ref_layer_sampling_dir;
4503 int h_sampling_factor_n;
4504 int h_sampling_factor_m;
4505 int v_sampling_factor_n;
4506 int v_sampling_factor_m;
4508 s->hierachy_type= get_bits1(gb);
4509 ref_layer_id= get_bits(gb, 4);
4510 ref_layer_sampling_dir= get_bits1(gb);
4511 h_sampling_factor_n= get_bits(gb, 5);
4512 h_sampling_factor_m= get_bits(gb, 5);
4513 v_sampling_factor_n= get_bits(gb, 5);
4514 v_sampling_factor_m= get_bits(gb, 5);
4515 s->enhancement_type= get_bits1(gb);
4517 if( h_sampling_factor_n==0 || h_sampling_factor_m==0
4518 || v_sampling_factor_n==0 || v_sampling_factor_m==0){
4520 // fprintf(stderr, "illegal scalability header (VERY broken encoder), trying to workaround\n");
4525 printf("scalability not supported\n");
4527 // bin shape stuff FIXME
4534 * decodes the user data stuff in the header.
4535 * allso inits divx/xvid/lavc_version/build
4537 static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
4541 int ver, build, ver2, ver3;
4543 buf[0]= show_bits(gb, 8);
4544 for(i=1; i<256; i++){
4545 buf[i]= show_bits(gb, 16)&0xFF;
4546 if(buf[i]==0) break;
4551 /* divx detection */
4552 e=sscanf(buf, "DivX%dBuild%d", &ver, &build);
4554 e=sscanf(buf, "DivX%db%d", &ver, &build);
4556 s->divx_version= ver;
4557 s->divx_build= build;
4558 if(s->picture_number==0){
4559 printf("This file was encoded with DivX%d Build%d\n", ver, build);
4563 /* ffmpeg detection */
4564 e=sscanf(buf, "FFmpeg%d.%d.%db%d", &ver, &ver2, &ver3, &build);
4566 e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
4568 if(strcmp(buf, "ffmpeg")==0){
4569 s->ffmpeg_version= 0x000406;
4570 s->lavc_build= 4600;
4574 s->ffmpeg_version= ver*256*256 + ver2*256 + ver3;
4575 s->lavc_build= build;
4576 if(s->picture_number==0)
4577 printf("This file was encoded with libavcodec build %d\n", build);
4580 /* xvid detection */
4581 e=sscanf(buf, "XviD%d", &build);
4583 s->xvid_build= build;
4584 if(s->picture_number==0)
4585 printf("This file was encoded with XviD build %d\n", build);
4588 //printf("User Data: %s\n", buf);
4592 static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
4593 int time_incr, time_increment;
4595 s->pict_type = get_bits(gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */
4596 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0){
4597 printf("low_delay flag set, but shouldnt, clearing it\n");
4601 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
4602 if(s->partitioned_frame)
4603 s->decode_mb= mpeg4_decode_partitioned_mb;
4605 s->decode_mb= ff_h263_decode_mb;
4607 if(s->time_increment_resolution==0){
4608 s->time_increment_resolution=1;
4609 // fprintf(stderr, "time_increment_resolution is illegal\n");
4612 while (get_bits1(gb) != 0)
4615 check_marker(gb, "before time_increment");
4617 if(s->picture_number==0 && (show_bits(gb, s->time_increment_bits+1)&1)==0){
4618 printf("hmm, seems the headers arnt complete, trying to guess time_increment_bits\n");
4621 for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){
4622 if(show_bits(gb, s->time_increment_bits+1)&1) break;
4624 printf("my guess is %d bits ;)\n",s->time_increment_bits);
4627 time_increment= get_bits(gb, s->time_increment_bits);
4628 //printf(" type:%d modulo_time_base:%d increment:%d\n", s->pict_type, time_incr, time_increment);
4629 if(s->pict_type!=B_TYPE){
4630 s->last_time_base= s->time_base;
4631 s->time_base+= time_incr;
4632 s->time= s->time_base*s->time_increment_resolution + time_increment;
4633 if(s->workaround_bugs&FF_BUG_UMP4){
4634 if(s->time < s->last_non_b_time){
4635 // fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaround\n");
4637 s->time+= s->time_increment_resolution;
4640 s->pp_time= s->time - s->last_non_b_time;
4641 s->last_non_b_time= s->time;
4643 s->time= (s->last_time_base + time_incr)*s->time_increment_resolution + time_increment;
4644 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
4645 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
4646 // printf("messed up order, seeking?, skiping current b frame\n");
4647 return FRAME_SKIPED;
4650 if(s->t_frame==0) s->t_frame= s->time - s->last_time_base;
4651 if(s->t_frame==0) s->t_frame=1; // 1/0 protection
4652 //printf("%Ld %Ld %d %d\n", s->last_non_b_time, s->time, s->pp_time, s->t_frame); fflush(stdout);
4653 s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame)
4654 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
4655 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame)
4656 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
4659 s->current_picture.pts= s->time*1000LL*1000LL / s->time_increment_resolution;
4660 if(s->avctx->debug&FF_DEBUG_PTS)
4661 printf("MPEG4 PTS: %f\n", s->current_picture.pts/(1000.0*1000.0));
4663 check_marker(gb, "before vop_coded");
4666 if (get_bits1(gb) != 1){
4667 printf("vop not coded\n");
4668 return FRAME_SKIPED;
4670 //printf("time %d %d %d || %Ld %Ld %Ld\n", s->time_increment_bits, s->time_increment_resolution, s->time_base,
4671 //s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time);
4672 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE
4673 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
4674 /* rounding type for motion estimation */
4675 s->no_rounding = get_bits1(gb);
4679 //FIXME reduced res stuff
4681 if (s->shape != RECT_SHAPE) {
4682 if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) {
4683 int width, height, hor_spat_ref, ver_spat_ref;
4685 width = get_bits(gb, 13);
4686 skip_bits1(gb); /* marker */
4687 height = get_bits(gb, 13);
4688 skip_bits1(gb); /* marker */
4689 hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */
4690 skip_bits1(gb); /* marker */
4691 ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */
4693 skip_bits1(gb); /* change_CR_disable */
4695 if (get_bits1(gb) != 0) {
4696 skip_bits(gb, 8); /* constant_alpha_value */
4699 //FIXME complexity estimation stuff
4701 if (s->shape != BIN_ONLY_SHAPE) {
4703 t=get_bits(gb, 3); /* intra dc VLC threshold */
4704 //printf("threshold %d\n", t);
4705 if(!s->progressive_sequence){
4706 s->top_field_first= get_bits1(gb);
4707 s->alternate_scan= get_bits1(gb);
4709 s->alternate_scan= 0;
4712 if(s->alternate_scan){
4713 ff_init_scantable(s, &s->inter_scantable , ff_alternate_vertical_scan);
4714 ff_init_scantable(s, &s->intra_scantable , ff_alternate_vertical_scan);
4715 ff_init_scantable(s, &s->intra_h_scantable, ff_alternate_vertical_scan);
4716 ff_init_scantable(s, &s->intra_v_scantable, ff_alternate_vertical_scan);
4718 ff_init_scantable(s, &s->inter_scantable , ff_zigzag_direct);
4719 ff_init_scantable(s, &s->intra_scantable , ff_zigzag_direct);
4720 ff_init_scantable(s, &s->intra_h_scantable, ff_alternate_horizontal_scan);
4721 ff_init_scantable(s, &s->intra_v_scantable, ff_alternate_vertical_scan);
4724 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
4725 mpeg4_decode_sprite_trajectory(s);
4726 if(s->sprite_brightness_change) printf("sprite_brightness_change not supported\n");
4727 if(s->vol_sprite_usage==STATIC_SPRITE) printf("static sprite not supported\n");
4730 if (s->shape != BIN_ONLY_SHAPE) {
4731 s->qscale = get_bits(gb, s->quant_precision);
4733 printf("Error, header damaged or not MPEG4 header (qscale=0)\n");
4734 return -1; // makes no sense to continue, as there is nothing left from the image then
4737 if (s->pict_type != I_TYPE) {
4738 s->f_code = get_bits(gb, 3); /* fcode_for */
4740 printf("Error, header damaged or not MPEG4 header (f_code=0)\n");
4741 return -1; // makes no sense to continue, as the MV decoding will break very quickly
4746 if (s->pict_type == B_TYPE) {
4747 s->b_code = get_bits(gb, 3);
4751 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
4752 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",
4753 s->qscale, s->f_code, s->b_code,
4754 s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")),
4755 gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first,
4756 s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,
4757 s->sprite_warping_accuracy);
4760 if(!s->scalability){
4761 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {
4762 skip_bits1(gb); // vop shape coding type
4765 if(s->enhancement_type){
4766 int load_backward_shape= get_bits1(gb);
4767 if(load_backward_shape){
4768 printf("load backward shape isnt supported\n");
4771 skip_bits(gb, 2); //ref_select_code
4774 /* detect buggy encoders which dont set the low_delay flag (divx4/xvid/opendivx)*/
4775 // note we cannot detect divx5 without b-frames easyly (allthough its buggy too)
4776 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
4777 printf("looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
4781 s->picture_number++; // better than pic number==0 allways ;)
4783 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
4784 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
4786 if(s->divx_version==0 || s->divx_version < 500){
4787 s->h_edge_pos= s->width;
4788 s->v_edge_pos= s->height;
4794 * decode mpeg4 headers
4795 * @return <0 if no VOP found (or a damaged one)
4796 * FRAME_SKIPPED if a not coded VOP is found
4797 * 0 if a VOP is found
4799 int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb)
4803 /* search next start code */
4807 v = get_bits(gb, 8);
4808 startcode = ((startcode << 8) | v) & 0xffffffff;
4810 if(get_bits_count(gb) >= gb->size_in_bits){
4811 if(gb->size_in_bits==8 && s->divx_version){
4812 printf("frame skip %d\n", gb->size_in_bits);
4813 return FRAME_SKIPED; //divx bug
4815 return -1; //end of stream
4818 if((startcode&0xFFFFFF00) != 0x100)
4819 continue; //no startcode
4821 if(s->avctx->debug&FF_DEBUG_STARTCODE){
4822 printf("startcode: %3X ", startcode);
4823 if (startcode<=0x11F) printf("Video Object Start");
4824 else if(startcode<=0x12F) printf("Video Object Layer Start");
4825 else if(startcode<=0x13F) printf("Reserved");
4826 else if(startcode<=0x15F) printf("FGS bp start");
4827 else if(startcode<=0x1AF) printf("Reserved");
4828 else if(startcode==0x1B0) printf("Visual Object Seq Start");
4829 else if(startcode==0x1B1) printf("Visual Object Seq End");
4830 else if(startcode==0x1B2) printf("User Data");
4831 else if(startcode==0x1B3) printf("Group of VOP start");
4832 else if(startcode==0x1B4) printf("Video Session Error");
4833 else if(startcode==0x1B5) printf("Visual Object Start");
4834 else if(startcode==0x1B6) printf("Video Object Plane start");
4835 else if(startcode==0x1B7) printf("slice start");
4836 else if(startcode==0x1B8) printf("extension start");
4837 else if(startcode==0x1B9) printf("fgs start");
4838 else if(startcode==0x1BA) printf("FBA Object start");
4839 else if(startcode==0x1BB) printf("FBA Object Plane start");
4840 else if(startcode==0x1BC) printf("Mesh Object start");
4841 else if(startcode==0x1BD) printf("Mesh Object Plane start");
4842 else if(startcode==0x1BE) printf("Still Textutre Object start");
4843 else if(startcode==0x1BF) printf("Textutre Spatial Layer start");
4844 else if(startcode==0x1C0) printf("Textutre SNR Layer start");
4845 else if(startcode==0x1C1) printf("Textutre Tile start");
4846 else if(startcode==0x1C2) printf("Textutre Shape Layer start");
4847 else if(startcode==0x1C3) printf("stuffing start");
4848 else if(startcode<=0x1C5) printf("reserved");
4849 else if(startcode<=0x1FF) printf("System start");
4850 printf(" at %d\n", get_bits_count(gb));
4855 decode_vol_header(s, gb);
4857 case USER_DATA_STARTCODE:
4858 decode_user_data(s, gb);
4861 mpeg4_decode_gop_header(s, gb);
4864 return decode_vop_header(s, gb);
4874 /* don't understand why they choose a different header ! */
4875 int intel_h263_decode_picture_header(MpegEncContext *s)
4879 /* picture header */
4880 if (get_bits(&s->gb, 22) != 0x20) {
4881 fprintf(stderr, "Bad picture start code\n");
4884 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
4886 if (get_bits1(&s->gb) != 1) {
4887 fprintf(stderr, "Bad marker\n");
4888 return -1; /* marker */
4890 if (get_bits1(&s->gb) != 0) {
4891 fprintf(stderr, "Bad H263 id\n");
4892 return -1; /* h263 id */
4894 skip_bits1(&s->gb); /* split screen off */
4895 skip_bits1(&s->gb); /* camera off */
4896 skip_bits1(&s->gb); /* freeze picture release off */
4898 format = get_bits(&s->gb, 3);
4900 fprintf(stderr, "Intel H263 free format not supported\n");
4905 s->pict_type = I_TYPE + get_bits1(&s->gb);
4907 s->unrestricted_mv = get_bits1(&s->gb);
4908 s->h263_long_vectors = s->unrestricted_mv;
4910 if (get_bits1(&s->gb) != 0) {
4911 fprintf(stderr, "SAC not supported\n");
4912 return -1; /* SAC: off */
4914 if (get_bits1(&s->gb) != 0) {
4915 fprintf(stderr, "Advanced Prediction Mode not supported\n");
4916 return -1; /* advanced prediction mode: off */
4918 if (get_bits1(&s->gb) != 0) {
4919 fprintf(stderr, "PB frame mode no supported\n");
4920 return -1; /* PB frame mode */
4923 /* skip unknown header garbage */
4924 skip_bits(&s->gb, 41);
4926 s->qscale = get_bits(&s->gb, 5);
4927 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
4930 while (get_bits1(&s->gb) != 0) {
4931 skip_bits(&s->gb, 8);
4935 s->y_dc_scale_table=
4936 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;