ref: eb485bc761d67ea22733384ebb863ecdff4871f4
parent: 128614f9cd4f97645b9275404a331f1d1fc3db42
author: lieff <[email protected]>
date: Wed Jun 5 15:58:28 EDT 2019
L3_huffman: special case for linbits=0, ~10% speedup
--- a/minimp3.h
+++ b/minimp3.h
@@ -767,41 +767,72 @@
int sfb_cnt = gr_info->region_count[ireg++];
const int16_t *codebook = tabs + tabindex[tab_num];
int linbits = g_linbits[tab_num];
- do
+ if (linbits)
{
- np = *sfb++ / 2;
- pairs_to_decode = MINIMP3_MIN(big_val_cnt, np);
- one = *scf++;
do
{
- int j, w = 5;
- int leaf = codebook[PEEK_BITS(w)];
- while (leaf < 0)
+ np = *sfb++ / 2;
+ pairs_to_decode = MINIMP3_MIN(big_val_cnt, np);
+ one = *scf++;
+ do
{
- FLUSH_BITS(w);
- w = leaf & 7;
- leaf = codebook[PEEK_BITS(w) - (leaf >> 3)];
- }
- FLUSH_BITS(leaf >> 8);
+ int j, w = 5;
+ int leaf = codebook[PEEK_BITS(w)];
+ while (leaf < 0)
+ {
+ FLUSH_BITS(w);
+ w = leaf & 7;
+ leaf = codebook[PEEK_BITS(w) - (leaf >> 3)];
+ }
+ FLUSH_BITS(leaf >> 8);
- for (j = 0; j < 2; j++, dst++, leaf >>= 4)
+ for (j = 0; j < 2; j++, dst++, leaf >>= 4)
+ {
+ int lsb = leaf & 0x0F;
+ if (lsb == 15)
+ {
+ lsb += PEEK_BITS(linbits);
+ FLUSH_BITS(linbits);
+ CHECK_BITS;
+ *dst = one*L3_pow_43(lsb)*((int32_t)bs_cache < 0 ? -1: 1);
+ } else
+ {
+ *dst = g_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;
+ }
+ FLUSH_BITS(lsb ? 1 : 0);
+ }
+ CHECK_BITS;
+ } while (--pairs_to_decode);
+ } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
+ } else
+ {
+ do
+ {
+ np = *sfb++ / 2;
+ pairs_to_decode = MINIMP3_MIN(big_val_cnt, np);
+ one = *scf++;
+ do
{
- int lsb = leaf & 0x0F;
- if (lsb == 15 && linbits)
+ int j, w = 5;
+ int leaf = codebook[PEEK_BITS(w)];
+ while (leaf < 0)
{
- lsb += PEEK_BITS(linbits);
- FLUSH_BITS(linbits);
- CHECK_BITS;
- *dst = one*L3_pow_43(lsb)*((int32_t)bs_cache < 0 ? -1: 1);
- } else
+ FLUSH_BITS(w);
+ w = leaf & 7;
+ leaf = codebook[PEEK_BITS(w) - (leaf >> 3)];
+ }
+ FLUSH_BITS(leaf >> 8);
+
+ for (j = 0; j < 2; j++, dst++, leaf >>= 4)
{
+ int lsb = leaf & 0x0F;
*dst = g_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;
+ FLUSH_BITS(lsb ? 1 : 0);
}
- FLUSH_BITS(lsb ? 1 : 0);
- }
- CHECK_BITS;
- } while (--pairs_to_decode);
- } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
+ CHECK_BITS;
+ } while (--pairs_to_decode);
+ } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
+ }
}
for (np = 1 - big_val_cnt;; dst += 4)