📄 zinflate_8cpp-source.html
字号:
<a name="l00101"></a>00101 <span class="keywordflow">for</span> (i=2; i<=m_maxCodeBits; i++)<a name="l00102"></a>00102 {<a name="l00103"></a>00103 <span class="comment">// compute this while checking for overflow: code = (code + blCount[i-1]) << 1</span><a name="l00104"></a>00104 <span class="keywordflow">if</span> (code > code + blCount[i-1])<a name="l00105"></a>00105 <span class="keywordflow">throw</span> <a class="code" href="class_huffman_decoder_1_1_err.html">Err</a>(<span class="stringliteral">"codes oversubscribed"</span>);<a name="l00106"></a>00106 code += blCount[i-1];<a name="l00107"></a>00107 <span class="keywordflow">if</span> (code > (code << 1))<a name="l00108"></a>00108 <span class="keywordflow">throw</span> <a class="code" href="class_huffman_decoder_1_1_err.html">Err</a>(<span class="stringliteral">"codes oversubscribed"</span>);<a name="l00109"></a>00109 code <<= 1;<a name="l00110"></a>00110 nextCode[i] = code;<a name="l00111"></a>00111 }<a name="l00112"></a>00112 <a name="l00113"></a>00113 <span class="keywordflow">if</span> (code > (1 << m_maxCodeBits) - blCount[m_maxCodeBits])<a name="l00114"></a>00114 <span class="keywordflow">throw</span> <a class="code" href="class_huffman_decoder_1_1_err.html">Err</a>(<span class="stringliteral">"codes oversubscribed"</span>);<a name="l00115"></a>00115 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_maxCodeBits != 1 && code < (1 << m_maxCodeBits) - blCount[m_maxCodeBits])<a name="l00116"></a>00116 <span class="keywordflow">throw</span> <a class="code" href="class_huffman_decoder_1_1_err.html">Err</a>(<span class="stringliteral">"codes incomplete"</span>);<a name="l00117"></a>00117 <a name="l00118"></a>00118 <span class="comment">// compute a vector of <code, length, value> triples sorted by code</span><a name="l00119"></a>00119 m_codeToValue.resize(nCodes - blCount[0]);<a name="l00120"></a>00120 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j=0;<a name="l00121"></a>00121 <span class="keywordflow">for</span> (i=0; i<nCodes; i++) <a name="l00122"></a>00122 {<a name="l00123"></a>00123 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = codeBits[i];<a name="l00124"></a>00124 <span class="keywordflow">if</span> (len != 0)<a name="l00125"></a>00125 {<a name="l00126"></a>00126 code = NormalizeCode(nextCode[len]++, len);<a name="l00127"></a>00127 m_codeToValue[j].code = code;<a name="l00128"></a>00128 m_codeToValue[j].len = len;<a name="l00129"></a>00129 m_codeToValue[j].value = i;<a name="l00130"></a>00130 j++;<a name="l00131"></a>00131 }<a name="l00132"></a>00132 }<a name="l00133"></a>00133 std::sort(m_codeToValue.begin(), m_codeToValue.end());<a name="l00134"></a>00134 <a name="l00135"></a>00135 <span class="comment">// initialize the decoding cache</span><a name="l00136"></a>00136 m_cacheBits = STDMIN(9U, m_maxCodeBits);<a name="l00137"></a>00137 m_cacheMask = (1 << m_cacheBits) - 1;<a name="l00138"></a>00138 m_normalizedCacheMask = NormalizeCode(m_cacheMask, m_cacheBits);<a name="l00139"></a>00139 assert(m_normalizedCacheMask == BitReverse(m_cacheMask));<a name="l00140"></a>00140 <a name="l00141"></a>00141 <span class="keywordflow">if</span> (m_cache.size() != size_t(1) << m_cacheBits)<a name="l00142"></a>00142 m_cache.resize(1 << m_cacheBits);<a name="l00143"></a>00143 <a name="l00144"></a>00144 <span class="keywordflow">for</span> (i=0; i<m_cache.size(); i++)<a name="l00145"></a>00145 m_cache[i].type = 0;<a name="l00146"></a>00146 }<a name="l00147"></a>00147 <a name="l00148"></a>00148 <span class="keywordtype">void</span> HuffmanDecoder::FillCacheEntry(LookupEntry &entry, <a class="code" href="class_huffman_decoder.html#550cd665357c320af58916f992eb8756">code_t</a> normalizedCode)<span class="keyword"> const</span><a name="l00149"></a>00149 <span class="keyword"></span>{<a name="l00150"></a>00150 normalizedCode &= m_normalizedCacheMask;<a name="l00151"></a>00151 <span class="keyword">const</span> CodeInfo &codeInfo = *(std::upper_bound(m_codeToValue.begin(), m_codeToValue.end(), normalizedCode, <a class="code" href="class_huffman_decoder.html#c3bc64943c6ab90653d34b0eb5fc3985">CodeLessThan</a>())-1);<a name="l00152"></a>00152 <span class="keywordflow">if</span> (codeInfo.len <= m_cacheBits)<a name="l00153"></a>00153 {<a name="l00154"></a>00154 entry.type = 1;<a name="l00155"></a>00155 entry.value = codeInfo.value;<a name="l00156"></a>00156 entry.len = codeInfo.len;<a name="l00157"></a>00157 }<a name="l00158"></a>00158 <span class="keywordflow">else</span><a name="l00159"></a>00159 {<a name="l00160"></a>00160 entry.begin = &codeInfo;<a name="l00161"></a>00161 <span class="keyword">const</span> CodeInfo *last = & *(std::upper_bound(m_codeToValue.begin(), m_codeToValue.end(), normalizedCode + ~m_normalizedCacheMask, <a class="code" href="class_huffman_decoder.html#c3bc64943c6ab90653d34b0eb5fc3985">CodeLessThan</a>())-1);<a name="l00162"></a>00162 <span class="keywordflow">if</span> (codeInfo.len == last->len)<a name="l00163"></a>00163 {<a name="l00164"></a>00164 entry.type = 2;<a name="l00165"></a>00165 entry.len = codeInfo.len;<a name="l00166"></a>00166 }<a name="l00167"></a>00167 <span class="keywordflow">else</span><a name="l00168"></a>00168 {<a name="l00169"></a>00169 entry.type = 3;<a name="l00170"></a>00170 entry.end = last+1;<a name="l00171"></a>00171 }<a name="l00172"></a>00172 }<a name="l00173"></a>00173 }<a name="l00174"></a>00174 <a name="l00175"></a><a class="code" href="class_huffman_decoder.html#32c424a894a24ea4d0aae95c3d30e806">00175</a> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_huffman_decoder.html#32c424a894a24ea4d0aae95c3d30e806">HuffmanDecoder::Decode</a>(<a class="code" href="class_huffman_decoder.html#550cd665357c320af58916f992eb8756">code_t</a> code, <span class="comment">/* out */</span> <a class="code" href="class_huffman_decoder.html#ae2c1dc3110a39ae9d74fc00aee8a1ec">value_t</a> &value)<span class="keyword"> const</span><a name="l00176"></a>00176 <span class="keyword"></span>{<a name="l00177"></a>00177 assert(m_codeToValue.size() > 0);<a name="l00178"></a>00178 LookupEntry &entry = m_cache[code & m_cacheMask];<a name="l00179"></a>00179 <a name="l00180"></a>00180 <a class="code" href="class_huffman_decoder.html#550cd665357c320af58916f992eb8756">code_t</a> normalizedCode;<a name="l00181"></a>00181 <span class="keywordflow">if</span> (entry.type != 1)<a name="l00182"></a>00182 normalizedCode = BitReverse(code);<a name="l00183"></a>00183 <a name="l00184"></a>00184 <span class="keywordflow">if</span> (entry.type == 0)<a name="l00185"></a>00185 FillCacheEntry(entry, normalizedCode);<a name="l00186"></a>00186 <a name="l00187"></a>00187 <span class="keywordflow">if</span> (entry.type == 1)<a name="l00188"></a>00188 {<a name="l00189"></a>00189 value = entry.value;<a name="l00190"></a>00190 <span class="keywordflow">return</span> entry.len;<a name="l00191"></a>00191 }<a name="l00192"></a>00192 <span class="keywordflow">else</span><a name="l00193"></a>00193 {<a name="l00194"></a>00194 <span class="keyword">const</span> CodeInfo &codeInfo = (entry.type == 2)<a name="l00195"></a>00195 ? entry.begin[(normalizedCode << m_cacheBits) >> (<a class="code" href="class_huffman_decoder.html#444758e6ef809d2bf568e4e73cd560d7589d91f9fef801b8b978b95c9eef161b">MAX_CODE_BITS</a> - (entry.len - m_cacheBits))]<a name="l00196"></a>00196 : *(std::upper_bound(entry.begin, entry.end, normalizedCode, <a class="code" href="struct_code_less_than.html">CodeLessThan</a>())-1);<a name="l00197"></a>00197 value = codeInfo.value;<a name="l00198"></a>00198 <span class="keywordflow">return</span> codeInfo.len;<a name="l00199"></a>00199 }<a name="l00200"></a>00200 }<a name="l00201"></a>00201 <a name="l00202"></a><a class="code" href="class_huffman_decoder.html#0ba809a0515ad70df30c6965fa6919a7">00202</a> <span class="keywordtype">bool</span> <a class="code" href="class_huffman_decoder.html#32c424a894a24ea4d0aae95c3d30e806">HuffmanDecoder::Decode</a>(<a class="code" href="class_low_first_bit_reader.html" title="_">LowFirstBitReader</a> &reader, <a class="code" href="class_huffman_decoder.html#ae2c1dc3110a39ae9d74fc00aee8a1ec">value_t</a> &value)<span class="keyword"> const</span><a name="l00203"></a>00203 <span class="keyword"></span>{<a name="l00204"></a>00204 reader.<a class="code" href="class_low_first_bit_reader.html#7c2250f093883488eefb6d498aa1c510">FillBuffer</a>(m_maxCodeBits);<a name="l00205"></a>00205 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> codeBits = <a class="code" href="class_huffman_decoder.html#32c424a894a24ea4d0aae95c3d30e806">Decode</a>(reader.<a class="code" href="class_low_first_bit_reader.html#e1da4869948bbe34ef63089b0e531bf3">PeekBuffer</a>(), value);<a name="l00206"></a>00206 <span class="keywordflow">if</span> (codeBits > reader.<a class="code" href="class_low_first_bit_reader.html#62533059d5572cf7dfc5bcb7d308bec6">BitsBuffered</a>())<a name="l00207"></a>00207 <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00208"></a>00208 reader.<a class="code" href="class_low_first_bit_reader.html#7127a720aeefbc1d91dddefc694538c6">SkipBits</a>(codeBits);<a name="l00209"></a>00209 <span class="keywordflow">return</span> <span class="keyword">true</span>;<a name="l00210"></a>00210 }<a name="l00211"></a>00211 <a name="l00212"></a>00212 <span class="comment">// *************************************************************</span><a name="l00213"></a>00213 <a name="l00214"></a><a class="code" href="class_inflator.html#525a109323ed6dfb57be3a06e44fb93e">00214</a> <a class="code" href="class_inflator.html#525a109323ed6dfb57be3a06e44fb93e">Inflator::Inflator</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> *attachment, <span class="keywordtype">bool</span> repeat, <span class="keywordtype">int</span> propagation)<a name="l00215"></a>00215 : <a class="code" href="class_auto_signaling.html" title="_">AutoSignaling</a><<a class="code" href="class_filter.html" title="provides an implementation of BufferedTransformation's attachment interface">Filter</a>>(propagation)<a name="l00216"></a>00216 , m_state(PRE_STREAM), m_repeat(repeat), m_reader(m_inQueue)<a name="l00217"></a>00217 {<a name="l00218"></a>00218 <a class="code" href="class_filter.html#93817876b45172108fe0342de6442f75" title="delete the current attachment chain and replace it with newAttachment">Detach</a>(attachment);<a name="l00219"></a>00219 }<a name="l00220"></a>00220 <a name="l00221"></a><a class="code" href="class_inflator.html#498b0cb5eaf4f73715f2608c7f3c31ab">00221</a> <span class="keywordtype">void</span> <a class="code" href="class_inflator.html#498b0cb5eaf4f73715f2608c7f3c31ab">Inflator::IsolatedInitialize</a>(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &parameters)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -