2 * H263/MPEG4 backend for ffmpeg encoder and decoder
3 * Copyright (c) 2000,2001 Gerard Lantau.
5 * Copyright (c) 2001 Juan J. Sierralta P.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program 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
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "mpegvideo.h"
26 #include "mpeg4data.h"
28 static void h263_encode_block(MpegEncContext * s, DCTELEM * block,
30 static void h263_encode_motion(MpegEncContext * s, int val);
31 static void h263p_encode_umotion(MpegEncContext * s, int val);
32 static void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block,
34 static int h263_decode_motion(MpegEncContext * s, int pred);
35 static int h263p_decode_umotion(MpegEncContext * s, int pred);
36 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
38 static int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
41 int h263_get_picture_format(int width, int height)
45 if (width == 128 && height == 96)
47 else if (width == 176 && height == 144)
49 else if (width == 352 && height == 288)
51 else if (width == 704 && height == 576)
53 else if (width == 1408 && height == 1152)
60 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
64 align_put_bits(&s->pb);
66 /* Update the pointer to last GOB */
67 s->ptr_lastgob = pbBufPtr(&s->pb);
70 put_bits(&s->pb, 22, 0x20); /* PSC */
71 put_bits(&s->pb, 8, (((INT64)s->picture_number * 30 * FRAME_RATE_BASE) /
72 s->frame_rate) & 0xff);
74 put_bits(&s->pb, 1, 1); /* marker */
75 put_bits(&s->pb, 1, 0); /* h263 id */
76 put_bits(&s->pb, 1, 0); /* split screen off */
77 put_bits(&s->pb, 1, 0); /* camera off */
78 put_bits(&s->pb, 1, 0); /* freeze picture release off */
80 format = h263_get_picture_format(s->width, s->height);
83 put_bits(&s->pb, 3, format);
84 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
85 /* By now UMV IS DISABLED ON H.263v1, since the restrictions
86 of H.263v1 UMV implies to check the predicted MV after
87 calculation of the current MB to see if we're on the limits */
88 put_bits(&s->pb, 1, 0); /* unrestricted motion vector: off */
89 put_bits(&s->pb, 1, 0); /* SAC: off */
90 put_bits(&s->pb, 1, 0); /* advanced prediction mode: off */
91 put_bits(&s->pb, 1, 0); /* not PB frame */
92 put_bits(&s->pb, 5, s->qscale);
93 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
96 /* H.263 Plus PTYPE */
97 put_bits(&s->pb, 3, 7);
98 put_bits(&s->pb,3,1); /* Update Full Extended PTYPE */
100 put_bits(&s->pb,3,6); /* Custom Source Format */
102 put_bits(&s->pb, 3, format);
104 put_bits(&s->pb,1,0); /* Custom PCF: off */
105 s->umvplus = (s->pict_type == P_TYPE) && s->unrestricted_mv;
106 put_bits(&s->pb, 1, s->umvplus); /* Unrestricted Motion Vector */
107 put_bits(&s->pb,1,0); /* SAC: off */
108 put_bits(&s->pb,1,0); /* Advanced Prediction Mode: off */
109 put_bits(&s->pb,1,0); /* Advanced Intra Coding: off */
110 put_bits(&s->pb,1,0); /* Deblocking Filter: off */
111 put_bits(&s->pb,1,0); /* Slice Structured: off */
112 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
113 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
114 put_bits(&s->pb,1,0); /* Alternative Inter VLC: off */
115 put_bits(&s->pb,1,0); /* Modified Quantization: off */
116 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
117 put_bits(&s->pb,3,0); /* Reserved */
119 put_bits(&s->pb, 3, s->pict_type == P_TYPE);
121 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
122 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
123 put_bits(&s->pb,1,0); /* Rounding Type */
124 put_bits(&s->pb,2,0); /* Reserved */
125 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
127 /* This should be here if PLUSPTYPE */
128 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
131 /* Custom Picture Format (CPFMT) */
133 put_bits(&s->pb,4,2); /* Aspect ratio: CIF 12:11 (4:3) picture */
134 put_bits(&s->pb,9,(s->width >> 2) - 1);
135 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
136 put_bits(&s->pb,9,(s->height >> 2));
139 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
141 put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
142 put_bits(&s->pb, 5, s->qscale);
145 put_bits(&s->pb, 1, 0); /* no PEI */
148 int h263_encode_gob_header(MpegEncContext * s, int mb_line)
152 /* Check to see if we need to put a new GBSC */
153 /* for RTP packetization */
155 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
156 if (pdif >= s->rtp_payload_size) {
157 /* Bad luck, packet must be cut before */
158 align_put_bits(&s->pb);
159 flush_put_bits(&s->pb);
160 /* Call the RTP callback to send the last GOB */
161 if (s->rtp_callback) {
162 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
163 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
165 s->ptr_lastgob = pbBufPtr(&s->pb);
166 put_bits(&s->pb, 17, 1); /* GBSC */
167 s->gob_number = mb_line / s->gob_index;
168 put_bits(&s->pb, 5, s->gob_number); /* GN */
169 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
170 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
171 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
173 } else if (pdif + s->mb_line_avgsize >= s->rtp_payload_size) {
174 /* Cut the packet before we can't */
175 align_put_bits(&s->pb);
176 flush_put_bits(&s->pb);
177 /* Call the RTP callback to send the last GOB */
178 if (s->rtp_callback) {
179 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
180 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
182 s->ptr_lastgob = pbBufPtr(&s->pb);
183 put_bits(&s->pb, 17, 1); /* GBSC */
184 s->gob_number = mb_line / s->gob_index;
185 put_bits(&s->pb, 5, s->gob_number); /* GN */
186 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
187 put_bits(&s->pb, 5, s->qscale); /* GQUANT */
188 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
195 void h263_encode_mb(MpegEncContext * s,
196 DCTELEM block[6][64],
197 int motion_x, int motion_y)
199 int cbpc, cbpy, i, cbp, pred_x, pred_y;
201 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
205 for (i = 0; i < 6; i++) {
206 if (s->block_last_index[i] >= 0)
209 if ((cbp | motion_x | motion_y) == 0) {
210 /* skip macroblock */
211 put_bits(&s->pb, 1, 1);
214 put_bits(&s->pb, 1, 0); /* mb coded */
217 inter_MCBPC_bits[cbpc],
218 inter_MCBPC_code[cbpc]);
221 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
223 /* motion vectors: 16x16 mode only now */
224 h263_pred_motion(s, 0, &pred_x, &pred_y);
227 h263_encode_motion(s, motion_x - pred_x);
228 h263_encode_motion(s, motion_y - pred_y);
231 h263p_encode_umotion(s, motion_x - pred_x);
232 h263p_encode_umotion(s, motion_y - pred_y);
233 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
234 /* To prevent Start Code emulation */
235 put_bits(&s->pb,1,1);
240 for (i = 0; i < 6; i++) {
241 if (s->block_last_index[i] >= 1)
246 if (s->pict_type == I_TYPE) {
248 intra_MCBPC_bits[cbpc],
249 intra_MCBPC_code[cbpc]);
251 put_bits(&s->pb, 1, 0); /* mb coded */
253 inter_MCBPC_bits[cbpc + 4],
254 inter_MCBPC_code[cbpc + 4]);
257 /* XXX: currently, we do not try to use ac prediction */
258 put_bits(&s->pb, 1, 0); /* no ac prediction */
261 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
264 /* encode each block */
266 for (i = 0; i < 6; i++) {
267 mpeg4_encode_block(s, block[i], i);
270 for (i = 0; i < 6; i++) {
271 h263_encode_block(s, block[i], i);
276 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr)
278 int a, c, x, y, wrap, pred, scale;
281 /* find prediction */
283 x = 2 * s->mb_x + 1 + (n & 1);
284 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
285 wrap = s->mb_width * 2 + 2;
286 dc_val = s->dc_val[0];
287 scale = s->y_dc_scale;
291 wrap = s->mb_width + 2;
292 dc_val = s->dc_val[n - 4 + 1];
293 scale = s->c_dc_scale;
299 a = dc_val[(x - 1) + (y) * wrap];
300 c = dc_val[(x) + (y - 1) * wrap];
307 } else if (a != 1024 && c != 1024)
315 /* we assume pred is positive */
316 pred = (pred) / scale;
318 /* prepare address for prediction update */
319 *dc_val_ptr = &dc_val[(x) + (y) * wrap];
324 void h263_pred_ac(MpegEncContext * s, INT16 *block, int n)
327 INT16 *ac_val, *ac_val1;
329 /* find prediction */
331 x = 2 * s->mb_x + 1 + (n & 1);
332 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
333 wrap = s->mb_width * 2 + 2;
334 ac_val = s->ac_val[0][0];
338 wrap = s->mb_width + 2;
339 ac_val = s->ac_val[n - 4 + 1][0];
341 ac_val += ((y) * wrap + (x)) * 16;
345 if (s->h263_aic_dir) {
346 /* left prediction */
349 block[block_permute_op(i*8)] += ac_val[i];
355 block[block_permute_op(i)] += ac_val[i + 8];
361 ac_val1[i] = block[block_permute_op(i * 8)];
364 ac_val1[8 + i] = block[block_permute_op(i)];
367 static inline int mid_pred(int a, int b, int c)
381 return a + b + c - vmin - vmax;
384 INT16 *h263_pred_motion(MpegEncContext * s, int block,
388 INT16 *A, *B, *C, *mot_val;
390 wrap = 2 * s->mb_width + 2;
391 y = xy = 2 * s->mb_y + 1 + ((block >> 1) & 1); // y
392 xy *= wrap; // y * wrap
393 xy += 2 * s->mb_x + 1 + (block & 1); // x + y * wrap
395 mot_val = s->motion_val[xy];
397 /* special case for first line */
398 if (y == 1 || s->first_slice_line || s->first_gob_line) {
399 A = s->motion_val[xy - 1];
406 A = s->motion_val[xy - 1];
407 B = s->motion_val[xy - wrap];
408 C = s->motion_val[xy + 2 - wrap];
412 A = s->motion_val[xy - 1];
413 B = s->motion_val[xy - wrap];
414 C = s->motion_val[xy + 1 - wrap];
417 A = s->motion_val[xy - 1];
418 B = s->motion_val[xy - 1 - wrap];
419 C = s->motion_val[xy - wrap];
422 *px = mid_pred(A[0], B[0], C[0]);
423 *py = mid_pred(A[1], B[1], C[1]);
429 static void h263_encode_motion(MpegEncContext * s, int val)
431 int range, l, m, bit_size, sign, code, bits;
436 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
438 bit_size = s->f_code - 1;
439 range = 1 << bit_size;
440 /* modulo encoding */
445 } else if (val >= l) {
451 code = (val >> bit_size) + 1;
452 bits = val & (range - 1);
457 code = (val >> bit_size) + 1;
458 bits = val & (range - 1);
462 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
464 put_bits(&s->pb, bit_size, bits);
469 /* Encode MV differences on H.263+ with Unrestricted MV mode */
470 static void h263p_encode_umotion(MpegEncContext * s, int val)
480 put_bits(&s->pb, 1, 1);
482 put_bits(&s->pb, 3, 0);
484 put_bits(&s->pb, 3, 2);
487 sval = ((val < 0) ? (short)(-val):(short)val);
490 while (temp_val != 0) {
491 temp_val = temp_val >> 1;
497 tcode = (sval & (1 << (i-1))) >> (i-1);
498 tcode = (tcode << 1) | 1;
499 code = (code << 2) | tcode;
502 code = ((code << 1) | (val < 0)) << 1;
503 put_bits(&s->pb, (2*n_bits)+1, code);
504 //printf("\nVal = %d\tCode = %d", sval, code);
508 void h263_encode_init_vlc(MpegEncContext *s)
519 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
521 int level, run, last, i, j, last_index, last_non_zero, sign, slevel;
523 RLTable *rl = &rl_inter;
528 /* 255 cannot be represented, so we clamp */
533 /* 0 cannot be represented also */
539 put_bits(&s->pb, 8, 0xff);
541 put_bits(&s->pb, 8, level & 0xff);
548 last_index = s->block_last_index[n];
549 last_non_zero = i - 1;
550 for (; i <= last_index; i++) {
551 j = zigzag_direct[i];
554 run = i - last_non_zero - 1;
555 last = (i == last_index);
562 code = get_rl_index(rl, last, run, level);
563 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
565 put_bits(&s->pb, 1, last);
566 put_bits(&s->pb, 6, run);
567 put_bits(&s->pb, 8, slevel & 0xff);
569 put_bits(&s->pb, 1, sign);
576 /***************************************************/
578 /* write mpeg4 VOP header */
579 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
581 align_put_bits(&s->pb);
583 put_bits(&s->pb, 16, 0); /* vop header */
584 put_bits(&s->pb, 16, 0x1B6); /* vop header */
585 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
586 /* XXX: time base + 1 not always correct */
587 put_bits(&s->pb, 1, 1);
588 put_bits(&s->pb, 1, 0);
590 put_bits(&s->pb, 1, 1); /* marker */
591 put_bits(&s->pb, 4, 1); /* XXX: correct time increment */
592 put_bits(&s->pb, 1, 1); /* marker */
593 put_bits(&s->pb, 1, 1); /* vop coded */
594 if (s->pict_type == P_TYPE) {
596 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */
598 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */
600 put_bits(&s->pb, 5, s->qscale);
602 if (s->pict_type != I_TYPE)
603 put_bits(&s->pb, 3, s->f_code); /* fcode_for */
604 // printf("****frame %d\n", picture_number);
607 void h263_dc_scale(MpegEncContext * s)
615 else if (quant > 4 && quant < 9)
616 s->y_dc_scale = (2 * quant);
617 else if (quant > 8 && quant < 25)
618 s->y_dc_scale = (quant + 8);
620 s->y_dc_scale = (2 * quant - 16);
624 else if (quant > 4 && quant < 25)
625 s->c_dc_scale = ((quant + 13) / 2);
627 s->c_dc_scale = (quant - 6);
630 static int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr)
632 int a, b, c, xy, wrap, pred, scale;
635 /* find prediction */
637 wrap = s->mb_width * 2 + 2;
638 xy = 2 * s->mb_y + 1 + ((n & 2) >> 1);
640 xy += 2 * s->mb_x + 1 + (n & 1);
641 dc_val = s->dc_val[0];
642 scale = s->y_dc_scale;
644 wrap = s->mb_width + 2;
648 dc_val = s->dc_val[n - 4 + 1];
649 scale = s->c_dc_scale;
656 b = dc_val[xy - 1 - wrap];
657 c = dc_val[xy - wrap];
659 if (abs(a - b) < abs(b - c)) {
661 *dir_ptr = 1; /* top */
664 *dir_ptr = 0; /* left */
666 /* we assume pred is positive */
667 pred = (pred + (scale >> 1)) / scale;
669 /* prepare address for prediction update */
670 *dc_val_ptr = &dc_val[xy];
675 void mpeg4_pred_ac(MpegEncContext * s, INT16 *block, int n,
679 INT16 *ac_val, *ac_val1;
681 /* find prediction */
683 x = 2 * s->mb_x + 1 + (n & 1);
684 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
685 wrap = s->mb_width * 2 + 2;
686 ac_val = s->ac_val[0][0];
690 wrap = s->mb_width + 2;
691 ac_val = s->ac_val[n - 4 + 1][0];
693 ac_val += ((y) * wrap + (x)) * 16;
697 /* left prediction */
700 block[block_permute_op(i*8)] += ac_val[i];
706 block[block_permute_op(i)] += ac_val[i + 8];
712 ac_val1[i] = block[block_permute_op(i * 8)];
715 ac_val1[8 + i] = block[block_permute_op(i)];
718 static inline void mpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
723 pred = mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
725 *dc_val = level * s->y_dc_scale;
727 *dc_val = level * s->c_dc_scale;
730 /* do the prediction */
732 /* find number of bits */
742 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
745 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
748 /* encode remaining bits */
751 level = (-level) ^ ((1 << size) - 1);
752 put_bits(&s->pb, size, level);
754 put_bits(&s->pb, 1, 1);
758 static void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
760 int level, run, last, i, j, last_index, last_non_zero, sign, slevel;
761 int code, dc_pred_dir;
765 /* mpeg4 based DC predictor */
766 mpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
775 last_index = s->block_last_index[n];
776 last_non_zero = i - 1;
777 for (; i <= last_index; i++) {
778 j = zigzag_direct[i];
781 run = i - last_non_zero - 1;
782 last = (i == last_index);
789 code = get_rl_index(rl, last, run, level);
790 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
793 level1 = level - rl->max_level[last][run];
796 code = get_rl_index(rl, last, run, level1);
799 put_bits(&s->pb, 1, 1);
800 if (level > MAX_LEVEL)
802 run1 = run - rl->max_run[last][level] - 1;
805 code = get_rl_index(rl, last, run1, level);
809 put_bits(&s->pb, 1, 1);
810 put_bits(&s->pb, 1, last);
811 put_bits(&s->pb, 6, run);
812 put_bits(&s->pb, 1, 1);
813 put_bits(&s->pb, 12, slevel & 0xfff);
814 put_bits(&s->pb, 1, 1);
817 put_bits(&s->pb, 1, 0);
818 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
819 put_bits(&s->pb, 1, sign);
823 put_bits(&s->pb, 1, 0);
824 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
825 put_bits(&s->pb, 1, sign);
828 put_bits(&s->pb, 1, sign);
837 /***********************************************/
840 static VLC intra_MCBPC_vlc;
841 static VLC inter_MCBPC_vlc;
844 static VLC dc_lum, dc_chrom;
846 void init_rl(RLTable *rl)
848 INT8 max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
849 UINT8 index_run[MAX_RUN+1];
850 int last, run, level, start, end, i;
852 /* compute max_level[], max_run[] and index_run[] */
853 for(last=0;last<2;last++) {
862 memset(max_level, 0, MAX_RUN + 1);
863 memset(max_run, 0, MAX_LEVEL + 1);
864 memset(index_run, rl->n, MAX_RUN + 1);
865 for(i=start;i<end;i++) {
866 run = rl->table_run[i];
867 level = rl->table_level[i];
868 if (index_run[run] == rl->n)
870 if (level > max_level[run])
871 max_level[run] = level;
872 if (run > max_run[level])
873 max_run[level] = run;
875 rl->max_level[last] = malloc(MAX_RUN + 1);
876 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
877 rl->max_run[last] = malloc(MAX_LEVEL + 1);
878 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
879 rl->index_run[last] = malloc(MAX_RUN + 1);
880 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
884 void init_vlc_rl(RLTable *rl)
886 init_vlc(&rl->vlc, 9, rl->n + 1,
887 &rl->table_vlc[0][1], 4, 2,
888 &rl->table_vlc[0][0], 4, 2);
893 /* XXX: find a better solution to handle static init */
894 void h263_decode_init_vlc(MpegEncContext *s)
901 init_vlc(&intra_MCBPC_vlc, 6, 8,
902 intra_MCBPC_bits, 1, 1,
903 intra_MCBPC_code, 1, 1);
904 init_vlc(&inter_MCBPC_vlc, 9, 25,
905 inter_MCBPC_bits, 1, 1,
906 inter_MCBPC_code, 1, 1);
907 init_vlc(&cbpy_vlc, 6, 16,
908 &cbpy_tab[0][1], 2, 1,
909 &cbpy_tab[0][0], 2, 1);
910 init_vlc(&mv_vlc, 9, 33,
915 init_rl(&rl_intra_aic);
916 init_vlc_rl(&rl_inter);
917 init_vlc_rl(&rl_intra);
918 init_vlc_rl(&rl_intra_aic);
919 init_vlc(&dc_lum, 9, 13,
920 &DCtab_lum[0][1], 2, 1,
921 &DCtab_lum[0][0], 2, 1);
922 init_vlc(&dc_chrom, 9, 13,
923 &DCtab_chrom[0][1], 2, 1,
924 &DCtab_chrom[0][0], 2, 1);
928 int h263_decode_gob_header(MpegEncContext *s)
930 unsigned int val, gfid;
932 /* Check for GOB Start Code */
933 val = show_bits(&s->gb, 16);
935 /* We have a GBSC probably with GSTUFF */
936 skip_bits(&s->gb, 16); /* Drop the zeros */
937 while (get_bits1(&s->gb) == 0); /* Seek the '1' bit */
939 fprintf(stderr,"\nGOB Start Code at MB %d\n", (s->mb_y * s->mb_width) + s->mb_x);
941 s->gob_number = get_bits(&s->gb, 5); /* GN */
942 gfid = get_bits(&s->gb, 2); /* GFID */
943 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
945 fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", s->gob_number, gfid, s->qscale);
953 int h263_decode_mb(MpegEncContext *s,
954 DCTELEM block[6][64])
956 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
958 static INT8 quant_tab[4] = { -1, -2, 1, 2 };
960 if (s->pict_type == P_TYPE) {
961 if (get_bits1(&s->gb)) {
965 s->block_last_index[i] = -1;
966 s->mv_dir = MV_DIR_FORWARD;
967 s->mv_type = MV_TYPE_16X16;
973 cbpc = get_vlc(&s->gb, &inter_MCBPC_vlc);
974 //fprintf(stderr, "\tCBPC: %d", cbpc);
980 fprintf(stderr, "Stuffing !");
983 s->mb_intra = ((cbpc & 4) != 0);
985 cbpc = get_vlc(&s->gb, &intra_MCBPC_vlc);
993 cbpy = get_vlc(&s->gb, &cbpy_vlc);
994 cbp = (cbpc & 3) | ((cbpy ^ 0xf) << 2);
996 s->qscale += quant_tab[get_bits(&s->gb, 2)];
999 else if (s->qscale > 31)
1002 s->mv_dir = MV_DIR_FORWARD;
1003 if ((cbpc & 16) == 0) {
1004 /* 16x16 motion prediction */
1005 s->mv_type = MV_TYPE_16X16;
1006 h263_pred_motion(s, 0, &pred_x, &pred_y);
1008 mx = h263p_decode_umotion(s, pred_x);
1010 mx = h263_decode_motion(s, pred_x);
1015 my = h263p_decode_umotion(s, pred_y);
1017 my = h263_decode_motion(s, pred_y);
1020 s->mv[0][0][0] = mx;
1021 s->mv[0][0][1] = my;
1022 /*fprintf(stderr, "\n MB %d", (s->mb_y * s->mb_width) + s->mb_x);
1023 fprintf(stderr, "\n\tmvx: %d\t\tpredx: %d", mx, pred_x);
1024 fprintf(stderr, "\n\tmvy: %d\t\tpredy: %d", my, pred_y);*/
1025 if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
1026 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
1029 s->mv_type = MV_TYPE_8X8;
1031 mot_val = h263_pred_motion(s, i, &pred_x, &pred_y);
1033 mx = h263p_decode_umotion(s, pred_x);
1035 mx = h263_decode_motion(s, pred_x);
1040 my = h263p_decode_umotion(s, pred_y);
1042 my = h263_decode_motion(s, pred_y);
1045 s->mv[0][i][0] = mx;
1046 s->mv[0][i][1] = my;
1047 if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
1048 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
1055 if (s->h263_pred || s->h263_aic) {
1056 s->ac_pred = get_bits1(&s->gb);
1057 if (s->ac_pred && s->h263_aic)
1058 s->h263_aic_dir = get_bits1(&s->gb);
1060 cbpy = get_vlc(&s->gb, &cbpy_vlc);
1061 cbp = (cbpc & 3) | (cbpy << 2);
1063 s->qscale += quant_tab[get_bits(&s->gb, 2)];
1066 else if (s->qscale > 31)
1071 /* decode each block */
1073 for (i = 0; i < 6; i++) {
1074 if (mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
1078 for (i = 0; i < 6; i++) {
1079 if (h263_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
1086 static int h263_decode_motion(MpegEncContext * s, int pred)
1088 int code, val, sign, shift, l, m;
1090 code = get_vlc(&s->gb, &mv_vlc);
1096 sign = get_bits1(&s->gb);
1097 shift = s->f_code - 1;
1098 val = (code - 1) << shift;
1100 val |= get_bits(&s->gb, shift);
1106 /* modulo decoding */
1107 if (!s->h263_long_vectors) {
1108 l = (1 << (s->f_code - 1)) * 32;
1112 } else if (val >= l) {
1116 /* horrible h263 long vector mode */
1117 if (pred < -31 && val < -63)
1119 if (pred > 32 && val > 63)
1126 /* Decodes RVLC of H.263+ UMV */
1127 static int h263p_decode_umotion(MpegEncContext * s, int pred)
1131 if (get_bits1(&s->gb)) /* Motion difference = 0 */
1134 code = 2 + get_bits1(&s->gb);
1136 while (get_bits1(&s->gb))
1139 code += get_bits1(&s->gb);
1144 code = (sign) ? (pred - code) : (pred + code);
1146 fprintf(stderr,"H.263+ UMV Motion = %d\n", code);
1152 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
1155 int code, level, i, j, last, run;
1156 RLTable *rl = &rl_inter;
1158 const UINT8 *scan_table;
1160 scan_table = zigzag_direct;
1165 if (s->h263_aic_dir)
1166 scan_table = ff_alternate_vertical_scan; /* left */
1168 scan_table = ff_alternate_horizontal_scan; /* top */
1170 } else if (s->mb_intra) {
1172 if (s->h263_rv10 && s->rv10_version == 3 && s->pict_type == I_TYPE) {
1173 int component, diff;
1174 component = (n <= 3 ? 0 : n - 4 + 1);
1175 level = s->last_dc[component];
1176 if (s->rv10_first_dc_coded[component]) {
1177 diff = rv_decode_dc(s, n);
1181 level = level & 0xff; /* handle wrap round */
1182 s->last_dc[component] = level;
1184 s->rv10_first_dc_coded[component] = 1;
1187 level = get_bits(&s->gb, 8);
1197 if (s->mb_intra && s->h263_aic) {
1198 level = h263_pred_dc(s, n, &dc_val);
1201 *dc_val = level * s->y_dc_scale;
1203 h263_pred_ac(s, block, n);
1207 s->block_last_index[n] = i - 1;
1212 code = get_vlc(&s->gb, &rl->vlc);
1215 if (code == rl->n) {
1217 last = get_bits1(&s->gb);
1218 run = get_bits(&s->gb, 6);
1219 level = (INT8)get_bits(&s->gb, 8);
1220 if (s->h263_rv10 && level == -128) {
1221 /* XXX: should patch encoder too */
1222 level = get_bits(&s->gb, 12);
1223 level = (level << 20) >> 20;
1226 run = rl->table_run[code];
1227 level = rl->table_level[code];
1228 last = code >= rl->last;
1229 if (get_bits1(&s->gb))
1232 if (!i && s->h263_aic) {
1233 level += h263_pred_dc(s, n, &dc_val);
1238 *dc_val = level * s->y_dc_scale;
1252 h263_pred_ac(s, block, n);
1255 s->block_last_index[n] = i;
1259 static int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
1261 int level, pred, code;
1265 code = get_vlc(&s->gb, &dc_lum);
1267 code = get_vlc(&s->gb, &dc_chrom);
1273 level = get_bits(&s->gb, code);
1274 if ((level >> (code - 1)) == 0) /* if MSB not set it is negative*/
1275 level = - (level ^ ((1 << code) - 1));
1277 skip_bits1(&s->gb); /* marker */
1280 pred = mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
1285 *dc_val = level * s->y_dc_scale;
1287 *dc_val = level * s->c_dc_scale;
1292 static int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
1295 int code, level, i, j, last, run;
1298 const UINT8 *scan_table;
1302 level = mpeg4_decode_dc(s, n, &dc_pred_dir);
1311 if (dc_pred_dir == 0)
1312 scan_table = ff_alternate_vertical_scan; /* left */
1314 scan_table = ff_alternate_horizontal_scan; /* top */
1316 scan_table = zigzag_direct;
1321 s->block_last_index[n] = i - 1;
1325 scan_table = zigzag_direct;
1329 code = get_vlc(&s->gb, &rl->vlc);
1332 if (code == rl->n) {
1334 if (get_bits1(&s->gb) != 0) {
1335 if (get_bits1(&s->gb) != 0) {
1337 last = get_bits1(&s->gb);
1338 run = get_bits(&s->gb, 6);
1339 get_bits1(&s->gb); /* marker */
1340 level = get_bits(&s->gb, 12);
1341 level = (level << 20) >> 20; /* sign extend */
1342 skip_bits1(&s->gb); /* marker */
1345 code = get_vlc(&s->gb, &rl->vlc);
1346 if (code < 0 || code >= rl->n)
1348 run = rl->table_run[code];
1349 level = rl->table_level[code];
1350 last = code >= rl->last;
1351 run += rl->max_run[last][level] + 1;
1352 if (get_bits1(&s->gb))
1357 code = get_vlc(&s->gb, &rl->vlc);
1358 if (code < 0 || code >= rl->n)
1360 run = rl->table_run[code];
1361 level = rl->table_level[code];
1362 last = code >= rl->last;
1363 level += rl->max_level[last][run];
1364 if (get_bits1(&s->gb))
1368 run = rl->table_run[code];
1369 level = rl->table_level[code];
1370 last = code >= rl->last;
1371 if (get_bits1(&s->gb))
1385 mpeg4_pred_ac(s, block, n, dc_pred_dir);
1387 i = 64; /* XXX: not optimal */
1390 s->block_last_index[n] = i - 1;
1394 /* most is hardcoded. should extend to handle all h263 streams */
1395 int h263_decode_picture_header(MpegEncContext *s)
1397 int format, width, height;
1399 /* picture header */
1400 if (get_bits(&s->gb, 22) != 0x20)
1402 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
1404 if (get_bits1(&s->gb) != 1)
1405 return -1; /* marker */
1406 if (get_bits1(&s->gb) != 0)
1407 return -1; /* h263 id */
1408 skip_bits1(&s->gb); /* split screen off */
1409 skip_bits1(&s->gb); /* camera off */
1410 skip_bits1(&s->gb); /* freeze picture release off */
1412 /* Reset GOB number */
1415 format = get_bits(&s->gb, 3);
1417 if (format != 7 && format != 6) {
1420 width = h263_format[format][0];
1421 height = h263_format[format][1];
1427 s->pict_type = I_TYPE + get_bits1(&s->gb);
1429 s->unrestricted_mv = get_bits1(&s->gb);
1430 s->h263_long_vectors = s->unrestricted_mv;
1432 if (get_bits1(&s->gb) != 0)
1433 return -1; /* SAC: off */
1434 if (get_bits1(&s->gb) != 0) {
1435 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
1438 if (get_bits1(&s->gb) != 0)
1439 return -1; /* not PB frame */
1441 s->qscale = get_bits(&s->gb, 5);
1442 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
1448 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
1452 format = get_bits(&s->gb, 3);
1453 skip_bits(&s->gb,1); /* Custom PCF */
1454 s->umvplus_dec = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */
1455 skip_bits1(&s->gb); /* Syntax-based Arithmetic Coding (SAC) */
1456 if (get_bits1(&s->gb) != 0) {
1457 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
1459 if (get_bits1(&s->gb) != 0) { /* Advanced Intra Coding (AIC) */
1462 skip_bits(&s->gb, 7);
1463 skip_bits(&s->gb, 3); /* Reserved */
1464 } else if (ufep != 0)
1468 s->pict_type = get_bits(&s->gb, 3) + 1;
1469 if (s->pict_type != I_TYPE &&
1470 s->pict_type != P_TYPE)
1472 skip_bits(&s->gb, 7);
1474 /* Get the picture dimensions */
1477 /* Custom Picture Format (CPFMT) */
1478 skip_bits(&s->gb, 4); /* aspect ratio */
1479 width = (get_bits(&s->gb, 9) + 1) * 4;
1481 height = get_bits(&s->gb, 9) * 4;
1483 fprintf(stderr,"\nH.263+ Custom picture: %dx%d\n",width,height);
1487 width = h263_format[format][0];
1488 height = h263_format[format][1];
1490 if ((width == 0) || (height == 0))
1494 if (s->umvplus_dec) {
1495 skip_bits1(&s->gb); /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
1499 s->qscale = get_bits(&s->gb, 5);
1502 while (get_bits1(&s->gb) != 0) {
1503 skip_bits(&s->gb, 8);
1509 /* decode mpeg4 VOP header */
1510 int mpeg4_decode_picture_header(MpegEncContext * s)
1512 int time_incr, startcode, state, v;
1515 /* search next start code */
1516 align_get_bits(&s->gb);
1519 v = get_bits(&s->gb, 8);
1520 if (state == 0x000001) {
1521 state = ((state << 8) | v) & 0xffffff;
1525 state = ((state << 8) | v) & 0xffffff;
1526 /* XXX: really detect end of frame */
1531 if (startcode == 0x120) {
1532 int time_increment_resolution, width, height, vo_ver_id;
1535 skip_bits(&s->gb, 1); /* random access */
1536 skip_bits(&s->gb, 8); /* vo_type */
1537 if (get_bits1(&s->gb) != 0) { /* is_ol_id */
1538 vo_ver_id = get_bits(&s->gb, 4); /* vo_ver_id */
1539 skip_bits(&s->gb, 3); /* vo_priority */
1544 skip_bits(&s->gb, 4); /* aspect_ratio_info */
1545 skip_bits1(&s->gb); /* vol control parameter */
1546 s->shape = get_bits(&s->gb, 2); /* vol shape */
1547 skip_bits1(&s->gb); /* marker */
1549 time_increment_resolution = get_bits(&s->gb, 16);
1550 s->time_increment_bits = av_log2(time_increment_resolution - 1) + 1;
1551 if (s->time_increment_bits < 1)
1552 s->time_increment_bits = 1;
1553 skip_bits1(&s->gb); /* marker */
1555 if (get_bits1(&s->gb) != 0) { /* fixed_vop_rate */
1556 skip_bits(&s->gb, s->time_increment_bits);
1559 if (s->shape != 2) {
1560 if (s->shape == 0) {
1561 skip_bits1(&s->gb); /* marker */
1562 width = get_bits(&s->gb, 13);
1563 skip_bits1(&s->gb); /* marker */
1564 height = get_bits(&s->gb, 13);
1565 skip_bits1(&s->gb); /* marker */
1568 skip_bits1(&s->gb); /* interlaced */
1569 skip_bits1(&s->gb); /* OBMC */
1570 if (vo_ver_id == 1) {
1571 s->vol_sprite_usage = get_bits1(&s->gb); /* vol_sprite_usage */
1573 s->vol_sprite_usage = get_bits(&s->gb, 2); /* vol_sprite_usage */
1575 if (get_bits1(&s->gb) == 1) { /* not_8_bit */
1576 s->quant_precision = get_bits(&s->gb, 4); /* quant_precision */
1577 skip_bits(&s->gb, 4); /* bits_per_pixel */
1579 s->quant_precision = 5;
1582 skip_bits1(&s->gb); /* vol_quant_type */
1583 skip_bits1(&s->gb); /* vol_quarter_pixel */
1584 skip_bits1(&s->gb); /* complexity_estimation_disabled */
1585 skip_bits1(&s->gb); /* resync_marker_disabled */
1586 skip_bits1(&s->gb); /* data_partioning_enabled */
1587 if (get_bits1(&s->gb) != 0) { /* scalability */
1588 printf("bad scalability!!!\n");
1593 } else if (startcode != 0x1b6) {
1597 s->pict_type = get_bits(&s->gb, 2) + 1; /* pict type: I = 0 , P = 1 */
1598 if (s->pict_type != I_TYPE &&
1599 s->pict_type != P_TYPE)
1602 /* XXX: parse time base */
1604 while (get_bits1(&s->gb) != 0)
1607 skip_bits1(&s->gb); /* marker */
1608 skip_bits(&s->gb, s->time_increment_bits);
1609 skip_bits1(&s->gb); /* marker */
1611 if (get_bits1(&s->gb) != 1)
1614 if (s->shape != 2 && s->pict_type == P_TYPE) {
1615 /* rounding type for motion estimation */
1616 s->no_rounding = get_bits1(&s->gb);
1621 if (s->shape != 0) {
1622 if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) {
1623 int width, height, hor_spat_ref, ver_spat_ref;
1625 width = get_bits(&s->gb, 13);
1626 skip_bits1(&s->gb); /* marker */
1627 height = get_bits(&s->gb, 13);
1628 skip_bits1(&s->gb); /* marker */
1629 hor_spat_ref = get_bits(&s->gb, 13); /* hor_spat_ref */
1630 skip_bits1(&s->gb); /* marker */
1631 ver_spat_ref = get_bits(&s->gb, 13); /* ver_spat_ref */
1633 skip_bits1(&s->gb); /* change_CR_disable */
1635 if (get_bits1(&s->gb) != 0) {
1636 skip_bits(&s->gb, 8); /* constant_alpha_value */
1640 if (s->shape != 2) {
1641 skip_bits(&s->gb, 3); /* intra dc VLC threshold */
1643 /* note: we do not use quant_precision to avoid problem if no
1644 MPEG4 vol header as it is found on some old opendivx
1646 s->qscale = get_bits(&s->gb, 5);
1648 if (s->pict_type != I_TYPE) {
1649 s->f_code = get_bits(&s->gb, 3); /* fcode_for */
1651 if (s->shape && (s->pict_type != I_TYPE)) {
1652 skip_bits1(&s->gb); // vop shape coding type
1658 /* don't understand why they choose a different header ! */
1659 int intel_h263_decode_picture_header(MpegEncContext *s)
1663 /* picture header */
1664 if (get_bits(&s->gb, 22) != 0x20)
1666 skip_bits(&s->gb, 8); /* picture timestamp */
1668 if (get_bits1(&s->gb) != 1)
1669 return -1; /* marker */
1670 if (get_bits1(&s->gb) != 0)
1671 return -1; /* h263 id */
1672 skip_bits1(&s->gb); /* split screen off */
1673 skip_bits1(&s->gb); /* camera off */
1674 skip_bits1(&s->gb); /* freeze picture release off */
1676 format = get_bits(&s->gb, 3);
1682 s->pict_type = I_TYPE + get_bits1(&s->gb);
1684 s->unrestricted_mv = get_bits1(&s->gb);
1685 s->h263_long_vectors = s->unrestricted_mv;
1687 if (get_bits1(&s->gb) != 0)
1688 return -1; /* SAC: off */
1689 if (get_bits1(&s->gb) != 0)
1690 return -1; /* advanced prediction mode: off */
1691 if (get_bits1(&s->gb) != 0)
1692 return -1; /* not PB frame */
1694 /* skip unknown header garbage */
1695 skip_bits(&s->gb, 41);
1697 s->qscale = get_bits(&s->gb, 5);
1698 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
1701 while (get_bits1(&s->gb) != 0) {
1702 skip_bits(&s->gb, 8);