]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
Merge branch 't/bitstream_improvements'
authorAndre Noll <maan@systemlinux.org>
Thu, 26 Jun 2014 16:58:27 +0000 (18:58 +0200)
committerAndre Noll <maan@systemlinux.org>
Thu, 26 Jun 2014 17:00:15 +0000 (19:00 +0200)
Cooking since 2014-04-22.

* t/bitstream_improvements:
  bitstream: Improve documentation.
  wma: Store ASF header info in afhi->techinfo.
  bitstream: Replace check for impossible condition by assertion.
  bitstream: Remove pointless variable "code_prefix2".
  bitstream: Micro-optimization.
  bitstream: Kill pointless variable "symbol".
  bitstream: Trivial coding style fixes.
  bitstream: Trivial spelling fix auxillary -> auxiliary.

NEWS
bitstream.c
bitstream.h
wma.h
wma_afh.c
wma_common.c
wmadec_filter.c

diff --git a/NEWS b/NEWS
index 1cc2f40ebdd980289de24e1e829c5662980d9f69..7f4149771803cbc180a9f3da13251bd68468d9be 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,8 @@ NEWS
        - ao_writer fixes. This writer was in a quite bad shape. Many
          serious bugs have been fixed.
        - new audiod command: version.
+       - Minor improvements to the bitstream API.
+
 
 ----------------------------------------
 0.5.2 (2014-04-11) "orthogonal interior"
index ddad67bb177211b3909f88d3be9dcb3d5c381238..fb638d0a83317568c89e00a56d6bd375e6326a41 100644 (file)
@@ -11,9 +11,7 @@
  * For licencing details see COPYING.LIB.
  */
 
-/**
- * \file bitstream.c Bitstream API.
- */
+/** \file bitstream.c Bitstream API for the wma decoder. */
 
 #include <stdlib.h>
 #include <inttypes.h>
@@ -58,8 +56,7 @@ static int build_table(struct vlc *vlc, int table_nb_bits, int nb_codes,
                const void *bits, const void *codes, int codes_size,
                uint32_t code_prefix, int n_prefix)
 {
-       int i, j, k, n, table_size, table_index, nb, n1, idx, code_prefix2,
-               symbol;
+       int i, j, k, n, table_size, table_index, nb, n1, idx;
        uint32_t code;
        VLC_TYPE(*table)[2];
 
@@ -69,62 +66,57 @@ static int build_table(struct vlc *vlc, int table_nb_bits, int nb_codes,
        table = &vlc->table[table_index];
 
        for (i = 0; i < table_size; i++) {
-               table[i][1] = 0;        //bits
-               table[i][0] = -1;       //codes
+               table[i][1] = 0; /* bits */
+               table[i][0] = -1; /* codes */
        }
 
-       /* map codes and compute auxillary table sizes */
+       /* map codes and compute auxiliary table sizes */
        for (i = 0; i < nb_codes; i++) {
                GET_DATA(n, bits, i, 1);
-               GET_DATA(code, codes, i, codes_size);
                /* we accept tables with holes */
+               n -= n_prefix;
                if (n <= 0)
                        continue;
-               symbol = i;
+               GET_DATA(code, codes, i, codes_size);
                /* if code matches the prefix, it is in the table */
-               n -= n_prefix;
-               code_prefix2 = code >> n;
-               if (n <= 0 || code_prefix2 != code_prefix)
+               if ((code >> n) != code_prefix)
                        continue;
                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 (table[j][1] /* bits */ != 0) {
-                                       PARA_EMERG_LOG("incorrect code\n");
-                                       exit(EXIT_FAILURE);
-                               }
-                               table[j][1] = n;        //bits
-                               table[j][0] = symbol;
+                               assert(table[j][1] == 0); /* incorrect code */
+                               table[j][1] = n; /* bits */
+                               table[j][0] = i;
                                j++;
                        }
                } else {
                        n -= table_nb_bits;
                        j = (code >> n) & ((1 << table_nb_bits) - 1);
                        /* compute table size */
-                       n1 = -table[j][1];      //bits
+                       n1 = -table[j][1]; /* bits */
                        if (n > n1)
                                n1 = n;
-                       table[j][1] = -n1;      //bits
+                       table[j][1] = -n1; /* bits */
                }
        }
 
-       /* fill auxillary tables recursively */
+       /* fill auxiliary tables recursively */
        for (i = 0; i < table_size; i++) {
-               n = table[i][1];        //bits
+               n = table[i][1]; /* bits */
                if (n < 0) {
                        n = -n;
                        if (n > table_nb_bits) {
                                n = table_nb_bits;
-                               table[i][1] = -n;       //bits
+                               table[i][1] = -n; /* bits */
                        }
                        idx = build_table(vlc, n, nb_codes, bits, codes,
                                codes_size, (code_prefix << table_nb_bits) | i,
                                n_prefix + table_nb_bits);
                        /* vlc->table might have changed */
                        table = &vlc->table[table_index];
-                       table[i][0] = idx;      //code
+                       table[i][0] = idx; /* code */
                }
        }
        return table_index;
@@ -134,19 +126,15 @@ static int build_table(struct vlc *vlc, int table_nb_bits, int nb_codes,
  * Build VLC decoding tables suitable for use with get_vlc().
  *
  * \param vlc The structure to be initialized.
- *
- * \param nb_bits Set the decoding table size (2^nb_bits) entries. The bigger
- * it is, the faster is the decoding. But it should not be too big to save
- * memory and L1 cache. '9' is a good compromise.
- *
- * \param nb_codes Number of vlcs codes.
- *
+ * \param nb_bits Set the decoding table size (2^nb_bits) entries.
+ * \param nb_codes Number of vlc codes.
  * \param bits Table which gives the size (in bits) of each vlc code.
- *
  * \param codes Table which gives the bit pattern of of each vlc code.
- *
  * \param codes_size The number of bytes of each entry of the \a codes tables.
  *
+ * The bigger \a nb_bits is, the faster is the decoding. But it should not be
+ * too big to save memory and L1 cache. '9' is a good compromise.
+ *
  * The wrap and size parameters allow to use any memory configuration and
  * types (byte/word/long) to store the bits and codes tables.
  */
@@ -178,15 +166,14 @@ void free_vlc(struct vlc *vlc)
  * Parse a vlc code.
  *
  * \param gbc The getbit context structure.
- *
  * \param table The vlc tables to use.
- *
- * \param bits The number of bits which will be read at once, must be
- * identical to nb_bits in init_vlc().
- *
- * \param max_depth The number of times bits bits must be read to completely
+ * \param bits The number of bits which will be read at once.
+ * \param max_depth The number of times \a bits bits must be read to completely
  * read the longest vlc code = (max_vlc_length + bits - 1) / bits.
  *
+ * The \a bits parameter must be identical to the \a nb_bits value supplied to
+ * \ref init_vlc().
+ *
  * \return The vlc code.
  */
 int get_vlc(struct getbit_context *gbc, VLC_TYPE(*table)[2], int bits,
index a3393380e5e02801a4312c6f904c1ea25527aad9..5890d08c89d4033f7fefb9a19be525860a701d77 100644 (file)
@@ -69,11 +69,13 @@ static inline unsigned int get_bit(struct getbit_context *gbc)
 /**
  * Initialize a getbit_context structure.
  *
- * \param buffer The bitstream buffer. It must be 4 bytes larger then the
- * actual read bits because the bitstream reader might read 32 bits at once and
- * could read over the end.
+ * \param gbc The structure to initialize.
+ * \param buffer The bitstream buffer.
+ * \param size The size of the buffer in bytes.
  *
- * \param bit_size The size of the buffer in bytes.
+ * The bitstream buffer must be 4 bytes larger then the actual read bits
+ * because the bitstream reader might read 32 bits at once and could read over
+ * the end.
  */
 static inline void init_get_bits(struct getbit_context *gbc,
                const uint8_t *buffer, int size)
@@ -88,4 +90,3 @@ void init_vlc(struct vlc *vlc, int nb_bits, int nb_codes, const void *bits,
 void free_vlc(struct vlc *vlc);
 int get_vlc(struct getbit_context *gbc, VLC_TYPE(*table)[2], int bits,
                int max_depth);
-
diff --git a/wma.h b/wma.h
index f0ba7f631703b35878606facde8f2980de621bce..15b9c5d492560f2c6532935460cc7ca4f38ca571 100644 (file)
--- a/wma.h
+++ b/wma.h
@@ -20,8 +20,14 @@ struct asf_header_info {
        uint32_t bit_rate;
        /** Further decoding information (ignored). */
        uint32_t flags1;
-       /** Whether to use exp_vlc, bit reservoir, variable block len. */
+       /** Encodes exp_vlc, bit reservoir, vbl, number of block sizes. */
        uint16_t flags2;
+       /** Whether exponents are coded with VLC codes. */
+       bool use_exp_vlc;
+       /** If false, a frame is equal to a superframe. */
+       bool use_bit_reservoir;
+       /** Whether blocks are of variable or of constant size. */
+       bool use_variable_block_len;
 };
 
 /* wma_common.c */
index c429020c4e3455aa56929d5a36e60df315de7e28..65795fd8b8e4ac66cc1e3cf1cba8e18d68800636 100644 (file)
--- a/wma_afh.c
+++ b/wma_afh.c
@@ -257,6 +257,15 @@ static int wma_get_file_info(char *map, size_t numbytes, __a_unused int fd,
        afhi->frequency = ahi.sample_rate;
        afhi->channels = ahi.channels;
        afhi->header_len = ahi.header_len;
+
+       afhi->techinfo = make_message("%s%s%s%s%s",
+               ahi.use_exp_vlc? "exp vlc" : "",
+               (ahi.use_bit_reservoir && ahi.use_exp_vlc)? ", " : "",
+               ahi.use_bit_reservoir? "bit reservoir" : "",
+               (ahi.use_variable_block_len &&
+                       (ahi.use_exp_vlc || ahi.use_bit_reservoir)? ", " : ""),
+               ahi.use_variable_block_len? "vbl" : ""
+       );
        wma_make_chunk_table(map + ahi.header_len, numbytes - ahi.header_len,
                ahi.block_align, afhi);
        read_asf_tags(map, ahi.header_len, &afhi->tags);
index 97cdba0ae5a34953257de5657fc79f62f355500f..e53cdf5e400aca8f7552052a5586a4e4d5a04bfe 100644 (file)
@@ -115,6 +115,9 @@ int read_asf_header(const char *buf, int loaded, struct asf_header_info *ahi)
        ahi->flags2 = read_u16(start + 60);
        PARA_INFO_LOG("read_asf_header: flags1: %d, flag2: %d\n",
                ahi->flags1, ahi->flags2);
+       ahi->use_exp_vlc = ahi->flags2 & 0x0001;
+       ahi->use_bit_reservoir = ahi->flags2 & 0x0002;
+       ahi->use_variable_block_len = ahi->flags2 & 0x0004;
        return 1;
 }
 
index 0071337f38427cc98f341404a6819ee683352ecc..fdca2814d76a44db720752e2c99d10d9df7bbe5c 100644 (file)
@@ -62,17 +62,11 @@ struct private_wmadec_data {
        /** Information contained in the audio file header. */
        struct asf_header_info ahi;
        struct getbit_context gb;
-       /** Whether to use the bit reservoir. */
-       int use_bit_reservoir;
-       /** Whether to use variable block length. */
-       int use_variable_block_len;
-       /** Whether to use exponent coding. */
-       int use_exp_vlc;
        /** Whether perceptual noise is added. */
        int use_noise_coding;
        /** Depends on number of the bits per second and the frame length. */
        int byte_offset_bits;
-       /** Only used if use_exp_vlc is true. */
+       /** Only used if ahi->use_exp_vlc is true. */
        struct vlc exp_vlc;
        uint16_t exponent_bands[BLOCK_NB_SIZES][25];
        /** The index of the first coef in high band. */
@@ -96,7 +90,7 @@ struct private_wmadec_data {
        int frame_len;
        /** log2 of frame_len. */
        int frame_len_bits;
-       /** Number of block sizes. */
+       /** Number of block sizes, one if !ahi->use_variable_block_len. */
        int nb_block_sizes;
        /* block info */
        int reset_block_lengths;
@@ -180,7 +174,7 @@ static void wmadec_cleanup(struct private_wmadec_data *pwd)
 
        for (i = 0; i < pwd->nb_block_sizes; i++)
                imdct_end(pwd->mdct_ctx[i]);
-       if (pwd->use_exp_vlc)
+       if (pwd->ahi.use_exp_vlc)
                free_vlc(&pwd->exp_vlc);
        if (pwd->use_noise_coding)
                free_vlc(&pwd->hgain_vlc);
@@ -314,7 +308,7 @@ static int wma_init(struct private_wmadec_data *pwd)
        else
                pwd->frame_len_bits = 11;
        pwd->frame_len = 1 << pwd->frame_len_bits;
-       if (pwd->use_variable_block_len) {
+       if (pwd->ahi.use_variable_block_len) {
                int nb_max, nb;
                nb = ((flags2 >> 3) & 3) + 1;
                if ((ahi->bit_rate / ahi->channels) >= 32000)
@@ -395,7 +389,7 @@ static int wma_init(struct private_wmadec_data *pwd)
                pwd->frame_len, bps, bps1,
                high_freq, pwd->byte_offset_bits);
        PARA_INFO_LOG("use_noise_coding=%d use_exp_vlc=%d nb_block_sizes=%d\n",
-               pwd->use_noise_coding, pwd->use_exp_vlc, pwd->nb_block_sizes);
+               pwd->use_noise_coding, pwd->ahi.use_exp_vlc, pwd->nb_block_sizes);
 
        compute_scale_factor_band_sizes(pwd, high_freq);
        /* init MDCT windows : simple sinus window */
@@ -410,7 +404,7 @@ static int wma_init(struct private_wmadec_data *pwd)
 
        if (pwd->use_noise_coding) {
                /* init the noise generator */
-               if (pwd->use_exp_vlc)
+               if (pwd->ahi.use_exp_vlc)
                        pwd->noise_mult = 0.02;
                else
                        pwd->noise_mult = 0.04;
@@ -484,10 +478,6 @@ static int wma_decode_init(char *initial_buf, int len, struct private_wmadec_dat
                return ret;
        }
 
-       pwd->use_exp_vlc = pwd->ahi.flags2 & 0x0001;
-       pwd->use_bit_reservoir = pwd->ahi.flags2 & 0x0002;
-       pwd->use_variable_block_len = pwd->ahi.flags2 & 0x0004;
-
        ret = wma_init(pwd);
        if (ret < 0)
                return ret;
@@ -504,7 +494,7 @@ static int wma_decode_init(char *initial_buf, int len, struct private_wmadec_dat
                        wma_hgain_huffcodes, 2);
        }
 
-       if (pwd->use_exp_vlc) {
+       if (pwd->ahi.use_exp_vlc) {
                PARA_INFO_LOG("using exp_vlc\n");
                init_vlc(&pwd->exp_vlc, EXPVLCBITS, sizeof(wma_scale_huffbits),
                        wma_scale_huffbits, wma_scale_huffcodes, 4);
@@ -850,7 +840,7 @@ static int wma_decode_block(struct private_wmadec_data *pwd)
        int nb_coefs[MAX_CHANNELS];
 
        /* compute current block length */
-       if (pwd->use_variable_block_len) {
+       if (pwd->ahi.use_variable_block_len) {
                n = wma_log2(pwd->nb_block_sizes - 1) + 1;
 
                if (pwd->reset_block_lengths) {
@@ -927,7 +917,7 @@ static int wma_decode_block(struct private_wmadec_data *pwd)
        if ((pwd->block_len_bits == pwd->frame_len_bits) || get_bit(&pwd->gb)) {
                for (ch = 0; ch < pwd->ahi.channels; ch++) {
                        if (pwd->channel_coded[ch]) {
-                               if (pwd->use_exp_vlc) {
+                               if (pwd->ahi.use_exp_vlc) {
                                        ret = decode_exp_vlc(pwd, ch);
                                        if (ret < 0)
                                                return ret;
@@ -1096,7 +1086,7 @@ static int wma_decode_superframe(struct private_wmadec_data *pwd, void *data,
        buf_size = pwd->ahi.block_align;
        samples = data;
        init_get_bits(&pwd->gb, buf, buf_size);
-       if (pwd->use_bit_reservoir) {
+       if (pwd->ahi.use_bit_reservoir) {
                int i, nb_frames, bit_offset, pos, len;
                uint8_t *q;