X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=qdd.cpp;h=522957d3f8de83afd17a291d8fb4f4eb460af866;hb=34138d5b1a1302a7a1050fd46d2fb95c0186140a;hp=a4fa907a297549f03d0860bb016d41fb7bf83420;hpb=8989d0f3ce3d2c5074aeb5be4297fda30d3efc67;p=narabu diff --git a/qdd.cpp b/qdd.cpp index a4fa907..522957d 100644 --- a/qdd.cpp +++ b/qdd.cpp @@ -29,7 +29,8 @@ struct RansDecodeTable { int cum2sym[prob_scale]; RansDecSymbol dsyms[NUM_SYMS]; }; -RansDecodeTable decode_tables[16]; +#define NUM_TABLES 8 +RansDecodeTable decode_tables[NUM_TABLES]; static const unsigned char std_luminance_quant_tbl[64] = { #if 0 @@ -55,10 +56,34 @@ static const unsigned char std_luminance_quant_tbl[64] = { }; -int pick_stats_for(int y, int x) +const int luma_mapping[64] = { + 0, 0, 1, 1, 2, 2, 3, 3, + 0, 0, 1, 2, 2, 2, 3, 3, + 1, 1, 2, 2, 2, 3, 3, 3, + 1, 1, 2, 2, 2, 3, 3, 3, + 1, 2, 2, 2, 2, 3, 3, 3, + 2, 2, 2, 2, 3, 3, 3, 3, + 2, 2, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, +}; +const int chroma_mapping[64] = { + 0, 1, 1, 2, 2, 2, 3, 3, + 1, 1, 2, 2, 2, 3, 3, 3, + 2, 2, 2, 2, 3, 3, 3, 3, + 2, 2, 2, 3, 3, 3, 3, 3, + 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, +}; + +int pick_stats_for(int x, int y, bool is_chroma) { - if (x + y >= 7) return 7; - return x + y; + if (is_chroma) { + return chroma_mapping[y * 8 + x] + 4; + } else { + return luma_mapping[y * 8 + x]; + } } uint32_t read_varint(FILE *fp) @@ -103,8 +128,8 @@ int main(void) exit(1); } - uint32_t sign_bias[16]; - for (unsigned table = 0; table < 16; ++table) { + uint32_t sign_bias[NUM_TABLES]; + for (unsigned table = 0; table < NUM_TABLES; ++table) { uint32_t cum_freq = 0; for (unsigned sym = 0; sym < NUM_SYMS; ++sym) { uint32_t freq = read_varint(fp); @@ -123,7 +148,7 @@ int main(void) // loop over all coefficients for (unsigned y = 0; y < 8; ++y) { for (unsigned x = 0; x < 8; ++x) { - unsigned tbl = pick_stats_for(x, y); + unsigned tbl = pick_stats_for(x, y, false); RansState rans = 0;