Originally committed as revision 1875 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.5
| @@ -140,7 +140,7 @@ void init_get_bits(GetBitContext *s, | |||||
| #ifdef ALT_BITSTREAM_READER | #ifdef ALT_BITSTREAM_READER | ||||
| s->index=0; | s->index=0; | ||||
| #elif defined LIBMPEG2_BITSTREAM_READER | #elif defined LIBMPEG2_BITSTREAM_READER | ||||
| #ifdef LIBMPEG2_BITSTREAM_HACK | |||||
| #ifdef LIBMPEG2_BITSTREAM_READER_HACK | |||||
| if ((int)buffer&1) { | if ((int)buffer&1) { | ||||
| /* word alignment */ | /* word alignment */ | ||||
| s->cache = (*buffer++)<<24; | s->cache = (*buffer++)<<24; | ||||
| @@ -170,6 +170,30 @@ void init_get_bits(GetBitContext *s, | |||||
| #endif | #endif | ||||
| } | } | ||||
| /** | |||||
| * reads 0-32 bits. | |||||
| */ | |||||
| unsigned int get_bits_long(GetBitContext *s, int n){ | |||||
| if(n<=17) return get_bits(s, n); | |||||
| else{ | |||||
| int ret= get_bits(s, 16) << (n-16); | |||||
| return ret | get_bits(s, n-16); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * shows 0-32 bits. | |||||
| */ | |||||
| unsigned int show_bits_long(GetBitContext *s, int n){ | |||||
| if(n<=17) return show_bits(s, n); | |||||
| else{ | |||||
| GetBitContext gb= *s; | |||||
| int ret= get_bits_long(s, n); | |||||
| *s= gb; | |||||
| return ret; | |||||
| } | |||||
| } | |||||
| void align_get_bits(GetBitContext *s) | void align_get_bits(GetBitContext *s) | ||||
| { | { | ||||
| int n= (-get_bits_count(s)) & 7; | int n= (-get_bits_count(s)) & 7; | ||||
| @@ -543,8 +543,8 @@ static inline int get_bits_count(GetBitContext *s){ | |||||
| # define UPDATE_CACHE(name, gb)\ | # define UPDATE_CACHE(name, gb)\ | ||||
| if(name##_bit_count >= 0){\ | if(name##_bit_count >= 0){\ | ||||
| name##_cache+= (int)be2me_16(*(uint16_t*)name##_buffer_ptr++) << name##_bit_count;\ | |||||
| name##_buffer_ptr+=2;\ | |||||
| name##_cache+= (int)be2me_16(*(uint16_t*)name##_buffer_ptr) << name##_bit_count;\ | |||||
| ((uint16_t*)name##_buffer_ptr)++;\ | |||||
| name##_bit_count-= 16;\ | name##_bit_count-= 16;\ | ||||
| }\ | }\ | ||||
| @@ -654,9 +654,12 @@ static inline int get_bits_count(GetBitContext *s){ | |||||
| #endif | #endif | ||||
| /* add BERO | |||||
| if MSB not set it is negative | |||||
| */ | |||||
| /** | |||||
| * read mpeg1 dc style vlc (sign bit + mantisse with no MSB). | |||||
| * if MSB not set it is negative | |||||
| * @param n length in bits | |||||
| * @author BERO | |||||
| */ | |||||
| static inline int get_xbits(GetBitContext *s, int n){ | static inline int get_xbits(GetBitContext *s, int n){ | ||||
| register int tmp; | register int tmp; | ||||
| register int32_t cache; | register int32_t cache; | ||||
| @@ -685,6 +688,10 @@ static inline int get_sbits(GetBitContext *s, int n){ | |||||
| return tmp; | return tmp; | ||||
| } | } | ||||
| /** | |||||
| * reads 0-17 bits. | |||||
| * Note, the alt bitstream reader can read upto 25 bits, but the libmpeg2 reader cant | |||||
| */ | |||||
| static inline unsigned int get_bits(GetBitContext *s, int n){ | static inline unsigned int get_bits(GetBitContext *s, int n){ | ||||
| register int tmp; | register int tmp; | ||||
| OPEN_READER(re, s) | OPEN_READER(re, s) | ||||
| @@ -695,6 +702,12 @@ static inline unsigned int get_bits(GetBitContext *s, int n){ | |||||
| return tmp; | return tmp; | ||||
| } | } | ||||
| unsigned int get_bits_long(GetBitContext *s, int n); | |||||
| /** | |||||
| * shows 0-17 bits. | |||||
| * Note, the alt bitstream reader can read upto 25 bits, but the libmpeg2 reader cant | |||||
| */ | |||||
| static inline unsigned int show_bits(GetBitContext *s, int n){ | static inline unsigned int show_bits(GetBitContext *s, int n){ | ||||
| register int tmp; | register int tmp; | ||||
| OPEN_READER(re, s) | OPEN_READER(re, s) | ||||
| @@ -704,6 +717,8 @@ static inline unsigned int show_bits(GetBitContext *s, int n){ | |||||
| return tmp; | return tmp; | ||||
| } | } | ||||
| unsigned int show_bits_long(GetBitContext *s, int n); | |||||
| static inline void skip_bits(GetBitContext *s, int n){ | static inline void skip_bits(GetBitContext *s, int n){ | ||||
| //Note gcc seems to optimize this to s->index+=n for the ALT_READER :)) | //Note gcc seems to optimize this to s->index+=n for the ALT_READER :)) | ||||
| OPEN_READER(re, s) | OPEN_READER(re, s) | ||||
| @@ -2708,7 +2708,7 @@ static int mpeg4_decode_partition_a(MpegEncContext *s){ | |||||
| if(s->pict_type==I_TYPE){ | if(s->pict_type==I_TYPE){ | ||||
| int i; | int i; | ||||
| if(show_bits(&s->gb, 19)==DC_MARKER){ | |||||
| if(show_bits_long(&s->gb, 19)==DC_MARKER){ | |||||
| return mb_num-1; | return mb_num-1; | ||||
| } | } | ||||
| @@ -2956,7 +2956,7 @@ int ff_mpeg4_decode_partitions(MpegEncContext *s) | |||||
| s->mb_num_left= mb_num; | s->mb_num_left= mb_num; | ||||
| if(s->pict_type==I_TYPE){ | if(s->pict_type==I_TYPE){ | ||||
| if(get_bits(&s->gb, 19)!=DC_MARKER){ | |||||
| if(get_bits_long(&s->gb, 19)!=DC_MARKER){ | |||||
| fprintf(stderr, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y); | fprintf(stderr, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y); | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -3885,7 +3885,7 @@ int h263_decode_picture_header(MpegEncContext *s) | |||||
| int format, width, height; | int format, width, height; | ||||
| /* picture start code */ | /* picture start code */ | ||||
| if (get_bits(&s->gb, 22) != 0x20) { | |||||
| if (get_bits_long(&s->gb, 22) != 0x20) { | |||||
| fprintf(stderr, "Bad picture start code\n"); | fprintf(stderr, "Bad picture start code\n"); | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -4878,7 +4878,7 @@ int intel_h263_decode_picture_header(MpegEncContext *s) | |||||
| int format; | int format; | ||||
| /* picture header */ | /* picture header */ | ||||
| if (get_bits(&s->gb, 22) != 0x20) { | |||||
| if (get_bits_long(&s->gb, 22) != 0x20) { | |||||
| fprintf(stderr, "Bad picture start code\n"); | fprintf(stderr, "Bad picture start code\n"); | ||||
| return -1; | return -1; | ||||
| } | } | ||||