101 int num_skipped_subbands = 0;
102 for (
int s = 0; s < 4; ++s)
110 ui32 num_levels = 1 +
114 tag_tree inc_tag, inc_tag_flags, mmsb_tag, mmsb_tag_flags;
117 lev_idx, num_levels,
cb_idxs[s].siz, 0);
119 lev_idx, num_levels,
cb_idxs[s].siz, 255);
120 mmsb_tag_flags.
init(
scratch + (tag_tree_size<<1) + tag_tree_size,
121 lev_idx, num_levels,
cb_idxs[s].siz, 0);
135 for (
ui32 lev = 1; lev < num_levels; ++lev)
139 for (
ui32 y = 0; y < height; ++y)
141 for (
ui32 x = 0; x < width; ++x)
145 *inc_tag.
get((x<<1) + 1, y<<1, lev-1));
146 t2 =
ojph_min(*inc_tag.
get(x<<1, (y<<1) + 1, lev-1),
147 *inc_tag.
get((x<<1) + 1, (y<<1) + 1, lev-1));
149 *inc_tag_flags.
get(x, y, lev) = 0;
151 *mmsb_tag.
get((x<<1) + 1, y<<1, lev-1));
152 t2 =
ojph_min(*mmsb_tag.
get(x<<1, (y<<1) + 1, lev-1),
153 *mmsb_tag.
get((x<<1) + 1, (y<<1) + 1, lev-1));
155 *mmsb_tag_flags.
get(x, y, lev) = 0;
159 *inc_tag.
get(0,0,num_levels) = 0;
160 *inc_tag_flags.
get(0,0,num_levels) = 0;
161 *mmsb_tag.
get(0,0,num_levels) = 0;
162 *mmsb_tag_flags.
get(0,0,num_levels) = 0;
163 if (*inc_tag.
get(0, 0, num_levels-1) != 0)
166 bb_put_bits(&bb, 0, 1, elastic, cur_coded_list, ph_bytes);
168 ++num_skipped_subbands;
174 bb_init(&bb, elastic, cur_coded_list);
175 coded = cur_coded_list;
177 bb_put_bit(&bb, 1, elastic, cur_coded_list, ph_bytes);
181 bb_put_bits(&bb, 0, num_skipped_subbands, elastic, cur_coded_list,
183 num_skipped_subbands = 0;
188 for (
ui32 y = 0; y < height; ++y)
192 for (
ui32 x = 0; x < width; ++x, ++cp)
195 for (
ui32 cur_lev = num_levels; cur_lev > 0; --cur_lev)
197 ui32 levm1 = cur_lev - 1;
199 if (*inc_tag_flags.
get(x>>levm1, y>>levm1, levm1) == 0)
201 ui32 skipped = *inc_tag.
get(x>>levm1, y>>levm1, levm1);
202 skipped -= *inc_tag.
get(x>>cur_lev, y>>cur_lev, cur_lev);
203 assert(skipped <= 1);
205 elastic, cur_coded_list, ph_bytes);
206 *inc_tag_flags.
get(x>>levm1, y>>levm1, levm1) = 1;
208 if (*inc_tag.
get(x>>levm1, y>>levm1, levm1) > 0)
216 for (
ui32 cur_lev = num_levels; cur_lev > 0; --cur_lev)
218 ui32 levm1 = cur_lev - 1;
220 if (*mmsb_tag_flags.
get(x>>levm1, y>>levm1, levm1) == 0)
222 int num_zeros = *mmsb_tag.
get(x>>levm1, y>>levm1, levm1);
223 num_zeros -= *mmsb_tag.
get(x>>cur_lev, y>>cur_lev, cur_lev);
225 elastic, cur_coded_list, ph_bytes);
227 elastic, cur_coded_list, ph_bytes);
228 *mmsb_tag_flags.
get(x>>levm1, y>>levm1, levm1) = 1;
236 bb_put_bits(&bb, 12, 4, elastic, cur_coded_list, ph_bytes);
239 bb_put_bits(&bb, 2, 2, elastic, cur_coded_list, ph_bytes);
242 bb_put_bits(&bb, 0, 1, elastic, cur_coded_list, ph_bytes);
255 int bits =
ojph_max(bits1, bits2 - extra_bit) - 3;
258 elastic, cur_coded_list, ph_bytes);
261 elastic, cur_coded_list, ph_bytes);
264 elastic, cur_coded_list, ph_bytes);
277 return coded ? cb_bytes + ph_bytes : 1;
333 assert(data_left > 0);
348 bool empty_packet =
true;
349 for (
int s = 0; s < 4; ++s)
363 empty_packet =
false;
366 ui32 num_levels = 1 +
370 tag_tree inc_tag, inc_tag_flags, mmsb_tag, mmsb_tag_flags;
372 *inc_tag.
get(0, 0, num_levels) = 0;
373 inc_tag_flags.
init(
scratch + tag_tree_size, lev_idx, num_levels,
375 *inc_tag_flags.
get(0, 0, num_levels) = 0;
376 mmsb_tag.
init(
scratch + (tag_tree_size<<1), lev_idx, num_levels,
378 *mmsb_tag.
get(0, 0, num_levels) = 0;
379 mmsb_tag_flags.
init(
scratch + (tag_tree_size<<1) + tag_tree_size,
380 lev_idx, num_levels,
cb_idxs[s].siz, 0);
381 *mmsb_tag_flags.
get(0, 0, num_levels) = 0;
387 for (
ui32 y = 0; y < height; ++y)
391 for (
ui32 x = 0; x < width; ++x, ++cp)
394 bool empty_cb =
false;
395 for (
ui32 cl = num_levels; cl > 0; --cl)
397 ui32 cur_lev = cl - 1;
398 empty_cb = *inc_tag.
get(x>>cur_lev, y>>cur_lev, cur_lev) == 1;
402 if (*inc_tag_flags.
get(x>>cur_lev, y>>cur_lev, cur_lev) == 0)
406 { data_left = 0;
throw "error reading from file p1"; }
407 empty_cb = (bit == 0);
408 *inc_tag.
get(x>>cur_lev, y>>cur_lev, cur_lev) = (
ui8)(1 - bit);
409 *inc_tag_flags.
get(x>>cur_lev, y>>cur_lev, cur_lev) = 1;
420 for (
ui32 levp1 = num_levels; levp1 > 0; --levp1)
422 ui32 cur_lev = levp1 - 1;
423 mmsbs = *mmsb_tag.
get(x>>levp1, y>>levp1, levp1);
425 if (*mmsb_tag_flags.
get(x>>cur_lev, y>>cur_lev, cur_lev) == 0)
431 { data_left = 0;
throw "error reading from file p2"; }
434 *mmsb_tag.
get(x>>cur_lev, y>>cur_lev, cur_lev) = (
ui8)mmsbs;
435 *mmsb_tag_flags.
get(x>>cur_lev, y>>cur_lev, cur_lev) = 1;
439 if (mmsbs > cp->
Kmax)
440 throw "error in parsing a tile header; "
441 "missing msbs are larger or equal to Kmax. The most likely "
442 "cause is a corruption in the bitstream.";
446 ui32 bit, num_passes = 1;
448 { data_left = 0;
throw "error reading from file p3"; }
453 { data_left = 0;
throw "error reading from file p4"; }
457 { data_left = 0;
throw "error reading from file p5"; }
458 num_passes = 3 + bit;
462 { data_left = 0;
throw "error reading from file p6"; }
463 num_passes = 6 + bit;
467 { data_left = 0;
throw "error reading from file p7"; }
468 num_passes = 37 + bit;
483 { data_left = 0;
throw "error reading from file p8"; }
488 { data_left = 0;
throw "error reading from file p9"; }
490 throw "The cleanup segment of an HT codeblock cannot contain "
494 throw "The cleanup segment of an HT codeblock must contain "
495 "less than 65535 bytes";
501 { data_left = 0;
throw "error reading from file p10"; }
503 throw "The refinement segment (SigProp and MagRep passes) of "
504 "an HT codeblock must contain less than 2047 bytes";
513 for (
int s = 0; s < 4; ++s)
520 for (
ui32 y = 0; y < height; ++y)
524 for (
ui32 x = 0; x < width; ++x, ++cp)
539 assert(bytes_read == t || bb.
bytes_left == 0);