35 #define UNCHECKED_BITSTREAM_READER 0
36 #define BITSTREAM_READER_LE
43 #define JXL_FLAG_NOISE 1
44 #define JXL_FLAG_PATCHES 2
45 #define JXL_FLAG_SPLINES 16
46 #define JXL_FLAG_USE_LF_FRAME 32
47 #define JXL_FLAG_SKIP_ADAPTIVE_LF_SMOOTH 128
49 #define MAX_PREFIX_ALPHABET_SIZE (1u << 15)
51 #define clog1p(x) (ff_log2(x) + !!(x))
52 #define unpack_signed(x) (((x) & 1 ? -(x)-1 : (x))/2)
53 #define div_ceil(x, y) (((x) - 1) / (y) + 1)
54 #define vlm(a,b) {.sym = (a), .len = (b)}
170 vlm(0, 2),
vlm(4, 2),
vlm(3, 2),
vlm(2, 3),
vlm(0, 2),
vlm(4, 2),
vlm(3, 2),
vlm(1, 4),
171 vlm(0, 2),
vlm(4, 2),
vlm(3, 2),
vlm(2, 3),
vlm(0, 2),
vlm(4, 2),
vlm(3, 2),
vlm(5, 4),
176 vlm(10, 3),
vlm(12, 7),
vlm(7, 3),
vlm(3, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(5, 4),
177 vlm(10, 3),
vlm(4, 4),
vlm(7, 3),
vlm(1, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(2, 4),
178 vlm(10, 3),
vlm(0, 5),
vlm(7, 3),
vlm(3, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(5, 4),
179 vlm(10, 3),
vlm(4, 4),
vlm(7, 3),
vlm(1, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(2, 4),
180 vlm(10, 3),
vlm(11, 6),
vlm(7, 3),
vlm(3, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(5, 4),
181 vlm(10, 3),
vlm(4, 4),
vlm(7, 3),
vlm(1, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(2, 4),
182 vlm(10, 3),
vlm(0, 5),
vlm(7, 3),
vlm(3, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(5, 4),
183 vlm(10, 3),
vlm(4, 4),
vlm(7, 3),
vlm(1, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(2, 4),
184 vlm(10, 3),
vlm(13, 7),
vlm(7, 3),
vlm(3, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(5, 4),
185 vlm(10, 3),
vlm(4, 4),
vlm(7, 3),
vlm(1, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(2, 4),
186 vlm(10, 3),
vlm(0, 5),
vlm(7, 3),
vlm(3, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(5, 4),
187 vlm(10, 3),
vlm(4, 4),
vlm(7, 3),
vlm(1, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(2, 4),
188 vlm(10, 3),
vlm(11, 6),
vlm(7, 3),
vlm(3, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(5, 4),
189 vlm(10, 3),
vlm(4, 4),
vlm(7, 3),
vlm(1, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(2, 4),
190 vlm(10, 3),
vlm(0, 5),
vlm(7, 3),
vlm(3, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(5, 4),
191 vlm(10, 3),
vlm(4, 4),
vlm(7, 3),
vlm(1, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(2, 4),
195 1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15,
214 uint32_t c0, uint32_t
c1, uint32_t
c2, uint32_t c3,
215 uint32_t u0, uint32_t u1, uint32_t u2, uint32_t u3)
218 const uint32_t ubits [4] = {u0, u1, u2, u3};
282 *hybrid_uint = token;
320 if (dec->
state < (1 << 16))
322 dec->
state &= 0xFFFFFFFF;
329 uint32_t
context, uint32_t *hybrid_uint)
384 int len = 0,
shift, omit_log = -1, omit_pos = -1;
385 int prev = 0, num_same = 0;
386 uint32_t total_count = 0;
387 uint8_t logcounts[258] = { 0 };
388 uint8_t same[258] = { 0 };
389 const int table_size = 1 << log_alphabet_size;
400 dist->
freq[v2] = (1 << 12) - dist->
freq[v1];
406 dist->
freq[x] = 1 << 12;
443 if (logcounts[
i] == 13) {
449 if (logcounts[
i] > omit_log) {
450 omit_log = logcounts[
i];
454 if (omit_pos < 0 || omit_pos + 1 < dist->
alphabet_size && logcounts[omit_pos + 1] == 13)
459 num_same = same[
i] - 1;
460 prev =
i > 0 ? dist->
freq[
i - 1] : 0;
463 dist->
freq[
i] = prev;
466 if (
i == omit_pos || !logcounts[
i])
468 if (logcounts[
i] == 1) {
471 int bitcount =
FFMIN(
FFMAX(0,
shift - ((12 - logcounts[
i] + 1) >> 1)), logcounts[
i] - 1);
472 dist->
freq[
i] = (1 << (logcounts[
i] - 1)) + (
get_bitsz(gb, bitcount) << (logcounts[
i] - 1 - bitcount));
475 total_count += dist->
freq[
i];
477 dist->
freq[omit_pos] = (1 << 12) - total_count;
540 for (
int i = 0;
i < 256;
i++)
547 for (
int j =
index; j > 0; j--)
567 uint32_t bucket_size, table_size;
568 uint8_t overfull[256], underfull[256];
569 int overfull_pos = 0, underfull_pos = 0;
572 table_size = 1 << log_alphabet_size;
575 for (
int i = 0;
i < table_size;
i++) {
587 overfull[overfull_pos++] =
i;
588 else if (dist->
cutoffs[
i] < bucket_size)
589 underfull[underfull_pos++] =
i;
594 underfull[underfull_pos++] =
i;
597 while (overfull_pos) {
602 u = underfull[--underfull_pos];
603 o = overfull[--overfull_pos];
604 by = bucket_size - dist->
cutoffs[
u];
608 if (dist->
cutoffs[o] < bucket_size)
609 underfull[underfull_pos++] = o;
610 else if (dist->
cutoffs[o] > bucket_size)
611 overfull[overfull_pos++] = o;
614 for (
int i = 0;
i < table_size;
i++) {
615 if (dist->
cutoffs[
i] == bucket_size) {
629 int nsym, tree_select,
bits;
635 for (
int i = 0;
i < nsym;
i++)
646 lens[0] = 1, lens[1] = 1, lens[2] = 0, lens[3] = 0;
647 if (symbols[1] < symbols[0])
648 FFSWAP(int16_t, symbols[0], symbols[1]);
652 lens[0] = 1, lens[1] = 2, lens[2] = 2, lens[3] = 0;
653 if (symbols[2] < symbols[1])
654 FFSWAP(int16_t, symbols[1], symbols[2]);
659 lens[0] = 1, lens[1] = 2, lens[2] = 3, lens[3] = 3;
660 if (symbols[3] < symbols[2])
661 FFSWAP(int16_t, symbols[2], symbols[3]);
664 lens[0] = 2, lens[1] = 2, lens[2] = 2, lens[3] = 2;
666 if (symbols[1] < symbols[0])
667 FFSWAP(int16_t, symbols[0], symbols[1]);
668 if (symbols[3] < symbols[2])
669 FFSWAP(int16_t, symbols[2], symbols[3]);
670 if (symbols[1] <= symbols[2])
672 FFSWAP(int16_t, symbols[1], symbols[2]);
687 int8_t level1_lens[18] = { 0 };
688 int8_t level1_lens_s[18] = { 0 };
689 int16_t level1_syms[18] = { 0 };
690 uint32_t level1_codecounts[19] = { 0 };
692 int8_t *level2_lens, *level2_lens_s;
693 int16_t *level2_syms;
694 uint32_t *level2_codecounts;
696 int repeat_count_prev = 0, repeat_count_zero = 0, prev = 8;
697 int total_code = 0,
len, hskip, num_codes = 0,
ret;
699 VLC level1_vlc = { 0 };
711 level1_codecounts[0] = hskip;
712 for (
int i = hskip;
i < 18;
i++) {
718 level1_codecounts[
len]++;
720 total_code += (32 >>
len);
723 if (total_code >= 32) {
724 level1_codecounts[0] += 18 -
i - 1;
729 if (total_code != 32 && num_codes >= 2 || num_codes < 1) {
734 for (
int i = 1;
i < 19;
i++)
735 level1_codecounts[
i] += level1_codecounts[
i - 1];
737 for (
int i = 17;
i >= 0;
i--) {
738 int idx = --level1_codecounts[level1_lens[
i]];
739 level1_lens_s[idx] = level1_lens[
i];
740 level1_syms[idx] =
i;
755 level2_lens = (int8_t *)buf;
773 if (repeat_count_prev)
774 extra += 4 * (repeat_count_prev - 2) - repeat_count_prev;
776 for (
int j = 0; j < extra; j++)
777 level2_lens[
i + j] = prev;
778 total_code += (32768 >> prev) * extra;
780 repeat_count_prev += extra;
781 repeat_count_zero = 0;
782 level2_codecounts[prev] += extra;
783 }
else if (
len == 17) {
785 if (repeat_count_zero > 0)
786 extra += 8 * (repeat_count_zero - 2) - repeat_count_zero;
789 repeat_count_prev = 0;
790 repeat_count_zero += extra;
791 level2_codecounts[0] += extra;
793 level2_lens[
i] =
len;
794 repeat_count_prev = repeat_count_zero = 0;
796 total_code += (32768 >>
len);
799 level2_codecounts[
len]++;
801 if (total_code >= 32768) {
807 if (total_code != 32768 && level2_codecounts[0] < dist->
alphabet_size - 1) {
813 level2_codecounts[
i] += level2_codecounts[
i - 1];
816 int idx = --level2_codecounts[level2_lens[
i]];
817 level2_lens_s[idx] = level2_lens[
i];
818 level2_syms[idx] =
i;
929 memset(dec, 0,
sizeof(*dec));
945 uint32_t hybrid_uint;
959 if (
b1 >=
'a' && b1 <= 'z' || b1 >=
'A' &&
b1 <=
'Z')
961 else if (
b1 >=
'0' &&
b1 <=
'9' ||
b1 ==
'.' ||
b1 ==
',')
965 else if (
b1 > 1 &&
b1 < 16)
967 else if (
b1 > 240 &&
b1 < 255)
974 if (
b2 >=
'a' && b2 <= 'z' || b2 >=
'A' &&
b2 <=
'Z')
976 else if (
b2 >=
'0' &&
b2 <=
'9' ||
b2 ==
'.' ||
b2 ==
',')
985 return 1 + p1 + p2 * 8;
1051 }
else if (meta->
trc > 0) {
1052 if (meta->
trc > 45355 && meta->
trc < 45555)
1054 else if (meta->
trc > 35614 && meta->
trc < 35814)
1087 uint32_t last = 0, last2 = 0;
1089 uint64_t enc_size =
jxl_u64(gb);
1090 uint64_t output_size = 0;
1091 int out_size_shift = 0;
1093 if (!enc_size || enc_size > (1 << 22))
1119 if (out_size_shift < 63) {
1120 output_size += (
ret & UINT64_C(0x7F)) << out_size_shift;
1121 if (!(
ret & 0x80)) {
1122 out_size_shift = 63;
1124 out_size_shift += 7;
1125 if (out_size_shift > 56) {
1130 }
else if (output_size < 132) {
1146 uint64_t extensions =
jxl_u64(gb), extensions_len = 0;
1154 for (
int i = 0;
i < 64;
i++) {
1155 if (extensions & (UINT64_C(1) <<
i))
1156 extensions_len +=
jxl_u64(gb);
1161 if (extensions_len > INT_MAX ||
get_bits_left(gb) < extensions_len)
1171 int all_default, do_yCbCr = 0, num_passes = 1,
ret;
1172 int group_size_shift = 1, lf_level = 0, save_as_ref = 0;
1173 int have_crop = 0, full_frame = 1, resets_canvas = 1, upsampling = 1;
1178 uint32_t name_len, num_groups, num_lf_groups, group_dim, lf_group_dim, toc_count;
1195 upsampling =
jxl_u32(gb, 1, 2, 4, 8, 0, 0, 0, 0);
1201 group_size_shift =
get_bits(gb, 2);
1205 num_passes =
jxl_u32(gb, 1, 2, 3, 4, 0, 0, 0, 3);
1206 if (num_passes != 1) {
1207 int num_ds =
jxl_u32(gb, 0, 1, 2, 3, 0, 0, 0, 1);
1210 for (
int i = 0;
i < num_ds;
i++)
1211 jxl_u32(gb, 0, 1, 2, 0, 0, 0, 0, 3);
1220 uint32_t ux0 =
jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1221 uint32_t uy0 =
jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1225 width =
jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1227 full_frame = x0 <= 0 && y0 <= 0 && width + x0 >= meta->
coded_width
1236 jxl_u32(gb, 0, 1, 2, 3, 0, 0, 0, 2);
1258 (resets_canvas && !
frame->is_last && (!
duration || save_as_ref)
1261 name_len = 8 *
jxl_u32(gb, 0, 0, 16, 48, 0, 4, 5, 10);
1310 group_dim = 128 << group_size_shift;
1311 lf_group_dim = group_dim << 3;
1314 if (num_groups == 1 && num_passes == 1)
1317 toc_count = 2 + num_lf_groups + num_groups * num_passes;
1326 " exceeds max size of %" PRIu32
"x%" PRIu32
", aborting parser\n",
1338 if (end < 0 || end > toc_count) {
1342 for (uint32_t
i = 0;
i < end;
i++) {
1353 for (uint32_t
i = 0;
i < toc_count;
i++) {
1354 frame->body_length += 8 *
jxl_u32(gb, 0, 1024, 17408, 4211712, 10, 14, 22, 30);
1369 if (
ctx->skip > buf_size)
1373 buf_size -=
ctx->skip;
1388 size = bytestream2_get_be32(&gb);
1393 size = bytestream2_get_be64(&gb);
1399 if (size <= head_size || size > INT_MAX -
ctx->skip)
1412 const uint8_t *buf,
int buf_size)
1414 int ret, cs_buflen, header_skip;
1415 const uint8_t *cs_buffer;
1418 if (
ctx->skip > buf_size)
1422 buf_size -=
ctx->skip;
1430 ctx->collected_size =
ret;
1435 cs_buffer =
ctx->cs_buffer;
1439 cs_buflen = buf_size;
1442 if (!
ctx->codestream_length) {
1444 if (header_skip < 0)
1446 ctx->codestream_length = header_skip;
1451 return ctx->collected_size;
1459 if (!
ctx->skipped_icc &&
ctx->codestream.meta.have_icc_profile) {
1463 ctx->skipped_icc = 1;
1475 ctx->codestream_length +=
ctx->codestream.frame.total_length;
1476 if (
ctx->codestream.frame.is_last)
1477 return ctx->codestream_length / 8;
1485 const uint8_t **poutbuf,
int *poutbuf_size,
1486 const uint8_t *buf,
int buf_size)
1490 const uint8_t *pbuf =
ctx->pc.buffer;
1491 int pindex =
ctx->pc.index;
1496 if (!
ctx->pc.index) {
1497 if (
ctx->pc.overread)
1503 if ((!
ctx->container || !
ctx->codestream_length) && !
ctx->next) {
1512 if (
ctx->container &&
ctx->next >= 0) {
1523 next =
ctx->next -
ctx->pc.index;
1526 if (next > buf_size)
1534 *poutbuf_size = buf_size;
1536 ctx->codestream_length = 0;
1537 ctx->collected_size = 0;
1541 ctx->skipped_icc = 0;
1543 memset(&
ctx->codestream, 0,
sizeof(
ctx->codestream));