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)
382 int len = 0,
shift, omit_log = -1, omit_pos = -1;
383 int prev = 0, num_same = 0;
384 uint32_t total_count = 0;
385 uint8_t logcounts[258] = { 0 };
386 uint8_t same[258] = { 0 };
398 dist->
freq[v2] = (1 << 12) - dist->
freq[v1];
403 dist->
freq[x] = 1 << 12;
431 if (logcounts[
i] == 13) {
437 if (logcounts[
i] > omit_log) {
438 omit_log = logcounts[
i];
442 if (omit_pos < 0 || omit_pos + 1 < dist->
alphabet_size && logcounts[omit_pos + 1] == 13)
447 num_same = same[
i] - 1;
448 prev =
i > 0 ? dist->
freq[
i - 1] : 0;
451 dist->
freq[
i] = prev;
454 if (
i == omit_pos || !logcounts[
i])
456 if (logcounts[
i] == 1) {
459 int bitcount =
FFMIN(
FFMAX(0,
shift - ((12 - logcounts[
i] + 1) >> 1)), logcounts[
i] - 1);
460 dist->
freq[
i] = (1 << (logcounts[
i] - 1)) + (
get_bitsz(gb, bitcount) << (logcounts[
i] - 1 - bitcount));
463 total_count += dist->
freq[
i];
465 dist->
freq[omit_pos] = (1 << 12) - total_count;
527 for (
int i = 0;
i < 256;
i++)
534 for (
int j =
index; j > 0; j--)
554 uint32_t bucket_size, table_size;
555 uint8_t overfull[256], underfull[256];
556 int overfull_pos = 0, underfull_pos = 0;
559 table_size = 1 << log_alphabet_size;
562 for (
int i = 0;
i < table_size;
i++) {
574 overfull[overfull_pos++] =
i;
575 else if (dist->
cutoffs[
i] < bucket_size)
576 underfull[underfull_pos++] =
i;
581 underfull[underfull_pos++] =
i;
584 while (overfull_pos) {
589 u = underfull[--underfull_pos];
590 o = overfull[--overfull_pos];
591 by = bucket_size - dist->
cutoffs[
u];
595 if (dist->
cutoffs[o] < bucket_size)
596 underfull[underfull_pos++] = o;
597 else if (dist->
cutoffs[o] > bucket_size)
598 overfull[overfull_pos++] = o;
601 for (
int i = 0;
i < table_size;
i++) {
602 if (dist->
cutoffs[
i] == bucket_size) {
616 int nsym, tree_select,
bits;
622 for (
int i = 0;
i < nsym;
i++)
633 lens[0] = 1, lens[1] = 1, lens[2] = 0, lens[3] = 0;
634 if (symbols[1] < symbols[0])
635 FFSWAP(int16_t, symbols[0], symbols[1]);
639 lens[0] = 1, lens[1] = 2, lens[2] = 2, lens[3] = 0;
640 if (symbols[2] < symbols[1])
641 FFSWAP(int16_t, symbols[1], symbols[2]);
646 lens[0] = 1, lens[1] = 2, lens[2] = 3, lens[3] = 3;
647 if (symbols[3] < symbols[2])
648 FFSWAP(int16_t, symbols[2], symbols[3]);
651 lens[0] = 2, lens[1] = 2, lens[2] = 2, lens[3] = 2;
653 if (symbols[1] < symbols[0])
654 FFSWAP(int16_t, symbols[0], symbols[1]);
655 if (symbols[3] < symbols[2])
656 FFSWAP(int16_t, symbols[2], symbols[3]);
657 if (symbols[1] <= symbols[2])
659 FFSWAP(int16_t, symbols[1], symbols[2]);
674 int8_t level1_lens[18] = { 0 };
675 int8_t level1_lens_s[18] = { 0 };
676 int16_t level1_syms[18] = { 0 };
677 uint32_t level1_codecounts[19] = { 0 };
679 int8_t *level2_lens, *level2_lens_s;
680 int16_t *level2_syms;
681 uint32_t *level2_codecounts;
683 int repeat_count_prev = 0, repeat_count_zero = 0, prev = 8;
684 int total_code = 0,
len, hskip, num_codes = 0,
ret;
686 VLC level1_vlc = { 0 };
698 level1_codecounts[0] = hskip;
699 for (
int i = hskip;
i < 18;
i++) {
701 level1_codecounts[
len]++;
703 total_code += (32 >>
len);
706 if (total_code >= 32) {
707 level1_codecounts[0] += 18 -
i - 1;
712 if (total_code != 32 && num_codes >= 2 || num_codes < 1) {
717 for (
int i = 1;
i < 19;
i++)
718 level1_codecounts[
i] += level1_codecounts[
i - 1];
720 for (
int i = 17;
i >= 0;
i--) {
721 int idx = --level1_codecounts[level1_lens[
i]];
722 level1_lens_s[idx] = level1_lens[
i];
723 level1_syms[idx] =
i;
738 level2_lens = (int8_t *)buf;
752 if (repeat_count_prev)
753 extra += 4 * (repeat_count_prev - 2) - repeat_count_prev;
755 for (
int j = 0; j < extra; j++)
756 level2_lens[
i + j] = prev;
757 total_code += (32768 >> prev) * extra;
759 repeat_count_prev += extra;
760 repeat_count_zero = 0;
761 level2_codecounts[prev] += extra;
762 }
else if (
len == 17) {
764 if (repeat_count_zero > 0)
765 extra += 8 * (repeat_count_zero - 2) - repeat_count_zero;
768 repeat_count_prev = 0;
769 repeat_count_zero += extra;
770 level2_codecounts[0] += extra;
772 level2_lens[
i] =
len;
773 repeat_count_prev = repeat_count_zero = 0;
775 total_code += (32768 >>
len);
778 level2_codecounts[
len]++;
780 if (total_code >= 32768) {
786 if (total_code != 32768 && level2_codecounts[0] < dist->
alphabet_size - 1) {
792 level2_codecounts[
i] += level2_codecounts[
i - 1];
795 int idx = --level2_codecounts[level2_lens[
i]];
796 level2_lens_s[idx] = level2_lens[
i];
797 level2_syms[idx] =
i;
908 memset(dec, 0,
sizeof(*dec));
924 uint32_t hybrid_uint;
938 if (
b1 >=
'a' && b1 <= 'z' || b1 >=
'A' &&
b1 <=
'Z')
940 else if (
b1 >=
'0' &&
b1 <=
'9' ||
b1 ==
'.' ||
b1 ==
',')
944 else if (
b1 > 1 &&
b1 < 16)
946 else if (
b1 > 240 &&
b1 < 255)
953 if (
b2 >=
'a' && b2 <= 'z' || b2 >=
'A' &&
b2 <=
'Z')
955 else if (
b2 >=
'0' &&
b2 <=
'9' ||
b2 ==
'.' ||
b2 ==
',')
964 return 1 + p1 + p2 * 8;
1030 }
else if (meta->
trc > 0) {
1031 if (meta->
trc > 45355 && meta->
trc < 45555)
1033 else if (meta->
trc > 35614 && meta->
trc < 35814)
1061 uint32_t last = 0, last2 = 0;
1063 uint64_t enc_size =
jxl_u64(gb);
1064 uint64_t output_size = 0;
1065 int out_size_shift = 0;
1067 if (!enc_size || enc_size > (1 << 22))
1093 if (out_size_shift < 63) {
1094 output_size += (
ret & UINT64_C(0x7F)) << out_size_shift;
1095 if (!(
ret & 0x80)) {
1096 out_size_shift = 63;
1098 out_size_shift += 7;
1099 if (out_size_shift > 56) {
1104 }
else if (output_size < 132) {
1120 uint64_t extensions =
jxl_u64(gb), extensions_len = 0;
1128 for (
int i = 0;
i < 64;
i++) {
1129 if (extensions & (UINT64_C(1) <<
i))
1130 extensions_len +=
jxl_u64(gb);
1135 if (extensions_len > INT_MAX ||
get_bits_left(gb) < extensions_len)
1145 int all_default, do_yCbCr = 0, num_passes = 1,
ret;
1146 int group_size_shift = 1, lf_level = 0, save_as_ref = 0;
1147 int have_crop = 0, full_frame = 1, resets_canvas = 1, upsampling = 1;
1152 uint32_t name_len, num_groups, num_lf_groups, group_dim, lf_group_dim, toc_count;
1169 upsampling =
jxl_u32(gb, 1, 2, 4, 8, 0, 0, 0, 0);
1175 group_size_shift =
get_bits(gb, 2);
1179 num_passes =
jxl_u32(gb, 1, 2, 3, 4, 0, 0, 0, 3);
1180 if (num_passes != 1) {
1181 int num_ds =
jxl_u32(gb, 0, 1, 2, 3, 0, 0, 0, 1);
1184 for (
int i = 0;
i < num_ds;
i++)
1185 jxl_u32(gb, 0, 1, 2, 0, 0, 0, 0, 3);
1194 uint32_t ux0 =
jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1195 uint32_t uy0 =
jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1199 width =
jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1201 full_frame = x0 <= 0 && y0 <= 0 && width + x0 >= meta->
coded_width
1210 jxl_u32(gb, 0, 1, 2, 3, 0, 0, 0, 2);
1232 (resets_canvas && !
frame->is_last && (!
duration || save_as_ref)
1235 name_len = 8 *
jxl_u32(gb, 0, 0, 16, 48, 0, 4, 5, 10);
1284 group_dim = 128 << group_size_shift;
1285 lf_group_dim = group_dim << 3;
1288 if (num_groups == 1 && num_passes == 1)
1291 toc_count = 2 + num_lf_groups + num_groups * num_passes;
1296 uint32_t end, lehmer = 0;
1305 if (end > toc_count) {
1309 for (uint32_t
i = 0;
i < end;
i++) {
1320 for (uint32_t
i = 0;
i < toc_count;
i++) {
1321 frame->body_length += 8 *
jxl_u32(gb, 0, 1024, 17408, 4211712, 10, 14, 22, 30);
1336 if (
ctx->skip > buf_size)
1340 buf_size -=
ctx->skip;
1355 size = bytestream2_get_be32(&gb);
1359 size = bytestream2_get_be64(&gb);
1365 if (size <= head_size + 4 || size > INT_MAX -
ctx->skip)
1378 const uint8_t *buf,
int buf_size)
1380 int ret, cs_buflen, header_skip;
1381 const uint8_t *cs_buffer;
1384 if (
ctx->skip > buf_size)
1388 buf_size -=
ctx->skip;
1393 sizeof(
ctx->cs_buffer), &
ctx->copied);
1396 ctx->collected_size =
ret;
1401 cs_buffer =
ctx->cs_buffer;
1402 cs_buflen =
FFMIN(
sizeof(
ctx->cs_buffer),
ctx->copied);
1405 cs_buflen = buf_size;
1408 if (!
ctx->codestream_length) {
1410 if (header_skip < 0)
1412 ctx->codestream_length = header_skip;
1417 return ctx->collected_size;
1425 if (!
ctx->skipped_icc &&
ctx->codestream.meta.have_icc_profile) {
1429 ctx->skipped_icc = 1;
1441 ctx->codestream_length +=
ctx->codestream.frame.total_length;
1442 if (
ctx->codestream.frame.is_last)
1443 return ctx->codestream_length / 8;
1451 const uint8_t **poutbuf,
int *poutbuf_size,
1452 const uint8_t *buf,
int buf_size)
1463 if ((!
ctx->container || !
ctx->codestream_length) && !
ctx->next) {
1472 if (
ctx->container &&
ctx->next >= 0) {
1483 next =
ctx->next -
ctx->pc.index;
1486 if (next > buf_size)
1494 *poutbuf_size = buf_size;
1496 ctx->codestream_length = 0;
1497 ctx->collected_size = 0;
1501 ctx->skipped_icc = 0;
1503 memset(&
ctx->codestream, 0,
sizeof(
ctx->codestream));