From: Steinar H. Gunderson Date: Fri, 6 Oct 2017 18:08:46 +0000 (+0200) Subject: Add support for repeating blocks. About 2% size reduction. X-Git-Url: https://git.sesse.net/?p=narabu;a=commitdiff_plain;h=056ba403e3ee3b9a362ac85196d4bcce6a73d98c Add support for repeating blocks. About 2% size reduction. --- diff --git a/coded.dat b/coded.dat index b249f4c..a811389 100644 Binary files a/coded.dat and b/coded.dat differ diff --git a/narabu.cpp b/narabu.cpp index bb1209c..0ac4f71 100644 --- a/narabu.cpp +++ b/narabu.cpp @@ -223,6 +223,7 @@ int main(int argc, char **argv) printf("%d err=0x%x\n", __LINE__, glGetError()); // Decode all luma blocks. + size_t last_src_offset = 0, last_src_len = 0; for (unsigned y = 0; y < 8; ++y) { for (unsigned x = 0; x < 8; ++x) { unsigned coeff_num = y * 8 + x; @@ -235,8 +236,16 @@ int main(int argc, char **argv) } CoeffStream *stream = &streams[coeff_num * num_blocks + block_idx / BLOCKS_PER_STREAM]; - stream->src_offset = ptr - coded.data(); - stream->src_len = *num_rans_bytes; + if (*num_rans_bytes == 0) { + // Repeat last stream. + stream->src_offset = last_src_offset; + stream->src_len = last_src_len; + } else { + stream->src_offset = ptr - coded.data(); + stream->src_len = *num_rans_bytes; + last_src_offset = stream->src_offset; + last_src_len = last_src_len; + } // TODO: check len ptr += *num_rans_bytes; diff --git a/qdc.cpp b/qdc.cpp index 41ef04d..0339e12 100644 --- a/qdc.cpp +++ b/qdc.cpp @@ -235,22 +235,14 @@ public: //printf("post-flush = %08x\n", rans); uint32_t num_rans_bytes = out_end - ptr; -#if 0 - if (num_rans_bytes == 4) { - uint32_t block; - memcpy(&block, ptr, 4); - - if (block == last_block) { - write_varint(0, codedfp); - clear(); - return 1; - } - - last_block = block; + if (num_rans_bytes == last_block.size() && + memcmp(last_block.data(), ptr, last_block.size()) == 0) { + write_varint(0, codedfp); + clear(); + return 1; } else { - last_block = 0; + last_block = string((const char *)ptr, num_rans_bytes); } -#endif write_varint(num_rans_bytes, codedfp); //fwrite(&num_rans_bytes, 1, 4, codedfp); @@ -294,7 +286,7 @@ private: RansEncSymbol esyms[NUM_SYMS]; uint32_t sign_bias; - uint32_t last_block = 0; // Not a valid 4-byte rANS block (?) + std::string last_block; }; static constexpr int dc_scalefac = 8; // Matches the FDCT's gain.