38#define _USE_MATH_DEFINES
62 state->set_image_extent(dims);
68 state->set_tile_size(s);
74 state->set_image_offset(offset);
80 state->set_tile_offset(offset);
86 state->set_num_components(num_comps);
93 state->set_comp_info(comp_num, downsampling, bit_depth,
is_signed);
129 return state->get_bit_depth(comp_num);
135 return state->is_signed(comp_num);
141 return state->get_downsampling(comp_num);
147 return state->get_recon_width(comp_num);
153 return state->get_recon_height(comp_num);
167 if (num_decompositions > 32)
169 "maximum number of decompositions cannot exceed 32");
170 state->SPcod.num_decomp = (
ui8)num_decompositions;
178 if (width == 0 || width != (1u << log_width)
179 || height == 0 || height != (1u << log_height)
180 || log_width < 2 || log_height < 2
181 || log_width + log_height > 12)
182 OJPH_ERROR(0x00050011,
"incorrect code block dimensions");
183 state->SPcod.block_width = (
ui8)(log_width - 2);
184 state->SPcod.block_height = (
ui8)(log_height - 2);
190 if (num_levels == 0 || precinct_size == NULL)
195 for (
int i = 0; i <=
state->SPcod.num_decomp; ++i)
197 size t = precinct_size[i < num_levels ? i : num_levels - 1];
201 if (t.
w == 0 || t.
h == 0)
202 OJPH_ERROR(0x00050021,
"precinct width or height cannot be 0");
203 if (t.
w != (1u<<PPx) || t.
h != (1u<<PPy))
205 "precinct width and height should be a power of 2");
206 if (PPx > 15 || PPy > 15)
207 OJPH_ERROR(0x00050023,
"precinct size is too large");
208 if (i > 0 && (PPx == 0 || PPy == 0))
209 OJPH_ERROR(0x00050024,
"precinct size is too small");
210 state->SPcod.precinct_size[i] = (
ui8)(PPx | (PPy << 4));
219 size_t len = strlen(name);
233 OJPH_ERROR(0x00050031,
"unknown progression order");
236 OJPH_ERROR(0x00050032,
"improper progression order");
239 state->SGCod.prog_order = (
ui8)prog_order;
245 state->employ_color_transform(color_transform ? 1 : 0);
251 state->set_reversible(reversible);
286 return state->get_num_decompositions();
292 return state->get_block_dims();
298 return state->get_log_block_dims();
304 return state->is_reversible();
310 return state->get_precinct_size(level_num);
316 return state->get_log_precinct_size(level_num);
322 return state->SGCod.prog_order;
346 return state->SGCod.num_layers;
352 return state->is_employing_color_transform();
358 return state->packets_may_use_sop();
364 return state->packets_use_eph();
370 return state->get_block_vertical_causality();
375 {
return state->get_coc(comp_idx)->get_num_decompositions(); }
379 {
return state->get_coc(comp_idx)->get_block_dims(); }
383 {
return state->get_coc(comp_idx)->get_log_block_dims(); }
387 {
return state->get_coc(comp_idx)->is_reversible(); }
391 {
return state->get_coc(comp_idx)->get_precinct_size(level_num); }
395 {
return state->get_coc(comp_idx)->get_log_precinct_size(level_num); }
399 {
return state->get_coc(comp_idx)->get_block_vertical_causality(); }
413 state->set_delta(delta);
418 state->set_qfactor(qfactor);
424 state->set_delta(comp_idx, delta);
429 state->set_qfactor(comp_idx, ctype, qfactor);
443 state->set_nonlinear_transform(comp_num, nl_type);
448 bool& is_signed,
ui8& nl_type)
const
450 return state->get_nonlinear_transform(comp_num, bit_depth, is_signed,
465 size_t t = strlen(str);
468 "COM marker string length cannot be larger than 65531");
479 "COM marker string length cannot be larger than 65531");
514 1.4021e+00f, 2.0304e+00f, 2.9012e+00f, 4.1153e+00f, 5.8245e+00f,
515 8.2388e+00f, 1.1652e+01f, 1.6479e+01f, 2.3304e+01f, 3.2957e+01f,
516 4.6609e+01f, 6.5915e+01f, 9.3217e+01f, 1.3183e+02f, 1.8643e+02f,
517 2.6366e+02f, 3.7287e+02f, 5.2732e+02f, 7.4574e+02f, 1.0546e+03f,
518 1.4915e+03f, 2.1093e+03f, 2.9830e+03f, 4.2185e+03f, 5.9659e+03f,
519 8.4371e+03f, 1.1932e+04f, 1.6874e+04f, 2.3864e+04f, 3.3748e+04f,
520 4.7727e+04f, 6.7496e+04f, 9.5454e+04f };
522 1.9669e+00f, 2.8839e+00f, 4.1475e+00f, 5.8946e+00f, 8.3472e+00f,
523 1.1809e+01f, 1.6701e+01f, 2.3620e+01f, 3.3403e+01f, 4.7240e+01f,
524 6.6807e+01f, 9.4479e+01f, 1.3361e+02f, 1.8896e+02f, 2.6723e+02f,
525 3.7792e+02f, 5.3446e+02f, 7.5583e+02f, 1.0689e+03f, 1.5117e+03f,
526 2.1378e+03f, 3.0233e+03f, 4.2756e+03f, 6.0467e+03f, 8.5513e+03f,
527 1.2093e+04f, 1.7103e+04f, 2.4187e+04f, 3.4205e+04f, 4.8373e+04f,
528 6.8410e+04f, 9.6747e+04f, 1.3682e+05f };
530 1.2247e+00f, 1.3229e+00f, 1.5411e+00f, 1.7139e+00f, 1.9605e+00f,
531 2.2044e+00f, 2.5047e+00f, 2.8277e+00f, 3.2049e+00f, 3.6238e+00f,
532 4.1033e+00f, 4.6423e+00f, 5.2548e+00f, 5.9462e+00f, 6.7299e+00f,
533 7.6159e+00f, 8.6193e+00f, 9.7544e+00f, 1.1039e+01f, 1.2493e+01f,
534 1.4139e+01f, 1.6001e+01f, 1.8108e+01f, 2.0493e+01f, 2.3192e+01f,
535 2.6246e+01f, 2.9702e+01f, 3.3614e+01f, 3.8041e+01f, 4.3051e+01f,
536 4.8721e+01f, 5.5138e+01f, 6.2399e+01f };
538 1.3975e+00f, 1.4389e+00f, 1.7287e+00f, 1.8880e+00f, 2.1841e+00f,
539 2.4392e+00f, 2.7830e+00f, 3.1341e+00f, 3.5576e+00f, 4.0188e+00f,
540 4.5532e+00f, 5.1494e+00f, 5.8301e+00f, 6.5963e+00f, 7.4663e+00f,
541 8.4489e+00f, 9.5623e+00f, 1.0821e+01f, 1.2247e+01f, 1.3860e+01f,
542 1.5685e+01f, 1.7751e+01f, 2.0089e+01f, 2.2735e+01f, 2.5729e+01f,
543 2.9117e+01f, 3.2952e+01f, 3.7292e+01f, 4.2203e+01f, 4.7761e+01f,
544 5.4051e+01f, 6.1170e+01f, 6.9226e+01f };
565 1.3328e+00f, 1.3067e+00f, 1.3028e+00f, 1.3001e+00f, 1.2993e+00f,
566 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f,
567 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f,
568 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f,
569 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f,
570 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f, 1.2992e+00f,
571 1.2992e+00f, 1.2992e+00f };
573 1.2757e+00f, 1.2352e+00f, 1.2312e+00f, 1.2285e+00f, 1.2280e+00f,
574 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f,
575 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f,
576 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f,
577 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f,
578 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f, 1.2278e+00f,
579 1.2278e+00f, 1.2278e+00f };
581 1.6250e+00f, 1.6875e+00f, 1.6963e+00f, 1.7067e+00f, 1.7116e+00f,
582 1.7129e+00f, 1.7141e+00f, 1.7145e+00f, 1.7151e+00f, 1.7152e+00f,
583 1.7155e+00f, 1.7155e+00f, 1.7156e+00f, 1.7156e+00f, 1.7156e+00f,
584 1.7156e+00f, 1.7156e+00f, 1.7156e+00f, 1.7156e+00f, 1.7156e+00f,
585 1.7156e+00f, 1.7156e+00f, 1.7156e+00f, 1.7156e+00f, 1.7156e+00f,
586 1.7156e+00f, 1.7156e+00f, 1.7156e+00f, 1.7156e+00f, 1.7156e+00f,
587 1.7156e+00f, 1.7156e+00f };
589 2.7500e+00f, 2.8047e+00f, 2.8198e+00f, 2.8410e+00f, 2.8558e+00f,
590 2.8601e+00f, 2.8628e+00f, 2.8656e+00f, 2.8662e+00f, 2.8667e+00f,
591 2.8669e+00f, 2.8670e+00f, 2.8671e+00f, 2.8671e+00f, 2.8671e+00f,
592 2.8671e+00f, 2.8671e+00f, 2.8671e+00f, 2.8671e+00f, 2.8671e+00f,
593 2.8671e+00f, 2.8671e+00f, 2.8671e+00f, 2.8671e+00f, 2.8671e+00f,
594 2.8671e+00f, 2.8671e+00f, 2.8671e+00f, 2.8671e+00f, 2.8671e+00f,
595 2.8671e+00f, 2.8671e+00f };
615 if (component_subsampling.
x == 2 && component_subsampling.
y == 2)
617 else if (component_subsampling.
x == 2 && component_subsampling.
y == 1)
619 else if (component_subsampling.
x == 1 && component_subsampling.
y == 1)
630 else if (
comp_type == comp_type::OJPH_COMP_CB)
640 else if (
comp_type == comp_type::OJPH_COMP_CR)
663 if (subband_idx == 0)
666 assert(subband_idx >= 1 && subband_idx <= 3);
667 assert(decomposition_level > 0);
668 decomposition_level =
ojph_min(decomposition_level, 6);
669 ui32 index = (decomposition_level - 1) * 3 + (3 - subband_idx);
679 else if (
comp_type == comp_type::OJPH_COMP_CB)
680 return 1.8051f / 1.7321f;
681 else if (
comp_type == comp_type::OJPH_COMP_CR)
682 return 1.5734f / 1.7321f;
694 constexpr uint8_t t0 = 65, t1 = 97;
695 constexpr float alpha_t0 = 0.04f, alpha_t1 = 0.10f;
696 constexpr float m_t0 = 2.0f * (1.0f - t0 / 100.0f);
697 constexpr float m_t1 = 2.0f * (1.0f - t1 / 100.0f);
701 m_q = 50.0f / (float)qfactor;
703 m_q = 2.0f * (1.0f - (float)qfactor / 100.0f);
711 else if (qfactor < t1)
713 power = std::log(m_q) - std::log(m_t1);
714 power /= std::log(m_t0) - std::log(m_t1);
715 alpha_q = alpha_t1 * std::pow(alpha_t0 / alpha_t1, power);
722 const float eps = std::sqrt(0.5f) * std::ldexp(1.0f, -(
int)bit_depth);
723 return alpha_q * m_q + eps;
733 static const float y[19];
739 0.2724f, 0.5128f, 0.5128f,
740 0.6692f, 0.9382f, 0.9382f,
741 1.0888f, 1.3046f, 1.3046f,
742 1.4156f, 1.5594f, 1.5594f,
744 2.0f, 2.0f, 2.0f, 2.0f};
746 0.5196f, 0.8260f, 0.8260f,
747 1.0080f, 1.2928f, 1.2928f,
748 1.4440f, 1.6508f, 1.6508f,
749 1.7538f, 1.8848f, 1.8848f,
751 2.0f, 2.0f, 2.0f, 2.0f};
753 0.1220f, 0.1220f, 0.3626f,
754 0.3626f, 0.3626f, 0.6634f,
755 0.6634f, 0.6634f, 0.9225f,
756 0.9225f, 0.9225f, 1.1027f,
757 1.1027f, 1.1027f, 1.4142f,
758 1.4142f, 1.4142f, 1.4142f, 1.4142f};
760 0.2595f, 0.2595f, 0.5841f,
761 0.5841f, 0.5841f, 0.9141f,
762 0.9141f, 0.9141f, 1.1673f,
763 1.1673f, 1.1673f, 1.3328f,
764 1.3328f, 1.3328f, 1.4142f,
765 1.4142f, 1.4142f, 1.4142f, 1.4142f};
767 0.0263f, 0.0863f, 0.0863f,
768 0.1362f, 0.2564f, 0.2564f,
769 0.3346f, 0.4691f, 0.4691f,
770 0.5444f, 0.6523f, 0.6523f,
771 0.7078f, 0.7797f, 0.7797f,
772 1.0f, 1.0f, 1.0f, 1.0f};
774 0.0773f, 0.1835f, 0.1835f,
775 0.2598f, 0.4130f, 0.4130f,
776 0.5040f, 0.6464f, 0.6464f,
777 0.7220f, 0.8254f, 0.8254f,
778 0.8769f, 0.9424f, 0.9424f,
779 1.0f, 1.0f, 1.0f, 1.0f};
781 0.0901f, 0.2758f, 0.2758f,
782 0.7018f, 0.8378f, 0.8378f,
786 1.0f, 1.0f, 1.0f, 1.0f};
793 1.0f, 1.0f, 1.0f, 1.0f};
840 for (
int c = 0; c <
Csiz; ++c)
843 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
844 buf1 =
cptr[c].XRsiz;
845 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
846 buf1 =
cptr[c].YRsiz;
847 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
857 OJPH_ERROR(0x00050041,
"error reading SIZ marker");
859 int num_comps = (
Lsiz - 38) / 3;
860 if (
Lsiz != 38 + 3 * num_comps)
861 OJPH_ERROR(0x00050042,
"error in SIZ marker length");
863 OJPH_ERROR(0x00050043,
"error reading SIZ marker");
865 if ((
Rsiz & 0x4000) == 0)
867 "Rsiz bit 14 is not set (this is not a JPH file)");
868 if ((
Rsiz & 0x8000) != 0 && (
Rsiz & 0xD5F) != 0)
869 OJPH_WARN(0x00050001,
"Rsiz in SIZ has unimplemented fields");
871 OJPH_ERROR(0x00050045,
"error reading SIZ marker");
874 OJPH_ERROR(0x00050046,
"error reading SIZ marker");
876 ui32 t_XOsiz, t_YOsiz;
877 if (file->
read(&t_XOsiz, 4) != 4)
878 OJPH_ERROR(0x00050047,
"error reading SIZ marker");
879 if (file->
read(&t_YOsiz, 4) != 4)
880 OJPH_ERROR(0x00050048,
"error reading SIZ marker");
884 ui32 t_XTsiz, t_YTsiz;
885 if (file->
read(&t_XTsiz, 4) != 4)
886 OJPH_ERROR(0x00050049,
"error reading SIZ marker");
887 if (file->
read(&t_YTsiz, 4) != 4)
888 OJPH_ERROR(0x0005004A,
"error reading SIZ marker");
892 ui32 t_XTOsiz, t_YTOsiz;
893 if (file->
read(&t_XTOsiz, 4) != 4)
894 OJPH_ERROR(0x0005004B,
"error reading SIZ marker");
895 if (file->
read(&t_YTOsiz, 4) != 4)
896 OJPH_ERROR(0x0005004C,
"error reading SIZ marker");
901 OJPH_ERROR(0x0005004D,
"error reading SIZ marker");
903 if (
Csiz != num_comps)
904 OJPH_ERROR(0x0005004E,
"Csiz does not match the SIZ marker size");
906 OJPH_ERROR(0x0005004F,
"Wrong Csiz value of 0 in SIZ marker segment");
908 for (
int c = 0; c <
Csiz; ++c)
910 if (file->
read(&
cptr[c].SSiz, 1) != 1)
911 OJPH_ERROR(0x00050051,
"error reading SIZ marker");
912 if (file->
read(&
cptr[c].XRsiz, 1) != 1)
913 OJPH_ERROR(0x00050052,
"error reading SIZ marker");
914 if (file->
read(&
cptr[c].YRsiz, 1) != 1)
915 OJPH_ERROR(0x00050053,
"error reading SIZ marker");
916 if ((
cptr[c].SSiz & 0x7F) > 37)
917 OJPH_ERROR(0x00050054,
"Wrong SIZ-SSiz value of %d",
cptr[c].SSiz);
918 if (
cptr[c].XRsiz == 0)
919 OJPH_ERROR(0x00050055,
"Wrong SIZ-XRsiz value of %d",
cptr[c].XRsiz);
920 if (
cptr[c].YRsiz == 0)
921 OJPH_ERROR(0x00050056,
"Wrong SIZ-YRsiz value of %d",
cptr[c].YRsiz);
995 OJPH_ERROR(0x00050061,
"error reading CAP marker");
998 OJPH_ERROR(0x00050062,
"error reading CAP marker");
1001 if (
Pcap & 0xFFFDFFFF)
1003 "error Pcap in CAP has options that are not supported");
1004 if ((
Pcap & 0x00020000) == 0)
1006 "error Pcap should have its 15th MSB set, Pcap^15. "
1007 " This is not a JPH file");
1008 for (
ui32 i = 0; i < count; ++i)
1010 OJPH_ERROR(0x00050065,
"error reading CAP marker");
1011 if (
Lcap != 6 + 2 * count)
1012 OJPH_ERROR(0x00050066,
"error in CAP marker length");
1026 if (
SPcod.wavelet_trans <= 1)
1029 assert(
atk != NULL);
1030 return atk->is_reversible();
1053 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1054 buf1 =
SGCod.prog_order;
1055 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1058 buf1 =
SGCod.mc_trans;
1059 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1060 buf1 =
SPcod.num_decomp;
1061 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1062 buf1 =
SPcod.block_width;
1063 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1064 buf1 =
SPcod.block_height;
1065 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1066 buf1 =
SPcod.block_style;
1067 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1068 buf1 =
SPcod.wavelet_trans;
1069 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1071 for (
int i = 0; i <=
SPcod.num_decomp; ++i)
1073 buf1 =
SPcod.precinct_size[i];
1074 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1101 Lcod = num_comps < 257 ? 9 : 10;
1113 if (num_comps < 257)
1116 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1124 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1125 buf1 =
SPcod.num_decomp;
1126 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1127 buf1 =
SPcod.block_width;
1128 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1129 buf1 =
SPcod.block_height;
1130 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1131 buf1 =
SPcod.block_style;
1132 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1133 buf1 =
SPcod.wavelet_trans;
1134 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1136 for (
int i = 0; i <=
SPcod.num_decomp; ++i)
1138 buf1 =
SPcod.precinct_size[i];
1139 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1151 OJPH_ERROR(0x00050071,
"error reading COD segment");
1154 OJPH_ERROR(0x00050072,
"error reading COD segment");
1155 if (file->
read(&
SGCod.prog_order, 1) != 1)
1156 OJPH_ERROR(0x00050073,
"error reading COD segment");
1157 if (file->
read(&
SGCod.num_layers, 2) != 2)
1158 {
OJPH_ERROR(0x00050074,
"error reading COD segment"); }
1161 if (file->
read(&
SGCod.mc_trans, 1) != 1)
1162 OJPH_ERROR(0x00050075,
"error reading COD segment");
1163 if (file->
read(&
SPcod.num_decomp, 1) != 1)
1164 OJPH_ERROR(0x00050076,
"error reading COD segment");
1165 if (file->
read(&
SPcod.block_width, 1) != 1)
1166 OJPH_ERROR(0x00050077,
"error reading COD segment");
1167 if (file->
read(&
SPcod.block_height, 1) != 1)
1168 OJPH_ERROR(0x00050078,
"error reading COD segment");
1169 if (file->
read(&
SPcod.block_style, 1) != 1)
1170 OJPH_ERROR(0x00050079,
"error reading COD segment");
1171 if (file->
read(&
SPcod.wavelet_trans, 1) != 1)
1172 OJPH_ERROR(0x0005007A,
"error reading COD segment");
1175 ||
SPcod.block_width > 8
1176 ||
SPcod.block_height > 8
1177 ||
SPcod.block_width +
SPcod.block_height > 8
1178 || (
SPcod.block_style & 0x40) != 0x40
1179 || (
SPcod.block_style & 0xB7) != 0x00)
1180 OJPH_ERROR(0x0005007D,
"wrong settings in a COD-SPcod parameter");
1181 if ((
SPcod.block_style & 0x40) != 0x40
1182 || (
SPcod.block_style & 0xB7) != 0x00)
1183 OJPH_ERROR(0x0005007E,
"unsupported settings in a COD-SPcod parameter");
1187 for (
int i = 0; i <= num_decompositions; ++i) {
1188 if (file->
read(&
SPcod.precinct_size[i], 1) != 1)
1189 OJPH_ERROR(0x0005007B,
"error reading COD segment");
1191 if ((
SPcod.precinct_size[i] & 0x0F) == 0 ||
1192 (
SPcod.precinct_size[i] >> 4) == 0)
1194 "Precinct width or height for resolutions other than the"
1195 " coarsest must be larger than 1; here, they are %d and %d,"
1197 1 << (
SPcod.precinct_size[i] & 0x0F),
1198 1 << (
SPcod.precinct_size[i] >> 4));
1202 OJPH_ERROR(0x0005007C,
"error in COD segment length");
1215 OJPH_ERROR(0x00050121,
"error reading COC segment");
1217 if (num_comps < 257) {
1219 if (file->
read(&t, 1) != 1)
1220 OJPH_ERROR(0x00050122,
"error reading COC segment");
1225 OJPH_ERROR(0x00050123,
"error reading COC segment");
1229 OJPH_ERROR(0x00050124,
"error reading COC segment");
1232 "Unsupported options in Scoc field of the COC segment");
1233 if (file->
read(&
SPcod.num_decomp, 1) != 1)
1234 OJPH_ERROR(0x00050125,
"error reading COC segment");
1235 if (file->
read(&
SPcod.block_width, 1) != 1)
1236 OJPH_ERROR(0x00050126,
"error reading COC segment");
1237 if (file->
read(&
SPcod.block_height, 1) != 1)
1238 OJPH_ERROR(0x00050127,
"error reading COC segment");
1239 if (file->
read(&
SPcod.block_style, 1) != 1)
1240 OJPH_ERROR(0x00050128,
"error reading COC segment");
1241 if (file->
read(&
SPcod.wavelet_trans, 1) != 1)
1242 OJPH_ERROR(0x00050129,
"error reading COC segment");
1245 ||
SPcod.block_width > 8
1246 ||
SPcod.block_height > 8
1247 ||
SPcod.block_width +
SPcod.block_height > 8
1248 || (
SPcod.block_style & 0x40) != 0x40
1249 || (
SPcod.block_style & 0xB7) != 0x00)
1250 OJPH_ERROR(0x0005012C,
"wrong settings in a COC-SPcoc parameter");
1251 if ((
SPcod.block_style & 0x40) != 0x40
1252 || (
SPcod.block_style & 0xB7) != 0x00)
1253 OJPH_ERROR(0x0005012D,
"unsupported settings in a COC-SPcoc parameter");
1257 for (
int i = 0; i <= num_decompositions; ++i) {
1258 if (file->
read(&
SPcod.precinct_size[i], 1) != 1)
1259 OJPH_ERROR(0x0005012A,
"error reading COC segment");
1261 if ((
SPcod.precinct_size[i] & 0x0F) == 0 ||
1262 (
SPcod.precinct_size[i] >> 4) == 0)
1264 "Precinct width or height for resolutions other than the"
1265 " coarsest must be larger than 1; here, they are %d and %d,"
1267 1 << (
SPcod.precinct_size[i] & 0x0F),
1268 1 << (
SPcod.precinct_size[i] >> 4));
1272 t += num_comps < 257 ? 0 : 1;
1273 t += (
Scod & 1) ? 1 + num_decompositions : 0;
1275 OJPH_ERROR(0x0005012B,
"error in COC segment length");
1282 this->atk =
atk->get_atk(
SPcod.wavelet_trans);
1283 if (this->atk == NULL)
1284 OJPH_ERROR(0x00050131,
"A COD segment employs the DWT kernel "
1285 "atk = %d, but a corresponding ATK segment cannot be found.",
1286 SPcod.wavelet_trans);
1292 OJPH_ERROR(0x00050132,
"A COC segment employs the DWT kernel "
1293 "atk = %d, but a corresponding ATK segment cannot be found",
1294 SPcod.wavelet_trans);
1327 while (p->
next != NULL)
1369 for (
ui32 c = 0; c < num_comps; ++c)
1384 for (
ui32 i = 0; i < num_comps; ++i)
1394 else if (num_comps >= 3)
1396 for (
ui32 i = 0; i < num_comps; ++i) {
1401 ui8 ci = (
ui8)(i < 3u ? i : 0u);
1414 for (
ui32 c = 0; c < num_comps; ++c)
1439 OJPH_ERROR(0x00040001,
"Quantization step sizes already initialized.");
1462 OJPH_WARN(0x00040002,
"qstep for component %d is ignored, because "
1463 "qfactor is set.", comp_num);
1474 OJPH_ERROR(0x00040001,
"Quantization step sizes not initialized.");
1488 OJPH_ERROR(0x00050181,
"Qfactor must be between 1 and 100, "
1489 "but was set to %i.",
qfactor);
1496 bool is_employing_color_transform)
1499 B += is_employing_color_transform ? 1 : 0;
1502 ui32 X = (
ui32) ceil(log(bibo_l * bibo_l) / M_LN2);
1509 X = (
ui32) ceil(log(bibo_h * bibo_l) / M_LN2);
1511 max_B_plus_X =
ojph_max(max_B_plus_X, B + X);
1513 max_B_plus_X =
ojph_max(max_B_plus_X, B + X);
1514 X = (
ui32) ceil(log(bibo_h * bibo_h) / M_LN2);
1516 max_B_plus_X =
ojph_max(max_B_plus_X, B + X);
1519 if (max_B_plus_X > 38)
1520 OJPH_ERROR(0x00050151,
"The specified combination of bit_depth, "
1521 "colour transform, and type of wavelet transform requires more than "
1522 "38 bits; it requires %d bits. This is beyond what is allowed in "
1523 "the JPEG2000 image coding format.", max_B_plus_X);
1526 Sqcd = (
ui8)(guard_bits << 5);
1545 Sqcd = (
ui8)((guard_bits<<5)|0x2);
1557 OJPH_ERROR(0x00050161,
"Qfactor can only be used on components "
1558 "with 4:4:4, 4:2:2 or 4:2:0 sampling");
1559 if (this->
ctype == comp_type::OJPH_COMP_Y &&
1560 this->
sampling.x != 1 && this->sampling.y != 1)
1561 OJPH_ERROR(0x00050162,
"Qfactor can only be used for a Y or "
1562 "luminance component when it is not downsampled.");
1579 w_b = std::pow(w_b, power);
1580 encode_SPqcd(b++, delta_ref / (gain_l * gain_l * g_c * w_b));
1590 w_b = std::pow(w_b, power);
1591 encode_SPqcd(b++, delta_ref / (gain_h * gain_l * g_c * w_b));
1593 w_b = std::pow(w_b, power);
1594 encode_SPqcd(b++, delta_ref / (gain_l * gain_h * g_c * w_b));
1596 w_b = std::pow(w_b, power);
1597 encode_SPqcd(b++, delta_ref / (gain_h * gain_h * g_c * w_b));
1604 int exp = 0, mantissa;
1605 while (delta < 1.0f)
1606 { exp++; delta *= 2.0f; }
1607 mantissa = (int)round(delta * (
float)(1<<11)) - (1<<11);
1610 mantissa = mantissa < (1<<11) ? mantissa : 0x7FF;
1611 SPqcd.u16[subband_index] = (
ui16)((exp << 11) | mantissa);
1626 int irrev = p->
Sqcd & 0x1F;
1633 else if (irrev == 2)
1651 ui32 num_decompositions,
ui32 comp_num,
1654 float arr[] = { 1.0f, 2.0f, 2.0f, 4.0f };
1655 if ((
Sqcd & 0x1F) != 2)
1656 OJPH_ERROR(0x00050101,
"There is something wrong in the configuration "
1657 "of the codestream; for component %d, the codestream defines an "
1658 "irreversible transform, for which the codestream provides a "
1659 "reversible (no quantization) step sizes in Sqcd/Sqcc.", comp_num);
1662 if (dfs != NULL && dfs->
exists())
1667 OJPH_INFO(0x00050102,
"Trying to access quantization step size for "
1668 "subband %d when the QCD/QCC marker segment specifies "
1669 "quantization step sizes for %d subbands only. To continue "
1670 "decoding, we are using the step size for subband %d, which can "
1671 "produce incorrect results",
1675 int eps =
SPqcd.u16[idx] >> 11;
1677 mantissa = (float)((
SPqcd.u16[idx] & 0x7FF) | 0x800) * arr[
subband];
1678 mantissa /= (float)(1 << 11);
1679 mantissa /= (float)(1u << eps);
1690 if (
main->is_employing_color_transform() &&
comp_idx < 3)
1692 for (
ui32 i = 0; i < 3; ++i) {
1705 return precision + 1 + 1;
1719 if (dfs != NULL && dfs->
exists())
1724 OJPH_INFO(0x00050111,
"Trying to access quantization step size for "
1725 "subband %d when the QCD/QCC marker segment specifies "
1726 "quantization step sizes for %d subbands only. To continue "
1727 "decoding, we are using the step size for subband %d, which can "
1728 "produce incorrect results",
1733 int irrev =
Sqcd & 0x1F;
1738 num_bits = num_bits == 0 ? 0 : num_bits - 1;
1740 else if (irrev == 1)
1742 else if (irrev == 2)
1743 num_bits = (
SPqcd.u16[idx] >> 11) - 1;
1753 int irrev =
Sqcd & 0x1F;
1759 num_bits =
ojph_max(num_bits, t == 0 ? 0 : t - 1);
1762 else if (irrev == 1)
1764 else if (irrev == 2)
1780 int irrev =
Sqcd & 0x1F;
1786 else if (irrev == 2)
1801 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1807 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1809 else if (irrev == 2)
1839 int irrev =
Sqcd & 0x1F;
1842 Lqcd = (
ui16)(4 + (num_comps < 257 ? 0 : 1));
1845 else if (irrev == 2)
1859 if (num_comps < 257)
1862 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1870 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1875 result &= file->
write(&buf1,
sizeof(
ui8)) ==
sizeof(
ui8);
1877 else if (irrev == 2)
1906 OJPH_ERROR(0x00050081,
"error reading QCD marker");
1909 OJPH_ERROR(0x00050082,
"error reading QCD marker");
1910 if ((
Sqcd & 0x1F) == 0)
1914 OJPH_ERROR(0x0005008A,
"QCD marker segment that specifies no "
1915 "quantization informtion");
1917 OJPH_ERROR(0x00050083,
"wrong Lqcd value of %d in QCD marker",
Lqcd);
1920 OJPH_ERROR(0x00050084,
"error reading QCD marker");
1922 else if ((
Sqcd & 0x1F) == 1)
1926 "Scalar derived quantization is not supported yet in QCD marker");
1928 OJPH_ERROR(0x00050085,
"wrong Lqcd value in QCD marker");
1930 else if ((
Sqcd & 0x1F) == 2)
1934 OJPH_ERROR(0x0005008B,
"QCD marker segment that specifies no "
1935 "quantization informtion");
1937 OJPH_ERROR(0x00050086,
"wrong Lqcd value of %d in QCD marker",
Lqcd);
1941 OJPH_ERROR(0x00050087,
"error reading QCD marker");
1946 OJPH_ERROR(0x00050088,
"wrong Sqcd value in QCD marker");
1953 OJPH_ERROR(0x000500A1,
"error reading QCC marker");
1955 if (num_comps < 257)
1958 if (file->
read(&v, 1) != 1)
1959 OJPH_ERROR(0x000500A2,
"error reading QCC marker");
1965 OJPH_ERROR(0x000500A3,
"error reading QCC marker");
1969 OJPH_ERROR(0x000500A4,
"error reading QCC marker");
1970 ui32 offset = num_comps < 257 ? 4 : 5;
1971 if ((
Sqcd & 0x1F) == 0)
1975 OJPH_ERROR(0x000500AC,
"QCC marker segment that specifies no "
1976 "quantization informtion");
1978 OJPH_ERROR(0x000500A5,
"wrong Lqcd value of %d in QCC marker",
Lqcd);
1981 OJPH_ERROR(0x000500A6,
"error reading QCC marker");
1983 else if ((
Sqcd & 0x1F) == 1)
1987 "Scalar derived quantization is not supported yet in QCC marker");
1989 OJPH_ERROR(0x000500A7,
"wrong Lqcc value in QCC marker");
1991 else if ((
Sqcd & 0x1F) == 2)
1995 OJPH_ERROR(0x000500AD,
"QCC marker segment that specifies no "
1996 "quantization informtion");
1998 OJPH_ERROR(0x000500A8,
"wrong Lqcc value of %d in QCC marker",
Lqcd);
2002 OJPH_ERROR(0x000500A9,
"error reading QCC marker");
2007 OJPH_ERROR(0x000500AA,
"wrong Sqcc value in QCC marker");
2026 OJPH_ERROR(0x00050191,
"Qfactor must be between 1 and 100, "
2027 "but was set to %i.",
qfactor);
2065 while (p->
next != NULL)
2092 if (this->
enabled && this->
Tnlt == nonlinearity::OJPH_NLT_NO_NLT)
2096 this->
Tnlt == nonlinearity::OJPH_NLT_BINARY_COMPLEMENT_NLT)
2098 bool all_same =
true;
2106 bool is_signed =
false;
2107 for (
ui32 c = 0; c < num_comps; ++c)
2116 all_same = all_same && (is_signed == siz.
is_signed(c));
2132 if (all_same && bit_depth != 0)
2134 this->
BDnlt = (
ui8)(bit_depth - 1);
2140 for (
ui32 c = 0; c < num_comps; ++c)
2148 p->
Tnlt = nonlinearity::OJPH_NLT_BINARY_COMPLEMENT_NLT;
2158 for (
ui32 c = 0; c < num_comps; ++c)
2180 OJPH_ERROR(0x00050171,
"Nonliearities other than type 0 "
2181 "(No Nonlinearity) or type 3 (Binary Binary Complement to Sign "
2182 "Magnitude Conversion) are not supported yet");
2193 bool& is_signed,
ui8& nl_type)
const
2195 assert(
Cnlt == special_comp_num::ALL_COMPS);
2197 p = (p && p->
enabled) ? p :
this;
2200 bit_depth = (
ui8)((p->
BDnlt & 0x7F) + 1);
2201 bit_depth = bit_depth <= 38 ? bit_depth : 38;
2202 is_signed = (p->
BDnlt & 0x80) == 0x80;
2230 result &= file->
write(&p->
Tnlt, 1) == 1;
2245 if (file->
read(&buf2_len,
sizeof(
ui16)) !=
sizeof(
ui16))
2246 OJPH_ERROR(0x00050141,
"error reading NLT marker segment");
2247 if (file->
read(&buf2_comp,
sizeof(
ui16)) !=
sizeof(
ui16))
2248 OJPH_ERROR(0x00050142,
"error reading NLT marker segment");
2249 if (file->
read(&buf1_BDnlt,
sizeof(
ui8)) !=
sizeof(
ui8))
2250 OJPH_ERROR(0x00050143,
"error reading NLT marker segment");
2251 if (file->
read(&buf1_Tnlt,
sizeof(
ui8)) !=
sizeof(
ui8))
2252 OJPH_ERROR(0x00050144,
"error reading NLT marker segment");
2255 if (length != 6 || (buf1_Tnlt != 3 && buf1_Tnlt != 0))
2256 OJPH_ERROR(0x00050145,
"Unsupported NLT type %d\n", buf1_Tnlt);
2264 p->
BDnlt = buf1_BDnlt;
2265 p->
Tnlt = buf1_Tnlt;
2281 while (p && p->
Cnlt != comp_num)
2289 assert(comp_num != special_comp_num::ALL_COMPS);
2290 assert(
Cnlt == special_comp_num::ALL_COMPS);
2292 while (p->
next != NULL) {
2293 assert(p->
Cnlt != comp_num);
2314 while (p && p->
enabled ==
false)
2326 OJPH_INFO(0x00050161,
"The NLT marker segment for the "
2327 "non-existing component %d has been removed.", p->
Cnlt);
2349 this->
Psot = payload_len + 14;
2396 OJPH_INFO(0x00050091,
"error reading SOT marker");
2403 OJPH_INFO(0x00050092,
"error in SOT length");
2409 OJPH_INFO(0x00050093,
"error reading tile index");
2416 OJPH_INFO(0x00050094,
"tile index in SOT marker cannot be 0xFFFF");
2422 OJPH_INFO(0x00050095,
"error reading SOT marker");
2429 OJPH_INFO(0x00050096,
"error reading SOT marker");
2435 OJPH_INFO(0x00050097,
"error reading SOT marker");
2443 OJPH_ERROR(0x00050091,
"error reading SOT marker");
2446 OJPH_ERROR(0x00050092,
"error in SOT length");
2448 OJPH_ERROR(0x00050093,
"error reading SOT tile index");
2451 OJPH_ERROR(0x00050094,
"tile index in SOT marker cannot be 0xFFFF");
2453 OJPH_ERROR(0x00050095,
"error reading SOT marker");
2456 OJPH_ERROR(0x00050096,
"error reading SOT marker");
2458 OJPH_ERROR(0x00050097,
"error reading SOT marker");
2475 OJPH_ERROR(0x000500B1,
"Trying to allocate more than 65535 bytes for "
2476 "a TLM marker; this can be resolved by having more than "
2477 "one TLM marker, but the code does not support this. "
2478 "In any case, this limit means that we have 10922 "
2479 "tileparts or more, which is a huge number.");
2533 while (p && p->
Sdfs != index)
2542 ui32 d = decomp_level - 1;
2544 ui32 bits = d & 0x3;
2545 ui32 val = (
Ddfs[idx] >> (6 - 2 * bits)) & 0x3;
2556 ui32 ns[4] = { 0, 3, 1, 1 };
2578 ui32 decomp_level = 1;
2579 while (skipped_resolutions > 0)
2583 { factor.
x *= 2; factor.
y *= 2; }
2590 --skipped_resolutions;
2600 while (p->
next != NULL)
2611 return p->
read(file);
2615 OJPH_ERROR(0x000500D1,
"error reading DFS-Ldfs parameter");
2618 OJPH_ERROR(0x000500D2,
"error reading DFS-Sdfs parameter");
2621 OJPH_ERROR(0x000500D3,
"The DFS-Sdfs parameter is %d, which is "
2622 "larger than the permissible 15",
Sdfs);
2624 if (file->
read(&l_Ids, 1) != 1)
2625 OJPH_ERROR(0x000500D4,
"error reading DFS-Ids parameter");
2628 "The value of the Ids member in the DFS marker segment cannot be 0");
2629 constexpr int max_Ddfs =
sizeof(
Ddfs) * 4;
2630 if (l_Ids > max_Ddfs)
2631 OJPH_INFO(0x000500D5,
"The DFS-Ids parameter is %d; while this is "
2632 "valid, the number is unnessarily large -- you do not need more "
2633 "than %d. Please contact me regarding this issue.",
2635 Ids = l_Ids < max_Ddfs ? l_Ids : max_Ddfs;
2636 for (
int i = 0; i <
Ids; i += 4)
2637 if (file->
read(&
Ddfs[i / 4], 1) != 1)
2638 OJPH_ERROR(0x000500D6,
"error reading DFS-Ddfs parameters");
2639 for (
int i =
Ids; i < l_Ids; i += 4)
2640 if (file->
read(&t, 1) != 1)
2641 OJPH_ERROR(0x000500D7,
"error reading DFS-Ddfs parameters");
2664 if (index == 0) { this->
init_irv97();
return this; }
2665 else if (index == 1) { this->
init_rev53();
return this; }
2672 if (p == NULL && (index == 0 || index == 1))
2679 else if (index == 1)
2690 if (coeff_type == 0) {
2692 if (file->
read(&v, 1) != 1)
return false;
2696 else if (coeff_type == 1) {
2698 if (file->
read(&v, 2) != 2)
return false;
2702 else if (coeff_type == 2) {
2704 if (file->
read(&i,
sizeof(
ui32)) !=
sizeof(
ui32))
return false;
2708 memcpy(&f, &i,
sizeof(
float));
2711 else if (coeff_type == 3) {
2713 if (file->
read(&i,
sizeof(
ui64)) !=
sizeof(
ui64))
return false;
2717 memcpy(&
d, &i,
sizeof(
double));
2720 else if (coeff_type == 4) {
2722 if (file->
read(&v, 8) != 8)
return false;
2724 if (file->
read(&v1, 8) != 8)
return false;
2731 si32 e = (
si32)((v >> 48) & 0x7FFF);
2737 i |= ((
ui32)(v >> 32) & 0x80000000);
2739 i |= (
ui32)((v >> 25) & 0x007FFFFF);
2741 memcpy(&f, &i,
sizeof(
float));
2752 if (coeff_type == 0) {
2754 if (file->
read(&v, 1) != 1)
return false;
2758 else if (coeff_type == 1) {
2760 if (file->
read(&v, 2) != 2)
return false;
2776 OJPH_ERROR(0x000500E1,
"error reading ATK-Latk parameter");
2780 if (file->
read(&temp_Satk, 2) != 2)
2781 OJPH_ERROR(0x000500E2,
"error reading ATK-Satk parameter");
2784 int tmp_idx = temp_Satk & 0xFF;
2786 || tmp_idx == 0 || tmp_idx == 1)
2787 OJPH_ERROR(0x000500F3,
"ATK-Satk parameter sets ATK marker index to "
2788 "the illegal value of %d. ATK-Satk should be in (2-255) and, I "
2789 "believe, must not be repeated; otherwise, it would be unclear "
2790 "what marker segment must be employed when an index is repeated.",
2794 OJPH_ERROR(0x000500E3,
"ATK-Satk parameter sets m_init to 1, "
2795 "requiring odd-indexed subsequence in first reconstruction step, "
2796 "which is not supported yet.");
2798 OJPH_ERROR(0x000500E4,
"ATK-Satk parameter specified ARB filter, "
2799 "which is not supported yet.");
2801 OJPH_ERROR(0x000500E5,
"ATK-Satk parameter does not make sense. "
2802 "It employs floats with reversible filtering.");
2804 OJPH_ERROR(0x000500E6,
"ATK-Satk parameter requires constant "
2805 "boundary extension, which is not supported yet.");
2808 OJPH_ERROR(0x000500E7,
"error reading ATK-Katk parameter");
2810 OJPH_ERROR(0x000500E8,
"error reading ATK-Natk parameter");
2821 for (
int s = 0; s <
Natk; ++s)
2823 if (file->
read(&
d[s].rev.Eatk, 1) != 1)
2824 OJPH_ERROR(0x000500E9,
"error reading ATK-Eatk parameter");
2826 if (file->
read(&
d[s].rev.Batk, 2) != 2)
2827 OJPH_ERROR(0x000500EA,
"error reading ATK-Batk parameter");
2831 if (file->
read(&LCatk, 1) != 1)
2832 OJPH_ERROR(0x000500EB,
"error reading ATK-LCatk parameter");
2835 OJPH_ERROR(0x000500EC,
"Encountered a ATK-LCatk value of zero; "
2836 "something is wrong.");
2838 OJPH_ERROR(0x000500ED,
"ATK-LCatk value greater than 1; "
2839 "that is, a multitap filter is not supported");
2841 OJPH_ERROR(0x000500EE,
"Error reding ATK-Aatk parameter");
2846 for (
int s = 0; s <
Natk; ++s)
2849 if (file->
read(&LCatk, 1) != 1)
2850 OJPH_ERROR(0x000500EF,
"error reading ATK-LCatk parameter");
2853 OJPH_ERROR(0x000500F0,
"Encountered a ATK-LCatk value of zero; "
2854 "something is wrong.");
2856 OJPH_ERROR(0x000500F1,
"ATK-LCatk value greater than 1; "
2857 "that is, a multitap filter is not supported.");
2859 OJPH_ERROR(0x000500F2,
"Error reding ATK-Aatk parameter");
2863 OJPH_ERROR(0x000500F3,
"The length of an ATK marker segment "
2864 "(ATK-Latk) is not correct");
2873 Katk = (float)1.230174104914001;
2877 d[0].irv.Aatk = (float)0.443506852043971;
2878 d[1].irv.Aatk = (float)0.882911075530934;
2879 d[2].irv.Aatk = (float)-0.052980118572961;
2880 d[3].irv.Aatk = (float)-1.586134342059924;
2903 while (p->
next != NULL)
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]
static const float * get_weights(ui32 format, ui32 comp_type)
static const float no_weights[19]
static const float * get_no_weights()
static const float cr444[19]
static const float cb422[19]
static const float cr422[19]
static const float cb420[19]
static const float cr420[19]
static colour_format get_format(const point &component_subsampling)
static const float cb444[19]
param_qcd::comp_type comp_type
static float get_weight(const float *v, ui32 decomposition_level, ui32 subband_idx)
static float get_gain(ui32 comp_type)
static float get_delta_ref(ui32 qfactor, ui32 bit_depth, float &power)
virtual size_t write(const void *ptr, size_t size)=0
size get_block_dims() const
int get_progression_order() const
bool is_using_color_transform() const
void set_num_decomposition(ui32 num_decompositions)
ui32 get_num_decompositions() const
size get_log_block_dims() const
bool packets_may_use_sop() const
size get_precinct_size(ui32 level_num) const
const char * get_progression_order_as_string() const
void set_precinct_size(int num_levels, size *precinct_size)
bool packets_use_eph() const
bool is_reversible() const
void set_progression_order(const char *name)
bool get_block_vertical_causality() const
void set_block_dims(ui32 width, ui32 height)
size get_log_precinct_size(ui32 level_num) const
int get_num_layers() const
void set_color_transform(bool color_transform)
void set_reversible(bool reversible)
@ OJPH_NLT_BINARY_COMPLEMENT_NLT
bool get_nonlinear_transform(ui32 comp_num, ui8 &bit_depth, bool &is_signed, ui8 &nl_type) const
get the nonlinearity type associated with comp_num, which should be one from enum nonlinearity
void set_nonlinear_transform(ui32 comp_num, ui8 nl_type)
enables or disables type 3 nonlinearity for a component or the default setting
void set_irrev_quant(float delta)
Set the irreversible quantization base delta.
void set_qfactor(ui8 qfactor)
Sets Qfactor.
static comp_type ui8_2_comp_type(ui8 c)
void set_tile_size(size s)
point get_image_extent() const
void set_component(ui32 comp_num, const point &downsampling, ui32 bit_depth, bool is_signed)
void set_num_components(ui32 num_comps)
ui32 get_bit_depth(ui32 comp_num) const
void set_tile_offset(point offset)
point get_image_offset() const
void set_image_offset(point offset)
size get_tile_size() const
ui32 get_recon_height(ui32 comp_num) const
point get_downsampling(ui32 comp_num) const
void set_image_extent(point extent)
point get_tile_offset() const
ui32 get_recon_width(ui32 comp_num) const
bool is_signed(ui32 comp_num) const
ui32 get_num_components() const
static ui16 swap_bytes_if_le(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[]
int main(int argc, char *argv[])
#define ojph_div_ceil(a, b)
#define OJPH_INFO(t,...)
MACROs to insert file and line number for info, warning, and error.
#define OJPH_ERROR(t,...)
bool read_coefficient(infile_base *file, float &K, si32 &bytes)
void init(param_atk *top_atk)
bool is_reversible() const
bool read(infile_base *file)
int get_coeff_type() const
param_atk * get_atk(int index)
bool is_whole_sample() const
bool is_using_ws_extension() const
void read(infile_base *file)
bool write(outfile_base *file)
bool write(outfile_base *file)
const param_cod * get_coc(ui32 comp_idx) const
bool internal_write_coc(outfile_base *file, ui32 num_comps)
ui16 get_dfs_index() const
bool write_coc(outfile_base *file, ui32 num_comps)
bool is_employing_color_transform() const
ui32 get_comp_idx() const
void read(infile_base *file)
void init(param_cod *top_cod, ui16 comp_idx)
void read_coc(infile_base *file, ui32 num_comps, param_cod *top_cod)
void update_atk(param_atk *atk)
bool is_dfs_defined() const
ui8 get_num_decompositions() const
bool is_reversible() const
param_cod * get_or_add_coc(ui32 comp_idx)
param_cod(param_cod *top_cod=NULL, ui16 comp_idx=OJPH_COD_DEFAULT)
ui8 get_wavelet_kern() const
param_cod * add_coc_object(ui32 comp_idx)
bool read(infile_base *file)
dfs_dwt_type get_dwt_type(ui32 decomp_level) const
point get_res_downsamp(ui32 skipped_resolutions) const
ui32 get_subband_idx(ui32 num_decompositions, ui32 resolution, ui32 subband) const
const param_dfs * get_dfs(int index) const
bool write(outfile_base *file) const
param_nlt * add_object(ui32 comp_num)
void trim_non_existing_components(ui32 num_comps)
void read(infile_base *file)
ojph::param_nlt::nonlinearity nonlinearity
bool get_nonlinear_transform(ui32 comp_num, ui8 &bit_depth, bool &is_signed, ui8 &nl_type) const
const param_nlt * get_nlt_object(ui32 comp_num) const
void check_validity(param_siz &siz)
bool is_any_enabled() const
void set_nonlinear_transform(ui32 comp_num, ui8 nl_type)
bool write_qcc(outfile_base *file, ui32 num_comps)
float get_irrev_delta(const param_dfs *dfs, ui32 num_decompositions, ui32 comp_num, ui32 resolution, ui32 subband) const
void set_rev_quant(ui32 num_decomps, ui32 bit_depth, bool is_employing_color_transform)
void set_qfactor(ui8 qfactor)
void set_irrev_quant(ui32 num_decomps)
ui32 get_largest_Kmax() const
ui32 get_num_guard_bits() const
void set_delta(float delta)
void read_qcc(infile_base *file, ui32 num_comps)
void check_validity(const param_siz &siz, const param_cod &cod)
bool write(outfile_base *file)
ui32 propose_precision(const param_cod *cod) const
void read(infile_base *file)
bool is_qcc_needed(ui32 comp_num, const param_cod &cod, const param_siz &siz)
void make_quant_steps(ui32 comp_num, const param_cod &cod, const param_siz &siz)
void init(param_qcd *top_qcd, ui16 comp_idx)
param_qcd * add_qcc_object(ui32 comp_idx)
ui32 get_Kmax(const param_dfs *dfs, ui32 num_decompositions, ui32 resolution, ui32 subband) const
ojph::param_qcd::comp_type comp_type
void encode_SPqcd(ui32 subband_index, float delta)
ui8 decode_SPqcd(ui8 v) const
param_qcd * get_qcc(ui32 comp_idx)
param_qcd(param_qcd *top_qcd=NULL, ui16 comp_idx=OJPH_QCD_DEFAULT)
void trim_non_existing_components(ui32 num_comps)
bool internal_write_qcc(outfile_base *file, ui32 num_comps)
union ojph::local::param_qcd::@140013103227173134364232343330020031205064137337 SPqcd
ui32 get_bit_depth(ui32 comp_num) const
bool ws_kern_support_needed
bool is_signed(ui32 comp_num) const
void set_image_offset(point offset)
bool write(outfile_base *file)
ui16 get_num_components() const
void set_tile_size(size s)
point get_recon_downsampling(ui32 comp_num) const
void set_Rsiz_flag(ui16 flag)
point get_recon_size(ui32 comp_num) const
point get_downsampling(ui32 comp_num) const
void set_tile_offset(point offset)
void read(infile_base *file)
void set_num_components(ui32 num_comps)
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)