33 #include <libopenraw++/rawdata.h>
35 #include "crwdecompressor.h"
37 #include "rawcontainer.h"
38 #include "io/stream.h"
39 #include "exception.h"
41 namespace OpenRaw {
namespace Internals {
43 CrwDecompressor::CrwDecompressor(IO::Stream * stream,
44 RawContainer * container)
45 : Decompressor(stream, container),
47 m_height(0), m_width(0),
49 m_bitbuf(0), m_vbits(0)
54 CrwDecompressor::~CrwDecompressor()
105 void CrwDecompressor::make_decoder(decode_t *dest,
const uint8_t *source,
118 for (i=next=0; i <= m_leaf && next < 16; ) {
124 dest->branch[0] = m_free;
125 make_decoder(m_free,source,level+1);
126 dest->branch[1] = m_free;
127 make_decoder(m_free,source,level+1);
130 dest->leaf = source[16 + m_leaf++];
135 void CrwDecompressor::init_tables(uint32_t table_idx)
137 static const uint8_t first_tree[3][29] = {
138 { 0,1,4,2,3,1,2,0,0,0,0,0,0,0,0,0,
139 0x04,0x03,0x05,0x06,0x02,0x07,0x01,0x08,0x09,0x00,0x0a,0x0b,0xff },
141 { 0,2,2,3,1,1,1,1,2,0,0,0,0,0,0,0,
142 0x03,0x02,0x04,0x01,0x05,0x00,0x06,0x07,0x09,0x08,0x0a,0x0b,0xff },
144 { 0,0,6,3,1,1,2,0,0,0,0,0,0,0,0,0,
145 0x06,0x05,0x07,0x04,0x08,0x03,0x09,0x02,0x00,0x0a,0x01,0x0b,0xff },
148 static const uint8_t second_tree[3][180] = {
149 { 0,2,2,2,1,4,2,1,2,5,1,1,0,0,0,139,
150 0x03,0x04,0x02,0x05,0x01,0x06,0x07,0x08,
151 0x12,0x13,0x11,0x14,0x09,0x15,0x22,0x00,0x21,0x16,0x0a,0xf0,
152 0x23,0x17,0x24,0x31,0x32,0x18,0x19,0x33,0x25,0x41,0x34,0x42,
153 0x35,0x51,0x36,0x37,0x38,0x29,0x79,0x26,0x1a,0x39,0x56,0x57,
154 0x28,0x27,0x52,0x55,0x58,0x43,0x76,0x59,0x77,0x54,0x61,0xf9,
155 0x71,0x78,0x75,0x96,0x97,0x49,0xb7,0x53,0xd7,0x74,0xb6,0x98,
156 0x47,0x48,0x95,0x69,0x99,0x91,0xfa,0xb8,0x68,0xb5,0xb9,0xd6,
157 0xf7,0xd8,0x67,0x46,0x45,0x94,0x89,0xf8,0x81,0xd5,0xf6,0xb4,
158 0x88,0xb1,0x2a,0x44,0x72,0xd9,0x87,0x66,0xd4,0xf5,0x3a,0xa7,
159 0x73,0xa9,0xa8,0x86,0x62,0xc7,0x65,0xc8,0xc9,0xa1,0xf4,0xd1,
160 0xe9,0x5a,0x92,0x85,0xa6,0xe7,0x93,0xe8,0xc1,0xc6,0x7a,0x64,
161 0xe1,0x4a,0x6a,0xe6,0xb3,0xf1,0xd3,0xa5,0x8a,0xb2,0x9a,0xba,
162 0x84,0xa4,0x63,0xe5,0xc5,0xf3,0xd2,0xc4,0x82,0xaa,0xda,0xe4,
163 0xf2,0xca,0x83,0xa3,0xa2,0xc3,0xea,0xc2,0xe2,0xe3,0xff,0xff },
165 { 0,2,2,1,4,1,4,1,3,3,1,0,0,0,0,140,
166 0x02,0x03,0x01,0x04,0x05,0x12,0x11,0x06,
167 0x13,0x07,0x08,0x14,0x22,0x09,0x21,0x00,0x23,0x15,0x31,0x32,
168 0x0a,0x16,0xf0,0x24,0x33,0x41,0x42,0x19,0x17,0x25,0x18,0x51,
169 0x34,0x43,0x52,0x29,0x35,0x61,0x39,0x71,0x62,0x36,0x53,0x26,
170 0x38,0x1a,0x37,0x81,0x27,0x91,0x79,0x55,0x45,0x28,0x72,0x59,
171 0xa1,0xb1,0x44,0x69,0x54,0x58,0xd1,0xfa,0x57,0xe1,0xf1,0xb9,
172 0x49,0x47,0x63,0x6a,0xf9,0x56,0x46,0xa8,0x2a,0x4a,0x78,0x99,
173 0x3a,0x75,0x74,0x86,0x65,0xc1,0x76,0xb6,0x96,0xd6,0x89,0x85,
174 0xc9,0xf5,0x95,0xb4,0xc7,0xf7,0x8a,0x97,0xb8,0x73,0xb7,0xd8,
175 0xd9,0x87,0xa7,0x7a,0x48,0x82,0x84,0xea,0xf4,0xa6,0xc5,0x5a,
176 0x94,0xa4,0xc6,0x92,0xc3,0x68,0xb5,0xc8,0xe4,0xe5,0xe6,0xe9,
177 0xa2,0xa3,0xe3,0xc2,0x66,0x67,0x93,0xaa,0xd4,0xd5,0xe7,0xf8,
178 0x88,0x9a,0xd7,0x77,0xc4,0x64,0xe2,0x98,0xa5,0xca,0xda,0xe8,
179 0xf3,0xf6,0xa9,0xb2,0xb3,0xf2,0xd2,0x83,0xba,0xd3,0xff,0xff },
181 { 0,0,6,2,1,3,3,2,5,1,2,2,8,10,0,117,
182 0x04,0x05,0x03,0x06,0x02,0x07,0x01,0x08,
183 0x09,0x12,0x13,0x14,0x11,0x15,0x0a,0x16,0x17,0xf0,0x00,0x22,
184 0x21,0x18,0x23,0x19,0x24,0x32,0x31,0x25,0x33,0x38,0x37,0x34,
185 0x35,0x36,0x39,0x79,0x57,0x58,0x59,0x28,0x56,0x78,0x27,0x41,
186 0x29,0x77,0x26,0x42,0x76,0x99,0x1a,0x55,0x98,0x97,0xf9,0x48,
187 0x54,0x96,0x89,0x47,0xb7,0x49,0xfa,0x75,0x68,0xb6,0x67,0x69,
188 0xb9,0xb8,0xd8,0x52,0xd7,0x88,0xb5,0x74,0x51,0x46,0xd9,0xf8,
189 0x3a,0xd6,0x87,0x45,0x7a,0x95,0xd5,0xf6,0x86,0xb4,0xa9,0x94,
190 0x53,0x2a,0xa8,0x43,0xf5,0xf7,0xd4,0x66,0xa7,0x5a,0x44,0x8a,
191 0xc9,0xe8,0xc8,0xe7,0x9a,0x6a,0x73,0x4a,0x61,0xc7,0xf4,0xc6,
192 0x65,0xe9,0x72,0xe6,0x71,0x91,0x93,0xa6,0xda,0x92,0x85,0x62,
193 0xf3,0xc5,0xb2,0xa4,0x84,0xba,0x64,0xa5,0xb3,0xd2,0x81,0xe5,
194 0xd3,0xaa,0xc4,0xca,0xf2,0xb1,0xe4,0xd1,0x83,0x63,0xea,0xc3,
195 0xe2,0x82,0xf1,0xa3,0xc2,0xa1,0xc1,0xe3,0xa2,0xe1,0xff,0xff }
200 memset( m_first_decode, 0,
sizeof(m_first_decode));
201 memset(m_second_decode, 0,
sizeof(m_second_decode));
202 make_decoder(m_first_decode, first_tree[table_idx], 0);
203 make_decoder(m_second_decode, second_tree[table_idx], 0);
210 uint32_t CrwDecompressor::getbits(IO::Stream * s,
int nbits)
218 ret = m_bitbuf = m_vbits = 0;
220 ret = m_bitbuf << (32 - m_vbits) >> (32 - nbits);
223 while (m_vbits < 25) {
226 m_bitbuf = (m_bitbuf << 8) + c;
231 catch(
const Internals::IOException &)
242 int canon_has_lowbits(IO::Stream * s)
244 uint8_t test[0x4000 - 26];
248 s->seek (0, SEEK_SET);
249 s->read (test,
sizeof(test));
250 for (i=514; i <
sizeof(test) - 1; i++)
251 if (test[i] == 0xff) {
265 decode_t *decode, *dindex;
266 int i, j, leaf, len, diff, diffbuf[64], r, save;
267 int carry=0, base[2];
280 bitmap->setMax((1 << 10) - 1);
281 uint8_t *rawbuf = (uint8_t*)bitmap->allocData(m_width
287 init_tables(m_table);
289 int lowbits = canon_has_lowbits(m_stream);
291 <<
" height = " << m_height
292 <<
" width = " << m_width
294 m_stream->
seek(514 + lowbits*m_height*m_width/4, SEEK_SET);
295 getbits(m_stream, -1);
297 while (column < m_width * m_height) {
298 memset(diffbuf,0,
sizeof(diffbuf));
299 decode = m_first_decode;
300 for (i=0; i < 64; i++ ) {
302 for (dindex=decode; dindex->branch[0]; )
303 dindex = dindex->branch[getbits(m_stream, 1)];
305 decode = m_second_decode;
315 diff = getbits(m_stream, len);
316 if ((diff & (1 << (len-1))) == 0)
317 diff -= (1 << len) - 1;
323 for (i=0; i < 64; i++ ) {
324 if (column++ % m_width == 0)
325 base[0] = base[1] = 512;
326 outbuf[i] = ( base[i & 1] += diffbuf[i] );
329 save = m_stream->
seek(0, SEEK_CUR);
330 m_stream->
seek((column-64)/4, SEEK_SET);
331 for (i=j=0; j < 64/4; j++ ) {
332 c = m_stream->readByte();
333 for (r = 0; r < 8; r += 2) {
334 outbuf[i] = (outbuf[i+1] << 2) + ((c >> r) & 3);
338 m_stream->
seek(save, SEEK_SET);
340 memcpy(rawbuf, outbuf, 2 * 64);