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 ff_flv_encode_picture_header(MpegEncContext * s, int picture_number)
157 align_put_bits(&s->pb);
159 put_bits(&s->pb, 17, 1);
160 put_bits(&s->pb, 5, (s->h263_flv-1)); /* 0: h263 escape codes 1: 11-bit escape codes */
161 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->frame_rate_base) /
162 s->avctx->frame_rate) & 0xff); /* TemporalReference */
163 if (s->width == 352 && s->height == 288)
165 else if (s->width == 176 && s->height == 144)
167 else if (s->width == 128 && s->height == 96)
169 else if (s->width == 320 && s->height == 240)
171 else if (s->width == 160 && s->height == 120)
173 else if (s->width <= 255 && s->height <= 255)
174 format = 0; /* use 1 byte width & height */
176 format = 1; /* use 2 bytes width & height */
177 put_bits(&s->pb, 3, format); /* PictureSize */
179 put_bits(&s->pb, 8, s->width);
180 put_bits(&s->pb, 8, s->height);
181 } else if (format == 1) {
182 put_bits(&s->pb, 16, s->width);
183 put_bits(&s->pb, 16, s->height);
185 put_bits(&s->pb, 2, s->pict_type == P_TYPE); /* PictureType */
186 put_bits(&s->pb, 1, 1); /* DeblockingFlag: on */
187 put_bits(&s->pb, 5, s->qscale); /* Quantizer */
188 put_bits(&s->pb, 1, 0); /* ExtraInformation */
192 s->c_dc_scale_table= h263_aic_dc_scale_table;
195 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
199 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
203 align_put_bits(&s->pb);
205 /* Update the pointer to last GOB */
206 s->ptr_lastgob = pbBufPtr(&s->pb);
209 put_bits(&s->pb, 22, 0x20); /* PSC */
210 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->frame_rate_base) /
211 s->avctx->frame_rate) & 0xff);
213 put_bits(&s->pb, 1, 1); /* marker */
214 put_bits(&s->pb, 1, 0); /* h263 id */
215 put_bits(&s->pb, 1, 0); /* split screen off */
216 put_bits(&s->pb, 1, 0); /* camera off */
217 put_bits(&s->pb, 1, 0); /* freeze picture release off */
219 format = h263_get_picture_format(s->width, s->height);
222 put_bits(&s->pb, 3, format);
223 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
224 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
225 of H.263v1 UMV implies to check the predicted MV after
226 calculation of the current MB to see if we're on the limits */
227 put_bits(&s->pb, 1, 0); /* unrestricted motion vector: off */
228 put_bits(&s->pb, 1, 0); /* SAC: off */
229 put_bits(&s->pb, 1, 0); /* advanced prediction mode: off */
230 put_bits(&s->pb, 1, 0); /* not PB frame */
231 put_bits(&s->pb, 5, s->qscale);
232 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
235 /* H.263 Plus PTYPE */
236 put_bits(&s->pb, 3, 7);
237 put_bits(&s->pb,3,1); /* Update Full Extended PTYPE */
239 put_bits(&s->pb,3,6); /* Custom Source Format */
241 put_bits(&s->pb, 3, format);
243 put_bits(&s->pb,1,0); /* Custom PCF: off */
244 s->umvplus = s->unrestricted_mv;
245 put_bits(&s->pb, 1, s->umvplus); /* Unrestricted Motion Vector */
246 put_bits(&s->pb,1,0); /* SAC: off */
247 put_bits(&s->pb,1,0); /* Advanced Prediction Mode: off */
248 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
249 put_bits(&s->pb,1,0); /* Deblocking Filter: off */
250 put_bits(&s->pb,1,0); /* Slice Structured: off */
251 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
252 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
253 put_bits(&s->pb,1,0); /* Alternative Inter VLC: off */
254 put_bits(&s->pb,1,0); /* Modified Quantization: off */
255 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
256 put_bits(&s->pb,3,0); /* Reserved */
258 put_bits(&s->pb, 3, s->pict_type == P_TYPE);
260 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
261 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
262 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
263 put_bits(&s->pb,2,0); /* Reserved */
264 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
266 /* This should be here if PLUSPTYPE */
267 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
270 /* Custom Picture Format (CPFMT) */
271 float_aspect_to_info(s, s->avctx->aspect_ratio);
273 put_bits(&s->pb,4,s->aspect_ratio_info);
274 put_bits(&s->pb,9,(s->width >> 2) - 1);
275 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
276 put_bits(&s->pb,9,(s->height >> 2));
277 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED)
279 put_bits(&s->pb, 8, s->aspected_width);
280 put_bits(&s->pb, 8, s->aspected_height);
284 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
286 // put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
287 put_bits(&s->pb,2,1); /* unlimited */
289 put_bits(&s->pb, 5, s->qscale);
292 put_bits(&s->pb, 1, 0); /* no PEI */
296 s->c_dc_scale_table= h263_aic_dc_scale_table;
299 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
304 * Encodes a group of blocks header.
306 int h263_encode_gob_header(MpegEncContext * s, int mb_line)
308 align_put_bits(&s->pb);
309 flush_put_bits(&s->pb);
310 /* Call the RTP callback to send the last GOB */
311 if (s->rtp_callback) {
312 int pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
313 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
315 put_bits(&s->pb, 17, 1); /* GBSC */
316 s->gob_number = mb_line / s->gob_index;
317 put_bits(&s->pb, 5, s->gob_number); /* GN */
318 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
319 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
320 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
324 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6])
326 int score0=0, score1=0;
328 int8_t * const qscale_table= s->current_picture.qscale_table;
331 int16_t *ac_val, *ac_val1;
333 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
336 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
338 ac_val-= s->block_wrap[n]*16;
339 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
342 const int level= block[n][s->dsp.idct_permutation[i ]];
344 score1+= ABS(level - ac_val[i+8]);
345 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
349 /* different qscale, we must rescale */
351 const int level= block[n][s->dsp.idct_permutation[i ]];
353 score1+= ABS(level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale));
354 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
359 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
360 /* left prediction */
362 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
365 const int level= block[n][s->dsp.idct_permutation[i<<3]];
367 score1+= ABS(level - ac_val[i]);
369 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
372 /* different qscale, we must rescale */
374 const int level= block[n][s->dsp.idct_permutation[i<<3]];
376 score1+= ABS(level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale));
378 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
384 return score0 > score1 ? 1 : 0;
388 * modify qscale so that encoding is acually possible in h263 (limit difference to -2..2)
390 void ff_clean_h263_qscales(MpegEncContext *s){
392 int8_t * const qscale_table= s->current_picture.qscale_table;
394 for(i=1; i<s->mb_num; i++){
395 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i-1] ] >2)
396 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i-1] ]+2;
398 for(i=s->mb_num-2; i>=0; i--){
399 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i+1] ] >2)
400 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i+1] ]+2;
405 * modify mb_type & qscale so that encoding is acually possible in mpeg4
407 void ff_clean_mpeg4_qscales(MpegEncContext *s){
409 int8_t * const qscale_table= s->current_picture.qscale_table;
411 ff_clean_h263_qscales(s);
413 for(i=1; i<s->mb_num; i++){
414 int mb_xy= s->mb_index2xy[i];
416 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&MB_TYPE_INTER4V)){
417 s->mb_type[mb_xy]&= ~MB_TYPE_INTER4V;
418 s->mb_type[mb_xy]|= MB_TYPE_INTER;
422 if(s->pict_type== B_TYPE){
424 /* ok, come on, this isnt funny anymore, theres more code for handling this mpeg4 mess than
425 for the actual adaptive quantization */
427 for(i=0; i<s->mb_num; i++){
428 int mb_xy= s->mb_index2xy[i];
429 odd += qscale_table[mb_xy]&1;
432 if(2*odd > s->mb_num) odd=1;
435 for(i=0; i<s->mb_num; i++){
436 int mb_xy= s->mb_index2xy[i];
437 if((qscale_table[mb_xy]&1) != odd)
438 qscale_table[mb_xy]++;
439 if(qscale_table[mb_xy] > 31)
440 qscale_table[mb_xy]= 31;
443 for(i=1; i<s->mb_num; i++){
444 int mb_xy= s->mb_index2xy[i];
445 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&MB_TYPE_DIRECT)){
446 s->mb_type[mb_xy]&= ~MB_TYPE_DIRECT;
447 s->mb_type[mb_xy]|= MB_TYPE_BIDIR;
453 #endif //CONFIG_ENCODERS
456 * @return the mb_type
458 int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){
459 const int mb_index= s->mb_x + s->mb_y*s->mb_stride;
460 const int colocated_mb_type= s->next_picture.mb_type[mb_index]; //FIXME or next?
461 int xy= s->block_index[0];
462 uint16_t time_pp= s->pp_time;
463 uint16_t time_pb= s->pb_time;
466 //FIXME avoid divides
468 if(IS_8X8(colocated_mb_type)){
469 s->mv_type = MV_TYPE_8X8;
471 xy= s->block_index[i];
472 s->mv[0][i][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
473 s->mv[0][i][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
474 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->motion_val[xy][0]
475 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
476 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->motion_val[xy][1]
477 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
479 return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_L0L1;
480 } else if(IS_INTERLACED(colocated_mb_type)){
481 s->mv_type = MV_TYPE_FIELD;
483 if(s->top_field_first){
484 time_pp= s->pp_field_time - s->field_select_table[mb_index][i] + i;
485 time_pb= s->pb_field_time - s->field_select_table[mb_index][i] + i;
487 time_pp= s->pp_field_time + s->field_select_table[mb_index][i] - i;
488 time_pb= s->pb_field_time + s->field_select_table[mb_index][i] - i;
490 s->mv[0][i][0] = s->field_mv_table[mb_index][i][0]*time_pb/time_pp + mx;
491 s->mv[0][i][1] = s->field_mv_table[mb_index][i][1]*time_pb/time_pp + my;
492 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->field_mv_table[mb_index][i][0]
493 : s->field_mv_table[mb_index][i][0]*(time_pb - time_pp)/time_pp;
494 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->field_mv_table[mb_index][i][1]
495 : s->field_mv_table[mb_index][i][1]*(time_pb - time_pp)/time_pp;
497 return MB_TYPE_DIRECT2 | MB_TYPE_16x8 | MB_TYPE_L0L1 | MB_TYPE_INTERLACED;
499 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;
500 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;
501 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]
502 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
503 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]
504 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
505 if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample)
506 s->mv_type= MV_TYPE_16X16;
508 s->mv_type= MV_TYPE_8X8;
509 return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_L0L1; //Note see prev line
513 void ff_h263_update_motion_val(MpegEncContext * s){
514 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
515 //FIXME a lot of thet is only needed for !low_delay
516 const int wrap = s->block_wrap[0];
517 const int xy = s->block_index[0];
519 s->current_picture.mbskip_table[mb_xy]= s->mb_skiped;
521 if(s->mv_type != MV_TYPE_8X8){
522 int motion_x, motion_y;
526 } else if (s->mv_type == MV_TYPE_16X16) {
527 motion_x = s->mv[0][0][0];
528 motion_y = s->mv[0][0][1];
529 } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {
531 motion_x = s->mv[0][0][0] + s->mv[0][1][0];
532 motion_y = s->mv[0][0][1] + s->mv[0][1][1];
533 motion_x = (motion_x>>1) | (motion_x&1);
535 s->field_mv_table[mb_xy][i][0]= s->mv[0][i][0];
536 s->field_mv_table[mb_xy][i][1]= s->mv[0][i][1];
537 s->field_select_table[mb_xy][i]= s->field_select[0][i];
541 /* no update if 8X8 because it has been done during parsing */
542 s->motion_val[xy][0] = motion_x;
543 s->motion_val[xy][1] = motion_y;
544 s->motion_val[xy + 1][0] = motion_x;
545 s->motion_val[xy + 1][1] = motion_y;
546 s->motion_val[xy + wrap][0] = motion_x;
547 s->motion_val[xy + wrap][1] = motion_y;
548 s->motion_val[xy + 1 + wrap][0] = motion_x;
549 s->motion_val[xy + 1 + wrap][1] = motion_y;
552 if(s->encoding){ //FIXME encoding MUST be cleaned up
553 if (s->mv_type == MV_TYPE_8X8)
554 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_8x8;
556 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_16x16;
560 #ifdef CONFIG_ENCODERS
561 void mpeg4_encode_mb(MpegEncContext * s,
562 DCTELEM block[6][64],
563 int motion_x, int motion_y)
565 int cbpc, cbpy, pred_x, pred_y;
567 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
568 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=B_TYPE ? &s->tex_pb : &s->pb;
569 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=I_TYPE ? &s->pb2 : &s->pb;
570 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
571 const int dquant_code[5]= {1,0,9,2,3};
573 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
577 for (i = 0; i < 6; i++) {
578 if (s->block_last_index[i] >= 0)
582 if(s->pict_type==B_TYPE){
583 static const int mb_type_table[8]= {-1, 2, 3, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
584 int mb_type= mb_type_table[s->mv_dir];
590 s->last_mv[1][0][1]= 0;
593 assert(s->dquant>=-2 && s->dquant<=2);
594 assert((s->dquant&1)==0);
597 /* nothing to do if this MB was skiped in the next P Frame */
598 if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){ //FIXME avoid DCT & ...
604 s->mv_dir= MV_DIR_FORWARD; //doesnt matter
605 s->qscale -= s->dquant;
611 if ((cbp | motion_x | motion_y | mb_type) ==0) {
612 /* direct MB with MV={0,0} */
613 assert(s->dquant==0);
615 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
617 if(interleaved_stats){
625 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
626 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
627 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we dont need it :)
628 if(cbp) put_bits(&s->pb, 6, cbp);
632 put_bits(&s->pb, 2, (s->dquant>>2)+3);
634 put_bits(&s->pb, 1, 0);
636 s->qscale -= s->dquant;
638 if(!s->progressive_sequence){
640 put_bits(&s->pb, 1, s->interlaced_dct);
641 if(mb_type) // not diect mode
642 put_bits(&s->pb, 1, 0); // no interlaced ME yet
645 if(interleaved_stats){
646 s->misc_bits+= get_bits_diff(s);
652 h263_encode_motion(s, motion_x, 1);
653 h263_encode_motion(s, motion_y, 1);
658 h263_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code);
659 h263_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
660 h263_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code);
661 h263_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
662 s->last_mv[0][0][0]= s->mv[0][0][0];
663 s->last_mv[0][0][1]= s->mv[0][0][1];
664 s->last_mv[1][0][0]= s->mv[1][0][0];
665 s->last_mv[1][0][1]= s->mv[1][0][1];
669 case 2: /* backward */
670 h263_encode_motion(s, motion_x - s->last_mv[1][0][0], s->b_code);
671 h263_encode_motion(s, motion_y - s->last_mv[1][0][1], s->b_code);
672 s->last_mv[1][0][0]= motion_x;
673 s->last_mv[1][0][1]= motion_y;
676 case 3: /* forward */
677 h263_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);
678 h263_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);
679 s->last_mv[0][0][0]= motion_x;
680 s->last_mv[0][0][1]= motion_y;
684 printf("unknown mb type\n");
688 if(interleaved_stats){
689 s->mv_bits+= get_bits_diff(s);
692 /* encode each block */
693 for (i = 0; i < 6; i++) {
694 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, NULL, &s->pb);
697 if(interleaved_stats){
698 s->p_tex_bits+= get_bits_diff(s);
700 }else{ /* s->pict_type==B_TYPE */
701 if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
702 /* check if the B frames can skip it too, as we must skip it if we skip here
703 why didnt they just compress the skip-mb bits instead of reusing them ?! */
704 if(s->max_b_frames>0){
711 if(x+16 > s->width) x= s->width-16;
712 if(y+16 > s->height) y= s->height-16;
714 offset= x + y*s->linesize;
715 p_pic= s->new_picture.data[0] + offset;
718 for(i=0; i<s->max_b_frames; i++){
721 Picture *pic= s->reordered_input_picture[i+1];
723 if(pic==NULL || pic->pict_type!=B_TYPE) break;
725 b_pic= pic->data[0] + offset + 16; //FIXME +16
726 diff= s->dsp.pix_abs16x16(p_pic, b_pic, s->linesize);
727 if(diff>s->qscale*70){ //FIXME check that 70 is optimal
736 /* skip macroblock */
737 put_bits(&s->pb, 1, 1);
739 if(interleaved_stats){
749 put_bits(&s->pb, 1, 0); /* mb coded */
750 if(s->mv_type==MV_TYPE_16X16){
752 if(s->dquant) cbpc+= 8;
754 inter_MCBPC_bits[cbpc],
755 inter_MCBPC_code[cbpc]);
759 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
761 put_bits(pb2, 2, dquant_code[s->dquant+2]);
763 if(!s->progressive_sequence){
765 put_bits(pb2, 1, s->interlaced_dct);
766 put_bits(pb2, 1, 0); // no interlaced ME yet
769 if(interleaved_stats){
770 s->misc_bits+= get_bits_diff(s);
773 /* motion vectors: 16x16 mode */
774 h263_pred_motion(s, 0, &pred_x, &pred_y);
776 h263_encode_motion(s, motion_x - pred_x, s->f_code);
777 h263_encode_motion(s, motion_y - pred_y, s->f_code);
781 inter_MCBPC_bits[cbpc],
782 inter_MCBPC_code[cbpc]);
785 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
787 if(!s->progressive_sequence){
789 put_bits(pb2, 1, s->interlaced_dct);
792 if(interleaved_stats){
793 s->misc_bits+= get_bits_diff(s);
797 /* motion vectors: 8x8 mode*/
798 h263_pred_motion(s, i, &pred_x, &pred_y);
800 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][0] - pred_x, s->f_code);
801 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][1] - pred_y, s->f_code);
805 if(interleaved_stats){
806 s->mv_bits+= get_bits_diff(s);
809 /* encode each block */
810 for (i = 0; i < 6; i++) {
811 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, NULL, tex_pb);
814 if(interleaved_stats){
815 s->p_tex_bits+= get_bits_diff(s);
821 int dc_diff[6]; //dc values with the dc prediction subtracted
822 int dir[6]; //prediction direction
823 int zigzag_last_index[6];
824 uint8_t *scan_table[6];
828 const int level= block[i][0];
831 dc_diff[i]= level - ff_mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]);
833 *dc_ptr = level * s->y_dc_scale;
835 *dc_ptr = level * s->c_dc_scale;
839 s->ac_pred= decide_ac_pred(s, block, dir);
846 mpeg4_inv_pred_ac(s, block[i], i, dir[i]);
847 if (dir[i]==0) st = s->intra_v_scantable.permutated; /* left */
848 else st = s->intra_h_scantable.permutated; /* top */
850 for(last_index=63; last_index>=0; last_index--) //FIXME optimize
851 if(block[i][st[last_index]]) break;
852 zigzag_last_index[i]= s->block_last_index[i];
853 s->block_last_index[i]= last_index;
858 scan_table[i]= s->intra_scantable.permutated;
863 for (i = 0; i < 6; i++) {
864 if (s->block_last_index[i] >= 1)
869 if (s->pict_type == I_TYPE) {
870 if(s->dquant) cbpc+=4;
872 intra_MCBPC_bits[cbpc],
873 intra_MCBPC_code[cbpc]);
875 if(s->dquant) cbpc+=8;
876 put_bits(&s->pb, 1, 0); /* mb coded */
878 inter_MCBPC_bits[cbpc + 4],
879 inter_MCBPC_code[cbpc + 4]);
881 put_bits(pb2, 1, s->ac_pred);
883 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
885 put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
887 if(!s->progressive_sequence){
888 put_bits(dc_pb, 1, s->interlaced_dct);
891 if(interleaved_stats){
892 s->misc_bits+= get_bits_diff(s);
895 /* encode each block */
896 for (i = 0; i < 6; i++) {
897 mpeg4_encode_block(s, block[i], i, dc_diff[i], scan_table[i], dc_pb, tex_pb);
900 if(interleaved_stats){
901 s->i_tex_bits+= get_bits_diff(s);
905 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
911 ac_val = s->ac_val[0][0] + s->block_index[i] * 16;
915 block[i][s->dsp.idct_permutation[j ]]= ac_val[j+8];
918 block[i][s->dsp.idct_permutation[j<<3]]= ac_val[j ];
920 s->block_last_index[i]= zigzag_last_index[i];
926 void h263_encode_mb(MpegEncContext * s,
927 DCTELEM block[6][64],
928 int motion_x, int motion_y)
930 int cbpc, cbpy, i, cbp, pred_x, pred_y;
932 int16_t rec_intradc[6];
934 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1);
935 const int dquant_code[5]= {1,0,9,2,3};
937 //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
941 for (i = 0; i < 6; i++) {
942 if (s->block_last_index[i] >= 0)
945 if ((cbp | motion_x | motion_y | s->dquant) == 0) {
946 /* skip macroblock */
947 put_bits(&s->pb, 1, 1);
948 if(interleaved_stats){
954 put_bits(&s->pb, 1, 0); /* mb coded */
956 if(s->dquant) cbpc+= 8;
958 inter_MCBPC_bits[cbpc],
959 inter_MCBPC_code[cbpc]);
962 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
964 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
966 if(interleaved_stats){
967 s->misc_bits+= get_bits_diff(s);
970 /* motion vectors: 16x16 mode only now */
971 h263_pred_motion(s, 0, &pred_x, &pred_y);
974 h263_encode_motion(s, motion_x - pred_x, s->f_code);
975 h263_encode_motion(s, motion_y - pred_y, s->f_code);
978 h263p_encode_umotion(s, motion_x - pred_x);
979 h263p_encode_umotion(s, motion_y - pred_y);
980 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
981 /* To prevent Start Code emulation */
982 put_bits(&s->pb,1,1);
985 if(interleaved_stats){
986 s->mv_bits+= get_bits_diff(s);
989 int li = s->h263_aic ? 0 : 1;
994 if (s->h263_aic && s->mb_intra) {
995 int16_t level = block[i][0];
997 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
1001 level = (level + (s->qscale >> 1))/(s->y_dc_scale);
1003 level = (level - (s->qscale >> 1))/(s->y_dc_scale);
1005 /* AIC can change CBP */
1006 if (level == 0 && s->block_last_index[i] == 0)
1007 s->block_last_index[i] = -1;
1008 else if (level < -127)
1010 else if (level > 127)
1013 block[i][0] = level;
1014 /* Reconstruction */
1015 rec_intradc[i] = (s->y_dc_scale*level) + pred_dc;
1017 rec_intradc[i] |= 1;
1018 //if ((rec_intradc[i] % 2) == 0)
1019 // rec_intradc[i]++;
1021 if (rec_intradc[i] < 0)
1023 else if (rec_intradc[i] > 2047)
1024 rec_intradc[i] = 2047;
1026 /* Update AC/DC tables */
1027 *dc_ptr[i] = rec_intradc[i];
1030 if (s->block_last_index[i] >= li)
1031 cbp |= 1 << (5 - i);
1035 if (s->pict_type == I_TYPE) {
1036 if(s->dquant) cbpc+=4;
1038 intra_MCBPC_bits[cbpc],
1039 intra_MCBPC_code[cbpc]);
1041 if(s->dquant) cbpc+=8;
1042 put_bits(&s->pb, 1, 0); /* mb coded */
1044 inter_MCBPC_bits[cbpc + 4],
1045 inter_MCBPC_code[cbpc + 4]);
1048 /* XXX: currently, we do not try to use ac prediction */
1049 put_bits(&s->pb, 1, 0); /* no AC prediction */
1052 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1054 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1056 if(interleaved_stats){
1057 s->misc_bits+= get_bits_diff(s);
1061 for(i=0; i<6; i++) {
1062 /* encode each block */
1063 h263_encode_block(s, block[i], i);
1065 /* Update INTRADC for decoding */
1066 if (s->h263_aic && s->mb_intra) {
1067 block[i][0] = rec_intradc[i];
1072 if(interleaved_stats){
1074 s->p_tex_bits+= get_bits_diff(s);
1077 s->i_tex_bits+= get_bits_diff(s);
1084 static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr)
1086 int x, y, wrap, a, c, pred_dc, scale;
1087 int16_t *dc_val, *ac_val;
1089 /* find prediction */
1091 x = 2 * s->mb_x + 1 + (n & 1);
1092 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
1093 wrap = s->mb_width * 2 + 2;
1094 dc_val = s->dc_val[0];
1095 ac_val = s->ac_val[0][0];
1096 scale = s->y_dc_scale;
1100 wrap = s->mb_width + 2;
1101 dc_val = s->dc_val[n - 4 + 1];
1102 ac_val = s->ac_val[n - 4 + 1][0];
1103 scale = s->c_dc_scale;
1108 a = dc_val[(x - 1) + (y) * wrap];
1109 c = dc_val[(x) + (y - 1) * wrap];
1111 /* No prediction outside GOB boundary */
1112 if (s->first_slice_line && ((n < 2) || (n > 3)))
1115 /* just DC prediction */
1116 if (a != 1024 && c != 1024)
1117 pred_dc = (a + c) >> 1;
1123 /* we assume pred is positive */
1124 //pred_dc = (pred_dc + (scale >> 1)) / scale;
1125 *dc_val_ptr = &dc_val[x + y * wrap];
1129 static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n)
1131 int x, y, wrap, a, c, pred_dc, scale, i;
1132 int16_t *dc_val, *ac_val, *ac_val1;
1134 /* find prediction */
1136 x = 2 * s->mb_x + 1 + (n & 1);
1137 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
1138 wrap = s->mb_width * 2 + 2;
1139 dc_val = s->dc_val[0];
1140 ac_val = s->ac_val[0][0];
1141 scale = s->y_dc_scale;
1145 wrap = s->mb_width + 2;
1146 dc_val = s->dc_val[n - 4 + 1];
1147 ac_val = s->ac_val[n - 4 + 1][0];
1148 scale = s->c_dc_scale;
1151 ac_val += ((y) * wrap + (x)) * 16;
1157 a = dc_val[(x - 1) + (y) * wrap];
1158 c = dc_val[(x) + (y - 1) * wrap];
1160 /* No prediction outside GOB boundary */
1161 if (s->first_slice_line && ((n < 2) || (n > 3)))
1165 if (s->h263_aic_dir) {
1166 /* left prediction */
1170 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
1175 /* top prediction */
1177 ac_val -= 16 * wrap;
1179 block[s->dsp.idct_permutation[i ]] += ac_val[i + 8];
1185 /* just DC prediction */
1186 if (a != 1024 && c != 1024)
1187 pred_dc = (a + c) >> 1;
1194 /* we assume pred is positive */
1195 block[0]=block[0]*scale + pred_dc;
1199 else if (!(block[0] & 1))
1202 /* Update AC/DC tables */
1203 dc_val[(x) + (y) * wrap] = block[0];
1207 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
1210 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
1213 int16_t *h263_pred_motion(MpegEncContext * s, int block,
1217 int16_t *A, *B, *C, *mot_val;
1218 static const int off[4]= {2, 1, 1, -1};
1220 wrap = s->block_wrap[0];
1221 xy = s->block_index[block];
1223 mot_val = s->motion_val[xy];
1225 A = s->motion_val[xy - 1];
1226 /* special case for first (slice) line */
1227 if (s->first_slice_line && block<3) {
1228 // we cant just change some MVs to simulate that as we need them for the B frames (and ME)
1229 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
1230 if(block==0){ //most common case
1231 if(s->mb_x == s->resync_mb_x){ //rare
1233 }else if(s->mb_x + 1 == s->resync_mb_x){ //rare
1234 C = s->motion_val[xy + off[block] - wrap];
1239 *px = mid_pred(A[0], 0, C[0]);
1240 *py = mid_pred(A[1], 0, C[1]);
1247 if(s->mb_x + 1 == s->resync_mb_x){ //rare
1248 C = s->motion_val[xy + off[block] - wrap];
1249 *px = mid_pred(A[0], 0, C[0]);
1250 *py = mid_pred(A[1], 0, C[1]);
1255 }else{ /* block==2*/
1256 B = s->motion_val[xy - wrap];
1257 C = s->motion_val[xy + off[block] - wrap];
1258 if(s->mb_x == s->resync_mb_x) //rare
1261 *px = mid_pred(A[0], B[0], C[0]);
1262 *py = mid_pred(A[1], B[1], C[1]);
1265 B = s->motion_val[xy - wrap];
1266 C = s->motion_val[xy + off[block] - wrap];
1267 *px = mid_pred(A[0], B[0], C[0]);
1268 *py = mid_pred(A[1], B[1], C[1]);
1273 #ifdef CONFIG_ENCODERS
1274 static void h263_encode_motion(MpegEncContext * s, int val, int f_code)
1276 int range, l, bit_size, sign, code, bits;
1281 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1283 bit_size = f_code - 1;
1284 range = 1 << bit_size;
1285 /* modulo encoding */
1292 val= (val^sign)-sign;
1297 } else if (val >= l) {
1301 assert(val>=-l && val<l);
1311 code = (val >> bit_size) + 1;
1312 bits = val & (range - 1);
1314 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1316 put_bits(&s->pb, bit_size, bits);
1322 /* Encode MV differences on H.263+ with Unrestricted MV mode */
1323 static void h263p_encode_umotion(MpegEncContext * s, int val)
1333 put_bits(&s->pb, 1, 1);
1335 put_bits(&s->pb, 3, 0);
1337 put_bits(&s->pb, 3, 2);
1340 sval = ((val < 0) ? (short)(-val):(short)val);
1343 while (temp_val != 0) {
1344 temp_val = temp_val >> 1;
1350 tcode = (sval & (1 << (i-1))) >> (i-1);
1351 tcode = (tcode << 1) | 1;
1352 code = (code << 2) | tcode;
1355 code = ((code << 1) | (val < 0)) << 1;
1356 put_bits(&s->pb, (2*n_bits)+1, code);
1357 //printf("\nVal = %d\tCode = %d", sval, code);
1361 static void init_mv_penalty_and_fcode(MpegEncContext *s)
1366 if(mv_penalty==NULL)
1367 mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
1369 for(f_code=1; f_code<=MAX_FCODE; f_code++){
1370 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
1373 if(mv==0) len= mvtab[0][1];
1375 int val, bit_size, range, code;
1377 bit_size = s->f_code - 1;
1378 range = 1 << bit_size;
1384 code = (val >> bit_size) + 1;
1386 len= mvtab[code][1] + 1 + bit_size;
1388 len= mvtab[32][1] + 2 + bit_size;
1392 mv_penalty[f_code][mv+MAX_MV]= len;
1396 for(f_code=MAX_FCODE; f_code>0; f_code--){
1397 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
1398 fcode_tab[mv+MAX_MV]= f_code;
1402 for(mv=0; mv<MAX_MV*2+1; mv++){
1403 umv_fcode_tab[mv]= 1;
1408 #ifdef CONFIG_ENCODERS
1410 static void init_uni_dc_tab(void)
1412 int level, uni_code, uni_len;
1414 for(level=-256; level<256; level++){
1416 /* find number of bits */
1425 l= (-level) ^ ((1 << size) - 1);
1430 uni_code= DCtab_lum[size][0];
1431 uni_len = DCtab_lum[size][1];
1434 uni_code<<=size; uni_code|=l;
1437 uni_code<<=1; uni_code|=1;
1441 uni_DCtab_lum_bits[level+256]= uni_code;
1442 uni_DCtab_lum_len [level+256]= uni_len;
1445 uni_code= DCtab_chrom[size][0];
1446 uni_len = DCtab_chrom[size][1];
1449 uni_code<<=size; uni_code|=l;
1452 uni_code<<=1; uni_code|=1;
1456 uni_DCtab_chrom_bits[level+256]= uni_code;
1457 uni_DCtab_chrom_len [level+256]= uni_len;
1462 #endif //CONFIG_ENCODERS
1464 #ifdef CONFIG_ENCODERS
1465 static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1466 int slevel, run, last;
1468 assert(MAX_LEVEL >= 64);
1469 assert(MAX_RUN >= 63);
1471 for(slevel=-64; slevel<64; slevel++){
1472 if(slevel==0) continue;
1473 for(run=0; run<64; run++){
1474 for(last=0; last<=1; last++){
1475 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1476 int level= slevel < 0 ? -slevel : slevel;
1477 int sign= slevel < 0 ? 1 : 0;
1478 int bits, len, code;
1481 len_tab[index]= 100;
1484 code= get_rl_index(rl, last, run, level);
1485 bits= rl->table_vlc[code][0];
1486 len= rl->table_vlc[code][1];
1487 bits=bits*2+sign; len++;
1489 if(code!=rl->n && len < len_tab[index]){
1490 bits_tab[index]= bits;
1491 len_tab [index]= len;
1495 bits= rl->table_vlc[rl->n][0];
1496 len= rl->table_vlc[rl->n][1];
1497 bits=bits*2; len++; //esc1
1498 level1= level - rl->max_level[last][run];
1500 code= get_rl_index(rl, last, run, level1);
1501 bits<<= rl->table_vlc[code][1];
1502 len += rl->table_vlc[code][1];
1503 bits += rl->table_vlc[code][0];
1504 bits=bits*2+sign; len++;
1506 if(code!=rl->n && len < len_tab[index]){
1507 bits_tab[index]= bits;
1508 len_tab [index]= len;
1514 bits= rl->table_vlc[rl->n][0];
1515 len= rl->table_vlc[rl->n][1];
1516 bits=bits*4+2; len+=2; //esc2
1517 run1 = run - rl->max_run[last][level] - 1;
1519 code= get_rl_index(rl, last, run1, level);
1520 bits<<= rl->table_vlc[code][1];
1521 len += rl->table_vlc[code][1];
1522 bits += rl->table_vlc[code][0];
1523 bits=bits*2+sign; len++;
1525 if(code!=rl->n && len < len_tab[index]){
1526 bits_tab[index]= bits;
1527 len_tab [index]= len;
1532 bits= rl->table_vlc[rl->n][0];
1533 len = rl->table_vlc[rl->n][1];
1534 bits=bits*4+3; len+=2; //esc3
1535 bits=bits*2+last; len++;
1536 bits=bits*64+run; len+=6;
1537 bits=bits*2+1; len++; //marker
1538 bits=bits*4096+(slevel&0xfff); len+=12;
1539 bits=bits*2+1; len++; //marker
1541 if(len < len_tab[index]){
1542 bits_tab[index]= bits;
1543 len_tab [index]= len;
1550 void h263_encode_init(MpegEncContext *s)
1552 static int done = 0;
1561 init_rl(&rl_intra_aic);
1563 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
1564 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
1566 init_mv_penalty_and_fcode(s);
1568 s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
1570 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
1571 switch(s->codec_id){
1572 case CODEC_ID_MPEG4:
1573 s->fcode_tab= fcode_tab;
1574 s->min_qcoeff= -2048;
1575 s->max_qcoeff= 2047;
1576 s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len;
1577 s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64;
1578 s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len;
1579 s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64;
1580 s->luma_dc_vlc_length= uni_DCtab_lum_len;
1581 s->chroma_dc_vlc_length= uni_DCtab_chrom_len;
1582 s->ac_esc_length= 7+2+1+6+1+12+1;
1584 case CODEC_ID_H263P:
1585 s->fcode_tab= umv_fcode_tab;
1586 s->min_qcoeff= -127;
1589 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
1591 if (s->h263_flv > 1) {
1592 s->min_qcoeff= -1023;
1593 s->max_qcoeff= 1023;
1595 s->min_qcoeff= -127;
1598 s->y_dc_scale_table=
1599 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
1601 default: //nothing needed default table allready set in mpegvideo.c
1602 s->min_qcoeff= -127;
1604 s->y_dc_scale_table=
1605 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
1610 * encodes a 8x8 block.
1611 * @param block the 8x8 block
1612 * @param n block index (0-3 are luma, 4-5 are chroma)
1614 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
1616 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
1620 if (s->mb_intra && !s->h263_aic) {
1623 /* 255 cannot be represented, so we clamp */
1628 /* 0 cannot be represented also */
1629 else if (level < 1) {
1633 if (level == 128) //FIXME check rv10
1634 put_bits(&s->pb, 8, 0xff);
1636 put_bits(&s->pb, 8, level & 0xff);
1640 if (s->h263_aic && s->mb_intra)
1645 last_index = s->block_last_index[n];
1646 last_non_zero = i - 1;
1647 for (; i <= last_index; i++) {
1648 j = s->intra_scantable.permutated[i];
1651 run = i - last_non_zero - 1;
1652 last = (i == last_index);
1659 code = get_rl_index(rl, last, run, level);
1660 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1661 if (code == rl->n) {
1662 if(s->h263_flv <= 1){
1663 put_bits(&s->pb, 1, last);
1664 put_bits(&s->pb, 6, run);
1666 assert(slevel != 0);
1668 if(slevel < 128 && slevel > -128)
1669 put_bits(&s->pb, 8, slevel & 0xff);
1671 put_bits(&s->pb, 8, 128);
1672 put_bits(&s->pb, 5, slevel & 0x1f);
1673 put_bits(&s->pb, 6, (slevel>>5)&0x3f);
1676 if(slevel < 64 && slevel > -64) {
1678 put_bits(&s->pb, 1, 0);
1679 put_bits(&s->pb, 1, last);
1680 put_bits(&s->pb, 6, run);
1682 put_bits(&s->pb, 7, slevel & 0x7f);
1685 put_bits(&s->pb, 1, 1);
1686 put_bits(&s->pb, 1, last);
1687 put_bits(&s->pb, 6, run);
1689 put_bits(&s->pb, 11, slevel & 0x7ff);
1693 put_bits(&s->pb, 1, sign);
1701 #ifdef CONFIG_ENCODERS
1703 /***************************************************/
1705 * add mpeg4 stuffing bits (01...1)
1707 void ff_mpeg4_stuffing(PutBitContext * pbc)
1710 put_bits(pbc, 1, 0);
1711 length= (-get_bit_count(pbc))&7;
1712 if(length) put_bits(pbc, length, (1<<length)-1);
1715 /* must be called before writing the header */
1716 void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){
1717 int time_div, time_mod;
1719 if(s->pict_type==I_TYPE){ //we will encode a vol header
1721 av_reduce(&s->time_increment_resolution, &dummy, s->avctx->frame_rate, s->avctx->frame_rate_base, (1<<16)-1);
1723 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
1726 if(s->current_picture.pts)
1727 s->time= (s->current_picture.pts*s->time_increment_resolution + 500*1000)/(1000*1000);
1729 s->time= av_rescale(picture_number*(int64_t)s->avctx->frame_rate_base, s->time_increment_resolution, s->avctx->frame_rate);
1730 time_div= s->time/s->time_increment_resolution;
1731 time_mod= s->time%s->time_increment_resolution;
1733 if(s->pict_type==B_TYPE){
1734 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
1736 s->last_time_base= s->time_base;
1737 s->time_base= time_div;
1738 s->pp_time= s->time - s->last_non_b_time;
1739 s->last_non_b_time= s->time;
1743 static void mpeg4_encode_gop_header(MpegEncContext * s){
1744 int hours, minutes, seconds;
1746 put_bits(&s->pb, 16, 0);
1747 put_bits(&s->pb, 16, GOP_STARTCODE);
1749 seconds= s->time/s->time_increment_resolution;
1750 minutes= seconds/60; seconds %= 60;
1751 hours= minutes/60; minutes %= 60;
1754 put_bits(&s->pb, 5, hours);
1755 put_bits(&s->pb, 6, minutes);
1756 put_bits(&s->pb, 1, 1);
1757 put_bits(&s->pb, 6, seconds);
1759 put_bits(&s->pb, 1, 0); //closed gov == NO
1760 put_bits(&s->pb, 1, 0); //broken link == NO
1762 ff_mpeg4_stuffing(&s->pb);
1765 static void mpeg4_encode_visual_object_header(MpegEncContext * s){
1766 int profile_and_level_indication;
1769 if(s->max_b_frames || s->quarter_sample){
1770 profile_and_level_indication= 0xF1; // adv simple level 1
1773 profile_and_level_indication= 0x01; // simple level 1
1778 put_bits(&s->pb, 16, 0);
1779 put_bits(&s->pb, 16, VOS_STARTCODE);
1781 put_bits(&s->pb, 8, profile_and_level_indication);
1783 put_bits(&s->pb, 16, 0);
1784 put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);
1786 put_bits(&s->pb, 1, 1);
1787 put_bits(&s->pb, 4, vo_ver_id);
1788 put_bits(&s->pb, 3, 1); //priority
1790 put_bits(&s->pb, 4, 1); //visual obj type== video obj
1792 put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME
1794 ff_mpeg4_stuffing(&s->pb);
1797 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number)
1801 if(s->max_b_frames || s->quarter_sample){
1803 s->vo_type= ADV_SIMPLE_VO_TYPE;
1806 s->vo_type= SIMPLE_VO_TYPE;
1809 put_bits(&s->pb, 16, 0);
1810 put_bits(&s->pb, 16, 0x100 + vo_number); /* video obj */
1811 put_bits(&s->pb, 16, 0);
1812 put_bits(&s->pb, 16, 0x120 + vol_number); /* video obj layer */
1814 put_bits(&s->pb, 1, 0); /* random access vol */
1815 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
1816 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
1817 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
1818 put_bits(&s->pb, 3, 1); /* is obj layer priority */
1820 float_aspect_to_info(s, s->avctx->aspect_ratio);
1822 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
1823 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED)
1825 put_bits(&s->pb, 8, s->aspected_width);
1826 put_bits(&s->pb, 8, s->aspected_height);
1830 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
1831 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
1832 put_bits(&s->pb, 1, s->low_delay);
1833 put_bits(&s->pb, 1, 0); /* vbv parameters= no */
1835 put_bits(&s->pb, 1, 0); /* vol control parameters= no */
1838 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
1839 put_bits(&s->pb, 1, 1); /* marker bit */
1841 put_bits(&s->pb, 16, s->time_increment_resolution);
1842 if (s->time_increment_bits < 1)
1843 s->time_increment_bits = 1;
1844 put_bits(&s->pb, 1, 1); /* marker bit */
1845 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
1846 put_bits(&s->pb, 1, 1); /* marker bit */
1847 put_bits(&s->pb, 13, s->width); /* vol width */
1848 put_bits(&s->pb, 1, 1); /* marker bit */
1849 put_bits(&s->pb, 13, s->height); /* vol height */
1850 put_bits(&s->pb, 1, 1); /* marker bit */
1851 put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
1852 put_bits(&s->pb, 1, 1); /* obmc disable */
1853 if (vo_ver_id == 1) {
1854 put_bits(&s->pb, 1, s->vol_sprite_usage=0); /* sprite enable */
1856 put_bits(&s->pb, 2, s->vol_sprite_usage=0); /* sprite enable */
1859 s->quant_precision=5;
1860 put_bits(&s->pb, 1, 0); /* not 8 bit == false */
1861 put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
1862 if(s->mpeg_quant) put_bits(&s->pb, 2, 0); /* no custom matrixes */
1865 put_bits(&s->pb, 1, s->quarter_sample);
1866 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
1867 s->resync_marker= s->rtp_mode;
1868 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
1869 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
1870 if(s->data_partitioning){
1871 put_bits(&s->pb, 1, 0); /* no rvlc */
1874 if (vo_ver_id != 1){
1875 put_bits(&s->pb, 1, 0); /* newpred */
1876 put_bits(&s->pb, 1, 0); /* reduced res vop */
1878 put_bits(&s->pb, 1, 0); /* scalability */
1880 ff_mpeg4_stuffing(&s->pb);
1883 if(!(s->flags & CODEC_FLAG_BITEXACT)){
1884 put_bits(&s->pb, 16, 0);
1885 put_bits(&s->pb, 16, 0x1B2); /* user_data */
1886 put_string(&s->pb, LIBAVCODEC_IDENT);
1887 ff_mpeg4_stuffing(&s->pb);
1891 /* write mpeg4 VOP header */
1892 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
1895 int time_div, time_mod;
1897 if(s->pict_type==I_TYPE){
1898 if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
1899 if(s->strict_std_compliance < 2) //HACK, the reference sw is buggy
1900 mpeg4_encode_visual_object_header(s);
1901 if(s->strict_std_compliance < 2 || picture_number==0) //HACK, the reference sw is buggy
1902 mpeg4_encode_vol_header(s, 0, 0);
1904 mpeg4_encode_gop_header(s);
1907 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
1909 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->frame_rate, FRAME_RATE_BASE);
1911 put_bits(&s->pb, 16, 0); /* vop header */
1912 put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */
1913 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
1915 time_div= s->time/s->time_increment_resolution;
1916 time_mod= s->time%s->time_increment_resolution;
1917 time_incr= time_div - s->last_time_base;
1919 put_bits(&s->pb, 1, 1);
1921 put_bits(&s->pb, 1, 0);
1923 put_bits(&s->pb, 1, 1); /* marker */
1924 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
1925 put_bits(&s->pb, 1, 1); /* marker */
1926 put_bits(&s->pb, 1, 1); /* vop coded */
1927 if ( s->pict_type == P_TYPE
1928 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
1929 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
1931 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
1932 if(!s->progressive_sequence){
1933 put_bits(&s->pb, 1, s->top_field_first);
1934 put_bits(&s->pb, 1, s->alternate_scan);
1936 //FIXME sprite stuff
1938 put_bits(&s->pb, 5, s->qscale);
1940 if (s->pict_type != I_TYPE)
1941 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
1942 if (s->pict_type == B_TYPE)
1943 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
1944 // printf("****frame %d\n", picture_number);
1946 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
1947 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
1950 #endif //CONFIG_ENCODERS
1953 * change qscale by given dquant and update qscale dependant variables.
1955 static void change_qscale(MpegEncContext * s, int dquant)
1957 s->qscale += dquant;
1961 else if (s->qscale > 31)
1964 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
1965 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
1970 * @param n block index (0-3 are luma, 4-5 are chroma)
1971 * @param dc_val_ptr a pointer to the dc_val entry for the current MB will be stored here
1972 * @param dir_ptr pointer to an integer where the prediction direction will be stored
1973 * @return the quantized predicted dc
1975 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr, int *dir_ptr)
1977 int a, b, c, wrap, pred, scale;
1980 /* find prediction */
1982 scale = s->y_dc_scale;
1984 scale = s->c_dc_scale;
1989 wrap= s->block_wrap[n];
1990 dc_val = s->dc_val[0] + s->block_index[n];
1996 b = dc_val[ - 1 - wrap];
1997 c = dc_val[ - wrap];
1999 /* outside slice handling (we cant do that by memset as we need the dc for error resilience) */
2000 if(s->first_slice_line && n!=3){
2002 if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
2004 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
2005 if(n==0 || n==4 || n==5)
2009 if (abs(a - b) < abs(b - c)) {
2011 *dir_ptr = 1; /* top */
2014 *dir_ptr = 0; /* left */
2016 /* we assume pred is positive */
2017 pred = FASTDIV((pred + (scale >> 1)), scale);
2019 /* prepare address for prediction update */
2020 *dc_val_ptr = &dc_val[0];
2027 * @param n block index (0-3 are luma, 4-5 are chroma)
2028 * @param dir the ac prediction direction
2030 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
2034 int16_t *ac_val, *ac_val1;
2035 int8_t * const qscale_table= s->current_picture.qscale_table;
2037 /* find prediction */
2038 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2042 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
2043 /* left prediction */
2046 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
2049 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
2052 /* different qscale, we must rescale */
2054 block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
2058 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
2059 /* top prediction */
2060 ac_val -= 16 * s->block_wrap[n];
2062 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
2065 block[s->dsp.idct_permutation[i]] += ac_val[i + 8];
2068 /* different qscale, we must rescale */
2070 block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
2077 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
2081 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
2085 #ifdef CONFIG_ENCODERS
2087 static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
2092 int8_t * const qscale_table= s->current_picture.qscale_table;
2094 /* find prediction */
2095 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2098 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
2099 /* left prediction */
2101 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
2104 block[s->dsp.idct_permutation[i<<3]] -= ac_val[i];
2107 /* different qscale, we must rescale */
2109 block[s->dsp.idct_permutation[i<<3]] -= ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
2113 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
2114 /* top prediction */
2115 ac_val -= 16 * s->block_wrap[n];
2116 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
2119 block[s->dsp.idct_permutation[i]] -= ac_val[i + 8];
2122 /* different qscale, we must rescale */
2124 block[s->dsp.idct_permutation[i]] -= ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
2131 * encodes the dc value.
2132 * @param n block index (0-3 are luma, 4-5 are chroma)
2134 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
2137 // if(level<-255 || level>255) printf("dc overflow\n");
2141 put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]);
2144 put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]);
2148 /* find number of bits */
2158 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
2161 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
2164 /* encode remaining bits */
2167 level = (-level) ^ ((1 << size) - 1);
2168 put_bits(&s->pb, size, level);
2170 put_bits(&s->pb, 1, 1);
2176 * encodes a 8x8 block
2177 * @param n block index (0-3 are luma, 4-5 are chroma)
2179 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2180 uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
2182 int i, last_non_zero;
2183 #if 0 //variables for the outcommented version
2184 int code, sign, last;
2189 const int last_index = s->block_last_index[n];
2191 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2192 /* mpeg4 based DC predictor */
2193 mpeg4_encode_dc(dc_pb, intra_dc, n);
2194 if(last_index<1) return;
2197 bits_tab= uni_mpeg4_intra_rl_bits;
2198 len_tab = uni_mpeg4_intra_rl_len;
2200 if(last_index<0) return;
2203 bits_tab= uni_mpeg4_inter_rl_bits;
2204 len_tab = uni_mpeg4_inter_rl_len;
2208 last_non_zero = i - 1;
2210 for (; i < last_index; i++) {
2211 int level = block[ scan_table[i] ];
2213 int run = i - last_non_zero - 1;
2215 if((level&(~127)) == 0){
2216 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2217 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2219 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);
2224 /*if(i<=last_index)*/{
2225 int level = block[ scan_table[i] ];
2226 int run = i - last_non_zero - 1;
2228 if((level&(~127)) == 0){
2229 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2230 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2232 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);
2236 for (; i <= last_index; i++) {
2237 const int slevel = block[ scan_table[i] ];
2240 int run = i - last_non_zero - 1;
2241 last = (i == last_index);
2248 code = get_rl_index(rl, last, run, level);
2249 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2250 if (code == rl->n) {
2252 level1 = level - rl->max_level[last][run];
2255 code = get_rl_index(rl, last, run, level1);
2256 if (code == rl->n) {
2258 put_bits(ac_pb, 1, 1);
2259 if (level > MAX_LEVEL)
2261 run1 = run - rl->max_run[last][level] - 1;
2264 code = get_rl_index(rl, last, run1, level);
2265 if (code == rl->n) {
2268 put_bits(ac_pb, 1, 1);
2269 put_bits(ac_pb, 1, last);
2270 put_bits(ac_pb, 6, run);
2271 put_bits(ac_pb, 1, 1);
2272 put_bits(ac_pb, 12, slevel & 0xfff);
2273 put_bits(ac_pb, 1, 1);
2276 put_bits(ac_pb, 1, 0);
2277 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2278 put_bits(ac_pb, 1, sign);
2282 put_bits(ac_pb, 1, 0);
2283 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2284 put_bits(ac_pb, 1, sign);
2287 put_bits(ac_pb, 1, sign);
2295 static inline int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2296 uint8_t *scan_table)
2298 int i, last_non_zero;
2301 const int last_index = s->block_last_index[n];
2304 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2305 /* mpeg4 based DC predictor */
2306 //mpeg4_encode_dc(dc_pb, intra_dc, n); //FIXME
2307 if(last_index<1) return len;
2310 len_tab = uni_mpeg4_intra_rl_len;
2312 if(last_index<0) return 0;
2315 len_tab = uni_mpeg4_inter_rl_len;
2319 last_non_zero = i - 1;
2320 for (; i < last_index; i++) {
2321 int level = block[ scan_table[i] ];
2323 int run = i - last_non_zero - 1;
2325 if((level&(~127)) == 0){
2326 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2327 len += len_tab[index];
2329 len += 7+2+1+6+1+12+1;
2334 /*if(i<=last_index)*/{
2335 int level = block[ scan_table[i] ];
2336 int run = i - last_non_zero - 1;
2338 if((level&(~127)) == 0){
2339 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2340 len += len_tab[index];
2342 len += 7+2+1+6+1+12+1;
2352 /***********************************************/
2355 static VLC intra_MCBPC_vlc;
2356 static VLC inter_MCBPC_vlc;
2357 static VLC cbpy_vlc;
2359 static VLC dc_lum, dc_chrom;
2360 static VLC sprite_trajectory;
2361 static VLC mb_type_b_vlc;
2363 void init_vlc_rl(RLTable *rl)
2367 init_vlc(&rl->vlc, 9, rl->n + 1,
2368 &rl->table_vlc[0][1], 4, 2,
2369 &rl->table_vlc[0][0], 4, 2);
2372 for(q=0; q<32; q++){
2381 rl->rl_vlc[q]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
2382 for(i=0; i<rl->vlc.table_size; i++){
2383 int code= rl->vlc.table[i][0];
2384 int len = rl->vlc.table[i][1];
2387 if(len==0){ // illegal code
2390 }else if(len<0){ //more bits needed
2394 if(code==rl->n){ //esc
2398 run= rl->table_run [code] + 1;
2399 level= rl->table_level[code] * qmul + qadd;
2400 if(code >= rl->last) run+=192;
2403 rl->rl_vlc[q][i].len= len;
2404 rl->rl_vlc[q][i].level= level;
2405 rl->rl_vlc[q][i].run= run;
2412 /* XXX: find a better solution to handle static init */
2413 void h263_decode_init_vlc(MpegEncContext *s)
2415 static int done = 0;
2420 init_vlc(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 8,
2421 intra_MCBPC_bits, 1, 1,
2422 intra_MCBPC_code, 1, 1);
2423 init_vlc(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 25,
2424 inter_MCBPC_bits, 1, 1,
2425 inter_MCBPC_code, 1, 1);
2426 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
2427 &cbpy_tab[0][1], 2, 1,
2428 &cbpy_tab[0][0], 2, 1);
2429 init_vlc(&mv_vlc, MV_VLC_BITS, 33,
2431 &mvtab[0][0], 2, 1);
2434 init_rl(&rvlc_rl_inter);
2435 init_rl(&rvlc_rl_intra);
2436 init_rl(&rl_intra_aic);
2437 init_vlc_rl(&rl_inter);
2438 init_vlc_rl(&rl_intra);
2439 init_vlc_rl(&rvlc_rl_inter);
2440 init_vlc_rl(&rvlc_rl_intra);
2441 init_vlc_rl(&rl_intra_aic);
2442 init_vlc(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
2443 &DCtab_lum[0][1], 2, 1,
2444 &DCtab_lum[0][0], 2, 1);
2445 init_vlc(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
2446 &DCtab_chrom[0][1], 2, 1,
2447 &DCtab_chrom[0][0], 2, 1);
2448 init_vlc(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
2449 &sprite_trajectory_tab[0][1], 4, 2,
2450 &sprite_trajectory_tab[0][0], 4, 2);
2451 init_vlc(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
2452 &mb_type_b_tab[0][1], 2, 1,
2453 &mb_type_b_tab[0][0], 2, 1);
2458 * Get the GOB height based on picture height.
2460 int ff_h263_get_gob_height(MpegEncContext *s){
2461 if (s->height <= 400)
2463 else if (s->height <= 800)
2470 * decodes the group of blocks header.
2471 * @return <0 if an error occured
2473 static int h263_decode_gob_header(MpegEncContext *s)
2475 unsigned int val, gfid;
2478 /* Check for GOB Start Code */
2479 val = show_bits(&s->gb, 16);
2483 /* We have a GBSC probably with GSTUFF */
2484 skip_bits(&s->gb, 16); /* Drop the zeros */
2485 left= s->gb.size_in_bits - get_bits_count(&s->gb);
2486 //MN: we must check the bits left or we might end in a infinite loop (or segfault)
2487 for(;left>13; left--){
2488 if(get_bits1(&s->gb)) break; /* Seek the '1' bit */
2494 fprintf(stderr,"\nGOB Start Code at MB %d\n", (s->mb_y * s->mb_width) + s->mb_x);
2496 s->gob_number = get_bits(&s->gb, 5); /* GN */
2497 gfid = get_bits(&s->gb, 2); /* GFID */
2498 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
2502 s->mb_y= s->gob_index* s->gob_number;
2503 if(s->mb_y >= s->mb_height)
2506 fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", s->gob_number, gfid, s->qscale);
2511 static inline void memsetw(short *tab, int val, int n)
2518 #ifdef CONFIG_ENCODERS
2520 void ff_mpeg4_init_partitions(MpegEncContext *s)
2522 init_put_bits(&s->tex_pb, s->tex_pb_buffer, PB_BUFFER_SIZE, NULL, NULL);
2523 init_put_bits(&s->pb2 , s->pb2_buffer , PB_BUFFER_SIZE, NULL, NULL);
2526 void ff_mpeg4_merge_partitions(MpegEncContext *s)
2528 const int pb2_len = get_bit_count(&s->pb2 );
2529 const int tex_pb_len= get_bit_count(&s->tex_pb);
2530 const int bits= get_bit_count(&s->pb);
2532 if(s->pict_type==I_TYPE){
2533 put_bits(&s->pb, 19, DC_MARKER);
2534 s->misc_bits+=19 + pb2_len + bits - s->last_bits;
2535 s->i_tex_bits+= tex_pb_len;
2537 put_bits(&s->pb, 17, MOTION_MARKER);
2538 s->misc_bits+=17 + pb2_len;
2539 s->mv_bits+= bits - s->last_bits;
2540 s->p_tex_bits+= tex_pb_len;
2543 flush_put_bits(&s->pb2);
2544 flush_put_bits(&s->tex_pb);
2546 ff_copy_bits(&s->pb, s->pb2_buffer , pb2_len);
2547 ff_copy_bits(&s->pb, s->tex_pb_buffer, tex_pb_len);
2548 s->last_bits= get_bit_count(&s->pb);
2551 #endif //CONFIG_ENCODERS
2553 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
2554 switch(s->pict_type){
2559 return s->f_code+15;
2561 return FFMAX(FFMAX(s->f_code, s->b_code)+15, 17);
2567 #ifdef CONFIG_ENCODERS
2569 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
2571 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
2573 ff_mpeg4_stuffing(&s->pb);
2574 put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0);
2575 put_bits(&s->pb, 1, 1);
2577 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
2578 put_bits(&s->pb, s->quant_precision, s->qscale);
2579 put_bits(&s->pb, 1, 0); /* no HEC */
2582 #endif //CONFIG_ENCODERS
2585 * check if the next stuff is a resync marker or the end.
2588 static inline int mpeg4_is_resync(MpegEncContext *s){
2589 const int bits_count= get_bits_count(&s->gb);
2591 if(s->workaround_bugs&FF_BUG_NO_PADDING){
2595 if(bits_count + 8 >= s->gb.size_in_bits){
2596 int v= show_bits(&s->gb, 8);
2597 v|= 0x7F >> (7-(bits_count&7));
2602 if(show_bits(&s->gb, 16) == ff_mpeg4_resync_prefix[bits_count&7]){
2604 GetBitContext gb= s->gb;
2606 skip_bits(&s->gb, 1);
2607 align_get_bits(&s->gb);
2609 for(len=0; len<32; len++){
2610 if(get_bits1(&s->gb)) break;
2615 if(len>=ff_mpeg4_get_video_packet_prefix_length(s))
2623 * decodes the next video packet.
2624 * @return <0 if something went wrong
2626 static int mpeg4_decode_video_packet_header(MpegEncContext *s)
2628 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
2629 int header_extension=0, mb_num, len;
2631 /* is there enough space left for a video packet + header */
2632 if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1;
2634 for(len=0; len<32; len++){
2635 if(get_bits1(&s->gb)) break;
2638 if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
2639 printf("marker does not match f_code\n");
2643 if(s->shape != RECT_SHAPE){
2644 header_extension= get_bits1(&s->gb);
2645 //FIXME more stuff here
2648 mb_num= get_bits(&s->gb, mb_num_bits);
2649 if(mb_num>=s->mb_num){
2650 fprintf(stderr, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);
2653 if(s->pict_type == B_TYPE){
2654 while(s->next_picture.mbskip_table[ s->mb_index2xy[ mb_num ] ]) mb_num++;
2655 if(mb_num >= s->mb_num) return -1; // slice contains just skiped MBs which where allready decoded
2658 s->mb_x= mb_num % s->mb_width;
2659 s->mb_y= mb_num / s->mb_width;
2661 if(s->shape != BIN_ONLY_SHAPE){
2662 int qscale= get_bits(&s->gb, s->quant_precision);
2667 if(s->shape == RECT_SHAPE){
2668 header_extension= get_bits1(&s->gb);
2670 if(header_extension){
2674 while (get_bits1(&s->gb) != 0)
2677 check_marker(&s->gb, "before time_increment in video packed header");
2678 time_increment= get_bits(&s->gb, s->time_increment_bits);
2679 check_marker(&s->gb, "before vop_coding_type in video packed header");
2681 skip_bits(&s->gb, 2); /* vop coding type */
2682 //FIXME not rect stuff here
2684 if(s->shape != BIN_ONLY_SHAPE){
2685 skip_bits(&s->gb, 3); /* intra dc vlc threshold */
2686 //FIXME dont just ignore everything
2687 if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2688 mpeg4_decode_sprite_trajectory(s);
2689 fprintf(stderr, "untested\n");
2692 //FIXME reduced res stuff here
2694 if (s->pict_type != I_TYPE) {
2695 int f_code = get_bits(&s->gb, 3); /* fcode_for */
2697 printf("Error, video packet header damaged (f_code=0)\n");
2700 if (s->pict_type == B_TYPE) {
2701 int b_code = get_bits(&s->gb, 3);
2703 printf("Error, video packet header damaged (b_code=0)\n");
2708 //FIXME new-pred stuff
2710 //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));
2715 void ff_mpeg4_clean_buffers(MpegEncContext *s)
2717 int c_wrap, c_xy, l_wrap, l_xy;
2719 l_wrap= s->block_wrap[0];
2720 l_xy= s->mb_y*l_wrap*2 + s->mb_x*2;
2721 c_wrap= s->block_wrap[4];
2722 c_xy= s->mb_y*c_wrap + s->mb_x;
2726 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
2727 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
2728 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
2732 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t));
2733 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
2734 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
2737 // we cant clear the MVs as they might be needed by a b frame
2738 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t));
2739 // memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
2740 s->last_mv[0][0][0]=
2741 s->last_mv[0][0][1]=
2742 s->last_mv[1][0][0]=
2743 s->last_mv[1][0][1]= 0;
2747 * decodes the group of blocks / video packet header.
2748 * @return <0 if no resync found
2750 int ff_h263_resync(MpegEncContext *s){
2753 if(s->codec_id==CODEC_ID_MPEG4)
2756 align_get_bits(&s->gb);
2758 if(show_bits(&s->gb, 16)==0){
2759 if(s->codec_id==CODEC_ID_MPEG4)
2760 ret= mpeg4_decode_video_packet_header(s);
2762 ret= h263_decode_gob_header(s);
2766 //ok, its not where its supposed to be ...
2767 s->gb= s->last_resync_gb;
2768 align_get_bits(&s->gb);
2769 left= s->gb.size_in_bits - get_bits_count(&s->gb);
2771 for(;left>16+1+5+5; left-=8){
2772 if(show_bits(&s->gb, 16)==0){
2773 GetBitContext bak= s->gb;
2775 if(s->codec_id==CODEC_ID_MPEG4)
2776 ret= mpeg4_decode_video_packet_header(s);
2778 ret= h263_decode_gob_header(s);
2784 skip_bits(&s->gb, 8);
2791 * gets the average motion vector for a GMC MB.
2792 * @param n either 0 for the x component or 1 for y
2793 * @returns the average MV for a GMC MB
2795 static inline int get_amv(MpegEncContext *s, int n){
2796 int x, y, mb_v, sum, dx, dy, shift;
2797 int len = 1 << (s->f_code + 4);
2798 const int a= s->sprite_warping_accuracy;
2800 if(s->real_sprite_warping_points==1){
2801 if(s->divx_version==500 && s->divx_build==413)
2802 sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample));
2804 sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a);
2806 dx= s->sprite_delta[n][0];
2807 dy= s->sprite_delta[n][1];
2808 shift= s->sprite_shift[0];
2809 if(n) dy -= 1<<(shift + a + 1);
2810 else dx -= 1<<(shift + a + 1);
2811 mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16;
2814 for(y=0; y<16; y++){
2818 //XXX FIXME optimize
2819 for(x=0; x<16; x++){
2824 sum= RSHIFT(sum, a+8-s->quarter_sample);
2827 if (sum < -len) sum= -len;
2828 else if (sum >= len) sum= len-1;
2834 * decodes first partition.
2835 * @return number of MBs decoded or <0 if an error occured
2837 static int mpeg4_decode_partition_a(MpegEncContext *s){
2839 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
2841 /* decode first partition */
2843 s->first_slice_line=1;
2844 for(; s->mb_y<s->mb_height; s->mb_y++){
2845 ff_init_block_index(s);
2846 for(; s->mb_x<s->mb_width; s->mb_x++){
2847 const int xy= s->mb_x + s->mb_y*s->mb_stride;
2852 ff_update_block_index(s);
2853 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
2854 s->first_slice_line=0;
2856 if(s->pict_type==I_TYPE){
2859 if(show_bits_long(&s->gb, 19)==DC_MARKER){
2863 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
2866 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
2869 s->cbp_table[xy]= cbpc & 3;
2870 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
2874 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2876 s->current_picture.qscale_table[xy]= s->qscale;
2878 s->mbintra_table[xy]= 1;
2881 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
2883 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
2887 if(dc_pred_dir) dir|=1;
2889 s->pred_dir_table[xy]= dir;
2890 }else{ /* P/S_TYPE */
2891 int mx, my, pred_x, pred_y, bits;
2892 int16_t * const mot_val= s->motion_val[s->block_index[0]];
2893 const int stride= s->block_wrap[0]*2;
2895 bits= show_bits(&s->gb, 17);
2896 if(bits==MOTION_MARKER){
2902 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2903 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
2907 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
2910 mot_val[0 ]= mot_val[2 ]=
2911 mot_val[0+stride]= mot_val[2+stride]= mx;
2912 mot_val[1 ]= mot_val[3 ]=
2913 mot_val[1+stride]= mot_val[3+stride]= my;
2915 if(s->mbintra_table[xy])
2916 ff_clean_intra_table_entries(s);
2919 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
2921 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
2926 else if (cbpc == 20)
2927 fprintf(stderr, "Stuffing !");
2928 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
2930 s->mb_intra = ((cbpc & 4) != 0);
2933 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
2934 s->mbintra_table[xy]= 1;
2935 mot_val[0 ]= mot_val[2 ]=
2936 mot_val[0+stride]= mot_val[2+stride]= 0;
2937 mot_val[1 ]= mot_val[3 ]=
2938 mot_val[1+stride]= mot_val[3+stride]= 0;
2940 if(s->mbintra_table[xy])
2941 ff_clean_intra_table_entries(s);
2943 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
2944 s->mcsel= get_bits1(&s->gb);
2947 if ((cbpc & 16) == 0) {
2948 /* 16x16 motion prediction */
2950 h263_pred_motion(s, 0, &pred_x, &pred_y);
2952 mx = h263_decode_motion(s, pred_x, s->f_code);
2956 my = h263_decode_motion(s, pred_y, s->f_code);
2959 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
2963 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
2966 mot_val[0 ]= mot_val[2 ] =
2967 mot_val[0+stride]= mot_val[2+stride]= mx;
2968 mot_val[1 ]= mot_val[3 ]=
2969 mot_val[1+stride]= mot_val[3+stride]= my;
2972 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
2974 int16_t *mot_val= h263_pred_motion(s, i, &pred_x, &pred_y);
2975 mx = h263_decode_motion(s, pred_x, s->f_code);
2979 my = h263_decode_motion(s, pred_y, s->f_code);
2996 * decode second partition.
2997 * @return <0 if an error occured
2999 static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
3001 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3003 s->mb_x= s->resync_mb_x;
3004 s->first_slice_line=1;
3005 for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
3006 ff_init_block_index(s);
3007 for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
3008 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3011 ff_update_block_index(s);
3012 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3013 s->first_slice_line=0;
3015 if(s->pict_type==I_TYPE){
3016 int ac_pred= get_bits1(&s->gb);
3017 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3019 fprintf(stderr, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3023 s->cbp_table[xy]|= cbpy<<2;
3024 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3025 }else{ /* P || S_TYPE */
3026 if(IS_INTRA(s->current_picture.mb_type[xy])){
3028 int ac_pred = get_bits1(&s->gb);
3029 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3032 fprintf(stderr, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3036 if(s->cbp_table[xy] & 8) {
3037 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
3039 s->current_picture.qscale_table[xy]= s->qscale;
3043 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3045 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3049 if(dc_pred_dir) dir|=1;
3051 s->cbp_table[xy]&= 3; //remove dquant
3052 s->cbp_table[xy]|= cbpy<<2;
3053 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3054 s->pred_dir_table[xy]= dir;
3055 }else if(IS_SKIP(s->current_picture.mb_type[xy])){
3056 s->current_picture.qscale_table[xy]= s->qscale;
3057 s->cbp_table[xy]= 0;
3059 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3062 fprintf(stderr, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3066 if(s->cbp_table[xy] & 8) {
3067 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
3069 s->current_picture.qscale_table[xy]= s->qscale;
3071 s->cbp_table[xy]&= 3; //remove dquant
3072 s->cbp_table[xy]|= (cbpy^0xf)<<2;
3076 if(mb_num >= mb_count) return 0;
3083 * decodes the first & second partition
3084 * @return <0 if error (and sets error type in the error_status_table)
3086 int ff_mpeg4_decode_partitions(MpegEncContext *s)
3089 const int part_a_error= s->pict_type==I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR;
3090 const int part_a_end = s->pict_type==I_TYPE ? (DC_END |MV_END) : MV_END;
3092 mb_num= mpeg4_decode_partition_a(s);
3094 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3098 if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
3099 fprintf(stderr, "slice below monitor ...\n");
3100 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3104 s->mb_num_left= mb_num;
3106 if(s->pict_type==I_TYPE){
3107 if(get_bits_long(&s->gb, 19)!=DC_MARKER){
3108 fprintf(stderr, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
3112 if(get_bits(&s->gb, 17)!=MOTION_MARKER){
3113 fprintf(stderr, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
3117 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end);
3119 if( mpeg4_decode_partition_b(s, mb_num) < 0){
3120 if(s->pict_type==P_TYPE)
3121 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR);
3124 if(s->pict_type==P_TYPE)
3125 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END);
3132 * decode partition C of one MB.
3133 * @return <0 if an error occured
3135 static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64])
3138 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3140 mb_type= s->current_picture.mb_type[xy];
3141 cbp = s->cbp_table[xy];
3143 if(s->current_picture.qscale_table[xy] != s->qscale){
3144 s->qscale= s->current_picture.qscale_table[xy];
3145 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
3146 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
3149 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
3152 s->mv[0][i][0] = s->motion_val[ s->block_index[i] ][0];
3153 s->mv[0][i][1] = s->motion_val[ s->block_index[i] ][1];
3155 s->mb_intra = IS_INTRA(mb_type);
3157 if (IS_SKIP(mb_type)) {
3160 s->block_last_index[i] = -1;
3161 s->mv_dir = MV_DIR_FORWARD;
3162 s->mv_type = MV_TYPE_16X16;
3163 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3170 }else if(s->mb_intra){
3171 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3172 }else if(!s->mb_intra){
3173 // s->mcsel= 0; //FIXME do we need to init that
3175 s->mv_dir = MV_DIR_FORWARD;
3176 if (IS_8X8(mb_type)) {
3177 s->mv_type = MV_TYPE_8X8;
3179 s->mv_type = MV_TYPE_16X16;
3182 } else { /* I-Frame */
3184 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3187 if (!IS_SKIP(mb_type)) {
3189 /* decode each block */
3190 for (i = 0; i < 6; i++) {
3191 if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){
3192 fprintf(stderr, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra);
3199 /* per-MB end of slice check */
3201 if(--s->mb_num_left <= 0){
3202 //printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb));
3203 if(mpeg4_is_resync(s))
3208 if(mpeg4_is_resync(s)){
3209 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
3210 if(s->cbp_table[xy+delta])
3217 int ff_h263_decode_mb(MpegEncContext *s,
3218 DCTELEM block[6][64])
3220 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
3222 static int8_t quant_tab[4] = { -1, -2, 1, 2 };
3223 const int xy= s->mb_x + s->mb_y * s->mb_stride;
3225 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
3226 if (get_bits1(&s->gb)) {
3230 s->block_last_index[i] = -1;
3231 s->mv_dir = MV_DIR_FORWARD;
3232 s->mv_type = MV_TYPE_16X16;
3233 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3234 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
3236 s->mv[0][0][0]= get_amv(s, 0);
3237 s->mv[0][0][1]= get_amv(s, 1);
3241 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3249 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3250 //fprintf(stderr, "\tCBPC: %d", cbpc);
3255 else if (cbpc == 20)
3256 fprintf(stderr, "Stuffing !");
3259 s->mb_intra = ((cbpc & 4) != 0);
3260 if (s->mb_intra) goto intra;
3262 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
3263 s->mcsel= get_bits1(&s->gb);
3265 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3266 cbp = (cbpc & 3) | ((cbpy ^ 0xf) << 2);
3268 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
3270 if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE)))
3271 s->interlaced_dct= get_bits1(&s->gb);
3273 s->mv_dir = MV_DIR_FORWARD;
3274 if ((cbpc & 16) == 0) {
3276 s->current_picture.mb_type[xy]= MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
3277 /* 16x16 global motion prediction */
3278 s->mv_type = MV_TYPE_16X16;
3281 s->mv[0][0][0] = mx;
3282 s->mv[0][0][1] = my;
3283 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
3284 s->current_picture.mb_type[xy]= MB_TYPE_16x8 | MB_TYPE_L0 | MB_TYPE_INTERLACED;
3285 /* 16x8 field motion prediction */
3286 s->mv_type= MV_TYPE_FIELD;
3288 s->field_select[0][0]= get_bits1(&s->gb);
3289 s->field_select[0][1]= get_bits1(&s->gb);
3291 h263_pred_motion(s, 0, &pred_x, &pred_y);
3294 mx = h263_decode_motion(s, pred_x, s->f_code);
3298 my = h263_decode_motion(s, pred_y/2, s->f_code);
3302 s->mv[0][i][0] = mx;
3303 s->mv[0][i][1] = my;
3306 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3307 /* 16x16 motion prediction */
3308 s->mv_type = MV_TYPE_16X16;
3309 h263_pred_motion(s, 0, &pred_x, &pred_y);
3311 mx = h263p_decode_umotion(s, pred_x);
3313 mx = h263_decode_motion(s, pred_x, s->f_code);
3319 my = h263p_decode_umotion(s, pred_y);
3321 my = h263_decode_motion(s, pred_y, s->f_code);
3325 s->mv[0][0][0] = mx;
3326 s->mv[0][0][1] = my;
3328 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3329 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3332 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3333 s->mv_type = MV_TYPE_8X8;
3335 mot_val = h263_pred_motion(s, i, &pred_x, &pred_y);
3337 mx = h263p_decode_umotion(s, pred_x);
3339 mx = h263_decode_motion(s, pred_x, s->f_code);
3344 my = h263p_decode_umotion(s, pred_y);
3346 my = h263_decode_motion(s, pred_y, s->f_code);
3349 s->mv[0][i][0] = mx;
3350 s->mv[0][i][1] = my;
3351 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3352 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3357 } else if(s->pict_type==B_TYPE) {
3358 int modb1; // first bit of modb
3359 int modb2; // second bit of modb
3362 s->mb_intra = 0; //B-frames never contain intra blocks
3363 s->mcsel=0; // ... true gmc blocks
3367 s->last_mv[i][0][0]=
3368 s->last_mv[i][0][1]=
3369 s->last_mv[i][1][0]=
3370 s->last_mv[i][1][1]= 0;
3374 /* if we skipped it in the future P Frame than skip it now too */
3375 s->mb_skiped= s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]; // Note, skiptab=0 if last was GMC
3380 s->block_last_index[i] = -1;
3382 s->mv_dir = MV_DIR_FORWARD;
3383 s->mv_type = MV_TYPE_16X16;
3388 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3392 modb1= get_bits1(&s->gb);
3394 mb_type= MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1; //like MB_TYPE_B_DIRECT but no vectors coded
3397 modb2= get_bits1(&s->gb);
3398 mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
3400 printf("illegal MB_type\n");
3403 mb_type= mb_type_b_map[ mb_type ];
3405 else cbp= get_bits(&s->gb, 6);
3407 if ((!IS_DIRECT(mb_type)) && cbp) {
3408 if(get_bits1(&s->gb)){
3409 change_qscale(s, get_bits1(&s->gb)*4 - 2);
3413 if(!s->progressive_sequence){
3415 s->interlaced_dct= get_bits1(&s->gb);
3417 if(!IS_DIRECT(mb_type) && get_bits1(&s->gb)){
3418 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
3419 mb_type &= ~MB_TYPE_16x16;
3421 if(USES_LIST(mb_type, 0)){
3422 s->field_select[0][0]= get_bits1(&s->gb);
3423 s->field_select[0][1]= get_bits1(&s->gb);
3425 if(USES_LIST(mb_type, 1)){
3426 s->field_select[1][0]= get_bits1(&s->gb);
3427 s->field_select[1][1]= get_bits1(&s->gb);
3433 if((mb_type & (MB_TYPE_DIRECT2|MB_TYPE_INTERLACED)) == 0){
3434 s->mv_type= MV_TYPE_16X16;
3436 if(USES_LIST(mb_type, 0)){
3437 s->mv_dir = MV_DIR_FORWARD;
3439 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
3440 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
3441 s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
3442 s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
3445 if(USES_LIST(mb_type, 1)){
3446 s->mv_dir |= MV_DIR_BACKWARD;
3448 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
3449 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
3450 s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
3451 s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
3453 }else if(!IS_DIRECT(mb_type)){
3454 s->mv_type= MV_TYPE_FIELD;
3456 if(USES_LIST(mb_type, 0)){
3457 s->mv_dir = MV_DIR_FORWARD;
3460 mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code);
3461 my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
3462 s->last_mv[0][i][0]= s->mv[0][i][0] = mx;
3463 s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
3467 if(USES_LIST(mb_type, 1)){
3468 s->mv_dir |= MV_DIR_BACKWARD;
3471 mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code);
3472 my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
3473 s->last_mv[1][i][0]= s->mv[1][i][0] = mx;
3474 s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
3480 if(IS_DIRECT(mb_type)){
3481 if(IS_SKIP(mb_type))
3484 mx = h263_decode_motion(s, 0, 1);
3485 my = h263_decode_motion(s, 0, 1);
3488 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3489 mb_type |= ff_mpeg4_set_direct_mv(s, mx, my);
3491 s->current_picture.mb_type[xy]= mb_type;
3492 } else { /* I-Frame */
3493 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
3499 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3500 if (s->h263_pred || s->h263_aic) {
3501 s->ac_pred = get_bits1(&s->gb);
3503 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
3506 s->h263_aic_dir = get_bits1(&s->gb);
3511 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3512 if(cbpy<0) return -1;
3513 cbp = (cbpc & 3) | (cbpy << 2);
3515 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
3518 if(!s->progressive_sequence)
3519 s->interlaced_dct= get_bits1(&s->gb);
3521 /* decode each block */
3523 for (i = 0; i < 6; i++) {
3524 if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0)
3529 for (i = 0; i < 6; i++) {
3530 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
3538 /* decode each block */
3540 for (i = 0; i < 6; i++) {
3541 if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0)
3546 for (i = 0; i < 6; i++) {
3547 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
3554 /* per-MB end of slice check */
3555 if(s->codec_id==CODEC_ID_MPEG4){
3556 if(mpeg4_is_resync(s)){
3557 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
3558 if(s->pict_type==B_TYPE && s->next_picture.mbskip_table[xy + delta])
3563 int v= show_bits(&s->gb, 16);
3565 if(get_bits_count(&s->gb) + 16 > s->gb.size_in_bits){
3566 v>>= get_bits_count(&s->gb) + 16 - s->gb.size_in_bits;
3576 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
3578 int code, val, sign, shift, l;
3579 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
3586 sign = get_bits1(&s->gb);
3590 val = (val - 1) << shift;
3591 val |= get_bits(&s->gb, shift);
3598 /* modulo decoding */
3599 if (!s->h263_long_vectors) {
3600 l = 1 << (f_code + 4);
3601 val = ((val + l)&(l*2-1)) - l;
3603 /* horrible h263 long vector mode */
3604 if (pred < -31 && val < -63)
3606 if (pred > 32 && val > 63)
3613 /* Decodes RVLC of H.263+ UMV */
3614 static int h263p_decode_umotion(MpegEncContext * s, int pred)
3618 if (get_bits1(&s->gb)) /* Motion difference = 0 */
3621 code = 2 + get_bits1(&s->gb);
3623 while (get_bits1(&s->gb))
3626 code += get_bits1(&s->gb);
3631 code = (sign) ? (pred - code) : (pred + code);
3633 fprintf(stderr,"H.263+ UMV Motion = %d\n", code);
3639 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
3642 int code, level, i, j, last, run;
3643 RLTable *rl = &rl_inter;
3644 const uint8_t *scan_table;
3646 scan_table = s->intra_scantable.permutated;
3647 if (s->h263_aic && s->mb_intra) {
3651 if (s->h263_aic_dir)
3652 scan_table = s->intra_v_scantable.permutated; /* left */
3654 scan_table = s->intra_h_scantable.permutated; /* top */
3656 } else if (s->mb_intra) {
3659 if (s->rv10_version == 3 && s->pict_type == I_TYPE) {
3660 int component, diff;
3661 component = (n <= 3 ? 0 : n - 4 + 1);
3662 level = s->last_dc[component];
3663 if (s->rv10_first_dc_coded[component]) {
3664 diff = rv_decode_dc(s, n);
3668 level = level & 0xff; /* handle wrap round */
3669 s->last_dc[component] = level;
3671 s->rv10_first_dc_coded[component] = 1;
3674 level = get_bits(&s->gb, 8);
3677 level = get_bits(&s->gb, 8);
3678 if((level&0x7F) == 0){
3679 fprintf(stderr, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y);
3691 if (s->mb_intra && s->h263_aic)
3693 s->block_last_index[n] = i - 1;
3698 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
3700 fprintf(stderr, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
3703 if (code == rl->n) {
3705 if (s->h263_flv > 1) {
3706 int is11 = get_bits1(&s->gb);
3707 last = get_bits1(&s->gb);
3708 run = get_bits(&s->gb, 6);
3710 level = get_sbits(&s->gb, 11);
3712 level = get_sbits(&s->gb, 7);
3715 last = get_bits1(&s->gb);
3716 run = get_bits(&s->gb, 6);
3717 level = (int8_t)get_bits(&s->gb, 8);
3720 /* XXX: should patch encoder too */
3721 level = get_sbits(&s->gb, 12);
3723 level = get_bits(&s->gb, 5);
3724 level |= get_sbits(&s->gb, 6)<<5;
3729 run = rl->table_run[code];
3730 level = rl->table_level[code];
3731 last = code >= rl->last;
3732 if (get_bits1(&s->gb))
3737 fprintf(stderr, "run overflow at %dx%d\n", s->mb_x, s->mb_y);
3747 if (s->mb_intra && s->h263_aic) {
3748 h263_pred_acdc(s, block, n);
3751 s->block_last_index[n] = i;
3756 * decodes the dc value.
3757 * @param n block index (0-3 are luma, 4-5 are chroma)
3758 * @param dir_ptr the prediction direction will be stored here
3759 * @return the quantized dc
3761 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
3763 int level, pred, code;
3767 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
3769 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
3770 if (code < 0 || code > 9 /* && s->nbit<9 */){
3771 fprintf(stderr, "illegal dc vlc\n");
3779 level= 2*get_bits1(&s->gb)-1;
3781 if(get_bits1(&s->gb))
3782 level = get_bits(&s->gb, code-1) + (1<<(code-1));
3784 level = -get_bits(&s->gb, code-1) - (1<<(code-1));
3787 level = get_xbits(&s->gb, code);
3791 if(get_bits1(&s->gb)==0){ /* marker */
3792 if(s->error_resilience>=2){
3793 fprintf(stderr, "dc marker bit missing\n");
3799 pred = ff_mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
3802 if(s->error_resilience>=3){
3803 fprintf(stderr, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
3809 *dc_val = level * s->y_dc_scale;
3811 *dc_val = level * s->c_dc_scale;
3814 *dc_val = level * 8;
3816 if(s->error_resilience>=3){
3817 if(*dc_val > 2048 + s->y_dc_scale + s->c_dc_scale){
3818 fprintf(stderr, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
3827 * @return <0 if an error occured
3829 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
3830 int n, int coded, int intra, int rvlc)
3832 int level, i, last, run;
3835 RL_VLC_ELEM * rl_vlc;
3836 const uint8_t * scan_table;
3839 //Note intra & rvlc should be optimized away if this is inlined
3843 if(s->partitioned_frame){
3844 level = s->dc_val[0][ s->block_index[n] ];
3845 if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale);
3846 else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale);
3847 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32;
3849 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
3859 rl = &rvlc_rl_intra;
3860 rl_vlc = rvlc_rl_intra.rl_vlc[0];
3863 rl_vlc = rl_intra.rl_vlc[0];
3866 if (dc_pred_dir == 0)
3867 scan_table = s->intra_v_scantable.permutated; /* left */
3869 scan_table = s->intra_h_scantable.permutated; /* top */
3871 scan_table = s->intra_scantable.permutated;
3878 s->block_last_index[n] = i;
3881 if(rvlc) rl = &rvlc_rl_inter;
3882 else rl = &rl_inter;
3884 scan_table = s->intra_scantable.permutated;
3890 rl_vlc = rvlc_rl_inter.rl_vlc[0];
3892 rl_vlc = rl_inter.rl_vlc[0];
3895 qmul = s->qscale << 1;
3896 qadd = (s->qscale - 1) | 1;
3898 rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale];
3900 rl_vlc = rl_inter.rl_vlc[s->qscale];
3905 OPEN_READER(re, &s->gb);
3907 UPDATE_CACHE(re, &s->gb);
3908 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
3912 if(SHOW_UBITS(re, &s->gb, 1)==0){
3913 fprintf(stderr, "1. marker bit missing in rvlc esc\n");
3915 }; SKIP_CACHE(re, &s->gb, 1);
3917 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
3918 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
3919 SKIP_COUNTER(re, &s->gb, 1+1+6);
3920 UPDATE_CACHE(re, &s->gb);
3922 if(SHOW_UBITS(re, &s->gb, 1)==0){
3923 fprintf(stderr, "2. marker bit missing in rvlc esc\n");
3925 }; SKIP_CACHE(re, &s->gb, 1);
3927 level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11);
3929 if(SHOW_UBITS(re, &s->gb, 5)!=0x10){
3930 fprintf(stderr, "reverse esc missing\n");
3932 }; SKIP_CACHE(re, &s->gb, 5);
3934 level= level * qmul + qadd;
3935 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1);
3936 SKIP_COUNTER(re, &s->gb, 1+11+5+1);
3942 cache= GET_CACHE(re, &s->gb);
3945 cache ^= 0xC0000000;
3947 if (cache&0x80000000) {
3948 if (cache&0x40000000) {
3950 SKIP_CACHE(re, &s->gb, 2);
3951 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
3952 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
3953 SKIP_COUNTER(re, &s->gb, 2+1+6);
3954 UPDATE_CACHE(re, &s->gb);
3957 level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12);
3959 if(SHOW_UBITS(re, &s->gb, 1)==0){
3960 fprintf(stderr, "1. marker bit missing in 3. esc\n");
3962 }; SKIP_CACHE(re, &s->gb, 1);
3964 level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
3966 if(SHOW_UBITS(re, &s->gb, 1)==0){
3967 fprintf(stderr, "2. marker bit missing in 3. esc\n");
3969 }; LAST_SKIP_CACHE(re, &s->gb, 1);
3971 SKIP_COUNTER(re, &s->gb, 1+12+1);
3974 if(level*s->qscale>1024 || level*s->qscale<-1024){
3975 fprintf(stderr, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
3980 const int abs_level= ABS(level);
3981 if(abs_level<=MAX_LEVEL && run<=MAX_RUN && !(s->workaround_bugs&FF_BUG_AC_VLC)){
3982 const int run1= run - rl->max_run[last][abs_level] - 1;
3983 if(abs_level <= rl->max_level[last][run]){
3984 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
3987 if(s->error_resilience > FF_ER_COMPLIANT){
3988 if(abs_level <= rl->max_level[last][run]*2){
3989 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
3992 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
3993 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
4000 if (level>0) level= level * qmul + qadd;
4001 else level= level * qmul - qadd;
4007 #if MIN_CACHE_BITS < 20
4008 LAST_SKIP_BITS(re, &s->gb, 2);
4009 UPDATE_CACHE(re, &s->gb);
4011 SKIP_BITS(re, &s->gb, 2);
4013 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
4014 i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing
4015 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4016 LAST_SKIP_BITS(re, &s->gb, 1);
4020 #if MIN_CACHE_BITS < 19
4021 LAST_SKIP_BITS(re, &s->gb, 1);
4022 UPDATE_CACHE(re, &s->gb);
4024 SKIP_BITS(re, &s->gb, 1);
4026 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
4028 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
4029 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4030 LAST_SKIP_BITS(re, &s->gb, 1);
4035 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4036 LAST_SKIP_BITS(re, &s->gb, 1);
4041 fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
4045 block[scan_table[i]] = level;
4049 block[scan_table[i]] = level;
4051 CLOSE_READER(re, &s->gb);
4055 mpeg4_pred_ac(s, block, n, dc_pred_dir);
4057 i = 63; /* XXX: not optimal */
4060 s->block_last_index[n] = i;
4064 /* most is hardcoded. should extend to handle all h263 streams */
4065 int h263_decode_picture_header(MpegEncContext *s)
4067 int format, width, height, i;
4070 align_get_bits(&s->gb);
4072 startcode= get_bits(&s->gb, 22-8);
4074 for(i= s->gb.size_in_bits - get_bits_count(&s->gb); i>24; i-=8) {
4075 startcode = ((startcode << 8) | get_bits(&s->gb, 8)) & 0x003FFFFF;
4077 if(startcode == 0x20)
4081 if (startcode != 0x20) {
4082 fprintf(stderr, "Bad picture start code\n");
4085 /* temporal reference */
4086 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
4088 /* PTYPE starts here */
4089 if (get_bits1(&s->gb) != 1) {
4091 fprintf(stderr, "Bad marker\n");
4094 if (get_bits1(&s->gb) != 0) {
4095 fprintf(stderr, "Bad H263 id\n");
4096 return -1; /* h263 id */
4098 skip_bits1(&s->gb); /* split screen off */
4099 skip_bits1(&s->gb); /* camera off */
4100 skip_bits1(&s->gb); /* freeze picture release off */
4102 /* Reset GOB number */
4105 format = get_bits(&s->gb, 3);
4110 7 extended PTYPE (PLUSPTYPE)
4113 if (format != 7 && format != 6) {
4116 width = h263_format[format][0];
4117 height = h263_format[format][1];
4121 s->pict_type = I_TYPE + get_bits1(&s->gb);
4123 s->unrestricted_mv = get_bits1(&s->gb);
4124 s->h263_long_vectors = s->unrestricted_mv;
4126 if (get_bits1(&s->gb) != 0) {
4127 fprintf(stderr, "H263 SAC not supported\n");
4128 return -1; /* SAC: off */
4130 if (get_bits1(&s->gb) != 0) {
4131 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
4134 if (get_bits1(&s->gb) != 0) {
4135 fprintf(stderr, "H263 PB frame not supported\n");
4136 return -1; /* not PB frame */
4138 s->qscale = get_bits(&s->gb, 5);
4139 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
4148 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
4150 /* ufep other than 0 and 1 are reserved */
4153 format = get_bits(&s->gb, 3);
4154 dprintf("ufep=1, format: %d\n", format);
4155 skip_bits(&s->gb,1); /* Custom PCF */
4156 s->umvplus = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */
4157 skip_bits1(&s->gb); /* Syntax-based Arithmetic Coding (SAC) */
4158 if (get_bits1(&s->gb) != 0) {
4159 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
4161 if (get_bits1(&s->gb) != 0) { /* Advanced Intra Coding (AIC) */
4165 if (get_bits1(&s->gb) != 0) {
4166 fprintf(stderr, "Deblocking Filter not supported\n");
4168 if (get_bits1(&s->gb) != 0) {
4169 fprintf(stderr, "Slice Structured not supported\n");
4171 if (get_bits1(&s->gb) != 0) {
4172 fprintf(stderr, "Reference Picture Selection not supported\n");
4174 if (get_bits1(&s->gb) != 0) {
4175 fprintf(stderr, "Independent Segment Decoding not supported\n");
4177 if (get_bits1(&s->gb) != 0) {
4178 fprintf(stderr, "Alternative Inter VLC not supported\n");
4180 if (get_bits1(&s->gb) != 0) {
4181 fprintf(stderr, "Modified Quantization not supported\n");
4184 skip_bits(&s->gb, 1); /* Prevent start code emulation */
4186 skip_bits(&s->gb, 3); /* Reserved */
4187 } else if (ufep != 0) {
4188 fprintf(stderr, "Bad UFEP type (%d)\n", ufep);
4193 s->pict_type = get_bits(&s->gb, 3) + I_TYPE;
4194 dprintf("pict_type: %d\n", s->pict_type);
4195 if (s->pict_type != I_TYPE &&
4196 s->pict_type != P_TYPE)
4198 skip_bits(&s->gb, 2);
4199 s->no_rounding = get_bits1(&s->gb);
4200 dprintf("RTYPE: %d\n", s->no_rounding);
4201 skip_bits(&s->gb, 4);
4203 /* Get the picture dimensions */
4206 /* Custom Picture Format (CPFMT) */
4207 s->aspect_ratio_info = get_bits(&s->gb, 4);
4208 dprintf("aspect: %d\n", s->aspect_ratio_info);
4213 3 - 10:11 (525-type 4:3)
4214 4 - 16:11 (CIF 16:9)
4215 5 - 40:33 (525-type 16:9)
4218 width = (get_bits(&s->gb, 9) + 1) * 4;
4220 height = get_bits(&s->gb, 9) * 4;
4221 dprintf("\nH.263+ Custom picture: %dx%d\n",width,height);
4222 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
4223 /* aspected dimensions */
4224 s->aspected_width = get_bits(&s->gb, 8);
4225 s->aspected_height = get_bits(&s->gb, 8);
4227 s->aspected_width = pixel_aspect[s->aspect_ratio_info][0];
4228 s->aspected_height= pixel_aspect[s->aspect_ratio_info][1];
4231 width = h263_format[format][0];
4232 height = h263_format[format][1];
4234 if ((width == 0) || (height == 0))
4239 if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
4244 s->qscale = get_bits(&s->gb, 5);
4247 while (get_bits1(&s->gb) != 0) {
4248 skip_bits(&s->gb, 8);
4253 s->y_dc_scale_table=
4254 s->c_dc_scale_table= h263_aic_dc_scale_table;
4256 s->y_dc_scale_table=
4257 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
4260 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
4261 printf("qp:%d %c size:%d rnd:%d %s %s %s %s\n",
4262 s->qscale, av_get_pict_type_char(s->pict_type),
4263 s->gb.size_in_bits, 1-s->no_rounding,
4264 s->mv_type == MV_TYPE_8X8 ? "ADV" : "",
4265 s->umvplus ? "UMV" : "",
4266 s->h263_long_vectors ? "LONG" : "",
4267 s->h263_plus ? "+" : ""
4275 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s)
4278 int a= 2<<s->sprite_warping_accuracy;
4279 int rho= 3-s->sprite_warping_accuracy;
4281 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
4282 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
4283 int sprite_ref[4][2];
4284 int virtual_ref[2][2];
4286 int alpha=0, beta=0;
4291 for(i=0; i<s->num_sprite_warping_points; i++){
4295 length= get_vlc(&s->gb, &sprite_trajectory);
4297 x= get_xbits(&s->gb, length);
4299 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(&s->gb); /* marker bit */
4301 length= get_vlc(&s->gb, &sprite_trajectory);
4303 y=get_xbits(&s->gb, length);
4305 skip_bits1(&s->gb); /* marker bit */
4306 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
4311 while((1<<alpha)<w) alpha++;
4312 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
4316 // Note, the 4th point isnt used for GMC
4317 if(s->divx_version==500 && s->divx_build==413){
4318 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
4319 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
4320 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
4321 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
4322 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
4323 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
4325 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
4326 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
4327 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
4328 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
4329 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
4330 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
4332 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
4333 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
4335 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
4336 // perhaps it should be reordered to be more readable ...
4337 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
4338 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
4339 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
4340 + 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);
4341 virtual_ref[0][1]= 16*vop_ref[0][1]
4342 + 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);
4343 virtual_ref[1][0]= 16*vop_ref[0][0]
4344 + 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);
4345 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
4346 + 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);
4348 switch(s->num_sprite_warping_points)
4351 s->sprite_offset[0][0]= 0;
4352 s->sprite_offset[0][1]= 0;
4353 s->sprite_offset[1][0]= 0;
4354 s->sprite_offset[1][1]= 0;
4355 s->sprite_delta[0][0]= a;
4356 s->sprite_delta[0][1]= 0;
4357 s->sprite_delta[1][0]= 0;
4358 s->sprite_delta[1][1]= a;
4359 s->sprite_shift[0]= 0;
4360 s->sprite_shift[1]= 0;
4363 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
4364 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
4365 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
4366 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
4367 s->sprite_delta[0][0]= a;
4368 s->sprite_delta[0][1]= 0;
4369 s->sprite_delta[1][0]= 0;
4370 s->sprite_delta[1][1]= a;
4371 s->sprite_shift[0]= 0;
4372 s->sprite_shift[1]= 0;
4375 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
4376 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
4377 + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])
4378 + (1<<(alpha+rho-1));
4379 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
4380 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
4381 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])
4382 + (1<<(alpha+rho-1));
4383 s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
4384 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
4385 +2*w2*r*sprite_ref[0][0]
4387 + (1<<(alpha+rho+1)));
4388 s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
4389 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
4390 +2*w2*r*sprite_ref[0][1]
4392 + (1<<(alpha+rho+1)));
4393 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
4394 s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]);
4395 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
4396 s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
4398 s->sprite_shift[0]= alpha+rho;
4399 s->sprite_shift[1]= alpha+rho+2;
4402 min_ab= FFMIN(alpha, beta);
4405 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
4406 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])
4407 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])
4408 + (1<<(alpha+beta+rho-min_ab-1));
4409 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))
4410 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])
4411 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])
4412 + (1<<(alpha+beta+rho-min_ab-1));
4413 s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)
4414 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)
4415 + 2*w2*h3*r*sprite_ref[0][0]
4417 + (1<<(alpha+beta+rho-min_ab+1));
4418 s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)
4419 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)
4420 + 2*w2*h3*r*sprite_ref[0][1]
4422 + (1<<(alpha+beta+rho-min_ab+1));
4423 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;
4424 s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;
4425 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;
4426 s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;
4428 s->sprite_shift[0]= alpha + beta + rho - min_ab;
4429 s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;
4432 /* try to simplify the situation */
4433 if( s->sprite_delta[0][0] == a<<s->sprite_shift[0]
4434 && s->sprite_delta[0][1] == 0
4435 && s->sprite_delta[1][0] == 0
4436 && s->sprite_delta[1][1] == a<<s->sprite_shift[0])
4438 s->sprite_offset[0][0]>>=s->sprite_shift[0];
4439 s->sprite_offset[0][1]>>=s->sprite_shift[0];
4440 s->sprite_offset[1][0]>>=s->sprite_shift[1];
4441 s->sprite_offset[1][1]>>=s->sprite_shift[1];
4442 s->sprite_delta[0][0]= a;
4443 s->sprite_delta[0][1]= 0;
4444 s->sprite_delta[1][0]= 0;
4445 s->sprite_delta[1][1]= a;
4446 s->sprite_shift[0]= 0;
4447 s->sprite_shift[1]= 0;
4448 s->real_sprite_warping_points=1;
4451 int shift_y= 16 - s->sprite_shift[0];
4452 int shift_c= 16 - s->sprite_shift[1];
4453 //printf("shifts %d %d\n", shift_y, shift_c);
4455 s->sprite_offset[0][i]<<= shift_y;
4456 s->sprite_offset[1][i]<<= shift_c;
4457 s->sprite_delta[0][i]<<= shift_y;
4458 s->sprite_delta[1][i]<<= shift_y;
4459 s->sprite_shift[i]= 16;
4461 s->real_sprite_warping_points= s->num_sprite_warping_points;
4464 printf("vop:%d:%d %d:%d %d:%d, sprite:%d:%d %d:%d %d:%d, virtual: %d:%d %d:%d\n",
4465 vop_ref[0][0], vop_ref[0][1],
4466 vop_ref[1][0], vop_ref[1][1],
4467 vop_ref[2][0], vop_ref[2][1],
4468 sprite_ref[0][0], sprite_ref[0][1],
4469 sprite_ref[1][0], sprite_ref[1][1],
4470 sprite_ref[2][0], sprite_ref[2][1],
4471 virtual_ref[0][0], virtual_ref[0][1],
4472 virtual_ref[1][0], virtual_ref[1][1]
4475 printf("offset: %d:%d , delta: %d %d %d %d, shift %d\n",
4476 s->sprite_offset[0][0], s->sprite_offset[0][1],
4477 s->sprite_delta[0][0], s->sprite_delta[0][1],
4478 s->sprite_delta[1][0], s->sprite_delta[1][1],
4484 static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
4485 int hours, minutes, seconds;
4487 hours= get_bits(gb, 5);
4488 minutes= get_bits(gb, 6);
4490 seconds= get_bits(gb, 6);
4492 s->time_base= seconds + 60*(minutes + 60*hours);
4500 static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
4501 int width, height, vo_ver_id;
4504 skip_bits(gb, 1); /* random access */
4505 s->vo_type= get_bits(gb, 8);
4506 if (get_bits1(gb) != 0) { /* is_ol_id */
4507 vo_ver_id = get_bits(gb, 4); /* vo_ver_id */
4508 skip_bits(gb, 3); /* vo_priority */
4512 //printf("vo type:%d\n",s->vo_type);
4513 s->aspect_ratio_info= get_bits(gb, 4);
4514 if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
4515 s->aspected_width = get_bits(gb, 8); // par_width
4516 s->aspected_height = get_bits(gb, 8); // par_height
4518 s->aspected_width = pixel_aspect[s->aspect_ratio_info][0];
4519 s->aspected_height= pixel_aspect[s->aspect_ratio_info][1];
4522 if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
4523 int chroma_format= get_bits(gb, 2);
4524 if(chroma_format!=1){
4525 printf("illegal chroma format\n");
4527 s->low_delay= get_bits1(gb);
4528 if(get_bits1(gb)){ /* vbv parameters */
4529 get_bits(gb, 15); /* first_half_bitrate */
4530 skip_bits1(gb); /* marker */
4531 get_bits(gb, 15); /* latter_half_bitrate */
4532 skip_bits1(gb); /* marker */
4533 get_bits(gb, 15); /* first_half_vbv_buffer_size */
4534 skip_bits1(gb); /* marker */
4535 get_bits(gb, 3); /* latter_half_vbv_buffer_size */
4536 get_bits(gb, 11); /* first_half_vbv_occupancy */
4537 skip_bits1(gb); /* marker */
4538 get_bits(gb, 15); /* latter_half_vbv_occupancy */
4539 skip_bits1(gb); /* marker */
4542 // set low delay flag only once so the smart? low delay detection wont be overriden
4543 if(s->picture_number==0)
4547 s->shape = get_bits(gb, 2); /* vol shape */
4548 if(s->shape != RECT_SHAPE) printf("only rectangular vol supported\n");
4549 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
4550 printf("Gray shape not supported\n");
4551 skip_bits(gb, 4); //video_object_layer_shape_extension
4554 skip_bits1(gb); /* marker */
4556 s->time_increment_resolution = get_bits(gb, 16);
4558 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
4559 if (s->time_increment_bits < 1)
4560 s->time_increment_bits = 1;
4561 skip_bits1(gb); /* marker */
4563 if (get_bits1(gb) != 0) { /* fixed_vop_rate */
4564 skip_bits(gb, s->time_increment_bits);
4567 if (s->shape != BIN_ONLY_SHAPE) {
4568 if (s->shape == RECT_SHAPE) {
4569 skip_bits1(gb); /* marker */
4570 width = get_bits(gb, 13);
4571 skip_bits1(gb); /* marker */
4572 height = get_bits(gb, 13);
4573 skip_bits1(gb); /* marker */
4574 if(width && height){ /* they should be non zero but who knows ... */
4577 // printf("width/height: %d %d\n", width, height);
4581 s->progressive_sequence= get_bits1(gb)^1;
4582 if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO))
4583 printf("OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */
4584 if (vo_ver_id == 1) {
4585 s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */
4587 s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */
4589 if(s->vol_sprite_usage==STATIC_SPRITE) printf("Static Sprites not supported\n");
4590 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
4591 if(s->vol_sprite_usage==STATIC_SPRITE){
4592 s->sprite_width = get_bits(gb, 13);
4593 skip_bits1(gb); /* marker */
4594 s->sprite_height= get_bits(gb, 13);
4595 skip_bits1(gb); /* marker */
4596 s->sprite_left = get_bits(gb, 13);
4597 skip_bits1(gb); /* marker */
4598 s->sprite_top = get_bits(gb, 13);
4599 skip_bits1(gb); /* marker */
4601 s->num_sprite_warping_points= get_bits(gb, 6);
4602 s->sprite_warping_accuracy = get_bits(gb, 2);
4603 s->sprite_brightness_change= get_bits1(gb);
4604 if(s->vol_sprite_usage==STATIC_SPRITE)
4605 s->low_latency_sprite= get_bits1(gb);
4607 // FIXME sadct disable bit if verid!=1 && shape not rect
4609 if (get_bits1(gb) == 1) { /* not_8_bit */
4610 s->quant_precision = get_bits(gb, 4); /* quant_precision */
4611 if(get_bits(gb, 4)!=8) printf("N-bit not supported\n"); /* bits_per_pixel */
4612 if(s->quant_precision!=5) printf("quant precission %d\n", s->quant_precision);
4614 s->quant_precision = 5;
4617 // FIXME a bunch of grayscale shape things
4619 if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */
4622 /* load default matrixes */
4623 for(i=0; i<64; i++){
4624 int j= s->dsp.idct_permutation[i];
4625 v= ff_mpeg4_default_intra_matrix[i];
4626 s->intra_matrix[j]= v;
4627 s->chroma_intra_matrix[j]= v;
4629 v= ff_mpeg4_default_non_intra_matrix[i];
4630 s->inter_matrix[j]= v;
4631 s->chroma_inter_matrix[j]= v;
4634 /* load custom intra matrix */
4637 for(i=0; i<64; i++){
4643 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
4644 s->intra_matrix[j]= v;
4645 s->chroma_intra_matrix[j]= v;
4648 /* replicate last value */
4650 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
4651 s->intra_matrix[j]= v;
4652 s->chroma_intra_matrix[j]= v;
4656 /* load custom non intra matrix */
4659 for(i=0; i<64; i++){
4665 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
4666 s->inter_matrix[j]= v;
4667 s->chroma_inter_matrix[j]= v;
4670 /* replicate last value */
4672 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
4673 s->inter_matrix[j]= last;
4674 s->chroma_inter_matrix[j]= last;
4678 // FIXME a bunch of grayscale shape things
4682 s->quarter_sample= get_bits1(gb);
4683 else s->quarter_sample=0;
4685 if(!get_bits1(gb)) printf("Complexity estimation not supported\n");
4687 s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */
4689 s->data_partitioning= get_bits1(gb);
4690 if(s->data_partitioning){
4691 s->rvlc= get_bits1(gb);
4694 if(vo_ver_id != 1) {
4695 s->new_pred= get_bits1(gb);
4697 printf("new pred not supported\n");
4698 skip_bits(gb, 2); /* requested upstream message type */
4699 skip_bits1(gb); /* newpred segment type */
4701 s->reduced_res_vop= get_bits1(gb);
4702 if(s->reduced_res_vop) printf("reduced resolution VOP not supported\n");
4706 s->reduced_res_vop= 0;
4709 s->scalability= get_bits1(gb);
4711 if (s->scalability) {
4712 GetBitContext bak= *gb;
4714 int ref_layer_sampling_dir;
4715 int h_sampling_factor_n;
4716 int h_sampling_factor_m;
4717 int v_sampling_factor_n;
4718 int v_sampling_factor_m;
4720 s->hierachy_type= get_bits1(gb);
4721 ref_layer_id= get_bits(gb, 4);
4722 ref_layer_sampling_dir= get_bits1(gb);
4723 h_sampling_factor_n= get_bits(gb, 5);
4724 h_sampling_factor_m= get_bits(gb, 5);
4725 v_sampling_factor_n= get_bits(gb, 5);
4726 v_sampling_factor_m= get_bits(gb, 5);
4727 s->enhancement_type= get_bits1(gb);
4729 if( h_sampling_factor_n==0 || h_sampling_factor_m==0
4730 || v_sampling_factor_n==0 || v_sampling_factor_m==0){
4732 // fprintf(stderr, "illegal scalability header (VERY broken encoder), trying to workaround\n");
4737 printf("scalability not supported\n");
4739 // bin shape stuff FIXME
4746 * decodes the user data stuff in the header.
4747 * allso inits divx/xvid/lavc_version/build
4749 static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
4753 int ver, build, ver2, ver3;
4756 buf[0]= show_bits(gb, 8);
4757 for(i=1; i<256; i++){
4758 buf[i]= show_bits(gb, 16)&0xFF;
4759 if(buf[i]==0) break;
4764 /* divx detection */
4765 e=sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last);
4767 e=sscanf(buf, "DivX%db%d%c", &ver, &build, &last);
4769 s->divx_version= ver;
4770 s->divx_build= build;
4771 s->divx_packed= e==3 && last=='p';
4772 if(s->picture_number==0){
4773 printf("This file was encoded with DivX%d Build%d", ver, build);
4781 /* ffmpeg detection */
4782 e=sscanf(buf, "FFmpeg%d.%d.%db%d", &ver, &ver2, &ver3, &build);
4784 e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
4786 if(strcmp(buf, "ffmpeg")==0){
4787 s->ffmpeg_version= 0x000406;
4788 s->lavc_build= 4600;
4792 s->ffmpeg_version= ver*256*256 + ver2*256 + ver3;
4793 s->lavc_build= build;
4794 if(s->picture_number==0)
4795 printf("This file was encoded with libavcodec build %d\n", build);
4798 /* xvid detection */
4799 e=sscanf(buf, "XviD%d", &build);
4801 s->xvid_build= build;
4802 if(s->picture_number==0)
4803 printf("This file was encoded with XviD build %d\n", build);
4806 //printf("User Data: %s\n", buf);
4810 static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
4811 int time_incr, time_increment;
4813 s->pict_type = get_bits(gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */
4814 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0 && !(s->flags & CODEC_FLAG_LOW_DELAY)){
4815 printf("low_delay flag set, but shouldnt, clearing it\n");
4819 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
4820 if(s->partitioned_frame)
4821 s->decode_mb= mpeg4_decode_partitioned_mb;
4823 s->decode_mb= ff_h263_decode_mb;
4825 if(s->time_increment_resolution==0){
4826 s->time_increment_resolution=1;
4827 // fprintf(stderr, "time_increment_resolution is illegal\n");
4830 while (get_bits1(gb) != 0)
4833 check_marker(gb, "before time_increment");
4835 if(s->picture_number==0 && (show_bits(gb, s->time_increment_bits+1)&1)==0){
4836 printf("hmm, seems the headers arnt complete, trying to guess time_increment_bits\n");
4839 for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){
4840 if(show_bits(gb, s->time_increment_bits+1)&1) break;
4842 printf("my guess is %d bits ;)\n",s->time_increment_bits);
4845 time_increment= get_bits(gb, s->time_increment_bits);
4846 //printf(" type:%d modulo_time_base:%d increment:%d\n", s->pict_type, time_incr, time_increment);
4847 if(s->pict_type!=B_TYPE){
4848 s->last_time_base= s->time_base;
4849 s->time_base+= time_incr;
4850 s->time= s->time_base*s->time_increment_resolution + time_increment;
4851 if(s->workaround_bugs&FF_BUG_UMP4){
4852 if(s->time < s->last_non_b_time){
4853 // fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaround\n");
4855 s->time+= s->time_increment_resolution;
4858 s->pp_time= s->time - s->last_non_b_time;
4859 s->last_non_b_time= s->time;
4861 s->time= (s->last_time_base + time_incr)*s->time_increment_resolution + time_increment;
4862 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
4863 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
4864 // printf("messed up order, seeking?, skiping current b frame\n");
4865 return FRAME_SKIPED;
4868 if(s->t_frame==0) s->t_frame= s->time - s->last_time_base;
4869 if(s->t_frame==0) s->t_frame=1; // 1/0 protection
4870 //printf("%Ld %Ld %d %d\n", s->last_non_b_time, s->time, s->pp_time, s->t_frame); fflush(stdout);
4871 s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame)
4872 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
4873 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame)
4874 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
4877 s->current_picture.pts= s->time*1000LL*1000LL / s->time_increment_resolution;
4878 if(s->avctx->debug&FF_DEBUG_PTS)
4879 printf("MPEG4 PTS: %f\n", s->current_picture.pts/(1000.0*1000.0));
4881 check_marker(gb, "before vop_coded");
4884 if (get_bits1(gb) != 1){
4885 printf("vop not coded\n");
4886 return FRAME_SKIPED;
4888 //printf("time %d %d %d || %Ld %Ld %Ld\n", s->time_increment_bits, s->time_increment_resolution, s->time_base,
4889 //s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time);
4890 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE
4891 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
4892 /* rounding type for motion estimation */
4893 s->no_rounding = get_bits1(gb);
4897 //FIXME reduced res stuff
4899 if (s->shape != RECT_SHAPE) {
4900 if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) {
4901 int width, height, hor_spat_ref, ver_spat_ref;
4903 width = get_bits(gb, 13);
4904 skip_bits1(gb); /* marker */
4905 height = get_bits(gb, 13);
4906 skip_bits1(gb); /* marker */
4907 hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */
4908 skip_bits1(gb); /* marker */
4909 ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */
4911 skip_bits1(gb); /* change_CR_disable */
4913 if (get_bits1(gb) != 0) {
4914 skip_bits(gb, 8); /* constant_alpha_value */
4917 //FIXME complexity estimation stuff
4919 if (s->shape != BIN_ONLY_SHAPE) {
4921 t=get_bits(gb, 3); /* intra dc VLC threshold */
4922 //printf("threshold %d\n", t);
4923 if(!s->progressive_sequence){
4924 s->top_field_first= get_bits1(gb);
4925 s->alternate_scan= get_bits1(gb);
4927 s->alternate_scan= 0;
4930 if(s->alternate_scan){
4931 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
4932 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
4933 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
4934 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
4936 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
4937 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
4938 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
4939 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
4942 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
4943 mpeg4_decode_sprite_trajectory(s);
4944 if(s->sprite_brightness_change) printf("sprite_brightness_change not supported\n");
4945 if(s->vol_sprite_usage==STATIC_SPRITE) printf("static sprite not supported\n");
4948 if (s->shape != BIN_ONLY_SHAPE) {
4949 s->qscale = get_bits(gb, s->quant_precision);
4951 printf("Error, header damaged or not MPEG4 header (qscale=0)\n");
4952 return -1; // makes no sense to continue, as there is nothing left from the image then
4955 if (s->pict_type != I_TYPE) {
4956 s->f_code = get_bits(gb, 3); /* fcode_for */
4958 printf("Error, header damaged or not MPEG4 header (f_code=0)\n");
4959 return -1; // makes no sense to continue, as the MV decoding will break very quickly
4964 if (s->pict_type == B_TYPE) {
4965 s->b_code = get_bits(gb, 3);
4969 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
4970 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",
4971 s->qscale, s->f_code, s->b_code,
4972 s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")),
4973 gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first,
4974 s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,
4975 s->sprite_warping_accuracy, 1-s->no_rounding);
4978 if(!s->scalability){
4979 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {
4980 skip_bits1(gb); // vop shape coding type
4983 if(s->enhancement_type){
4984 int load_backward_shape= get_bits1(gb);
4985 if(load_backward_shape){
4986 printf("load backward shape isnt supported\n");
4989 skip_bits(gb, 2); //ref_select_code
4992 /* detect buggy encoders which dont set the low_delay flag (divx4/xvid/opendivx)*/
4993 // note we cannot detect divx5 without b-frames easyly (allthough its buggy too)
4994 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
4995 printf("looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
4999 s->picture_number++; // better than pic number==0 allways ;)
5001 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
5002 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
5004 if(s->workaround_bugs&FF_BUG_EDGE){
5005 s->h_edge_pos= s->width;
5006 s->v_edge_pos= s->height;
5012 * decode mpeg4 headers
5013 * @return <0 if no VOP found (or a damaged one)
5014 * FRAME_SKIPPED if a not coded VOP is found
5015 * 0 if a VOP is found
5017 int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb)
5021 /* search next start code */
5025 v = get_bits(gb, 8);
5026 startcode = ((startcode << 8) | v) & 0xffffffff;
5028 if(get_bits_count(gb) >= gb->size_in_bits){
5029 if(gb->size_in_bits==8 && s->divx_version){
5030 printf("frame skip %d\n", gb->size_in_bits);
5031 return FRAME_SKIPED; //divx bug
5033 return -1; //end of stream
5036 if((startcode&0xFFFFFF00) != 0x100)
5037 continue; //no startcode
5039 if(s->avctx->debug&FF_DEBUG_STARTCODE){
5040 printf("startcode: %3X ", startcode);
5041 if (startcode<=0x11F) printf("Video Object Start");
5042 else if(startcode<=0x12F) printf("Video Object Layer Start");
5043 else if(startcode<=0x13F) printf("Reserved");
5044 else if(startcode<=0x15F) printf("FGS bp start");
5045 else if(startcode<=0x1AF) printf("Reserved");
5046 else if(startcode==0x1B0) printf("Visual Object Seq Start");
5047 else if(startcode==0x1B1) printf("Visual Object Seq End");
5048 else if(startcode==0x1B2) printf("User Data");
5049 else if(startcode==0x1B3) printf("Group of VOP start");
5050 else if(startcode==0x1B4) printf("Video Session Error");
5051 else if(startcode==0x1B5) printf("Visual Object Start");
5052 else if(startcode==0x1B6) printf("Video Object Plane start");
5053 else if(startcode==0x1B7) printf("slice start");
5054 else if(startcode==0x1B8) printf("extension start");
5055 else if(startcode==0x1B9) printf("fgs start");
5056 else if(startcode==0x1BA) printf("FBA Object start");
5057 else if(startcode==0x1BB) printf("FBA Object Plane start");
5058 else if(startcode==0x1BC) printf("Mesh Object start");
5059 else if(startcode==0x1BD) printf("Mesh Object Plane start");
5060 else if(startcode==0x1BE) printf("Still Textutre Object start");
5061 else if(startcode==0x1BF) printf("Textutre Spatial Layer start");
5062 else if(startcode==0x1C0) printf("Textutre SNR Layer start");
5063 else if(startcode==0x1C1) printf("Textutre Tile start");
5064 else if(startcode==0x1C2) printf("Textutre Shape Layer start");
5065 else if(startcode==0x1C3) printf("stuffing start");
5066 else if(startcode<=0x1C5) printf("reserved");
5067 else if(startcode<=0x1FF) printf("System start");
5068 printf(" at %d\n", get_bits_count(gb));
5073 decode_vol_header(s, gb);
5075 case USER_DATA_STARTCODE:
5076 decode_user_data(s, gb);
5079 mpeg4_decode_gop_header(s, gb);
5082 return decode_vop_header(s, gb);
5092 /* don't understand why they choose a different header ! */
5093 int intel_h263_decode_picture_header(MpegEncContext *s)
5097 /* picture header */
5098 if (get_bits_long(&s->gb, 22) != 0x20) {
5099 fprintf(stderr, "Bad picture start code\n");
5102 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
5104 if (get_bits1(&s->gb) != 1) {
5105 fprintf(stderr, "Bad marker\n");
5106 return -1; /* marker */
5108 if (get_bits1(&s->gb) != 0) {
5109 fprintf(stderr, "Bad H263 id\n");
5110 return -1; /* h263 id */
5112 skip_bits1(&s->gb); /* split screen off */
5113 skip_bits1(&s->gb); /* camera off */
5114 skip_bits1(&s->gb); /* freeze picture release off */
5116 format = get_bits(&s->gb, 3);
5118 fprintf(stderr, "Intel H263 free format not supported\n");
5123 s->pict_type = I_TYPE + get_bits1(&s->gb);
5125 s->unrestricted_mv = get_bits1(&s->gb);
5126 s->h263_long_vectors = s->unrestricted_mv;
5128 if (get_bits1(&s->gb) != 0) {
5129 fprintf(stderr, "SAC not supported\n");
5130 return -1; /* SAC: off */
5132 if (get_bits1(&s->gb) != 0) {
5133 fprintf(stderr, "Advanced Prediction Mode not supported\n");
5134 return -1; /* advanced prediction mode: off */
5136 if (get_bits1(&s->gb) != 0) {
5137 fprintf(stderr, "PB frame mode no supported\n");
5138 return -1; /* PB frame mode */
5141 /* skip unknown header garbage */
5142 skip_bits(&s->gb, 41);
5144 s->qscale = get_bits(&s->gb, 5);
5145 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
5148 while (get_bits1(&s->gb) != 0) {
5149 skip_bits(&s->gb, 8);
5153 s->y_dc_scale_table=
5154 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
5159 int flv_h263_decode_picture_header(MpegEncContext *s)
5161 int format, width, height;
5163 /* picture header */
5164 if (get_bits_long(&s->gb, 17) != 1) {
5165 fprintf(stderr, "Bad picture start code\n");
5168 format = get_bits(&s->gb, 5);
5169 if (format != 0 && format != 1) {
5170 fprintf(stderr, "Bad picture format\n");
5173 s->h263_flv = format+1;
5174 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
5175 format = get_bits(&s->gb, 3);
5178 width = get_bits(&s->gb, 8);
5179 height = get_bits(&s->gb, 8);
5182 width = get_bits(&s->gb, 16);
5183 height = get_bits(&s->gb, 16);
5209 if ((width == 0) || (height == 0))
5214 s->pict_type = I_TYPE + get_bits(&s->gb, 2);
5215 if (s->pict_type > P_TYPE)
5216 s->pict_type = P_TYPE;
5217 skip_bits1(&s->gb); /* deblocking flag */
5218 s->qscale = get_bits(&s->gb, 5);
5222 s->unrestricted_mv = 1;
5223 s->h263_long_vectors = 0;
5226 while (get_bits1(&s->gb) != 0) {
5227 skip_bits(&s->gb, 8);
5231 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
5232 printf("%c esc_type:%d, qp:%d num:%d\n",
5233 av_get_pict_type_char(s->pict_type), s->h263_flv-1, s->qscale, s->picture_number);
5236 s->y_dc_scale_table=
5237 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;