# HG changeset patch # User pulento # Date 1020449483 0 # Node ID ac6fc4c7aecb41f87fc1ca0091356b90c1096456 # Parent 167aa21aa250d044da6bcd0cc788390023245255 - H263 PAR support by Alex Beregszaszi. - Typo fix in mpeg4data. diff -r 167aa21aa250 -r ac6fc4c7aecb h263.c --- a/h263.c Fri May 03 16:34:40 2002 +0000 +++ b/h263.c Fri May 03 18:11:23 2002 +0000 @@ -20,6 +20,8 @@ * * ac prediction encoding & b-frame support by Michael Niedermayer */ + +//#define DEBUG #include "common.h" #include "dsputil.h" #include "avcodec.h" @@ -66,15 +68,15 @@ int format; if (width == 128 && height == 96) - format = 1; + format = 1; else if (width == 176 && height == 144) - format = 2; + format = 2; else if (width == 352 && height == 288) - format = 3; + format = 3; else if (width == 704 && height == 576) - format = 4; + format = 4; else if (width == 1408 && height == 1152) - format = 5; + format = 5; else format = 7; return format; @@ -157,6 +159,9 @@ if (format == 7) { /* Custom Picture Format (CPFMT) */ + if (s->aspect_ratio_info) + put_bits(&s->pb,4,s->aspect_ratio_info); + else put_bits(&s->pb,4,2); /* Aspect ratio: CIF 12:11 (4:3) picture */ put_bits(&s->pb,9,(s->width >> 2) - 1); put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */ @@ -2380,15 +2385,24 @@ { int format, width, height; - /* picture header */ - if (get_bits(&s->gb, 22) != 0x20) + /* picture start code */ + if (get_bits(&s->gb, 22) != 0x20) { + fprintf(stderr, "Bad picture start code\n"); return -1; + } + /* temporal reference */ s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */ - - if (get_bits1(&s->gb) != 1) - return -1; /* marker */ - if (get_bits1(&s->gb) != 0) + + /* PTYPE starts here */ + if (get_bits1(&s->gb) != 1) { + /* marker */ + fprintf(stderr, "Bad marker\n"); + return -1; + } + if (get_bits1(&s->gb) != 0) { + fprintf(stderr, "Bad H263 id\n"); return -1; /* h263 id */ + } skip_bits1(&s->gb); /* split screen off */ skip_bits1(&s->gb); /* camera off */ skip_bits1(&s->gb); /* freeze picture release off */ @@ -2397,6 +2411,12 @@ s->gob_number = 0; format = get_bits(&s->gb, 3); + /* + 0 forbidden + 1 sub-QCIF + 10 QCIF + 7 extended PTYPE (PLUSPTYPE) + */ if (format != 7 && format != 6) { s->h263_plus = 0; @@ -2413,15 +2433,18 @@ s->unrestricted_mv = get_bits1(&s->gb); s->h263_long_vectors = s->unrestricted_mv; - if (get_bits1(&s->gb) != 0) + if (get_bits1(&s->gb) != 0) { + fprintf(stderr, "H263 SAC not supported\n"); return -1; /* SAC: off */ + } if (get_bits1(&s->gb) != 0) { s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */ } - if (get_bits1(&s->gb) != 0) + if (get_bits1(&s->gb) != 0) { + fprintf(stderr, "H263 PB frame not supported\n"); return -1; /* not PB frame */ - + } s->qscale = get_bits(&s->gb, 5); skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */ } else { @@ -2430,10 +2453,12 @@ /* H.263v2 */ s->h263_plus = 1; ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */ - + + /* ufep other than 0 and 1 are reserved */ if (ufep == 1) { /* OPPTYPE */ format = get_bits(&s->gb, 3); + dprintf("ufep=1, format: %d\n", format); skip_bits(&s->gb,1); /* Custom PCF */ s->umvplus_dec = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */ skip_bits1(&s->gb); /* Syntax-based Arithmetic Coding (SAC) */ @@ -2443,34 +2468,59 @@ if (get_bits1(&s->gb) != 0) { /* Advanced Intra Coding (AIC) */ s->h263_aic = 1; } + skip_bits(&s->gb, 7); + /* these are the 7 bits: (in order of appearence */ + /* Deblocking Filter */ + /* Slice Structured */ + /* Reference Picture Selection */ + /* Independent Segment Decoding */ + /* Alternative Inter VLC */ + /* Modified Quantization */ + /* Prevent start code emulation */ + skip_bits(&s->gb, 3); /* Reserved */ - } else if (ufep != 0) + } else if (ufep != 0) { + fprintf(stderr, "Bad UFEP type (%d)\n", ufep); return -1; + } /* MPPTYPE */ - s->pict_type = get_bits(&s->gb, 3) + 1; + s->pict_type = get_bits(&s->gb, 3) + I_TYPE; + dprintf("pict_type: %d\n", s->pict_type); if (s->pict_type != I_TYPE && s->pict_type != P_TYPE) return -1; skip_bits(&s->gb, 2); s->no_rounding = get_bits1(&s->gb); - //fprintf(stderr, "\nRTYPE: %d", s->no_rounding); + dprintf("RTYPE: %d\n", s->no_rounding); skip_bits(&s->gb, 4); /* Get the picture dimensions */ if (ufep) { if (format == 6) { /* Custom Picture Format (CPFMT) */ - skip_bits(&s->gb, 4); /* aspect ratio */ + s->aspect_ratio_info = get_bits(&s->gb, 4); + dprintf("aspect: %d\n", s->aspect_ratio_info); + /* aspect ratios: + 0 - forbidden + 1 - 1:1 + 2 - 12:11 (CIF 4:3) + 3 - 10:11 (525-type 4:3) + 4 - 16:11 (CIF 16:9) + 5 - 40:33 (525-type 16:9) + 6-14 - reserved + */ width = (get_bits(&s->gb, 9) + 1) * 4; skip_bits1(&s->gb); height = get_bits(&s->gb, 9) * 4; -#ifdef DEBUG - fprintf(stderr,"\nH.263+ Custom picture: %dx%d\n",width,height); -#endif - } - else { + dprintf("\nH.263+ Custom picture: %dx%d\n",width,height); + if (s->aspect_ratio_info == EXTENDED_PAR) { + /* aspected dimensions */ + skip_bits(&s->gb, 8); /* width */ + skip_bits(&s->gb, 8); /* height */ + } + } else { width = h263_format[format][0]; height = h263_format[format][1]; } @@ -2727,7 +2777,7 @@ } //printf("vo type:%d\n",s->vo_type); s->aspect_ratio_info= get_bits(&s->gb, 4); - if(s->aspect_ratio_info == EXTENDET_PAR){ + if(s->aspect_ratio_info == EXTENDED_PAR){ skip_bits(&s->gb, 8); //par_width skip_bits(&s->gb, 8); // par_height } @@ -2940,7 +2990,7 @@ goto redo; } - s->pict_type = get_bits(&s->gb, 2) + 1; /* pict type: I = 0 , P = 1 */ + s->pict_type = get_bits(&s->gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */ // printf("pic: %d, qpel:%d\n", s->pict_type, s->quarter_sample); time_incr=0; while (get_bits1(&s->gb) != 0) @@ -3068,22 +3118,29 @@ int format; /* picture header */ - if (get_bits(&s->gb, 22) != 0x20) + if (get_bits(&s->gb, 22) != 0x20) { + fprintf(stderr, "Bad picture start code\n"); return -1; - skip_bits(&s->gb, 8); /* picture timestamp */ + } + s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */ - if (get_bits1(&s->gb) != 1) + if (get_bits1(&s->gb) != 1) { + fprintf(stderr, "Bad marker\n"); return -1; /* marker */ - if (get_bits1(&s->gb) != 0) + } + if (get_bits1(&s->gb) != 0) { + fprintf(stderr, "Bad H263 id\n"); return -1; /* h263 id */ + } skip_bits1(&s->gb); /* split screen off */ skip_bits1(&s->gb); /* camera off */ skip_bits1(&s->gb); /* freeze picture release off */ format = get_bits(&s->gb, 3); - if (format != 7) + if (format != 7) { + fprintf(stderr, "Intel H263 free format not supported\n"); return -1; - + } s->h263_plus = 0; s->pict_type = I_TYPE + get_bits1(&s->gb); @@ -3091,12 +3148,18 @@ s->unrestricted_mv = get_bits1(&s->gb); s->h263_long_vectors = s->unrestricted_mv; - if (get_bits1(&s->gb) != 0) + if (get_bits1(&s->gb) != 0) { + fprintf(stderr, "SAC not supported\n"); return -1; /* SAC: off */ - if (get_bits1(&s->gb) != 0) + } + if (get_bits1(&s->gb) != 0) { + fprintf(stderr, "Advanced Prediction Mode not supported\n"); return -1; /* advanced prediction mode: off */ - if (get_bits1(&s->gb) != 0) - return -1; /* not PB frame */ + } + if (get_bits1(&s->gb) != 0) { + fprintf(stderr, "PB frame mode no supported\n"); + return -1; /* PB frame mode */ + } /* skip unknown header garbage */ skip_bits(&s->gb, 41); diff -r 167aa21aa250 -r ac6fc4c7aecb mpeg4data.h --- a/mpeg4data.h Fri May 03 16:34:40 2002 +0000 +++ b/mpeg4data.h Fri May 03 18:11:23 2002 +0000 @@ -8,7 +8,7 @@ #define CORE_VO_TYPE 3 // aspect_ratio_info -#define EXTENDET_PAR 15 +#define EXTENDED_PAR 15 //vol_sprite_usage / sprite_enable #define STATIC_SPRITE 1