63 levs[i] = buf + lev_idx[i];
79 return levs[lev] + (x + y * ((
width + (1 << lev) - 1) >> lev));
90 return t + (x & (x - 1) ? 1 : 0);
103 int num_skipped_subbands = 0;
104 for (
int s = sst; s < send; ++s)
109 ui32 num_levels = 1 +
113 tag_tree inc_tag, inc_tag_flags, mmsb_tag, mmsb_tag_flags;
116 lev_idx, num_levels,
cb_idxs[s].siz, 0);
118 lev_idx, num_levels,
cb_idxs[s].siz, 255);
119 mmsb_tag_flags.
init(
scratch + (tag_tree_size<<1) + tag_tree_size,
120 lev_idx, num_levels,
cb_idxs[s].siz, 0);
134 for (
ui32 lev = 1; lev < num_levels; ++lev)
138 for (
ui32 y = 0; y < height; ++y)
140 for (
ui32 x = 0; x < width; ++x)
144 *inc_tag.
get((x<<1) + 1, y<<1, lev-1));
145 t2 =
ojph_min(*inc_tag.
get(x<<1, (y<<1) + 1, lev-1),
146 *inc_tag.
get((x<<1) + 1, (y<<1) + 1, lev-1));
148 *inc_tag_flags.
get(x, y, lev) = 0;
150 *mmsb_tag.
get((x<<1) + 1, y<<1, lev-1));
151 t2 =
ojph_min(*mmsb_tag.
get(x<<1, (y<<1) + 1, lev-1),
152 *mmsb_tag.
get((x<<1) + 1, (y<<1) + 1, lev-1));
154 *mmsb_tag_flags.
get(x, y, lev) = 0;
158 *inc_tag.
get(0,0,num_levels) = 0;
159 *inc_tag_flags.
get(0,0,num_levels) = 0;
160 *mmsb_tag.
get(0,0,num_levels) = 0;
161 *mmsb_tag_flags.
get(0,0,num_levels) = 0;
162 if (*inc_tag.
get(0, 0, num_levels-1) != 0)
165 bb_put_bits(&bb, 0, 1, elastic, cur_coded_list, ph_bytes);
167 ++num_skipped_subbands;
173 bb_init(&bb, elastic, cur_coded_list);
174 coded = cur_coded_list;
176 bb_put_bit(&bb, 1, elastic, cur_coded_list, ph_bytes);
180 bb_put_bits(&bb, 0, num_skipped_subbands, elastic, cur_coded_list,
182 num_skipped_subbands = 0;
187 for (
ui32 y = 0; y < height; ++y)
191 for (
ui32 x = 0; x < width; ++x, ++cp)
194 for (
ui32 cur_lev = num_levels; cur_lev > 0; --cur_lev)
196 ui32 levm1 = cur_lev - 1;
198 if (*inc_tag_flags.
get(x>>levm1, y>>levm1, levm1) == 0)
200 ui32 skipped = *inc_tag.
get(x>>levm1, y>>levm1, levm1);
201 skipped -= *inc_tag.
get(x>>cur_lev, y>>cur_lev, cur_lev);
202 assert(skipped <= 1);
204 elastic, cur_coded_list, ph_bytes);
205 *inc_tag_flags.
get(x>>levm1, y>>levm1, levm1) = 1;
207 if (*inc_tag.
get(x>>levm1, y>>levm1, levm1) > 0)
215 for (
ui32 cur_lev = num_levels; cur_lev > 0; --cur_lev)
217 ui32 levm1 = cur_lev - 1;
219 if (*mmsb_tag_flags.
get(x>>levm1, y>>levm1, levm1) == 0)
221 int num_zeros = *mmsb_tag.
get(x>>levm1, y>>levm1, levm1);
222 num_zeros -= *mmsb_tag.
get(x>>cur_lev, y>>cur_lev, cur_lev);
224 elastic, cur_coded_list, ph_bytes);
225 *mmsb_tag_flags.
get(x>>levm1, y>>levm1, levm1) = 1;
233 bb_put_bits(&bb, 12, 4, elastic, cur_coded_list, ph_bytes);
236 bb_put_bits(&bb, 2, 2, elastic, cur_coded_list, ph_bytes);
239 bb_put_bits(&bb, 0, 1, elastic, cur_coded_list, ph_bytes);
252 int bits =
ojph_max(bits1, bits2 - extra_bit) - 3;
255 elastic, cur_coded_list, ph_bytes);
258 elastic, cur_coded_list, ph_bytes);
261 elastic, cur_coded_list, ph_bytes);
274 return coded ? cb_bytes + ph_bytes : 1;
293 for (
int s = sst; s < send; ++s)
298 for (
ui32 y = 0; y < height; ++y)
302 for (
ui32 x = 0; x < width; ++x, ++cp)
318 file->
write(&buf, 1);
329 assert(data_left > 0);
337 bool empty_packet =
true;
338 for (
int s = sst; s < send; ++s)
349 empty_packet =
false;
352 ui32 num_levels = 1 +
356 tag_tree inc_tag, inc_tag_flags, mmsb_tag, mmsb_tag_flags;
358 *inc_tag.
get(0, 0, num_levels) = 0;
359 inc_tag_flags.
init(
scratch + tag_tree_size, lev_idx, num_levels,
361 *inc_tag_flags.
get(0, 0, num_levels) = 0;
362 mmsb_tag.
init(
scratch + (tag_tree_size<<1), lev_idx, num_levels,
364 *mmsb_tag.
get(0, 0, num_levels) = 0;
365 mmsb_tag_flags.
init(
scratch + (tag_tree_size<<1) + tag_tree_size,
366 lev_idx, num_levels,
cb_idxs[s].siz, 0);
367 *mmsb_tag_flags.
get(0, 0, num_levels) = 0;
373 for (
ui32 y = 0; y < height; ++y)
377 for (
ui32 x = 0; x < width; ++x, ++cp)
380 bool empty_cb =
false;
381 for (
ui32 cl = num_levels; cl > 0; --cl)
383 ui32 cur_lev = cl - 1;
384 empty_cb = *inc_tag.
get(x>>cur_lev, y>>cur_lev, cur_lev) == 1;
388 if (*inc_tag_flags.
get(x>>cur_lev, y>>cur_lev, cur_lev) == 0)
392 { data_left = 0;
throw "error reading from file p1"; }
393 empty_cb = (bit == 0);
394 *inc_tag.
get(x>>cur_lev, y>>cur_lev, cur_lev) = (
ui8)(1 - bit);
395 *inc_tag_flags.
get(x>>cur_lev, y>>cur_lev, cur_lev) = 1;
406 for (
ui32 levp1 = num_levels; levp1 > 0; --levp1)
408 ui32 cur_lev = levp1 - 1;
409 mmsbs = *mmsb_tag.
get(x>>levp1, y>>levp1, levp1);
411 if (*mmsb_tag_flags.
get(x>>cur_lev, y>>cur_lev, cur_lev) == 0)
417 { data_left = 0;
throw "error reading from file p2"; }
420 *mmsb_tag.
get(x>>cur_lev, y>>cur_lev, cur_lev) = (
ui8)mmsbs;
421 *mmsb_tag_flags.
get(x>>cur_lev, y>>cur_lev, cur_lev) = 1;
425 if (mmsbs > cp->
Kmax)
426 throw "error in parsing a tile header; "
427 "missing msbs are larger or equal to Kmax. The most likely "
428 "cause is a corruption in the bitstream.";
432 ui32 bit, num_passes = 1;
434 { data_left = 0;
throw "error reading from file p3"; }
439 { data_left = 0;
throw "error reading from file p4"; }
443 { data_left = 0;
throw "error reading from file p5"; }
444 num_passes = 3 + bit;
448 { data_left = 0;
throw "error reading from file p6"; }
449 num_passes = 6 + bit;
453 { data_left = 0;
throw "error reading from file p7"; }
454 num_passes = 37 + bit;
469 { data_left = 0;
throw "error reading from file p8"; }
474 { data_left = 0;
throw "error reading from file p9"; }
476 throw "The cleanup segment of an HT codeblock cannot contain "
480 throw "The cleanup segment of an HT codeblock must contain "
481 "less than 65535 bytes";
487 { data_left = 0;
throw "error reading from file p10"; }
489 throw "The refinement segment (SigProp and MagRep passes) of "
490 "an HT codeblock must contain less than 2047 bytes";
499 for (
int s = sst; s < send; ++s)
504 for (
ui32 y = 0; y < height; ++y)
508 for (
ui32 x = 0; x < width; ++x, ++cp)
523 assert(bytes_read == t || bb.
bytes_left == 0);
coded_cb_header * coded_cbs
virtual size_t write(const void *ptr, size_t size)=0
static bool bb_read_chunk(bit_read_buf *bbp, ui32 num_bytes, coded_lists *&cur_coded_list, mem_elastic_allocator *elastic)
static bool bb_read_bit(bit_read_buf *bbp, ui32 &bit)
static bool bb_read_bits(bit_read_buf *bbp, int num_bits, ui32 &bits)
static bool bb_skip_sop(bit_read_buf *bbp)
static bool bb_terminate(bit_read_buf *bbp, bool uses_eph)
static ui32 log2ceil(ui32 x)
static void bb_put_bits(bit_write_buf *bbp, ui32 data, int num_bits, mem_elastic_allocator *elastic, coded_lists *&cur_coded_list, ui32 &ph_bytes)
static void bb_init(bit_read_buf *bbp, ui32 bytes_left, infile_base *file)
static void bb_put_bit(bit_write_buf *bbp, ui32 bit, mem_elastic_allocator *elastic, coded_lists *&cur_coded_list, ui32 &ph_bytes)
static ui32 count_leading_zeros(ui32 val)
void write(outfile_base *file)
ui32 prepare_precinct(int tag_tree_size, ui32 *lev_idx, mem_elastic_allocator *elastic)
void parse(int tag_tree_size, ui32 *lev_idx, mem_elastic_allocator *elastic, ui32 &data_left, infile_base *file, bool skipped)
ui8 * get(ui32 x, ui32 y, ui32 lev)
void init(ui8 *buf, ui32 *lev_idx, ui32 num_levels, size s, int init_val)