48#include "../transform/ojph_colour.h"
57 const rect& recon_tile_rect,
ui32& num_tileparts)
80 if (num_tileparts > 255)
81 OJPH_ERROR(0x000300D1,
"Trying to create %d tileparts; a tile cannot "
82 "have more than 255 tile parts.", num_tileparts);
108 comp_rect.
org.
x = tcx0;
109 comp_rect.
org.
y = tcy0;
110 comp_rect.
siz.
w = tcx1 - tcx0;
111 comp_rect.
siz.
h = tcy1 - tcy0;
113 rect recon_comp_rect;
114 recon_comp_rect.
org.
x = recon_tcx0;
115 recon_comp_rect.
org.
y = recon_tcy0;
116 recon_comp_rect.
siz.
w = recon_tcx1 - recon_tcx0;
117 recon_comp_rect.
siz.
h = recon_tcy1 - recon_tcy0;
127 for (
int i = 0; i < 3; ++i)
134 const rect& recon_tile_rect,
ui32 tile_idx,
223 for (
int i = 0; i < 3; ++i)
252 int shift = 1 << (
num_bits[comp_num] - 1);
256 memcpy(dp, sp, comp_width *
sizeof(
si32));
262 float mul = 1.0f / (float)(1<<
num_bits[comp_num]);
277 int shift = 1 << (
num_bits[comp_num] - 1);
281 memcpy(dp, sp, comp_width *
sizeof(
si32));
287 comps[0].get_line()->i32,
288 comps[1].get_line()->i32,
289 comps[2].get_line()->i32, comp_width);
297 float mul = 1.0f / (float)(1<<
num_bits[comp_num]);
307 comps[0].get_line()->f32,
308 comps[1].get_line()->f32,
309 comps[2].get_line()->f32, comp_width);
335 int shift = 1 << (
num_bits[comp_num] - 1);
336 const si32 *sp = src_line->
i32;
339 memcpy(dp, sp, comp_width *
sizeof(
si32));
345 float mul = (float)(1 <<
num_bits[comp_num]);
346 const float *sp = src_line->
f32;
363 lines[2].i32, comp_width);
367 lines[2].f32, comp_width);
371 int shift = 1 << (
num_bits[comp_num] - 1);
379 memcpy(dp, sp, comp_width *
sizeof(
si32));
385 float mul = (float)(1 <<
num_bits[comp_num]);
423 max_decs =
ojph_max(max_decs,
comps[c].get_num_decompositions());
424 for (
ui32 r = 0; r <= max_decs; ++r)
428 bytes +=
comps[c].get_num_bytes(r);
438 max_decs =
ojph_max(max_decs,
comps[c].get_num_decompositions());
439 for (
ui32 r = 0; r <= max_decs; ++r)
441 if (r <=
comps[c].get_num_decompositions())
456 max_decs =
ojph_max(max_decs,
comps[c].get_num_decompositions());
457 for (
ui32 r = 0; r <= max_decs; ++r)
459 if (r <=
comps[c].get_num_decompositions())
469 ui32 max_decompositions = 0;
471 max_decompositions =
ojph_max(max_decompositions,
472 comps[c].get_num_decompositions());
477 if (!
sot.
write(file, this->num_bytes))
478 OJPH_ERROR(0x00030081,
"Error writing to file");
482 if (!file->
write(&t, 2))
483 OJPH_ERROR(0x00030082,
"Error writing to file");
492 for (
ui32 r = 0; r <= max_decompositions; ++r)
494 comps[c].write_precincts(r, file);
498 for (
ui32 r = 0; r <= max_decompositions; ++r)
502 bytes +=
comps[c].get_num_bytes(r);
505 if (!
sot.
write(file, bytes, (
ui8)r, (
ui8)(max_decompositions + 1)))
506 OJPH_ERROR(0x00030083,
"Error writing to file");
510 if (!file->
write(&t, 2))
511 OJPH_ERROR(0x00030084,
"Error writing to file");
515 comps[c].write_precincts(r, file);
521 for (
ui32 r = 0; r <= max_decompositions; ++r)
523 if (r <=
comps[c].get_num_decompositions()) {
527 OJPH_ERROR(0x00030085,
"Error writing to file");
530 if (!file->
write(&t, 2))
531 OJPH_ERROR(0x00030086,
"Error writing to file");
538 for (
ui32 r = 0; r <= max_decompositions; ++r)
544 bytes +=
comps[c].get_num_bytes(r);
546 if (!
sot.
write(file, bytes, (
ui8)r, (
ui8)(max_decompositions + 1)))
547 OJPH_ERROR(0x00030087,
"Error writing to file");
551 if (!file->
write(&t, 2))
552 OJPH_ERROR(0x00030088,
"Error writing to file");
558 point smallest(INT_MAX, INT_MAX), cur;
561 if (!
comps[c].get_top_left_precinct(r, cur))
566 if (cur.
y < smallest.y)
567 { smallest = cur; comp_num = c; }
568 else if (cur.
y == smallest.y && cur.
x < smallest.x)
569 { smallest = cur; comp_num = c; }
585 point smallest(INT_MAX, INT_MAX), cur;
590 if (!
comps[c].get_top_left_precinct(r, cur))
595 if (cur.
y < smallest.y)
596 { smallest = cur; comp_num = c; res_num = r; }
597 else if (cur.
y == smallest.y && cur.
x < smallest.x)
598 { smallest = cur; comp_num = c; res_num = r; }
599 else if (cur.
y == smallest.y && cur.
x == smallest.x &&
601 { smallest = cur; comp_num = c; res_num = r; }
602 else if (cur.
y == smallest.y && cur.
x == smallest.x &&
603 c == comp_num && r < res_num)
604 { smallest = cur; comp_num = c; res_num = r; }
622 OJPH_ERROR(0x0003008A,
"Error writing to file");
626 if (!file->
write(&t, 2))
627 OJPH_ERROR(0x0003008B,
"Error writing to file");
634 point smallest(INT_MAX, INT_MAX), cur;
635 for (
ui32 r = 0; r <= max_decompositions; ++r)
637 if (!
comps[c].get_top_left_precinct(r, cur))
642 if (cur.
y < smallest.y)
643 { smallest = cur; res_num = r; }
644 else if (cur.
y == smallest.y && cur.
x < smallest.x)
645 { smallest = cur; res_num = r; }
661 const ui64& tile_start_location)
666 OJPH_INFO(0x00030091,
"wrong tile part index")
668 OJPH_ERROR(0x00030091,
"wrong tile part index")
676 data_left -= (
ui32)((
ui64)file->
tell() - tile_start_location);
681 ui32 max_decompositions = 0;
683 max_decompositions =
ojph_max(max_decompositions,
684 comps[c].get_num_decompositions());
692 for (
ui32 r = 0; r <= max_decompositions; ++r)
700 for (
ui32 r = 0; r <= max_decompositions; ++r)
706 point smallest(INT_MAX, INT_MAX), cur;
709 if (!
comps[c].get_top_left_precinct(r, cur))
714 if (cur.
y < smallest.y)
715 { smallest = cur; comp_num = c; }
716 else if (cur.
y == smallest.y && cur.
x < smallest.x)
717 { smallest = cur; comp_num = c; }
719 if (found ==
true && data_left > 0)
733 point smallest(INT_MAX, INT_MAX), cur;
738 if (!
comps[c].get_top_left_precinct(r, cur))
743 if (cur.
y < smallest.y)
744 { smallest = cur; comp_num = c; res_num = r; }
745 else if (cur.
y == smallest.y && cur.
x < smallest.x)
746 { smallest = cur; comp_num = c; res_num = r; }
747 else if (cur.
y == smallest.y && cur.
x == smallest.x &&
749 { smallest = cur; comp_num = c; res_num = r; }
750 else if (cur.
y == smallest.y && cur.
x == smallest.x &&
751 c == comp_num && r < res_num)
752 { smallest = cur; comp_num = c; res_num = r; }
755 if (found ==
true && data_left > 0)
769 point smallest(INT_MAX, INT_MAX), cur;
770 for (
ui32 r = 0; r <= max_decompositions; ++r)
772 if (!
comps[c].get_top_left_precinct(r, cur))
777 if (cur.
y < smallest.y)
778 { smallest = cur; res_num = r; }
779 else if (cur.
y == smallest.y && cur.
x < smallest.x)
780 { smallest = cur; res_num = r; }
782 if (found ==
true && data_left > 0)
793 catch (
const char *
error)
ui32 get_tilepart_div() const
ui32 get_skipped_res_for_read()
const param_siz * get_siz()
mem_fixed_allocator * get_allocator()
ojph::param_cod access_cod()
const param_cod * get_cod()
bool is_tlm_needed() const
static void pre_alloc(codestream *codestream, const rect &comp_rect, const rect &recon_comp_rect)
ui32 get_num_decompositions()
void write_one_precinct(ui32 res_num, outfile_base *file)
void finalize_alloc(codestream *codestream, tile *parent, ui32 comp_num, const rect &comp_rect, const rect &recon_comp_rect)
void parse_one_precinct(ui32 res_num, ui32 &data_left, infile_base *file)
void write_precincts(ui32 res_num, outfile_base *file)
ui32 get_num_bytes() const
void parse_precincts(ui32 res_num, ui32 &data_left, infile_base *file)
bool pull(line_buf *, ui32 comp_num)
static void pre_alloc(codestream *codestream, const rect &tile_rect, const rect &recon_tile_rect, ui32 &num_tileparts)
void fill_tlm(param_tlm *tlm)
void flush(outfile_base *file)
void finalize_alloc(codestream *codestream, const rect &tile_rect, const rect &recon_tile_rect, ui32 tile_idx, ui32 offset, ui32 &num_tileparts)
ui32 skipped_res_for_read
bool push(line_buf *line, ui32 comp_num)
bool employ_color_transform
void parse_tile_header(const param_sot &sot, infile_base *file, const ui64 &tile_start_location)
void pre_alloc_data(size_t num_ele, ui32 pre_size)
void pre_alloc_obj(size_t num_ele)
T * post_alloc_data(size_t num_ele, ui32 pre_size)
T * post_alloc_obj(size_t num_ele)
virtual size_t write(const void *ptr, size_t size)=0
OJPH_EXPORT int get_progression_order() const
void(* cnvrt_float_to_si32)(const float *sp, si32 *dp, float mul, ui32 width)
void(* cnvrt_si32_to_float_shftd)(const si32 *sp, float *dp, float mul, ui32 width)
void(* ict_forward)(const float *r, const float *g, const float *b, float *y, float *cb, float *cr, ui32 repeat)
void(* cnvrt_si32_to_si32_shftd)(const si32 *sp, si32 *dp, int shift, ui32 width)
void(* ict_backward)(const float *y, const float *cb, const float *cr, float *r, float *g, float *b, ui32 repeat)
void(* rct_backward)(const si32 *y, const si32 *cb, const si32 *cr, si32 *r, si32 *g, si32 *b, ui32 repeat)
void(* cnvrt_float_to_si32_shftd)(const float *sp, si32 *dp, float mul, ui32 width)
void(* cnvrt_si32_to_float)(const si32 *sp, float *dp, float mul, ui32 width)
void(* rct_forward)(const si32 *r, const si32 *g, const si32 *b, si32 *y, si32 *cb, si32 *cr, ui32 repeat)
static ui16 swap_byte(ui16 t)
@ OJPH_TILEPART_RESOLUTIONS
@ OJPH_TILEPART_COMPONENTS
@ OJPH_TILEPART_NODIVSIONS
#define ojph_div_ceil(a, b)
#define OJPH_ERROR(t,...)
bool is_employing_color_transform() const
ui8 get_num_decompositions() const
bool is_reversible() const
ui32 get_bit_depth(ui32 comp_num) const
bool is_signed(ui32 comp_num) const
ui16 get_num_components() const
point get_downsampling(ui32 comp_num) const
void init(ui32 payload_length=0, ui16 tile_idx=0, ui8 tile_part_index=0, ui8 num_tile_parts=0)
ui16 get_tile_index() const
ui8 get_tile_part_index() const
ui32 get_payload_length() const
bool write(outfile_base *file, ui32 payload_len)
void set_next_pair(ui16 Ttlm, ui32 Ptlm)