From 056ba403e3ee3b9a362ac85196d4bcce6a73d98c Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Fri, 6 Oct 2017 20:08:46 +0200 Subject: [PATCH] Add support for repeating blocks. About 2% size reduction. --- coded.dat | Bin 261335 -> 255339 bytes narabu.cpp | 13 +++++++++++-- qdc.cpp | 22 +++++++--------------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/coded.dat b/coded.dat index b249f4cc37271b75b0e67e977769665a3160db63..a81138917ee68b42279ee1b4130f012bcade8d81 100644 GIT binary patch delta 2041 zcmZuyeN0wW7{B*Ccn%2)D!d57#Xw!ehoBfS0>p+NWzGi57-cUh0wpHSY_LI-jcH}_ z<-JD=d0$}yOH7C5HCt;MYS0>3kw}`(<*P}4KvI$EI`_TjTx9zGbI<#n-}C$Zp65R2 z+;gKogWW!d5428@jNg$ft-H6IOa0(nd8r3qN5#v_?dH1m&~90TU3+AG1&91}P2LN9 z-8LvkB*~I~VGaU;wMC+2zE9teL5WC`^z$(&eU7n+UxnWGFcx2Dqq72a=2i3@BbmGg z?LsCo{n3tM4On0pie7Mi%9&S62%*_zDhJp#A0`# zIABHV6+4iRKVxgyi-r+)H$tMlPV@|mP1%Q%MM7n>Nz&7dzLUA5v-?d)0WD~<%X(NUxWZtS#GsGX|@a zJg*5&>cLWtfhT4_f-KP`8L(Q=pU8kU-mEGbX@|pZ#+!Di5R9}w7ovhB&yx)Nt@4Q`5@=2VY_-Vm6+q-l z?j0{HQk60b=#JtI2UO*I4S%^`RU8`bo~kL`C4!3QNjQapR*fa<_X{D+Y!gj*6D}Dh zdMi{V(1OsU4e*&|BCrV3m|uGlL`9gKczKtqcndgbSm+>Hc>OqCdanp(S`_IUA*^nj z91)D+SgmsL5sPkG+W8jriNW}46VzGhrNyv0?h%&~UdhM`m*NX)M)kyhr<3%Cj&alU z&5)#sE=VNjbtlQJYaVa&)@BG|&eHTdnaJGQU zJzV;^PDmAy_%q-uTb?(53m=MNLc1W(I2YAjAV0yzxBUm$hgeGs`iyDQkM}{Abs`q@ z!vm3*bsj#l2xkmHs__~IV15WM3foUmrC}M_^H(FuY!>f>_76btR0hFGw^Zdom?&5e z{RLXV@bTZT(1px%5_bju=CiQyH@M8tTgp{9DojjwK`7Hrb^&V-EpowZ(NoWt_PS&} z(dLEA*o1}nb0OOAf?3(@jAeH?$)eYyguXD{^oFYJ)3Af(c<h&0t}JI?9&%+kJXiY2X=_Me!m0T1Gov#^c607!Ic+< zK0P!9HuJK%I0S(L#)O`)Qk8PiRhl{s!8JpEe(oB5PUA~kH6@zw)(lOXggqGi@NLr; zJ0;=4xa}KN8M<#q$hv+9nfLi|ZkuM`bzh#^U5E(f&T#EDRq4=3*bN7%)`dTInfi`E z5F4l15s0vHtb|8wnsRihplcX`a0WRw0+G=ILTqOmNoxHVk&&U$mn(BJ zrug$eps?ZBMj^sm&>2r!JPPb9N2^BRsl^X(NW^!olc*_TuGtlzMVLlKr| Qk&jDbl delta 7954 zcmds5dr(wW7@vDSJcpM+7N`if5ya%7g=oN#k8l{>bTISTU}!uv%%(K6(bAg?jya_m zboYQMyI_SQJ{U=F>R_fpfoWJeLS{U~)x^=VvBt@mR+p7?W$*62mvx-!ALiqG{=VP& z&SP&!z5m%;{*@Kw@!m@UKY+jj4oRq4!w6xvAZ3W%Y&t2gnlYE#(l9ojv(BI3uk!Xx=H1u!`N(^GaFrsuT2Bi#D zGLD~)-ttf~O0&@^{g^hSp=V?S)u*A2NH5{^rF8U^643l~G;4sYmSs6ID)zPd9ptTh zrRW9$#VP?gBB0OpxA`cY(HQ*=2_|K#_LyI3u!(R>-vWMzgLS4g8L(VS z7s;6rEwHJb%h>Rm$ggrx*hSdl3Xwly#D_i;d6N;>_cQYKEAEBNaXGU0T<`P5W372- zD#DSfGa*cQpy`DyXqNNZkSp>79ps}wWy2R*c-^=Fp0zJu!vcs=#W9{zC-T0s@?^_+ z6ETJtD>0y?_lmrh#2-ADJ#muf?mZT6C>^~J0<<(RWg&#A0TlUP5ZdU{6br+`8Sqr7ehS*#O@it{+9n41Rl8^o#I@Nh5o`B6-8vOYL zjI-ZT!6zXu#rZO^Ry_Y}%5O1{qQ6SWjBT<3rHf8Ni0tsO1>&S@B3}{4X0gdq(Mc$0 zMo4=0N2u#!?9POBueRiO2L5((qkEl&78kQdubqYc>ge3j2#?$8sc(cRyL__|BDByv zxCw&nu?bBuM0TE%7x$V;^1PUyw5ZqMvPB|aYQ!e%!Rh-U8%Gj+&1B7j99GvSin-Tt zoadcTnVm7yil(lKWftLLlj_+`{sn$eM|S`7uw9*J&3V`~UI{R(?|M&phCe!SMS5{o z_lwi|jHF9{g*4ehu#rkKS!Shk?@HNLxB24G8Y}mWo^R~5a2H1u7Aa+r>1Q%b%M2>? z#2}TBh9!=ED+M=0sOHwR)@S{@nrBs$*nfH>)68bIBb3kr@2eZ3+7?)+fg#V7R0}t{ zZL*AP&+krKxS+ZNLvizRBR^bm3)z|{pB^)jQD237Uuj!U))WUGnM^me0x{^L22aQr z`PH(LbayL+Xy{2_VWp_M6X0JfsNzB?N$>Rn_OKFDdA;|U^ksP9{NwG%ME;L|ZRki= zqlt{%cd#2PvL0;H+Pc4#tZ#$JY29WAZ%f$>;etydzt>2@u9(OsNjB|l5_+l)g6$XD zRcna}tW}MSZw49p{jxKHMqhw%d(x>FG<}w^l_WvmmXLA9im=rHv-#kls*iZ#sEix+ z(Qfj5*suNvKFcn6dRV{y?XU#bpHl6vu06YUmQsMvndz>|EsCj+{{bXb3UmMf 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. -- 2.39.2