[Ffmpeg-cvslog] CVS: ffmpeg/libavcodec bitstream.c, 1.54, 1.55 bitstream.h, 1.150, 1.151
Michael Niedermayer CVS
michael
Wed May 11 03:46:16 CEST 2005
Update of /cvsroot/ffmpeg/ffmpeg/libavcodec
In directory mail:/var2/tmp/cvs-serv27905
Modified Files:
bitstream.c bitstream.h
Log Message:
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
Index: bitstream.c
===================================================================
RCS file: /cvsroot/ffmpeg/ffmpeg/libavcodec/bitstream.c,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -d -r1.54 -r1.55
--- bitstream.c 29 Dec 2004 17:50:24 -0000 1.54
+++ bitstream.c 11 May 2005 01:46:13 -0000 1.55
@@ -132,14 +132,14 @@
int nb_codes,
const void *bits, int bits_wrap, int bits_size,
const void *codes, int codes_wrap, int codes_size,
- uint32_t code_prefix, int n_prefix, int use_static)
+ uint32_t code_prefix, int n_prefix, int flags)
{
- int i, j, k, n, table_size, table_index, nb, n1, index;
+ int i, j, k, n, table_size, table_index, nb, n1, index, code_prefix2;
uint32_t code;
VLC_TYPE (*table)[2];
table_size = 1 << table_nb_bits;
- table_index = alloc_table(vlc, table_size, use_static);
+ table_index = alloc_table(vlc, table_size, flags & INIT_VLC_USE_STATIC);
#ifdef DEBUG_VLC
printf("new table index=%d size=%d code_prefix=%x n=%d\n",
table_index, table_size, code_prefix, n_prefix);
@@ -165,12 +165,18 @@
#endif
/* if code matches the prefix, it is in the table */
n -= n_prefix;
- if (n > 0 && (code >> n) == code_prefix) {
+ if(flags & INIT_VLC_LE)
+ code_prefix2= code & (n_prefix>=32 ? 0xffffffff : (1 << n_prefix)-1);
+ else
+ code_prefix2= code >> n;
+ if (n > 0 && code_prefix2 == code_prefix) {
if (n <= table_nb_bits) {
/* no need to add another table */
j = (code << (table_nb_bits - n)) & (table_size - 1);
nb = 1 << (table_nb_bits - n);
for(k=0;k<nb;k++) {
+ if(flags & INIT_VLC_LE)
+ j = (code >> n_prefix) + (k<<n);
#ifdef DEBUG_VLC
av_log(NULL, AV_LOG_DEBUG, "%4x: code=%d n=%d\n",
j, i, n);
@@ -185,7 +191,7 @@
}
} else {
n -= table_nb_bits;
- j = (code >> n) & ((1 << table_nb_bits) - 1);
+ j = (code >> ((flags & INIT_VLC_LE) ? n_prefix : n)) & ((1 << table_nb_bits) - 1);
#ifdef DEBUG_VLC
printf("%4x: n=%d (subtable)\n",
j, n);
@@ -211,8 +217,8 @@
index = build_table(vlc, n, nb_codes,
bits, bits_wrap, bits_size,
codes, codes_wrap, codes_size,
- (code_prefix << table_nb_bits) | i,
- n_prefix + table_nb_bits, use_static);
+ (flags & INIT_VLC_LE) ? (code_prefix | (i << n_prefix)) : ((code_prefix << table_nb_bits) | i),
+ n_prefix + table_nb_bits, flags);
if (index < 0)
return -1;
/* note: realloc has been done, so reload tables */
Index: bitstream.h
===================================================================
RCS file: /cvsroot/ffmpeg/ffmpeg/libavcodec/bitstream.h,v
retrieving revision 1.150
retrieving revision 1.151
diff -u -d -r1.150 -r1.151
--- bitstream.h 18 Apr 2005 20:07:48 -0000 1.150
+++ bitstream.h 11 May 2005 01:46:13 -0000 1.151
@@ -368,6 +368,16 @@
#endif
}
+static inline int unaligned32_le(const void *v)
+{
+#ifdef CONFIG_ALIGN
+ const uint8_t *p=v;
+ return (((p[3]<<8) | p[2])<<16) | (p[1]<<8) | (p[0]);
+#else
+ return le2me_32( unaligned32(v)); //original
+#endif
+}
+
#ifdef ALT_BITSTREAM_READER
# define MIN_CACHE_BITS 25
@@ -378,11 +388,19 @@
# define CLOSE_READER(name, gb)\
(gb)->index= name##_index;\
+# ifdef ALT_BITSTREAM_READER_LE
+# define UPDATE_CACHE(name, gb)\
+ name##_cache= unaligned32_le( ((const uint8_t *)(gb)->buffer)+(name##_index>>3) ) >> (name##_index&0x07);\
+
+# define SKIP_CACHE(name, gb, num)\
+ name##_cache >>= (num);
+# else
# define UPDATE_CACHE(name, gb)\
name##_cache= unaligned32_be( ((const uint8_t *)(gb)->buffer)+(name##_index>>3) ) << (name##_index&0x07);\
# define SKIP_CACHE(name, gb, num)\
- name##_cache <<= (num);\
+ name##_cache <<= (num);
+# endif
// FIXME name?
# define SKIP_COUNTER(name, gb, num)\
@@ -397,8 +415,13 @@
# define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num)
# define LAST_SKIP_CACHE(name, gb, num) ;
+# ifdef ALT_BITSTREAM_READER_LE
+# define SHOW_UBITS(name, gb, num)\
+ ((name##_cache) & (NEG_USR32(0xffffffff,num)))
+# else
# define SHOW_UBITS(name, gb, num)\
NEG_USR32(name##_cache, num)
+# endif
# define SHOW_SBITS(name, gb, num)\
NEG_SSR32(name##_cache, num)
@@ -616,8 +639,13 @@
#ifdef ALT_BITSTREAM_READER
int index= s->index;
uint8_t result= s->buffer[ index>>3 ];
+#ifdef ALT_BITSTREAM_READER_LE
+ result>>= (index&0x07);
+ result&= 1;
+#else
result<<= (index&0x07);
result>>= 8 - 1;
+#endif
index++;
s->index= index;
@@ -687,7 +715,9 @@
int init_vlc(VLC *vlc, int nb_bits, int nb_codes,
const void *bits, int bits_wrap, int bits_size,
const void *codes, int codes_wrap, int codes_size,
- int use_static);
+ int flags);
+#define INIT_VLC_USE_STATIC 1
+#define INIT_VLC_LE 2
void free_vlc(VLC *vlc);
/**
More information about the ffmpeg-cvslog
mailing list