#define ALT_BITSTREAM_READER
//#define LIBMPEG2_BITSTREAM_READER
//#define A32_BITSTREAM_READER
+#define LIBMPEG2_BITSTREAM_READER_HACK //add BERO
#ifdef HAVE_AV_CONFIG_H
/* only include the following when compiling package */
for examples see get_bits, show_bits, skip_bits, get_vlc
*/
+static inline int unaligned32_be(const void *v)
+{
+#ifdef CONFIG_ALIGN
+ const uint8_t *p=v;
+ return (((p[0]<<8) | p[1])<<16) | (p[2]<<8) | (p[3]);
+#else
+ return be2me_32( unaligned32(v)); //original
+#endif
+}
+
#ifdef ALT_BITSTREAM_READER
# define MIN_CACHE_BITS 25
(gb)->index= name##_index;\
# define UPDATE_CACHE(name, gb)\
- name##_cache= be2me_32( unaligned32( ((uint8_t *)(gb)->buffer)+(name##_index>>3) ) ) << (name##_index&0x07);\
+ name##_cache= unaligned32_be( ((uint8_t *)(gb)->buffer)+(name##_index>>3) ) << (name##_index&0x07);\
# define SKIP_CACHE(name, gb, num)\
name##_cache <<= (num);\
(gb)->cache= name##_cache;\
(gb)->buffer_ptr= name##_buffer_ptr;\
+#ifdef LIBMPEG2_BITSTREAM_READER_HACK
+
+# define UPDATE_CACHE(name, gb)\
+ if(name##_bit_count >= 0){\
+ name##_cache+= (int)be2me_16(*(uint16_t*)name##_buffer_ptr++) << name##_bit_count;\
+ name##_buffer_ptr+=2;\
+ name##_bit_count-= 16;\
+ }\
+
+#else
+
# define UPDATE_CACHE(name, gb)\
if(name##_bit_count > 0){\
name##_cache+= ((name##_buffer_ptr[0]<<8) + name##_buffer_ptr[1]) << name##_bit_count;\
name##_bit_count-= 16;\
}\
+#endif
+
# define SKIP_CACHE(name, gb, num)\
name##_cache <<= (num);\
#endif
+/* add BERO
+ if MSB not set it is negative
+*/
+static inline int get_xbits(GetBitContext *s, int n){
+ register int tmp;
+ register int32_t cache;
+ OPEN_READER(re, s)
+ UPDATE_CACHE(re, s)
+ cache = GET_CACHE(re,s);
+ if ((int32_t)cache<0) { //MSB=1
+ tmp = NEG_USR32(cache,n);
+ } else {
+ // tmp = (-1<<n) | NEG_USR32(cache,n) + 1; mpeg12.c algo
+ // tmp = - (NEG_USR32(cache,n) ^ ((1 << n) - 1)); h263.c algo
+ tmp = - NEG_USR32(~cache,n);
+ }
+ LAST_SKIP_BITS(re, s, n)
+ CLOSE_READER(re, s)
+ return tmp;
+}
+
+static inline int get_sbits(GetBitContext *s, int n){
+ register int tmp;
+ OPEN_READER(re, s)
+ UPDATE_CACHE(re, s)
+ tmp= SHOW_SBITS(re, s, n);
+ LAST_SKIP_BITS(re, s, n)
+ CLOSE_READER(re, s)
+ return tmp;
+}
+
static inline unsigned int get_bits(GetBitContext *s, int n){
register int tmp;
OPEN_READER(re, s)
if(level == -128){
if (s->h263_rv10) {
/* XXX: should patch encoder too */
- level = get_bits(&s->gb, 12);
- level= (level + ((-1)<<11)) ^ ((-1)<<11); //sign extension
+ level = get_sbits(&s->gb, 12);
}else{
level = get_bits(&s->gb, 5);
- level += get_bits(&s->gb, 6)<<5;
- level= (level + ((-1)<<10)) ^ ((-1)<<10); //sign extension
+ level |= get_sbits(&s->gb, 6)<<5;
}
}
} else {
if (code == 0) {
level = 0;
} else {
- level = get_bits(&s->gb, code);
- if ((level >> (code - 1)) == 0) /* if MSB not set it is negative*/
- level = - (level ^ ((1 << code) - 1));
+ level = get_xbits(&s->gb, code);
if (code > 8){
if(get_bits1(&s->gb)==0){ /* marker */
if(s->error_resilience>=2){
length= get_vlc(&s->gb, &sprite_trajectory);
if(length){
- x= get_bits(&s->gb, length);
-
- if ((x >> (length - 1)) == 0) /* if MSB not set it is negative*/
- x = - (x ^ ((1 << length) - 1));
+ x= get_xbits(&s->gb, length);
}
if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(&s->gb); /* marker bit */
length= get_vlc(&s->gb, &sprite_trajectory);
if(length){
- y=get_bits(&s->gb, length);
-
- if ((y >> (length - 1)) == 0) /* if MSB not set it is negative*/
- y = - (y ^ ((1 << length) - 1));
+ y=get_xbits(&s->gb, length);
}
skip_bits1(&s->gb); /* marker bit */
//printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);