| /////////////////////////////////////////////////////////////////////////////// | |
| // | |
| /// \file price_tablegen.c | |
| /// \brief Probability price table generator | |
| /// | |
| /// Compiling: gcc -std=c99 -o price_tablegen price_tablegen.c | |
| /// | |
| // Authors: Igor Pavlov | |
| // Lasse Collin | |
| // | |
| // This file has been put into the public domain. | |
| // You can do whatever you want with this file. | |
| // | |
| /////////////////////////////////////////////////////////////////////////////// | |
| #include <inttypes.h> | |
| #include <stdio.h> | |
| #include "range_common.h" | |
| #include "price.h" | |
| static uint32_t rc_prices[RC_PRICE_TABLE_SIZE]; | |
| static void | |
| init_price_table(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; | |
| } | |
| } | |
| 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 uint8_t lzma_rc_prices[" | |
| "RC_PRICE_TABLE_SIZE] = {"); | |
| const size_t array_size = sizeof(lzma_rc_prices) | |
| / sizeof(lzma_rc_prices[0]); | |
| for (size_t i = 0; i < array_size; ++i) { | |
| if (i % 8 == 0) | |
| printf("\n\t"); | |
| printf("%4" PRIu32, rc_prices[i]); | |
| if (i != array_size - 1) | |
| printf(","); | |
| } | |
| printf("\n};\n"); | |
| return; | |
| } | |
| int | |
| main(void) | |
| { | |
| init_price_table(); | |
| print_price_table(); | |
| return 0; | |
| } |