25 #define BITSTREAM_READER_LE
75 #define HISTORY_SIZE (64 * 1024)
81 unsigned reference_pos,
delta,
pos = 0;
86 uint8_t token = bytestream2_get_byte(gb);
87 int num_literals = token >> 4;
89 if (num_literals == 15) {
90 unsigned char current;
92 current = bytestream2_get_byte(gb);
93 if (current > INT_MAX - num_literals)
95 num_literals += current;
96 }
while (current == 255);
106 while (num_literals-- > 0) {
107 history[
pos++] = bytestream2_get_byte(gb);
118 delta = bytestream2_get_le16(gb);
121 match_length = 4 + (token & 0x0F);
122 if (match_length == 4 + 0x0F) {
126 current = bytestream2_get_byte(gb);
127 if (current > INT_MAX - match_length)
129 match_length += current;
130 }
while (current == 255);
134 if (
pos >= reference_pos + match_length || reference_pos >=
pos + match_length) {
135 memcpy(history +
pos, history + reference_pos, match_length);
138 while (match_length-- > 0)
139 history[
pos++] = history[reference_pos++];
142 while (match_length-- > 0) {
143 history[
pos++] = history[reference_pos++];
159 unsigned uncompressed_size)
164 int ylinesize, ulinesize, vlinesize, alinesize;
165 uint16_t *dsty, *dstu, *dstv, *dsta;
168 s->texture_size_x = bytestream2_get_le32(gb);
169 s->texture_size_y = bytestream2_get_le32(gb);
175 s->uv_offset_data_offset = bytestream2_get_le32(gb);
176 if (
s->uv_offset_data_offset >= UINT_MAX / 4)
178 s->uv_offset_data_offset *= 4;
179 if (
s->uv_offset_data_offset >= uncompressed_size)
182 s->y_control_data_offset = bytestream2_get_le32(gb);
183 if (
s->y_control_data_offset >= UINT_MAX / 4)
185 s->y_control_data_offset *= 4;
186 if (
s->y_control_data_offset >= uncompressed_size)
189 s->a_control_word_offset = bytestream2_get_le32(gb);
190 if (
s->a_control_word_offset >= UINT_MAX / 4)
192 s->a_control_word_offset *= 4;
193 if (
s->a_control_word_offset >= uncompressed_size)
196 s->uv_data_offset = bytestream2_get_le32(gb);
197 if (
s->uv_data_offset >= UINT_MAX / 4)
199 s->uv_data_offset *= 4;
200 if (
s->uv_data_offset >= uncompressed_size)
203 s->y_data_size = bytestream2_get_le32(gb);
204 if (
s->y_data_size >= UINT_MAX / 4)
207 s->a_data_offset = bytestream2_get_le32(gb);
208 if (
s->a_data_offset >= UINT_MAX / 4)
210 s->a_data_offset *= 4;
211 if (
s->a_data_offset >= uncompressed_size)
214 s->a_count_size = bytestream2_get_le32(gb);
215 if (
s->a_count_size >= UINT_MAX / 4)
217 s->a_count_size *= 4;
218 if (
s->a_count_size >= uncompressed_size)
221 s->data_end = bytestream2_get_le32(gb);
222 if (
s->data_end > uncompressed_size)
226 if (
s->data_end <=
s->y_data_size)
228 s->y_data_offset =
s->data_end -
s->y_data_size;
229 if (
s->y_data_offset <=
s->a_data_offset)
231 s->uv_count_offset =
s->y_data_offset -
s->a_data_offset;
244 dsty = (uint16_t *)
p->data[0];
245 dsta = (uint16_t *)
p->data[3];
246 ylinesize =
p->linesize[0] / 2;
247 alinesize =
p->linesize[3] / 2;
249 for (
int y = 0; y < avctx->
height; y += 4) {
250 const unsigned row_offset = bytestream2_get_le32(&
rgb);
257 for (
int x = 0; x < avctx->
width; x += 4) {
258 unsigned item = bytestream2_get_le32(gb);
259 unsigned y_min = item & 4095;
260 unsigned y_max = (item >> 12) & 4095;
261 unsigned y_diff = y_max - y_min;
264 control[0] = (item >> 24) & 3;
265 control[1] = (item >> 26) & 3;
266 control[2] = (item >> 28) & 3;
267 control[3] = (item >> 30) & 3;
269 for (
int i = 0;
i < 4;
i++) {
270 const int nb_bits = control[
i] + 1;
271 const int div = (1 << nb_bits) - 1;
272 const int add = div - 1;
281 dsty += 4 * ylinesize;
287 if (
s->uv_count_offset ==
s->a_control_word_offset) {
288 for (
int y = 0; y < avctx->
height; y++) {
289 for (
int x = 0; x < avctx->
width; x++)
297 for (
int y = 0; y < avctx->
height; y += 16) {
298 for (
int x = 0; x < avctx->
width; x += 16) {
299 unsigned m = bytestream2_get_le32(gb);
300 unsigned offset = bytestream2_get_le32(gb);
301 unsigned alpha0, alpha1;
304 if (
offset >= UINT_MAX / 4)
311 control = bytestream2_get_le64(&dgb);
312 alpha0 = control & 0xFF;
313 alpha1 = (control >> 8) & 0xFF;
314 control = control >> 16;
316 for (
int by = 0; by < 4; by++) {
317 for (
int bx = 0; bx < 4; bx++) {
320 for (
int i = 0;
i < 4;
i++) {
321 for (
int j = 0; j < 4; j++) {
322 dsta[x + (
i + by * 4) * alinesize + bx * 4 + j] = 0;
327 for (
int i = 0;
i < 4;
i++) {
328 for (
int j = 0; j < 4; j++) {
329 dsta[x + (
i + by * 4) * alinesize + bx * 4 + j] = 4095;
334 for (
int i = 0;
i < 4;
i++) {
335 for (
int j = 0; j < 4; j++) {
336 dsta[x + (
i + by * 4) * alinesize + bx * 4 + j] = (alpha0 + (alpha1 - alpha0) * (control & 7)) << 4;
350 dsta += 16 * alinesize;
356 dstu = (uint16_t *)
p->data[1];
357 dstv = (uint16_t *)
p->data[2];
358 ulinesize =
p->linesize[1] / 2;
359 vlinesize =
p->linesize[2] / 2;
361 for (
int y = 0; y < avctx->
height; y += 16) {
362 for (
int x = 0; x < avctx->
width; x += 16) {
363 unsigned offset = bytestream2_get_le32(&
rgb) * 4;
364 int u[16][16] = { 0 }, v[16][16] = { 0 };
365 int u0, v0, u1, v1, udif, vdif;
366 unsigned escape, is8x8, loc;
370 is8x8 = bytestream2_get_le16(&dgb);
371 escape = bytestream2_get_le16(&dgb);
373 if (escape == 0 && is8x8 == 0) {
374 u0 = bytestream2_get_byte(&dgb);
375 v0 = bytestream2_get_byte(&dgb);
376 u1 = bytestream2_get_byte(&dgb);
377 v1 = bytestream2_get_byte(&dgb);
378 loc = bytestream2_get_le32(&dgb);
379 u0 = (u0 << 4) | (u0 & 0xF);
380 v0 = (v0 << 4) | (v0 & 0xF);
381 u1 = (u1 << 4) | (u1 & 0xF);
382 v1 = (v1 << 4) | (v1 & 0xF);
386 for (
int i = 0;
i < 16;
i += 4) {
387 for (
int j = 0; j < 16; j += 4) {
388 for (
int ii = 0; ii < 4; ii++) {
389 for (
int jj = 0; jj < 4; jj++) {
390 u[
i + ii][j + jj] = u0 + ((udif * (int)(loc & 3) + 2) / 3);
391 v[
i + ii][j + jj] = v0 + ((vdif * (int)(loc & 3) + 2) / 3);
399 for (
int i = 0;
i < 16;
i += 8) {
400 for (
int j = 0; j < 16; j += 8) {
402 u0 = bytestream2_get_byte(&dgb);
403 v0 = bytestream2_get_byte(&dgb);
404 u1 = bytestream2_get_byte(&dgb);
405 v1 = bytestream2_get_byte(&dgb);
406 loc = bytestream2_get_le32(&dgb);
407 u0 = (u0 << 4) | (u0 & 0xF);
408 v0 = (v0 << 4) | (v0 & 0xF);
409 u1 = (u1 << 4) | (u1 & 0xF);
410 v1 = (v1 << 4) | (v1 & 0xF);
414 for (
int ii = 0; ii < 8; ii += 2) {
415 for (
int jj = 0; jj < 8; jj += 2) {
416 for (
int iii = 0; iii < 2; iii++) {
417 for (
int jjj = 0; jjj < 2; jjj++) {
418 u[
i + ii + iii][j + jj + jjj] = u0 + ((udif * (int)(loc & 3) + 2) / 3);
419 v[
i + ii + iii][j + jj + jjj] = v0 + ((vdif * (int)(loc & 3) + 2) / 3);
427 for (
int ii = 0; ii < 8; ii += 4) {
428 for (
int jj = 0; jj < 8; jj += 4) {
429 u0 = bytestream2_get_byte(&dgb);
430 v0 = bytestream2_get_byte(&dgb);
431 u1 = bytestream2_get_byte(&dgb);
432 v1 = bytestream2_get_byte(&dgb);
433 loc = bytestream2_get_le32(&dgb);
434 u0 = (u0 << 4) | (u0 & 0xF);
435 v0 = (v0 << 4) | (v0 & 0xF);
436 u1 = (u1 << 4) | (u1 & 0xF);
437 v1 = (v1 << 4) | (v1 & 0xF);
441 for (
int iii = 0; iii < 4; iii++) {
442 for (
int jjj = 0; jjj < 4; jjj++) {
443 u[
i + ii + iii][j + jj + jjj] = u0 + ((udif * (int)(loc & 3) + 2) / 3);
444 v[
i + ii + iii][j + jj + jjj] = v0 + ((vdif * (int)(loc & 3) + 2) / 3);
458 for (
int i = 0;
i < 16;
i++) {
459 for (
int j = 0; j < 16; j++) {
460 dstu[x +
i * ulinesize + j] =
u[
i][j];
461 dstv[x +
i * vlinesize + j] = v[
i][j];
466 dstu += 16 * ulinesize;
467 dstv += 16 * vlinesize;
479 unsigned uncompressed_size;
482 if (avpkt->
size <= 40)
487 if (bytestream2_get_le32(gb) !=
MKBETAG(
'N',
'L',
'C',
'1'))
490 uncompressed_size = bytestream2_get_le32(gb);
491 s->compressed_size = bytestream2_get_le32(gb);
492 s->format = bytestream2_get_le32(gb);
497 if (
s->format == 0) {
502 if (uncompressed_size >
s->lzf_size)
506 }
else if (
s->format == 1) {
512 if (!
s->uncompressed_buffer)
518 if (
ret != uncompressed_size)
538 s->uncompressed_size = 0;