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>
37 #include "mpegvideo.h"
39 #include "mpeg4data.h"
44 #define INTRA_MCBPC_VLC_BITS 6
45 #define INTER_MCBPC_VLC_BITS 7
46 #define CBPY_VLC_BITS 6
49 #define SPRITE_TRAJ_VLC_BITS 6
50 #define MB_TYPE_B_VLC_BITS 4
51 #define TEX_VLC_BITS 9
53 #ifdef CONFIG_ENCODERS
54 static void h263_encode_block(MpegEncContext * s, DCTELEM * block,
56 static void h263_encode_motion(MpegEncContext * s, int val, int fcode);
57 static void h263p_encode_umotion(MpegEncContext * s, int val);
58 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block,
59 int n, int dc, uint8_t *scan_table,
60 PutBitContext *dc_pb, PutBitContext *ac_pb);
63 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode);
64 static int h263p_decode_umotion(MpegEncContext * s, int pred);
65 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
67 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
68 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
69 int n, int coded, int intra, int rvlc);
70 static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr);
71 #ifdef CONFIG_ENCODERS
72 static void mpeg4_encode_visual_object_header(MpegEncContext * s);
73 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number);
74 #endif //CONFIG_ENCODERS
75 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s);
76 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr, int *dir_ptr);
78 #ifdef CONFIG_ENCODERS
79 static uint8_t uni_DCtab_lum_len[512];
80 static uint8_t uni_DCtab_chrom_len[512];
81 static uint16_t uni_DCtab_lum_bits[512];
82 static uint16_t uni_DCtab_chrom_bits[512];
84 static uint8_t (*mv_penalty)[MAX_MV*2+1]= NULL;
85 static uint8_t fcode_tab[MAX_MV*2+1];
86 static uint8_t umv_fcode_tab[MAX_MV*2+1];
88 static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2];
89 static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2];
90 static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2];
91 static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2];
92 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
93 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
94 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
107 #if 0 //3IV1 is quite rare and tis slows things down a tiny bit
108 #define IS_3IV1 s->avctx->codec_tag == ff_get_fourcc("3IV1")
113 int h263_get_picture_format(int width, int height)
117 if (width == 128 && height == 96)
119 else if (width == 176 && height == 144)
121 else if (width == 352 && height == 288)
123 else if (width == 704 && height == 576)
125 else if (width == 1408 && height == 1152)
132 #ifdef CONFIG_ENCODERS
134 static void aspect_to_info(MpegEncContext * s, AVRational aspect){
137 if(aspect.num==0) aspect= (AVRational){1,1};
140 if(av_cmp_q(pixel_aspect[i], aspect) == 0){
141 s->aspect_ratio_info=i;
146 s->aspect_ratio_info= FF_ASPECT_EXTENDED;
149 void ff_flv_encode_picture_header(MpegEncContext * s, int picture_number)
153 align_put_bits(&s->pb);
155 put_bits(&s->pb, 17, 1);
156 put_bits(&s->pb, 5, (s->h263_flv-1)); /* 0: h263 escape codes 1: 11-bit escape codes */
157 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->frame_rate_base) /
158 s->avctx->frame_rate) & 0xff); /* TemporalReference */
159 if (s->width == 352 && s->height == 288)
161 else if (s->width == 176 && s->height == 144)
163 else if (s->width == 128 && s->height == 96)
165 else if (s->width == 320 && s->height == 240)
167 else if (s->width == 160 && s->height == 120)
169 else if (s->width <= 255 && s->height <= 255)
170 format = 0; /* use 1 byte width & height */
172 format = 1; /* use 2 bytes width & height */
173 put_bits(&s->pb, 3, format); /* PictureSize */
175 put_bits(&s->pb, 8, s->width);
176 put_bits(&s->pb, 8, s->height);
177 } else if (format == 1) {
178 put_bits(&s->pb, 16, s->width);
179 put_bits(&s->pb, 16, s->height);
181 put_bits(&s->pb, 2, s->pict_type == P_TYPE); /* PictureType */
182 put_bits(&s->pb, 1, 1); /* DeblockingFlag: on */
183 put_bits(&s->pb, 5, s->qscale); /* Quantizer */
184 put_bits(&s->pb, 1, 0); /* ExtraInformation */
188 s->c_dc_scale_table= h263_aic_dc_scale_table;
191 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
195 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
199 align_put_bits(&s->pb);
201 /* Update the pointer to last GOB */
202 s->ptr_lastgob = pbBufPtr(&s->pb);
205 put_bits(&s->pb, 22, 0x20); /* PSC */
206 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->frame_rate_base) /
207 s->avctx->frame_rate) & 0xff);
209 put_bits(&s->pb, 1, 1); /* marker */
210 put_bits(&s->pb, 1, 0); /* h263 id */
211 put_bits(&s->pb, 1, 0); /* split screen off */
212 put_bits(&s->pb, 1, 0); /* camera off */
213 put_bits(&s->pb, 1, 0); /* freeze picture release off */
215 format = h263_get_picture_format(s->width, s->height);
218 put_bits(&s->pb, 3, format);
219 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
220 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
221 of H.263v1 UMV implies to check the predicted MV after
222 calculation of the current MB to see if we're on the limits */
223 put_bits(&s->pb, 1, 0); /* unrestricted motion vector: off */
224 put_bits(&s->pb, 1, 0); /* SAC: off */
225 put_bits(&s->pb, 1, 0); /* advanced prediction mode: off */
226 put_bits(&s->pb, 1, 0); /* not PB frame */
227 put_bits(&s->pb, 5, s->qscale);
228 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
231 /* H.263 Plus PTYPE */
232 put_bits(&s->pb, 3, 7);
233 put_bits(&s->pb,3,1); /* Update Full Extended PTYPE */
235 put_bits(&s->pb,3,6); /* Custom Source Format */
237 put_bits(&s->pb, 3, format);
239 put_bits(&s->pb,1,0); /* Custom PCF: off */
240 s->umvplus = s->unrestricted_mv;
241 put_bits(&s->pb, 1, s->umvplus); /* Unrestricted Motion Vector */
242 put_bits(&s->pb,1,0); /* SAC: off */
243 put_bits(&s->pb,1,0); /* Advanced Prediction Mode: off */
244 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
245 put_bits(&s->pb,1,0); /* Deblocking Filter: off */
246 put_bits(&s->pb,1,0); /* Slice Structured: off */
247 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
248 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
249 put_bits(&s->pb,1,0); /* Alternative Inter VLC: off */
250 put_bits(&s->pb,1,0); /* Modified Quantization: off */
251 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
252 put_bits(&s->pb,3,0); /* Reserved */
254 put_bits(&s->pb, 3, s->pict_type == P_TYPE);
256 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
257 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
258 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
259 put_bits(&s->pb,2,0); /* Reserved */
260 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
262 /* This should be here if PLUSPTYPE */
263 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
266 /* Custom Picture Format (CPFMT) */
267 aspect_to_info(s, s->avctx->sample_aspect_ratio);
269 put_bits(&s->pb,4,s->aspect_ratio_info);
270 put_bits(&s->pb,9,(s->width >> 2) - 1);
271 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
272 put_bits(&s->pb,9,(s->height >> 2));
273 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
274 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
275 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
279 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
281 // put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
282 put_bits(&s->pb,2,1); /* unlimited */
284 put_bits(&s->pb, 5, s->qscale);
287 put_bits(&s->pb, 1, 0); /* no PEI */
291 s->c_dc_scale_table= h263_aic_dc_scale_table;
294 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
299 * Encodes a group of blocks header.
301 int h263_encode_gob_header(MpegEncContext * s, int mb_line)
303 align_put_bits(&s->pb);
304 flush_put_bits(&s->pb);
305 /* Call the RTP callback to send the last GOB */
306 if (s->rtp_callback) {
307 int pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
308 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
310 put_bits(&s->pb, 17, 1); /* GBSC */
311 s->gob_number = mb_line / s->gob_index;
312 put_bits(&s->pb, 5, s->gob_number); /* GN */
313 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
314 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
315 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
319 static inline int get_block_rate(MpegEncContext * s, DCTELEM block[64], int block_last_index, uint8_t scantable[64]){
324 for(j=1; j<=block_last_index; j++){
325 const int index= scantable[j];
326 int level= block[index];
329 if((level&(~127)) == 0){
330 if(j<block_last_index) rate+= s->intra_ac_vlc_length [UNI_AC_ENC_INDEX(j-last-1, level)];
331 else rate+= s->intra_ac_vlc_last_length[UNI_AC_ENC_INDEX(j-last-1, level)];
333 rate += s->ac_esc_length;
343 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
347 int8_t * const qscale_table= s->current_picture.qscale_table;
349 memcpy(zigzag_last_index, s->block_last_index, sizeof(int)*6);
352 int16_t *ac_val, *ac_val1;
354 score -= get_block_rate(s, block[n], s->block_last_index[n], s->intra_scantable.permutated);
356 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
359 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
361 ac_val-= s->block_wrap[n]*16;
362 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
365 const int level= block[n][s->dsp.idct_permutation[i ]];
366 block[n][s->dsp.idct_permutation[i ]] = level - ac_val[i+8];
367 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
371 /* different qscale, we must rescale */
373 const int level= block[n][s->dsp.idct_permutation[i ]];
374 block[n][s->dsp.idct_permutation[i ]] = level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
375 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]];
379 st[n]= s->intra_h_scantable.permutated;
381 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
382 /* left prediction */
384 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
387 const int level= block[n][s->dsp.idct_permutation[i<<3]];
388 block[n][s->dsp.idct_permutation[i<<3]]= level - ac_val[i];
390 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
393 /* different qscale, we must rescale */
395 const int level= block[n][s->dsp.idct_permutation[i<<3]];
396 block[n][s->dsp.idct_permutation[i<<3]]= level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
398 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]];
401 st[n]= s->intra_v_scantable.permutated;
404 for(i=63; i>0; i--) //FIXME optimize
405 if(block[n][ st[n][i] ]) break;
406 s->block_last_index[n]= i;
408 score += get_block_rate(s, block[n], s->block_last_index[n], st[n]);
414 static inline void restore_ac_coeffs(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
417 memcpy(s->block_last_index, zigzag_last_index, sizeof(int)*6);
420 int16_t *ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
422 st[n]= s->intra_scantable.permutated;
426 block[n][s->dsp.idct_permutation[i ]] = ac_val[i+8];
429 /* left prediction */
431 block[n][s->dsp.idct_permutation[i<<3]]= ac_val[i ];
438 * modify qscale so that encoding is acually possible in h263 (limit difference to -2..2)
440 void ff_clean_h263_qscales(MpegEncContext *s){
442 int8_t * const qscale_table= s->current_picture.qscale_table;
444 for(i=1; i<s->mb_num; i++){
445 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i-1] ] >2)
446 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i-1] ]+2;
448 for(i=s->mb_num-2; i>=0; i--){
449 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i+1] ] >2)
450 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i+1] ]+2;
455 * modify mb_type & qscale so that encoding is acually possible in mpeg4
457 void ff_clean_mpeg4_qscales(MpegEncContext *s){
459 int8_t * const qscale_table= s->current_picture.qscale_table;
461 ff_clean_h263_qscales(s);
463 for(i=1; i<s->mb_num; i++){
464 int mb_xy= s->mb_index2xy[i];
466 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&MB_TYPE_INTER4V)){
467 s->mb_type[mb_xy]&= ~MB_TYPE_INTER4V;
468 s->mb_type[mb_xy]|= MB_TYPE_INTER;
472 if(s->pict_type== B_TYPE){
474 /* ok, come on, this isnt funny anymore, theres more code for handling this mpeg4 mess than
475 for the actual adaptive quantization */
477 for(i=0; i<s->mb_num; i++){
478 int mb_xy= s->mb_index2xy[i];
479 odd += qscale_table[mb_xy]&1;
482 if(2*odd > s->mb_num) odd=1;
485 for(i=0; i<s->mb_num; i++){
486 int mb_xy= s->mb_index2xy[i];
487 if((qscale_table[mb_xy]&1) != odd)
488 qscale_table[mb_xy]++;
489 if(qscale_table[mb_xy] > 31)
490 qscale_table[mb_xy]= 31;
493 for(i=1; i<s->mb_num; i++){
494 int mb_xy= s->mb_index2xy[i];
495 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&MB_TYPE_DIRECT)){
496 s->mb_type[mb_xy]&= ~MB_TYPE_DIRECT;
497 s->mb_type[mb_xy]|= MB_TYPE_BIDIR;
503 #endif //CONFIG_ENCODERS
506 * @return the mb_type
508 int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){
509 const int mb_index= s->mb_x + s->mb_y*s->mb_stride;
510 const int colocated_mb_type= s->next_picture.mb_type[mb_index]; //FIXME or next?
511 int xy= s->block_index[0];
512 uint16_t time_pp= s->pp_time;
513 uint16_t time_pb= s->pb_time;
516 //FIXME avoid divides
518 if(IS_8X8(colocated_mb_type)){
519 s->mv_type = MV_TYPE_8X8;
521 xy= s->block_index[i];
522 s->mv[0][i][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
523 s->mv[0][i][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
524 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->motion_val[xy][0]
525 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
526 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->motion_val[xy][1]
527 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
529 return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_L0L1;
530 } else if(IS_INTERLACED(colocated_mb_type)){
531 s->mv_type = MV_TYPE_FIELD;
533 if(s->top_field_first){
534 time_pp= s->pp_field_time - s->field_select_table[mb_index][i] + i;
535 time_pb= s->pb_field_time - s->field_select_table[mb_index][i] + i;
537 time_pp= s->pp_field_time + s->field_select_table[mb_index][i] - i;
538 time_pb= s->pb_field_time + s->field_select_table[mb_index][i] - i;
540 s->mv[0][i][0] = s->field_mv_table[mb_index][i][0]*time_pb/time_pp + mx;
541 s->mv[0][i][1] = s->field_mv_table[mb_index][i][1]*time_pb/time_pp + my;
542 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->field_mv_table[mb_index][i][0]
543 : s->field_mv_table[mb_index][i][0]*(time_pb - time_pp)/time_pp;
544 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->field_mv_table[mb_index][i][1]
545 : s->field_mv_table[mb_index][i][1]*(time_pb - time_pp)/time_pp;
547 return MB_TYPE_DIRECT2 | MB_TYPE_16x8 | MB_TYPE_L0L1 | MB_TYPE_INTERLACED;
549 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;
550 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;
551 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]
552 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
553 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]
554 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
555 if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample)
556 s->mv_type= MV_TYPE_16X16;
558 s->mv_type= MV_TYPE_8X8;
559 return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_L0L1; //Note see prev line
563 void ff_h263_update_motion_val(MpegEncContext * s){
564 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
565 //FIXME a lot of thet is only needed for !low_delay
566 const int wrap = s->block_wrap[0];
567 const int xy = s->block_index[0];
569 s->current_picture.mbskip_table[mb_xy]= s->mb_skiped;
571 if(s->mv_type != MV_TYPE_8X8){
572 int motion_x, motion_y;
576 } else if (s->mv_type == MV_TYPE_16X16) {
577 motion_x = s->mv[0][0][0];
578 motion_y = s->mv[0][0][1];
579 } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {
581 motion_x = s->mv[0][0][0] + s->mv[0][1][0];
582 motion_y = s->mv[0][0][1] + s->mv[0][1][1];
583 motion_x = (motion_x>>1) | (motion_x&1);
585 s->field_mv_table[mb_xy][i][0]= s->mv[0][i][0];
586 s->field_mv_table[mb_xy][i][1]= s->mv[0][i][1];
587 s->field_select_table[mb_xy][i]= s->field_select[0][i];
591 /* no update if 8X8 because it has been done during parsing */
592 s->motion_val[xy][0] = motion_x;
593 s->motion_val[xy][1] = motion_y;
594 s->motion_val[xy + 1][0] = motion_x;
595 s->motion_val[xy + 1][1] = motion_y;
596 s->motion_val[xy + wrap][0] = motion_x;
597 s->motion_val[xy + wrap][1] = motion_y;
598 s->motion_val[xy + 1 + wrap][0] = motion_x;
599 s->motion_val[xy + 1 + wrap][1] = motion_y;
602 if(s->encoding){ //FIXME encoding MUST be cleaned up
603 if (s->mv_type == MV_TYPE_8X8)
604 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_8x8;
606 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_16x16;
610 #ifdef CONFIG_ENCODERS
612 static inline int get_p_cbp(MpegEncContext * s,
613 DCTELEM block[6][64],
614 int motion_x, int motion_y){
617 if(s->flags & CODEC_FLAG_CBP_RD){
618 int best_cbpy_score= INT_MAX;
619 int best_cbpc_score= INT_MAX;
621 const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0);
622 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
625 int score= inter_MCBPC_bits[i + offset] * lambda;
626 if(i&1) score += s->coded_score[5];
627 if(i&2) score += s->coded_score[4];
629 if(score < best_cbpc_score){
630 best_cbpc_score= score;
636 int score= cbpy_tab[i ^ 0xF][1] * lambda;
637 if(i&1) score += s->coded_score[3];
638 if(i&2) score += s->coded_score[2];
639 if(i&4) score += s->coded_score[1];
640 if(i&8) score += s->coded_score[0];
642 if(score < best_cbpy_score){
643 best_cbpy_score= score;
648 if ((motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16){
649 if(best_cbpy_score + best_cbpc_score + 2*lambda >= 0)
653 for (i = 0; i < 6; i++) {
654 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
655 s->block_last_index[i]= -1;
656 memset(s->block[i], 0, sizeof(DCTELEM)*64);
661 for (i = 0; i < 6; i++) {
662 if (s->block_last_index[i] >= 0)
669 static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64],
670 int motion_x, int motion_y, int mb_type){
673 if(s->flags & CODEC_FLAG_CBP_RD){
675 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
678 if(s->coded_score[i] < 0){
679 score += s->coded_score[i];
686 if ((motion_x | motion_y | s->dquant | mb_type) == 0){
687 zero_score-= 4; //2*MV + mb_type + cbp bit
691 if(zero_score <= score){
696 for (i = 0; i < 6; i++) {
697 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
698 s->block_last_index[i]= -1;
699 memset(s->block[i], 0, sizeof(DCTELEM)*64);
703 for (i = 0; i < 6; i++) {
704 if (s->block_last_index[i] >= 0)
711 void mpeg4_encode_mb(MpegEncContext * s,
712 DCTELEM block[6][64],
713 int motion_x, int motion_y)
715 int cbpc, cbpy, pred_x, pred_y;
716 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
717 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=B_TYPE ? &s->tex_pb : &s->pb;
718 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=I_TYPE ? &s->pb2 : &s->pb;
719 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
720 const int dquant_code[5]= {1,0,9,2,3};
722 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
727 if(s->pict_type==B_TYPE){
728 static const int mb_type_table[8]= {-1, 2, 3, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
729 int mb_type= mb_type_table[s->mv_dir];
735 s->last_mv[1][0][1]= 0;
738 assert(s->dquant>=-2 && s->dquant<=2);
739 assert((s->dquant&1)==0);
742 /* nothing to do if this MB was skiped in the next P Frame */
743 if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){ //FIXME avoid DCT & ...
749 s->mv_dir= MV_DIR_FORWARD; //doesnt matter
750 s->qscale -= s->dquant;
756 cbp= get_b_cbp(s, block, motion_x, motion_y, mb_type);
758 if ((cbp | motion_x | motion_y | mb_type) ==0) {
759 /* direct MB with MV={0,0} */
760 assert(s->dquant==0);
762 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
764 if(interleaved_stats){
772 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
773 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
774 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we dont need it :)
775 if(cbp) put_bits(&s->pb, 6, cbp);
779 put_bits(&s->pb, 2, (s->dquant>>2)+3);
781 put_bits(&s->pb, 1, 0);
783 s->qscale -= s->dquant;
785 if(!s->progressive_sequence){
787 put_bits(&s->pb, 1, s->interlaced_dct);
788 if(mb_type) // not diect mode
789 put_bits(&s->pb, 1, 0); // no interlaced ME yet
792 if(interleaved_stats){
793 s->misc_bits+= get_bits_diff(s);
799 h263_encode_motion(s, motion_x, 1);
800 h263_encode_motion(s, motion_y, 1);
805 h263_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code);
806 h263_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
807 h263_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code);
808 h263_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
809 s->last_mv[0][0][0]= s->mv[0][0][0];
810 s->last_mv[0][0][1]= s->mv[0][0][1];
811 s->last_mv[1][0][0]= s->mv[1][0][0];
812 s->last_mv[1][0][1]= s->mv[1][0][1];
816 case 2: /* backward */
817 h263_encode_motion(s, motion_x - s->last_mv[1][0][0], s->b_code);
818 h263_encode_motion(s, motion_y - s->last_mv[1][0][1], s->b_code);
819 s->last_mv[1][0][0]= motion_x;
820 s->last_mv[1][0][1]= motion_y;
823 case 3: /* forward */
824 h263_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);
825 h263_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);
826 s->last_mv[0][0][0]= motion_x;
827 s->last_mv[0][0][1]= motion_y;
831 printf("unknown mb type\n");
835 if(interleaved_stats){
836 s->mv_bits+= get_bits_diff(s);
839 /* encode each block */
840 for (i = 0; i < 6; i++) {
841 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, NULL, &s->pb);
844 if(interleaved_stats){
845 s->p_tex_bits+= get_bits_diff(s);
847 }else{ /* s->pict_type==B_TYPE */
848 cbp= get_p_cbp(s, block, motion_x, motion_y);
850 if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
851 /* check if the B frames can skip it too, as we must skip it if we skip here
852 why didnt they just compress the skip-mb bits instead of reusing them ?! */
853 if(s->max_b_frames>0){
860 if(x+16 > s->width) x= s->width-16;
861 if(y+16 > s->height) y= s->height-16;
863 offset= x + y*s->linesize;
864 p_pic= s->new_picture.data[0] + offset;
867 for(i=0; i<s->max_b_frames; i++){
870 Picture *pic= s->reordered_input_picture[i+1];
872 if(pic==NULL || pic->pict_type!=B_TYPE) break;
874 b_pic= pic->data[0] + offset + 16; //FIXME +16
875 diff= s->dsp.pix_abs16x16(p_pic, b_pic, s->linesize);
876 if(diff>s->qscale*70){ //FIXME check that 70 is optimal
885 /* skip macroblock */
886 put_bits(&s->pb, 1, 1);
888 if(interleaved_stats){
898 put_bits(&s->pb, 1, 0); /* mb coded */
899 if(s->mv_type==MV_TYPE_16X16){
901 if(s->dquant) cbpc+= 8;
903 inter_MCBPC_bits[cbpc],
904 inter_MCBPC_code[cbpc]);
908 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
910 put_bits(pb2, 2, dquant_code[s->dquant+2]);
912 if(!s->progressive_sequence){
914 put_bits(pb2, 1, s->interlaced_dct);
915 put_bits(pb2, 1, 0); // no interlaced ME yet
918 if(interleaved_stats){
919 s->misc_bits+= get_bits_diff(s);
922 /* motion vectors: 16x16 mode */
923 h263_pred_motion(s, 0, &pred_x, &pred_y);
925 h263_encode_motion(s, motion_x - pred_x, s->f_code);
926 h263_encode_motion(s, motion_y - pred_y, s->f_code);
930 inter_MCBPC_bits[cbpc],
931 inter_MCBPC_code[cbpc]);
934 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
936 if(!s->progressive_sequence){
938 put_bits(pb2, 1, s->interlaced_dct);
941 if(interleaved_stats){
942 s->misc_bits+= get_bits_diff(s);
946 /* motion vectors: 8x8 mode*/
947 h263_pred_motion(s, i, &pred_x, &pred_y);
949 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][0] - pred_x, s->f_code);
950 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][1] - pred_y, s->f_code);
954 if(interleaved_stats){
955 s->mv_bits+= get_bits_diff(s);
958 /* encode each block */
959 for (i = 0; i < 6; i++) {
960 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, NULL, tex_pb);
963 if(interleaved_stats){
964 s->p_tex_bits+= get_bits_diff(s);
970 int dc_diff[6]; //dc values with the dc prediction subtracted
971 int dir[6]; //prediction direction
972 int zigzag_last_index[6];
973 uint8_t *scan_table[6];
977 const int level= block[i][0];
980 dc_diff[i]= level - ff_mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]);
982 *dc_ptr = level * s->y_dc_scale;
984 *dc_ptr = level * s->c_dc_scale;
988 if(s->flags & CODEC_FLAG_AC_PRED){
989 s->ac_pred= decide_ac_pred(s, block, dir, scan_table, zigzag_last_index);
991 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
994 scan_table[i]= s->intra_scantable.permutated;
999 for (i = 0; i < 6; i++) {
1000 if (s->block_last_index[i] >= 1)
1001 cbp |= 1 << (5 - i);
1005 if (s->pict_type == I_TYPE) {
1006 if(s->dquant) cbpc+=4;
1008 intra_MCBPC_bits[cbpc],
1009 intra_MCBPC_code[cbpc]);
1011 if(s->dquant) cbpc+=8;
1012 put_bits(&s->pb, 1, 0); /* mb coded */
1014 inter_MCBPC_bits[cbpc + 4],
1015 inter_MCBPC_code[cbpc + 4]);
1017 put_bits(pb2, 1, s->ac_pred);
1019 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1021 put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
1023 if(!s->progressive_sequence){
1024 put_bits(dc_pb, 1, s->interlaced_dct);
1027 if(interleaved_stats){
1028 s->misc_bits+= get_bits_diff(s);
1031 /* encode each block */
1032 for (i = 0; i < 6; i++) {
1033 mpeg4_encode_block(s, block[i], i, dc_diff[i], scan_table[i], dc_pb, tex_pb);
1036 if(interleaved_stats){
1037 s->i_tex_bits+= get_bits_diff(s);
1041 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
1043 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
1047 void h263_encode_mb(MpegEncContext * s,
1048 DCTELEM block[6][64],
1049 int motion_x, int motion_y)
1051 int cbpc, cbpy, i, cbp, pred_x, pred_y;
1053 int16_t rec_intradc[6];
1054 uint16_t *dc_ptr[6];
1055 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1);
1056 const int dquant_code[5]= {1,0,9,2,3};
1058 //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
1061 cbp= get_p_cbp(s, block, motion_x, motion_y);
1063 if ((cbp | motion_x | motion_y | s->dquant) == 0) {
1064 /* skip macroblock */
1065 put_bits(&s->pb, 1, 1);
1066 if(interleaved_stats){
1072 put_bits(&s->pb, 1, 0); /* mb coded */
1074 if(s->dquant) cbpc+= 8;
1076 inter_MCBPC_bits[cbpc],
1077 inter_MCBPC_code[cbpc]);
1080 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1082 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1084 if(interleaved_stats){
1085 s->misc_bits+= get_bits_diff(s);
1088 /* motion vectors: 16x16 mode only now */
1089 h263_pred_motion(s, 0, &pred_x, &pred_y);
1092 h263_encode_motion(s, motion_x - pred_x, s->f_code);
1093 h263_encode_motion(s, motion_y - pred_y, s->f_code);
1096 h263p_encode_umotion(s, motion_x - pred_x);
1097 h263p_encode_umotion(s, motion_y - pred_y);
1098 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
1099 /* To prevent Start Code emulation */
1100 put_bits(&s->pb,1,1);
1103 if(interleaved_stats){
1104 s->mv_bits+= get_bits_diff(s);
1107 int li = s->h263_aic ? 0 : 1;
1110 for(i=0; i<6; i++) {
1112 if (s->h263_aic && s->mb_intra) {
1113 int16_t level = block[i][0];
1115 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
1119 level = (level + (s->qscale >> 1))/(s->y_dc_scale);
1121 level = (level - (s->qscale >> 1))/(s->y_dc_scale);
1123 /* AIC can change CBP */
1124 if (level == 0 && s->block_last_index[i] == 0)
1125 s->block_last_index[i] = -1;
1126 else if (level < -127)
1128 else if (level > 127)
1131 block[i][0] = level;
1132 /* Reconstruction */
1133 rec_intradc[i] = (s->y_dc_scale*level) + pred_dc;
1135 rec_intradc[i] |= 1;
1136 //if ((rec_intradc[i] % 2) == 0)
1137 // rec_intradc[i]++;
1139 if (rec_intradc[i] < 0)
1141 else if (rec_intradc[i] > 2047)
1142 rec_intradc[i] = 2047;
1144 /* Update AC/DC tables */
1145 *dc_ptr[i] = rec_intradc[i];
1148 if (s->block_last_index[i] >= li)
1149 cbp |= 1 << (5 - i);
1153 if (s->pict_type == I_TYPE) {
1154 if(s->dquant) cbpc+=4;
1156 intra_MCBPC_bits[cbpc],
1157 intra_MCBPC_code[cbpc]);
1159 if(s->dquant) cbpc+=8;
1160 put_bits(&s->pb, 1, 0); /* mb coded */
1162 inter_MCBPC_bits[cbpc + 4],
1163 inter_MCBPC_code[cbpc + 4]);
1166 /* XXX: currently, we do not try to use ac prediction */
1167 put_bits(&s->pb, 1, 0); /* no AC prediction */
1170 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
1172 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
1174 if(interleaved_stats){
1175 s->misc_bits+= get_bits_diff(s);
1179 for(i=0; i<6; i++) {
1180 /* encode each block */
1181 h263_encode_block(s, block[i], i);
1183 /* Update INTRADC for decoding */
1184 if (s->h263_aic && s->mb_intra) {
1185 block[i][0] = rec_intradc[i];
1190 if(interleaved_stats){
1192 s->p_tex_bits+= get_bits_diff(s);
1195 s->i_tex_bits+= get_bits_diff(s);
1202 static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr)
1204 int x, y, wrap, a, c, pred_dc, scale;
1205 int16_t *dc_val, *ac_val;
1207 /* find prediction */
1209 x = 2 * s->mb_x + 1 + (n & 1);
1210 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
1211 wrap = s->mb_width * 2 + 2;
1212 dc_val = s->dc_val[0];
1213 ac_val = s->ac_val[0][0];
1214 scale = s->y_dc_scale;
1218 wrap = s->mb_width + 2;
1219 dc_val = s->dc_val[n - 4 + 1];
1220 ac_val = s->ac_val[n - 4 + 1][0];
1221 scale = s->c_dc_scale;
1226 a = dc_val[(x - 1) + (y) * wrap];
1227 c = dc_val[(x) + (y - 1) * wrap];
1229 /* No prediction outside GOB boundary */
1230 if (s->first_slice_line && ((n < 2) || (n > 3)))
1233 /* just DC prediction */
1234 if (a != 1024 && c != 1024)
1235 pred_dc = (a + c) >> 1;
1241 /* we assume pred is positive */
1242 //pred_dc = (pred_dc + (scale >> 1)) / scale;
1243 *dc_val_ptr = &dc_val[x + y * wrap];
1247 static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n)
1249 int x, y, wrap, a, c, pred_dc, scale, i;
1250 int16_t *dc_val, *ac_val, *ac_val1;
1252 /* find prediction */
1254 x = 2 * s->mb_x + 1 + (n & 1);
1255 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
1256 wrap = s->mb_width * 2 + 2;
1257 dc_val = s->dc_val[0];
1258 ac_val = s->ac_val[0][0];
1259 scale = s->y_dc_scale;
1263 wrap = s->mb_width + 2;
1264 dc_val = s->dc_val[n - 4 + 1];
1265 ac_val = s->ac_val[n - 4 + 1][0];
1266 scale = s->c_dc_scale;
1269 ac_val += ((y) * wrap + (x)) * 16;
1275 a = dc_val[(x - 1) + (y) * wrap];
1276 c = dc_val[(x) + (y - 1) * wrap];
1278 /* No prediction outside GOB boundary */
1279 if (s->first_slice_line && ((n < 2) || (n > 3)))
1283 if (s->h263_aic_dir) {
1284 /* left prediction */
1288 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
1293 /* top prediction */
1295 ac_val -= 16 * wrap;
1297 block[s->dsp.idct_permutation[i ]] += ac_val[i + 8];
1303 /* just DC prediction */
1304 if (a != 1024 && c != 1024)
1305 pred_dc = (a + c) >> 1;
1312 /* we assume pred is positive */
1313 block[0]=block[0]*scale + pred_dc;
1317 else if (!(block[0] & 1))
1320 /* Update AC/DC tables */
1321 dc_val[(x) + (y) * wrap] = block[0];
1325 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
1328 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
1331 int16_t *h263_pred_motion(MpegEncContext * s, int block,
1335 int16_t *A, *B, *C, *mot_val;
1336 static const int off[4]= {2, 1, 1, -1};
1338 wrap = s->block_wrap[0];
1339 xy = s->block_index[block];
1341 mot_val = s->motion_val[xy];
1343 A = s->motion_val[xy - 1];
1344 /* special case for first (slice) line */
1345 if (s->first_slice_line && block<3) {
1346 // we cant just change some MVs to simulate that as we need them for the B frames (and ME)
1347 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
1348 if(block==0){ //most common case
1349 if(s->mb_x == s->resync_mb_x){ //rare
1351 }else if(s->mb_x + 1 == s->resync_mb_x){ //rare
1352 C = s->motion_val[xy + off[block] - wrap];
1357 *px = mid_pred(A[0], 0, C[0]);
1358 *py = mid_pred(A[1], 0, C[1]);
1365 if(s->mb_x + 1 == s->resync_mb_x){ //rare
1366 C = s->motion_val[xy + off[block] - wrap];
1367 *px = mid_pred(A[0], 0, C[0]);
1368 *py = mid_pred(A[1], 0, C[1]);
1373 }else{ /* block==2*/
1374 B = s->motion_val[xy - wrap];
1375 C = s->motion_val[xy + off[block] - wrap];
1376 if(s->mb_x == s->resync_mb_x) //rare
1379 *px = mid_pred(A[0], B[0], C[0]);
1380 *py = mid_pred(A[1], B[1], C[1]);
1383 B = s->motion_val[xy - wrap];
1384 C = s->motion_val[xy + off[block] - wrap];
1385 *px = mid_pred(A[0], B[0], C[0]);
1386 *py = mid_pred(A[1], B[1], C[1]);
1391 #ifdef CONFIG_ENCODERS
1392 static void h263_encode_motion(MpegEncContext * s, int val, int f_code)
1394 int range, l, bit_size, sign, code, bits;
1399 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1401 bit_size = f_code - 1;
1402 range = 1 << bit_size;
1403 /* modulo encoding */
1410 val= (val^sign)-sign;
1415 } else if (val >= l) {
1419 assert(val>=-l && val<l);
1429 code = (val >> bit_size) + 1;
1430 bits = val & (range - 1);
1432 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1434 put_bits(&s->pb, bit_size, bits);
1440 /* Encode MV differences on H.263+ with Unrestricted MV mode */
1441 static void h263p_encode_umotion(MpegEncContext * s, int val)
1451 put_bits(&s->pb, 1, 1);
1453 put_bits(&s->pb, 3, 0);
1455 put_bits(&s->pb, 3, 2);
1458 sval = ((val < 0) ? (short)(-val):(short)val);
1461 while (temp_val != 0) {
1462 temp_val = temp_val >> 1;
1468 tcode = (sval & (1 << (i-1))) >> (i-1);
1469 tcode = (tcode << 1) | 1;
1470 code = (code << 2) | tcode;
1473 code = ((code << 1) | (val < 0)) << 1;
1474 put_bits(&s->pb, (2*n_bits)+1, code);
1475 //printf("\nVal = %d\tCode = %d", sval, code);
1479 static void init_mv_penalty_and_fcode(MpegEncContext *s)
1484 if(mv_penalty==NULL)
1485 mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
1487 for(f_code=1; f_code<=MAX_FCODE; f_code++){
1488 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
1491 if(mv==0) len= mvtab[0][1];
1493 int val, bit_size, range, code;
1495 bit_size = s->f_code - 1;
1496 range = 1 << bit_size;
1502 code = (val >> bit_size) + 1;
1504 len= mvtab[code][1] + 1 + bit_size;
1506 len= mvtab[32][1] + 2 + bit_size;
1510 mv_penalty[f_code][mv+MAX_MV]= len;
1514 for(f_code=MAX_FCODE; f_code>0; f_code--){
1515 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
1516 fcode_tab[mv+MAX_MV]= f_code;
1520 for(mv=0; mv<MAX_MV*2+1; mv++){
1521 umv_fcode_tab[mv]= 1;
1526 #ifdef CONFIG_ENCODERS
1528 static void init_uni_dc_tab(void)
1530 int level, uni_code, uni_len;
1532 for(level=-256; level<256; level++){
1534 /* find number of bits */
1543 l= (-level) ^ ((1 << size) - 1);
1548 uni_code= DCtab_lum[size][0];
1549 uni_len = DCtab_lum[size][1];
1552 uni_code<<=size; uni_code|=l;
1555 uni_code<<=1; uni_code|=1;
1559 uni_DCtab_lum_bits[level+256]= uni_code;
1560 uni_DCtab_lum_len [level+256]= uni_len;
1563 uni_code= DCtab_chrom[size][0];
1564 uni_len = DCtab_chrom[size][1];
1567 uni_code<<=size; uni_code|=l;
1570 uni_code<<=1; uni_code|=1;
1574 uni_DCtab_chrom_bits[level+256]= uni_code;
1575 uni_DCtab_chrom_len [level+256]= uni_len;
1580 #endif //CONFIG_ENCODERS
1582 #ifdef CONFIG_ENCODERS
1583 static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
1584 int slevel, run, last;
1586 assert(MAX_LEVEL >= 64);
1587 assert(MAX_RUN >= 63);
1589 for(slevel=-64; slevel<64; slevel++){
1590 if(slevel==0) continue;
1591 for(run=0; run<64; run++){
1592 for(last=0; last<=1; last++){
1593 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
1594 int level= slevel < 0 ? -slevel : slevel;
1595 int sign= slevel < 0 ? 1 : 0;
1596 int bits, len, code;
1599 len_tab[index]= 100;
1602 code= get_rl_index(rl, last, run, level);
1603 bits= rl->table_vlc[code][0];
1604 len= rl->table_vlc[code][1];
1605 bits=bits*2+sign; len++;
1607 if(code!=rl->n && len < len_tab[index]){
1608 bits_tab[index]= bits;
1609 len_tab [index]= len;
1613 bits= rl->table_vlc[rl->n][0];
1614 len= rl->table_vlc[rl->n][1];
1615 bits=bits*2; len++; //esc1
1616 level1= level - rl->max_level[last][run];
1618 code= get_rl_index(rl, last, run, level1);
1619 bits<<= rl->table_vlc[code][1];
1620 len += rl->table_vlc[code][1];
1621 bits += rl->table_vlc[code][0];
1622 bits=bits*2+sign; len++;
1624 if(code!=rl->n && len < len_tab[index]){
1625 bits_tab[index]= bits;
1626 len_tab [index]= len;
1632 bits= rl->table_vlc[rl->n][0];
1633 len= rl->table_vlc[rl->n][1];
1634 bits=bits*4+2; len+=2; //esc2
1635 run1 = run - rl->max_run[last][level] - 1;
1637 code= get_rl_index(rl, last, run1, level);
1638 bits<<= rl->table_vlc[code][1];
1639 len += rl->table_vlc[code][1];
1640 bits += rl->table_vlc[code][0];
1641 bits=bits*2+sign; len++;
1643 if(code!=rl->n && len < len_tab[index]){
1644 bits_tab[index]= bits;
1645 len_tab [index]= len;
1650 bits= rl->table_vlc[rl->n][0];
1651 len = rl->table_vlc[rl->n][1];
1652 bits=bits*4+3; len+=2; //esc3
1653 bits=bits*2+last; len++;
1654 bits=bits*64+run; len+=6;
1655 bits=bits*2+1; len++; //marker
1656 bits=bits*4096+(slevel&0xfff); len+=12;
1657 bits=bits*2+1; len++; //marker
1659 if(len < len_tab[index]){
1660 bits_tab[index]= bits;
1661 len_tab [index]= len;
1668 void h263_encode_init(MpegEncContext *s)
1670 static int done = 0;
1679 init_rl(&rl_intra_aic);
1681 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
1682 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
1684 init_mv_penalty_and_fcode(s);
1686 s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
1688 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
1689 switch(s->codec_id){
1690 case CODEC_ID_MPEG4:
1691 s->fcode_tab= fcode_tab;
1692 s->min_qcoeff= -2048;
1693 s->max_qcoeff= 2047;
1694 s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len;
1695 s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64;
1696 s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len;
1697 s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64;
1698 s->luma_dc_vlc_length= uni_DCtab_lum_len;
1699 s->chroma_dc_vlc_length= uni_DCtab_chrom_len;
1700 s->ac_esc_length= 7+2+1+6+1+12+1;
1702 if(s->flags & CODEC_FLAG_GLOBAL_HEADER){
1704 s->avctx->extradata= av_malloc(1024);
1705 init_put_bits(&s->pb, s->avctx->extradata, 1024);
1707 mpeg4_encode_visual_object_header(s);
1708 mpeg4_encode_vol_header(s, 0, 0);
1710 // ff_mpeg4_stuffing(&s->pb); ?
1711 flush_put_bits(&s->pb);
1712 s->avctx->extradata_size= (get_bit_count(&s->pb)+7)>>3;
1716 case CODEC_ID_H263P:
1717 s->fcode_tab= umv_fcode_tab;
1718 s->min_qcoeff= -127;
1721 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
1723 if (s->h263_flv > 1) {
1724 s->min_qcoeff= -1023;
1725 s->max_qcoeff= 1023;
1727 s->min_qcoeff= -127;
1730 s->y_dc_scale_table=
1731 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
1733 default: //nothing needed default table allready set in mpegvideo.c
1734 s->min_qcoeff= -127;
1736 s->y_dc_scale_table=
1737 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
1742 * encodes a 8x8 block.
1743 * @param block the 8x8 block
1744 * @param n block index (0-3 are luma, 4-5 are chroma)
1746 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
1748 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
1752 if (s->mb_intra && !s->h263_aic) {
1755 /* 255 cannot be represented, so we clamp */
1760 /* 0 cannot be represented also */
1761 else if (level < 1) {
1765 if (level == 128) //FIXME check rv10
1766 put_bits(&s->pb, 8, 0xff);
1768 put_bits(&s->pb, 8, level & 0xff);
1772 if (s->h263_aic && s->mb_intra)
1777 last_index = s->block_last_index[n];
1778 last_non_zero = i - 1;
1779 for (; i <= last_index; i++) {
1780 j = s->intra_scantable.permutated[i];
1783 run = i - last_non_zero - 1;
1784 last = (i == last_index);
1791 code = get_rl_index(rl, last, run, level);
1792 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1793 if (code == rl->n) {
1794 if(s->h263_flv <= 1){
1795 put_bits(&s->pb, 1, last);
1796 put_bits(&s->pb, 6, run);
1798 assert(slevel != 0);
1800 if(slevel < 128 && slevel > -128)
1801 put_bits(&s->pb, 8, slevel & 0xff);
1803 put_bits(&s->pb, 8, 128);
1804 put_bits(&s->pb, 5, slevel & 0x1f);
1805 put_bits(&s->pb, 6, (slevel>>5)&0x3f);
1808 if(slevel < 64 && slevel > -64) {
1810 put_bits(&s->pb, 1, 0);
1811 put_bits(&s->pb, 1, last);
1812 put_bits(&s->pb, 6, run);
1814 put_bits(&s->pb, 7, slevel & 0x7f);
1817 put_bits(&s->pb, 1, 1);
1818 put_bits(&s->pb, 1, last);
1819 put_bits(&s->pb, 6, run);
1821 put_bits(&s->pb, 11, slevel & 0x7ff);
1825 put_bits(&s->pb, 1, sign);
1833 #ifdef CONFIG_ENCODERS
1835 /***************************************************/
1837 * add mpeg4 stuffing bits (01...1)
1839 void ff_mpeg4_stuffing(PutBitContext * pbc)
1842 put_bits(pbc, 1, 0);
1843 length= (-get_bit_count(pbc))&7;
1844 if(length) put_bits(pbc, length, (1<<length)-1);
1847 /* must be called before writing the header */
1848 void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){
1849 int time_div, time_mod;
1851 if(s->current_picture.pts)
1852 s->time= (s->current_picture.pts*s->time_increment_resolution + 500*1000)/(1000*1000);
1854 s->time= av_rescale(picture_number*(int64_t)s->avctx->frame_rate_base, s->time_increment_resolution, s->avctx->frame_rate);
1855 time_div= s->time/s->time_increment_resolution;
1856 time_mod= s->time%s->time_increment_resolution;
1858 if(s->pict_type==B_TYPE){
1859 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
1861 s->last_time_base= s->time_base;
1862 s->time_base= time_div;
1863 s->pp_time= s->time - s->last_non_b_time;
1864 s->last_non_b_time= s->time;
1868 static void mpeg4_encode_gop_header(MpegEncContext * s){
1869 int hours, minutes, seconds;
1871 put_bits(&s->pb, 16, 0);
1872 put_bits(&s->pb, 16, GOP_STARTCODE);
1874 seconds= s->time/s->time_increment_resolution;
1875 minutes= seconds/60; seconds %= 60;
1876 hours= minutes/60; minutes %= 60;
1879 put_bits(&s->pb, 5, hours);
1880 put_bits(&s->pb, 6, minutes);
1881 put_bits(&s->pb, 1, 1);
1882 put_bits(&s->pb, 6, seconds);
1884 put_bits(&s->pb, 1, 0); //closed gov == NO
1885 put_bits(&s->pb, 1, 0); //broken link == NO
1887 ff_mpeg4_stuffing(&s->pb);
1890 static void mpeg4_encode_visual_object_header(MpegEncContext * s){
1891 int profile_and_level_indication;
1894 if(s->max_b_frames || s->quarter_sample){
1895 profile_and_level_indication= 0xF1; // adv simple level 1
1898 profile_and_level_indication= 0x01; // simple level 1
1903 put_bits(&s->pb, 16, 0);
1904 put_bits(&s->pb, 16, VOS_STARTCODE);
1906 put_bits(&s->pb, 8, profile_and_level_indication);
1908 put_bits(&s->pb, 16, 0);
1909 put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);
1911 put_bits(&s->pb, 1, 1);
1912 put_bits(&s->pb, 4, vo_ver_id);
1913 put_bits(&s->pb, 3, 1); //priority
1915 put_bits(&s->pb, 4, 1); //visual obj type== video obj
1917 put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME
1919 ff_mpeg4_stuffing(&s->pb);
1922 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number)
1926 if(s->max_b_frames || s->quarter_sample){
1928 s->vo_type= ADV_SIMPLE_VO_TYPE;
1931 s->vo_type= SIMPLE_VO_TYPE;
1934 put_bits(&s->pb, 16, 0);
1935 put_bits(&s->pb, 16, 0x100 + vo_number); /* video obj */
1936 put_bits(&s->pb, 16, 0);
1937 put_bits(&s->pb, 16, 0x120 + vol_number); /* video obj layer */
1939 put_bits(&s->pb, 1, 0); /* random access vol */
1940 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
1941 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
1942 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
1943 put_bits(&s->pb, 3, 1); /* is obj layer priority */
1945 aspect_to_info(s, s->avctx->sample_aspect_ratio);
1947 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
1948 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
1949 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
1950 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
1954 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
1955 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
1956 put_bits(&s->pb, 1, s->low_delay);
1957 put_bits(&s->pb, 1, 0); /* vbv parameters= no */
1959 put_bits(&s->pb, 1, 0); /* vol control parameters= no */
1962 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
1963 put_bits(&s->pb, 1, 1); /* marker bit */
1965 put_bits(&s->pb, 16, s->time_increment_resolution);
1966 if (s->time_increment_bits < 1)
1967 s->time_increment_bits = 1;
1968 put_bits(&s->pb, 1, 1); /* marker bit */
1969 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
1970 put_bits(&s->pb, 1, 1); /* marker bit */
1971 put_bits(&s->pb, 13, s->width); /* vol width */
1972 put_bits(&s->pb, 1, 1); /* marker bit */
1973 put_bits(&s->pb, 13, s->height); /* vol height */
1974 put_bits(&s->pb, 1, 1); /* marker bit */
1975 put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
1976 put_bits(&s->pb, 1, 1); /* obmc disable */
1977 if (vo_ver_id == 1) {
1978 put_bits(&s->pb, 1, s->vol_sprite_usage=0); /* sprite enable */
1980 put_bits(&s->pb, 2, s->vol_sprite_usage=0); /* sprite enable */
1983 s->quant_precision=5;
1984 put_bits(&s->pb, 1, 0); /* not 8 bit == false */
1985 put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
1988 ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix);
1989 ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix);
1993 put_bits(&s->pb, 1, s->quarter_sample);
1994 put_bits(&s->pb, 1, 1); /* complexity estimation disable */
1995 s->resync_marker= s->rtp_mode;
1996 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
1997 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
1998 if(s->data_partitioning){
1999 put_bits(&s->pb, 1, 0); /* no rvlc */
2002 if (vo_ver_id != 1){
2003 put_bits(&s->pb, 1, 0); /* newpred */
2004 put_bits(&s->pb, 1, 0); /* reduced res vop */
2006 put_bits(&s->pb, 1, 0); /* scalability */
2008 ff_mpeg4_stuffing(&s->pb);
2011 if(!(s->flags & CODEC_FLAG_BITEXACT)){
2012 put_bits(&s->pb, 16, 0);
2013 put_bits(&s->pb, 16, 0x1B2); /* user_data */
2014 put_string(&s->pb, LIBAVCODEC_IDENT);
2015 ff_mpeg4_stuffing(&s->pb);
2019 /* write mpeg4 VOP header */
2020 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
2023 int time_div, time_mod;
2025 if(s->pict_type==I_TYPE){
2026 if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
2027 if(s->strict_std_compliance < 2) //HACK, the reference sw is buggy
2028 mpeg4_encode_visual_object_header(s);
2029 if(s->strict_std_compliance < 2 || picture_number==0) //HACK, the reference sw is buggy
2030 mpeg4_encode_vol_header(s, 0, 0);
2032 mpeg4_encode_gop_header(s);
2035 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
2037 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->frame_rate, FRAME_RATE_BASE);
2039 put_bits(&s->pb, 16, 0); /* vop header */
2040 put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */
2041 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
2043 time_div= s->time/s->time_increment_resolution;
2044 time_mod= s->time%s->time_increment_resolution;
2045 time_incr= time_div - s->last_time_base;
2047 put_bits(&s->pb, 1, 1);
2049 put_bits(&s->pb, 1, 0);
2051 put_bits(&s->pb, 1, 1); /* marker */
2052 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
2053 put_bits(&s->pb, 1, 1); /* marker */
2054 put_bits(&s->pb, 1, 1); /* vop coded */
2055 if ( s->pict_type == P_TYPE
2056 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
2057 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
2059 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
2060 if(!s->progressive_sequence){
2061 put_bits(&s->pb, 1, s->top_field_first);
2062 put_bits(&s->pb, 1, s->alternate_scan);
2064 //FIXME sprite stuff
2066 put_bits(&s->pb, 5, s->qscale);
2068 if (s->pict_type != I_TYPE)
2069 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
2070 if (s->pict_type == B_TYPE)
2071 put_bits(&s->pb, 3, s->b_code); /* fcode_back */
2072 // printf("****frame %d\n", picture_number);
2074 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
2075 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
2078 #endif //CONFIG_ENCODERS
2081 * change qscale by given dquant and update qscale dependant variables.
2083 static void change_qscale(MpegEncContext * s, int dquant)
2085 s->qscale += dquant;
2089 else if (s->qscale > 31)
2092 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
2093 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
2098 * @param n block index (0-3 are luma, 4-5 are chroma)
2099 * @param dc_val_ptr a pointer to the dc_val entry for the current MB will be stored here
2100 * @param dir_ptr pointer to an integer where the prediction direction will be stored
2101 * @return the quantized predicted dc
2103 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr, int *dir_ptr)
2105 int a, b, c, wrap, pred, scale;
2108 /* find prediction */
2110 scale = s->y_dc_scale;
2112 scale = s->c_dc_scale;
2117 wrap= s->block_wrap[n];
2118 dc_val = s->dc_val[0] + s->block_index[n];
2124 b = dc_val[ - 1 - wrap];
2125 c = dc_val[ - wrap];
2127 /* outside slice handling (we cant do that by memset as we need the dc for error resilience) */
2128 if(s->first_slice_line && n!=3){
2130 if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
2132 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
2133 if(n==0 || n==4 || n==5)
2137 if (abs(a - b) < abs(b - c)) {
2139 *dir_ptr = 1; /* top */
2142 *dir_ptr = 0; /* left */
2144 /* we assume pred is positive */
2145 pred = FASTDIV((pred + (scale >> 1)), scale);
2147 /* prepare address for prediction update */
2148 *dc_val_ptr = &dc_val[0];
2155 * @param n block index (0-3 are luma, 4-5 are chroma)
2156 * @param dir the ac prediction direction
2158 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
2162 int16_t *ac_val, *ac_val1;
2163 int8_t * const qscale_table= s->current_picture.qscale_table;
2165 /* find prediction */
2166 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2170 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
2171 /* left prediction */
2174 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
2177 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
2180 /* different qscale, we must rescale */
2182 block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
2186 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
2187 /* top prediction */
2188 ac_val -= 16 * s->block_wrap[n];
2190 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
2193 block[s->dsp.idct_permutation[i]] += ac_val[i + 8];
2196 /* different qscale, we must rescale */
2198 block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
2205 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
2209 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
2213 #ifdef CONFIG_ENCODERS
2216 * encodes the dc value.
2217 * @param n block index (0-3 are luma, 4-5 are chroma)
2219 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
2222 // if(level<-255 || level>255) printf("dc overflow\n");
2226 put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]);
2229 put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]);
2233 /* find number of bits */
2243 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
2246 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
2249 /* encode remaining bits */
2252 level = (-level) ^ ((1 << size) - 1);
2253 put_bits(&s->pb, size, level);
2255 put_bits(&s->pb, 1, 1);
2261 * encodes a 8x8 block
2262 * @param n block index (0-3 are luma, 4-5 are chroma)
2264 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2265 uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
2267 int i, last_non_zero;
2268 #if 0 //variables for the outcommented version
2269 int code, sign, last;
2274 const int last_index = s->block_last_index[n];
2276 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2277 /* mpeg4 based DC predictor */
2278 mpeg4_encode_dc(dc_pb, intra_dc, n);
2279 if(last_index<1) return;
2282 bits_tab= uni_mpeg4_intra_rl_bits;
2283 len_tab = uni_mpeg4_intra_rl_len;
2285 if(last_index<0) return;
2288 bits_tab= uni_mpeg4_inter_rl_bits;
2289 len_tab = uni_mpeg4_inter_rl_len;
2293 last_non_zero = i - 1;
2295 for (; i < last_index; i++) {
2296 int level = block[ scan_table[i] ];
2298 int run = i - last_non_zero - 1;
2300 if((level&(~127)) == 0){
2301 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2302 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2304 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);
2309 /*if(i<=last_index)*/{
2310 int level = block[ scan_table[i] ];
2311 int run = i - last_non_zero - 1;
2313 if((level&(~127)) == 0){
2314 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2315 put_bits(ac_pb, len_tab[index], bits_tab[index]);
2317 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);
2321 for (; i <= last_index; i++) {
2322 const int slevel = block[ scan_table[i] ];
2325 int run = i - last_non_zero - 1;
2326 last = (i == last_index);
2333 code = get_rl_index(rl, last, run, level);
2334 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2335 if (code == rl->n) {
2337 level1 = level - rl->max_level[last][run];
2340 code = get_rl_index(rl, last, run, level1);
2341 if (code == rl->n) {
2343 put_bits(ac_pb, 1, 1);
2344 if (level > MAX_LEVEL)
2346 run1 = run - rl->max_run[last][level] - 1;
2349 code = get_rl_index(rl, last, run1, level);
2350 if (code == rl->n) {
2353 put_bits(ac_pb, 1, 1);
2354 put_bits(ac_pb, 1, last);
2355 put_bits(ac_pb, 6, run);
2356 put_bits(ac_pb, 1, 1);
2357 put_bits(ac_pb, 12, slevel & 0xfff);
2358 put_bits(ac_pb, 1, 1);
2361 put_bits(ac_pb, 1, 0);
2362 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2363 put_bits(ac_pb, 1, sign);
2367 put_bits(ac_pb, 1, 0);
2368 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
2369 put_bits(ac_pb, 1, sign);
2372 put_bits(ac_pb, 1, sign);
2380 static inline int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
2381 uint8_t *scan_table)
2383 int i, last_non_zero;
2386 const int last_index = s->block_last_index[n];
2389 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
2390 /* mpeg4 based DC predictor */
2391 //mpeg4_encode_dc(dc_pb, intra_dc, n); //FIXME
2392 if(last_index<1) return len;
2395 len_tab = uni_mpeg4_intra_rl_len;
2397 if(last_index<0) return 0;
2400 len_tab = uni_mpeg4_inter_rl_len;
2404 last_non_zero = i - 1;
2405 for (; i < last_index; i++) {
2406 int level = block[ scan_table[i] ];
2408 int run = i - last_non_zero - 1;
2410 if((level&(~127)) == 0){
2411 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
2412 len += len_tab[index];
2414 len += 7+2+1+6+1+12+1;
2419 /*if(i<=last_index)*/{
2420 int level = block[ scan_table[i] ];
2421 int run = i - last_non_zero - 1;
2423 if((level&(~127)) == 0){
2424 const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
2425 len += len_tab[index];
2427 len += 7+2+1+6+1+12+1;
2437 /***********************************************/
2440 static VLC intra_MCBPC_vlc;
2441 static VLC inter_MCBPC_vlc;
2442 static VLC cbpy_vlc;
2444 static VLC dc_lum, dc_chrom;
2445 static VLC sprite_trajectory;
2446 static VLC mb_type_b_vlc;
2448 void init_vlc_rl(RLTable *rl)
2452 init_vlc(&rl->vlc, 9, rl->n + 1,
2453 &rl->table_vlc[0][1], 4, 2,
2454 &rl->table_vlc[0][0], 4, 2);
2457 for(q=0; q<32; q++){
2466 rl->rl_vlc[q]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
2467 for(i=0; i<rl->vlc.table_size; i++){
2468 int code= rl->vlc.table[i][0];
2469 int len = rl->vlc.table[i][1];
2472 if(len==0){ // illegal code
2475 }else if(len<0){ //more bits needed
2479 if(code==rl->n){ //esc
2483 run= rl->table_run [code] + 1;
2484 level= rl->table_level[code] * qmul + qadd;
2485 if(code >= rl->last) run+=192;
2488 rl->rl_vlc[q][i].len= len;
2489 rl->rl_vlc[q][i].level= level;
2490 rl->rl_vlc[q][i].run= run;
2497 /* XXX: find a better solution to handle static init */
2498 void h263_decode_init_vlc(MpegEncContext *s)
2500 static int done = 0;
2505 init_vlc(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 9,
2506 intra_MCBPC_bits, 1, 1,
2507 intra_MCBPC_code, 1, 1);
2508 init_vlc(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 28,
2509 inter_MCBPC_bits, 1, 1,
2510 inter_MCBPC_code, 1, 1);
2511 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
2512 &cbpy_tab[0][1], 2, 1,
2513 &cbpy_tab[0][0], 2, 1);
2514 init_vlc(&mv_vlc, MV_VLC_BITS, 33,
2516 &mvtab[0][0], 2, 1);
2519 init_rl(&rvlc_rl_inter);
2520 init_rl(&rvlc_rl_intra);
2521 init_rl(&rl_intra_aic);
2522 init_vlc_rl(&rl_inter);
2523 init_vlc_rl(&rl_intra);
2524 init_vlc_rl(&rvlc_rl_inter);
2525 init_vlc_rl(&rvlc_rl_intra);
2526 init_vlc_rl(&rl_intra_aic);
2527 init_vlc(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
2528 &DCtab_lum[0][1], 2, 1,
2529 &DCtab_lum[0][0], 2, 1);
2530 init_vlc(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
2531 &DCtab_chrom[0][1], 2, 1,
2532 &DCtab_chrom[0][0], 2, 1);
2533 init_vlc(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
2534 &sprite_trajectory_tab[0][1], 4, 2,
2535 &sprite_trajectory_tab[0][0], 4, 2);
2536 init_vlc(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
2537 &mb_type_b_tab[0][1], 2, 1,
2538 &mb_type_b_tab[0][0], 2, 1);
2543 * Get the GOB height based on picture height.
2545 int ff_h263_get_gob_height(MpegEncContext *s){
2546 if (s->height <= 400)
2548 else if (s->height <= 800)
2555 * decodes the group of blocks header.
2556 * @return <0 if an error occured
2558 static int h263_decode_gob_header(MpegEncContext *s)
2560 unsigned int val, gfid;
2563 /* Check for GOB Start Code */
2564 val = show_bits(&s->gb, 16);
2568 /* We have a GBSC probably with GSTUFF */
2569 skip_bits(&s->gb, 16); /* Drop the zeros */
2570 left= s->gb.size_in_bits - get_bits_count(&s->gb);
2571 //MN: we must check the bits left or we might end in a infinite loop (or segfault)
2572 for(;left>13; left--){
2573 if(get_bits1(&s->gb)) break; /* Seek the '1' bit */
2579 fprintf(stderr,"\nGOB Start Code at MB %d\n", (s->mb_y * s->mb_width) + s->mb_x);
2581 s->gob_number = get_bits(&s->gb, 5); /* GN */
2582 gfid = get_bits(&s->gb, 2); /* GFID */
2583 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
2587 s->mb_y= s->gob_index* s->gob_number;
2588 if(s->mb_y >= s->mb_height)
2591 fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", s->gob_number, gfid, s->qscale);
2596 static inline void memsetw(short *tab, int val, int n)
2603 #ifdef CONFIG_ENCODERS
2605 void ff_mpeg4_init_partitions(MpegEncContext *s)
2607 init_put_bits(&s->tex_pb, s->tex_pb_buffer, PB_BUFFER_SIZE);
2608 init_put_bits(&s->pb2 , s->pb2_buffer , PB_BUFFER_SIZE);
2611 void ff_mpeg4_merge_partitions(MpegEncContext *s)
2613 const int pb2_len = get_bit_count(&s->pb2 );
2614 const int tex_pb_len= get_bit_count(&s->tex_pb);
2615 const int bits= get_bit_count(&s->pb);
2617 if(s->pict_type==I_TYPE){
2618 put_bits(&s->pb, 19, DC_MARKER);
2619 s->misc_bits+=19 + pb2_len + bits - s->last_bits;
2620 s->i_tex_bits+= tex_pb_len;
2622 put_bits(&s->pb, 17, MOTION_MARKER);
2623 s->misc_bits+=17 + pb2_len;
2624 s->mv_bits+= bits - s->last_bits;
2625 s->p_tex_bits+= tex_pb_len;
2628 flush_put_bits(&s->pb2);
2629 flush_put_bits(&s->tex_pb);
2631 ff_copy_bits(&s->pb, s->pb2_buffer , pb2_len);
2632 ff_copy_bits(&s->pb, s->tex_pb_buffer, tex_pb_len);
2633 s->last_bits= get_bit_count(&s->pb);
2636 #endif //CONFIG_ENCODERS
2638 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
2639 switch(s->pict_type){
2644 return s->f_code+15;
2646 return FFMAX(FFMAX(s->f_code, s->b_code)+15, 17);
2652 #ifdef CONFIG_ENCODERS
2654 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
2656 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
2658 ff_mpeg4_stuffing(&s->pb);
2659 put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0);
2660 put_bits(&s->pb, 1, 1);
2662 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
2663 put_bits(&s->pb, s->quant_precision, s->qscale);
2664 put_bits(&s->pb, 1, 0); /* no HEC */
2667 #endif //CONFIG_ENCODERS
2670 * check if the next stuff is a resync marker or the end.
2673 static inline int mpeg4_is_resync(MpegEncContext *s){
2674 const int bits_count= get_bits_count(&s->gb);
2676 if(s->workaround_bugs&FF_BUG_NO_PADDING){
2680 if(bits_count + 8 >= s->gb.size_in_bits){
2681 int v= show_bits(&s->gb, 8);
2682 v|= 0x7F >> (7-(bits_count&7));
2687 if(show_bits(&s->gb, 16) == ff_mpeg4_resync_prefix[bits_count&7]){
2689 GetBitContext gb= s->gb;
2691 skip_bits(&s->gb, 1);
2692 align_get_bits(&s->gb);
2694 for(len=0; len<32; len++){
2695 if(get_bits1(&s->gb)) break;
2700 if(len>=ff_mpeg4_get_video_packet_prefix_length(s))
2708 * decodes the next video packet.
2709 * @return <0 if something went wrong
2711 static int mpeg4_decode_video_packet_header(MpegEncContext *s)
2713 int mb_num_bits= av_log2(s->mb_num - 1) + 1;
2714 int header_extension=0, mb_num, len;
2716 /* is there enough space left for a video packet + header */
2717 if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1;
2719 for(len=0; len<32; len++){
2720 if(get_bits1(&s->gb)) break;
2723 if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
2724 printf("marker does not match f_code\n");
2728 if(s->shape != RECT_SHAPE){
2729 header_extension= get_bits1(&s->gb);
2730 //FIXME more stuff here
2733 mb_num= get_bits(&s->gb, mb_num_bits);
2734 if(mb_num>=s->mb_num){
2735 fprintf(stderr, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);
2738 if(s->pict_type == B_TYPE){
2739 while(s->next_picture.mbskip_table[ s->mb_index2xy[ mb_num ] ]) mb_num++;
2740 if(mb_num >= s->mb_num) return -1; // slice contains just skiped MBs which where allready decoded
2743 s->mb_x= mb_num % s->mb_width;
2744 s->mb_y= mb_num / s->mb_width;
2746 if(s->shape != BIN_ONLY_SHAPE){
2747 int qscale= get_bits(&s->gb, s->quant_precision);
2752 if(s->shape == RECT_SHAPE){
2753 header_extension= get_bits1(&s->gb);
2755 if(header_extension){
2759 while (get_bits1(&s->gb) != 0)
2762 check_marker(&s->gb, "before time_increment in video packed header");
2763 time_increment= get_bits(&s->gb, s->time_increment_bits);
2764 check_marker(&s->gb, "before vop_coding_type in video packed header");
2766 skip_bits(&s->gb, 2); /* vop coding type */
2767 //FIXME not rect stuff here
2769 if(s->shape != BIN_ONLY_SHAPE){
2770 skip_bits(&s->gb, 3); /* intra dc vlc threshold */
2771 //FIXME dont just ignore everything
2772 if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2773 mpeg4_decode_sprite_trajectory(s);
2774 fprintf(stderr, "untested\n");
2777 //FIXME reduced res stuff here
2779 if (s->pict_type != I_TYPE) {
2780 int f_code = get_bits(&s->gb, 3); /* fcode_for */
2782 printf("Error, video packet header damaged (f_code=0)\n");
2785 if (s->pict_type == B_TYPE) {
2786 int b_code = get_bits(&s->gb, 3);
2788 printf("Error, video packet header damaged (b_code=0)\n");
2793 //FIXME new-pred stuff
2795 //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));
2800 void ff_mpeg4_clean_buffers(MpegEncContext *s)
2802 int c_wrap, c_xy, l_wrap, l_xy;
2804 l_wrap= s->block_wrap[0];
2805 l_xy= s->mb_y*l_wrap*2 + s->mb_x*2;
2806 c_wrap= s->block_wrap[4];
2807 c_xy= s->mb_y*c_wrap + s->mb_x;
2811 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
2812 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
2813 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
2817 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t));
2818 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
2819 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t));
2822 // we cant clear the MVs as they might be needed by a b frame
2823 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t));
2824 // memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
2825 s->last_mv[0][0][0]=
2826 s->last_mv[0][0][1]=
2827 s->last_mv[1][0][0]=
2828 s->last_mv[1][0][1]= 0;
2832 * decodes the group of blocks / video packet header.
2833 * @return <0 if no resync found
2835 int ff_h263_resync(MpegEncContext *s){
2838 if(s->codec_id==CODEC_ID_MPEG4){
2840 align_get_bits(&s->gb);
2843 if(show_bits(&s->gb, 16)==0){
2844 if(s->codec_id==CODEC_ID_MPEG4)
2845 ret= mpeg4_decode_video_packet_header(s);
2847 ret= h263_decode_gob_header(s);
2851 //ok, its not where its supposed to be ...
2852 s->gb= s->last_resync_gb;
2853 align_get_bits(&s->gb);
2854 left= s->gb.size_in_bits - get_bits_count(&s->gb);
2856 for(;left>16+1+5+5; left-=8){
2857 if(show_bits(&s->gb, 16)==0){
2858 GetBitContext bak= s->gb;
2860 if(s->codec_id==CODEC_ID_MPEG4)
2861 ret= mpeg4_decode_video_packet_header(s);
2863 ret= h263_decode_gob_header(s);
2869 skip_bits(&s->gb, 8);
2876 * gets the average motion vector for a GMC MB.
2877 * @param n either 0 for the x component or 1 for y
2878 * @returns the average MV for a GMC MB
2880 static inline int get_amv(MpegEncContext *s, int n){
2881 int x, y, mb_v, sum, dx, dy, shift;
2882 int len = 1 << (s->f_code + 4);
2883 const int a= s->sprite_warping_accuracy;
2885 if(s->real_sprite_warping_points==1){
2886 if(s->divx_version==500 && s->divx_build==413)
2887 sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample));
2889 sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a);
2891 dx= s->sprite_delta[n][0];
2892 dy= s->sprite_delta[n][1];
2893 shift= s->sprite_shift[0];
2894 if(n) dy -= 1<<(shift + a + 1);
2895 else dx -= 1<<(shift + a + 1);
2896 mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16;
2899 for(y=0; y<16; y++){
2903 //XXX FIXME optimize
2904 for(x=0; x<16; x++){
2909 sum= RSHIFT(sum, a+8-s->quarter_sample);
2912 if (sum < -len) sum= -len;
2913 else if (sum >= len) sum= len-1;
2919 * decodes first partition.
2920 * @return number of MBs decoded or <0 if an error occured
2922 static int mpeg4_decode_partition_a(MpegEncContext *s){
2924 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
2926 /* decode first partition */
2928 s->first_slice_line=1;
2929 for(; s->mb_y<s->mb_height; s->mb_y++){
2930 ff_init_block_index(s);
2931 for(; s->mb_x<s->mb_width; s->mb_x++){
2932 const int xy= s->mb_x + s->mb_y*s->mb_stride;
2937 ff_update_block_index(s);
2938 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
2939 s->first_slice_line=0;
2941 if(s->pict_type==I_TYPE){
2944 if(show_bits_long(&s->gb, 19)==DC_MARKER){
2949 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
2951 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
2956 s->cbp_table[xy]= cbpc & 3;
2957 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
2961 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
2963 s->current_picture.qscale_table[xy]= s->qscale;
2965 s->mbintra_table[xy]= 1;
2968 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
2970 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
2974 if(dc_pred_dir) dir|=1;
2976 s->pred_dir_table[xy]= dir;
2977 }else{ /* P/S_TYPE */
2978 int mx, my, pred_x, pred_y, bits;
2979 int16_t * const mot_val= s->motion_val[s->block_index[0]];
2980 const int stride= s->block_wrap[0]*2;
2983 bits= show_bits(&s->gb, 17);
2984 if(bits==MOTION_MARKER){
2990 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
2991 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
2995 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
2998 mot_val[0 ]= mot_val[2 ]=
2999 mot_val[0+stride]= mot_val[2+stride]= mx;
3000 mot_val[1 ]= mot_val[3 ]=
3001 mot_val[1+stride]= mot_val[3+stride]= my;
3003 if(s->mbintra_table[xy])
3004 ff_clean_intra_table_entries(s);
3008 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3010 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
3013 // }while(cbpc == 20);
3015 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
3017 s->mb_intra = ((cbpc & 4) != 0);
3020 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3021 s->mbintra_table[xy]= 1;
3022 mot_val[0 ]= mot_val[2 ]=
3023 mot_val[0+stride]= mot_val[2+stride]= 0;
3024 mot_val[1 ]= mot_val[3 ]=
3025 mot_val[1+stride]= mot_val[3+stride]= 0;
3027 if(s->mbintra_table[xy])
3028 ff_clean_intra_table_entries(s);
3030 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
3031 s->mcsel= get_bits1(&s->gb);
3034 if ((cbpc & 16) == 0) {
3035 /* 16x16 motion prediction */
3037 h263_pred_motion(s, 0, &pred_x, &pred_y);
3039 mx = h263_decode_motion(s, pred_x, s->f_code);
3043 my = h263_decode_motion(s, pred_y, s->f_code);
3046 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3050 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
3053 mot_val[0 ]= mot_val[2 ] =
3054 mot_val[0+stride]= mot_val[2+stride]= mx;
3055 mot_val[1 ]= mot_val[3 ]=
3056 mot_val[1+stride]= mot_val[3+stride]= my;
3059 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3061 int16_t *mot_val= h263_pred_motion(s, i, &pred_x, &pred_y);
3062 mx = h263_decode_motion(s, pred_x, s->f_code);
3066 my = h263_decode_motion(s, pred_y, s->f_code);
3083 * decode second partition.
3084 * @return <0 if an error occured
3086 static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
3088 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
3090 s->mb_x= s->resync_mb_x;
3091 s->first_slice_line=1;
3092 for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
3093 ff_init_block_index(s);
3094 for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
3095 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3098 ff_update_block_index(s);
3099 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
3100 s->first_slice_line=0;
3102 if(s->pict_type==I_TYPE){
3103 int ac_pred= get_bits1(&s->gb);
3104 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3106 fprintf(stderr, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3110 s->cbp_table[xy]|= cbpy<<2;
3111 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3112 }else{ /* P || S_TYPE */
3113 if(IS_INTRA(s->current_picture.mb_type[xy])){
3115 int ac_pred = get_bits1(&s->gb);
3116 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3119 fprintf(stderr, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3123 if(s->cbp_table[xy] & 8) {
3124 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
3126 s->current_picture.qscale_table[xy]= s->qscale;
3130 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
3132 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
3136 if(dc_pred_dir) dir|=1;
3138 s->cbp_table[xy]&= 3; //remove dquant
3139 s->cbp_table[xy]|= cbpy<<2;
3140 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
3141 s->pred_dir_table[xy]= dir;
3142 }else if(IS_SKIP(s->current_picture.mb_type[xy])){
3143 s->current_picture.qscale_table[xy]= s->qscale;
3144 s->cbp_table[xy]= 0;
3146 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3149 fprintf(stderr, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
3153 if(s->cbp_table[xy] & 8) {
3154 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
3156 s->current_picture.qscale_table[xy]= s->qscale;
3158 s->cbp_table[xy]&= 3; //remove dquant
3159 s->cbp_table[xy]|= (cbpy^0xf)<<2;
3163 if(mb_num >= mb_count) return 0;
3170 * decodes the first & second partition
3171 * @return <0 if error (and sets error type in the error_status_table)
3173 int ff_mpeg4_decode_partitions(MpegEncContext *s)
3176 const int part_a_error= s->pict_type==I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR;
3177 const int part_a_end = s->pict_type==I_TYPE ? (DC_END |MV_END) : MV_END;
3179 mb_num= mpeg4_decode_partition_a(s);
3181 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3185 if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
3186 fprintf(stderr, "slice below monitor ...\n");
3187 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
3191 s->mb_num_left= mb_num;
3193 if(s->pict_type==I_TYPE){
3194 if(get_bits_long(&s->gb, 19)!=DC_MARKER){
3195 fprintf(stderr, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
3199 if(get_bits(&s->gb, 17)!=MOTION_MARKER){
3200 fprintf(stderr, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
3204 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end);
3206 if( mpeg4_decode_partition_b(s, mb_num) < 0){
3207 if(s->pict_type==P_TYPE)
3208 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR);
3211 if(s->pict_type==P_TYPE)
3212 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END);
3219 * decode partition C of one MB.
3220 * @return <0 if an error occured
3222 static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64])
3225 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3227 mb_type= s->current_picture.mb_type[xy];
3228 cbp = s->cbp_table[xy];
3230 if(s->current_picture.qscale_table[xy] != s->qscale){
3231 s->qscale= s->current_picture.qscale_table[xy];
3232 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
3233 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
3236 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
3239 s->mv[0][i][0] = s->motion_val[ s->block_index[i] ][0];
3240 s->mv[0][i][1] = s->motion_val[ s->block_index[i] ][1];
3242 s->mb_intra = IS_INTRA(mb_type);
3244 if (IS_SKIP(mb_type)) {
3247 s->block_last_index[i] = -1;
3248 s->mv_dir = MV_DIR_FORWARD;
3249 s->mv_type = MV_TYPE_16X16;
3250 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3257 }else if(s->mb_intra){
3258 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3259 }else if(!s->mb_intra){
3260 // s->mcsel= 0; //FIXME do we need to init that
3262 s->mv_dir = MV_DIR_FORWARD;
3263 if (IS_8X8(mb_type)) {
3264 s->mv_type = MV_TYPE_8X8;
3266 s->mv_type = MV_TYPE_16X16;
3269 } else { /* I-Frame */
3271 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
3274 if (!IS_SKIP(mb_type)) {
3276 /* decode each block */
3277 for (i = 0; i < 6; i++) {
3278 if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){
3279 fprintf(stderr, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra);
3286 /* per-MB end of slice check */
3288 if(--s->mb_num_left <= 0){
3289 //printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb));
3290 if(mpeg4_is_resync(s))
3295 if(mpeg4_is_resync(s)){
3296 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
3297 if(s->cbp_table[xy+delta])
3304 int ff_h263_decode_mb(MpegEncContext *s,
3305 DCTELEM block[6][64])
3307 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
3309 static int8_t quant_tab[4] = { -1, -2, 1, 2 };
3310 const int xy= s->mb_x + s->mb_y * s->mb_stride;
3312 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
3314 if (get_bits1(&s->gb)) {
3318 s->block_last_index[i] = -1;
3319 s->mv_dir = MV_DIR_FORWARD;
3320 s->mv_type = MV_TYPE_16X16;
3321 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3322 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
3324 s->mv[0][0][0]= get_amv(s, 0);
3325 s->mv[0][0][1]= get_amv(s, 1);
3329 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3337 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
3338 //fprintf(stderr, "\tCBPC: %d", cbpc);
3340 fprintf(stderr, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
3346 s->mb_intra = ((cbpc & 4) != 0);
3347 if (s->mb_intra) goto intra;
3349 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
3350 s->mcsel= get_bits1(&s->gb);
3352 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3353 cbp = (cbpc & 3) | ((cbpy ^ 0xf) << 2);
3355 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
3357 if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE)))
3358 s->interlaced_dct= get_bits1(&s->gb);
3360 s->mv_dir = MV_DIR_FORWARD;
3361 if ((cbpc & 16) == 0) {
3363 s->current_picture.mb_type[xy]= MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
3364 /* 16x16 global motion prediction */
3365 s->mv_type = MV_TYPE_16X16;
3368 s->mv[0][0][0] = mx;
3369 s->mv[0][0][1] = my;
3370 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
3371 s->current_picture.mb_type[xy]= MB_TYPE_16x8 | MB_TYPE_L0 | MB_TYPE_INTERLACED;
3372 /* 16x8 field motion prediction */
3373 s->mv_type= MV_TYPE_FIELD;
3375 s->field_select[0][0]= get_bits1(&s->gb);
3376 s->field_select[0][1]= get_bits1(&s->gb);
3378 h263_pred_motion(s, 0, &pred_x, &pred_y);
3381 mx = h263_decode_motion(s, pred_x, s->f_code);
3385 my = h263_decode_motion(s, pred_y/2, s->f_code);
3389 s->mv[0][i][0] = mx;
3390 s->mv[0][i][1] = my;
3393 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
3394 /* 16x16 motion prediction */
3395 s->mv_type = MV_TYPE_16X16;
3396 h263_pred_motion(s, 0, &pred_x, &pred_y);
3398 mx = h263p_decode_umotion(s, pred_x);
3400 mx = h263_decode_motion(s, pred_x, s->f_code);
3406 my = h263p_decode_umotion(s, pred_y);
3408 my = h263_decode_motion(s, pred_y, s->f_code);
3412 s->mv[0][0][0] = mx;
3413 s->mv[0][0][1] = my;
3415 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3416 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3419 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
3420 s->mv_type = MV_TYPE_8X8;
3422 mot_val = h263_pred_motion(s, i, &pred_x, &pred_y);
3424 mx = h263p_decode_umotion(s, pred_x);
3426 mx = h263_decode_motion(s, pred_x, s->f_code);
3431 my = h263p_decode_umotion(s, pred_y);
3433 my = h263_decode_motion(s, pred_y, s->f_code);
3436 s->mv[0][i][0] = mx;
3437 s->mv[0][i][1] = my;
3438 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
3439 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
3444 } else if(s->pict_type==B_TYPE) {
3445 int modb1; // first bit of modb
3446 int modb2; // second bit of modb
3449 s->mb_intra = 0; //B-frames never contain intra blocks
3450 s->mcsel=0; // ... true gmc blocks
3454 s->last_mv[i][0][0]=
3455 s->last_mv[i][0][1]=
3456 s->last_mv[i][1][0]=
3457 s->last_mv[i][1][1]= 0;
3461 /* if we skipped it in the future P Frame than skip it now too */
3462 s->mb_skiped= s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]; // Note, skiptab=0 if last was GMC
3467 s->block_last_index[i] = -1;
3469 s->mv_dir = MV_DIR_FORWARD;
3470 s->mv_type = MV_TYPE_16X16;
3475 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
3479 modb1= get_bits1(&s->gb);
3481 mb_type= MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1; //like MB_TYPE_B_DIRECT but no vectors coded
3484 modb2= get_bits1(&s->gb);
3485 mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
3487 printf("illegal MB_type\n");
3490 mb_type= mb_type_b_map[ mb_type ];
3492 else cbp= get_bits(&s->gb, 6);
3494 if ((!IS_DIRECT(mb_type)) && cbp) {
3495 if(get_bits1(&s->gb)){
3496 change_qscale(s, get_bits1(&s->gb)*4 - 2);
3500 if(!s->progressive_sequence){
3502 s->interlaced_dct= get_bits1(&s->gb);
3504 if(!IS_DIRECT(mb_type) && get_bits1(&s->gb)){
3505 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
3506 mb_type &= ~MB_TYPE_16x16;
3508 if(USES_LIST(mb_type, 0)){
3509 s->field_select[0][0]= get_bits1(&s->gb);
3510 s->field_select[0][1]= get_bits1(&s->gb);
3512 if(USES_LIST(mb_type, 1)){
3513 s->field_select[1][0]= get_bits1(&s->gb);
3514 s->field_select[1][1]= get_bits1(&s->gb);
3520 if((mb_type & (MB_TYPE_DIRECT2|MB_TYPE_INTERLACED)) == 0){
3521 s->mv_type= MV_TYPE_16X16;
3523 if(USES_LIST(mb_type, 0)){
3524 s->mv_dir = MV_DIR_FORWARD;
3526 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
3527 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
3528 s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
3529 s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
3532 if(USES_LIST(mb_type, 1)){
3533 s->mv_dir |= MV_DIR_BACKWARD;
3535 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
3536 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
3537 s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
3538 s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
3540 }else if(!IS_DIRECT(mb_type)){
3541 s->mv_type= MV_TYPE_FIELD;
3543 if(USES_LIST(mb_type, 0)){
3544 s->mv_dir = MV_DIR_FORWARD;
3547 mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code);
3548 my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
3549 s->last_mv[0][i][0]= s->mv[0][i][0] = mx;
3550 s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
3554 if(USES_LIST(mb_type, 1)){
3555 s->mv_dir |= MV_DIR_BACKWARD;
3558 mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code);
3559 my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
3560 s->last_mv[1][i][0]= s->mv[1][i][0] = mx;
3561 s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
3567 if(IS_DIRECT(mb_type)){
3568 if(IS_SKIP(mb_type))
3571 mx = h263_decode_motion(s, 0, 1);
3572 my = h263_decode_motion(s, 0, 1);
3575 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
3576 mb_type |= ff_mpeg4_set_direct_mv(s, mx, my);
3578 s->current_picture.mb_type[xy]= mb_type;
3579 } else { /* I-Frame */
3581 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
3583 fprintf(stderr, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
3591 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
3592 if (s->h263_pred || s->h263_aic) {
3593 s->ac_pred = get_bits1(&s->gb);
3595 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
3598 s->h263_aic_dir = get_bits1(&s->gb);
3603 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3605 fprintf(stderr, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
3608 cbp = (cbpc & 3) | (cbpy << 2);
3610 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]);
3613 if(!s->progressive_sequence)
3614 s->interlaced_dct= get_bits1(&s->gb);
3616 /* decode each block */
3618 for (i = 0; i < 6; i++) {
3619 if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0)
3624 for (i = 0; i < 6; i++) {
3625 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
3633 /* decode each block */
3635 for (i = 0; i < 6; i++) {
3636 if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0)
3641 for (i = 0; i < 6; i++) {
3642 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
3649 /* per-MB end of slice check */
3650 if(s->codec_id==CODEC_ID_MPEG4){
3651 if(mpeg4_is_resync(s)){
3652 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
3653 if(s->pict_type==B_TYPE && s->next_picture.mbskip_table[xy + delta])
3658 int v= show_bits(&s->gb, 16);
3660 if(get_bits_count(&s->gb) + 16 > s->gb.size_in_bits){
3661 v>>= get_bits_count(&s->gb) + 16 - s->gb.size_in_bits;
3671 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
3673 int code, val, sign, shift, l;
3674 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
3681 sign = get_bits1(&s->gb);
3685 val = (val - 1) << shift;
3686 val |= get_bits(&s->gb, shift);
3693 /* modulo decoding */
3694 if (!s->h263_long_vectors) {
3695 l = 1 << (f_code + 4);
3696 val = ((val + l)&(l*2-1)) - l;
3698 /* horrible h263 long vector mode */
3699 if (pred < -31 && val < -63)
3701 if (pred > 32 && val > 63)
3708 /* Decodes RVLC of H.263+ UMV */
3709 static int h263p_decode_umotion(MpegEncContext * s, int pred)
3713 if (get_bits1(&s->gb)) /* Motion difference = 0 */
3716 code = 2 + get_bits1(&s->gb);
3718 while (get_bits1(&s->gb))
3721 code += get_bits1(&s->gb);
3726 code = (sign) ? (pred - code) : (pred + code);
3728 fprintf(stderr,"H.263+ UMV Motion = %d\n", code);
3734 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
3737 int code, level, i, j, last, run;
3738 RLTable *rl = &rl_inter;
3739 const uint8_t *scan_table;
3741 scan_table = s->intra_scantable.permutated;
3742 if (s->h263_aic && s->mb_intra) {
3746 if (s->h263_aic_dir)
3747 scan_table = s->intra_v_scantable.permutated; /* left */
3749 scan_table = s->intra_h_scantable.permutated; /* top */
3751 } else if (s->mb_intra) {
3754 if (s->rv10_version == 3 && s->pict_type == I_TYPE) {
3755 int component, diff;
3756 component = (n <= 3 ? 0 : n - 4 + 1);
3757 level = s->last_dc[component];
3758 if (s->rv10_first_dc_coded[component]) {
3759 diff = rv_decode_dc(s, n);
3763 level = level & 0xff; /* handle wrap round */
3764 s->last_dc[component] = level;
3766 s->rv10_first_dc_coded[component] = 1;
3769 level = get_bits(&s->gb, 8);
3772 level = get_bits(&s->gb, 8);
3773 if((level&0x7F) == 0){
3774 fprintf(stderr, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y);
3786 if (s->mb_intra && s->h263_aic)
3788 s->block_last_index[n] = i - 1;
3793 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
3795 fprintf(stderr, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
3798 if (code == rl->n) {
3800 if (s->h263_flv > 1) {
3801 int is11 = get_bits1(&s->gb);
3802 last = get_bits1(&s->gb);
3803 run = get_bits(&s->gb, 6);
3805 level = get_sbits(&s->gb, 11);
3807 level = get_sbits(&s->gb, 7);
3810 last = get_bits1(&s->gb);
3811 run = get_bits(&s->gb, 6);
3812 level = (int8_t)get_bits(&s->gb, 8);
3815 /* XXX: should patch encoder too */
3816 level = get_sbits(&s->gb, 12);
3818 level = get_bits(&s->gb, 5);
3819 level |= get_sbits(&s->gb, 6)<<5;
3824 run = rl->table_run[code];
3825 level = rl->table_level[code];
3826 last = code >= rl->last;
3827 if (get_bits1(&s->gb))
3832 fprintf(stderr, "run overflow at %dx%d\n", s->mb_x, s->mb_y);
3842 if (s->mb_intra && s->h263_aic) {
3843 h263_pred_acdc(s, block, n);
3846 s->block_last_index[n] = i;
3851 * decodes the dc value.
3852 * @param n block index (0-3 are luma, 4-5 are chroma)
3853 * @param dir_ptr the prediction direction will be stored here
3854 * @return the quantized dc
3856 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
3858 int level, pred, code;
3862 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
3864 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
3865 if (code < 0 || code > 9 /* && s->nbit<9 */){
3866 fprintf(stderr, "illegal dc vlc\n");
3874 level= 2*get_bits1(&s->gb)-1;
3876 if(get_bits1(&s->gb))
3877 level = get_bits(&s->gb, code-1) + (1<<(code-1));
3879 level = -get_bits(&s->gb, code-1) - (1<<(code-1));
3882 level = get_xbits(&s->gb, code);
3886 if(get_bits1(&s->gb)==0){ /* marker */
3887 if(s->error_resilience>=2){
3888 fprintf(stderr, "dc marker bit missing\n");
3894 pred = ff_mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
3897 if(s->error_resilience>=3){
3898 fprintf(stderr, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
3904 *dc_val = level * s->y_dc_scale;
3906 *dc_val = level * s->c_dc_scale;
3909 *dc_val = level * 8;
3911 if(s->error_resilience>=3){
3912 if(*dc_val > 2048 + s->y_dc_scale + s->c_dc_scale){
3913 fprintf(stderr, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
3922 * @return <0 if an error occured
3924 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
3925 int n, int coded, int intra, int rvlc)
3927 int level, i, last, run;
3930 RL_VLC_ELEM * rl_vlc;
3931 const uint8_t * scan_table;
3934 //Note intra & rvlc should be optimized away if this is inlined
3937 if(s->qscale < s->intra_dc_threshold){
3939 if(s->partitioned_frame){
3940 level = s->dc_val[0][ s->block_index[n] ];
3941 if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale);
3942 else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale);
3943 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32;
3945 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
3958 rl = &rvlc_rl_intra;
3959 rl_vlc = rvlc_rl_intra.rl_vlc[0];
3962 rl_vlc = rl_intra.rl_vlc[0];
3965 if (dc_pred_dir == 0)
3966 scan_table = s->intra_v_scantable.permutated; /* left */
3968 scan_table = s->intra_h_scantable.permutated; /* top */
3970 scan_table = s->intra_scantable.permutated;
3977 s->block_last_index[n] = i;
3980 if(rvlc) rl = &rvlc_rl_inter;
3981 else rl = &rl_inter;
3983 scan_table = s->intra_scantable.permutated;
3989 rl_vlc = rvlc_rl_inter.rl_vlc[0];
3991 rl_vlc = rl_inter.rl_vlc[0];
3994 qmul = s->qscale << 1;
3995 qadd = (s->qscale - 1) | 1;
3997 rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale];
3999 rl_vlc = rl_inter.rl_vlc[s->qscale];
4004 OPEN_READER(re, &s->gb);
4006 UPDATE_CACHE(re, &s->gb);
4007 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
4011 if(SHOW_UBITS(re, &s->gb, 1)==0){
4012 fprintf(stderr, "1. marker bit missing in rvlc esc\n");
4014 }; SKIP_CACHE(re, &s->gb, 1);
4016 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4017 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4018 SKIP_COUNTER(re, &s->gb, 1+1+6);
4019 UPDATE_CACHE(re, &s->gb);
4021 if(SHOW_UBITS(re, &s->gb, 1)==0){
4022 fprintf(stderr, "2. marker bit missing in rvlc esc\n");
4024 }; SKIP_CACHE(re, &s->gb, 1);
4026 level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11);
4028 if(SHOW_UBITS(re, &s->gb, 5)!=0x10){
4029 fprintf(stderr, "reverse esc missing\n");
4031 }; SKIP_CACHE(re, &s->gb, 5);
4033 level= level * qmul + qadd;
4034 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1);
4035 SKIP_COUNTER(re, &s->gb, 1+11+5+1);
4041 cache= GET_CACHE(re, &s->gb);
4044 cache ^= 0xC0000000;
4046 if (cache&0x80000000) {
4047 if (cache&0x40000000) {
4049 SKIP_CACHE(re, &s->gb, 2);
4050 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
4051 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
4052 SKIP_COUNTER(re, &s->gb, 2+1+6);
4053 UPDATE_CACHE(re, &s->gb);
4056 level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12);
4058 if(SHOW_UBITS(re, &s->gb, 1)==0){
4059 fprintf(stderr, "1. marker bit missing in 3. esc\n");
4061 }; SKIP_CACHE(re, &s->gb, 1);
4063 level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
4065 if(SHOW_UBITS(re, &s->gb, 1)==0){
4066 fprintf(stderr, "2. marker bit missing in 3. esc\n");
4068 }; LAST_SKIP_CACHE(re, &s->gb, 1);
4070 SKIP_COUNTER(re, &s->gb, 1+12+1);
4073 if(level*s->qscale>1024 || level*s->qscale<-1024){
4074 fprintf(stderr, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
4078 if(s->error_resilience >= FF_ER_COMPLIANT){
4079 const int abs_level= ABS(level);
4080 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
4081 const int run1= run - rl->max_run[last][abs_level] - 1;
4082 if(abs_level <= rl->max_level[last][run]){
4083 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
4086 if(s->error_resilience > FF_ER_COMPLIANT){
4087 if(abs_level <= rl->max_level[last][run]*2){
4088 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
4091 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
4092 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
4099 if (level>0) level= level * qmul + qadd;
4100 else level= level * qmul - qadd;
4106 #if MIN_CACHE_BITS < 20
4107 LAST_SKIP_BITS(re, &s->gb, 2);
4108 UPDATE_CACHE(re, &s->gb);
4110 SKIP_BITS(re, &s->gb, 2);
4112 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
4113 i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing
4114 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4115 LAST_SKIP_BITS(re, &s->gb, 1);
4119 #if MIN_CACHE_BITS < 19
4120 LAST_SKIP_BITS(re, &s->gb, 1);
4121 UPDATE_CACHE(re, &s->gb);
4123 SKIP_BITS(re, &s->gb, 1);
4125 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
4127 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
4128 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4129 LAST_SKIP_BITS(re, &s->gb, 1);
4134 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
4135 LAST_SKIP_BITS(re, &s->gb, 1);
4140 fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
4144 block[scan_table[i]] = level;
4148 block[scan_table[i]] = level;
4150 CLOSE_READER(re, &s->gb);
4154 if(s->qscale >= s->intra_dc_threshold){
4156 block[0] += ff_mpeg4_pred_dc(s, n, &dc_val, &dc_pred_dir);
4158 *dc_val = block[0] * s->y_dc_scale;
4160 *dc_val = block[0] * s->c_dc_scale;
4166 mpeg4_pred_ac(s, block, n, dc_pred_dir);
4168 i = 63; /* XXX: not optimal */
4171 s->block_last_index[n] = i;
4175 /* most is hardcoded. should extend to handle all h263 streams */
4176 int h263_decode_picture_header(MpegEncContext *s)
4178 int format, width, height, i;
4181 align_get_bits(&s->gb);
4183 startcode= get_bits(&s->gb, 22-8);
4185 for(i= s->gb.size_in_bits - get_bits_count(&s->gb); i>24; i-=8) {
4186 startcode = ((startcode << 8) | get_bits(&s->gb, 8)) & 0x003FFFFF;
4188 if(startcode == 0x20)
4192 if (startcode != 0x20) {
4193 fprintf(stderr, "Bad picture start code\n");
4196 /* temporal reference */
4197 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
4199 /* PTYPE starts here */
4200 if (get_bits1(&s->gb) != 1) {
4202 fprintf(stderr, "Bad marker\n");
4205 if (get_bits1(&s->gb) != 0) {
4206 fprintf(stderr, "Bad H263 id\n");
4207 return -1; /* h263 id */
4209 skip_bits1(&s->gb); /* split screen off */
4210 skip_bits1(&s->gb); /* camera off */
4211 skip_bits1(&s->gb); /* freeze picture release off */
4213 /* Reset GOB number */
4216 format = get_bits(&s->gb, 3);
4221 7 extended PTYPE (PLUSPTYPE)
4224 if (format != 7 && format != 6) {
4227 width = h263_format[format][0];
4228 height = h263_format[format][1];
4232 s->pict_type = I_TYPE + get_bits1(&s->gb);
4234 s->unrestricted_mv = get_bits1(&s->gb);
4235 s->h263_long_vectors = s->unrestricted_mv;
4237 if (get_bits1(&s->gb) != 0) {
4238 fprintf(stderr, "H263 SAC not supported\n");
4239 return -1; /* SAC: off */
4241 if (get_bits1(&s->gb) != 0) {
4242 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
4245 if (get_bits1(&s->gb) != 0) {
4246 fprintf(stderr, "H263 PB frame not supported\n");
4247 return -1; /* not PB frame */
4249 s->qscale = get_bits(&s->gb, 5);
4250 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
4259 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
4261 /* ufep other than 0 and 1 are reserved */
4264 format = get_bits(&s->gb, 3);
4265 dprintf("ufep=1, format: %d\n", format);
4266 skip_bits(&s->gb,1); /* Custom PCF */
4267 s->umvplus = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */
4268 s->unrestricted_mv = s->umvplus;
4269 skip_bits1(&s->gb); /* Syntax-based Arithmetic Coding (SAC) */
4270 if (get_bits1(&s->gb) != 0) {
4271 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
4273 if (get_bits1(&s->gb) != 0) { /* Advanced Intra Coding (AIC) */
4277 if (get_bits1(&s->gb) != 0) {
4278 fprintf(stderr, "Deblocking Filter not supported\n");
4280 if (get_bits1(&s->gb) != 0) {
4281 fprintf(stderr, "Slice Structured not supported\n");
4283 if (get_bits1(&s->gb) != 0) {
4284 fprintf(stderr, "Reference Picture Selection not supported\n");
4286 if (get_bits1(&s->gb) != 0) {
4287 fprintf(stderr, "Independent Segment Decoding not supported\n");
4289 if (get_bits1(&s->gb) != 0) {
4290 fprintf(stderr, "Alternative Inter VLC not supported\n");
4292 if (get_bits1(&s->gb) != 0) {
4293 fprintf(stderr, "Modified Quantization not supported\n");
4296 skip_bits(&s->gb, 1); /* Prevent start code emulation */
4298 skip_bits(&s->gb, 3); /* Reserved */
4299 } else if (ufep != 0) {
4300 fprintf(stderr, "Bad UFEP type (%d)\n", ufep);
4305 s->pict_type = get_bits(&s->gb, 3) + I_TYPE;
4306 dprintf("pict_type: %d\n", s->pict_type);
4307 if (s->pict_type != I_TYPE &&
4308 s->pict_type != P_TYPE)
4310 skip_bits(&s->gb, 2);
4311 s->no_rounding = get_bits1(&s->gb);
4312 dprintf("RTYPE: %d\n", s->no_rounding);
4313 skip_bits(&s->gb, 4);
4315 /* Get the picture dimensions */
4318 /* Custom Picture Format (CPFMT) */
4319 s->aspect_ratio_info = get_bits(&s->gb, 4);
4320 dprintf("aspect: %d\n", s->aspect_ratio_info);
4325 3 - 10:11 (525-type 4:3)
4326 4 - 16:11 (CIF 16:9)
4327 5 - 40:33 (525-type 16:9)
4330 width = (get_bits(&s->gb, 9) + 1) * 4;
4332 height = get_bits(&s->gb, 9) * 4;
4333 dprintf("\nH.263+ Custom picture: %dx%d\n",width,height);
4334 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
4335 /* aspected dimensions */
4336 s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 8);
4337 s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 8);
4339 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
4342 width = h263_format[format][0];
4343 height = h263_format[format][1];
4345 if ((width == 0) || (height == 0))
4350 if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
4355 s->qscale = get_bits(&s->gb, 5);
4358 while (get_bits1(&s->gb) != 0) {
4359 skip_bits(&s->gb, 8);
4364 s->y_dc_scale_table=
4365 s->c_dc_scale_table= h263_aic_dc_scale_table;
4367 s->y_dc_scale_table=
4368 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
4371 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
4372 printf("qp:%d %c size:%d rnd:%d %s %s %s %s\n",
4373 s->qscale, av_get_pict_type_char(s->pict_type),
4374 s->gb.size_in_bits, 1-s->no_rounding,
4375 s->mv_type == MV_TYPE_8X8 ? "ADV" : "",
4376 s->umvplus ? "UMV" : "",
4377 s->h263_long_vectors ? "LONG" : "",
4378 s->h263_plus ? "+" : ""
4386 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s)
4389 int a= 2<<s->sprite_warping_accuracy;
4390 int rho= 3-s->sprite_warping_accuracy;
4392 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
4393 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
4394 int sprite_ref[4][2];
4395 int virtual_ref[2][2];
4397 int alpha=0, beta=0;
4402 for(i=0; i<s->num_sprite_warping_points; i++){
4406 length= get_vlc(&s->gb, &sprite_trajectory);
4408 x= get_xbits(&s->gb, length);
4410 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(&s->gb); /* marker bit */
4412 length= get_vlc(&s->gb, &sprite_trajectory);
4414 y=get_xbits(&s->gb, length);
4416 skip_bits1(&s->gb); /* marker bit */
4417 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
4422 while((1<<alpha)<w) alpha++;
4423 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
4427 // Note, the 4th point isnt used for GMC
4428 if(s->divx_version==500 && s->divx_build==413){
4429 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
4430 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
4431 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
4432 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
4433 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
4434 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
4436 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
4437 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
4438 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
4439 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
4440 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
4441 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
4443 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
4444 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
4446 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
4447 // perhaps it should be reordered to be more readable ...
4448 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
4449 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
4450 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
4451 + 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);
4452 virtual_ref[0][1]= 16*vop_ref[0][1]
4453 + 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);
4454 virtual_ref[1][0]= 16*vop_ref[0][0]
4455 + 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);
4456 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
4457 + 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);
4459 switch(s->num_sprite_warping_points)
4462 s->sprite_offset[0][0]= 0;
4463 s->sprite_offset[0][1]= 0;
4464 s->sprite_offset[1][0]= 0;
4465 s->sprite_offset[1][1]= 0;
4466 s->sprite_delta[0][0]= a;
4467 s->sprite_delta[0][1]= 0;
4468 s->sprite_delta[1][0]= 0;
4469 s->sprite_delta[1][1]= a;
4470 s->sprite_shift[0]= 0;
4471 s->sprite_shift[1]= 0;
4474 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
4475 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
4476 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
4477 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
4478 s->sprite_delta[0][0]= a;
4479 s->sprite_delta[0][1]= 0;
4480 s->sprite_delta[1][0]= 0;
4481 s->sprite_delta[1][1]= a;
4482 s->sprite_shift[0]= 0;
4483 s->sprite_shift[1]= 0;
4486 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
4487 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
4488 + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])
4489 + (1<<(alpha+rho-1));
4490 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
4491 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
4492 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])
4493 + (1<<(alpha+rho-1));
4494 s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
4495 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
4496 +2*w2*r*sprite_ref[0][0]
4498 + (1<<(alpha+rho+1)));
4499 s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
4500 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
4501 +2*w2*r*sprite_ref[0][1]
4503 + (1<<(alpha+rho+1)));
4504 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
4505 s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]);
4506 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]);
4507 s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]);
4509 s->sprite_shift[0]= alpha+rho;
4510 s->sprite_shift[1]= alpha+rho+2;
4513 min_ab= FFMIN(alpha, beta);
4516 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
4517 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])
4518 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])
4519 + (1<<(alpha+beta+rho-min_ab-1));
4520 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))
4521 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])
4522 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])
4523 + (1<<(alpha+beta+rho-min_ab-1));
4524 s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)
4525 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)
4526 + 2*w2*h3*r*sprite_ref[0][0]
4528 + (1<<(alpha+beta+rho-min_ab+1));
4529 s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)
4530 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)
4531 + 2*w2*h3*r*sprite_ref[0][1]
4533 + (1<<(alpha+beta+rho-min_ab+1));
4534 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;
4535 s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;
4536 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;
4537 s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;
4539 s->sprite_shift[0]= alpha + beta + rho - min_ab;
4540 s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;
4543 /* try to simplify the situation */
4544 if( s->sprite_delta[0][0] == a<<s->sprite_shift[0]
4545 && s->sprite_delta[0][1] == 0
4546 && s->sprite_delta[1][0] == 0
4547 && s->sprite_delta[1][1] == a<<s->sprite_shift[0])
4549 s->sprite_offset[0][0]>>=s->sprite_shift[0];
4550 s->sprite_offset[0][1]>>=s->sprite_shift[0];
4551 s->sprite_offset[1][0]>>=s->sprite_shift[1];
4552 s->sprite_offset[1][1]>>=s->sprite_shift[1];
4553 s->sprite_delta[0][0]= a;
4554 s->sprite_delta[0][1]= 0;
4555 s->sprite_delta[1][0]= 0;
4556 s->sprite_delta[1][1]= a;
4557 s->sprite_shift[0]= 0;
4558 s->sprite_shift[1]= 0;
4559 s->real_sprite_warping_points=1;
4562 int shift_y= 16 - s->sprite_shift[0];
4563 int shift_c= 16 - s->sprite_shift[1];
4564 //printf("shifts %d %d\n", shift_y, shift_c);
4566 s->sprite_offset[0][i]<<= shift_y;
4567 s->sprite_offset[1][i]<<= shift_c;
4568 s->sprite_delta[0][i]<<= shift_y;
4569 s->sprite_delta[1][i]<<= shift_y;
4570 s->sprite_shift[i]= 16;
4572 s->real_sprite_warping_points= s->num_sprite_warping_points;
4575 printf("vop:%d:%d %d:%d %d:%d, sprite:%d:%d %d:%d %d:%d, virtual: %d:%d %d:%d\n",
4576 vop_ref[0][0], vop_ref[0][1],
4577 vop_ref[1][0], vop_ref[1][1],
4578 vop_ref[2][0], vop_ref[2][1],
4579 sprite_ref[0][0], sprite_ref[0][1],
4580 sprite_ref[1][0], sprite_ref[1][1],
4581 sprite_ref[2][0], sprite_ref[2][1],
4582 virtual_ref[0][0], virtual_ref[0][1],
4583 virtual_ref[1][0], virtual_ref[1][1]
4586 printf("offset: %d:%d , delta: %d %d %d %d, shift %d\n",
4587 s->sprite_offset[0][0], s->sprite_offset[0][1],
4588 s->sprite_delta[0][0], s->sprite_delta[0][1],
4589 s->sprite_delta[1][0], s->sprite_delta[1][1],
4595 static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
4596 int hours, minutes, seconds;
4598 hours= get_bits(gb, 5);
4599 minutes= get_bits(gb, 6);
4601 seconds= get_bits(gb, 6);
4603 s->time_base= seconds + 60*(minutes + 60*hours);
4611 static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
4612 int width, height, vo_ver_id;
4615 skip_bits(gb, 1); /* random access */
4616 s->vo_type= get_bits(gb, 8);
4617 if (get_bits1(gb) != 0) { /* is_ol_id */
4618 vo_ver_id = get_bits(gb, 4); /* vo_ver_id */
4619 skip_bits(gb, 3); /* vo_priority */
4623 //printf("vo type:%d\n",s->vo_type);
4624 s->aspect_ratio_info= get_bits(gb, 4);
4625 if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
4626 s->avctx->sample_aspect_ratio.num= get_bits(gb, 8); // par_width
4627 s->avctx->sample_aspect_ratio.den= get_bits(gb, 8); // par_height
4629 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
4632 if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
4633 int chroma_format= get_bits(gb, 2);
4634 if(chroma_format!=1){
4635 printf("illegal chroma format\n");
4637 s->low_delay= get_bits1(gb);
4638 if(get_bits1(gb)){ /* vbv parameters */
4639 get_bits(gb, 15); /* first_half_bitrate */
4640 skip_bits1(gb); /* marker */
4641 get_bits(gb, 15); /* latter_half_bitrate */
4642 skip_bits1(gb); /* marker */
4643 get_bits(gb, 15); /* first_half_vbv_buffer_size */
4644 skip_bits1(gb); /* marker */
4645 get_bits(gb, 3); /* latter_half_vbv_buffer_size */
4646 get_bits(gb, 11); /* first_half_vbv_occupancy */
4647 skip_bits1(gb); /* marker */
4648 get_bits(gb, 15); /* latter_half_vbv_occupancy */
4649 skip_bits1(gb); /* marker */
4652 // set low delay flag only once so the smart? low delay detection wont be overriden
4653 if(s->picture_number==0)
4657 s->shape = get_bits(gb, 2); /* vol shape */
4658 if(s->shape != RECT_SHAPE) printf("only rectangular vol supported\n");
4659 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
4660 printf("Gray shape not supported\n");
4661 skip_bits(gb, 4); //video_object_layer_shape_extension
4664 check_marker(gb, "before time_increment_resolution");
4666 s->time_increment_resolution = get_bits(gb, 16);
4668 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
4669 if (s->time_increment_bits < 1)
4670 s->time_increment_bits = 1;
4672 check_marker(gb, "before fixed_vop_rate");
4674 if (get_bits1(gb) != 0) { /* fixed_vop_rate */
4675 skip_bits(gb, s->time_increment_bits);
4678 if (s->shape != BIN_ONLY_SHAPE) {
4679 if (s->shape == RECT_SHAPE) {
4680 skip_bits1(gb); /* marker */
4681 width = get_bits(gb, 13);
4682 skip_bits1(gb); /* marker */
4683 height = get_bits(gb, 13);
4684 skip_bits1(gb); /* marker */
4685 if(width && height){ /* they should be non zero but who knows ... */
4688 // printf("width/height: %d %d\n", width, height);
4692 s->progressive_sequence= get_bits1(gb)^1;
4693 if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO))
4694 printf("OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */
4695 if (vo_ver_id == 1) {
4696 s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */
4698 s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */
4700 if(s->vol_sprite_usage==STATIC_SPRITE) printf("Static Sprites not supported\n");
4701 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
4702 if(s->vol_sprite_usage==STATIC_SPRITE){
4703 s->sprite_width = get_bits(gb, 13);
4704 skip_bits1(gb); /* marker */
4705 s->sprite_height= get_bits(gb, 13);
4706 skip_bits1(gb); /* marker */
4707 s->sprite_left = get_bits(gb, 13);
4708 skip_bits1(gb); /* marker */
4709 s->sprite_top = get_bits(gb, 13);
4710 skip_bits1(gb); /* marker */
4712 s->num_sprite_warping_points= get_bits(gb, 6);
4713 s->sprite_warping_accuracy = get_bits(gb, 2);
4714 s->sprite_brightness_change= get_bits1(gb);
4715 if(s->vol_sprite_usage==STATIC_SPRITE)
4716 s->low_latency_sprite= get_bits1(gb);
4718 // FIXME sadct disable bit if verid!=1 && shape not rect
4720 if (get_bits1(gb) == 1) { /* not_8_bit */
4721 s->quant_precision = get_bits(gb, 4); /* quant_precision */
4722 if(get_bits(gb, 4)!=8) printf("N-bit not supported\n"); /* bits_per_pixel */
4723 if(s->quant_precision!=5) printf("quant precission %d\n", s->quant_precision);
4725 s->quant_precision = 5;
4728 // FIXME a bunch of grayscale shape things
4730 if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */
4733 /* load default matrixes */
4734 for(i=0; i<64; i++){
4735 int j= s->dsp.idct_permutation[i];
4736 v= ff_mpeg4_default_intra_matrix[i];
4737 s->intra_matrix[j]= v;
4738 s->chroma_intra_matrix[j]= v;
4740 v= ff_mpeg4_default_non_intra_matrix[i];
4741 s->inter_matrix[j]= v;
4742 s->chroma_inter_matrix[j]= v;
4745 /* load custom intra matrix */
4748 for(i=0; i<64; i++){
4754 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
4755 s->intra_matrix[j]= v;
4756 s->chroma_intra_matrix[j]= v;
4759 /* replicate last value */
4761 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
4762 s->intra_matrix[j]= last;
4763 s->chroma_intra_matrix[j]= last;
4767 /* load custom non intra matrix */
4770 for(i=0; i<64; i++){
4776 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
4777 s->inter_matrix[j]= v;
4778 s->chroma_inter_matrix[j]= v;
4781 /* replicate last value */
4783 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
4784 s->inter_matrix[j]= last;
4785 s->chroma_inter_matrix[j]= last;
4789 // FIXME a bunch of grayscale shape things
4793 s->quarter_sample= get_bits1(gb);
4794 else s->quarter_sample=0;
4796 if(!get_bits1(gb)) printf("Complexity estimation not supported\n");
4798 s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */
4800 s->data_partitioning= get_bits1(gb);
4801 if(s->data_partitioning){
4802 s->rvlc= get_bits1(gb);
4805 if(vo_ver_id != 1) {
4806 s->new_pred= get_bits1(gb);
4808 printf("new pred not supported\n");
4809 skip_bits(gb, 2); /* requested upstream message type */
4810 skip_bits1(gb); /* newpred segment type */
4812 s->reduced_res_vop= get_bits1(gb);
4813 if(s->reduced_res_vop) printf("reduced resolution VOP not supported\n");
4817 s->reduced_res_vop= 0;
4820 s->scalability= get_bits1(gb);
4822 if (s->scalability) {
4823 GetBitContext bak= *gb;
4825 int ref_layer_sampling_dir;
4826 int h_sampling_factor_n;
4827 int h_sampling_factor_m;
4828 int v_sampling_factor_n;
4829 int v_sampling_factor_m;
4831 s->hierachy_type= get_bits1(gb);
4832 ref_layer_id= get_bits(gb, 4);
4833 ref_layer_sampling_dir= get_bits1(gb);
4834 h_sampling_factor_n= get_bits(gb, 5);
4835 h_sampling_factor_m= get_bits(gb, 5);
4836 v_sampling_factor_n= get_bits(gb, 5);
4837 v_sampling_factor_m= get_bits(gb, 5);
4838 s->enhancement_type= get_bits1(gb);
4840 if( h_sampling_factor_n==0 || h_sampling_factor_m==0
4841 || v_sampling_factor_n==0 || v_sampling_factor_m==0){
4843 // fprintf(stderr, "illegal scalability header (VERY broken encoder), trying to workaround\n");
4848 printf("scalability not supported\n");
4850 // bin shape stuff FIXME
4857 * decodes the user data stuff in the header.
4858 * allso inits divx/xvid/lavc_version/build
4860 static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
4864 int ver, build, ver2, ver3;
4867 buf[0]= show_bits(gb, 8);
4868 for(i=1; i<256; i++){
4869 buf[i]= show_bits(gb, 16)&0xFF;
4870 if(buf[i]==0) break;
4875 /* divx detection */
4876 e=sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last);
4878 e=sscanf(buf, "DivX%db%d%c", &ver, &build, &last);
4880 s->divx_version= ver;
4881 s->divx_build= build;
4882 s->divx_packed= e==3 && last=='p';
4885 /* ffmpeg detection */
4886 e=sscanf(buf, "FFmpeg%d.%d.%db%d", &ver, &ver2, &ver3, &build);
4888 e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
4890 if(strcmp(buf, "ffmpeg")==0){
4891 s->ffmpeg_version= 0x000406;
4892 s->lavc_build= 4600;
4896 s->ffmpeg_version= ver*256*256 + ver2*256 + ver3;
4897 s->lavc_build= build;
4900 /* xvid detection */
4901 e=sscanf(buf, "XviD%d", &build);
4903 s->xvid_build= build;
4906 //printf("User Data: %s\n", buf);
4910 static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
4911 int time_incr, time_increment;
4913 s->pict_type = get_bits(gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */
4914 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0 && !(s->flags & CODEC_FLAG_LOW_DELAY)){
4915 printf("low_delay flag set, but shouldnt, clearing it\n");
4919 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
4920 if(s->partitioned_frame)
4921 s->decode_mb= mpeg4_decode_partitioned_mb;
4923 s->decode_mb= ff_h263_decode_mb;
4925 if(s->time_increment_resolution==0){
4926 s->time_increment_resolution=1;
4927 // fprintf(stderr, "time_increment_resolution is illegal\n");
4930 while (get_bits1(gb) != 0)
4933 check_marker(gb, "before time_increment");
4935 if(s->time_increment_bits==0){
4936 printf("hmm, seems the headers arnt complete, trying to guess time_increment_bits\n");
4938 for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){
4939 if(show_bits(gb, s->time_increment_bits+1)&1) break;
4942 printf("my guess is %d bits ;)\n",s->time_increment_bits);
4945 if(IS_3IV1) time_increment= get_bits1(gb); //FIXME investigate further
4946 else time_increment= get_bits(gb, s->time_increment_bits);
4948 // printf("%d %X\n", s->time_increment_bits, time_increment);
4949 //printf(" type:%d modulo_time_base:%d increment:%d\n", s->pict_type, time_incr, time_increment);
4950 if(s->pict_type!=B_TYPE){
4951 s->last_time_base= s->time_base;
4952 s->time_base+= time_incr;
4953 s->time= s->time_base*s->time_increment_resolution + time_increment;
4954 if(s->workaround_bugs&FF_BUG_UMP4){
4955 if(s->time < s->last_non_b_time){
4956 // fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaround\n");
4958 s->time+= s->time_increment_resolution;
4961 s->pp_time= s->time - s->last_non_b_time;
4962 s->last_non_b_time= s->time;
4964 s->time= (s->last_time_base + time_incr)*s->time_increment_resolution + time_increment;
4965 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
4966 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
4967 // printf("messed up order, seeking?, skiping current b frame\n");
4968 return FRAME_SKIPED;
4971 if(s->t_frame==0) s->t_frame= s->time - s->last_time_base;
4972 if(s->t_frame==0) s->t_frame=1; // 1/0 protection
4973 //printf("%Ld %Ld %d %d\n", s->last_non_b_time, s->time, s->pp_time, s->t_frame); fflush(stdout);
4974 s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame)
4975 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
4976 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame)
4977 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
4980 s->current_picture.pts= s->time*1000LL*1000LL / s->time_increment_resolution;
4981 if(s->avctx->debug&FF_DEBUG_PTS)
4982 printf("MPEG4 PTS: %f\n", s->current_picture.pts/(1000.0*1000.0));
4984 check_marker(gb, "before vop_coded");
4987 if (get_bits1(gb) != 1){
4988 printf("vop not coded\n");
4989 return FRAME_SKIPED;
4991 //printf("time %d %d %d || %Ld %Ld %Ld\n", s->time_increment_bits, s->time_increment_resolution, s->time_base,
4992 //s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time);
4993 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE
4994 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
4995 /* rounding type for motion estimation */
4996 s->no_rounding = get_bits1(gb);
5000 //FIXME reduced res stuff
5002 if (s->shape != RECT_SHAPE) {
5003 if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) {
5004 int width, height, hor_spat_ref, ver_spat_ref;
5006 width = get_bits(gb, 13);
5007 skip_bits1(gb); /* marker */
5008 height = get_bits(gb, 13);
5009 skip_bits1(gb); /* marker */
5010 hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */
5011 skip_bits1(gb); /* marker */
5012 ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */
5014 skip_bits1(gb); /* change_CR_disable */
5016 if (get_bits1(gb) != 0) {
5017 skip_bits(gb, 8); /* constant_alpha_value */
5020 //FIXME complexity estimation stuff
5022 if (s->shape != BIN_ONLY_SHAPE) {
5023 s->intra_dc_threshold= mpeg4_dc_threshold[ get_bits(gb, 3) ];
5024 if(!s->progressive_sequence){
5025 s->top_field_first= get_bits1(gb);
5026 s->alternate_scan= get_bits1(gb);
5028 s->alternate_scan= 0;
5031 if(s->alternate_scan){
5032 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
5033 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
5034 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
5035 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
5037 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
5038 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
5039 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
5040 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
5043 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
5044 mpeg4_decode_sprite_trajectory(s);
5045 if(s->sprite_brightness_change) printf("sprite_brightness_change not supported\n");
5046 if(s->vol_sprite_usage==STATIC_SPRITE) printf("static sprite not supported\n");
5049 if (s->shape != BIN_ONLY_SHAPE) {
5050 s->qscale = get_bits(gb, s->quant_precision);
5052 printf("Error, header damaged or not MPEG4 header (qscale=0)\n");
5053 return -1; // makes no sense to continue, as there is nothing left from the image then
5056 if (s->pict_type != I_TYPE) {
5057 s->f_code = get_bits(gb, 3); /* fcode_for */
5059 printf("Error, header damaged or not MPEG4 header (f_code=0)\n");
5060 return -1; // makes no sense to continue, as the MV decoding will break very quickly
5065 if (s->pict_type == B_TYPE) {
5066 s->b_code = get_bits(gb, 3);
5070 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
5071 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 vot:%d%s dc:%d\n",
5072 s->qscale, s->f_code, s->b_code,
5073 s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")),
5074 gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first,
5075 s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,
5076 s->sprite_warping_accuracy, 1-s->no_rounding, s->vo_type, s->vol_control_parameters ? " VOLC" : " ", s->intra_dc_threshold);
5079 if(!s->scalability){
5080 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {
5081 skip_bits1(gb); // vop shape coding type
5084 if(s->enhancement_type){
5085 int load_backward_shape= get_bits1(gb);
5086 if(load_backward_shape){
5087 printf("load backward shape isnt supported\n");
5090 skip_bits(gb, 2); //ref_select_code
5093 /* detect buggy encoders which dont set the low_delay flag (divx4/xvid/opendivx)*/
5094 // note we cannot detect divx5 without b-frames easyly (allthough its buggy too)
5095 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
5096 printf("looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
5100 s->picture_number++; // better than pic number==0 allways ;)
5102 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
5103 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
5105 if(s->workaround_bugs&FF_BUG_EDGE){
5106 s->h_edge_pos= s->width;
5107 s->v_edge_pos= s->height;
5113 * decode mpeg4 headers
5114 * @return <0 if no VOP found (or a damaged one)
5115 * FRAME_SKIPPED if a not coded VOP is found
5116 * 0 if a VOP is found
5118 int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb)
5122 /* search next start code */
5126 v = get_bits(gb, 8);
5127 startcode = ((startcode << 8) | v) & 0xffffffff;
5129 if(get_bits_count(gb) >= gb->size_in_bits){
5130 if(gb->size_in_bits==8 && s->divx_version){
5131 printf("frame skip %d\n", gb->size_in_bits);
5132 return FRAME_SKIPED; //divx bug
5134 return -1; //end of stream
5137 if((startcode&0xFFFFFF00) != 0x100)
5138 continue; //no startcode
5140 if(s->avctx->debug&FF_DEBUG_STARTCODE){
5141 printf("startcode: %3X ", startcode);
5142 if (startcode<=0x11F) printf("Video Object Start");
5143 else if(startcode<=0x12F) printf("Video Object Layer Start");
5144 else if(startcode<=0x13F) printf("Reserved");
5145 else if(startcode<=0x15F) printf("FGS bp start");
5146 else if(startcode<=0x1AF) printf("Reserved");
5147 else if(startcode==0x1B0) printf("Visual Object Seq Start");
5148 else if(startcode==0x1B1) printf("Visual Object Seq End");
5149 else if(startcode==0x1B2) printf("User Data");
5150 else if(startcode==0x1B3) printf("Group of VOP start");
5151 else if(startcode==0x1B4) printf("Video Session Error");
5152 else if(startcode==0x1B5) printf("Visual Object Start");
5153 else if(startcode==0x1B6) printf("Video Object Plane start");
5154 else if(startcode==0x1B7) printf("slice start");
5155 else if(startcode==0x1B8) printf("extension start");
5156 else if(startcode==0x1B9) printf("fgs start");
5157 else if(startcode==0x1BA) printf("FBA Object start");
5158 else if(startcode==0x1BB) printf("FBA Object Plane start");
5159 else if(startcode==0x1BC) printf("Mesh Object start");
5160 else if(startcode==0x1BD) printf("Mesh Object Plane start");
5161 else if(startcode==0x1BE) printf("Still Textutre Object start");
5162 else if(startcode==0x1BF) printf("Textutre Spatial Layer start");
5163 else if(startcode==0x1C0) printf("Textutre SNR Layer start");
5164 else if(startcode==0x1C1) printf("Textutre Tile start");
5165 else if(startcode==0x1C2) printf("Textutre Shape Layer start");
5166 else if(startcode==0x1C3) printf("stuffing start");
5167 else if(startcode<=0x1C5) printf("reserved");
5168 else if(startcode<=0x1FF) printf("System start");
5169 printf(" at %d\n", get_bits_count(gb));
5172 if(startcode >= 0x120 && startcode <= 0x12F){
5173 if(decode_vol_header(s, gb) < 0)
5176 else if(startcode == USER_DATA_STARTCODE){
5177 decode_user_data(s, gb);
5179 else if(startcode == GOP_STARTCODE){
5180 mpeg4_decode_gop_header(s, gb);
5182 else if(startcode == VOP_STARTCODE){
5183 return decode_vop_header(s, gb);
5191 /* don't understand why they choose a different header ! */
5192 int intel_h263_decode_picture_header(MpegEncContext *s)
5196 /* picture header */
5197 if (get_bits_long(&s->gb, 22) != 0x20) {
5198 fprintf(stderr, "Bad picture start code\n");
5201 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
5203 if (get_bits1(&s->gb) != 1) {
5204 fprintf(stderr, "Bad marker\n");
5205 return -1; /* marker */
5207 if (get_bits1(&s->gb) != 0) {
5208 fprintf(stderr, "Bad H263 id\n");
5209 return -1; /* h263 id */
5211 skip_bits1(&s->gb); /* split screen off */
5212 skip_bits1(&s->gb); /* camera off */
5213 skip_bits1(&s->gb); /* freeze picture release off */
5215 format = get_bits(&s->gb, 3);
5217 fprintf(stderr, "Intel H263 free format not supported\n");
5222 s->pict_type = I_TYPE + get_bits1(&s->gb);
5224 s->unrestricted_mv = get_bits1(&s->gb);
5225 s->h263_long_vectors = s->unrestricted_mv;
5227 if (get_bits1(&s->gb) != 0) {
5228 fprintf(stderr, "SAC not supported\n");
5229 return -1; /* SAC: off */
5231 if (get_bits1(&s->gb) != 0) {
5232 fprintf(stderr, "Advanced Prediction Mode not supported\n");
5233 return -1; /* advanced prediction mode: off */
5235 if (get_bits1(&s->gb) != 0) {
5236 fprintf(stderr, "PB frame mode no supported\n");
5237 return -1; /* PB frame mode */
5240 /* skip unknown header garbage */
5241 skip_bits(&s->gb, 41);
5243 s->qscale = get_bits(&s->gb, 5);
5244 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
5247 while (get_bits1(&s->gb) != 0) {
5248 skip_bits(&s->gb, 8);
5252 s->y_dc_scale_table=
5253 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
5258 int flv_h263_decode_picture_header(MpegEncContext *s)
5260 int format, width, height;
5262 /* picture header */
5263 if (get_bits_long(&s->gb, 17) != 1) {
5264 fprintf(stderr, "Bad picture start code\n");
5267 format = get_bits(&s->gb, 5);
5268 if (format != 0 && format != 1) {
5269 fprintf(stderr, "Bad picture format\n");
5272 s->h263_flv = format+1;
5273 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
5274 format = get_bits(&s->gb, 3);
5277 width = get_bits(&s->gb, 8);
5278 height = get_bits(&s->gb, 8);
5281 width = get_bits(&s->gb, 16);
5282 height = get_bits(&s->gb, 16);
5308 if ((width == 0) || (height == 0))
5313 s->pict_type = I_TYPE + get_bits(&s->gb, 2);
5314 if (s->pict_type > P_TYPE)
5315 s->pict_type = P_TYPE;
5316 skip_bits1(&s->gb); /* deblocking flag */
5317 s->qscale = get_bits(&s->gb, 5);
5321 s->unrestricted_mv = 1;
5322 s->h263_long_vectors = 0;
5325 while (get_bits1(&s->gb) != 0) {
5326 skip_bits(&s->gb, 8);
5330 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
5331 printf("%c esc_type:%d, qp:%d num:%d\n",
5332 av_get_pict_type_char(s->pict_type), s->h263_flv-1, s->qscale, s->picture_number);
5335 s->y_dc_scale_table=
5336 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;