36 #define UNCHECKED_BITSTREAM_READER 0
37 #define BITSTREAM_READER_LE
44 #define JXL_FLAG_NOISE 1
45 #define JXL_FLAG_PATCHES 2
46 #define JXL_FLAG_SPLINES 16
47 #define JXL_FLAG_USE_LF_FRAME 32
48 #define JXL_FLAG_SKIP_ADAPTIVE_LF_SMOOTH 128
50 #define MAX_PREFIX_ALPHABET_SIZE (1u << 15)
52 #define clog1p(x) (ff_log2(x) + !!(x))
53 #define unpack_signed(x) (((x) & 1 ? -(x)-1 : (x))/2)
54 #define div_ceil(x, y) (((x) - 1) / (y) + 1)
55 #define vlm(a,b) {.sym = (a), .len = (b)}
171 vlm(0, 2),
vlm(4, 2),
vlm(3, 2),
vlm(2, 3),
vlm(0, 2),
vlm(4, 2),
vlm(3, 2),
vlm(1, 4),
172 vlm(0, 2),
vlm(4, 2),
vlm(3, 2),
vlm(2, 3),
vlm(0, 2),
vlm(4, 2),
vlm(3, 2),
vlm(5, 4),
177 vlm(10, 3),
vlm(12, 7),
vlm(7, 3),
vlm(3, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(5, 4),
178 vlm(10, 3),
vlm(4, 4),
vlm(7, 3),
vlm(1, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(2, 4),
179 vlm(10, 3),
vlm(0, 5),
vlm(7, 3),
vlm(3, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(5, 4),
180 vlm(10, 3),
vlm(4, 4),
vlm(7, 3),
vlm(1, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(2, 4),
181 vlm(10, 3),
vlm(11, 6),
vlm(7, 3),
vlm(3, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(5, 4),
182 vlm(10, 3),
vlm(4, 4),
vlm(7, 3),
vlm(1, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(2, 4),
183 vlm(10, 3),
vlm(0, 5),
vlm(7, 3),
vlm(3, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(5, 4),
184 vlm(10, 3),
vlm(4, 4),
vlm(7, 3),
vlm(1, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(2, 4),
185 vlm(10, 3),
vlm(13, 7),
vlm(7, 3),
vlm(3, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(5, 4),
186 vlm(10, 3),
vlm(4, 4),
vlm(7, 3),
vlm(1, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(2, 4),
187 vlm(10, 3),
vlm(0, 5),
vlm(7, 3),
vlm(3, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(5, 4),
188 vlm(10, 3),
vlm(4, 4),
vlm(7, 3),
vlm(1, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(2, 4),
189 vlm(10, 3),
vlm(11, 6),
vlm(7, 3),
vlm(3, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(5, 4),
190 vlm(10, 3),
vlm(4, 4),
vlm(7, 3),
vlm(1, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(2, 4),
191 vlm(10, 3),
vlm(0, 5),
vlm(7, 3),
vlm(3, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(5, 4),
192 vlm(10, 3),
vlm(4, 4),
vlm(7, 3),
vlm(1, 4),
vlm(6, 3),
vlm(8, 3),
vlm(9, 3),
vlm(2, 4),
196 1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15,
215 uint32_t c0, uint32_t
c1, uint32_t
c2, uint32_t c3,
216 uint32_t u0, uint32_t u1, uint32_t u2, uint32_t u3)
219 const uint32_t ubits [4] = {u0, u1, u2, u3};
283 *hybrid_uint = token;
321 if (dec->
state < (1 << 16))
323 dec->
state &= 0xFFFFFFFF;
330 uint32_t
context, uint32_t *hybrid_uint)
385 int len = 0,
shift, omit_log = -1, omit_pos = -1;
386 int prev = 0, num_same = 0;
387 uint32_t total_count = 0;
388 uint8_t logcounts[258] = { 0 };
389 uint8_t same[258] = { 0 };
390 const int table_size = 1 << log_alphabet_size;
401 dist->
freq[v2] = (1 << 12) - dist->
freq[v1];
407 dist->
freq[x] = 1 << 12;
444 if (logcounts[
i] == 13) {
450 if (logcounts[
i] > omit_log) {
451 omit_log = logcounts[
i];
455 if (omit_pos < 0 || omit_pos + 1 < dist->
alphabet_size && logcounts[omit_pos + 1] == 13)
460 num_same = same[
i] - 1;
461 prev =
i > 0 ? dist->
freq[
i - 1] : 0;
464 dist->
freq[
i] = prev;
467 if (
i == omit_pos || !logcounts[
i])
469 if (logcounts[
i] == 1) {
472 int bitcount =
FFMIN(
FFMAX(0,
shift - ((12 - logcounts[
i] + 1) >> 1)), logcounts[
i] - 1);
473 dist->
freq[
i] = (1 << (logcounts[
i] - 1)) + (
get_bitsz(gb, bitcount) << (logcounts[
i] - 1 - bitcount));
476 total_count += dist->
freq[
i];
478 dist->
freq[omit_pos] = (1 << 12) - total_count;
541 for (
int i = 0;
i < 256;
i++)
548 for (
int j =
index; j > 0; j--)
568 uint32_t bucket_size, table_size;
569 uint8_t overfull[256], underfull[256];
570 int overfull_pos = 0, underfull_pos = 0;
573 table_size = 1 << log_alphabet_size;
576 for (
int i = 0;
i < table_size;
i++) {
588 overfull[overfull_pos++] =
i;
589 else if (dist->
cutoffs[
i] < bucket_size)
590 underfull[underfull_pos++] =
i;
595 underfull[underfull_pos++] =
i;
598 while (overfull_pos) {
603 u = underfull[--underfull_pos];
604 o = overfull[--overfull_pos];
605 by = bucket_size - dist->
cutoffs[
u];
609 if (dist->
cutoffs[o] < bucket_size)
610 underfull[underfull_pos++] = o;
611 else if (dist->
cutoffs[o] > bucket_size)
612 overfull[overfull_pos++] = o;
615 for (
int i = 0;
i < table_size;
i++) {
616 if (dist->
cutoffs[
i] == bucket_size) {
630 int nsym, tree_select,
bits;
636 for (
int i = 0;
i < nsym;
i++)
647 lens[0] = 1, lens[1] = 1, lens[2] = 0, lens[3] = 0;
648 if (symbols[1] < symbols[0])
649 FFSWAP(int16_t, symbols[0], symbols[1]);
653 lens[0] = 1, lens[1] = 2, lens[2] = 2, lens[3] = 0;
654 if (symbols[2] < symbols[1])
655 FFSWAP(int16_t, symbols[1], symbols[2]);
660 lens[0] = 1, lens[1] = 2, lens[2] = 3, lens[3] = 3;
661 if (symbols[3] < symbols[2])
662 FFSWAP(int16_t, symbols[2], symbols[3]);
665 lens[0] = 2, lens[1] = 2, lens[2] = 2, lens[3] = 2;
667 if (symbols[1] < symbols[0])
668 FFSWAP(int16_t, symbols[0], symbols[1]);
669 if (symbols[3] < symbols[2])
670 FFSWAP(int16_t, symbols[2], symbols[3]);
671 if (symbols[1] <= symbols[2])
673 FFSWAP(int16_t, symbols[1], symbols[2]);
688 int8_t level1_lens[18] = { 0 };
689 int8_t level1_lens_s[18] = { 0 };
690 int16_t level1_syms[18] = { 0 };
691 uint32_t level1_codecounts[19] = { 0 };
693 int8_t *level2_lens, *level2_lens_s;
694 int16_t *level2_syms;
695 uint32_t *level2_codecounts;
697 int repeat_count_prev = 0, repeat_count_zero = 0, prev = 8;
698 int total_code = 0,
len, hskip, num_codes = 0,
ret;
700 VLC level1_vlc = { 0 };
712 level1_codecounts[0] = hskip;
713 for (
int i = hskip;
i < 18;
i++) {
719 level1_codecounts[
len]++;
721 total_code += (32 >>
len);
724 if (total_code >= 32) {
725 level1_codecounts[0] += 18 -
i - 1;
730 if (total_code != 32 && num_codes >= 2 || num_codes < 1) {
735 for (
int i = 1;
i < 19;
i++)
736 level1_codecounts[
i] += level1_codecounts[
i - 1];
738 for (
int i = 17;
i >= 0;
i--) {
739 int idx = --level1_codecounts[level1_lens[
i]];
740 level1_lens_s[idx] = level1_lens[
i];
741 level1_syms[idx] =
i;
756 level2_lens = (int8_t *)buf;
774 if (repeat_count_prev)
775 extra += 4 * (repeat_count_prev - 2) - repeat_count_prev;
777 for (
int j = 0; j < extra; j++)
778 level2_lens[
i + j] = prev;
779 total_code += (32768 >> prev) * extra;
781 repeat_count_prev += extra;
782 repeat_count_zero = 0;
783 level2_codecounts[prev] += extra;
784 }
else if (
len == 17) {
786 if (repeat_count_zero > 0)
787 extra += 8 * (repeat_count_zero - 2) - repeat_count_zero;
790 repeat_count_prev = 0;
791 repeat_count_zero += extra;
792 level2_codecounts[0] += extra;
794 level2_lens[
i] =
len;
795 repeat_count_prev = repeat_count_zero = 0;
797 total_code += (32768 >>
len);
800 level2_codecounts[
len]++;
802 if (total_code >= 32768) {
808 if (total_code != 32768 && level2_codecounts[0] < dist->
alphabet_size - 1) {
814 level2_codecounts[
i] += level2_codecounts[
i - 1];
817 int idx = --level2_codecounts[level2_lens[
i]];
818 level2_lens_s[idx] = level2_lens[
i];
819 level2_syms[idx] =
i;
930 memset(dec, 0,
sizeof(*dec));
946 uint32_t hybrid_uint;
960 if (
b1 >=
'a' && b1 <= 'z' || b1 >=
'A' &&
b1 <=
'Z')
962 else if (
b1 >=
'0' &&
b1 <=
'9' ||
b1 ==
'.' ||
b1 ==
',')
966 else if (
b1 > 1 &&
b1 < 16)
968 else if (
b1 > 240 &&
b1 < 255)
975 if (
b2 >=
'a' && b2 <= 'z' || b2 >=
'A' &&
b2 <=
'Z')
977 else if (
b2 >=
'0' &&
b2 <=
'9' ||
b2 ==
'.' ||
b2 ==
',')
986 return 1 + p1 + p2 * 8;
1052 }
else if (meta->
trc > 0) {
1053 if (meta->
trc > 45355 && meta->
trc < 45555)
1055 else if (meta->
trc > 35614 && meta->
trc < 35814)
1088 uint32_t last = 0, last2 = 0;
1090 uint64_t enc_size =
jxl_u64(gb);
1091 uint64_t output_size = 0;
1092 int out_size_shift = 0;
1094 if (!enc_size || enc_size > (1 << 22))
1120 if (out_size_shift < 63) {
1121 output_size += (
ret & UINT64_C(0x7F)) << out_size_shift;
1122 if (!(
ret & 0x80)) {
1123 out_size_shift = 63;
1125 out_size_shift += 7;
1126 if (out_size_shift > 56) {
1131 }
else if (output_size < 132) {
1147 uint64_t extensions =
jxl_u64(gb), extensions_len = 0;
1155 for (
int i = 0;
i < 64;
i++) {
1156 if (extensions & (UINT64_C(1) <<
i))
1157 extensions_len +=
jxl_u64(gb);
1162 if (extensions_len > INT_MAX ||
get_bits_left(gb) < extensions_len)
1172 int all_default, do_yCbCr = 0, num_passes = 1,
ret;
1173 int group_size_shift = 1, lf_level = 0, save_as_ref = 0;
1174 int have_crop = 0, full_frame = 1, resets_canvas = 1, upsampling = 1;
1179 uint32_t name_len, num_groups, num_lf_groups, group_dim, lf_group_dim, toc_count;
1196 upsampling =
jxl_u32(gb, 1, 2, 4, 8, 0, 0, 0, 0);
1202 group_size_shift =
get_bits(gb, 2);
1206 num_passes =
jxl_u32(gb, 1, 2, 3, 4, 0, 0, 0, 3);
1207 if (num_passes != 1) {
1208 int num_ds =
jxl_u32(gb, 0, 1, 2, 3, 0, 0, 0, 1);
1211 for (
int i = 0;
i < num_ds;
i++)
1212 jxl_u32(gb, 0, 1, 2, 0, 0, 0, 0, 3);
1221 uint32_t ux0 =
jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1222 uint32_t uy0 =
jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1226 width =
jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1228 full_frame = x0 <= 0 && y0 <= 0 && width + x0 >= meta->
coded_width
1237 jxl_u32(gb, 0, 1, 2, 3, 0, 0, 0, 2);
1259 (resets_canvas && !
frame->is_last && (!
duration || save_as_ref)
1262 name_len = 8 *
jxl_u32(gb, 0, 0, 16, 48, 0, 4, 5, 10);
1311 group_dim = 128 << group_size_shift;
1312 lf_group_dim = group_dim << 3;
1315 if (num_groups == 1 && num_passes == 1)
1318 toc_count = 2 + num_lf_groups + num_groups * num_passes;
1327 " exceeds max size of %" PRIu32
"x%" PRIu32
", aborting parser\n",
1339 if (end < 0 || end > toc_count) {
1343 for (uint32_t
i = 0;
i < end;
i++) {
1354 for (uint32_t
i = 0;
i < toc_count;
i++) {
1355 frame->body_length += 8 *
jxl_u32(gb, 0, 1024, 17408, 4211712, 10, 14, 22, 30);
1370 if (
ctx->skip > buf_size)
1374 buf_size -=
ctx->skip;
1389 size = bytestream2_get_be32(&gb);
1394 size = bytestream2_get_be64(&gb);
1400 if (size <= head_size || size > INT_MAX -
ctx->skip)
1413 const uint8_t *buf,
int buf_size)
1415 int ret, cs_buflen, header_skip;
1416 const uint8_t *cs_buffer;
1419 if (
ctx->skip > buf_size)
1423 buf_size -=
ctx->skip;
1431 ctx->collected_size =
ret;
1436 cs_buffer =
ctx->cs_buffer;
1440 cs_buflen = buf_size;
1443 if (!
ctx->codestream_length) {
1445 if (header_skip < 0)
1447 ctx->codestream_length = header_skip;
1452 return ctx->collected_size;
1460 if (!
ctx->skipped_icc &&
ctx->codestream.meta.have_icc_profile) {
1464 ctx->skipped_icc = 1;
1476 ctx->codestream_length +=
ctx->codestream.frame.total_length;
1477 if (
ctx->codestream.frame.is_last)
1478 return ctx->codestream_length / 8;
1486 const uint8_t **poutbuf,
int *poutbuf_size,
1487 const uint8_t *buf,
int buf_size)
1491 const uint8_t *pbuf =
ctx->pc.buffer;
1492 int pindex =
ctx->pc.index;
1497 if (!
ctx->pc.index) {
1498 if (
ctx->pc.overread)
1504 if ((!
ctx->container || !
ctx->codestream_length) && !
ctx->next) {
1513 if (
ctx->container &&
ctx->next >= 0) {
1524 next =
ctx->next -
ctx->pc.index;
1527 if (next > buf_size)
1535 *poutbuf_size = buf_size;
1537 ctx->codestream_length = 0;
1538 ctx->collected_size = 0;
1542 ctx->skipped_icc = 0;
1544 memset(&
ctx->codestream, 0,
sizeof(
ctx->codestream));