38 #define _USE_MATH_DEFINES
94 ui32 bit_depth,
bool is_signed)
170 if (num_decompositions > 32)
172 "maximum number of decompositions cannot exceed 32");
181 if (width == 0 || width != (1u << log_width)
182 || height == 0 || height != (1u << log_height)
183 || log_width < 2 || log_height < 2
184 || log_width + log_height > 12)
185 OJPH_ERROR(0x00050011,
"incorrect code block dimensions");
193 if (num_levels == 0 || precinct_size == NULL)
200 size t = precinct_size[i < num_levels ? i : num_levels - 1];
204 if (t.
w == 0 || t.
h == 0)
205 OJPH_ERROR(0x00050021,
"precinct width or height cannot be 0");
206 if (t.
w != (1u<<PPx) || t.
h != (1u<<PPy))
208 "precinct width and height should be a power of 2");
209 if (PPx > 15 || PPy > 15)
210 OJPH_ERROR(0x00050023,
"precinct size is too large");
211 if (i > 0 && (PPx == 0 || PPy == 0))
212 OJPH_ERROR(0x00050024,
"precinct size is too small");
222 size_t len = strlen(name);
236 OJPH_ERROR(0x00050031,
"unknown progression order");
239 OJPH_ERROR(0x00050032,
"improper progression order");
376 return (
ui16)((t << 8) | (t >> 8));
416 1.4021e+00f, 2.0304e+00f, 2.9012e+00f, 4.1153e+00f, 5.8245e+00f,
417 8.2388e+00f, 1.1652e+01f, 1.6479e+01f, 2.3304e+01f, 3.2957e+01f,
418 4.6609e+01f, 6.5915e+01f, 9.3217e+01f, 1.3183e+02f, 1.8643e+02f,
419 2.6366e+02f, 3.7287e+02f, 5.2732e+02f, 7.4574e+02f, 1.0546e+03f,
420 1.4915e+03f, 2.1093e+03f, 2.9830e+03f, 4.2185e+03f, 5.9659e+03f,
421 8.4371e+03f, 1.1932e+04f, 1.6874e+04f, 2.3864e+04f, 3.3748e+04f,
422 4.7727e+04f, 6.7496e+04f, 9.5454e+04f };
424 1.9669e+00f, 2.8839e+00f, 4.1475e+00f, 5.8946e+00f, 8.3472e+00f,
425 1.1809e+01f, 1.6701e+01f, 2.3620e+01f, 3.3403e+01f, 4.7240e+01f,
426 6.6807e+01f, 9.4479e+01f, 1.3361e+02f, 1.8896e+02f, 2.6723e+02f,
427 3.7792e+02f, 5.3446e+02f, 7.5583e+02f, 1.0689e+03f, 1.5117e+03f,
428 2.1378e+03f, 3.0233e+03f, 4.2756e+03f, 6.0467e+03f, 8.5513e+03f,
429 1.2093e+04f, 1.7103e+04f, 2.4187e+04f, 3.4205e+04f, 4.8373e+04f,
430 6.8410e+04f, 9.6747e+04f, 1.3682e+05f };
432 1.2247e+00f, 1.3229e+00f, 1.5411e+00f, 1.7139e+00f, 1.9605e+00f,
433 2.2044e+00f, 2.5047e+00f, 2.8277e+00f, 3.2049e+00f, 3.6238e+00f,
434 4.1033e+00f, 4.6423e+00f, 5.2548e+00f, 5.9462e+00f, 6.7299e+00f,
435 7.6159e+00f, 8.6193e+00f, 9.7544e+00f, 1.1039e+01f, 1.2493e+01f,
436 1.4139e+01f, 1.6001e+01f, 1.8108e+01f, 2.0493e+01f, 2.3192e+01f,
437 2.6246e+01f, 2.9702e+01f, 3.3614e+01f, 3.8041e+01f, 4.3051e+01f,
438 4.8721e+01f, 5.5138e+01f, 6.2399e+01f };
440 1.3975e+00f, 1.4389e+00f, 1.7287e+00f, 1.8880e+00f, 2.1841e+00f,
441 2.4392e+00f, 2.7830e+00f, 3.1341e+00f, 3.5576e+00f, 4.0188e+00f,
442 4.5532e+00f, 5.1494e+00f, 5.8301e+00f, 6.5963e+00f, 7.4663e+00f,
443 8.4489e+00f, 9.5623e+00f, 1.0821e+01f, 1.2247e+01f, 1.3860e+01f,
444 1.5685e+01f, 1.7751e+01f, 2.0089e+01f, 2.2735e+01f, 2.5729e+01f,
445 2.9117e+01f, 3.2952e+01f, 3.7292e+01f, 4.2203e+01f, 4.7761e+01f,
446 5.4051e+01f, 6.1170e+01f, 6.9226e+01f };
467 1.3328e+00f, 1.3067e+00f, 1.3028e+00f, 1.3001e+00f, 1.2993e+00f,
468 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f,
469 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f,
470 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f,
471 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f,
472 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f,
473 1.2992e+00f, 1.2992e+00f };
475 1.2757e+00f, 1.2352e+00f, 1.2312e+00f, 1.2285e+00f, 1.2280e+00f,
476 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f,
477 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f,
478 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f,
479 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f,
480 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f,
481 1.2278e+00f, 1.2278e+00f };
483 1.6250e+00f, 1.6875e+00f, 1.6963e+00f, 1.7067e+00f, 1.7116e+00f,
484 1.7129e+00f, 1.7141e+00f, 1.7145e+00f, 1.7151e+00f, 1.7152e+00f,
485 1.7155e+00f, 1.7155e+00f, 1.7156e+00f, 1.7156e+00f, 1.7156e+00f,
486 1.7156e+00f, 1.7156e+00f, 1.7156e+00f, 1.7156e+00f, 1.7156e+00f,
487 1.7156e+00f, 1.7156e+00f, 1.7156e+00f, 1.7156e+00f, 1.7156e+00f,
488 1.7156e+00f, 1.7156e+00f, 1.7156e+00f, 1.7156e+00f, 1.7156e+00f,
489 1.7156e+00f, 1.7156e+00f };
491 2.7500e+00f, 2.8047e+00f, 2.8198e+00f, 2.8410e+00f, 2.8558e+00f,
492 2.8601e+00f, 2.8628e+00f, 2.8656e+00f, 2.8662e+00f, 2.8667e+00f,
493 2.8669e+00f, 2.8670e+00f, 2.8671e+00f, 2.8671e+00f, 2.8671e+00f,
494 2.8671e+00f, 2.8671e+00f, 2.8671e+00f, 2.8671e+00f, 2.8671e+00f,
495 2.8671e+00f, 2.8671e+00f, 2.8671e+00f, 2.8671e+00f, 2.8671e+00f,
496 2.8671e+00f, 2.8671e+00f, 2.8671e+00f, 2.8671e+00f, 2.8671e+00f,
497 2.8671e+00f, 2.8671e+00f };
519 result &= file->
write(&buf, 2) == 2;
521 result &= file->
write(&buf, 2) == 2;
523 result &= file->
write(&buf, 2) == 2;
525 result &= file->
write(&buf, 4) == 4;
527 result &= file->
write(&buf, 4) == 4;
529 result &= file->
write(&buf, 4) == 4;
531 result &= file->
write(&buf, 4) == 4;
533 result &= file->
write(&buf, 4) == 4;
535 result &= file->
write(&buf, 4) == 4;
537 result &= file->
write(&buf, 4) == 4;
539 result &= file->
write(&buf, 4) == 4;
541 result &= file->
write(&buf, 2) == 2;
542 for (
int c = 0; c <
Csiz; ++c)
547 result &= file->
write(&buf, 3) == 3;
557 OJPH_ERROR(0x00050041,
"error reading SIZ marker");
559 int num_comps = (
Lsiz - 38) / 3;
560 if (
Lsiz != 38 + 3 * num_comps)
561 OJPH_ERROR(0x00050042,
"error in SIZ marker length");
563 OJPH_ERROR(0x00050043,
"error reading SIZ marker");
565 if ((
Rsiz & 0x4000) == 0)
566 OJPH_ERROR(0x00050044,
"Rsiz bit 14 not set (this is not a JPH file)");
568 OJPH_WARN(0x00050001,
"Rsiz in SIZ has unimplemented fields");
570 OJPH_ERROR(0x00050045,
"error reading SIZ marker");
573 OJPH_ERROR(0x00050046,
"error reading SIZ marker");
576 OJPH_ERROR(0x00050047,
"error reading SIZ marker");
579 OJPH_ERROR(0x00050048,
"error reading SIZ marker");
582 OJPH_ERROR(0x00050049,
"error reading SIZ marker");
585 OJPH_ERROR(0x0005004A,
"error reading SIZ marker");
588 OJPH_ERROR(0x0005004B,
"error reading SIZ marker");
591 OJPH_ERROR(0x0005004C,
"error reading SIZ marker");
594 OJPH_ERROR(0x0005004D,
"error reading SIZ marker");
596 if (
Csiz != num_comps)
597 OJPH_ERROR(0x0005004E,
"Csiz does not match the SIZ marker size");
605 for (
int c = 0; c <
Csiz; ++c)
608 OJPH_ERROR(0x00050051,
"error reading SIZ marker");
610 OJPH_ERROR(0x00050052,
"error reading SIZ marker");
612 OJPH_ERROR(0x00050053,
"error reading SIZ marker");
635 result &= file->
write(&buf, 2) == 2;
637 result &= file->
write(&buf, 2) == 2;
639 result &= file->
write(&buf, 4) == 4;
642 result &= file->
write(&buf, 2) == 2;
651 OJPH_ERROR(0x00050061,
"error reading CAP marker");
654 OJPH_ERROR(0x00050062,
"error reading CAP marker");
657 if (
Pcap & 0xFFFDFFFF)
659 "error Pcap in CAP has options that are not supported");
660 if ((
Pcap & 0x00020000) == 0)
662 "error Pcap should have its 15th MSB set, Pcap^15. "
663 " This is not a JPH file");
664 for (
ui32 i = 0; i < count; ++i)
666 OJPH_ERROR(0x00050065,
"error reading CAP marker");
667 if (
Lcap != 6 + 2 * count)
668 OJPH_ERROR(0x00050066,
"error in CAP marker length");
691 result &= file->
write(&buf, 2) == 2;
693 result &= file->
write(&buf, 2) == 2;
695 result &= file->
write(&buf, 1) == 1;
697 result &= file->
write(&buf, 1) == 1;
699 result &= file->
write(&buf, 2) == 2;
701 result &= file->
write(&buf, 1) == 1;
706 result &= file->
write(&buf, 4) == 4;
708 result &= file->
write(&buf, 1) == 1;
713 result &= file->
write(&buf, 1) == 1;
723 OJPH_ERROR(0x00050071,
"error reading COD marker");
726 OJPH_ERROR(0x00050072,
"error reading COD marker");
728 OJPH_ERROR(0x00050073,
"error reading COD marker");
730 OJPH_ERROR(0x00050074,
"error reading COD marker");
732 OJPH_ERROR(0x00050075,
"error reading COD marker");
734 OJPH_ERROR(0x00050076,
"error reading COD marker");
736 OJPH_ERROR(0x00050077,
"error reading COD marker");
738 OJPH_ERROR(0x00050078,
"error reading COD marker");
740 OJPH_ERROR(0x00050079,
"error reading COD marker");
742 OJPH_ERROR(0x0005007A,
"error reading COD marker");
746 OJPH_ERROR(0x0005007B,
"error reading COD marker");
748 OJPH_ERROR(0x0005007C,
"error in COD marker length");
761 bool is_employing_color_transform)
766 B += is_employing_color_transform ? 1 : 0;
770 ui32 X = (
ui32) ceil(log(bibo_l * bibo_l * 1.1f) / M_LN2);
776 X = (
ui32) ceil(log(bibo_h * bibo_l * 1.1f) / M_LN2);
779 X = (
ui32) ceil(log(bibo_h * bibo_h * 1.1f) / M_LN2);
788 Sqcd = (
ui8)((guard_bits<<5)|0x2);
791 float delta_b =
base_delta / (gain_l * gain_l);
792 int exp = 0, mantissa;
793 while (delta_b < 1.0f)
794 { exp++; delta_b *= 2.0f; }
797 mantissa = (int)round(delta_b * (
float)(1<<11)) - (1<<11);
798 mantissa = mantissa < (1<<11) ? mantissa : 0x7FF;
807 int exp = 0, mantissa;
808 while (delta_b < 1.0f)
809 { exp++; delta_b *= 2.0f; }
810 mantissa = (int)round(delta_b * (
float)(1<<11)) - (1<<11);
811 mantissa = mantissa < (1<<11) ? mantissa : 0x7FF;
819 { exp++; delta_b *= 2.0f; }
820 mantissa = (int)round(delta_b * (
float)(1<<11)) - (1<<11);
821 mantissa = mantissa < (1<<11) ? mantissa : 0x7FF;
830 int irrev =
Sqcd & 0x1F;
851 assert((
Sqcd & 0x1F) == 2);
852 float arr[] = { 1.0f, 2.0f, 2.0f, 4.0f };
858 mantissa /= (float)(1 << 11);
859 mantissa /= (float)(1u << eps);
876 int irrev =
Sqcd & 0x1F;
880 num_bits = num_bits == 0 ? 0 : num_bits - 1;
895 int irrev =
Sqcd & 0x1F;
912 result &= file->
write(&buf, 2) == 2;
914 result &= file->
write(&buf, 2) == 2;
916 result &= file->
write(&buf, 1) == 1;
919 for (
ui32 i = 0; i < num_subbands; ++i)
922 result &= file->
write(&buf, 1) == 1;
925 for (
ui32 i = 0; i < num_subbands; ++i)
928 result &= file->
write(&buf, 2) == 2;
940 OJPH_ERROR(0x00050081,
"error reading QCD marker");
943 OJPH_ERROR(0x00050082,
"error reading QCD marker");
944 if ((
Sqcd & 0x1F) == 0)
948 OJPH_ERROR(0x00050083,
"wrong Lqcd value in QCD marker");
951 OJPH_ERROR(0x00050084,
"error reading QCD marker");
953 else if ((
Sqcd & 0x1F) == 1)
957 "Scalar derived quantization is not supported yet in QCD marker");
959 OJPH_ERROR(0x00050085,
"wrong Lqcd value in QCD marker");
961 else if ((
Sqcd & 0x1F) == 2)
965 OJPH_ERROR(0x00050086,
"wrong Lqcd value in QCD marker");
969 OJPH_ERROR(0x00050087,
"error reading QCD marker");
974 OJPH_ERROR(0x00050088,
"wrong Sqcd value in QCD marker");
989 OJPH_ERROR(0x000500A1,
"error reading QCC marker");
994 if (file->
read(&v, 1) != 1)
995 OJPH_ERROR(0x000500A2,
"error reading QCC marker");
1001 OJPH_ERROR(0x000500A3,
"error reading QCC marker");
1005 OJPH_ERROR(0x000500A4,
"error reading QCC marker");
1006 if ((
Sqcd & 0x1F) == 0)
1008 ui32 offset = num_comps < 257 ? 5 : 6;
1011 OJPH_ERROR(0x000500A5,
"wrong Lqcd value in QCC marker");
1014 OJPH_ERROR(0x000500A6,
"error reading QCC marker");
1016 else if ((
Sqcd & 0x1F) == 1)
1018 ui32 offset = num_comps < 257 ? 6 : 7;
1021 "Scalar derived quantization is not supported yet in QCC marker");
1023 OJPH_ERROR(0x000500A7,
"wrong Lqcc value in QCC marker");
1025 else if ((
Sqcd & 0x1F) == 2)
1027 ui32 offset = num_comps < 257 ? 6 : 7;
1030 OJPH_ERROR(0x000500A8,
"wrong Lqcc value in QCC marker");
1034 OJPH_ERROR(0x000500A9,
"error reading QCC marker");
1039 OJPH_ERROR(0x000500AA,
"wrong Sqcc value in QCC marker");
1056 this->
Psot = payload_len + 14;
1060 result &= file->
write(&buf, 2) == 2;
1062 result &= file->
write(&buf, 2) == 2;
1064 result &= file->
write(&buf, 2) == 2;
1066 result &= file->
write(&buf, 4) == 4;
1068 result &= file->
write(&buf, 1) == 1;
1070 result &= file->
write(&buf, 1) == 1;
1084 result &= file->
write(&buf, 2) == 2;
1086 result &= file->
write(&buf, 2) == 2;
1088 result &= file->
write(&buf, 2) == 2;
1090 result &= file->
write(&buf, 4) == 4;
1092 result &= file->
write(&buf, 1) == 1;
1094 result &= file->
write(&buf, 1) == 1;
1106 OJPH_INFO(0x00050091,
"error reading SOT marker");
1113 OJPH_INFO(0x00050092,
"error in SOT length");
1119 OJPH_INFO(0x00050093,
"error reading tile index");
1126 OJPH_INFO(0x00050094,
"tile index in SOT marker cannot be 0xFFFF");
1132 OJPH_INFO(0x00050095,
"error reading SOT marker");
1139 OJPH_INFO(0x00050096,
"error reading SOT marker");
1145 OJPH_INFO(0x00050097,
"error reading SOT marker");
1153 OJPH_ERROR(0x00050091,
"error reading SOT marker");
1156 OJPH_ERROR(0x00050092,
"error in SOT length");
1158 OJPH_ERROR(0x00050093,
"error reading SOT tile index");
1161 OJPH_ERROR(0x00050094,
"tile index in SOT marker cannot be 0xFFFF");
1163 OJPH_ERROR(0x00050095,
"error reading SOT marker");
1166 OJPH_ERROR(0x00050096,
"error reading SOT marker");
1168 OJPH_ERROR(0x00050097,
"error reading SOT marker");
1209 result &= file->
write(&buf, 2) == 2;
1211 result &= file->
write(&buf, 2) == 2;
1217 result &= file->
write(&buf, 2) == 2;
1219 result &= file->
write(&buf, 4) == 4;
virtual size_t read(void *ptr, size_t size)=0
static const float gain_5x3_l[34]
static float get_bibo_gain_l(ui32 num_decomp, bool reversible)
static const float gain_5x3_h[34]
static float get_bibo_gain_h(ui32 num_decomp, bool reversible)
static const float gain_9x7_h[34]
static const float gain_9x7_l[34]
static const float gain_5x3_l[34]
static const float gain_5x3_h[34]
static float get_gain_l(ui32 num_decomp, bool reversible)
static const float gain_9x7_l[34]
static float get_gain_h(ui32 num_decomp, bool reversible)
static const float gain_9x7_h[34]
virtual size_t write(const void *ptr, size_t size)=0
OJPH_EXPORT size get_block_dims() const
OJPH_EXPORT int get_progression_order() const
OJPH_EXPORT bool is_using_color_transform() const
OJPH_EXPORT void set_num_decomposition(ui32 num_decompositions)
OJPH_EXPORT ui32 get_num_decompositions() const
OJPH_EXPORT size get_log_block_dims() const
OJPH_EXPORT bool packets_may_use_sop() const
OJPH_EXPORT size get_precinct_size(ui32 level_num) const
OJPH_EXPORT const char * get_progression_order_as_string() const
OJPH_EXPORT void set_precinct_size(int num_levels, size *precinct_size)
OJPH_EXPORT bool packets_use_eph() const
OJPH_EXPORT bool is_reversible() const
OJPH_EXPORT void set_progression_order(const char *name)
OJPH_EXPORT bool get_block_vertical_causality() const
OJPH_EXPORT void set_block_dims(ui32 width, ui32 height)
OJPH_EXPORT size get_log_precinct_size(ui32 level_num) const
OJPH_EXPORT int get_num_layers() const
OJPH_EXPORT void set_color_transform(bool color_transform)
OJPH_EXPORT void set_reversible(bool reversible)
OJPH_EXPORT void set_irrev_quant(float delta)
OJPH_EXPORT void set_tile_size(size s)
OJPH_EXPORT point get_image_extent() const
OJPH_EXPORT void set_component(ui32 comp_num, const point &downsampling, ui32 bit_depth, bool is_signed)
OJPH_EXPORT void set_num_components(ui32 num_comps)
OJPH_EXPORT ui32 get_bit_depth(ui32 comp_num) const
OJPH_EXPORT void set_tile_offset(point offset)
OJPH_EXPORT point get_image_offset() const
OJPH_EXPORT void set_image_offset(point offset)
OJPH_EXPORT size get_tile_size() const
OJPH_EXPORT ui32 get_recon_height(ui32 comp_num) const
OJPH_EXPORT point get_downsampling(ui32 comp_num) const
OJPH_EXPORT void set_image_extent(point extent)
OJPH_EXPORT point get_tile_offset() const
OJPH_EXPORT ui32 get_recon_width(ui32 comp_num) const
OJPH_EXPORT bool is_signed(ui32 comp_num) const
OJPH_EXPORT ui32 get_num_components() const
static ui16 swap_byte(ui16 t)
const char OJPH_PO_STRING_PCRL[]
static ui32 population_count(ui32 val)
const char OJPH_PO_STRING_RLCP[]
const char OJPH_PO_STRING_RPCL[]
const char OJPH_PO_STRING_CPRL[]
static ui32 count_leading_zeros(ui32 val)
const char OJPH_PO_STRING_LRCP[]
#define OJPH_ERROR(t,...)
void read(infile_base *file)
bool write(outfile_base *file)
bool write(outfile_base *file)
size get_block_dims() const
size get_log_block_dims() const
void set_reversible(bool reversible)
bool is_employing_color_transform() const
void employ_color_transform(ui8 val)
void read(infile_base *file)
size get_log_precinct_size(ui32 res_num) const
bool packets_use_eph() const
ui8 get_num_decompositions() const
bool packets_may_use_sop() const
bool is_reversible() const
size get_precinct_size(ui32 res_num) const
void read(infile_base *file, ui32 num_comps)
ui32 get_Kmax(ui32 resolution, ui32 subband) const
ui32 get_num_guard_bits() const
void set_delta(float delta)
bool write(outfile_base *file)
void read(infile_base *file)
void set_rev_quant(ui32 bit_depth, bool is_employing_color_transform)
float irrev_get_delta(ui32 resolution, ui32 subband) const
ui32 get_bit_depth(ui32 comp_num) const
ui32 get_recon_height(ui32 comp_num) const
bool is_signed(ui32 comp_num) const
bool write(outfile_base *file)
void set_comp_info(ui32 comp_num, const point &downsampling, ui32 bit_depth, bool is_signed)
point get_downsampling(ui32 comp_num) const
void read(infile_base *file)
void set_num_components(ui32 num_comps)
ui32 get_recon_width(ui32 comp_num) const
bool read(infile_base *file, bool resilient)
bool write(outfile_base *file, ui32 payload_len)
void set_next_pair(ui16 Ttlm, ui32 Ptlm)
bool write(outfile_base *file)
void init(ui32 num_pairs, Ttlm_Ptlm_pair *store)