diff options
Diffstat (limited to '')
-rw-r--r-- | src/liblzma/rangecoder/Makefile.am | 8 | ||||
-rw-r--r-- | src/liblzma/rangecoder/price.h | 16 | ||||
-rw-r--r-- | src/liblzma/rangecoder/price_table.c | 2 | ||||
-rw-r--r-- | src/liblzma/rangecoder/price_table_init.c | 55 | ||||
-rw-r--r-- | src/liblzma/rangecoder/price_tablegen.c | 51 |
5 files changed, 49 insertions, 83 deletions
diff --git a/src/liblzma/rangecoder/Makefile.am b/src/liblzma/rangecoder/Makefile.am index b2e62d4a..a202e34e 100644 --- a/src/liblzma/rangecoder/Makefile.am +++ b/src/liblzma/rangecoder/Makefile.am @@ -24,12 +24,8 @@ librangecoder_la_CPPFLAGS = \ if COND_ENCODER_LZMA1 librangecoder_la_SOURCES += \ range_encoder.h \ - price.h -if COND_SMALL -librangecoder_la_SOURCES += price_table_init.c -else -librangecoder_la_SOURCES += price_table.c -endif + price.h \ + price_table.c endif if COND_DECODER_LZMA1 diff --git a/src/liblzma/rangecoder/price.h b/src/liblzma/rangecoder/price.h index 001f753d..e336885c 100644 --- a/src/liblzma/rangecoder/price.h +++ b/src/liblzma/rangecoder/price.h @@ -28,20 +28,8 @@ #define RC_INFINITY_PRICE (UINT32_C(1) << 30) -#if !defined(LZMA_RANGE_ENCODER_H) || defined(HAVE_SMALL) -/// Probability prices used by *_get_price() macros. This is initialized -/// by lzma_rc_init() and is not modified later. -extern uint32_t lzma_rc_prices[RC_PRICE_TABLE_SIZE]; - -/// Initializes lzma_rc_prices[]. This needs to be called only once. -extern void lzma_rc_init(void); - -#else -// Not building a size optimized version, so we use a precomputed -// constant table. -extern const uint32_t lzma_rc_prices[RC_PRICE_TABLE_SIZE]; - -#endif +/// Lookup table for the inline functions defined in this file. +extern const uint8_t lzma_rc_prices[RC_PRICE_TABLE_SIZE]; static inline uint32_t diff --git a/src/liblzma/rangecoder/price_table.c b/src/liblzma/rangecoder/price_table.c index 539206b1..ac64bf62 100644 --- a/src/liblzma/rangecoder/price_table.c +++ b/src/liblzma/rangecoder/price_table.c @@ -2,7 +2,7 @@ #include "range_encoder.h" -const uint32_t lzma_rc_prices[RC_PRICE_TABLE_SIZE] = { +const uint8_t lzma_rc_prices[RC_PRICE_TABLE_SIZE] = { 128, 103, 91, 84, 78, 73, 69, 66, 63, 61, 58, 56, 54, 52, 51, 49, 48, 46, 45, 44, 43, 42, 41, 40, diff --git a/src/liblzma/rangecoder/price_table_init.c b/src/liblzma/rangecoder/price_table_init.c deleted file mode 100644 index 9c7d799b..00000000 --- a/src/liblzma/rangecoder/price_table_init.c +++ /dev/null @@ -1,55 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file price_table_init.c -/// \brief Static initializations for the range encoder's prices array -// -// Copyright (C) 1999-2006 Igor Pavlov -// Copyright (C) 2007 Lasse Collin -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifdef HAVE_CONFIG_H -# include "range_encoder.h" -#endif - - -uint32_t lzma_rc_prices[RC_PRICE_TABLE_SIZE]; - - -extern void -lzma_rc_init(void) -{ - for (uint32_t i = (UINT32_C(1) << RC_MOVE_REDUCING_BITS) / 2; - i < RC_BIT_MODEL_TOTAL; - i += (UINT32_C(1) << RC_MOVE_REDUCING_BITS)) { - const uint32_t cycles_bits = RC_BIT_PRICE_SHIFT_BITS; - uint32_t w = i; - uint32_t bit_count = 0; - - for (uint32_t j = 0; j < cycles_bits; ++j) { - w *= w; - bit_count <<= 1; - - while (w >= (UINT32_C(1) << 16)) { - w >>= 1; - ++bit_count; - } - } - - lzma_rc_prices[i >> RC_MOVE_REDUCING_BITS] - = (RC_BIT_MODEL_TOTAL_BITS << cycles_bits) - - 15 - bit_count; - } - - return; -} diff --git a/src/liblzma/rangecoder/price_tablegen.c b/src/liblzma/rangecoder/price_tablegen.c index 68513635..4895ac76 100644 --- a/src/liblzma/rangecoder/price_tablegen.c +++ b/src/liblzma/rangecoder/price_tablegen.c @@ -19,23 +19,51 @@ // /////////////////////////////////////////////////////////////////////////////// -#include <stddef.h> #include <inttypes.h> #include <stdio.h> #include "range_common.h" #include "price.h" -#include "price_table_init.c" -int -main(void) +static uint32_t rc_prices[RC_PRICE_TABLE_SIZE]; + + +static void +init_price_table(void) { - lzma_rc_init(); + for (uint32_t i = (UINT32_C(1) << RC_MOVE_REDUCING_BITS) / 2; + i < RC_BIT_MODEL_TOTAL; + i += (UINT32_C(1) << RC_MOVE_REDUCING_BITS)) { + const uint32_t cycles_bits = RC_BIT_PRICE_SHIFT_BITS; + uint32_t w = i; + uint32_t bit_count = 0; + + for (uint32_t j = 0; j < cycles_bits; ++j) { + w *= w; + bit_count <<= 1; + + while (w >= (UINT32_C(1) << 16)) { + w >>= 1; + ++bit_count; + } + } + + rc_prices[i >> RC_MOVE_REDUCING_BITS] + = (RC_BIT_MODEL_TOTAL_BITS << cycles_bits) + - 15 - bit_count; + } + + return; +} + +static void +print_price_table(void) +{ printf("/* This file has been automatically generated by " "price_tablegen.c. */\n\n" "#include \"range_encoder.h\"\n\n" - "const uint32_t lzma_rc_prices[" + "const uint8_t lzma_rc_prices[" "RC_PRICE_TABLE_SIZE] = {"); const size_t array_size = sizeof(lzma_rc_prices) @@ -44,7 +72,7 @@ main(void) if (i % 8 == 0) printf("\n\t"); - printf("%4" PRIu32, lzma_rc_prices[i]); + printf("%4" PRIu32, rc_prices[i]); if (i != array_size - 1) printf(","); @@ -52,5 +80,14 @@ main(void) printf("\n};\n"); + return; +} + + +int +main(void) +{ + init_price_table(); + print_price_table(); return 0; } |