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)
1082 uint32_t last = 0, last2 = 0;
1084 uint64_t enc_size =
jxl_u64(gb);
1085 uint64_t output_size = 0;
1086 int out_size_shift = 0;
1088 if (!enc_size || enc_size > (1 << 22))
1114 if (out_size_shift < 63) {
1115 output_size += (
ret & UINT64_C(0x7F)) << out_size_shift;
1116 if (!(
ret & 0x80)) {
1117 out_size_shift = 63;
1119 out_size_shift += 7;
1120 if (out_size_shift > 56) {
1125 }
else if (output_size < 132) {
1141 uint64_t extensions =
jxl_u64(gb), extensions_len = 0;
1149 for (
int i = 0;
i < 64;
i++) {
1150 if (extensions & (UINT64_C(1) <<
i))
1151 extensions_len +=
jxl_u64(gb);
1156 if (extensions_len > INT_MAX ||
get_bits_left(gb) < extensions_len)
1166 int all_default, do_yCbCr = 0, num_passes = 1,
ret;
1167 int group_size_shift = 1, lf_level = 0, save_as_ref = 0;
1168 int have_crop = 0, full_frame = 1, resets_canvas = 1, upsampling = 1;
1173 uint32_t name_len, num_groups, num_lf_groups, group_dim, lf_group_dim, toc_count;
1190 upsampling =
jxl_u32(gb, 1, 2, 4, 8, 0, 0, 0, 0);
1196 group_size_shift =
get_bits(gb, 2);
1200 num_passes =
jxl_u32(gb, 1, 2, 3, 4, 0, 0, 0, 3);
1201 if (num_passes != 1) {
1202 int num_ds =
jxl_u32(gb, 0, 1, 2, 3, 0, 0, 0, 1);
1205 for (
int i = 0;
i < num_ds;
i++)
1206 jxl_u32(gb, 0, 1, 2, 0, 0, 0, 0, 3);
1215 uint32_t ux0 =
jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1216 uint32_t uy0 =
jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1220 width =
jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1222 full_frame = x0 <= 0 && y0 <= 0 && width + x0 >= meta->
coded_width
1231 jxl_u32(gb, 0, 1, 2, 3, 0, 0, 0, 2);
1253 (resets_canvas && !
frame->is_last && (!
duration || save_as_ref)
1256 name_len = 8 *
jxl_u32(gb, 0, 0, 16, 48, 0, 4, 5, 10);
1305 group_dim = 128 << group_size_shift;
1306 lf_group_dim = group_dim << 3;
1309 if (num_groups == 1 && num_passes == 1)
1312 toc_count = 2 + num_lf_groups + num_groups * num_passes;
1326 if (end < 0 || end > toc_count) {
1330 for (uint32_t
i = 0;
i < end;
i++) {
1341 for (uint32_t
i = 0;
i < toc_count;
i++) {
1342 frame->body_length += 8 *
jxl_u32(gb, 0, 1024, 17408, 4211712, 10, 14, 22, 30);
1357 if (
ctx->skip > buf_size)
1361 buf_size -=
ctx->skip;
1376 size = bytestream2_get_be32(&gb);
1381 size = bytestream2_get_be64(&gb);
1387 if (size <= head_size || size > INT_MAX -
ctx->skip)
1400 const uint8_t *buf,
int buf_size)
1402 int ret, cs_buflen, header_skip;
1403 const uint8_t *cs_buffer;
1406 if (
ctx->skip > buf_size)
1410 buf_size -=
ctx->skip;
1418 ctx->collected_size =
ret;
1423 cs_buffer =
ctx->cs_buffer;
1427 cs_buflen = buf_size;
1430 if (!
ctx->codestream_length) {
1432 if (header_skip < 0)
1434 ctx->codestream_length = header_skip;
1439 return ctx->collected_size;
1447 if (!
ctx->skipped_icc &&
ctx->codestream.meta.have_icc_profile) {
1451 ctx->skipped_icc = 1;
1463 ctx->codestream_length +=
ctx->codestream.frame.total_length;
1464 if (
ctx->codestream.frame.is_last)
1465 return ctx->codestream_length / 8;
1473 const uint8_t **poutbuf,
int *poutbuf_size,
1474 const uint8_t *buf,
int buf_size)
1478 const uint8_t *pbuf =
ctx->pc.buffer;
1479 int pindex =
ctx->pc.index;
1484 if (!
ctx->pc.index) {
1485 if (
ctx->pc.overread)
1491 if ((!
ctx->container || !
ctx->codestream_length) && !
ctx->next) {
1500 if (
ctx->container &&
ctx->next >= 0) {
1511 next =
ctx->next -
ctx->pc.index;
1514 if (next > buf_size)
1522 *poutbuf_size = buf_size;
1524 ctx->codestream_length = 0;
1525 ctx->collected_size = 0;
1529 ctx->skipped_icc = 0;
1531 memset(&
ctx->codestream, 0,
sizeof(
ctx->codestream));