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>
35 #include "mpegvideo.h"
37 #include "mpeg4data.h"
42 #define INTRA_MCBPC_VLC_BITS 6
43 #define INTER_MCBPC_VLC_BITS 6
44 #define CBPY_VLC_BITS 6
47 #define SPRITE_TRAJ_VLC_BITS 6
48 #define MB_TYPE_B_VLC_BITS 4
49 #define TEX_VLC_BITS 9
51 #ifdef CONFIG_ENCODERS
52 static void h263_encode_block(MpegEncContext * s, DCTELEM * block,
54 static void h263_encode_motion(MpegEncContext * s, int val, int fcode);
55 static void h263p_encode_umotion(MpegEncContext * s, int val);
56 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block,
57 int n, int dc, uint8_t *scan_table,
58 PutBitContext *dc_pb, PutBitContext *ac_pb);
61 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode);
62 static int h263p_decode_umotion(MpegEncContext * s, int pred);
63 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
65 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
66 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
67 int n, int coded, int intra, int rvlc);
68 static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr);
69 #ifdef CONFIG_ENCODERS
70 static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
72 #endif //CONFIG_ENCODERS
73 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s);
74 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr, int *dir_ptr);
76 #ifdef CONFIG_ENCODERS
77 static uint8_t uni_DCtab_lum_len[512];
78 static uint8_t uni_DCtab_chrom_len[512];
79 static uint16_t uni_DCtab_lum_bits[512];
80 static uint16_t uni_DCtab_chrom_bits[512];
82 static uint8_t (*mv_penalty)[MAX_MV*2+1]= NULL;
83 static uint8_t fcode_tab[MAX_MV*2+1];
84 static uint8_t umv_fcode_tab[MAX_MV*2+1];
86 static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2];
87 static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2];
88 static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2];
89 static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2];
90 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
91 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
92 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
105 #if 0 //3IV1 is quite rare and tis slows things down a tiny bit
106 #define IS_3IV1 s->avctx->codec_tag == ff_get_fourcc("3IV1")
111 int h263_get_picture_format(int width, int height)
115 if (width == 128 && height == 96)
117 else if (width == 176 && height == 144)
119 else if (width == 352 && height == 288)
121 else if (width == 704 && height == 576)
123 else if (width == 1408 && height == 1152)
130 #ifdef CONFIG_ENCODERS
132 static void float_aspect_to_info(MpegEncContext * s, float aspect){
135 aspect*= s->height/(double)s->width;
136 //printf("%f\n", aspect);
138 if(aspect==0) aspect= 1.0;
140 ff_float2fraction(&s->aspected_width, &s->aspected_height, aspect, 255);
142 //printf("%d %d\n", s->aspected_width, s->aspected_height);
144 if(s->aspected_width == pixel_aspect[i][0] && s->aspected_height== pixel_aspect[i][1]){
145 s->aspect_ratio_info=i;
150 s->aspect_ratio_info= FF_ASPECT_EXTENDED;
153 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
157 align_put_bits(&s->pb);
159 /* Update the pointer to last GOB */
160 s->ptr_lastgob = pbBufPtr(&s->pb);
163 put_bits(&s->pb, 22, 0x20); /* PSC */
164 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->frame_rate_base) /
165 s->avctx->frame_rate) & 0xff);
167 put_bits(&s->pb, 1, 1); /* marker */
168 put_bits(&s->pb, 1, 0); /* h263 id */
169 put_bits(&s->pb, 1, 0); /* split screen off */
170 put_bits(&s->pb, 1, 0); /* camera off */
171 put_bits(&s->pb, 1, 0); /* freeze picture release off */
173 format = h263_get_picture_format(s->width, s->height);
176 put_bits(&s->pb, 3, format);
177 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
178 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
179 of H.263v1 UMV implies to check the predicted MV after
180 calculation of the current MB to see if we're on the limits */
181 put_bits(&s->pb, 1, 0); /* unrestricted motion vector: off */
182 put_bits(&s->pb, 1, 0); /* SAC: off */
183 put_bits(&s->pb, 1, 0); /* advanced prediction mode: off */
184 put_bits(&s->pb, 1, 0); /* not PB frame */
185 put_bits(&s->pb, 5, s->qscale);
186 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
189 /* H.263 Plus PTYPE */
190 put_bits(&s->pb, 3, 7);
191 put_bits(&s->pb,3,1); /* Update Full Extended PTYPE */
193 put_bits(&s->pb,3,6); /* Custom Source Format */
195 put_bits(&s->pb, 3, format);
197 put_bits(&s->pb,1,0); /* Custom PCF: off */
198 s->umvplus = s->unrestricted_mv;
199 put_bits(&s->pb, 1, s->umvplus); /* Unrestricted Motion Vector */
200 put_bits(&s->pb,1,0); /* SAC: off */
201 put_bits(&s->pb,1,0); /* Advanced Prediction Mode: off */
202 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
203 put_bits(&s->pb,1,0); /* Deblocking Filter: off */
204 put_bits(&s->pb,1,0); /* Slice Structured: off */
205 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
206 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
207 put_bits(&s->pb,1,0); /* Alternative Inter VLC: off */
208 put_bits(&s->pb,1,0); /* Modified Quantization: off */
209 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
210 put_bits(&s->pb,3,0); /* Reserved */
212 put_bits(&s->pb, 3, s->pict_type == P_TYPE);
214 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
215 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
216 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
217 put_bits(&s->pb,2,0); /* Reserved */
218 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
220 /* This should be here if PLUSPTYPE */
221 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
224 /* Custom Picture Format (CPFMT) */
225 float_aspect_to_info(s, s->avctx->aspect_ratio);
227 put_bits(&s->pb,4,s->aspect_ratio_info);
228 put_bits(&s->pb,9,(s->width >> 2) - 1);
229 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
230 put_bits(&s->pb,9,(s->height >> 2));
231 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED)
233 put_bits(&s->pb, 8, s->aspected_width);
234 put_bits(&s->pb, 8, s->aspected_height);
238 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
240 // put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
241 put_bits(&s->pb,2,1); /* unlimited */
243 put_bits(&s->pb, 5, s->qscale);
246 put_bits(&s->pb, 1, 0); /* no PEI */
250 s->c_dc_scale_table= h263_aic_dc_scale_table;
253 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
258 * Encodes a group of blocks header.
260 int h263_encode_gob_header(MpegEncContext * s, int mb_line)
262 align_put_bits(&s->pb);
263 flush_put_bits(&s->pb);
264 /* Call the RTP callback to send the last GOB */
265 if (s->rtp_callback) {
266 int pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
267 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
269 put_bits(&s->pb, 17, 1); /* GBSC */
270 s->gob_number = mb_line / s->gob_index;
271 put_bits(&s->pb, 5, s->gob_number); /* GN */
272 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
273 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
274 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
278 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6])
280 int score0=0, score1=0;
282 int8_t * const qscale_table= s->current_picture.qscale_table;
285 int16_t *ac_val, *ac_val1;
287 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
290 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
292 ac_val-= s->block_wrap[n]*16;
293 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
296 const int level= block[n][s->dsp.idct_permutation[i ]];
298 score1+= ABS(level - ac_val[i+8]);
299 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
303 /* different qscale, we must rescale */
305 const int level= block[n][s->dsp.idct_permutation[i ]];
307 score1+= ABS(level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale));
308 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
313 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
314 /* left prediction */
316 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
319 const int level= block[n][s->dsp.idct_permutation[i<<3]];
321 score1+= ABS(level - ac_val[i]);
323 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
326 /* different qscale, we must rescale */
328 const int level= block[n][s->dsp.idct_permutation[i<<3]];
330 score1+= ABS(level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale));
332 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
338 return score0 > score1 ? 1 : 0;
342 * modify qscale so that encoding is acually possible in h263 (limit difference to -2..2)
344 void ff_clean_h263_qscales(MpegEncContext *s){
346 int8_t * const qscale_table= s->current_picture.qscale_table;
348 for(i=1; i<s->mb_num; i++){
349 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i-1] ] >2)
350 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i-1] ]+2;
352 for(i=s->mb_num-2; i>=0; i--){
353 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i+1] ] >2)
354 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i+1] ]+2;
359 * modify mb_type & qscale so that encoding is acually possible in mpeg4
361 void ff_clean_mpeg4_qscales(MpegEncContext *s){
363 int8_t * const qscale_table= s->current_picture.qscale_table;
365 ff_clean_h263_qscales(s);
367 for(i=1; i<s->mb_num; i++){
368 int mb_xy= s->mb_index2xy[i];
370 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&MB_TYPE_INTER4V)){
371 s->mb_type[mb_xy]&= ~MB_TYPE_INTER4V;
372 s->mb_type[mb_xy]|= MB_TYPE_INTER;
376 if(s->pict_type== B_TYPE){
378 /* ok, come on, this isnt funny anymore, theres more code for handling this mpeg4 mess than
379 for the actual adaptive quantization */
381 for(i=0; i<s->mb_num; i++){
382 int mb_xy= s->mb_index2xy[i];
383 odd += qscale_table[mb_xy]&1;
386 if(2*odd > s->mb_num) odd=1;
389 for(i=0; i<s->mb_num; i++){
390 int mb_xy= s->mb_index2xy[i];
391 if((qscale_table[mb_xy]&1) != odd)
392 qscale_table[mb_xy]++;
393 if(qscale_table[mb_xy] > 31)
394 qscale_table[mb_xy]= 31;
397 for(i=1; i<s->mb_num; i++){
398 int mb_xy= s->mb_index2xy[i];
399 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&MB_TYPE_DIRECT)){
400 s->mb_type[mb_xy]&= ~MB_TYPE_DIRECT;
401 s->mb_type[mb_xy]|= MB_TYPE_BIDIR;
407 #endif //CONFIG_ENCODERS
410 * @return the mb_type
412 int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){
413 const int mb_index= s->mb_x + s->mb_y*s->mb_stride;
414 const int colocated_mb_type= s->next_picture.mb_type[mb_index]; //FIXME or next?
415 int xy= s->block_index[0];
416 uint16_t time_pp= s->pp_time;
417 uint16_t time_pb= s->pb_time;
420 //FIXME avoid divides
422 if(IS_8X8(colocated_mb_type)){
423 s->mv_type = MV_TYPE_8X8;
425 xy= s->block_index[i];
426 s->mv[0][i][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
427 s->mv[0][i][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
428 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->motion_val[xy][0]
429 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
430 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->motion_val[xy][1]
431 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
433 return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_L0L1;
434 } else if(IS_INTERLACED(colocated_mb_type)){
435 s->mv_type = MV_TYPE_FIELD;
437 if(s->top_field_first){
438 time_pp= s->pp_field_time - s->field_select_table[mb_index][i] + i;
439 time_pb= s->pb_field_time - s->field_select_table[mb_index][i] + i;
441 time_pp= s->pp_field_time + s->field_select_table[mb_index][i] - i;
442 time_pb= s->pb_field_time + s->field_select_table[mb_index][i] - i;
444 s->mv[0][i][0] = s->field_mv_table[mb_index][i][0]*time_pb/time_pp + mx;
445 s->mv[0][i][1] = s->field_mv_table[mb_index][i][1]*time_pb/time_pp + my;
446 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->field_mv_table[mb_index][i][0]
447 : s->field_mv_table[mb_index][i][0]*(time_pb - time_pp)/time_pp;
448 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->field_mv_table[mb_index][i][1]
449 : s->field_mv_table[mb_index][i][1]*(time_pb - time_pp)/time_pp;
451 return MB_TYPE_DIRECT2 | MB_TYPE_16x8 | MB_TYPE_L0L1 | MB_TYPE_INTERLACED;
453 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;
454 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;
455 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]
456 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
457 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]
458 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
459 if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample)
460 s->mv_type= MV_TYPE_16X16;
462 s->mv_type= MV_TYPE_8X8;
463 return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_L0L1; //Note see prev line
467 #ifdef CONFIG_ENCODERS
468 void mpeg4_encode_mb(MpegEncContext * s,
469 DCTELEM block[6][64],
470 int motion_x, int motion_y)
472 int cbpc, cbpy, pred_x, pred_y;
474 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
475 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=B_TYPE ? &s->tex_pb : &s->pb;
476 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=I_TYPE ? &s->pb2 : &s->pb;
477 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
478 const int dquant_code[5]= {1,0,9,2,3};
480 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
484 for (i = 0; i < 6; i++) {
485 if (s->block_last_index[i] >= 0)
489 if(s->pict_type==B_TYPE){
490 static const int mb_type_table[8]= {-1, 2, 3, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
491 int mb_type= mb_type_table[s->mv_dir];
497 s->last_mv[1][0][1]= 0;
500 assert(s->dquant>=-2 && s->dquant<=2);
501 assert((s->dquant&1)==0);
504 /* nothing to do if this MB was skiped in the next P Frame */
505 if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){ //FIXME avoid DCT & ...
511 s->mv_dir= MV_DIR_FORWARD; //doesnt matter
512 s->qscale -= s->dquant;
518 if ((cbp | motion_x | motion_y | mb_type) ==0) {
519 /* direct MB with MV={0,0} */
520 assert(s->dquant==0);
522 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
524 if(interleaved_stats){
532 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
533 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
534 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we dont need it :)
535 if(cbp) put_bits(&s->pb, 6, cbp);
539 put_bits(&s->pb, 2, (s->dquant>>2)+3);
541 put_bits(&s->pb, 1, 0);
543 s->qscale -= s->dquant;
545 if(!s->progressive_sequence){
547 put_bits(&s->pb, 1, s->interlaced_dct);
548 if(mb_type) // not diect mode
549 put_bits(&s->pb, 1, 0); // no interlaced ME yet
552 if(interleaved_stats){
553 s->misc_bits+= get_bits_diff(s);
559 h263_encode_motion(s, motion_x, 1);
560 h263_encode_motion(s, motion_y, 1);
565 h263_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code);
566 h263_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
567 h263_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code);
568 h263_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
569 s->last_mv[0][0][0]= s->mv[0][0][0];
570 s->last_mv[0][0][1]= s->mv[0][0][1];
571 s->last_mv[1][0][0]= s->mv[1][0][0];
572 s->last_mv[1][0][1]= s->mv[1][0][1];
576 case 2: /* backward */
577 h263_encode_motion(s, motion_x - s->last_mv[1][0][0], s->b_code);
578 h263_encode_motion(s, motion_y - s->last_mv[1][0][1], s->b_code);
579 s->last_mv[1][0][0]= motion_x;
580 s->last_mv[1][0][1]= motion_y;
583 case 3: /* forward */
584 h263_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);
585 h263_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);
586 s->last_mv[0][0][0]= motion_x;
587 s->last_mv[0][0][1]= motion_y;
591 printf("unknown mb type\n");
595 if(interleaved_stats){
596 s->mv_bits+= get_bits_diff(s);
599 /* encode each block */
600 for (i = 0; i < 6; i++) {
601 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, NULL, &s->pb);
604 if(interleaved_stats){
605 s->p_tex_bits+= get_bits_diff(s);
607 }else{ /* s->pict_type==B_TYPE */
608 if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
609 /* check if the B frames can skip it too, as we must skip it if we skip here
610 why didnt they just compress the skip-mb bits instead of reusing them ?! */
611 if(s->max_b_frames>0){
618 if(x+16 > s->width) x= s->width-16;
619 if(y+16 > s->height) y= s->height-16;
621 offset= x + y*s->linesize;
622 p_pic= s->new_picture.data[0] + offset;
625 for(i=0; i<s->max_b_frames; i++){
628 Picture *pic= s->reordered_input_picture[i+1];
630 if(pic==NULL || pic->pict_type!=B_TYPE) break;
632 b_pic= pic->data[0] + offset + 16; //FIXME +16
633 diff= s->dsp.pix_abs16x16(p_pic, b_pic, s->linesize);
634 if(diff>s->qscale*70){ //FIXME check that 70 is optimal
643 /* skip macroblock */
644 put_bits(&s->pb, 1, 1);
646 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 s->misc_bits+= get_bits_diff(s);
680 /* motion vectors: 16x16 mode */
681 h263_pred_motion(s, 0, &pred_x, &pred_y);
683 h263_encode_motion(s, motion_x - pred_x, s->f_code);
684 h263_encode_motion(s, motion_y - pred_y, s->f_code);
688 inter_MCBPC_bits[cbpc],
689 inter_MCBPC_code[cbpc]);
692 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
694 if(!s->progressive_sequence){
696 put_bits(pb2, 1, s->interlaced_dct);
699 if(interleaved_stats){
700 s->misc_bits+= get_bits_diff(s);
704 /* motion vectors: 8x8 mode*/
705 h263_pred_motion(s, i, &pred_x, &pred_y);
707 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][0] - pred_x, s->f_code);
708 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][1] - pred_y, s->f_code);
712 if(interleaved_stats){
713 s->mv_bits+= get_bits_diff(s);
716 /* encode each block */
717 for (i = 0; i < 6; i++) {
718 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, NULL, tex_pb);
721 if(interleaved_stats){
722 s->p_tex_bits+= get_bits_diff(s);
728 int dc_diff[6]; //dc values with the dc prediction subtracted
729 int dir[6]; //prediction direction
730 int zigzag_last_index[6];
731 uint8_t *scan_table[6];
735 const int level= block[i][0];
738 dc_diff[i]= level - ff_mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]);
740 *dc_ptr = level * s->y_dc_scale;
742 *dc_ptr = level * s->c_dc_scale;
746 s->ac_pred= decide_ac_pred(s, block, dir);
753 mpeg4_inv_pred_ac(s, block[i], i, dir[i]);
754 if (dir[i]==0) st = s->intra_v_scantable.permutated; /* left */
755 else st = s->intra_h_scantable.permutated; /* top */
757 for(last_index=63; last_index>=0; last_index--) //FIXME optimize
758 if(block[i][st[last_index]]) break;
759 zigzag_last_index[i]= s->block_last_index[i];
760 s->block_last_index[i]= last_index;
765 scan_table[i]= s->intra_scantable.permutated;
770 for (i = 0; i < 6; i++) {
771 if (s->block_last_index[i] >= 1)
776 if (s->pict_type == I_TYPE) {
777 if(s->dquant) cbpc+=4;
779 intra_MCBPC_bits[cbpc],
780 intra_MCBPC_code[cbpc]);
782 if(s->dquant) cbpc+=8;
783 put_bits(&s->pb, 1, 0); /* mb coded */
785 inter_MCBPC_bits[cbpc + 4],
786 inter_MCBPC_code[cbpc + 4]);
788 put_bits(pb2, 1, s->ac_pred);
790 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
792 put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
794 if(!s->progressive_sequence){
795 put_bits(dc_pb, 1, s->interlaced_dct);
798 if(interleaved_stats){
799 s->misc_bits+= get_bits_diff(s);
802 /* encode each block */
803 for (i = 0; i < 6; i++) {
804 mpeg4_encode_block(s, block[i], i, dc_diff[i], scan_table[i], dc_pb, tex_pb);
807 if(interleaved_stats){
808 s->i_tex_bits+= get_bits_diff(s);
812 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
818 ac_val = s->ac_val[0][0] + s->block_index[i] * 16;
822 block[i][s->dsp.idct_permutation[j ]]= ac_val[j+8];
825 block[i][s->dsp.idct_permutation[j<<3]]= ac_val[j ];
827 s->block_last_index[i]= zigzag_last_index[i];
833 void h263_encode_mb(MpegEncContext * s,
834 DCTELEM block[6][64],
835 int motion_x, int motion_y)
837 int cbpc, cbpy, i, cbp, pred_x, pred_y;
839 int16_t rec_intradc[6];
841 const int dquant_code[5]= {1,0,9,2,3};
843 //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
847 for (i = 0; i < 6; i++) {
848 if (s->block_last_index[i] >= 0)
851 if ((cbp | motion_x | motion_y | s->dquant) == 0) {
852 /* skip macroblock */
853 put_bits(&s->pb, 1, 1);
856 put_bits(&s->pb, 1, 0); /* mb coded */
858 if(s->dquant) cbpc+= 8;
860 inter_MCBPC_bits[cbpc],
861 inter_MCBPC_code[cbpc]);
864 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
866 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
868 /* motion vectors: 16x16 mode only now */
869 h263_pred_motion(s, 0, &pred_x, &pred_y);
872 h263_encode_motion(s, motion_x - pred_x, s->f_code);
873 h263_encode_motion(s, motion_y - pred_y, s->f_code);
876 h263p_encode_umotion(s, motion_x - pred_x);
877 h263p_encode_umotion(s, motion_y - pred_y);
878 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
879 /* To prevent Start Code emulation */
880 put_bits(&s->pb,1,1);
883 int li = s->h263_aic ? 0 : 1;
888 if (s->h263_aic && s->mb_intra) {
889 int16_t level = block[i][0];
891 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
895 level = (level + (s->qscale >> 1))/(s->y_dc_scale);
897 level = (level - (s->qscale >> 1))/(s->y_dc_scale);
899 /* AIC can change CBP */
900 if (level == 0 && s->block_last_index[i] == 0)
901 s->block_last_index[i] = -1;
902 else if (level < -127)
904 else if (level > 127)
909 rec_intradc[i] = (s->y_dc_scale*level) + pred_dc;
912 //if ((rec_intradc[i] % 2) == 0)
915 if (rec_intradc[i] < 0)
917 else if (rec_intradc[i] > 2047)
918 rec_intradc[i] = 2047;
920 /* Update AC/DC tables */
921 *dc_ptr[i] = rec_intradc[i];
924 if (s->block_last_index[i] >= li)
929 if (s->pict_type == I_TYPE) {
930 if(s->dquant) cbpc+=4;
932 intra_MCBPC_bits[cbpc],
933 intra_MCBPC_code[cbpc]);
935 if(s->dquant) cbpc+=8;
936 put_bits(&s->pb, 1, 0); /* mb coded */
938 inter_MCBPC_bits[cbpc + 4],
939 inter_MCBPC_code[cbpc + 4]);
942 /* XXX: currently, we do not try to use ac prediction */
943 put_bits(&s->pb, 1, 0); /* no AC prediction */
946 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
948 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
952 /* encode each block */
953 h263_encode_block(s, block[i], i);
955 /* Update INTRADC for decoding */
956 if (s->h263_aic && s->mb_intra) {
957 block[i][0] = rec_intradc[i];
964 static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr)
966 int x, y, wrap, a, c, pred_dc, scale;
967 int16_t *dc_val, *ac_val;
969 /* find prediction */
971 x = 2 * s->mb_x + 1 + (n & 1);
972 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
973 wrap = s->mb_width * 2 + 2;
974 dc_val = s->dc_val[0];
975 ac_val = s->ac_val[0][0];
976 scale = s->y_dc_scale;
980 wrap = s->mb_width + 2;
981 dc_val = s->dc_val[n - 4 + 1];
982 ac_val = s->ac_val[n - 4 + 1][0];
983 scale = s->c_dc_scale;
988 a = dc_val[(x - 1) + (y) * wrap];
989 c = dc_val[(x) + (y - 1) * wrap];
991 /* No prediction outside GOB boundary */
992 if (s->first_slice_line && ((n < 2) || (n > 3)))
995 /* just DC prediction */
996 if (a != 1024 && c != 1024)
997 pred_dc = (a + c) >> 1;
1003 /* we assume pred is positive */
1004 //pred_dc = (pred_dc + (scale >> 1)) / scale;
1005 *dc_val_ptr = &dc_val[x + y * wrap];
1009 static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n)
1011 int x, y, wrap, a, c, pred_dc, scale, i;
1012 int16_t *dc_val, *ac_val, *ac_val1;
1014 /* find prediction */
1016 x = 2 * s->mb_x + 1 + (n & 1);
1017 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
1018 wrap = s->mb_width * 2 + 2;
1019 dc_val = s->dc_val[0];
1020 ac_val = s->ac_val[0][0];
1021 scale = s->y_dc_scale;
1025 wrap = s->mb_width + 2;
1026 dc_val = s->dc_val[n - 4 + 1];
1027 ac_val = s->ac_val[n - 4 + 1][0];
1028 scale = s->c_dc_scale;
1031 ac_val += ((y) * wrap + (x)) * 16;
1037 a = dc_val[(x - 1) + (y) * wrap];
1038 c = dc_val[(x) + (y - 1) * wrap];
1040 /* No prediction outside GOB boundary */
1041 if (s->first_slice_line && ((n < 2) || (n > 3)))
1045 if (s->h263_aic_dir) {
1046 /* left prediction */
1050 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
1055 /* top prediction */
1057 ac_val -= 16 * wrap;
1059 block[s->dsp.idct_permutation[i ]] += ac_val[i + 8];
1065 /* just DC prediction */
1066 if (a != 1024 && c != 1024)
1067 pred_dc = (a + c) >> 1;
1074 /* we assume pred is positive */
1075 block[0]=block[0]*scale + pred_dc;
1079 else if (!(block[0] & 1))
1082 /* Update AC/DC tables */
1083 dc_val[(x) + (y) * wrap] = block[0];
1087 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
1090 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
1093 int16_t *h263_pred_motion(MpegEncContext * s, int block,
1097 int16_t *A, *B, *C, *mot_val;
1098 static const int off[4]= {2, 1, 1, -1};
1100 wrap = s->block_wrap[0];
1101 xy = s->block_index[block];
1103 mot_val = s->motion_val[xy];
1105 A = s->motion_val[xy - 1];
1106 /* special case for first (slice) line */
1107 if (s->first_slice_line && block<3) {
1108 // we cant just change some MVs to simulate that as we need them for the B frames (and ME)
1109 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
1110 if(block==0){ //most common case
1111 if(s->mb_x == s->resync_mb_x){ //rare
1113 }else if(s->mb_x + 1 == s->resync_mb_x){ //rare
1114 C = s->motion_val[xy + off[block] - wrap];
1119 *px = mid_pred(A[0], 0, C[0]);
1120 *py = mid_pred(A[1], 0, C[1]);
1127 if(s->mb_x + 1 == s->resync_mb_x){ //rare
1128 C = s->motion_val[xy + off[block] - wrap];
1129 *px = mid_pred(A[0], 0, C[0]);
1130 *py = mid_pred(A[1], 0, C[1]);
1135 }else{ /* block==2*/
1136 B = s->motion_val[xy - wrap];
1137 C = s->motion_val[xy + off[block] - wrap];
1138 if(s->mb_x == s->resync_mb_x) //rare
1141 *px = mid_pred(A[0], B[0], C[0]);
1142 *py = mid_pred(A[1], B[1], C[1]);
1145 B = s->motion_val[xy - wrap];
1146 C = s->motion_val[xy + off[block] - wrap];
1147 *px = mid_pred(A[0], B[0], C[0]);
1148 *py = mid_pred(A[1], B[1], C[1]);
1153 #ifdef CONFIG_ENCODERS
1154 static void h263_encode_motion(MpegEncContext * s, int val, int f_code)
1156 int range, l, bit_size, sign, code, bits;
1161 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1163 bit_size = f_code - 1;
1164 range = 1 << bit_size;
1165 /* modulo encoding */
1172 val= (val^sign)-sign;
1177 } else if (val >= l) {
1181 assert(val>=-l && val<l);
1191 code = (val >> bit_size) + 1;
1192 bits = val & (range - 1);
1194 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1196 put_bits(&s->pb, bit_size, bits);
1202 /* Encode MV differences on H.263+ with Unrestricted MV mode */
1203 static void h263p_encode_umotion(MpegEncContext * s, int val)
1213 put_bits(&s->pb, 1, 1);
1215 put_bits(&s->pb, 3, 0);
1217 put_bits(&s->pb, 3, 2);
1220 sval = ((val < 0) ? (short)(-val):(short)val);
1223 while (temp_val != 0) {
1224 temp_val = temp_val >> 1;
1230 tcode = (sval & (1 << (i-1))) >> (i-1);
1231 tcode = (tcode << 1) | 1;
1232 code = (code << 2) | tcode;
1235 code = ((code << 1) | (val < 0)) << 1;
1236 put_bits(&s->pb, (2*n_bits)+1, code);
1237 //printf("\nVal = %d\tCode = %d", sval, code);
1241 static void init_mv_penalty_and_fcode(MpegEncContext *s)
1246 if(mv_penalty==NULL)
1247 mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
1249 for(f_code=1; f_code<=MAX_FCODE; f_code++){
1250 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
1253 if(mv==0) len= mvtab[0][1];
1255 int val, bit_size, range, code;
1257 bit_size = s->f_code - 1;
1258 range = 1 << bit_size;
1264 code = (val >> bit_size) + 1;
1266 len= mvtab[code][1] + 1 + bit_size;
1268 len= mvtab[32][1] + 2 + bit_size;
1272 mv_penalty[f_code][mv+MAX_MV]= len;
1276 for(f_code=MAX_FCODE; f_code>0; f_code--){
1277 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
1278 fcode_tab[mv+MAX_MV]= f_code;
1282 for(mv=0; mv<MAX_MV*2+1; mv++){
1283 umv_fcode_tab[mv]= 1;
1288 #ifdef CONFIG_ENCODERS
1290 static void init_uni_dc_tab(void)
1292 int level, uni_code, uni_len;
1294 for(level=-256; level<256; level++){
1296 /* find number of bits */
1305 l= (-level) ^ ((1 << size) - 1);
1310 uni_code= DCtab_lum[size][0];
1311 uni_len = DCtab_lum[size][1];
1314 uni_code<<=size; uni_code|=l;
1317 uni_code<<=1; uni_code|=1;
1321 uni_DCtab_lum_bits[level+256]= uni_code;
1322 uni_DCtab_lum_len [level+256]= uni_len;
1325 uni_code= DCtab_chrom[size][0];
1326 uni_len = DCtab_chrom[size][1];
1329 uni_code<<=size; uni_code|=l;
1332 uni_code<<=1; uni_code|=1;
1336 uni_DCtab_chrom_bits[level+256]= uni_code;
1337 uni_DCtab_chrom_len [level+256]= uni_len;
1342 #endif //CONFIG_ENCODERS
1344 #ifdef CONFIG_ENCODERS
1345 static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1346 int slevel, run, last;
1348 assert(MAX_LEVEL >= 64);
1349 assert(MAX_RUN >= 63);
1351 for(slevel=-64; slevel<64; slevel++){
1352 if(slevel==0) continue;
1353 for(run=0; run<64; run++){
1354 for(last=0; last<=1; last++){
1355 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1356 int level= slevel < 0 ? -slevel : slevel;
1357 int sign= slevel < 0 ? 1 : 0;
1358 int bits, len, code;
1361 len_tab[index]= 100;
1364 code= get_rl_index(rl, last, run, level);
1365 bits= rl->table_vlc[code][0];
1366 len= rl->table_vlc[code][1];
1367 bits=bits*2+sign; len++;
1369 if(code!=rl->n && len < len_tab[index]){
1370 bits_tab[index]= bits;
1371 len_tab [index]= len;
1375 bits= rl->table_vlc[rl->n][0];
1376 len= rl->table_vlc[rl->n][1];
1377 bits=bits*2; len++; //esc1
1378 level1= level - rl->max_level[last][run];
1380 code= get_rl_index(rl, last, run, level1);
1381 bits<<= rl->table_vlc[code][1];
1382 len += rl->table_vlc[code][1];
1383 bits += rl->table_vlc[code][0];
1384 bits=bits*2+sign; len++;
1386 if(code!=rl->n && len < len_tab[index]){
1387 bits_tab[index]= bits;
1388 len_tab [index]= len;
1394 bits= rl->table_vlc[rl->n][0];
1395 len= rl->table_vlc[rl->n][1];
1396 bits=bits*4+2; len+=2; //esc2
1397 run1 = run - rl->max_run[last][level] - 1;
1399 code= get_rl_index(rl, last, run1, level);
1400 bits<<= rl->table_vlc[code][1];
1401 len += rl->table_vlc[code][1];
1402 bits += rl->table_vlc[code][0];
1403 bits=bits*2+sign; len++;
1405 if(code!=rl->n && len < len_tab[index]){
1406 bits_tab[index]= bits;
1407 len_tab [index]= len;
1412 bits= rl->table_vlc[rl->n][0];
1413 len = rl->table_vlc[rl->n][1];
1414 bits=bits*4+3; len+=2; //esc3
1415 bits=bits*2+last; len++;
1416 bits=bits*64+run; len+=6;
1417 bits=bits*2+1; len++; //marker
1418 bits=bits*4096+(slevel&0xfff); len+=12;
1419 bits=bits*2+1; len++; //marker
1421 if(len < len_tab[index]){
1422 bits_tab[index]= bits;
1423 len_tab [index]= len;
1430 void h263_encode_init(MpegEncContext *s)
1432 static int done = 0;
1441 init_rl(&rl_intra_aic);
1443 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
1444 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
1446 init_mv_penalty_and_fcode(s);
1448 s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
1450 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
1451 switch(s->codec_id){
1452 case CODEC_ID_MPEG4:
1453 s->fcode_tab= fcode_tab;
1454 s->min_qcoeff= -2048;
1455 s->max_qcoeff= 2047;
1456 s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len;
1457 s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64;
1458 s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len;
1459 s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64;
1460 s->luma_dc_vlc_length= uni_DCtab_lum_len;
1461 s->chroma_dc_vlc_length= uni_DCtab_chrom_len;
1462 s->ac_esc_length= 7+2+1+6+1+12+1;
1464 case CODEC_ID_H263P:
1465 s->fcode_tab= umv_fcode_tab;
1466 s->min_qcoeff= -127;
1469 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
1470 default: //nothing needed default table allready set in mpegvideo.c
1471 s->min_qcoeff= -127;
1473 s->y_dc_scale_table=
1474 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
1479 * encodes a 8x8 block.
1480 * @param block the 8x8 block
1481 * @param n block index (0-3 are luma, 4-5 are chroma)
1483 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
1485 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
1489 if (s->mb_intra && !s->h263_aic) {
1492 /* 255 cannot be represented, so we clamp */
1497 /* 0 cannot be represented also */
1498 else if (level < 1) {
1502 if (level == 128) //FIXME check rv10
1503 put_bits(&s->pb, 8, 0xff);
1505 put_bits(&s->pb, 8, level & 0xff);
1509 if (s->h263_aic && s->mb_intra)
1514 last_index = s->block_last_index[n];
1515 last_non_zero = i - 1;
1516 for (; i <= last_index; i++) {
1517 j = s->intra_scantable.permutated[i];
1520 run = i - last_non_zero - 1;
1521 last = (i == last_index);
1528 code = get_rl_index(rl, last, run, level);
1529 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1530 if (code == rl->n) {
1531 put_bits(&s->pb, 1, last);
1532 put_bits(&s->pb, 6, run);
1534 assert(slevel != 0);
1536 if(slevel < 128 && slevel > -128)
1537 put_bits(&s->pb, 8, slevel & 0xff);
1539 put_bits(&s->pb, 8, 128);
1540 put_bits(&s->pb, 5, slevel & 0x1f);
1541 put_bits(&s->pb, 6, (slevel>>5)&0x3f);
1544 put_bits(&s->pb, 1, sign);
1552 #ifdef CONFIG_ENCODERS
1554 /***************************************************/
1556 * add mpeg4 stuffing bits (01...1)
1558 void ff_mpeg4_stuffing(PutBitContext * pbc)
1561 put_bits(pbc, 1, 0);
1562 length= (-get_bit_count(pbc))&7;
1563 if(length) put_bits(pbc, length, (1<<length)-1);
1566 /* must be called before writing the header */
1567 void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){
1568 int time_div, time_mod;
1570 if(s->pict_type==I_TYPE){ //we will encode a vol header
1572 av_reduce(&s->time_increment_resolution, &dummy, s->avctx->frame_rate, s->avctx->frame_rate_base, (1<<16)-1);
1574 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
1577 if(s->current_picture.pts)
1578 s->time= (s->current_picture.pts*s->time_increment_resolution + 500*1000)/(1000*1000);
1580 s->time= av_rescale(picture_number*(int64_t)s->avctx->frame_rate_base, s->time_increment_resolution, s->avctx->frame_rate);
1581 time_div= s->time/s->time_increment_resolution;
1582 time_mod= s->time%s->time_increment_resolution;
1584 if(s->pict_type==B_TYPE){
1585 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
1587 s->last_time_base= s->time_base;
1588 s->time_base= time_div;
1589 s->pp_time= s->time - s->last_non_b_time;
1590 s->last_non_b_time= s->time;
1594 static void mpeg4_encode_gop_header(MpegEncContext * s){
1595 int hours, minutes, seconds;
1597 put_bits(&s->pb, 16, 0);
1598 put_bits(&s->pb, 16, GOP_STARTCODE);
1600 seconds= s->time/s->time_increment_resolution;
1601 minutes= seconds/60; seconds %= 60;
1602 hours= minutes/60; minutes %= 60;
1605 put_bits(&s->pb, 5, hours);
1606 put_bits(&s->pb, 6, minutes);
1607 put_bits(&s->pb, 1, 1);
1608 put_bits(&s->pb, 6, seconds);
1610 put_bits(&s->pb, 1, 0); //closed gov == NO
1611 put_bits(&s->pb, 1, 0); //broken link == NO
1613 ff_mpeg4_stuffing(&s->pb);
1616 static void mpeg4_encode_visual_object_header(MpegEncContext * s){
1617 int profile_and_level_indication;
1620 if(s->max_b_frames || s->quarter_sample){
1621 profile_and_level_indication= 0xF1; // adv simple level 1
1624 profile_and_level_indication= 0x01; // simple level 1
1629 put_bits(&s->pb, 16, 0);
1630 put_bits(&s->pb, 16, VOS_STARTCODE);
1632 put_bits(&s->pb, 8, profile_and_level_indication);
1634 put_bits(&s->pb, 16, 0);
1635 put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);
1637 put_bits(&s->pb, 1, 1);
1638 put_bits(&s->pb, 4, vo_ver_id);
1639 put_bits(&s->pb, 3, 1); //priority
1641 put_bits(&s->pb, 4, 1); //visual obj type== video obj
1643 put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME
1645 ff_mpeg4_stuffing(&s->pb);
1648 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number)
1652 if(s->max_b_frames || s->quarter_sample){
1654 s->vo_type= ADV_SIMPLE_VO_TYPE;
1657 s->vo_type= SIMPLE_VO_TYPE;
1660 put_bits(&s->pb, 16, 0);
1661 put_bits(&s->pb, 16, 0x100 + vo_number); /* video obj */
1662 put_bits(&s->pb, 16, 0);
1663 put_bits(&s->pb, 16, 0x120 + vol_number); /* video obj layer */
1665 put_bits(&s->pb, 1, 0); /* random access vol */
1666 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
1667 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
1668 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
1669 put_bits(&s->pb, 3, 1); /* is obj layer priority */
1671 float_aspect_to_info(s, s->avctx->aspect_ratio);
1673 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
1674 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED)
1676 put_bits(&s->pb, 8, s->aspected_width);
1677 put_bits(&s->pb, 8, s->aspected_height);
1681 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
1682 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
1683 put_bits(&s->pb, 1, s->low_delay);
1684 put_bits(&s->pb, 1, 0); /* vbv parameters= no */
1686 put_bits(&s->pb, 1, 0); /* vol control parameters= no */
1689 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
1690 put_bits(&s->pb, 1, 1); /* marker bit */
1692 put_bits(&s->pb, 16, s->time_increment_resolution);
1693 if (s->time_increment_bits < 1)
1694 s->time_increment_bits = 1;
1695 put_bits(&s->pb, 1, 1); /* marker bit */
1696 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
1697 put_bits(&s->pb, 1, 1); /* marker bit */
1698 put_bits(&s->pb, 13, s->width); /* vol width */
1699 put_bits(&s->pb, 1, 1); /* marker bit */
1700 put_bits(&s->pb, 13, s->height); /* vol height */
1701 put_bits(&s->pb, 1, 1); /* marker bit */
1702 put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
1703 put_bits(&s->pb, 1, 1); /* obmc disable */
1704 if (vo_ver_id == 1) {
1705 put_bits(&s->pb, 1, s->vol_sprite_usage=0); /* sprite enable */
1707 put_bits(&s->pb, 2, s->vol_sprite_usage=0); /* sprite enable */
1710 s->quant_precision=5;
1711 put_bits(&s->pb, 1, 0); /* not 8 bit == false */
1712 put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
1713 if(s->mpeg_quant) put_bits(&s->pb, 2, 0); /* no custom matrixes */
1716 put_bits(&s->pb, 1, s->quarter_sample);
1717 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
1718 s->resync_marker= s->rtp_mode;
1719 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
1720 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
1721 if(s->data_partitioning){
1722 put_bits(&s->pb, 1, 0); /* no rvlc */
1725 if (vo_ver_id != 1){
1726 put_bits(&s->pb, 1, 0); /* newpred */
1727 put_bits(&s->pb, 1, 0); /* reduced res vop */
1729 put_bits(&s->pb, 1, 0); /* scalability */
1731 ff_mpeg4_stuffing(&s->pb);
1734 if(!(s->flags & CODEC_FLAG_BITEXACT)){
1735 put_bits(&s->pb, 16, 0);
1736 put_bits(&s->pb, 16, 0x1B2); /* user_data */
1737 put_string(&s->pb, LIBAVCODEC_IDENT);
1738 ff_mpeg4_stuffing(&s->pb);
1742 /* write mpeg4 VOP header */
1743 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
1746 int time_div, time_mod;
1748 if(s->pict_type==I_TYPE){
1749 if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
1750 mpeg4_encode_visual_object_header(s);
1751 mpeg4_encode_vol_header(s, 0, 0);
1753 mpeg4_encode_gop_header(s);
1756 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
1758 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->frame_rate, FRAME_RATE_BASE);
1760 put_bits(&s->pb, 16, 0); /* vop header */
1761 put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */
1762 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
1764 time_div= s->time/s->time_increment_resolution;
1765 time_mod= s->time%s->time_increment_resolution;
1766 time_incr= time_div - s->last_time_base;
1768 put_bits(&s->pb, 1, 1);
1770 put_bits(&s->pb, 1, 0);
1772 put_bits(&s->pb, 1, 1); /* marker */
1773 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
1774 put_bits(&s->pb, 1, 1); /* marker */
1775 put_bits(&s->pb, 1, 1); /* vop coded */
1776 if ( s->pict_type == P_TYPE
1777 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
1778 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
1780 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
1781 if(!s->progressive_sequence){
1782 put_bits(&s->pb, 1, s->top_field_first);
1783 put_bits(&s->pb, 1, s->alternate_scan);
1785 //FIXME sprite stuff
1787 put_bits(&s->pb, 5, s->qscale);
1789 if (s->pict_type != I_TYPE)
1790 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
1791 if (s->pict_type == B_TYPE)
1792 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
1793 // printf("****frame %d\n", picture_number);
1795 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
1796 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
1797 s->h_edge_pos= s->width;
1798 s->v_edge_pos= s->height;
1801 #endif //CONFIG_ENCODERS
1804 * change qscale by given dquant and update qscale dependant variables.
1806 static void change_qscale(MpegEncContext * s, int dquant)
1808 s->qscale += dquant;
1812 else if (s->qscale > 31)
1815 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
1816 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
1821 * @param n block index (0-3 are luma, 4-5 are chroma)
1822 * @param dc_val_ptr a pointer to the dc_val entry for the current MB will be stored here
1823 * @param dir_ptr pointer to an integer where the prediction direction will be stored
1824 * @return the quantized predicted dc
1826 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr, int *dir_ptr)
1828 int a, b, c, wrap, pred, scale;
1831 /* find prediction */
1833 scale = s->y_dc_scale;
1835 scale = s->c_dc_scale;
1840 wrap= s->block_wrap[n];
1841 dc_val = s->dc_val[0] + s->block_index[n];
1847 b = dc_val[ - 1 - wrap];
1848 c = dc_val[ - wrap];
1850 /* outside slice handling (we cant do that by memset as we need the dc for error resilience) */
1851 if(s->first_slice_line && n!=3){
1853 if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
1855 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
1856 if(n==0 || n==4 || n==5)
1860 if (abs(a - b) < abs(b - c)) {
1862 *dir_ptr = 1; /* top */
1865 *dir_ptr = 0; /* left */
1867 /* we assume pred is positive */
1868 pred = FASTDIV((pred + (scale >> 1)), scale);
1870 /* prepare address for prediction update */
1871 *dc_val_ptr = &dc_val[0];
1878 * @param n block index (0-3 are luma, 4-5 are chroma)
1879 * @param dir the ac prediction direction
1881 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
1885 int16_t *ac_val, *ac_val1;
1886 int8_t * const qscale_table= s->current_picture.qscale_table;
1888 /* find prediction */
1889 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1893 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
1894 /* left prediction */
1897 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
1900 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
1903 /* different qscale, we must rescale */
1905 block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
1909 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
1910 /* top prediction */
1911 ac_val -= 16 * s->block_wrap[n];
1913 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
1916 block[s->dsp.idct_permutation[i]] += ac_val[i + 8];
1919 /* different qscale, we must rescale */
1921 block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
1928 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
1932 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
1936 #ifdef CONFIG_ENCODERS
1938 static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
1943 int8_t * const qscale_table= s->current_picture.qscale_table;
1945 /* find prediction */
1946 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1949 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
1950 /* left prediction */
1952 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
1955 block[s->dsp.idct_permutation[i<<3]] -= ac_val[i];
1958 /* different qscale, we must rescale */
1960 block[s->dsp.idct_permutation[i<<3]] -= ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
1964 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
1965 /* top prediction */
1966 ac_val -= 16 * s->block_wrap[n];
1967 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
1970 block[s->dsp.idct_permutation[i]] -= ac_val[i + 8];
1973 /* different qscale, we must rescale */
1975 block[s->dsp.idct_permutation[i]] -= ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
1982 * encodes the dc value.
1983 * @param n block index (0-3 are luma, 4-5 are chroma)
1985 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
1988 // if(level<-255 || level>255) printf("dc overflow\n");
1992 put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]);
1995 put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]);
1999 /* find number of bits */
2009 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
2012 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
2015 /* encode remaining bits */
2018 level = (-level) ^ ((1 << size) - 1);
2019 put_bits(&s->pb, size, level);
2021 put_bits(&s->pb, 1, 1);
2027 * encodes a 8x8 block
2028 * @param n block index (0-3 are luma, 4-5 are chroma)
2030 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2031 uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
2033 int i, last_non_zero;
2034 #if 0 //variables for the outcommented version
2035 int code, sign, last;
2040 const int last_index = s->block_last_index[n];
2042 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2043 /* mpeg4 based DC predictor */
2044 mpeg4_encode_dc(dc_pb, intra_dc, n);
2045 if(last_index<1) return;
2048 bits_tab= uni_mpeg4_intra_rl_bits;
2049 len_tab = uni_mpeg4_intra_rl_len;
2051 if(last_index<0) return;
2054 bits_tab= uni_mpeg4_inter_rl_bits;
2055 len_tab = uni_mpeg4_inter_rl_len;
2059 last_non_zero = i - 1;
2061 for (; i < last_index; i++) {
2062 int level = block[ scan_table[i] ];
2064 int run = i - last_non_zero - 1;
2066 if((level&(~127)) == 0){
2067 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2068 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2070 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);
2075 /*if(i<=last_index)*/{
2076 int level = block[ scan_table[i] ];
2077 int run = i - last_non_zero - 1;
2079 if((level&(~127)) == 0){
2080 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2081 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2083 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);
2087 for (; i <= last_index; i++) {
2088 const int slevel = block[ scan_table[i] ];
2091 int run = i - last_non_zero - 1;
2092 last = (i == last_index);
2099 code = get_rl_index(rl, last, run, level);
2100 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2101 if (code == rl->n) {
2103 level1 = level - rl->max_level[last][run];
2106 code = get_rl_index(rl, last, run, level1);
2107 if (code == rl->n) {
2109 put_bits(ac_pb, 1, 1);
2110 if (level > MAX_LEVEL)
2112 run1 = run - rl->max_run[last][level] - 1;
2115 code = get_rl_index(rl, last, run1, level);
2116 if (code == rl->n) {
2119 put_bits(ac_pb, 1, 1);
2120 put_bits(ac_pb, 1, last);
2121 put_bits(ac_pb, 6, run);
2122 put_bits(ac_pb, 1, 1);
2123 put_bits(ac_pb, 12, slevel & 0xfff);
2124 put_bits(ac_pb, 1, 1);
2127 put_bits(ac_pb, 1, 0);
2128 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2129 put_bits(ac_pb, 1, sign);
2133 put_bits(ac_pb, 1, 0);
2134 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2135 put_bits(ac_pb, 1, sign);
2138 put_bits(ac_pb, 1, sign);
2146 static inline int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2147 uint8_t *scan_table)
2149 int i, last_non_zero;
2152 const int last_index = s->block_last_index[n];
2155 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2156 /* mpeg4 based DC predictor */
2157 //mpeg4_encode_dc(dc_pb, intra_dc, n); //FIXME
2158 if(last_index<1) return len;
2161 len_tab = uni_mpeg4_intra_rl_len;
2163 if(last_index<0) return 0;
2166 len_tab = uni_mpeg4_inter_rl_len;
2170 last_non_zero = i - 1;
2171 for (; i < last_index; i++) {
2172 int level = block[ scan_table[i] ];
2174 int run = i - last_non_zero - 1;
2176 if((level&(~127)) == 0){
2177 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2178 len += len_tab[index];
2180 len += 7+2+1+6+1+12+1;
2185 /*if(i<=last_index)*/{
2186 int level = block[ scan_table[i] ];
2187 int run = i - last_non_zero - 1;
2189 if((level&(~127)) == 0){
2190 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2191 len += len_tab[index];
2193 len += 7+2+1+6+1+12+1;
2203 /***********************************************/
2206 static VLC intra_MCBPC_vlc;
2207 static VLC inter_MCBPC_vlc;
2208 static VLC cbpy_vlc;
2210 static VLC dc_lum, dc_chrom;
2211 static VLC sprite_trajectory;
2212 static VLC mb_type_b_vlc;
2214 void init_vlc_rl(RLTable *rl)
2218 init_vlc(&rl->vlc, 9, rl->n + 1,
2219 &rl->table_vlc[0][1], 4, 2,
2220 &rl->table_vlc[0][0], 4, 2);
2223 for(q=0; q<32; q++){
2232 rl->rl_vlc[q]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
2233 for(i=0; i<rl->vlc.table_size; i++){
2234 int code= rl->vlc.table[i][0];
2235 int len = rl->vlc.table[i][1];
2238 if(len==0){ // illegal code
2241 }else if(len<0){ //more bits needed
2245 if(code==rl->n){ //esc
2249 run= rl->table_run [code] + 1;
2250 level= rl->table_level[code] * qmul + qadd;
2251 if(code >= rl->last) run+=192;
2254 rl->rl_vlc[q][i].len= len;
2255 rl->rl_vlc[q][i].level= level;
2256 rl->rl_vlc[q][i].run= run;
2263 /* XXX: find a better solution to handle static init */
2264 void h263_decode_init_vlc(MpegEncContext *s)
2266 static int done = 0;
2271 init_vlc(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 8,
2272 intra_MCBPC_bits, 1, 1,
2273 intra_MCBPC_code, 1, 1);
2274 init_vlc(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 25,
2275 inter_MCBPC_bits, 1, 1,
2276 inter_MCBPC_code, 1, 1);
2277 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
2278 &cbpy_tab[0][1], 2, 1,
2279 &cbpy_tab[0][0], 2, 1);
2280 init_vlc(&mv_vlc, MV_VLC_BITS, 33,
2282 &mvtab[0][0], 2, 1);
2285 init_rl(&rvlc_rl_inter);
2286 init_rl(&rvlc_rl_intra);
2287 init_rl(&rl_intra_aic);
2288 init_vlc_rl(&rl_inter);
2289 init_vlc_rl(&rl_intra);
2290 init_vlc_rl(&rvlc_rl_inter);
2291 init_vlc_rl(&rvlc_rl_intra);
2292 init_vlc_rl(&rl_intra_aic);
2293 init_vlc(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
2294 &DCtab_lum[0][1], 2, 1,
2295 &DCtab_lum[0][0], 2, 1);
2296 init_vlc(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
2297 &DCtab_chrom[0][1], 2, 1,
2298 &DCtab_chrom[0][0], 2, 1);
2299 init_vlc(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
2300 &sprite_trajectory_tab[0][1], 4, 2,
2301 &sprite_trajectory_tab[0][0], 4, 2);
2302 init_vlc(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
2303 &mb_type_b_tab[0][1], 2, 1,
2304 &mb_type_b_tab[0][0], 2, 1);
2309 * Get the GOB height based on picture height.
2311 int ff_h263_get_gob_height(MpegEncContext *s){
2312 if (s->height <= 400)
2314 else if (s->height <= 800)
2321 * decodes the group of blocks header.
2322 * @return <0 if an error occured
2324 static int h263_decode_gob_header(MpegEncContext *s)
2326 unsigned int val, gfid;
2329 /* Check for GOB Start Code */
2330 val = show_bits(&s->gb, 16);
2334 /* We have a GBSC probably with GSTUFF */
2335 skip_bits(&s->gb, 16); /* Drop the zeros */
2336 left= s->gb.size_in_bits - get_bits_count(&s->gb);
2337 //MN: we must check the bits left or we might end in a infinite loop (or segfault)
2338 for(;left>13; left--){
2339 if(get_bits1(&s->gb)) break; /* Seek the '1' bit */
2345 fprintf(stderr,"\nGOB Start Code at MB %d\n", (s->mb_y * s->mb_width) + s->mb_x);
2347 s->gob_number = get_bits(&s->gb, 5); /* GN */
2348 gfid = get_bits(&s->gb, 2); /* GFID */
2349 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
2353 s->mb_y= s->gob_index* s->gob_number;
2355 fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", s->gob_number, gfid, s->qscale);
2360 static inline void memsetw(short *tab, int val, int n)
2367 #ifdef CONFIG_ENCODERS
2369 void ff_mpeg4_init_partitions(MpegEncContext *s)
2371 init_put_bits(&s->tex_pb, s->tex_pb_buffer, PB_BUFFER_SIZE, NULL, NULL);
2372 init_put_bits(&s->pb2 , s->pb2_buffer , PB_BUFFER_SIZE, NULL, NULL);
2375 void ff_mpeg4_merge_partitions(MpegEncContext *s)
2377 const int pb2_len = get_bit_count(&s->pb2 );
2378 const int tex_pb_len= get_bit_count(&s->tex_pb);
2379 const int bits= get_bit_count(&s->pb);
2381 if(s->pict_type==I_TYPE){
2382 put_bits(&s->pb, 19, DC_MARKER);
2383 s->misc_bits+=19 + pb2_len + bits - s->last_bits;
2384 s->i_tex_bits+= tex_pb_len;
2386 put_bits(&s->pb, 17, MOTION_MARKER);
2387 s->misc_bits+=17 + pb2_len;
2388 s->mv_bits+= bits - s->last_bits;
2389 s->p_tex_bits+= tex_pb_len;
2392 flush_put_bits(&s->pb2);
2393 flush_put_bits(&s->tex_pb);
2395 ff_copy_bits(&s->pb, s->pb2_buffer , pb2_len);
2396 ff_copy_bits(&s->pb, s->tex_pb_buffer, tex_pb_len);
2397 s->last_bits= get_bit_count(&s->pb);
2400 #endif //CONFIG_ENCODERS
2402 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
2403 switch(s->pict_type){
2408 return s->f_code+15;
2410 return FFMAX(FFMAX(s->f_code, s->b_code)+15, 17);
2416 #ifdef CONFIG_ENCODERS
2418 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
2420 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
2422 ff_mpeg4_stuffing(&s->pb);
2423 put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0);
2424 put_bits(&s->pb, 1, 1);
2426 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
2427 put_bits(&s->pb, s->quant_precision, s->qscale);
2428 put_bits(&s->pb, 1, 0); /* no HEC */
2431 #endif //CONFIG_ENCODERS
2434 * check if the next stuff is a resync marker or the end.
2437 static inline int mpeg4_is_resync(MpegEncContext *s){
2438 const int bits_count= get_bits_count(&s->gb);
2440 if(s->workaround_bugs&FF_BUG_NO_PADDING){
2444 if(bits_count + 8 >= s->gb.size_in_bits){
2445 int v= show_bits(&s->gb, 8);
2446 v|= 0x7F >> (7-(bits_count&7));
2451 if(show_bits(&s->gb, 16) == ff_mpeg4_resync_prefix[bits_count&7]){
2453 GetBitContext gb= s->gb;
2455 skip_bits(&s->gb, 1);
2456 align_get_bits(&s->gb);
2458 for(len=0; len<32; len++){
2459 if(get_bits1(&s->gb)) break;
2464 if(len>=ff_mpeg4_get_video_packet_prefix_length(s))
2472 * decodes the next video packet.
2473 * @return <0 if something went wrong
2475 static int mpeg4_decode_video_packet_header(MpegEncContext *s)
2477 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
2478 int header_extension=0, mb_num, len;
2480 /* is there enough space left for a video packet + header */
2481 if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1;
2483 for(len=0; len<32; len++){
2484 if(get_bits1(&s->gb)) break;
2487 if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
2488 printf("marker does not match f_code\n");
2492 if(s->shape != RECT_SHAPE){
2493 header_extension= get_bits1(&s->gb);
2494 //FIXME more stuff here
2497 mb_num= get_bits(&s->gb, mb_num_bits);
2498 if(mb_num>=s->mb_num){
2499 fprintf(stderr, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);
2502 if(s->pict_type == B_TYPE){
2503 while(s->next_picture.mbskip_table[ s->mb_index2xy[ mb_num ] ]) mb_num++;
2504 if(mb_num >= s->mb_num) return -1; // slice contains just skiped MBs which where allready decoded
2507 s->mb_x= mb_num % s->mb_width;
2508 s->mb_y= mb_num / s->mb_width;
2510 if(s->shape != BIN_ONLY_SHAPE){
2511 int qscale= get_bits(&s->gb, s->quant_precision);
2516 if(s->shape == RECT_SHAPE){
2517 header_extension= get_bits1(&s->gb);
2519 if(header_extension){
2523 while (get_bits1(&s->gb) != 0)
2526 check_marker(&s->gb, "before time_increment in video packed header");
2527 time_increment= get_bits(&s->gb, s->time_increment_bits);
2528 check_marker(&s->gb, "before vop_coding_type in video packed header");
2530 skip_bits(&s->gb, 2); /* vop coding type */
2531 //FIXME not rect stuff here
2533 if(s->shape != BIN_ONLY_SHAPE){
2534 skip_bits(&s->gb, 3); /* intra dc vlc threshold */
2535 //FIXME dont just ignore everything
2536 if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2537 mpeg4_decode_sprite_trajectory(s);
2538 fprintf(stderr, "untested\n");
2541 //FIXME reduced res stuff here
2543 if (s->pict_type != I_TYPE) {
2544 int f_code = get_bits(&s->gb, 3); /* fcode_for */
2546 printf("Error, video packet header damaged (f_code=0)\n");
2549 if (s->pict_type == B_TYPE) {
2550 int b_code = get_bits(&s->gb, 3);
2552 printf("Error, video packet header damaged (b_code=0)\n");
2557 //FIXME new-pred stuff
2559 //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));
2564 void ff_mpeg4_clean_buffers(MpegEncContext *s)
2566 int c_wrap, c_xy, l_wrap, l_xy;
2568 l_wrap= s->block_wrap[0];
2569 l_xy= s->mb_y*l_wrap*2 + s->mb_x*2;
2570 c_wrap= s->block_wrap[4];
2571 c_xy= s->mb_y*c_wrap + s->mb_x;
2575 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
2576 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
2577 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
2581 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t));
2582 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
2583 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
2586 // we cant clear the MVs as they might be needed by a b frame
2587 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t));
2588 // memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
2589 s->last_mv[0][0][0]=
2590 s->last_mv[0][0][1]=
2591 s->last_mv[1][0][0]=
2592 s->last_mv[1][0][1]= 0;
2596 * decodes the group of blocks / video packet header.
2597 * @return <0 if no resync found
2599 int ff_h263_resync(MpegEncContext *s){
2602 if(s->codec_id==CODEC_ID_MPEG4)
2605 align_get_bits(&s->gb);
2607 if(show_bits(&s->gb, 16)==0){
2608 if(s->codec_id==CODEC_ID_MPEG4)
2609 ret= mpeg4_decode_video_packet_header(s);
2611 ret= h263_decode_gob_header(s);
2615 //ok, its not where its supposed to be ...
2616 s->gb= s->last_resync_gb;
2617 align_get_bits(&s->gb);
2618 left= s->gb.size_in_bits - get_bits_count(&s->gb);
2620 for(;left>16+1+5+5; left-=8){
2621 if(show_bits(&s->gb, 16)==0){
2622 GetBitContext bak= s->gb;
2624 if(s->codec_id==CODEC_ID_MPEG4)
2625 ret= mpeg4_decode_video_packet_header(s);
2627 ret= h263_decode_gob_header(s);
2633 skip_bits(&s->gb, 8);
2640 * gets the average motion vector for a GMC MB.
2641 * @param n either 0 for the x component or 1 for y
2642 * @returns the average MV for a GMC MB
2644 static inline int get_amv(MpegEncContext *s, int n){
2645 int x, y, mb_v, sum, dx, dy, shift;
2646 int len = 1 << (s->f_code + 4);
2647 const int a= s->sprite_warping_accuracy;
2649 if(s->real_sprite_warping_points==1){
2650 if(s->divx_version==500 && s->divx_build==413)
2651 sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample));
2653 sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a);
2655 dx= s->sprite_delta[n][0];
2656 dy= s->sprite_delta[n][1];
2657 shift= s->sprite_shift[0];
2658 if(n) dy -= 1<<(shift + a + 1);
2659 else dx -= 1<<(shift + a + 1);
2660 mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16;
2663 for(y=0; y<16; y++){
2667 //XXX FIXME optimize
2668 for(x=0; x<16; x++){
2673 sum= RSHIFT(sum, a+8-s->quarter_sample);
2676 if (sum < -len) sum= -len;
2677 else if (sum >= len) sum= len-1;
2683 * decodes first partition.
2684 * @return number of MBs decoded or <0 if an error occured
2686 static int mpeg4_decode_partition_a(MpegEncContext *s){
2688 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
2690 /* decode first partition */
2692 s->first_slice_line=1;
2693 for(; s->mb_y<s->mb_height; s->mb_y++){
2694 ff_init_block_index(s);
2695 for(; s->mb_x<s->mb_width; s->mb_x++){
2696 const int xy= s->mb_x + s->mb_y*s->mb_stride;
2701 ff_update_block_index(s);
2702 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
2703 s->first_slice_line=0;
2705 if(s->pict_type==I_TYPE){
2708 if(show_bits_long(&s->gb, 19)==DC_MARKER){
2712 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
2715 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
2718 s->cbp_table[xy]= cbpc & 3;
2719 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
2723 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2725 s->current_picture.qscale_table[xy]= s->qscale;
2727 s->mbintra_table[xy]= 1;
2730 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
2732 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
2736 if(dc_pred_dir) dir|=1;
2738 s->pred_dir_table[xy]= dir;
2739 }else{ /* P/S_TYPE */
2740 int mx, my, pred_x, pred_y, bits;
2741 int16_t * const mot_val= s->motion_val[s->block_index[0]];
2742 const int stride= s->block_wrap[0]*2;
2744 bits= show_bits(&s->gb, 17);
2745 if(bits==MOTION_MARKER){
2751 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2752 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
2756 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
2759 mot_val[0 ]= mot_val[2 ]=
2760 mot_val[0+stride]= mot_val[2+stride]= mx;
2761 mot_val[1 ]= mot_val[3 ]=
2762 mot_val[1+stride]= mot_val[3+stride]= my;
2764 if(s->mbintra_table[xy])
2765 ff_clean_intra_table_entries(s);
2768 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
2770 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
2775 else if (cbpc == 20)
2776 fprintf(stderr, "Stuffing !");
2777 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
2779 s->mb_intra = ((cbpc & 4) != 0);
2782 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
2783 s->mbintra_table[xy]= 1;
2784 mot_val[0 ]= mot_val[2 ]=
2785 mot_val[0+stride]= mot_val[2+stride]= 0;
2786 mot_val[1 ]= mot_val[3 ]=
2787 mot_val[1+stride]= mot_val[3+stride]= 0;
2789 if(s->mbintra_table[xy])
2790 ff_clean_intra_table_entries(s);
2792 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
2793 s->mcsel= get_bits1(&s->gb);
2796 if ((cbpc & 16) == 0) {
2797 /* 16x16 motion prediction */
2799 h263_pred_motion(s, 0, &pred_x, &pred_y);
2801 mx = h263_decode_motion(s, pred_x, s->f_code);
2805 my = h263_decode_motion(s, pred_y, s->f_code);
2808 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
2812 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
2815 mot_val[0 ]= mot_val[2 ] =
2816 mot_val[0+stride]= mot_val[2+stride]= mx;
2817 mot_val[1 ]= mot_val[3 ]=
2818 mot_val[1+stride]= mot_val[3+stride]= my;
2821 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
2823 int16_t *mot_val= h263_pred_motion(s, i, &pred_x, &pred_y);
2824 mx = h263_decode_motion(s, pred_x, s->f_code);
2828 my = h263_decode_motion(s, pred_y, s->f_code);
2845 * decode second partition.
2846 * @return <0 if an error occured
2848 static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
2850 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
2852 s->mb_x= s->resync_mb_x;
2853 s->first_slice_line=1;
2854 for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
2855 ff_init_block_index(s);
2856 for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
2857 const int xy= s->mb_x + s->mb_y*s->mb_stride;
2860 ff_update_block_index(s);
2861 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
2862 s->first_slice_line=0;
2864 if(s->pict_type==I_TYPE){
2865 int ac_pred= get_bits1(&s->gb);
2866 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2868 fprintf(stderr, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2872 s->cbp_table[xy]|= cbpy<<2;
2873 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
2874 }else{ /* P || S_TYPE */
2875 if(IS_INTRA(s->current_picture.mb_type[xy])){
2877 int ac_pred = get_bits1(&s->gb);
2878 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2881 fprintf(stderr, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2885 if(s->cbp_table[xy] & 8) {
2886 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2888 s->current_picture.qscale_table[xy]= s->qscale;
2892 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
2894 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
2898 if(dc_pred_dir) dir|=1;
2900 s->cbp_table[xy]&= 3; //remove dquant
2901 s->cbp_table[xy]|= cbpy<<2;
2902 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
2903 s->pred_dir_table[xy]= dir;
2904 }else if(IS_SKIP(s->current_picture.mb_type[xy])){
2905 s->current_picture.qscale_table[xy]= s->qscale;
2906 s->cbp_table[xy]= 0;
2908 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2911 fprintf(stderr, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
2915 if(s->cbp_table[xy] & 8) {
2916 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2918 s->current_picture.qscale_table[xy]= s->qscale;
2920 s->cbp_table[xy]&= 3; //remove dquant
2921 s->cbp_table[xy]|= (cbpy^0xf)<<2;
2925 if(mb_num >= mb_count) return 0;
2932 * decodes the first & second partition
2933 * @return <0 if error (and sets error type in the error_status_table)
2935 int ff_mpeg4_decode_partitions(MpegEncContext *s)
2938 const int part_a_error= s->pict_type==I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR;
2939 const int part_a_end = s->pict_type==I_TYPE ? (DC_END |MV_END) : MV_END;
2941 mb_num= mpeg4_decode_partition_a(s);
2943 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
2947 if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
2948 fprintf(stderr, "slice below monitor ...\n");
2949 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
2953 s->mb_num_left= mb_num;
2955 if(s->pict_type==I_TYPE){
2956 if(get_bits_long(&s->gb, 19)!=DC_MARKER){
2957 fprintf(stderr, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
2961 if(get_bits(&s->gb, 17)!=MOTION_MARKER){
2962 fprintf(stderr, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
2966 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end);
2968 if( mpeg4_decode_partition_b(s, mb_num) < 0){
2969 if(s->pict_type==P_TYPE)
2970 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR);
2973 if(s->pict_type==P_TYPE)
2974 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END);
2981 * decode partition C of one MB.
2982 * @return <0 if an error occured
2984 static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64])
2987 const int xy= s->mb_x + s->mb_y*s->mb_stride;
2989 mb_type= s->current_picture.mb_type[xy];
2990 cbp = s->cbp_table[xy];
2992 if(s->current_picture.qscale_table[xy] != s->qscale){
2993 s->qscale= s->current_picture.qscale_table[xy];
2994 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
2995 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
2998 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
3001 s->mv[0][i][0] = s->motion_val[ s->block_index[i] ][0];
3002 s->mv[0][i][1] = s->motion_val[ s->block_index[i] ][1];
3004 s->mb_intra = IS_INTRA(mb_type);
3006 if (IS_SKIP(mb_type)) {
3009 s->block_last_index[i] = -1;
3010 s->mv_dir = MV_DIR_FORWARD;
3011 s->mv_type = MV_TYPE_16X16;
3012 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3019 }else if(s->mb_intra){
3020 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3021 }else if(!s->mb_intra){
3022 // s->mcsel= 0; //FIXME do we need to init that
3024 s->mv_dir = MV_DIR_FORWARD;
3025 if (IS_8X8(mb_type)) {
3026 s->mv_type = MV_TYPE_8X8;
3028 s->mv_type = MV_TYPE_16X16;
3031 } else { /* I-Frame */
3033 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3036 if (!IS_SKIP(mb_type)) {
3038 /* decode each block */
3039 for (i = 0; i < 6; i++) {
3040 if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){
3041 fprintf(stderr, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra);
3048 /* per-MB end of slice check */
3050 if(--s->mb_num_left <= 0){
3051 //printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb));
3052 if(mpeg4_is_resync(s))
3057 if(mpeg4_is_resync(s)){
3058 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
3059 if(s->cbp_table[xy+delta])
3066 int ff_h263_decode_mb(MpegEncContext *s,
3067 DCTELEM block[6][64])
3069 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
3071 static int8_t quant_tab[4] = { -1, -2, 1, 2 };
3072 const int xy= s->mb_x + s->mb_y * s->mb_stride;
3074 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
3075 if (get_bits1(&s->gb)) {
3079 s->block_last_index[i] = -1;
3080 s->mv_dir = MV_DIR_FORWARD;
3081 s->mv_type = MV_TYPE_16X16;
3082 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3083 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
3085 s->mv[0][0][0]= get_amv(s, 0);
3086 s->mv[0][0][1]= get_amv(s, 1);
3090 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3098 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3099 //fprintf(stderr, "\tCBPC: %d", cbpc);
3104 else if (cbpc == 20)
3105 fprintf(stderr, "Stuffing !");
3108 s->mb_intra = ((cbpc & 4) != 0);
3109 if (s->mb_intra) goto intra;
3111 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
3112 s->mcsel= get_bits1(&s->gb);
3114 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3115 cbp = (cbpc & 3) | ((cbpy ^ 0xf) << 2);
3117 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
3119 if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE)))
3120 s->interlaced_dct= get_bits1(&s->gb);
3122 s->mv_dir = MV_DIR_FORWARD;
3123 if ((cbpc & 16) == 0) {
3125 s->current_picture.mb_type[xy]= MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
3126 /* 16x16 global motion prediction */
3127 s->mv_type = MV_TYPE_16X16;
3130 s->mv[0][0][0] = mx;
3131 s->mv[0][0][1] = my;
3132 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
3133 s->current_picture.mb_type[xy]= MB_TYPE_16x8 | MB_TYPE_L0 | MB_TYPE_INTERLACED;
3134 /* 16x8 field motion prediction */
3135 s->mv_type= MV_TYPE_FIELD;
3137 s->field_select[0][0]= get_bits1(&s->gb);
3138 s->field_select[0][1]= get_bits1(&s->gb);
3140 h263_pred_motion(s, 0, &pred_x, &pred_y);
3143 mx = h263_decode_motion(s, pred_x, s->f_code);
3147 my = h263_decode_motion(s, pred_y/2, s->f_code);
3151 s->mv[0][i][0] = mx;
3152 s->mv[0][i][1] = my;
3155 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3156 /* 16x16 motion prediction */
3157 s->mv_type = MV_TYPE_16X16;
3158 h263_pred_motion(s, 0, &pred_x, &pred_y);
3160 mx = h263p_decode_umotion(s, pred_x);
3162 mx = h263_decode_motion(s, pred_x, s->f_code);
3168 my = h263p_decode_umotion(s, pred_y);
3170 my = h263_decode_motion(s, pred_y, s->f_code);
3174 s->mv[0][0][0] = mx;
3175 s->mv[0][0][1] = my;
3177 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3178 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3181 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3182 s->mv_type = MV_TYPE_8X8;
3184 mot_val = h263_pred_motion(s, i, &pred_x, &pred_y);
3186 mx = h263p_decode_umotion(s, pred_x);
3188 mx = h263_decode_motion(s, pred_x, s->f_code);
3193 my = h263p_decode_umotion(s, pred_y);
3195 my = h263_decode_motion(s, pred_y, s->f_code);
3198 s->mv[0][i][0] = mx;
3199 s->mv[0][i][1] = my;
3200 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3201 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3206 } else if(s->pict_type==B_TYPE) {
3207 int modb1; // first bit of modb
3208 int modb2; // second bit of modb
3211 s->mb_intra = 0; //B-frames never contain intra blocks
3212 s->mcsel=0; // ... true gmc blocks
3216 s->last_mv[i][0][0]=
3217 s->last_mv[i][0][1]=
3218 s->last_mv[i][1][0]=
3219 s->last_mv[i][1][1]= 0;
3223 /* if we skipped it in the future P Frame than skip it now too */
3224 s->mb_skiped= s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]; // Note, skiptab=0 if last was GMC
3229 s->block_last_index[i] = -1;
3231 s->mv_dir = MV_DIR_FORWARD;
3232 s->mv_type = MV_TYPE_16X16;
3237 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3241 modb1= get_bits1(&s->gb);
3243 mb_type= MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1; //like MB_TYPE_B_DIRECT but no vectors coded
3246 modb2= get_bits1(&s->gb);
3247 mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
3249 printf("illegal MB_type\n");
3252 mb_type= mb_type_b_map[ mb_type ];
3254 else cbp= get_bits(&s->gb, 6);
3256 if ((!IS_DIRECT(mb_type)) && cbp) {
3257 if(get_bits1(&s->gb)){
3258 change_qscale(s, get_bits1(&s->gb)*4 - 2);
3262 if(!s->progressive_sequence){
3264 s->interlaced_dct= get_bits1(&s->gb);
3266 if(!IS_DIRECT(mb_type) && get_bits1(&s->gb)){
3267 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
3268 mb_type &= ~MB_TYPE_16x16;
3270 if(USES_LIST(mb_type, 0)){
3271 s->field_select[0][0]= get_bits1(&s->gb);
3272 s->field_select[0][1]= get_bits1(&s->gb);
3274 if(USES_LIST(mb_type, 1)){
3275 s->field_select[1][0]= get_bits1(&s->gb);
3276 s->field_select[1][1]= get_bits1(&s->gb);
3282 if((mb_type & (MB_TYPE_DIRECT2|MB_TYPE_INTERLACED)) == 0){
3283 s->mv_type= MV_TYPE_16X16;
3285 if(USES_LIST(mb_type, 0)){
3286 s->mv_dir = MV_DIR_FORWARD;
3288 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
3289 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
3290 s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
3291 s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
3294 if(USES_LIST(mb_type, 1)){
3295 s->mv_dir |= MV_DIR_BACKWARD;
3297 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
3298 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
3299 s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
3300 s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
3302 }else if(!IS_DIRECT(mb_type)){
3303 s->mv_type= MV_TYPE_FIELD;
3305 if(USES_LIST(mb_type, 0)){
3306 s->mv_dir = MV_DIR_FORWARD;
3309 mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code);
3310 my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
3311 s->last_mv[0][i][0]= s->mv[0][i][0] = mx;
3312 s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
3316 if(USES_LIST(mb_type, 1)){
3317 s->mv_dir |= MV_DIR_BACKWARD;
3320 mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code);
3321 my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
3322 s->last_mv[1][i][0]= s->mv[1][i][0] = mx;
3323 s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
3329 if(IS_DIRECT(mb_type)){
3330 if(IS_SKIP(mb_type))
3333 mx = h263_decode_motion(s, 0, 1);
3334 my = h263_decode_motion(s, 0, 1);
3337 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3338 mb_type |= ff_mpeg4_set_direct_mv(s, mx, my);
3340 s->current_picture.mb_type[xy]= mb_type;
3341 } else { /* I-Frame */
3342 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
3348 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3349 if (s->h263_pred || s->h263_aic) {
3350 s->ac_pred = get_bits1(&s->gb);
3352 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
3355 s->h263_aic_dir = get_bits1(&s->gb);
3360 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3361 if(cbpy<0) return -1;
3362 cbp = (cbpc & 3) | (cbpy << 2);
3364 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
3367 if(!s->progressive_sequence)
3368 s->interlaced_dct= get_bits1(&s->gb);
3370 /* decode each block */
3372 for (i = 0; i < 6; i++) {
3373 if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0)
3378 for (i = 0; i < 6; i++) {
3379 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
3387 /* decode each block */
3389 for (i = 0; i < 6; i++) {
3390 if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0)
3395 for (i = 0; i < 6; i++) {
3396 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
3403 /* per-MB end of slice check */
3404 if(s->codec_id==CODEC_ID_MPEG4){
3405 if(mpeg4_is_resync(s)){
3406 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
3407 if(s->pict_type==B_TYPE && s->next_picture.mbskip_table[xy + delta])
3412 int v= show_bits(&s->gb, 16);
3414 if(get_bits_count(&s->gb) + 16 > s->gb.size_in_bits){
3415 v>>= get_bits_count(&s->gb) + 16 - s->gb.size_in_bits;
3425 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
3427 int code, val, sign, shift, l;
3428 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
3435 sign = get_bits1(&s->gb);
3439 val = (val - 1) << shift;
3440 val |= get_bits(&s->gb, shift);
3447 /* modulo decoding */
3448 if (!s->h263_long_vectors) {
3449 l = 1 << (f_code + 4);
3450 val = ((val + l)&(l*2-1)) - l;
3452 /* horrible h263 long vector mode */
3453 if (pred < -31 && val < -63)
3455 if (pred > 32 && val > 63)
3462 /* Decodes RVLC of H.263+ UMV */
3463 static int h263p_decode_umotion(MpegEncContext * s, int pred)
3467 if (get_bits1(&s->gb)) /* Motion difference = 0 */
3470 code = 2 + get_bits1(&s->gb);
3472 while (get_bits1(&s->gb))
3475 code += get_bits1(&s->gb);
3480 code = (sign) ? (pred - code) : (pred + code);
3482 fprintf(stderr,"H.263+ UMV Motion = %d\n", code);
3488 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
3491 int code, level, i, j, last, run;
3492 RLTable *rl = &rl_inter;
3493 const uint8_t *scan_table;
3495 scan_table = s->intra_scantable.permutated;
3496 if (s->h263_aic && s->mb_intra) {
3500 if (s->h263_aic_dir)
3501 scan_table = s->intra_v_scantable.permutated; /* left */
3503 scan_table = s->intra_h_scantable.permutated; /* top */
3505 } else if (s->mb_intra) {
3508 if (s->rv10_version == 3 && s->pict_type == I_TYPE) {
3509 int component, diff;
3510 component = (n <= 3 ? 0 : n - 4 + 1);
3511 level = s->last_dc[component];
3512 if (s->rv10_first_dc_coded[component]) {
3513 diff = rv_decode_dc(s, n);
3517 level = level & 0xff; /* handle wrap round */
3518 s->last_dc[component] = level;
3520 s->rv10_first_dc_coded[component] = 1;
3523 level = get_bits(&s->gb, 8);
3526 level = get_bits(&s->gb, 8);
3527 if((level&0x7F) == 0){
3528 fprintf(stderr, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y);
3540 if (s->mb_intra && s->h263_aic)
3542 s->block_last_index[n] = i - 1;
3547 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
3549 fprintf(stderr, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
3552 if (code == rl->n) {
3554 last = get_bits1(&s->gb);
3555 run = get_bits(&s->gb, 6);
3556 level = (int8_t)get_bits(&s->gb, 8);
3559 /* XXX: should patch encoder too */
3560 level = get_sbits(&s->gb, 12);
3562 level = get_bits(&s->gb, 5);
3563 level |= get_sbits(&s->gb, 6)<<5;
3567 run = rl->table_run[code];
3568 level = rl->table_level[code];
3569 last = code >= rl->last;
3570 if (get_bits1(&s->gb))
3575 fprintf(stderr, "run overflow at %dx%d\n", s->mb_x, s->mb_y);
3585 if (s->mb_intra && s->h263_aic) {
3586 h263_pred_acdc(s, block, n);
3589 s->block_last_index[n] = i;
3594 * decodes the dc value.
3595 * @param n block index (0-3 are luma, 4-5 are chroma)
3596 * @param dir_ptr the prediction direction will be stored here
3597 * @return the quantized dc
3599 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
3601 int level, pred, code;
3605 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
3607 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
3608 if (code < 0 || code > 9 /* && s->nbit<9 */){
3609 fprintf(stderr, "illegal dc vlc\n");
3617 level= 2*get_bits1(&s->gb)-1;
3619 if(get_bits1(&s->gb))
3620 level = get_bits(&s->gb, code-1) + (1<<(code-1));
3622 level = -get_bits(&s->gb, code-1) - (1<<(code-1));
3625 level = get_xbits(&s->gb, code);
3629 if(get_bits1(&s->gb)==0){ /* marker */
3630 if(s->error_resilience>=2){
3631 fprintf(stderr, "dc marker bit missing\n");
3637 pred = ff_mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
3640 if(s->error_resilience>=3){
3641 fprintf(stderr, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
3647 *dc_val = level * s->y_dc_scale;
3649 *dc_val = level * s->c_dc_scale;
3652 *dc_val = level * 8;
3654 if(s->error_resilience>=3){
3655 if(*dc_val > 2048 + s->y_dc_scale + s->c_dc_scale){
3656 fprintf(stderr, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
3665 * @return <0 if an error occured
3667 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
3668 int n, int coded, int intra, int rvlc)
3670 int level, i, last, run;
3673 RL_VLC_ELEM * rl_vlc;
3674 const uint8_t * scan_table;
3677 //Note intra & rvlc should be optimized away if this is inlined
3681 if(s->partitioned_frame){
3682 level = s->dc_val[0][ s->block_index[n] ];
3683 if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale);
3684 else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale);
3685 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32;
3687 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
3697 rl = &rvlc_rl_intra;
3698 rl_vlc = rvlc_rl_intra.rl_vlc[0];
3701 rl_vlc = rl_intra.rl_vlc[0];
3704 if (dc_pred_dir == 0)
3705 scan_table = s->intra_v_scantable.permutated; /* left */
3707 scan_table = s->intra_h_scantable.permutated; /* top */
3709 scan_table = s->intra_scantable.permutated;
3716 s->block_last_index[n] = i;
3719 if(rvlc) rl = &rvlc_rl_inter;
3720 else rl = &rl_inter;
3722 scan_table = s->intra_scantable.permutated;
3728 rl_vlc = rvlc_rl_inter.rl_vlc[0];
3730 rl_vlc = rl_inter.rl_vlc[0];
3733 qmul = s->qscale << 1;
3734 qadd = (s->qscale - 1) | 1;
3736 rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale];
3738 rl_vlc = rl_inter.rl_vlc[s->qscale];
3743 OPEN_READER(re, &s->gb);
3745 UPDATE_CACHE(re, &s->gb);
3746 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
3750 if(SHOW_UBITS(re, &s->gb, 1)==0){
3751 fprintf(stderr, "1. marker bit missing in rvlc esc\n");
3753 }; SKIP_CACHE(re, &s->gb, 1);
3755 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
3756 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
3757 SKIP_COUNTER(re, &s->gb, 1+1+6);
3758 UPDATE_CACHE(re, &s->gb);
3760 if(SHOW_UBITS(re, &s->gb, 1)==0){
3761 fprintf(stderr, "2. marker bit missing in rvlc esc\n");
3763 }; SKIP_CACHE(re, &s->gb, 1);
3765 level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11);
3767 if(SHOW_UBITS(re, &s->gb, 5)!=0x10){
3768 fprintf(stderr, "reverse esc missing\n");
3770 }; SKIP_CACHE(re, &s->gb, 5);
3772 level= level * qmul + qadd;
3773 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1);
3774 SKIP_COUNTER(re, &s->gb, 1+11+5+1);
3780 cache= GET_CACHE(re, &s->gb);
3783 cache ^= 0xC0000000;
3785 if (cache&0x80000000) {
3786 if (cache&0x40000000) {
3788 SKIP_CACHE(re, &s->gb, 2);
3789 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
3790 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
3791 SKIP_COUNTER(re, &s->gb, 2+1+6);
3792 UPDATE_CACHE(re, &s->gb);
3795 level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12);
3797 if(SHOW_UBITS(re, &s->gb, 1)==0){
3798 fprintf(stderr, "1. marker bit missing in 3. esc\n");
3800 }; SKIP_CACHE(re, &s->gb, 1);
3802 level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
3804 if(SHOW_UBITS(re, &s->gb, 1)==0){
3805 fprintf(stderr, "2. marker bit missing in 3. esc\n");
3807 }; LAST_SKIP_CACHE(re, &s->gb, 1);
3809 SKIP_COUNTER(re, &s->gb, 1+12+1);
3812 if(level*s->qscale>1024 || level*s->qscale<-1024){
3813 fprintf(stderr, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
3818 const int abs_level= ABS(level);
3819 if(abs_level<=MAX_LEVEL && run<=MAX_RUN && !(s->workaround_bugs&FF_BUG_AC_VLC)){
3820 const int run1= run - rl->max_run[last][abs_level] - 1;
3821 if(abs_level <= rl->max_level[last][run]){
3822 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
3825 if(s->error_resilience > FF_ER_COMPLIANT){
3826 if(abs_level <= rl->max_level[last][run]*2){
3827 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
3830 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
3831 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
3838 if (level>0) level= level * qmul + qadd;
3839 else level= level * qmul - qadd;
3845 #if MIN_CACHE_BITS < 20
3846 LAST_SKIP_BITS(re, &s->gb, 2);
3847 UPDATE_CACHE(re, &s->gb);
3849 SKIP_BITS(re, &s->gb, 2);
3851 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
3852 i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing
3853 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
3854 LAST_SKIP_BITS(re, &s->gb, 1);
3858 #if MIN_CACHE_BITS < 19
3859 LAST_SKIP_BITS(re, &s->gb, 1);
3860 UPDATE_CACHE(re, &s->gb);
3862 SKIP_BITS(re, &s->gb, 1);
3864 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
3866 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
3867 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
3868 LAST_SKIP_BITS(re, &s->gb, 1);
3873 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
3874 LAST_SKIP_BITS(re, &s->gb, 1);
3879 fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
3883 block[scan_table[i]] = level;
3887 block[scan_table[i]] = level;
3889 CLOSE_READER(re, &s->gb);
3893 mpeg4_pred_ac(s, block, n, dc_pred_dir);
3895 i = 63; /* XXX: not optimal */
3898 s->block_last_index[n] = i;
3902 /* most is hardcoded. should extend to handle all h263 streams */
3903 int h263_decode_picture_header(MpegEncContext *s)
3905 int format, width, height;
3907 /* picture start code */
3908 if (get_bits_long(&s->gb, 22) != 0x20) {
3909 fprintf(stderr, "Bad picture start code\n");
3912 /* temporal reference */
3913 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
3915 /* PTYPE starts here */
3916 if (get_bits1(&s->gb) != 1) {
3918 fprintf(stderr, "Bad marker\n");
3921 if (get_bits1(&s->gb) != 0) {
3922 fprintf(stderr, "Bad H263 id\n");
3923 return -1; /* h263 id */
3925 skip_bits1(&s->gb); /* split screen off */
3926 skip_bits1(&s->gb); /* camera off */
3927 skip_bits1(&s->gb); /* freeze picture release off */
3929 /* Reset GOB number */
3932 format = get_bits(&s->gb, 3);
3937 7 extended PTYPE (PLUSPTYPE)
3940 if (format != 7 && format != 6) {
3943 width = h263_format[format][0];
3944 height = h263_format[format][1];
3950 s->pict_type = I_TYPE + get_bits1(&s->gb);
3952 s->unrestricted_mv = get_bits1(&s->gb);
3953 s->h263_long_vectors = s->unrestricted_mv;
3955 if (get_bits1(&s->gb) != 0) {
3956 fprintf(stderr, "H263 SAC not supported\n");
3957 return -1; /* SAC: off */
3959 if (get_bits1(&s->gb) != 0) {
3960 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
3963 if (get_bits1(&s->gb) != 0) {
3964 fprintf(stderr, "H263 PB frame not supported\n");
3965 return -1; /* not PB frame */
3967 s->qscale = get_bits(&s->gb, 5);
3968 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
3974 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
3976 /* ufep other than 0 and 1 are reserved */
3979 format = get_bits(&s->gb, 3);
3980 dprintf("ufep=1, format: %d\n", format);
3981 skip_bits(&s->gb,1); /* Custom PCF */
3982 s->umvplus = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */
3983 skip_bits1(&s->gb); /* Syntax-based Arithmetic Coding (SAC) */
3984 if (get_bits1(&s->gb) != 0) {
3985 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
3987 if (get_bits1(&s->gb) != 0) { /* Advanced Intra Coding (AIC) */
3991 skip_bits(&s->gb, 7);
3992 /* these are the 7 bits: (in order of appearence */
3993 /* Deblocking Filter */
3994 /* Slice Structured */
3995 /* Reference Picture Selection */
3996 /* Independent Segment Decoding */
3997 /* Alternative Inter VLC */
3998 /* Modified Quantization */
3999 /* Prevent start code emulation */
4001 skip_bits(&s->gb, 3); /* Reserved */
4002 } else if (ufep != 0) {
4003 fprintf(stderr, "Bad UFEP type (%d)\n", ufep);
4008 s->pict_type = get_bits(&s->gb, 3) + I_TYPE;
4009 dprintf("pict_type: %d\n", s->pict_type);
4010 if (s->pict_type != I_TYPE &&
4011 s->pict_type != P_TYPE)
4013 skip_bits(&s->gb, 2);
4014 s->no_rounding = get_bits1(&s->gb);
4015 dprintf("RTYPE: %d\n", s->no_rounding);
4016 skip_bits(&s->gb, 4);
4018 /* Get the picture dimensions */
4021 /* Custom Picture Format (CPFMT) */
4022 s->aspect_ratio_info = get_bits(&s->gb, 4);
4023 dprintf("aspect: %d\n", s->aspect_ratio_info);
4028 3 - 10:11 (525-type 4:3)
4029 4 - 16:11 (CIF 16:9)
4030 5 - 40:33 (525-type 16:9)
4033 width = (get_bits(&s->gb, 9) + 1) * 4;
4035 height = get_bits(&s->gb, 9) * 4;
4036 dprintf("\nH.263+ Custom picture: %dx%d\n",width,height);
4037 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
4038 /* aspected dimensions */
4039 s->aspected_width = get_bits(&s->gb, 8);
4040 s->aspected_height = get_bits(&s->gb, 8);
4042 s->aspected_width = pixel_aspect[s->aspect_ratio_info][0];
4043 s->aspected_height= pixel_aspect[s->aspect_ratio_info][1];
4046 width = h263_format[format][0];
4047 height = h263_format[format][1];
4049 if ((width == 0) || (height == 0))
4054 if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
4059 s->qscale = get_bits(&s->gb, 5);
4062 while (get_bits1(&s->gb) != 0) {
4063 skip_bits(&s->gb, 8);
4068 s->y_dc_scale_table=
4069 s->c_dc_scale_table= h263_aic_dc_scale_table;
4071 s->y_dc_scale_table=
4072 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
4078 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s)
4081 int a= 2<<s->sprite_warping_accuracy;
4082 int rho= 3-s->sprite_warping_accuracy;
4084 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
4085 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
4086 int sprite_ref[4][2];
4087 int virtual_ref[2][2];
4089 int alpha=0, beta=0;
4094 for(i=0; i<s->num_sprite_warping_points; i++){
4098 length= get_vlc(&s->gb, &sprite_trajectory);
4100 x= get_xbits(&s->gb, length);
4102 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(&s->gb); /* marker bit */
4104 length= get_vlc(&s->gb, &sprite_trajectory);
4106 y=get_xbits(&s->gb, length);
4108 skip_bits1(&s->gb); /* marker bit */
4109 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
4114 while((1<<alpha)<w) alpha++;
4115 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
4119 // Note, the 4th point isnt used for GMC
4120 if(s->divx_version==500 && s->divx_build==413){
4121 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
4122 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
4123 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
4124 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
4125 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
4126 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
4128 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
4129 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
4130 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
4131 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
4132 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
4133 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
4135 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
4136 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
4138 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
4139 // perhaps it should be reordered to be more readable ...
4140 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
4141 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
4142 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
4143 + 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);
4144 virtual_ref[0][1]= 16*vop_ref[0][1]
4145 + 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);
4146 virtual_ref[1][0]= 16*vop_ref[0][0]
4147 + 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);
4148 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
4149 + 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);
4151 switch(s->num_sprite_warping_points)
4154 s->sprite_offset[0][0]= 0;
4155 s->sprite_offset[0][1]= 0;
4156 s->sprite_offset[1][0]= 0;
4157 s->sprite_offset[1][1]= 0;
4158 s->sprite_delta[0][0]= a;
4159 s->sprite_delta[0][1]= 0;
4160 s->sprite_delta[1][0]= 0;
4161 s->sprite_delta[1][1]= a;
4162 s->sprite_shift[0]= 0;
4163 s->sprite_shift[1]= 0;
4166 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
4167 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
4168 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
4169 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
4170 s->sprite_delta[0][0]= a;
4171 s->sprite_delta[0][1]= 0;
4172 s->sprite_delta[1][0]= 0;
4173 s->sprite_delta[1][1]= a;
4174 s->sprite_shift[0]= 0;
4175 s->sprite_shift[1]= 0;
4178 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
4179 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
4180 + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])
4181 + (1<<(alpha+rho-1));
4182 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
4183 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
4184 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])
4185 + (1<<(alpha+rho-1));
4186 s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
4187 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
4188 +2*w2*r*sprite_ref[0][0]
4190 + (1<<(alpha+rho+1)));
4191 s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
4192 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
4193 +2*w2*r*sprite_ref[0][1]
4195 + (1<<(alpha+rho+1)));
4196 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
4197 s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]);
4198 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
4199 s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
4201 s->sprite_shift[0]= alpha+rho;
4202 s->sprite_shift[1]= alpha+rho+2;
4205 min_ab= FFMIN(alpha, beta);
4208 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
4209 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])
4210 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])
4211 + (1<<(alpha+beta+rho-min_ab-1));
4212 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))
4213 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])
4214 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])
4215 + (1<<(alpha+beta+rho-min_ab-1));
4216 s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)
4217 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)
4218 + 2*w2*h3*r*sprite_ref[0][0]
4220 + (1<<(alpha+beta+rho-min_ab+1));
4221 s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)
4222 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)
4223 + 2*w2*h3*r*sprite_ref[0][1]
4225 + (1<<(alpha+beta+rho-min_ab+1));
4226 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;
4227 s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;
4228 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;
4229 s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;
4231 s->sprite_shift[0]= alpha + beta + rho - min_ab;
4232 s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;
4235 /* try to simplify the situation */
4236 if( s->sprite_delta[0][0] == a<<s->sprite_shift[0]
4237 && s->sprite_delta[0][1] == 0
4238 && s->sprite_delta[1][0] == 0
4239 && s->sprite_delta[1][1] == a<<s->sprite_shift[0])
4241 s->sprite_offset[0][0]>>=s->sprite_shift[0];
4242 s->sprite_offset[0][1]>>=s->sprite_shift[0];
4243 s->sprite_offset[1][0]>>=s->sprite_shift[1];
4244 s->sprite_offset[1][1]>>=s->sprite_shift[1];
4245 s->sprite_delta[0][0]= a;
4246 s->sprite_delta[0][1]= 0;
4247 s->sprite_delta[1][0]= 0;
4248 s->sprite_delta[1][1]= a;
4249 s->sprite_shift[0]= 0;
4250 s->sprite_shift[1]= 0;
4251 s->real_sprite_warping_points=1;
4254 int shift_y= 16 - s->sprite_shift[0];
4255 int shift_c= 16 - s->sprite_shift[1];
4256 //printf("shifts %d %d\n", shift_y, shift_c);
4258 s->sprite_offset[0][i]<<= shift_y;
4259 s->sprite_offset[1][i]<<= shift_c;
4260 s->sprite_delta[0][i]<<= shift_y;
4261 s->sprite_delta[1][i]<<= shift_y;
4262 s->sprite_shift[i]= 16;
4264 s->real_sprite_warping_points= s->num_sprite_warping_points;
4267 printf("vop:%d:%d %d:%d %d:%d, sprite:%d:%d %d:%d %d:%d, virtual: %d:%d %d:%d\n",
4268 vop_ref[0][0], vop_ref[0][1],
4269 vop_ref[1][0], vop_ref[1][1],
4270 vop_ref[2][0], vop_ref[2][1],
4271 sprite_ref[0][0], sprite_ref[0][1],
4272 sprite_ref[1][0], sprite_ref[1][1],
4273 sprite_ref[2][0], sprite_ref[2][1],
4274 virtual_ref[0][0], virtual_ref[0][1],
4275 virtual_ref[1][0], virtual_ref[1][1]
4278 printf("offset: %d:%d , delta: %d %d %d %d, shift %d\n",
4279 s->sprite_offset[0][0], s->sprite_offset[0][1],
4280 s->sprite_delta[0][0], s->sprite_delta[0][1],
4281 s->sprite_delta[1][0], s->sprite_delta[1][1],
4287 static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
4288 int hours, minutes, seconds;
4290 hours= get_bits(gb, 5);
4291 minutes= get_bits(gb, 6);
4293 seconds= get_bits(gb, 6);
4295 s->time_base= seconds + 60*(minutes + 60*hours);
4303 static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
4304 int width, height, vo_ver_id;
4307 skip_bits(gb, 1); /* random access */
4308 s->vo_type= get_bits(gb, 8);
4309 if (get_bits1(gb) != 0) { /* is_ol_id */
4310 vo_ver_id = get_bits(gb, 4); /* vo_ver_id */
4311 skip_bits(gb, 3); /* vo_priority */
4315 //printf("vo type:%d\n",s->vo_type);
4316 s->aspect_ratio_info= get_bits(gb, 4);
4317 if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
4318 s->aspected_width = get_bits(gb, 8); // par_width
4319 s->aspected_height = get_bits(gb, 8); // par_height
4321 s->aspected_width = pixel_aspect[s->aspect_ratio_info][0];
4322 s->aspected_height= pixel_aspect[s->aspect_ratio_info][1];
4325 if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
4326 int chroma_format= get_bits(gb, 2);
4327 if(chroma_format!=1){
4328 printf("illegal chroma format\n");
4330 s->low_delay= get_bits1(gb);
4331 if(get_bits1(gb)){ /* vbv parameters */
4332 get_bits(gb, 15); /* first_half_bitrate */
4333 skip_bits1(gb); /* marker */
4334 get_bits(gb, 15); /* latter_half_bitrate */
4335 skip_bits1(gb); /* marker */
4336 get_bits(gb, 15); /* first_half_vbv_buffer_size */
4337 skip_bits1(gb); /* marker */
4338 get_bits(gb, 3); /* latter_half_vbv_buffer_size */
4339 get_bits(gb, 11); /* first_half_vbv_occupancy */
4340 skip_bits1(gb); /* marker */
4341 get_bits(gb, 15); /* latter_half_vbv_occupancy */
4342 skip_bits1(gb); /* marker */
4345 // set low delay flag only once so the smart? low delay detection wont be overriden
4346 if(s->picture_number==0)
4350 s->shape = get_bits(gb, 2); /* vol shape */
4351 if(s->shape != RECT_SHAPE) printf("only rectangular vol supported\n");
4352 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
4353 printf("Gray shape not supported\n");
4354 skip_bits(gb, 4); //video_object_layer_shape_extension
4357 skip_bits1(gb); /* marker */
4359 s->time_increment_resolution = get_bits(gb, 16);
4361 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
4362 if (s->time_increment_bits < 1)
4363 s->time_increment_bits = 1;
4364 skip_bits1(gb); /* marker */
4366 if (get_bits1(gb) != 0) { /* fixed_vop_rate */
4367 skip_bits(gb, s->time_increment_bits);
4370 if (s->shape != BIN_ONLY_SHAPE) {
4371 if (s->shape == RECT_SHAPE) {
4372 skip_bits1(gb); /* marker */
4373 width = get_bits(gb, 13);
4374 skip_bits1(gb); /* marker */
4375 height = get_bits(gb, 13);
4376 skip_bits1(gb); /* marker */
4377 if(width && height){ /* they should be non zero but who knows ... */
4380 // printf("width/height: %d %d\n", width, height);
4384 s->progressive_sequence= get_bits1(gb)^1;
4385 if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO))
4386 printf("OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */
4387 if (vo_ver_id == 1) {
4388 s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */
4390 s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */
4392 if(s->vol_sprite_usage==STATIC_SPRITE) printf("Static Sprites not supported\n");
4393 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
4394 if(s->vol_sprite_usage==STATIC_SPRITE){
4395 s->sprite_width = get_bits(gb, 13);
4396 skip_bits1(gb); /* marker */
4397 s->sprite_height= get_bits(gb, 13);
4398 skip_bits1(gb); /* marker */
4399 s->sprite_left = get_bits(gb, 13);
4400 skip_bits1(gb); /* marker */
4401 s->sprite_top = get_bits(gb, 13);
4402 skip_bits1(gb); /* marker */
4404 s->num_sprite_warping_points= get_bits(gb, 6);
4405 s->sprite_warping_accuracy = get_bits(gb, 2);
4406 s->sprite_brightness_change= get_bits1(gb);
4407 if(s->vol_sprite_usage==STATIC_SPRITE)
4408 s->low_latency_sprite= get_bits1(gb);
4410 // FIXME sadct disable bit if verid!=1 && shape not rect
4412 if (get_bits1(gb) == 1) { /* not_8_bit */
4413 s->quant_precision = get_bits(gb, 4); /* quant_precision */
4414 if(get_bits(gb, 4)!=8) printf("N-bit not supported\n"); /* bits_per_pixel */
4415 if(s->quant_precision!=5) printf("quant precission %d\n", s->quant_precision);
4417 s->quant_precision = 5;
4420 // FIXME a bunch of grayscale shape things
4422 if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */
4425 /* load default matrixes */
4426 for(i=0; i<64; i++){
4427 int j= s->dsp.idct_permutation[i];
4428 v= ff_mpeg4_default_intra_matrix[i];
4429 s->intra_matrix[j]= v;
4430 s->chroma_intra_matrix[j]= v;
4432 v= ff_mpeg4_default_non_intra_matrix[i];
4433 s->inter_matrix[j]= v;
4434 s->chroma_inter_matrix[j]= v;
4437 /* load custom intra matrix */
4440 for(i=0; i<64; i++){
4446 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
4447 s->intra_matrix[j]= v;
4448 s->chroma_intra_matrix[j]= v;
4451 /* replicate last value */
4453 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
4454 s->intra_matrix[j]= v;
4455 s->chroma_intra_matrix[j]= v;
4459 /* load custom non intra matrix */
4462 for(i=0; i<64; i++){
4468 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
4469 s->inter_matrix[j]= v;
4470 s->chroma_inter_matrix[j]= v;
4473 /* replicate last value */
4475 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
4476 s->inter_matrix[j]= last;
4477 s->chroma_inter_matrix[j]= last;
4481 // FIXME a bunch of grayscale shape things
4485 s->quarter_sample= get_bits1(gb);
4486 else s->quarter_sample=0;
4488 if(!get_bits1(gb)) printf("Complexity estimation not supported\n");
4490 s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */
4492 s->data_partitioning= get_bits1(gb);
4493 if(s->data_partitioning){
4494 s->rvlc= get_bits1(gb);
4497 if(vo_ver_id != 1) {
4498 s->new_pred= get_bits1(gb);
4500 printf("new pred not supported\n");
4501 skip_bits(gb, 2); /* requested upstream message type */
4502 skip_bits1(gb); /* newpred segment type */
4504 s->reduced_res_vop= get_bits1(gb);
4505 if(s->reduced_res_vop) printf("reduced resolution VOP not supported\n");
4509 s->reduced_res_vop= 0;
4512 s->scalability= get_bits1(gb);
4514 if (s->scalability) {
4515 GetBitContext bak= *gb;
4517 int ref_layer_sampling_dir;
4518 int h_sampling_factor_n;
4519 int h_sampling_factor_m;
4520 int v_sampling_factor_n;
4521 int v_sampling_factor_m;
4523 s->hierachy_type= get_bits1(gb);
4524 ref_layer_id= get_bits(gb, 4);
4525 ref_layer_sampling_dir= get_bits1(gb);
4526 h_sampling_factor_n= get_bits(gb, 5);
4527 h_sampling_factor_m= get_bits(gb, 5);
4528 v_sampling_factor_n= get_bits(gb, 5);
4529 v_sampling_factor_m= get_bits(gb, 5);
4530 s->enhancement_type= get_bits1(gb);
4532 if( h_sampling_factor_n==0 || h_sampling_factor_m==0
4533 || v_sampling_factor_n==0 || v_sampling_factor_m==0){
4535 // fprintf(stderr, "illegal scalability header (VERY broken encoder), trying to workaround\n");
4540 printf("scalability not supported\n");
4542 // bin shape stuff FIXME
4549 * decodes the user data stuff in the header.
4550 * allso inits divx/xvid/lavc_version/build
4552 static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
4556 int ver, build, ver2, ver3;
4559 buf[0]= show_bits(gb, 8);
4560 for(i=1; i<256; i++){
4561 buf[i]= show_bits(gb, 16)&0xFF;
4562 if(buf[i]==0) break;
4567 /* divx detection */
4568 e=sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last);
4570 e=sscanf(buf, "DivX%db%d%c", &ver, &build, &last);
4572 s->divx_version= ver;
4573 s->divx_build= build;
4574 s->divx_packed= e==3 && last=='p';
4575 if(s->picture_number==0){
4576 printf("This file was encoded with DivX%d Build%d", ver, build);
4584 /* ffmpeg detection */
4585 e=sscanf(buf, "FFmpeg%d.%d.%db%d", &ver, &ver2, &ver3, &build);
4587 e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
4589 if(strcmp(buf, "ffmpeg")==0){
4590 s->ffmpeg_version= 0x000406;
4591 s->lavc_build= 4600;
4595 s->ffmpeg_version= ver*256*256 + ver2*256 + ver3;
4596 s->lavc_build= build;
4597 if(s->picture_number==0)
4598 printf("This file was encoded with libavcodec build %d\n", build);
4601 /* xvid detection */
4602 e=sscanf(buf, "XviD%d", &build);
4604 s->xvid_build= build;
4605 if(s->picture_number==0)
4606 printf("This file was encoded with XviD build %d\n", build);
4609 //printf("User Data: %s\n", buf);
4613 static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
4614 int time_incr, time_increment;
4616 s->pict_type = get_bits(gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */
4617 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0){
4618 printf("low_delay flag set, but shouldnt, clearing it\n");
4622 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
4623 if(s->partitioned_frame)
4624 s->decode_mb= mpeg4_decode_partitioned_mb;
4626 s->decode_mb= ff_h263_decode_mb;
4628 if(s->time_increment_resolution==0){
4629 s->time_increment_resolution=1;
4630 // fprintf(stderr, "time_increment_resolution is illegal\n");
4633 while (get_bits1(gb) != 0)
4636 check_marker(gb, "before time_increment");
4638 if(s->picture_number==0 && (show_bits(gb, s->time_increment_bits+1)&1)==0){
4639 printf("hmm, seems the headers arnt complete, trying to guess time_increment_bits\n");
4642 for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){
4643 if(show_bits(gb, s->time_increment_bits+1)&1) break;
4645 printf("my guess is %d bits ;)\n",s->time_increment_bits);
4648 time_increment= get_bits(gb, s->time_increment_bits);
4649 //printf(" type:%d modulo_time_base:%d increment:%d\n", s->pict_type, time_incr, time_increment);
4650 if(s->pict_type!=B_TYPE){
4651 s->last_time_base= s->time_base;
4652 s->time_base+= time_incr;
4653 s->time= s->time_base*s->time_increment_resolution + time_increment;
4654 if(s->workaround_bugs&FF_BUG_UMP4){
4655 if(s->time < s->last_non_b_time){
4656 // fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaround\n");
4658 s->time+= s->time_increment_resolution;
4661 s->pp_time= s->time - s->last_non_b_time;
4662 s->last_non_b_time= s->time;
4664 s->time= (s->last_time_base + time_incr)*s->time_increment_resolution + time_increment;
4665 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
4666 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
4667 // printf("messed up order, seeking?, skiping current b frame\n");
4668 return FRAME_SKIPED;
4671 if(s->t_frame==0) s->t_frame= s->time - s->last_time_base;
4672 if(s->t_frame==0) s->t_frame=1; // 1/0 protection
4673 //printf("%Ld %Ld %d %d\n", s->last_non_b_time, s->time, s->pp_time, s->t_frame); fflush(stdout);
4674 s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame)
4675 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
4676 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame)
4677 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
4680 s->current_picture.pts= s->time*1000LL*1000LL / s->time_increment_resolution;
4681 if(s->avctx->debug&FF_DEBUG_PTS)
4682 printf("MPEG4 PTS: %f\n", s->current_picture.pts/(1000.0*1000.0));
4684 check_marker(gb, "before vop_coded");
4687 if (get_bits1(gb) != 1){
4688 printf("vop not coded\n");
4689 return FRAME_SKIPED;
4691 //printf("time %d %d %d || %Ld %Ld %Ld\n", s->time_increment_bits, s->time_increment_resolution, s->time_base,
4692 //s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time);
4693 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE
4694 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
4695 /* rounding type for motion estimation */
4696 s->no_rounding = get_bits1(gb);
4700 //FIXME reduced res stuff
4702 if (s->shape != RECT_SHAPE) {
4703 if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) {
4704 int width, height, hor_spat_ref, ver_spat_ref;
4706 width = get_bits(gb, 13);
4707 skip_bits1(gb); /* marker */
4708 height = get_bits(gb, 13);
4709 skip_bits1(gb); /* marker */
4710 hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */
4711 skip_bits1(gb); /* marker */
4712 ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */
4714 skip_bits1(gb); /* change_CR_disable */
4716 if (get_bits1(gb) != 0) {
4717 skip_bits(gb, 8); /* constant_alpha_value */
4720 //FIXME complexity estimation stuff
4722 if (s->shape != BIN_ONLY_SHAPE) {
4724 t=get_bits(gb, 3); /* intra dc VLC threshold */
4725 //printf("threshold %d\n", t);
4726 if(!s->progressive_sequence){
4727 s->top_field_first= get_bits1(gb);
4728 s->alternate_scan= get_bits1(gb);
4730 s->alternate_scan= 0;
4733 if(s->alternate_scan){
4734 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
4735 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
4736 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
4737 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
4739 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
4740 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
4741 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
4742 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
4745 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
4746 mpeg4_decode_sprite_trajectory(s);
4747 if(s->sprite_brightness_change) printf("sprite_brightness_change not supported\n");
4748 if(s->vol_sprite_usage==STATIC_SPRITE) printf("static sprite not supported\n");
4751 if (s->shape != BIN_ONLY_SHAPE) {
4752 s->qscale = get_bits(gb, s->quant_precision);
4754 printf("Error, header damaged or not MPEG4 header (qscale=0)\n");
4755 return -1; // makes no sense to continue, as there is nothing left from the image then
4758 if (s->pict_type != I_TYPE) {
4759 s->f_code = get_bits(gb, 3); /* fcode_for */
4761 printf("Error, header damaged or not MPEG4 header (f_code=0)\n");
4762 return -1; // makes no sense to continue, as the MV decoding will break very quickly
4767 if (s->pict_type == B_TYPE) {
4768 s->b_code = get_bits(gb, 3);
4772 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
4773 printf("qp:%d fc:%d,%d %s size:%d pro:%d alt:%d top:%d %spel part:%d resync:%d w:%d a:%d rnd:%d\n",
4774 s->qscale, s->f_code, s->b_code,
4775 s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")),
4776 gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first,
4777 s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,
4778 s->sprite_warping_accuracy, 1-s->no_rounding);
4781 if(!s->scalability){
4782 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {
4783 skip_bits1(gb); // vop shape coding type
4786 if(s->enhancement_type){
4787 int load_backward_shape= get_bits1(gb);
4788 if(load_backward_shape){
4789 printf("load backward shape isnt supported\n");
4792 skip_bits(gb, 2); //ref_select_code
4795 /* detect buggy encoders which dont set the low_delay flag (divx4/xvid/opendivx)*/
4796 // note we cannot detect divx5 without b-frames easyly (allthough its buggy too)
4797 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
4798 printf("looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
4802 s->picture_number++; // better than pic number==0 allways ;)
4804 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
4805 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
4807 if(!(s->workaround_bugs&FF_BUG_EDGE)){
4808 s->h_edge_pos= s->width;
4809 s->v_edge_pos= s->height;
4815 * decode mpeg4 headers
4816 * @return <0 if no VOP found (or a damaged one)
4817 * FRAME_SKIPPED if a not coded VOP is found
4818 * 0 if a VOP is found
4820 int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb)
4824 /* search next start code */
4828 v = get_bits(gb, 8);
4829 startcode = ((startcode << 8) | v) & 0xffffffff;
4831 if(get_bits_count(gb) >= gb->size_in_bits){
4832 if(gb->size_in_bits==8 && s->divx_version){
4833 printf("frame skip %d\n", gb->size_in_bits);
4834 return FRAME_SKIPED; //divx bug
4836 return -1; //end of stream
4839 if((startcode&0xFFFFFF00) != 0x100)
4840 continue; //no startcode
4842 if(s->avctx->debug&FF_DEBUG_STARTCODE){
4843 printf("startcode: %3X ", startcode);
4844 if (startcode<=0x11F) printf("Video Object Start");
4845 else if(startcode<=0x12F) printf("Video Object Layer Start");
4846 else if(startcode<=0x13F) printf("Reserved");
4847 else if(startcode<=0x15F) printf("FGS bp start");
4848 else if(startcode<=0x1AF) printf("Reserved");
4849 else if(startcode==0x1B0) printf("Visual Object Seq Start");
4850 else if(startcode==0x1B1) printf("Visual Object Seq End");
4851 else if(startcode==0x1B2) printf("User Data");
4852 else if(startcode==0x1B3) printf("Group of VOP start");
4853 else if(startcode==0x1B4) printf("Video Session Error");
4854 else if(startcode==0x1B5) printf("Visual Object Start");
4855 else if(startcode==0x1B6) printf("Video Object Plane start");
4856 else if(startcode==0x1B7) printf("slice start");
4857 else if(startcode==0x1B8) printf("extension start");
4858 else if(startcode==0x1B9) printf("fgs start");
4859 else if(startcode==0x1BA) printf("FBA Object start");
4860 else if(startcode==0x1BB) printf("FBA Object Plane start");
4861 else if(startcode==0x1BC) printf("Mesh Object start");
4862 else if(startcode==0x1BD) printf("Mesh Object Plane start");
4863 else if(startcode==0x1BE) printf("Still Textutre Object start");
4864 else if(startcode==0x1BF) printf("Textutre Spatial Layer start");
4865 else if(startcode==0x1C0) printf("Textutre SNR Layer start");
4866 else if(startcode==0x1C1) printf("Textutre Tile start");
4867 else if(startcode==0x1C2) printf("Textutre Shape Layer start");
4868 else if(startcode==0x1C3) printf("stuffing start");
4869 else if(startcode<=0x1C5) printf("reserved");
4870 else if(startcode<=0x1FF) printf("System start");
4871 printf(" at %d\n", get_bits_count(gb));
4876 decode_vol_header(s, gb);
4878 case USER_DATA_STARTCODE:
4879 decode_user_data(s, gb);
4882 mpeg4_decode_gop_header(s, gb);
4885 return decode_vop_header(s, gb);
4895 /* don't understand why they choose a different header ! */
4896 int intel_h263_decode_picture_header(MpegEncContext *s)
4900 /* picture header */
4901 if (get_bits_long(&s->gb, 22) != 0x20) {
4902 fprintf(stderr, "Bad picture start code\n");
4905 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
4907 if (get_bits1(&s->gb) != 1) {
4908 fprintf(stderr, "Bad marker\n");
4909 return -1; /* marker */
4911 if (get_bits1(&s->gb) != 0) {
4912 fprintf(stderr, "Bad H263 id\n");
4913 return -1; /* h263 id */
4915 skip_bits1(&s->gb); /* split screen off */
4916 skip_bits1(&s->gb); /* camera off */
4917 skip_bits1(&s->gb); /* freeze picture release off */
4919 format = get_bits(&s->gb, 3);
4921 fprintf(stderr, "Intel H263 free format not supported\n");
4926 s->pict_type = I_TYPE + get_bits1(&s->gb);
4928 s->unrestricted_mv = get_bits1(&s->gb);
4929 s->h263_long_vectors = s->unrestricted_mv;
4931 if (get_bits1(&s->gb) != 0) {
4932 fprintf(stderr, "SAC not supported\n");
4933 return -1; /* SAC: off */
4935 if (get_bits1(&s->gb) != 0) {
4936 fprintf(stderr, "Advanced Prediction Mode not supported\n");
4937 return -1; /* advanced prediction mode: off */
4939 if (get_bits1(&s->gb) != 0) {
4940 fprintf(stderr, "PB frame mode no supported\n");
4941 return -1; /* PB frame mode */
4944 /* skip unknown header garbage */
4945 skip_bits(&s->gb, 41);
4947 s->qscale = get_bits(&s->gb, 5);
4948 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
4951 while (get_bits1(&s->gb) != 0) {
4952 skip_bits(&s->gb, 8);
4956 s->y_dc_scale_table=
4957 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;