58 if (base->
seek(base, -4, SEEK_END) < 13) {
67 if (base->
seek(base, -5, SEEK_END) < 0 || base->
read(base, &flags, 1) != 1) {
71 bool has_checksums = (flags & 0x80);
83 uint32_t expected_frame_length = frames_num * (has_checksums ? 12 : 8) + 9;
86 off64_t frame_start_ofs = 8 + expected_frame_length;
89 off64_t seek_frame_start = base->
seek(base, -frame_start_ofs, SEEK_END);
90 if (seek_frame_start < frames_num * 8) {
98 uint32_t frame_length;
99 if (!
zstd_read_u32(base, &frame_length) || frame_length != expected_frame_length) {
107 size_t compressed_ofs = 0;
108 size_t uncompressed_ofs = 0;
109 for (
int i = 0;
i < frames_num;
i++) {
110 uint32_t compressed_size, uncompressed_size;
114 if (has_checksums && base->
seek(base, 4, SEEK_CUR) < 0) {
119 compressed_ofs += compressed_size;
120 uncompressed_ofs += uncompressed_size;
126 if (seek_frame_start != compressed_ofs || base->
seek(base, seek_frame_start, SEEK_SET) < 0) {
129 memset(&zstd->
seek, 0,
sizeof(zstd->
seek));
179 zstd->
base->
read(zstd->
base, compressed_data, compressed_size) < compressed_size)
186 size_t res = ZSTD_decompressDCtx(
187 zstd->
ctx, uncompressed_data, uncompressed_size, compressed_data, compressed_size);
189 if (ZSTD_isError(res) || res < uncompressed_size) {
196 return uncompressed_data;
static int magic(const Tex *tex, const float texvec[3], TexResult *texres)