FFmpeg
exr.c
Go to the documentation of this file.
1 /*
2  * OpenEXR (.exr) image decoder
3  * Copyright (c) 2006 Industrial Light & Magic, a division of Lucas Digital Ltd. LLC
4  * Copyright (c) 2009 Jimmy Christensen
5  *
6  * B44/B44A, Tile, UINT32 added by Jokyo Images support by CNC - French National Center for Cinema
7  *
8  * This file is part of FFmpeg.
9  *
10  * FFmpeg is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public
12  * License as published by the Free Software Foundation; either
13  * version 2.1 of the License, or (at your option) any later version.
14  *
15  * FFmpeg is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with FFmpeg; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23  */
24 
25 /**
26  * @file
27  * OpenEXR decoder
28  * @author Jimmy Christensen
29  *
30  * For more information on the OpenEXR format, visit:
31  * http://openexr.com/
32  */
33 
34 #include <float.h>
35 #include <zlib.h>
36 
37 #include "libavutil/avassert.h"
38 #include "libavutil/common.h"
39 #include "libavutil/csp.h"
40 #include "libavutil/imgutils.h"
41 #include "libavutil/intfloat.h"
42 #include "libavutil/avstring.h"
43 #include "libavutil/mem.h"
44 #include "libavutil/opt.h"
45 #include "libavutil/float2half.h"
46 #include "libavutil/half2float.h"
47 
48 #include "avcodec.h"
49 #include "bytestream.h"
50 
51 #if HAVE_BIGENDIAN
52 #include "bswapdsp.h"
53 #endif
54 
55 #include "codec_internal.h"
56 #include "decode.h"
57 #include "exrdsp.h"
58 #include "get_bits.h"
59 #include "mathops.h"
60 #include "thread.h"
61 
62 enum ExrCompr {
74 };
75 
81 };
82 
88 };
89 
94 };
95 
96 typedef struct HuffEntry {
97  uint8_t len;
98  uint16_t sym;
99  uint32_t code;
100 } HuffEntry;
101 
102 typedef struct EXRChannel {
103  int xsub, ysub;
105 } EXRChannel;
106 
107 typedef struct EXRTileAttribute {
113 
114 typedef struct EXRThreadData {
117 
118  uint8_t *tmp;
119  int tmp_size;
120 
121  uint8_t *bitmap;
122  uint16_t *lut;
123 
124  uint8_t *ac_data;
125  unsigned ac_size;
126 
127  uint8_t *dc_data;
128  unsigned dc_size;
129 
130  uint8_t *rle_data;
131  unsigned rle_size;
132 
133  uint8_t *rle_raw_data;
134  unsigned rle_raw_size;
135 
136  float block[3][64];
137 
138  int ysize, xsize;
139 
141 
142  int run_sym;
144  uint64_t *freq;
146 } EXRThreadData;
147 
148 typedef struct EXRContext {
149  AVClass *class;
153 
154 #if HAVE_BIGENDIAN
155  BswapDSPContext bbdsp;
156 #endif
157 
160  int channel_offsets[4]; // 0 = red, 1 = green, 2 = blue and 3 = alpha
162 
163  int w, h;
164  uint32_t sar;
167  uint32_t xdelta, ydelta;
168 
170 
171  EXRTileAttribute tile_attr; /* header data attribute of tile */
172  int is_tile; /* 0 if scanline, 1 if tile */
175 
176  int is_luma;/* 1 if there is an Y plane */
177 
178 #define M(chr) (1<<chr - 'A')
179  int has_channel; ///< combination of flags representing the channel codes A-Z
180 
182  const uint8_t *buf;
183  int buf_size;
184 
188  uint32_t chunk_count;
189 
191 
192  const char *layer;
194 
195 
196  uint8_t *offset_table;
197 
198 #if FF_API_EXR_GAMMA
200  float gamma;
201  uint16_t gamma_table[65536];
202 #endif
203 
206 } EXRContext;
207 
208 static int zip_uncompress(const EXRContext *s, const uint8_t *src, int compressed_size,
209  int uncompressed_size, EXRThreadData *td)
210 {
211  unsigned long dest_len = uncompressed_size;
212 
213  if (uncompress(td->tmp, &dest_len, src, compressed_size) != Z_OK ||
214  dest_len != uncompressed_size)
215  return AVERROR_INVALIDDATA;
216 
217  av_assert1(uncompressed_size % 2 == 0);
218 
219  s->dsp.predictor(td->tmp, uncompressed_size);
220  s->dsp.reorder_pixels(td->uncompressed_data, td->tmp, uncompressed_size);
221 
222  return 0;
223 }
224 
225 static int rle(uint8_t *dst, const uint8_t *src,
226  int compressed_size, int uncompressed_size)
227 {
228  uint8_t *d = dst;
229  const int8_t *s = src;
230  int ssize = compressed_size;
231  int dsize = uncompressed_size;
232  uint8_t *dend = d + dsize;
233  int count;
234 
235  while (ssize > 0) {
236  count = *s++;
237 
238  if (count < 0) {
239  count = -count;
240 
241  if ((dsize -= count) < 0 ||
242  (ssize -= count + 1) < 0)
243  return AVERROR_INVALIDDATA;
244 
245  while (count--)
246  *d++ = *s++;
247  } else {
248  count++;
249 
250  if ((dsize -= count) < 0 ||
251  (ssize -= 2) < 0)
252  return AVERROR_INVALIDDATA;
253 
254  while (count--)
255  *d++ = *s;
256 
257  s++;
258  }
259  }
260 
261  if (dend != d)
262  return AVERROR_INVALIDDATA;
263 
264  return 0;
265 }
266 
267 static int rle_uncompress(const EXRContext *ctx, const uint8_t *src, int compressed_size,
268  int uncompressed_size, EXRThreadData *td)
269 {
270  int ret = rle(td->tmp, src, compressed_size, uncompressed_size);
271  if (ret < 0)
272  return ret;
273 
274  av_assert1(uncompressed_size % 2 == 0);
275 
276  ctx->dsp.predictor(td->tmp, uncompressed_size);
277  ctx->dsp.reorder_pixels(td->uncompressed_data, td->tmp, uncompressed_size);
278 
279  return 0;
280 }
281 
282 #define USHORT_RANGE (1 << 16)
283 #define BITMAP_SIZE (1 << 13)
284 
285 static uint16_t reverse_lut(const uint8_t *bitmap, uint16_t *lut)
286 {
287  int i, k = 0;
288 
289  for (i = 0; i < USHORT_RANGE; i++)
290  if ((i == 0) || (bitmap[i >> 3] & (1 << (i & 7))))
291  lut[k++] = i;
292 
293  i = k - 1;
294 
295  memset(lut + k, 0, (USHORT_RANGE - k) * 2);
296 
297  return i;
298 }
299 
300 static void apply_lut(const uint16_t *lut, uint16_t *dst, int dsize)
301 {
302  int i;
303 
304  for (i = 0; i < dsize; ++i)
305  dst[i] = lut[dst[i]];
306 }
307 
308 #define HUF_ENCBITS 16 // literal (value) bit length
309 #define HUF_ENCSIZE ((1 << HUF_ENCBITS) + 1) // encoding table size
310 
311 static void huf_canonical_code_table(uint64_t *freq)
312 {
313  uint64_t c, n[59] = { 0 };
314  int i;
315 
316  for (i = 0; i < HUF_ENCSIZE; i++)
317  n[freq[i]] += 1;
318 
319  c = 0;
320  for (i = 58; i > 0; --i) {
321  uint64_t nc = ((c + n[i]) >> 1);
322  n[i] = c;
323  c = nc;
324  }
325 
326  for (i = 0; i < HUF_ENCSIZE; ++i) {
327  int l = freq[i];
328 
329  if (l > 0)
330  freq[i] = l | (n[l]++ << 6);
331  }
332 }
333 
334 #define SHORT_ZEROCODE_RUN 59
335 #define LONG_ZEROCODE_RUN 63
336 #define SHORTEST_LONG_RUN (2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN)
337 #define LONGEST_LONG_RUN (255 + SHORTEST_LONG_RUN)
338 
340  int32_t im, int32_t iM, uint64_t *freq)
341 {
342  GetBitContext gbit;
343  int ret = init_get_bits8(&gbit, gb->buffer, bytestream2_get_bytes_left(gb));
344  if (ret < 0)
345  return ret;
346 
347  for (; im <= iM; im++) {
348  int l;
349  if (get_bits_left(&gbit) < 6)
350  return AVERROR_INVALIDDATA;
351  l = freq[im] = get_bits(&gbit, 6);
352 
353  if (l == LONG_ZEROCODE_RUN) {
354  int zerun = get_bits(&gbit, 8) + SHORTEST_LONG_RUN;
355 
356  if (im + zerun > iM + 1)
357  return AVERROR_INVALIDDATA;
358 
359  while (zerun--)
360  freq[im++] = 0;
361 
362  im--;
363  } else if (l >= SHORT_ZEROCODE_RUN) {
364  int zerun = l - SHORT_ZEROCODE_RUN + 2;
365 
366  if (im + zerun > iM + 1)
367  return AVERROR_INVALIDDATA;
368 
369  while (zerun--)
370  freq[im++] = 0;
371 
372  im--;
373  }
374  }
375 
376  bytestream2_skip(gb, (get_bits_count(&gbit) + 7) / 8);
378 
379  return 0;
380 }
381 
382 static int huf_build_dec_table(const EXRContext *s,
383  EXRThreadData *td, int im, int iM)
384 {
385  int j = 0;
386 
387  td->run_sym = -1;
388  for (int i = im; i < iM; i++) {
389  td->he[j].sym = i;
390  td->he[j].len = td->freq[i] & 63;
391  td->he[j].code = td->freq[i] >> 6;
392  if (td->he[j].len > 32) {
393  avpriv_request_sample(s->avctx, "Too big code length");
394  return AVERROR_PATCHWELCOME;
395  }
396  if (td->he[j].len > 0)
397  j++;
398  else
399  td->run_sym = i;
400  }
401 
402  if (im > 0)
403  td->run_sym = 0;
404  else if (iM < 65535)
405  td->run_sym = 65535;
406 
407  if (td->run_sym == -1) {
408  avpriv_request_sample(s->avctx, "No place for run symbol");
409  return AVERROR_PATCHWELCOME;
410  }
411 
412  td->he[j].sym = td->run_sym;
413  td->he[j].len = td->freq[iM] & 63;
414  if (td->he[j].len > 32) {
415  avpriv_request_sample(s->avctx, "Too big code length");
416  return AVERROR_PATCHWELCOME;
417  }
418  td->he[j].code = td->freq[iM] >> 6;
419  j++;
420 
421  ff_vlc_free(&td->vlc);
422  return ff_vlc_init_sparse(&td->vlc, 12, j,
423  &td->he[0].len, sizeof(td->he[0]), sizeof(td->he[0].len),
424  &td->he[0].code, sizeof(td->he[0]), sizeof(td->he[0].code),
425  &td->he[0].sym, sizeof(td->he[0]), sizeof(td->he[0].sym), 0);
426 }
427 
428 static int huf_decode(VLC *vlc, GetByteContext *gb, int nbits, int run_sym,
429  int no, uint16_t *out)
430 {
431  GetBitContext gbit;
432  int oe = 0;
433 
434  init_get_bits(&gbit, gb->buffer, nbits);
435  while (get_bits_left(&gbit) > 0 && oe < no) {
436  uint16_t x = get_vlc2(&gbit, vlc->table, 12, 3);
437 
438  if (x == run_sym) {
439  int run = get_bits(&gbit, 8);
440  uint16_t fill;
441 
442  if (oe == 0 || oe + run > no)
443  return AVERROR_INVALIDDATA;
444 
445  fill = out[oe - 1];
446 
447  while (run-- > 0)
448  out[oe++] = fill;
449  } else {
450  out[oe++] = x;
451  }
452  }
453 
454  return 0;
455 }
456 
457 static int huf_uncompress(const EXRContext *s,
458  EXRThreadData *td,
459  GetByteContext *gb,
460  uint16_t *dst, int dst_size)
461 {
462  int32_t im, iM;
463  uint32_t nBits;
464  int ret;
465 
466  im = bytestream2_get_le32(gb);
467  iM = bytestream2_get_le32(gb);
468  bytestream2_skip(gb, 4);
469  nBits = bytestream2_get_le32(gb);
470  if (im < 0 || im >= HUF_ENCSIZE ||
471  iM < 0 || iM >= HUF_ENCSIZE)
472  return AVERROR_INVALIDDATA;
473 
474  bytestream2_skip(gb, 4);
475 
476  if (!td->freq)
477  td->freq = av_malloc_array(HUF_ENCSIZE, sizeof(*td->freq));
478  if (!td->he)
479  td->he = av_calloc(HUF_ENCSIZE, sizeof(*td->he));
480  if (!td->freq || !td->he) {
481  ret = AVERROR(ENOMEM);
482  return ret;
483  }
484 
485  memset(td->freq, 0, sizeof(*td->freq) * HUF_ENCSIZE);
486  if ((ret = huf_unpack_enc_table(gb, im, iM, td->freq)) < 0)
487  return ret;
488 
489  if (nBits > 8 * bytestream2_get_bytes_left(gb)) {
491  return ret;
492  }
493 
494  if ((ret = huf_build_dec_table(s, td, im, iM)) < 0)
495  return ret;
496  return huf_decode(&td->vlc, gb, nBits, td->run_sym, dst_size, dst);
497 }
498 
499 static inline void wdec14(uint16_t l, uint16_t h, uint16_t *a, uint16_t *b)
500 {
501  int16_t ls = l;
502  int16_t hs = h;
503  int hi = hs;
504  int ai = ls + (hi & 1) + (hi >> 1);
505  int16_t as = ai;
506  int16_t bs = ai - hi;
507 
508  *a = as;
509  *b = bs;
510 }
511 
512 #define NBITS 16
513 #define A_OFFSET (1 << (NBITS - 1))
514 #define MOD_MASK ((1 << NBITS) - 1)
515 
516 static inline void wdec16(uint16_t l, uint16_t h, uint16_t *a, uint16_t *b)
517 {
518  int m = l;
519  int d = h;
520  int bb = (m - (d >> 1)) & MOD_MASK;
521  int aa = (d + bb - A_OFFSET) & MOD_MASK;
522  *b = bb;
523  *a = aa;
524 }
525 
526 static void wav_decode(uint16_t *in, int nx, int ox,
527  int ny, int oy, uint16_t mx)
528 {
529  int w14 = (mx < (1 << 14));
530  int n = (nx > ny) ? ny : nx;
531  int p = 1;
532  int p2;
533 
534  while (p <= n)
535  p <<= 1;
536 
537  p >>= 1;
538  p2 = p;
539  p >>= 1;
540 
541  while (p >= 1) {
542  uint16_t *py = in;
543  uint16_t *ey = in + oy * (ny - p2);
544  uint16_t i00, i01, i10, i11;
545  int oy1 = oy * p;
546  int oy2 = oy * p2;
547  int ox1 = ox * p;
548  int ox2 = ox * p2;
549 
550  for (; py <= ey; py += oy2) {
551  uint16_t *px = py;
552  uint16_t *ex = py + ox * (nx - p2);
553 
554  for (; px <= ex; px += ox2) {
555  uint16_t *p01 = px + ox1;
556  uint16_t *p10 = px + oy1;
557  uint16_t *p11 = p10 + ox1;
558 
559  if (w14) {
560  wdec14(*px, *p10, &i00, &i10);
561  wdec14(*p01, *p11, &i01, &i11);
562  wdec14(i00, i01, px, p01);
563  wdec14(i10, i11, p10, p11);
564  } else {
565  wdec16(*px, *p10, &i00, &i10);
566  wdec16(*p01, *p11, &i01, &i11);
567  wdec16(i00, i01, px, p01);
568  wdec16(i10, i11, p10, p11);
569  }
570  }
571 
572  if (nx & p) {
573  uint16_t *p10 = px + oy1;
574 
575  if (w14)
576  wdec14(*px, *p10, &i00, p10);
577  else
578  wdec16(*px, *p10, &i00, p10);
579 
580  *px = i00;
581  }
582  }
583 
584  if (ny & p) {
585  uint16_t *px = py;
586  uint16_t *ex = py + ox * (nx - p2);
587 
588  for (; px <= ex; px += ox2) {
589  uint16_t *p01 = px + ox1;
590 
591  if (w14)
592  wdec14(*px, *p01, &i00, p01);
593  else
594  wdec16(*px, *p01, &i00, p01);
595 
596  *px = i00;
597  }
598  }
599 
600  p2 = p;
601  p >>= 1;
602  }
603 }
604 
605 static int piz_uncompress(const EXRContext *s, const uint8_t *src, int ssize,
606  int dsize, EXRThreadData *td)
607 {
608  GetByteContext gb;
609  uint16_t maxval, min_non_zero, max_non_zero;
610  uint16_t *ptr;
611  uint16_t *tmp = (uint16_t *)td->tmp;
612  uint16_t *out;
613  uint16_t *in;
614  int ret, i, j;
615  int pixel_half_size;/* 1 for half, 2 for float and uint32 */
617  int tmp_offset;
618 
619  if (!td->bitmap)
621  if (!td->lut)
622  td->lut = av_malloc(1 << 17);
623  if (!td->bitmap || !td->lut) {
624  av_freep(&td->bitmap);
625  av_freep(&td->lut);
626  return AVERROR(ENOMEM);
627  }
628 
629  bytestream2_init(&gb, src, ssize);
630  min_non_zero = bytestream2_get_le16(&gb);
631  max_non_zero = bytestream2_get_le16(&gb);
632 
633  if (max_non_zero >= BITMAP_SIZE)
634  return AVERROR_INVALIDDATA;
635 
636  memset(td->bitmap, 0, FFMIN(min_non_zero, BITMAP_SIZE));
637  if (min_non_zero <= max_non_zero)
638  bytestream2_get_buffer(&gb, td->bitmap + min_non_zero,
639  max_non_zero - min_non_zero + 1);
640  memset(td->bitmap + max_non_zero + 1, 0, BITMAP_SIZE - max_non_zero - 1);
641 
642  if (bytestream2_get_bytes_left(&gb) < 4)
643  return AVERROR_INVALIDDATA;
644 
645  maxval = reverse_lut(td->bitmap, td->lut);
646 
647  bytestream2_skip(&gb, 4);
648  ret = huf_uncompress(s, td, &gb, tmp, dsize / sizeof(uint16_t));
649  if (ret)
650  return ret;
651 
652  ptr = tmp;
653  for (i = 0; i < s->nb_channels; i++) {
654  channel = &s->channels[i];
655 
656  if (channel->pixel_type == EXR_HALF)
657  pixel_half_size = 1;
658  else
659  pixel_half_size = 2;
660 
661  for (j = 0; j < pixel_half_size; j++)
662  wav_decode(ptr + j, td->xsize, pixel_half_size, td->ysize,
663  td->xsize * pixel_half_size, maxval);
664  ptr += td->xsize * td->ysize * pixel_half_size;
665  }
666 
667  apply_lut(td->lut, tmp, dsize / sizeof(uint16_t));
668 
669  out = (uint16_t *)td->uncompressed_data;
670  for (i = 0; i < td->ysize; i++) {
671  tmp_offset = 0;
672  for (j = 0; j < s->nb_channels; j++) {
673  channel = &s->channels[j];
674  if (channel->pixel_type == EXR_HALF)
675  pixel_half_size = 1;
676  else
677  pixel_half_size = 2;
678 
679  in = tmp + tmp_offset * td->xsize * td->ysize + i * td->xsize * pixel_half_size;
680  tmp_offset += pixel_half_size;
681 
682 #if HAVE_BIGENDIAN
683  s->bbdsp.bswap16_buf(out, in, td->xsize * pixel_half_size);
684 #else
685  memcpy(out, in, td->xsize * 2 * pixel_half_size);
686 #endif
687  out += td->xsize * pixel_half_size;
688  }
689  }
690 
691  return 0;
692 }
693 
694 static int pxr24_uncompress(const EXRContext *s, const uint8_t *src,
695  int compressed_size, int uncompressed_size,
696  EXRThreadData *td)
697 {
698  unsigned long dest_len, expected_len = 0;
699  const uint8_t *in = td->tmp;
700  uint8_t *out;
701  int c, i, j;
702 
703  for (i = 0; i < s->nb_channels; i++) {
704  if (s->channels[i].pixel_type == EXR_FLOAT) {
705  expected_len += (td->xsize * td->ysize * 3);/* PRX 24 store float in 24 bit instead of 32 */
706  } else if (s->channels[i].pixel_type == EXR_HALF) {
707  expected_len += (td->xsize * td->ysize * 2);
708  } else {//UINT 32
709  expected_len += (td->xsize * td->ysize * 4);
710  }
711  }
712 
713  dest_len = expected_len;
714 
715  if (uncompress(td->tmp, &dest_len, src, compressed_size) != Z_OK) {
716  return AVERROR_INVALIDDATA;
717  } else if (dest_len != expected_len) {
718  return AVERROR_INVALIDDATA;
719  }
720 
721  out = td->uncompressed_data;
722  for (i = 0; i < td->ysize; i++)
723  for (c = 0; c < s->nb_channels; c++) {
724  EXRChannel *channel = &s->channels[c];
725  const uint8_t *ptr[4];
726  uint32_t pixel = 0;
727 
728  switch (channel->pixel_type) {
729  case EXR_FLOAT:
730  ptr[0] = in;
731  ptr[1] = ptr[0] + td->xsize;
732  ptr[2] = ptr[1] + td->xsize;
733  in = ptr[2] + td->xsize;
734 
735  for (j = 0; j < td->xsize; ++j) {
736  uint32_t diff = ((unsigned)*(ptr[0]++) << 24) |
737  (*(ptr[1]++) << 16) |
738  (*(ptr[2]++) << 8);
739  pixel += diff;
740  bytestream_put_le32(&out, pixel);
741  }
742  break;
743  case EXR_HALF:
744  ptr[0] = in;
745  ptr[1] = ptr[0] + td->xsize;
746  in = ptr[1] + td->xsize;
747  for (j = 0; j < td->xsize; j++) {
748  uint32_t diff = (*(ptr[0]++) << 8) | *(ptr[1]++);
749 
750  pixel += diff;
751  bytestream_put_le16(&out, pixel);
752  }
753  break;
754  case EXR_UINT:
755  ptr[0] = in;
756  ptr[1] = ptr[0] + td->xsize;
757  ptr[2] = ptr[1] + td->xsize;
758  ptr[3] = ptr[2] + td->xsize;
759  in = ptr[3] + td->xsize;
760 
761  for (j = 0; j < td->xsize; ++j) {
762  uint32_t diff = ((uint32_t)*(ptr[0]++) << 24) |
763  (*(ptr[1]++) << 16) |
764  (*(ptr[2]++) << 8 ) |
765  (*(ptr[3]++));
766  pixel += diff;
767  bytestream_put_le32(&out, pixel);
768  }
769  break;
770  default:
771  return AVERROR_INVALIDDATA;
772  }
773  }
774 
775  return 0;
776 }
777 
778 static void unpack_14(const uint8_t b[14], uint16_t s[16])
779 {
780  uint16_t shift = (b[ 2] >> 2) & 15;
781  uint16_t bias = (0x20 << shift);
782  int i;
783 
784  s[ 0] = (b[0] << 8) | b[1];
785 
786  s[ 4] = s[ 0] + ((((b[ 2] << 4) | (b[ 3] >> 4)) & 0x3f) << shift) - bias;
787  s[ 8] = s[ 4] + ((((b[ 3] << 2) | (b[ 4] >> 6)) & 0x3f) << shift) - bias;
788  s[12] = s[ 8] + ((b[ 4] & 0x3f) << shift) - bias;
789 
790  s[ 1] = s[ 0] + ((b[ 5] >> 2) << shift) - bias;
791  s[ 5] = s[ 4] + ((((b[ 5] << 4) | (b[ 6] >> 4)) & 0x3f) << shift) - bias;
792  s[ 9] = s[ 8] + ((((b[ 6] << 2) | (b[ 7] >> 6)) & 0x3f) << shift) - bias;
793  s[13] = s[12] + ((b[ 7] & 0x3f) << shift) - bias;
794 
795  s[ 2] = s[ 1] + ((b[ 8] >> 2) << shift) - bias;
796  s[ 6] = s[ 5] + ((((b[ 8] << 4) | (b[ 9] >> 4)) & 0x3f) << shift) - bias;
797  s[10] = s[ 9] + ((((b[ 9] << 2) | (b[10] >> 6)) & 0x3f) << shift) - bias;
798  s[14] = s[13] + ((b[10] & 0x3f) << shift) - bias;
799 
800  s[ 3] = s[ 2] + ((b[11] >> 2) << shift) - bias;
801  s[ 7] = s[ 6] + ((((b[11] << 4) | (b[12] >> 4)) & 0x3f) << shift) - bias;
802  s[11] = s[10] + ((((b[12] << 2) | (b[13] >> 6)) & 0x3f) << shift) - bias;
803  s[15] = s[14] + ((b[13] & 0x3f) << shift) - bias;
804 
805  for (i = 0; i < 16; ++i) {
806  if (s[i] & 0x8000)
807  s[i] &= 0x7fff;
808  else
809  s[i] = ~s[i];
810  }
811 }
812 
813 static void unpack_3(const uint8_t b[3], uint16_t s[16])
814 {
815  int i;
816 
817  s[0] = (b[0] << 8) | b[1];
818 
819  if (s[0] & 0x8000)
820  s[0] &= 0x7fff;
821  else
822  s[0] = ~s[0];
823 
824  for (i = 1; i < 16; i++)
825  s[i] = s[0];
826 }
827 
828 
829 static int b44_uncompress(const EXRContext *s, const uint8_t *src, int compressed_size,
830  int uncompressed_size, EXRThreadData *td) {
831  const int8_t *sr = src;
832  int stay_to_uncompress = compressed_size;
833  int nb_b44_block_w, nb_b44_block_h;
834  int index_tl_x, index_tl_y, index_out, index_tmp;
835  uint16_t tmp_buffer[16]; /* B44 use 4x4 half float pixel */
836  int c, iY, iX, y, x;
837  int target_channel_offset = 0;
838 
839  /* calc B44 block count */
840  nb_b44_block_w = td->xsize / 4;
841  if ((td->xsize % 4) != 0)
842  nb_b44_block_w++;
843 
844  nb_b44_block_h = td->ysize / 4;
845  if ((td->ysize % 4) != 0)
846  nb_b44_block_h++;
847 
848  for (c = 0; c < s->nb_channels; c++) {
849  if (s->channels[c].pixel_type == EXR_HALF) {/* B44 only compress half float data */
850  for (iY = 0; iY < nb_b44_block_h; iY++) {
851  for (iX = 0; iX < nb_b44_block_w; iX++) {/* For each B44 block */
852  if (stay_to_uncompress < 3)
853  return AVERROR_INVALIDDATA;
854 
855  if (src[compressed_size - stay_to_uncompress + 2] == 0xfc) { /* B44A block */
856  unpack_3(sr, tmp_buffer);
857  sr += 3;
858  stay_to_uncompress -= 3;
859  } else {/* B44 Block */
860  if (stay_to_uncompress < 14)
861  return AVERROR_INVALIDDATA;
862  unpack_14(sr, tmp_buffer);
863  sr += 14;
864  stay_to_uncompress -= 14;
865  }
866 
867  /* copy data to uncompress buffer (B44 block can exceed target resolution)*/
868  index_tl_x = iX * 4;
869  index_tl_y = iY * 4;
870 
871  for (y = index_tl_y; y < FFMIN(index_tl_y + 4, td->ysize); y++) {
872  for (x = index_tl_x; x < FFMIN(index_tl_x + 4, td->xsize); x++) {
873  index_out = target_channel_offset * td->xsize + y * td->channel_line_size + 2 * x;
874  index_tmp = (y-index_tl_y) * 4 + (x-index_tl_x);
875  td->uncompressed_data[index_out] = tmp_buffer[index_tmp] & 0xff;
876  td->uncompressed_data[index_out + 1] = tmp_buffer[index_tmp] >> 8;
877  }
878  }
879  }
880  }
881  target_channel_offset += 2;
882  } else {/* Float or UINT 32 channel */
883  if (stay_to_uncompress < td->ysize * td->xsize * 4)
884  return AVERROR_INVALIDDATA;
885 
886  for (y = 0; y < td->ysize; y++) {
887  index_out = target_channel_offset * td->xsize + y * td->channel_line_size;
888  memcpy(&td->uncompressed_data[index_out], sr, td->xsize * 4);
889  sr += td->xsize * 4;
890  }
891  target_channel_offset += 4;
892 
893  stay_to_uncompress -= td->ysize * td->xsize * 4;
894  }
895  }
896 
897  return 0;
898 }
899 
900 static int ac_uncompress(const EXRContext *s, GetByteContext *gb, float *block)
901 {
902  int ret = 0, n = 1;
903 
904  while (n < 64) {
905  uint16_t val = bytestream2_get_ne16(gb);
906 
907  if (val == 0xff00) {
908  n = 64;
909  } else if ((val >> 8) == 0xff) {
910  n += val & 0xff;
911  } else {
912  ret = n;
913  block[ff_zigzag_direct[n]] = av_int2float(half2float(val, &s->h2f_tables));
914  n++;
915  }
916  }
917 
918  return ret;
919 }
920 
921 static void idct_1d(float *blk, int step)
922 {
923  const float a = .5f * cosf( M_PI / 4.f);
924  const float b = .5f * cosf( M_PI / 16.f);
925  const float c = .5f * cosf( M_PI / 8.f);
926  const float d = .5f * cosf(3.f*M_PI / 16.f);
927  const float e = .5f * cosf(5.f*M_PI / 16.f);
928  const float f = .5f * cosf(3.f*M_PI / 8.f);
929  const float g = .5f * cosf(7.f*M_PI / 16.f);
930 
931  float alpha[4], beta[4], theta[4], gamma[4];
932 
933  alpha[0] = c * blk[2 * step];
934  alpha[1] = f * blk[2 * step];
935  alpha[2] = c * blk[6 * step];
936  alpha[3] = f * blk[6 * step];
937 
938  beta[0] = b * blk[1 * step] + d * blk[3 * step] + e * blk[5 * step] + g * blk[7 * step];
939  beta[1] = d * blk[1 * step] - g * blk[3 * step] - b * blk[5 * step] - e * blk[7 * step];
940  beta[2] = e * blk[1 * step] - b * blk[3 * step] + g * blk[5 * step] + d * blk[7 * step];
941  beta[3] = g * blk[1 * step] - e * blk[3 * step] + d * blk[5 * step] - b * blk[7 * step];
942 
943  theta[0] = a * (blk[0 * step] + blk[4 * step]);
944  theta[3] = a * (blk[0 * step] - blk[4 * step]);
945 
946  theta[1] = alpha[0] + alpha[3];
947  theta[2] = alpha[1] - alpha[2];
948 
949  gamma[0] = theta[0] + theta[1];
950  gamma[1] = theta[3] + theta[2];
951  gamma[2] = theta[3] - theta[2];
952  gamma[3] = theta[0] - theta[1];
953 
954  blk[0 * step] = gamma[0] + beta[0];
955  blk[1 * step] = gamma[1] + beta[1];
956  blk[2 * step] = gamma[2] + beta[2];
957  blk[3 * step] = gamma[3] + beta[3];
958 
959  blk[4 * step] = gamma[3] - beta[3];
960  blk[5 * step] = gamma[2] - beta[2];
961  blk[6 * step] = gamma[1] - beta[1];
962  blk[7 * step] = gamma[0] - beta[0];
963 }
964 
965 static void dct_inverse(float *block)
966 {
967  for (int i = 0; i < 8; i++)
968  idct_1d(block + i, 8);
969 
970  for (int i = 0; i < 8; i++) {
971  idct_1d(block, 1);
972  block += 8;
973  }
974 }
975 
976 static void convert(float y, float u, float v,
977  float *b, float *g, float *r)
978 {
979  *r = y + 1.5747f * v;
980  *g = y - 0.1873f * u - 0.4682f * v;
981  *b = y + 1.8556f * u;
982 }
983 
984 static float to_linear(float x, float scale)
985 {
986  float ax = fabsf(x);
987 
988  if (ax <= 1.f) {
989  return FFSIGN(x) * powf(ax, 2.2f * scale);
990  } else {
991  const float log_base = expf(2.2f * scale);
992 
993  return FFSIGN(x) * powf(log_base, ax - 1.f);
994  }
995 }
996 
997 static int dwa_uncompress(const EXRContext *s, const uint8_t *src, int compressed_size,
998  int uncompressed_size, EXRThreadData *td)
999 {
1000  int64_t version, lo_usize, lo_size;
1001  int64_t ac_size, dc_size, rle_usize, rle_csize, rle_raw_size;
1002  int64_t ac_count, dc_count, ac_compression;
1003  const int dc_w = (td->xsize + 7) >> 3;
1004  const int dc_h = (td->ysize + 7) >> 3;
1005  GetByteContext gb, agb;
1006  int skip, ret;
1007  int have_rle = 0;
1008 
1009  if (compressed_size <= 88)
1010  return AVERROR_INVALIDDATA;
1011 
1012  version = AV_RL64(src + 0);
1013  if (version != 2)
1014  return AVERROR_INVALIDDATA;
1015 
1016  if (s->nb_channels < 3) {
1017  avpriv_request_sample(s->avctx, "Gray DWA");
1018  return AVERROR_PATCHWELCOME;
1019  }
1020 
1021  lo_usize = AV_RL64(src + 8);
1022  lo_size = AV_RL64(src + 16);
1023  ac_size = AV_RL64(src + 24);
1024  dc_size = AV_RL64(src + 32);
1025  rle_csize = AV_RL64(src + 40);
1026  rle_usize = AV_RL64(src + 48);
1027  rle_raw_size = AV_RL64(src + 56);
1028  ac_count = AV_RL64(src + 64);
1029  dc_count = AV_RL64(src + 72);
1030  ac_compression = AV_RL64(src + 80);
1031 
1032  if ( compressed_size < (uint64_t)(lo_size | ac_size | dc_size | rle_csize) || compressed_size < 88LL + lo_size + ac_size + dc_size + rle_csize
1033  || ac_count > (uint64_t)INT_MAX/2
1034  )
1035  return AVERROR_INVALIDDATA;
1036 
1037  if (ac_size <= 0) {
1038  avpriv_request_sample(s->avctx, "Zero ac_size");
1039  return AVERROR_INVALIDDATA;
1040  }
1041 
1042  if ((uint64_t)rle_raw_size > INT_MAX) {
1043  avpriv_request_sample(s->avctx, "Too big rle_raw_size");
1044  return AVERROR_INVALIDDATA;
1045  }
1046 
1047  if (td->xsize % 8 || td->ysize % 8) {
1048  avpriv_request_sample(s->avctx, "odd dimensions DWA");
1049  }
1050 
1051  bytestream2_init(&gb, src + 88, compressed_size - 88);
1052  skip = bytestream2_get_le16(&gb);
1053  if (skip < 2)
1054  return AVERROR_INVALIDDATA;
1055 
1056  bytestream2_skip(&gb, skip - 2);
1057 
1058  if (lo_size > 0) {
1059  if (lo_usize > uncompressed_size)
1060  return AVERROR_INVALIDDATA;
1061  bytestream2_skip(&gb, lo_size);
1062  }
1063 
1064  if (ac_size > 0) {
1065  unsigned long dest_len;
1066  GetByteContext agb = gb;
1067 
1068  if (ac_count > 3LL * td->xsize * s->scan_lines_per_block)
1069  return AVERROR_INVALIDDATA;
1070 
1071  dest_len = ac_count * 2LL;
1072 
1073  av_fast_padded_malloc(&td->ac_data, &td->ac_size, dest_len);
1074  if (!td->ac_data)
1075  return AVERROR(ENOMEM);
1076 
1077  switch (ac_compression) {
1078  case 0:
1079  ret = huf_uncompress(s, td, &agb, (int16_t *)td->ac_data, ac_count);
1080  if (ret < 0)
1081  return ret;
1082  break;
1083  case 1:
1084  if (uncompress(td->ac_data, &dest_len, agb.buffer, ac_size) != Z_OK ||
1085  dest_len != ac_count * 2LL)
1086  return AVERROR_INVALIDDATA;
1087  break;
1088  default:
1089  return AVERROR_INVALIDDATA;
1090  }
1091 
1092  bytestream2_skip(&gb, ac_size);
1093  }
1094 
1095  {
1096  unsigned long dest_len;
1097  GetByteContext agb = gb;
1098 
1099  if (dc_count != dc_w * dc_h * 3)
1100  return AVERROR_INVALIDDATA;
1101 
1102  dest_len = dc_count * 2LL;
1103 
1104  av_fast_padded_malloc(&td->dc_data, &td->dc_size, FFALIGN(dest_len, 64) * 2);
1105  if (!td->dc_data)
1106  return AVERROR(ENOMEM);
1107 
1108  if (uncompress(td->dc_data + FFALIGN(dest_len, 64), &dest_len, agb.buffer, dc_size) != Z_OK ||
1109  (dest_len != dc_count * 2LL))
1110  return AVERROR_INVALIDDATA;
1111 
1112  s->dsp.predictor(td->dc_data + FFALIGN(dest_len, 64), dest_len);
1113  s->dsp.reorder_pixels(td->dc_data, td->dc_data + FFALIGN(dest_len, 64), dest_len);
1114 
1115  bytestream2_skip(&gb, dc_size);
1116  }
1117 
1118  if (rle_raw_size > 0 && rle_csize > 0 && rle_usize > 0) {
1119  unsigned long dest_len = rle_usize;
1120 
1121  if (2LL * td->xsize * td->ysize > rle_raw_size)
1122  return AVERROR_INVALIDDATA;
1123 
1124  av_fast_padded_malloc(&td->rle_data, &td->rle_size, rle_usize);
1125  if (!td->rle_data)
1126  return AVERROR(ENOMEM);
1127 
1128  av_fast_padded_malloc(&td->rle_raw_data, &td->rle_raw_size, rle_raw_size);
1129  if (!td->rle_raw_data)
1130  return AVERROR(ENOMEM);
1131 
1132  if (uncompress(td->rle_data, &dest_len, gb.buffer, rle_csize) != Z_OK ||
1133  (dest_len != rle_usize))
1134  return AVERROR_INVALIDDATA;
1135 
1136  ret = rle(td->rle_raw_data, td->rle_data, rle_usize, rle_raw_size);
1137  if (ret < 0)
1138  return ret;
1139  bytestream2_skip(&gb, rle_csize);
1140 
1141  have_rle = 1;
1142  }
1143 
1144  bytestream2_init(&agb, td->ac_data, ac_count * 2);
1145 
1146  for (int y = 0; y < td->ysize; y += 8) {
1147  for (int x = 0; x < td->xsize; x += 8) {
1148  const int o = s->nb_channels == 4;
1149  float *yb = td->block[0];
1150  float *ub = td->block[1];
1151  float *vb = td->block[2];
1152  int bw = FFMIN(8, td->xsize - x);
1153  int bh = FFMIN(8, td->ysize - y);
1154 
1155  memset(td->block, 0, sizeof(td->block));
1156 
1157  for (int j = 0; j < 3; j++) {
1158  float *block = td->block[j];
1159  const int idx = (x >> 3) + (y >> 3) * dc_w + dc_w * dc_h * j;
1160  uint16_t *dc = (uint16_t *)td->dc_data;
1161  union av_intfloat32 dc_val;
1162 
1163  dc_val.i = half2float(dc[idx], &s->h2f_tables);
1164 
1165  block[0] = dc_val.f;
1166  ac_uncompress(s, &agb, block);
1167  dct_inverse(block);
1168  }
1169 
1170  if (s->pixel_type == EXR_HALF) {
1171  uint16_t *bo = ((uint16_t *)td->uncompressed_data) +
1172  y * td->xsize * s->nb_channels + td->xsize * (o + 0) + x;
1173  uint16_t *go = ((uint16_t *)td->uncompressed_data) +
1174  y * td->xsize * s->nb_channels + td->xsize * (o + 1) + x;
1175  uint16_t *ro = ((uint16_t *)td->uncompressed_data) +
1176  y * td->xsize * s->nb_channels + td->xsize * (o + 2) + x;
1177 
1178  for (int yy = 0; yy < bh; yy++) {
1179  for (int xx = 0; xx < bw; xx++) {
1180  const int idx = xx + yy * 8;
1181  float b, g, r;
1182 
1183  convert(yb[idx], ub[idx], vb[idx], &b, &g, &r);
1184 
1185  bo[xx] = float2half(av_float2int(to_linear(b, 1.f)), &s->f2h_tables);
1186  go[xx] = float2half(av_float2int(to_linear(g, 1.f)), &s->f2h_tables);
1187  ro[xx] = float2half(av_float2int(to_linear(r, 1.f)), &s->f2h_tables);
1188  }
1189 
1190  bo += td->xsize * s->nb_channels;
1191  go += td->xsize * s->nb_channels;
1192  ro += td->xsize * s->nb_channels;
1193  }
1194  } else {
1195  float *bo = ((float *)td->uncompressed_data) +
1196  y * td->xsize * s->nb_channels + td->xsize * (o + 0) + x;
1197  float *go = ((float *)td->uncompressed_data) +
1198  y * td->xsize * s->nb_channels + td->xsize * (o + 1) + x;
1199  float *ro = ((float *)td->uncompressed_data) +
1200  y * td->xsize * s->nb_channels + td->xsize * (o + 2) + x;
1201 
1202  for (int yy = 0; yy < bh; yy++) {
1203  for (int xx = 0; xx < bw; xx++) {
1204  const int idx = xx + yy * 8;
1205 
1206  convert(yb[idx], ub[idx], vb[idx], &bo[xx], &go[xx], &ro[xx]);
1207 
1208  bo[xx] = to_linear(bo[xx], 1.f);
1209  go[xx] = to_linear(go[xx], 1.f);
1210  ro[xx] = to_linear(ro[xx], 1.f);
1211  }
1212 
1213  bo += td->xsize * s->nb_channels;
1214  go += td->xsize * s->nb_channels;
1215  ro += td->xsize * s->nb_channels;
1216  }
1217  }
1218  }
1219  }
1220 
1221  if (s->nb_channels < 4)
1222  return 0;
1223 
1224  if (s->pixel_type == EXR_HALF) {
1225  for (int y = 0; y < td->ysize && have_rle; y++) {
1226  uint16_t *ao = ((uint16_t *)td->uncompressed_data) + y * td->xsize * s->nb_channels;
1227  uint8_t *ai0 = td->rle_raw_data + y * td->xsize;
1228  uint8_t *ai1 = td->rle_raw_data + y * td->xsize + rle_raw_size / 2;
1229 
1230  for (int x = 0; x < td->xsize; x++)
1231  ao[x] = ai0[x] | (ai1[x] << 8);
1232  }
1233  } else {
1234  for (int y = 0; y < td->ysize && have_rle; y++) {
1235  uint32_t *ao = ((uint32_t *)td->uncompressed_data) + y * td->xsize * s->nb_channels;
1236  uint8_t *ai0 = td->rle_raw_data + y * td->xsize;
1237  uint8_t *ai1 = td->rle_raw_data + y * td->xsize + rle_raw_size / 2;
1238 
1239  for (int x = 0; x < td->xsize; x++) {
1240  uint16_t ha = ai0[x] | (ai1[x] << 8);
1241 
1242  ao[x] = half2float(ha, &s->h2f_tables);
1243  }
1244  }
1245  }
1246 
1247  return 0;
1248 }
1249 
1250 static int decode_block(AVCodecContext *avctx, void *tdata,
1251  int jobnr, int threadnr)
1252 {
1253  const EXRContext *s = avctx->priv_data;
1254  AVFrame *const p = s->picture;
1255  EXRThreadData *td = &s->thread_data[threadnr];
1256  const uint8_t *channel_buffer[4] = { 0 };
1257  const uint8_t *buf = s->buf;
1258  uint64_t line_offset, uncompressed_size;
1259  uint8_t *ptr;
1260  uint32_t data_size;
1261  int line, col = 0;
1262  uint64_t tile_x, tile_y, tile_level_x, tile_level_y;
1263  const uint8_t *src;
1264  int step = s->desc->comp[0].step;
1265  int bxmin = 0, axmax = 0, window_xoffset = 0;
1266  int window_xmin, window_xmax, window_ymin, window_ymax;
1267  int data_xoffset, data_yoffset, data_window_offset, xsize, ysize;
1268  int i, x, buf_size = s->buf_size;
1269  int c, rgb_channel_count;
1270 #if FF_API_EXR_GAMMA
1271  float one_gamma = 1.0f / s->gamma;
1272  av_csp_trc_function trc_func = av_csp_trc_func_from_id(s->apply_trc_type);
1273 #endif
1274  int ret;
1275 
1276  line_offset = AV_RL64(s->gb.buffer + jobnr * 8);
1277 
1278  if (s->is_tile) {
1279  if (buf_size < 20 || line_offset > buf_size - 20)
1280  return AVERROR_INVALIDDATA;
1281 
1282  src = buf + line_offset + 20;
1283  if (s->is_multipart)
1284  src += 4;
1285 
1286  tile_x = AV_RL32(src - 20);
1287  tile_y = AV_RL32(src - 16);
1288  tile_level_x = AV_RL32(src - 12);
1289  tile_level_y = AV_RL32(src - 8);
1290 
1291  data_size = AV_RL32(src - 4);
1292  if (data_size <= 0 || data_size > buf_size - line_offset - 20)
1293  return AVERROR_INVALIDDATA;
1294 
1295  if (tile_level_x || tile_level_y) { /* tile level, is not the full res level */
1296  avpriv_report_missing_feature(s->avctx, "Subres tile before full res tile");
1297  return AVERROR_PATCHWELCOME;
1298  }
1299 
1300  if (tile_x && s->tile_attr.xSize + (int64_t)FFMAX(s->xmin, 0) >= INT_MAX / tile_x )
1301  return AVERROR_INVALIDDATA;
1302  if (tile_y && s->tile_attr.ySize + (int64_t)FFMAX(s->ymin, 0) >= INT_MAX / tile_y )
1303  return AVERROR_INVALIDDATA;
1304 
1305  line = s->ymin + s->tile_attr.ySize * tile_y;
1306  col = s->tile_attr.xSize * tile_x;
1307 
1308  if (line < s->ymin || line > s->ymax ||
1309  s->xmin + col < s->xmin || s->xmin + col > s->xmax)
1310  return AVERROR_INVALIDDATA;
1311 
1312  td->ysize = FFMIN(s->tile_attr.ySize, s->ydelta - tile_y * s->tile_attr.ySize);
1313  td->xsize = FFMIN(s->tile_attr.xSize, s->xdelta - tile_x * s->tile_attr.xSize);
1314 
1315  if (td->xsize * (uint64_t)s->current_channel_offset > INT_MAX ||
1316  av_image_check_size2(td->xsize, td->ysize, s->avctx->max_pixels, AV_PIX_FMT_NONE, 0, s->avctx) < 0)
1317  return AVERROR_INVALIDDATA;
1318 
1319  td->channel_line_size = td->xsize * s->current_channel_offset;/* uncompress size of one line */
1320  uncompressed_size = td->channel_line_size * (uint64_t)td->ysize;/* uncompress size of the block */
1321  } else {
1322  if (buf_size < 8 || line_offset > buf_size - 8)
1323  return AVERROR_INVALIDDATA;
1324 
1325  src = buf + line_offset + 8;
1326  if (s->is_multipart)
1327  src += 4;
1328  line = AV_RL32(src - 8);
1329 
1330  if (line < s->ymin || line > s->ymax)
1331  return AVERROR_INVALIDDATA;
1332 
1333  data_size = AV_RL32(src - 4);
1334  if (data_size <= 0 || data_size > buf_size - line_offset - 8)
1335  return AVERROR_INVALIDDATA;
1336 
1337  td->ysize = FFMIN(s->scan_lines_per_block, s->ymax - line + 1); /* s->ydelta - line ?? */
1338  td->xsize = s->xdelta;
1339 
1340  if (td->xsize * (uint64_t)s->current_channel_offset > INT_MAX ||
1341  av_image_check_size2(td->xsize, td->ysize, s->avctx->max_pixels, AV_PIX_FMT_NONE, 0, s->avctx) < 0)
1342  return AVERROR_INVALIDDATA;
1343 
1344  td->channel_line_size = td->xsize * s->current_channel_offset;/* uncompress size of one line */
1345  uncompressed_size = td->channel_line_size * (uint64_t)td->ysize;/* uncompress size of the block */
1346 
1347  if ((s->compression == EXR_RAW && (data_size != uncompressed_size ||
1348  line_offset > buf_size - uncompressed_size)) ||
1349  (s->compression != EXR_RAW && (data_size > uncompressed_size ||
1350  line_offset > buf_size - data_size))) {
1351  return AVERROR_INVALIDDATA;
1352  }
1353  }
1354 
1355  window_xmin = FFMIN(avctx->width, FFMAX(0, s->xmin + col));
1356  window_xmax = FFMIN(avctx->width, FFMAX(0, s->xmin + col + td->xsize));
1357  window_ymin = FFMIN(avctx->height, FFMAX(0, line ));
1358  window_ymax = FFMIN(avctx->height, FFMAX(0, line + td->ysize));
1359  xsize = window_xmax - window_xmin;
1360  ysize = window_ymax - window_ymin;
1361 
1362  /* tile or scanline not visible skip decoding */
1363  if (xsize <= 0 || ysize <= 0)
1364  return 0;
1365 
1366  /* is the first tile or is a scanline */
1367  if(col == 0) {
1368  window_xmin = 0;
1369  /* pixels to add at the left of the display window */
1370  window_xoffset = FFMAX(0, s->xmin);
1371  /* bytes to add at the left of the display window */
1372  bxmin = window_xoffset * step;
1373  }
1374 
1375  /* is the last tile or is a scanline */
1376  if(col + td->xsize == s->xdelta) {
1377  window_xmax = avctx->width;
1378  /* bytes to add at the right of the display window */
1379  axmax = FFMAX(0, (avctx->width - (s->xmax + 1))) * step;
1380  }
1381 
1382  if (avctx->max_pixels && uncompressed_size > avctx->max_pixels * 16LL)
1383  return AVERROR_INVALIDDATA;
1384 
1385  if (data_size < uncompressed_size || s->is_tile) { /* td->tmp is use for tile reorganization */
1386  av_fast_padded_malloc(&td->tmp, &td->tmp_size, uncompressed_size);
1387  if (!td->tmp)
1388  return AVERROR(ENOMEM);
1389  }
1390 
1391  if (data_size < uncompressed_size) {
1393  &td->uncompressed_size, uncompressed_size + 64);/* Force 64 padding for AVX2 reorder_pixels dst */
1394 
1395  if (!td->uncompressed_data)
1396  return AVERROR(ENOMEM);
1397 
1399  switch (s->compression) {
1400  case EXR_ZIP1:
1401  case EXR_ZIP16:
1402  ret = zip_uncompress(s, src, data_size, uncompressed_size, td);
1403  break;
1404  case EXR_PIZ:
1405  ret = piz_uncompress(s, src, data_size, uncompressed_size, td);
1406  break;
1407  case EXR_PXR24:
1408  ret = pxr24_uncompress(s, src, data_size, uncompressed_size, td);
1409  break;
1410  case EXR_RLE:
1411  ret = rle_uncompress(s, src, data_size, uncompressed_size, td);
1412  break;
1413  case EXR_B44:
1414  case EXR_B44A:
1415  ret = b44_uncompress(s, src, data_size, uncompressed_size, td);
1416  break;
1417  case EXR_DWAA:
1418  case EXR_DWAB:
1419  ret = dwa_uncompress(s, src, data_size, uncompressed_size, td);
1420  break;
1421  }
1422  if (ret < 0) {
1423  av_log(avctx, AV_LOG_ERROR, "decode_block() failed.\n");
1424  return ret;
1425  }
1426  src = td->uncompressed_data;
1427  }
1428 
1429  /* offsets to crop data outside display window */
1430  data_xoffset = FFABS(FFMIN(0, s->xmin + col)) * (s->pixel_type == EXR_HALF ? 2 : 4);
1431  data_yoffset = FFABS(FFMIN(0, line));
1432  data_window_offset = (data_yoffset * td->channel_line_size) + data_xoffset;
1433 
1434  if (s->channel_offsets[3] >= 0)
1435  channel_buffer[3] = src + (td->xsize * s->channel_offsets[3]) + data_window_offset;
1436  if (!s->is_luma) {
1437  channel_buffer[0] = src + (td->xsize * s->channel_offsets[0]) + data_window_offset;
1438  channel_buffer[1] = src + (td->xsize * s->channel_offsets[1]) + data_window_offset;
1439  channel_buffer[2] = src + (td->xsize * s->channel_offsets[2]) + data_window_offset;
1440  rgb_channel_count = 3;
1441  } else { /* put y data in the first channel_buffer and if needed, alpha in the second */
1442  channel_buffer[0] = src + (td->xsize * s->channel_offsets[1]) + data_window_offset;
1443  if (!(s->desc->flags & AV_PIX_FMT_FLAG_PLANAR))
1444  channel_buffer[1] = channel_buffer[3];
1445  rgb_channel_count = 1;
1446  }
1447 
1448  if (s->desc->flags & AV_PIX_FMT_FLAG_FLOAT) {
1449  for (c = 0; c < s->desc->nb_components; c++) {
1450  int plane = s->desc->comp[c].plane;
1451  ptr = p->data[plane] + window_ymin * p->linesize[plane] + (window_xmin * step) + s->desc->comp[c].offset;
1452 
1453  for (i = 0; i < ysize; i++, ptr += p->linesize[plane]) {
1454  const uint8_t *src = channel_buffer[c];
1455  uint8_t *ptr_x = ptr + window_xoffset * step;
1456 
1457  // Zero out the start if xmin is not 0
1458  if (s->desc->flags & AV_PIX_FMT_FLAG_PLANAR || !c)
1459  memset(ptr, 0, bxmin);
1460 
1461  if (s->pixel_type == EXR_FLOAT) {
1462  // 32-bit
1463 #if FF_API_EXR_GAMMA
1464  if (trc_func && (!c || (c < 3 && s->desc->flags & AV_PIX_FMT_FLAG_PLANAR))) {
1465  for (int x = 0; x < xsize; x++, ptr_x += step) {
1466  float f = av_int2float(bytestream_get_le32(&src));
1467  AV_WN32A(ptr_x, av_float2int(trc_func(f)));
1468  }
1469  } else if (one_gamma != 1.f) {
1470  for (int x = 0; x < xsize; x++, ptr_x += step) {
1471  float f = av_int2float(bytestream_get_le32(&src));
1472  if (f > 0.0f && c < 3) /* avoid negative values */
1473  f = powf(f, one_gamma);
1474  AV_WN32A(ptr_x, av_float2int(f));
1475  }
1476  } else
1477 #endif
1478  for (int x = 0; x < xsize; x++, ptr_x += step)
1479  AV_WN32A(ptr_x, bytestream_get_le32(&src));
1480  } else if (s->pixel_type == EXR_HALF) {
1481  // 16-bit
1482 #if FF_API_EXR_GAMMA
1483  if (one_gamma != 1.f || (trc_func && (!c || (c < 3 && s->desc->flags & AV_PIX_FMT_FLAG_PLANAR)))) {
1484  for (int x = 0; x < xsize; x++, ptr_x += step)
1485  AV_WN16A(ptr_x, s->gamma_table[bytestream_get_le16(&src)]);
1486  } else
1487 #endif
1488  for (int x = 0; x < xsize; x++, ptr_x += step)
1489  AV_WN16A(ptr_x, bytestream_get_le16(&src));
1490  }
1491 
1492  // Zero out the end if xmax+1 is not w
1493  if (s->desc->flags & AV_PIX_FMT_FLAG_PLANAR || !c)
1494  memset(ptr_x, 0, axmax);
1495  channel_buffer[c] += td->channel_line_size;
1496  }
1497  }
1498  } else {
1499 
1500  av_assert1(s->pixel_type == EXR_UINT);
1501  ptr = p->data[0] + window_ymin * p->linesize[0] + (window_xmin * s->desc->nb_components * 2);
1502 
1503  for (i = 0; i < ysize; i++, ptr += p->linesize[0]) {
1504 
1505  const uint8_t * a;
1506  const uint8_t *rgb[3];
1507  uint16_t *ptr_x;
1508 
1509  for (c = 0; c < rgb_channel_count; c++) {
1510  rgb[c] = channel_buffer[c];
1511  }
1512 
1513  if (channel_buffer[3])
1514  a = channel_buffer[3];
1515 
1516  ptr_x = (uint16_t *) ptr;
1517 
1518  // Zero out the start if xmin is not 0
1519  memset(ptr_x, 0, bxmin);
1520  ptr_x += window_xoffset * s->desc->nb_components;
1521 
1522  for (x = 0; x < xsize; x++) {
1523  for (c = 0; c < rgb_channel_count; c++) {
1524  *ptr_x++ = bytestream_get_le32(&rgb[c]) >> 16;
1525  }
1526 
1527  if (channel_buffer[3])
1528  *ptr_x++ = bytestream_get_le32(&a) >> 16;
1529  }
1530 
1531  // Zero out the end if xmax+1 is not w
1532  memset(ptr_x, 0, axmax);
1533 
1534  channel_buffer[0] += td->channel_line_size;
1535  channel_buffer[1] += td->channel_line_size;
1536  channel_buffer[2] += td->channel_line_size;
1537  if (channel_buffer[3])
1538  channel_buffer[3] += td->channel_line_size;
1539  }
1540  }
1541 
1542  return 0;
1543 }
1544 
1546 {
1547  GetByteContext *gb = &s->gb;
1548 
1549  while (bytestream2_get_bytes_left(gb) > 0) {
1550  if (!bytestream2_peek_byte(gb))
1551  break;
1552 
1553  // Process unknown variables
1554  for (int i = 0; i < 2; i++) // value_name and value_type
1555  while (bytestream2_get_byte(gb) != 0);
1556 
1557  // Skip variable length
1558  bytestream2_skip(gb, bytestream2_get_le32(gb));
1559  }
1560 }
1561 
1562 /**
1563  * Check if the variable name corresponds to its data type.
1564  *
1565  * @param s the EXRContext
1566  * @param value_name name of the variable to check
1567  * @param value_type type of the variable to check
1568  * @param minimum_length minimum length of the variable data
1569  *
1570  * @return bytes to read containing variable data
1571  * -1 if variable is not found
1572  * 0 if buffer ended prematurely
1573  */
1575  const char *value_name,
1576  const char *value_type,
1577  unsigned int minimum_length)
1578 {
1579  GetByteContext *gb = &s->gb;
1580  int var_size = -1;
1581 
1582  if (bytestream2_get_bytes_left(gb) >= minimum_length &&
1583  !strcmp(gb->buffer, value_name)) {
1584  // found value_name, jump to value_type (null terminated strings)
1585  gb->buffer += strlen(value_name) + 1;
1586  if (!strcmp(gb->buffer, value_type)) {
1587  gb->buffer += strlen(value_type) + 1;
1588  var_size = bytestream2_get_le32(gb);
1589  // don't go read past boundaries
1590  if (var_size > bytestream2_get_bytes_left(gb))
1591  var_size = 0;
1592  } else {
1593  // value_type not found, reset the buffer
1594  gb->buffer -= strlen(value_name) + 1;
1595  av_log(s->avctx, AV_LOG_WARNING,
1596  "Unknown data type %s for header variable %s.\n",
1597  value_type, value_name);
1598  }
1599  }
1600 
1601  return var_size;
1602 }
1603 
1605 {
1607  GetByteContext *gb = &s->gb;
1608  int magic_number, version, flags;
1609  int layer_match = 0;
1610  int ret;
1611  int dup_channels = 0;
1612 
1613  s->current_channel_offset = 0;
1614  s->xmin = ~0;
1615  s->xmax = ~0;
1616  s->ymin = ~0;
1617  s->ymax = ~0;
1618  s->xdelta = ~0;
1619  s->ydelta = ~0;
1620  s->channel_offsets[0] = -1;
1621  s->channel_offsets[1] = -1;
1622  s->channel_offsets[2] = -1;
1623  s->channel_offsets[3] = -1;
1624  s->pixel_type = EXR_UNKNOWN;
1625  s->compression = EXR_UNKN;
1626  s->nb_channels = 0;
1627  s->w = 0;
1628  s->h = 0;
1629  s->tile_attr.xSize = -1;
1630  s->tile_attr.ySize = -1;
1631  s->is_tile = 0;
1632  s->is_multipart = 0;
1633  s->is_luma = 0;
1634  s->has_channel = 0;
1635  s->current_part = 0;
1636 
1637  if (bytestream2_get_bytes_left(gb) < 10) {
1638  av_log(s->avctx, AV_LOG_ERROR, "Header too short to parse.\n");
1639  return AVERROR_INVALIDDATA;
1640  }
1641 
1642  magic_number = bytestream2_get_le32(gb);
1643  if (magic_number != 20000630) {
1644  /* As per documentation of OpenEXR, it is supposed to be
1645  * int 20000630 little-endian */
1646  av_log(s->avctx, AV_LOG_ERROR, "Wrong magic number %d.\n", magic_number);
1647  return AVERROR_INVALIDDATA;
1648  }
1649 
1650  version = bytestream2_get_byte(gb);
1651  if (version != 2) {
1652  avpriv_report_missing_feature(s->avctx, "Version %d", version);
1653  return AVERROR_PATCHWELCOME;
1654  }
1655 
1656  flags = bytestream2_get_le24(gb);
1657 
1658  if (flags & 0x02)
1659  s->is_tile = 1;
1660  if (flags & 0x10)
1661  s->is_multipart = 1;
1662  if (flags & 0x08) {
1663  avpriv_report_missing_feature(s->avctx, "deep data");
1664  return AVERROR_PATCHWELCOME;
1665  }
1666 
1667  // Parse the header
1668  while (bytestream2_get_bytes_left(gb) > 0) {
1669  int var_size;
1670 
1671  while (s->is_multipart && s->current_part < s->selected_part &&
1672  bytestream2_get_bytes_left(gb) > 0) {
1673  if (bytestream2_peek_byte(gb)) {
1675  } else {
1676  bytestream2_skip(gb, 1);
1677  if (!bytestream2_peek_byte(gb))
1678  break;
1679  }
1680  bytestream2_skip(gb, 1);
1681  s->current_part++;
1682  }
1683 
1684  if (!bytestream2_peek_byte(gb)) {
1685  if (!s->is_multipart)
1686  break;
1687  bytestream2_skip(gb, 1);
1688  if (s->current_part == s->selected_part) {
1689  while (bytestream2_get_bytes_left(gb) > 0) {
1690  if (bytestream2_peek_byte(gb)) {
1692  } else {
1693  bytestream2_skip(gb, 1);
1694  if (!bytestream2_peek_byte(gb))
1695  break;
1696  }
1697  }
1698  }
1699  if (!bytestream2_peek_byte(gb))
1700  break;
1701  s->current_part++;
1702  }
1703 
1704  if ((var_size = check_header_variable(s, "channels",
1705  "chlist", 38)) >= 0) {
1706  GetByteContext ch_gb;
1707  if (!var_size) {
1709  goto fail;
1710  }
1711 
1712  bytestream2_init(&ch_gb, gb->buffer, var_size);
1713 
1714  while (bytestream2_get_bytes_left(&ch_gb) >= 19) {
1716  enum ExrPixelType current_pixel_type;
1717  int channel_index = -1;
1718  int xsub, ysub;
1719 
1720  if (strcmp(s->layer, "") != 0) {
1721  if (strncmp(ch_gb.buffer, s->layer, strlen(s->layer)) == 0) {
1722  layer_match = 1;
1723  av_log(s->avctx, AV_LOG_INFO,
1724  "Channel match layer : %s.\n", ch_gb.buffer);
1725  ch_gb.buffer += strlen(s->layer);
1726  if (*ch_gb.buffer == '.')
1727  ch_gb.buffer++; /* skip dot if not given */
1728  } else {
1729  layer_match = 0;
1730  av_log(s->avctx, AV_LOG_INFO,
1731  "Channel doesn't match layer : %s.\n", ch_gb.buffer);
1732  }
1733  } else {
1734  layer_match = 1;
1735  }
1736 
1737  if (layer_match) { /* only search channel if the layer match is valid */
1738  if (strlen(ch_gb.buffer) == 1) {
1739  int ch_chr = av_toupper(*ch_gb.buffer);
1740  if (ch_chr >= 'A' && ch_chr <= 'Z')
1741  s->has_channel |= M(ch_chr);
1742  av_log(s->avctx, AV_LOG_DEBUG, "%c\n", ch_chr);
1743  }
1744 
1745  if (!av_strcasecmp(ch_gb.buffer, "R") ||
1746  !av_strcasecmp(ch_gb.buffer, "X") ||
1747  !av_strcasecmp(ch_gb.buffer, "U")) {
1748  channel_index = 0;
1749  } else if (!av_strcasecmp(ch_gb.buffer, "G") ||
1750  !av_strcasecmp(ch_gb.buffer, "V")) {
1751  channel_index = 1;
1752  } else if (!av_strcasecmp(ch_gb.buffer, "Y")) {
1753  channel_index = 1;
1754  } else if (!av_strcasecmp(ch_gb.buffer, "B") ||
1755  !av_strcasecmp(ch_gb.buffer, "Z") ||
1756  !av_strcasecmp(ch_gb.buffer, "W")) {
1757  channel_index = 2;
1758  } else if (!av_strcasecmp(ch_gb.buffer, "A")) {
1759  channel_index = 3;
1760  } else {
1761  av_log(s->avctx, AV_LOG_WARNING,
1762  "Unsupported channel %.256s.\n", ch_gb.buffer);
1763  }
1764  }
1765 
1766  /* skip until you get a 0 */
1767  while (bytestream2_get_bytes_left(&ch_gb) > 0 &&
1768  bytestream2_get_byte(&ch_gb))
1769  continue;
1770 
1771  if (bytestream2_get_bytes_left(&ch_gb) < 4) {
1772  av_log(s->avctx, AV_LOG_ERROR, "Incomplete header.\n");
1774  goto fail;
1775  }
1776 
1777  current_pixel_type = bytestream2_get_le32(&ch_gb);
1778  if (current_pixel_type >= EXR_UNKNOWN) {
1779  avpriv_report_missing_feature(s->avctx, "Pixel type %d",
1780  current_pixel_type);
1782  goto fail;
1783  }
1784 
1785  bytestream2_skip(&ch_gb, 4);
1786  xsub = bytestream2_get_le32(&ch_gb);
1787  ysub = bytestream2_get_le32(&ch_gb);
1788 
1789  if (xsub != 1 || ysub != 1) {
1791  "Subsampling %dx%d",
1792  xsub, ysub);
1794  goto fail;
1795  }
1796 
1797  if (channel_index >= 0 && s->channel_offsets[channel_index] == -1) { /* channel has not been previously assigned */
1798  if (s->pixel_type != EXR_UNKNOWN &&
1799  s->pixel_type != current_pixel_type) {
1800  av_log(s->avctx, AV_LOG_ERROR,
1801  "RGB channels not of the same depth.\n");
1803  goto fail;
1804  }
1805  s->pixel_type = current_pixel_type;
1806  s->channel_offsets[channel_index] = s->current_channel_offset;
1807  } else if (channel_index >= 0) {
1808  av_log(s->avctx, AV_LOG_WARNING,
1809  "Multiple channels with index %d.\n", channel_index);
1810  if (++dup_channels > 10) {
1812  goto fail;
1813  }
1814  }
1815 
1816  av_assert0(s->nb_channels < INT_MAX); // Impossible due to size of the bitstream
1817  EXRChannel *new_channels = av_realloc_array(s->channels,
1818  s->nb_channels + 1,
1819  sizeof(EXRChannel));
1820  if (!new_channels) {
1821  ret = AVERROR(ENOMEM);
1822  goto fail;
1823  }
1824  s->nb_channels ++;
1825  s->channels = new_channels;
1826 
1827  channel = &s->channels[s->nb_channels - 1];
1828  channel->pixel_type = current_pixel_type;
1829  channel->xsub = xsub;
1830  channel->ysub = ysub;
1831 
1832  if (current_pixel_type == EXR_HALF) {
1833  s->current_channel_offset += 2;
1834  } else {/* Float or UINT32 */
1835  s->current_channel_offset += 4;
1836  }
1837  }
1838  if (!((M('R') + M('G') + M('B')) & ~s->has_channel)) {
1839  s->is_luma = 0;
1840  } else if (!((M('X') + M('Y') + M('Z')) & ~s->has_channel)) {
1841  s->is_luma = 0;
1842  } else if (!((M('Y') + M('U') + M('V')) & ~s->has_channel)) {
1843  s->is_luma = 0;
1844  } else if (!((M('Y') ) & ~s->has_channel) &&
1845  !((M('R') + M('G') + M('B') + M('U') + M('V') + M('X') + M('Z')) & s->has_channel)) {
1846  s->is_luma = 1;
1847  } else {
1848  avpriv_request_sample(s->avctx, "Uncommon channel combination");
1850  goto fail;
1851  }
1852 
1853  /* Check if all channels are set with an offset or if the channels
1854  * are causing an overflow */
1855  if (!s->is_luma) {/* if we expected to have at least 3 channels */
1856  if (FFMIN3(s->channel_offsets[0],
1857  s->channel_offsets[1],
1858  s->channel_offsets[2]) < 0) {
1859  if (s->channel_offsets[0] < 0)
1860  av_log(s->avctx, AV_LOG_ERROR, "Missing red channel.\n");
1861  if (s->channel_offsets[1] < 0)
1862  av_log(s->avctx, AV_LOG_ERROR, "Missing green channel.\n");
1863  if (s->channel_offsets[2] < 0)
1864  av_log(s->avctx, AV_LOG_ERROR, "Missing blue channel.\n");
1866  goto fail;
1867  }
1868  }
1869 
1870  // skip one last byte and update main gb
1871  gb->buffer = ch_gb.buffer + 1;
1872  continue;
1873  } else if ((var_size = check_header_variable(s, "dataWindow", "box2i",
1874  31)) >= 0) {
1875  int xmin, ymin, xmax, ymax;
1876  if (!var_size) {
1878  goto fail;
1879  }
1880 
1881  xmin = bytestream2_get_le32(gb);
1882  ymin = bytestream2_get_le32(gb);
1883  xmax = bytestream2_get_le32(gb);
1884  ymax = bytestream2_get_le32(gb);
1885 
1886  if (xmin > xmax || ymin > ymax ||
1887  ymax == INT_MAX || xmax == INT_MAX ||
1888  (unsigned)xmax - xmin >= INT_MAX ||
1889  (unsigned)ymax - ymin >= INT_MAX) {
1891  goto fail;
1892  }
1893  s->xmin = xmin;
1894  s->xmax = xmax;
1895  s->ymin = ymin;
1896  s->ymax = ymax;
1897  s->xdelta = (s->xmax - s->xmin) + 1;
1898  s->ydelta = (s->ymax - s->ymin) + 1;
1899 
1900  continue;
1901  } else if ((var_size = check_header_variable(s, "displayWindow",
1902  "box2i", 34)) >= 0) {
1903  int32_t sx, sy, dx, dy;
1904 
1905  if (!var_size) {
1907  goto fail;
1908  }
1909 
1910  sx = bytestream2_get_le32(gb);
1911  sy = bytestream2_get_le32(gb);
1912  dx = bytestream2_get_le32(gb);
1913  dy = bytestream2_get_le32(gb);
1914 
1915  s->w = (unsigned)dx - sx + 1;
1916  s->h = (unsigned)dy - sy + 1;
1917 
1918  continue;
1919  } else if ((var_size = check_header_variable(s, "lineOrder",
1920  "lineOrder", 25)) >= 0) {
1921  int line_order;
1922  if (!var_size) {
1924  goto fail;
1925  }
1926 
1927  line_order = bytestream2_get_byte(gb);
1928  av_log(s->avctx, AV_LOG_DEBUG, "line order: %d.\n", line_order);
1929  if (line_order > 2) {
1930  av_log(s->avctx, AV_LOG_ERROR, "Unknown line order.\n");
1932  goto fail;
1933  }
1934 
1935  continue;
1936  } else if ((var_size = check_header_variable(s, "pixelAspectRatio",
1937  "float", 31)) >= 0) {
1938  if (!var_size) {
1940  goto fail;
1941  }
1942 
1943  s->sar = bytestream2_get_le32(gb);
1944 
1945  continue;
1946  } else if ((var_size = check_header_variable(s, "compression",
1947  "compression", 29)) >= 0) {
1948  if (!var_size) {
1950  goto fail;
1951  }
1952 
1953  if (s->compression == EXR_UNKN)
1954  s->compression = bytestream2_get_byte(gb);
1955  else {
1956  bytestream2_skip(gb, 1);
1957  av_log(s->avctx, AV_LOG_WARNING,
1958  "Found more than one compression attribute.\n");
1959  }
1960 
1961  continue;
1962  } else if ((var_size = check_header_variable(s, "tiles",
1963  "tiledesc", 22)) >= 0) {
1964  uint8_t tileLevel;
1965 
1966  if (!s->is_tile)
1967  av_log(s->avctx, AV_LOG_WARNING,
1968  "Found tile attribute and scanline flags. Exr will be interpreted as scanline.\n");
1969 
1970  s->tile_attr.xSize = bytestream2_get_le32(gb);
1971  s->tile_attr.ySize = bytestream2_get_le32(gb);
1972 
1973  tileLevel = bytestream2_get_byte(gb);
1974  s->tile_attr.level_mode = tileLevel & 0x0f;
1975  s->tile_attr.level_round = (tileLevel >> 4) & 0x0f;
1976 
1977  if (s->tile_attr.level_mode >= EXR_TILE_LEVEL_UNKNOWN) {
1978  avpriv_report_missing_feature(s->avctx, "Tile level mode %d",
1979  s->tile_attr.level_mode);
1981  goto fail;
1982  }
1983 
1984  if (s->tile_attr.level_round >= EXR_TILE_ROUND_UNKNOWN) {
1985  avpriv_report_missing_feature(s->avctx, "Tile level round %d",
1986  s->tile_attr.level_round);
1988  goto fail;
1989  }
1990 
1991  continue;
1992  } else if ((var_size = check_header_variable(s, "writer",
1993  "string", 1)) >= 0) {
1994  uint8_t key[256] = { 0 };
1995 
1996  bytestream2_get_buffer(gb, key, FFMIN(sizeof(key) - 1, var_size));
1997  av_dict_set(&metadata, "writer", key, 0);
1998 
1999  continue;
2000  } else if ((var_size = check_header_variable(s, "framesPerSecond",
2001  "rational", 33)) >= 0) {
2002  if (!var_size) {
2004  goto fail;
2005  }
2006 
2007  s->avctx->framerate.num = bytestream2_get_le32(gb);
2008  s->avctx->framerate.den = bytestream2_get_le32(gb);
2009 
2010  continue;
2011  } else if ((var_size = check_header_variable(s, "chunkCount",
2012  "int", 23)) >= 0) {
2013 
2014  s->chunk_count = bytestream2_get_le32(gb);
2015 
2016  continue;
2017  } else if ((var_size = check_header_variable(s, "type",
2018  "string", 16)) >= 0) {
2019  uint8_t key[256] = { 0 };
2020 
2021  bytestream2_get_buffer(gb, key, FFMIN(sizeof(key) - 1, var_size));
2022  if (strncmp("scanlineimage", key, var_size) &&
2023  strncmp("tiledimage", key, var_size)) {
2025  goto fail;
2026  }
2027 
2028  continue;
2029  } else if ((var_size = check_header_variable(s, "preview",
2030  "preview", 16)) >= 0) {
2031  uint32_t pw = bytestream2_get_le32(gb);
2032  uint32_t ph = bytestream2_get_le32(gb);
2033  uint64_t psize = pw * (uint64_t)ph;
2034  if (psize > INT64_MAX / 4) {
2036  goto fail;
2037  }
2038  psize *= 4;
2039 
2040  if ((int64_t)psize >= bytestream2_get_bytes_left(gb)) {
2042  goto fail;
2043  }
2044 
2045  bytestream2_skip(gb, psize);
2046 
2047  continue;
2048  }
2049 
2050  // Check if there are enough bytes for a header
2051  if (bytestream2_get_bytes_left(gb) <= 9) {
2052  av_log(s->avctx, AV_LOG_ERROR, "Incomplete header\n");
2054  goto fail;
2055  }
2056 
2057  // Process unknown variables
2058  {
2059  uint8_t name[256] = { 0 };
2060  uint8_t type[256] = { 0 };
2061  uint8_t value[8192] = { 0 };
2062  int i = 0, size;
2063 
2064  while (bytestream2_get_bytes_left(gb) > 0 &&
2065  bytestream2_peek_byte(gb) && i < 255) {
2066  name[i++] = bytestream2_get_byte(gb);
2067  }
2068 
2069  bytestream2_skip(gb, 1);
2070  i = 0;
2071  while (bytestream2_get_bytes_left(gb) > 0 &&
2072  bytestream2_peek_byte(gb) && i < 255) {
2073  type[i++] = bytestream2_get_byte(gb);
2074  }
2075  bytestream2_skip(gb, 1);
2076  size = bytestream2_get_le32(gb);
2077 
2078  bytestream2_get_buffer(gb, value, FFMIN(sizeof(value) - 1, size));
2079  if (size > sizeof(value) - 1)
2080  bytestream2_skip(gb, size - (sizeof(value) - 1));
2081  if (!strcmp(type, "string"))
2082  av_dict_set(&metadata, name, value, 0);
2083  }
2084  }
2085 
2086  if (s->compression == EXR_UNKN) {
2087  av_log(s->avctx, AV_LOG_ERROR, "Missing compression attribute.\n");
2089  goto fail;
2090  }
2091 
2092  if (s->is_tile) {
2093  if (s->tile_attr.xSize < 1 || s->tile_attr.ySize < 1) {
2094  av_log(s->avctx, AV_LOG_ERROR, "Invalid tile attribute.\n");
2096  goto fail;
2097  }
2098  }
2099 
2100  if (bytestream2_get_bytes_left(gb) <= 0) {
2101  av_log(s->avctx, AV_LOG_ERROR, "Incomplete frame.\n");
2103  goto fail;
2104  }
2105 
2106  frame->metadata = metadata;
2107 
2108  // aaand we are done
2109  bytestream2_skip(gb, 1);
2110  return 0;
2111 fail:
2113  return ret;
2114 }
2115 
2116 static int decode_frame(AVCodecContext *avctx, AVFrame *picture,
2117  int *got_frame, AVPacket *avpkt)
2118 {
2119  EXRContext *s = avctx->priv_data;
2120  GetByteContext *gb = &s->gb;
2121  uint8_t *ptr;
2122 
2123  int i, y, ret, ymax;
2124  int planes;
2125  int out_line_size;
2126  int nb_blocks; /* nb scanline or nb tile */
2127  uint64_t start_offset_table;
2128  uint64_t start_next_scanline;
2129 
2130  bytestream2_init(gb, avpkt->data, avpkt->size);
2131 
2132  if ((ret = decode_header(s, picture)) < 0)
2133  return ret;
2134 
2135  if (s->compression == EXR_DWAA ||
2136  s->compression == EXR_DWAB) {
2137  for (int i = 0; i<s->nb_channels; i++) {
2138  EXRChannel *channel = &s->channels[i];
2139  if (channel->pixel_type != s->pixel_type) {
2140  avpriv_request_sample(s->avctx, "mixed pixel type DWA");
2141  return AVERROR_PATCHWELCOME;
2142  }
2143  }
2144  }
2145 
2146  switch (s->pixel_type) {
2147  case EXR_HALF:
2148  if (s->channel_offsets[3] >= 0) {
2149  if (!s->is_luma) {
2150  avctx->pix_fmt = AV_PIX_FMT_GBRAPF16;
2151  } else {
2152  avctx->pix_fmt = AV_PIX_FMT_YAF16;
2153  }
2154  } else {
2155  if (!s->is_luma) {
2156  avctx->pix_fmt = AV_PIX_FMT_GBRPF16;
2157  } else {
2158  avctx->pix_fmt = AV_PIX_FMT_GRAYF16;
2159  }
2160  }
2161  break;
2162  case EXR_FLOAT:
2163  if (s->channel_offsets[3] >= 0) {
2164  if (!s->is_luma) {
2165  avctx->pix_fmt = AV_PIX_FMT_GBRAPF32;
2166  } else {
2167  avctx->pix_fmt = AV_PIX_FMT_YAF32;
2168  }
2169  } else {
2170  if (!s->is_luma) {
2171  avctx->pix_fmt = AV_PIX_FMT_GBRPF32;
2172  } else {
2173  avctx->pix_fmt = AV_PIX_FMT_GRAYF32;
2174  }
2175  }
2176  break;
2177  case EXR_UINT:
2178  if (s->channel_offsets[3] >= 0) {
2179  if (!s->is_luma) {
2180  avctx->pix_fmt = AV_PIX_FMT_RGBA64;
2181  } else {
2182  avctx->pix_fmt = AV_PIX_FMT_YA16;
2183  }
2184  } else {
2185  if (!s->is_luma) {
2186  avctx->pix_fmt = AV_PIX_FMT_RGB48;
2187  } else {
2188  avctx->pix_fmt = AV_PIX_FMT_GRAY16;
2189  }
2190  }
2191  break;
2192  default:
2193  av_log(avctx, AV_LOG_ERROR, "Missing channel list.\n");
2194  return AVERROR_INVALIDDATA;
2195  }
2196 
2197  if (s->channel_offsets[3] >= 0)
2199 
2200 #if FF_API_EXR_GAMMA
2201  if (s->apply_trc_type != AVCOL_TRC_UNSPECIFIED)
2202  avctx->color_trc = s->apply_trc_type;
2203  else if (s->gamma > 0.9999f && s->gamma < 1.0001f)
2204 #endif
2205  avctx->color_trc = AVCOL_TRC_LINEAR;
2206 
2207  switch (s->compression) {
2208  case EXR_RAW:
2209  case EXR_RLE:
2210  case EXR_ZIP1:
2211  s->scan_lines_per_block = 1;
2212  break;
2213  case EXR_PXR24:
2214  case EXR_ZIP16:
2215  s->scan_lines_per_block = 16;
2216  break;
2217  case EXR_PIZ:
2218  case EXR_B44:
2219  case EXR_B44A:
2220  case EXR_DWAA:
2221  s->scan_lines_per_block = 32;
2222  break;
2223  case EXR_DWAB:
2224  s->scan_lines_per_block = 256;
2225  break;
2226  default:
2227  avpriv_report_missing_feature(avctx, "Compression %d", s->compression);
2228  return AVERROR_PATCHWELCOME;
2229  }
2230 
2231  /* Verify the xmin, xmax, ymin and ymax before setting the actual image size.
2232  * It's possible for the data window can larger or outside the display window */
2233  if (s->xmin > s->xmax || s->ymin > s->ymax ||
2234  s->ydelta == 0xFFFFFFFF || s->xdelta == 0xFFFFFFFF) {
2235  av_log(avctx, AV_LOG_ERROR, "Wrong or missing size information.\n");
2236  return AVERROR_INVALIDDATA;
2237  }
2238 
2239  if ((ret = ff_set_dimensions(avctx, s->w, s->h)) < 0)
2240  return ret;
2241 
2242  ff_set_sar(s->avctx, av_d2q(av_int2float(s->sar), 255));
2243 
2244  if (avctx->skip_frame >= AVDISCARD_ALL)
2245  return avpkt->size;
2246 
2247  s->desc = av_pix_fmt_desc_get(avctx->pix_fmt);
2248  if (!s->desc)
2249  return AVERROR_INVALIDDATA;
2250 
2252  out_line_size = avctx->width * s->desc->comp[0].step;
2253 
2254  if (s->is_tile) {
2255  if (s->tile_attr.ySize <= 0 || s->tile_attr.xSize <= 0)
2256  return AVERROR_INVALIDDATA;
2257  nb_blocks = ((s->xdelta + s->tile_attr.xSize - 1) / s->tile_attr.xSize) *
2258  ((s->ydelta + s->tile_attr.ySize - 1) / s->tile_attr.ySize);
2259  } else { /* scanline */
2260  nb_blocks = (s->ydelta + s->scan_lines_per_block - 1) /
2261  s->scan_lines_per_block;
2262  }
2263 
2264  if ((ret = ff_thread_get_buffer(avctx, picture, 0)) < 0)
2265  return ret;
2266 
2267  if (bytestream2_get_bytes_left(gb)/8 < nb_blocks)
2268  return AVERROR_INVALIDDATA;
2269 
2270  // check offset table and recreate it if need
2271  if (!s->is_tile && bytestream2_peek_le64(gb) == 0) {
2272  PutByteContext offset_table_writer;
2273 
2274  av_log(s->avctx, AV_LOG_DEBUG, "recreating invalid scanline offset table\n");
2275 
2276  s->offset_table = av_realloc_f(s->offset_table, nb_blocks, 8);
2277  if (!s->offset_table)
2278  return AVERROR(ENOMEM);
2279 
2280  start_offset_table = bytestream2_tell(gb);
2281  start_next_scanline = start_offset_table + nb_blocks * 8;
2282  bytestream2_init_writer(&offset_table_writer, s->offset_table, nb_blocks * 8);
2283 
2284  for (y = 0; y < nb_blocks; y++) {
2285  /* write offset of prev scanline in offset table */
2286  bytestream2_put_le64(&offset_table_writer, start_next_scanline);
2287 
2288  /* get len of next scanline */
2289  bytestream2_seek(gb, start_next_scanline + 4, SEEK_SET);/* skip line number */
2290  start_next_scanline += (bytestream2_get_le32(gb) + 8);
2291  }
2292  bytestream2_init(gb, s->offset_table, nb_blocks * 8);
2293  }
2294 
2295  // save pointer we are going to use in decode_block
2296  s->buf = avpkt->data;
2297  s->buf_size = avpkt->size;
2298 
2299  // Zero out the start if ymin is not 0
2300  for (i = 0; i < planes; i++) {
2301  ptr = picture->data[i];
2302  for (y = 0; y < FFMIN(s->ymin, s->h); y++) {
2303  memset(ptr, 0, out_line_size);
2304  ptr += picture->linesize[i];
2305  }
2306  }
2307 
2308  s->picture = picture;
2309 
2310  avctx->execute2(avctx, decode_block, s->thread_data, NULL, nb_blocks);
2311 
2312  ymax = FFMAX(0, s->ymax + 1);
2313  // Zero out the end if ymax+1 is not h
2314  if (ymax < avctx->height)
2315  for (i = 0; i < planes; i++) {
2316  ptr = picture->data[i] + (ymax * picture->linesize[i]);
2317  for (y = ymax; y < avctx->height; y++) {
2318  memset(ptr, 0, out_line_size);
2319  ptr += picture->linesize[i];
2320  }
2321  }
2322 
2323  picture->pict_type = AV_PICTURE_TYPE_I;
2324  *got_frame = 1;
2325 
2326  return avpkt->size;
2327 }
2328 
2330 {
2331  EXRContext *s = avctx->priv_data;
2332 #if FF_API_EXR_GAMMA
2333  uint32_t i;
2334  union av_intfloat32 t;
2335  float one_gamma = 1.0f / s->gamma;
2336  av_csp_trc_function trc_func = NULL;
2337 #endif
2338 
2339  ff_init_float2half_tables(&s->f2h_tables);
2340  ff_init_half2float_tables(&s->h2f_tables);
2341 
2342  s->avctx = avctx;
2343 
2344  ff_exrdsp_init(&s->dsp);
2345 
2346 #if HAVE_BIGENDIAN
2347  ff_bswapdsp_init(&s->bbdsp);
2348 #endif
2349 
2350 #if FF_API_EXR_GAMMA
2351  trc_func = av_csp_trc_func_from_id(s->apply_trc_type);
2352  if (trc_func) {
2353  for (i = 0; i < 65536; ++i) {
2354  t.i = half2float(i, &s->h2f_tables);
2355  t.f = trc_func(t.f);
2356  s->gamma_table[i] = float2half(av_float2int(t.f), &s->f2h_tables);
2357  }
2358  } else if (one_gamma != 1.0f) {
2359  for (i = 0; i < 65536; ++i) {
2360  t.i = half2float(i, &s->h2f_tables);
2361  /* If negative value we reuse half value */
2362  if (t.f <= 0.0f) {
2363  s->gamma_table[i] = i;
2364  } else {
2365  t.f = powf(t.f, one_gamma);
2366  s->gamma_table[i] = float2half(t.i, &s->f2h_tables);
2367  }
2368  }
2369  }
2370 #endif
2371 
2372  // allocate thread data, used for non EXR_RAW compression types
2373  s->thread_data = av_calloc(avctx->thread_count, sizeof(*s->thread_data));
2374  if (!s->thread_data)
2375  return AVERROR(ENOMEM);
2376 
2377  return 0;
2378 }
2379 
2381 {
2382  EXRContext *s = avctx->priv_data;
2383  int i;
2384  for (i = 0; i < avctx->thread_count; i++) {
2385  EXRThreadData *td = &s->thread_data[i];
2387  av_freep(&td->tmp);
2388  av_freep(&td->bitmap);
2389  av_freep(&td->lut);
2390  av_freep(&td->he);
2391  av_freep(&td->freq);
2392  av_freep(&td->ac_data);
2393  av_freep(&td->dc_data);
2394  av_freep(&td->rle_data);
2395  av_freep(&td->rle_raw_data);
2396  ff_vlc_free(&td->vlc);
2397  }
2398 
2399  av_freep(&s->thread_data);
2400  av_freep(&s->channels);
2401  av_freep(&s->offset_table);
2402 
2403  return 0;
2404 }
2405 
2406 #define OFFSET(x) offsetof(EXRContext, x)
2407 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
2408 static const AVOption options[] = {
2409  { "layer", "Set the decoding layer", OFFSET(layer),
2410  AV_OPT_TYPE_STRING, { .str = "" }, 0, 0, VD },
2411  { "part", "Set the decoding part", OFFSET(selected_part),
2412  AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VD },
2413 #if FF_API_EXR_GAMMA
2414  { "gamma", "Set the float gamma value when decoding (deprecated, use a scaler)", OFFSET(gamma),
2415  AV_OPT_TYPE_FLOAT, { .dbl = 1.0f }, 0.001, FLT_MAX, VD | AV_OPT_FLAG_DEPRECATED },
2416 
2417  // XXX: Note the abuse of the enum using AVCOL_TRC_UNSPECIFIED to subsume the existing gamma option
2418  { "apply_trc", "color transfer characteristics to apply to EXR linear input (deprecated, use a scaler)", OFFSET(apply_trc_type),
2419  AV_OPT_TYPE_INT, {.i64 = AVCOL_TRC_UNSPECIFIED }, 1, AVCOL_TRC_NB-1, VD | AV_OPT_FLAG_DEPRECATED, .unit = "apply_trc_type"},
2420  { "bt709", "BT.709", 0,
2421  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT709 }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2422  { "gamma", "gamma", 0,
2423  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_UNSPECIFIED }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2424  { "gamma22", "BT.470 M", 0,
2425  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_GAMMA22 }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2426  { "gamma28", "BT.470 BG", 0,
2427  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_GAMMA28 }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2428  { "smpte170m", "SMPTE 170 M", 0,
2429  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE170M }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2430  { "smpte240m", "SMPTE 240 M", 0,
2431  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE240M }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2432  { "linear", "Linear", 0,
2433  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LINEAR }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2434  { "log", "Log", 0,
2435  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LOG }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2436  { "log_sqrt", "Log square root", 0,
2437  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LOG_SQRT }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2438  { "iec61966_2_4", "IEC 61966-2-4", 0,
2439  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_IEC61966_2_4 }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2440  { "bt1361", "BT.1361", 0,
2441  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT1361_ECG }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2442  { "iec61966_2_1", "IEC 61966-2-1", 0,
2443  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_IEC61966_2_1 }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2444  { "bt2020_10bit", "BT.2020 - 10 bit", 0,
2445  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT2020_10 }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2446  { "bt2020_12bit", "BT.2020 - 12 bit", 0,
2447  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT2020_12 }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2448  { "smpte2084", "SMPTE ST 2084", 0,
2449  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTEST2084 }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2450  { "smpte428_1", "SMPTE ST 428-1", 0,
2451  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTEST428_1 }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2452 #endif
2453 
2454  { NULL },
2455 };
2456 
2457 static const AVClass exr_class = {
2458  .class_name = "EXR",
2459  .item_name = av_default_item_name,
2460  .option = options,
2461  .version = LIBAVUTIL_VERSION_INT,
2462 };
2463 
2465  .p.name = "exr",
2466  CODEC_LONG_NAME("OpenEXR image"),
2467  .p.type = AVMEDIA_TYPE_VIDEO,
2468  .p.id = AV_CODEC_ID_EXR,
2469  .priv_data_size = sizeof(EXRContext),
2470  .init = decode_init,
2471  .close = decode_end,
2473  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS |
2475  .caps_internal = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM,
2476  .p.priv_class = &exr_class,
2477 };
flags
const SwsFlags flags[]
Definition: swscale.c:72
bswapdsp.h
EXRTileAttribute::level_round
enum ExrTileLevelRound level_round
Definition: exr.c:111
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
EXRThreadData
Definition: exr.c:114
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
EXR_TILE_ROUND_DOWN
@ EXR_TILE_ROUND_DOWN
Definition: exr.c:92
AVCodecContext::alpha_mode
enum AVAlphaMode alpha_mode
Indicates how the alpha channel of the video is represented.
Definition: avcodec.h:1944
Half2FloatTables
Definition: half2float.h:27
EXRThreadData::uncompressed_size
int uncompressed_size
Definition: exr.c:116
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:688
r
const char * r
Definition: vf_curves.c:127
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
EXRThreadData::rle_raw_size
unsigned rle_raw_size
Definition: exr.c:134
AVALPHA_MODE_PREMULTIPLIED
@ AVALPHA_MODE_PREMULTIPLIED
Alpha channel is multiplied into color values.
Definition: pixfmt.h:812
bytestream2_get_bytes_left
static av_always_inline int bytestream2_get_bytes_left(const GetByteContext *g)
Definition: bytestream.h:158
EXRTileAttribute
Definition: exr.c:107
AVColorTransferCharacteristic
AVColorTransferCharacteristic
Color Transfer Characteristic.
Definition: pixfmt.h:666
out
static FILE * out
Definition: movenc.c:55
EXRThreadData::lut
uint16_t * lut
Definition: exr.c:122
Float2HalfTables
Definition: float2half.h:27
GetByteContext
Definition: bytestream.h:33
EXR_TILE_LEVEL_ONE
@ EXR_TILE_LEVEL_ONE
Definition: exr.c:84
ff_init_float2half_tables
void ff_init_float2half_tables(Float2HalfTables *t)
Definition: float2half.c:21
EXRThreadData::uncompressed_data
uint8_t * uncompressed_data
Definition: exr.c:115
VD
#define VD
Definition: exr.c:2407
bytestream2_tell
static av_always_inline int bytestream2_tell(const GetByteContext *g)
Definition: bytestream.h:192
HuffEntry::len
uint8_t len
Definition: exr.c:97
AV_RL64
uint64_t_TMPL AV_RL64
Definition: bytestream.h:91
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3456
AVCOL_TRC_LINEAR
@ AVCOL_TRC_LINEAR
"Linear transfer characteristics"
Definition: pixfmt.h:675
decode_header
static int decode_header(EXRContext *s, AVFrame *frame)
Definition: exr.c:1604
EXRContext::layer
const char * layer
Definition: exr.c:192
int64_t
long long int64_t
Definition: coverity.c:34
av_strcasecmp
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
Definition: avstring.c:208
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:254
AV_PIX_FMT_FLAG_FLOAT
#define AV_PIX_FMT_FLAG_FLOAT
The pixel format contains IEEE-754 floating point values.
Definition: pixdesc.h:158
decode_frame
static int decode_frame(AVCodecContext *avctx, AVFrame *picture, int *got_frame, AVPacket *avpkt)
Definition: exr.c:2116
ph
static int FUNC() ph(CodedBitstreamContext *ctx, RWContext *rw, H266RawPH *current)
Definition: cbs_h266_syntax_template.c:3052
bytestream2_seek
static av_always_inline int bytestream2_seek(GetByteContext *g, int offset, int whence)
Definition: bytestream.h:212
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:435
EXRContext::chunk_count
uint32_t chunk_count
Definition: exr.c:188
EXRContext::picture
AVFrame * picture
Definition: exr.c:150
AVCOL_TRC_NB
@ AVCOL_TRC_NB
Not part of ABI.
Definition: pixfmt.h:688
EXRThreadData::rle_data
uint8_t * rle_data
Definition: exr.c:130
step
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
Definition: rate_distortion.txt:58
AVCodecContext::color_trc
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:660
u
#define u(width, name, range_min, range_max)
Definition: cbs_apv.c:68
AVPacket::data
uint8_t * data
Definition: packet.h:595
av_intfloat32::i
uint32_t i
Definition: intfloat.h:28
ExrPixelType
ExrPixelType
Definition: exr.c:76
AVOption
AVOption.
Definition: opt.h:429
b
#define b
Definition: input.c:43
AVCOL_TRC_UNSPECIFIED
@ AVCOL_TRC_UNSPECIFIED
Definition: pixfmt.h:669
decode_init
static av_cold int decode_init(AVCodecContext *avctx)
Definition: exr.c:2329
reverse_lut
static uint16_t reverse_lut(const uint8_t *bitmap, uint16_t *lut)
Definition: exr.c:285
expf
#define expf(x)
Definition: libm.h:285
FFCodec
Definition: codec_internal.h:127
EXRThreadData::vlc
VLC vlc
Definition: exr.c:145
float.h
AVCOL_TRC_BT2020_12
@ AVCOL_TRC_BT2020_12
ITU-R BT2020 for 12-bit system.
Definition: pixfmt.h:682
AV_WN32A
#define AV_WN32A(p, v)
Definition: intreadwrite.h:534
EXRContext::has_channel
int has_channel
combination of flags representing the channel codes A-Z
Definition: exr.c:179
EXRThreadData::ysize
int ysize
Definition: exr.c:138
piz_uncompress
static int piz_uncompress(const EXRContext *s, const uint8_t *src, int ssize, int dsize, EXRThreadData *td)
Definition: exr.c:605
AVDictionary
Definition: dict.c:32
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
av_float2int
static av_always_inline uint32_t av_float2int(float f)
Reinterpret a float as a 32-bit integer.
Definition: intfloat.h:50
options
static const AVOption options[]
Definition: exr.c:2408
EXRThreadData::tmp_size
int tmp_size
Definition: exr.c:119
intfloat.h
EXRThreadData::dc_data
uint8_t * dc_data
Definition: exr.c:127
ff_set_dimensions
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Definition: utils.c:91
EXRThreadData::rle_size
unsigned rle_size
Definition: exr.c:131
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:517
thread.h
b44_uncompress
static int b44_uncompress(const EXRContext *s, const uint8_t *src, int compressed_size, int uncompressed_size, EXRThreadData *td)
Definition: exr.c:829
rle
static int rle(uint8_t *dst, const uint8_t *src, int compressed_size, int uncompressed_size)
Definition: exr.c:225
convert
static void convert(float y, float u, float v, float *b, float *g, float *r)
Definition: exr.c:976
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:456
EXRContext::channel_offsets
int channel_offsets[4]
Definition: exr.c:160
EXR_B44A
@ EXR_B44A
Definition: exr.c:70
av_csp_trc_func_from_id
av_csp_trc_function av_csp_trc_func_from_id(enum AVColorTransferCharacteristic trc)
Determine the function needed to apply the given AVColorTransferCharacteristic to linear input.
Definition: csp.c:468
EXR_HALF
@ EXR_HALF
Definition: exr.c:78
px
#define px
Definition: ops_tmpl_float.c:35
close
static av_cold void close(AVCodecParserContext *s)
Definition: apv_parser.c:197
bytestream2_skip
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
Definition: bytestream.h:168
av_pix_fmt_count_planes
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3496
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:337
ub
#define ub(width, name)
Definition: cbs_apv.c:125
rgb
Definition: rpzaenc.c:60
EXR_DWAA
@ EXR_DWAA
Definition: exr.c:71
EXRContext::tile_attr
EXRTileAttribute tile_attr
Definition: exr.c:171
mx
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t mx
Definition: dsp.h:57
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
apply_lut
static void apply_lut(const uint16_t *lut, uint16_t *dst, int dsize)
Definition: exr.c:300
AVCOL_TRC_IEC61966_2_1
@ AVCOL_TRC_IEC61966_2_1
IEC 61966-2-1 (sRGB or sYCC)
Definition: pixfmt.h:680
cosf
#define cosf(x)
Definition: libm.h:80
AVCodecContext::skip_frame
enum AVDiscard skip_frame
Skip decoding for selected frames.
Definition: avcodec.h:1674
fail
#define fail()
Definition: checkasm.h:224
av_int2float
static av_always_inline float av_int2float(uint32_t i)
Reinterpret a 32-bit integer as a float.
Definition: intfloat.h:40
AVCodecContext::thread_count
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
Definition: avcodec.h:1573
EXR_TILE_LEVEL_RIPMAP
@ EXR_TILE_LEVEL_RIPMAP
Definition: exr.c:86
EXR_TILE_ROUND_UNKNOWN
@ EXR_TILE_ROUND_UNKNOWN
Definition: exr.c:93
FFSIGN
#define FFSIGN(a)
Definition: common.h:75
GetBitContext
Definition: get_bits.h:109
AVCOL_TRC_GAMMA28
@ AVCOL_TRC_GAMMA28
also ITU-R BT470BG
Definition: pixfmt.h:672
EXRContext::current_part
int current_part
Definition: exr.c:174
val
static double val(void *priv, double ch)
Definition: aeval.c:77
AV_PIX_FMT_GRAYF16
#define AV_PIX_FMT_GRAYF16
Definition: pixfmt.h:581
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_GRAY16
Definition: pixfmt.h:522
AV_PIX_FMT_YAF32
#define AV_PIX_FMT_YAF32
Definition: pixfmt.h:585
AVCOL_TRC_LOG_SQRT
@ AVCOL_TRC_LOG_SQRT
"Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)"
Definition: pixfmt.h:677
fabsf
static __device__ float fabsf(float a)
Definition: cuda_runtime.h:181
EXRContext::avctx
AVCodecContext * avctx
Definition: exr.c:151
ff_exr_decoder
const FFCodec ff_exr_decoder
Definition: exr.c:2464
AVCOL_TRC_SMPTEST428_1
@ AVCOL_TRC_SMPTEST428_1
Definition: pixfmt.h:686
huf_build_dec_table
static int huf_build_dec_table(const EXRContext *s, EXRThreadData *td, int im, int iM)
Definition: exr.c:382
EXRThreadData::he
HuffEntry * he
Definition: exr.c:143
AVCOL_TRC_GAMMA22
@ AVCOL_TRC_GAMMA22
also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
Definition: pixfmt.h:671
av_image_check_size2
int av_image_check_size2(unsigned int w, unsigned int h, int64_t max_pixels, enum AVPixelFormat pix_fmt, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of a plane of an image with...
Definition: imgutils.c:289
EXRContext::scan_lines_per_block
int scan_lines_per_block
Definition: exr.c:169
EXRContext::h
int h
Definition: exr.c:163
EXRThreadData::rle_raw_data
uint8_t * rle_raw_data
Definition: exr.c:133
EXR_DWAB
@ EXR_DWAB
Definition: exr.c:72
ExrDSPContext
Definition: exrdsp.h:25
EXRThreadData::channel_line_size
int channel_line_size
Definition: exr.c:140
USHORT_RANGE
#define USHORT_RANGE
Definition: exr.c:282
avassert.h
to_linear
static float to_linear(float x, float scale)
Definition: exr.c:984
decode_end
static av_cold int decode_end(AVCodecContext *avctx)
Definition: exr.c:2380
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
av_cold
#define av_cold
Definition: attributes.h:119
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:544
EXRContext::sar
uint32_t sar
Definition: exr.c:164
EXRThreadData::ac_size
unsigned ac_size
Definition: exr.c:125
EXR_FLOAT
@ EXR_FLOAT
Definition: exr.c:79
BITMAP_SIZE
#define BITMAP_SIZE
Definition: exr.c:283
bytestream2_init_writer
static av_always_inline void bytestream2_init_writer(PutByteContext *p, uint8_t *buf, int buf_size)
Definition: bytestream.h:147
EXRContext::compression
enum ExrCompr compression
Definition: exr.c:158
EXRThreadData::ac_data
uint8_t * ac_data
Definition: exr.c:124
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:347
check_header_variable
static int check_header_variable(EXRContext *s, const char *value_name, const char *value_type, unsigned int minimum_length)
Check if the variable name corresponds to its data type.
Definition: exr.c:1574
s
#define s(width, name)
Definition: cbs_vp9.c:198
huf_canonical_code_table
static void huf_canonical_code_table(uint64_t *freq)
Definition: exr.c:311
AVCOL_TRC_BT1361_ECG
@ AVCOL_TRC_BT1361_ECG
ITU-R BT1361 Extended Colour Gamut.
Definition: pixfmt.h:679
av_realloc_array
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition: mem.c:217
g
const char * g
Definition: vf_curves.c:128
ff_thread_get_buffer
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
Definition: pthread_frame.c:1044
GetByteContext::buffer
const uint8_t * buffer
Definition: bytestream.h:34
EXRContext::current_channel_offset
int current_channel_offset
Definition: exr.c:187
HuffEntry::sym
uint16_t sym
Definition: exr.c:98
EXRContext::xmax
int32_t xmax
Definition: exr.c:165
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
decode_block
static int decode_block(AVCodecContext *avctx, void *tdata, int jobnr, int threadnr)
Definition: exr.c:1250
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
EXRChannel::pixel_type
enum ExrPixelType pixel_type
Definition: exr.c:104
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
decode.h
get_bits.h
EXRContext::gamma_table
uint16_t gamma_table[65536]
Definition: exr.c:201
AV_WN16A
#define AV_WN16A(p, v)
Definition: intreadwrite.h:530
AVCodecContext::max_pixels
int64_t max_pixels
The number of pixels per image to maximally accept.
Definition: avcodec.h:1794
SHORTEST_LONG_RUN
#define SHORTEST_LONG_RUN
Definition: exr.c:336
blk
#define blk(i)
Definition: sha.c:186
skip_header_chunk
static void skip_header_chunk(EXRContext *s)
Definition: exr.c:1545
key
const char * key
Definition: hwcontext_opencl.c:189
AV_PIX_FMT_GRAYF32
#define AV_PIX_FMT_GRAYF32
Definition: pixfmt.h:582
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:332
tmp
static uint8_t tmp[40]
Definition: aes_ctr.c:52
EXR_ZIP1
@ EXR_ZIP1
Definition: exr.c:65
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:74
if
if(ret)
Definition: filter_design.txt:179
EXRContext::desc
const AVPixFmtDescriptor * desc
Definition: exr.c:161
AV_CODEC_CAP_FRAME_THREADS
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: codec.h:95
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:232
av_realloc_f
#define av_realloc_f(p, o, n)
Definition: tableprint_vlc.h:33
EXRContext::is_luma
int is_luma
Definition: exr.c:176
AV_CODEC_ID_EXR
@ AV_CODEC_ID_EXR
Definition: codec_id.h:234
AV_PIX_FMT_RGBA64
#define AV_PIX_FMT_RGBA64
Definition: pixfmt.h:529
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
ff_bswapdsp_init
av_cold void ff_bswapdsp_init(BswapDSPContext *c)
Definition: bswapdsp.c:37
metadata
Stream codec metadata
Definition: ogg-flac-chained-meta.txt:2
exrdsp.h
NULL
#define NULL
Definition: coverity.c:32
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
run
uint8_t run
Definition: svq3.c:207
bias
static int bias(int x, int c)
Definition: vqcdec.c:115
LONG_ZEROCODE_RUN
#define LONG_ZEROCODE_RUN
Definition: exr.c:335
pixel
uint8_t pixel
Definition: tiny_ssim.c:41
SHORT_ZEROCODE_RUN
#define SHORT_ZEROCODE_RUN
Definition: exr.c:334
AVCOL_TRC_IEC61966_2_4
@ AVCOL_TRC_IEC61966_2_4
IEC 61966-2-4.
Definition: pixfmt.h:678
EXR_RLE
@ EXR_RLE
Definition: exr.c:64
EXR_TILE_ROUND_UP
@ EXR_TILE_ROUND_UP
Definition: exr.c:91
EXRChannel::ysub
int ysub
Definition: exr.c:103
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:242
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:278
EXRThreadData::block
float block[3][64]
Definition: exr.c:136
ff_set_sar
int ff_set_sar(AVCodecContext *avctx, AVRational sar)
Check that the provided sample aspect ratio is valid and set it on the codec context.
Definition: utils.c:106
mathops.h
options
Definition: swscale.c:45
bytestream2_get_buffer
static av_always_inline unsigned int bytestream2_get_buffer(GetByteContext *g, uint8_t *dst, unsigned int size)
Definition: bytestream.h:267
ff_exrdsp_init
av_cold void ff_exrdsp_init(ExrDSPContext *c)
Definition: exrdsp.c:59
EXRContext::w
int w
Definition: exr.c:163
AVCOL_TRC_BT2020_10
@ AVCOL_TRC_BT2020_10
ITU-R BT2020 for 10-bit system.
Definition: pixfmt.h:681
av_intfloat32
Definition: intfloat.h:27
unpack_14
static void unpack_14(const uint8_t b[14], uint16_t s[16])
Definition: exr.c:778
EXR_PIZ
@ EXR_PIZ
Definition: exr.c:67
A_OFFSET
#define A_OFFSET
Definition: exr.c:513
get_vlc2
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:645
AV_PIX_FMT_GBRPF16
#define AV_PIX_FMT_GBRPF16
Definition: pixfmt.h:576
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
EXRContext::f2h_tables
Float2HalfTables f2h_tables
Definition: exr.c:204
EXRThreadData::bitmap
uint8_t * bitmap
Definition: exr.c:121
PutByteContext
Definition: bytestream.h:37
EXRContext::pixel_type
enum ExrPixelType pixel_type
Definition: exr.c:159
EXRTileAttribute::level_mode
enum ExrTileLevelMode level_mode
Definition: exr.c:110
EXRChannel::xsub
int xsub
Definition: exr.c:103
EXRContext::thread_data
EXRThreadData * thread_data
Definition: exr.c:190
EXR_RAW
@ EXR_RAW
Definition: exr.c:63
f
f
Definition: af_crystalizer.c:122
AVFrame::pict_type
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:527
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:551
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
wdec14
static void wdec14(uint16_t l, uint16_t h, uint16_t *a, uint16_t *b)
Definition: exr.c:499
AVPacket::size
int size
Definition: packet.h:596
wav_decode
static void wav_decode(uint16_t *in, int nx, int ox, int ny, int oy, uint16_t mx)
Definition: exr.c:526
dc
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled top and top right vectors is used as motion vector prediction the used motion vector is the sum of the predictor and(mvx_diff, mvy_diff) *mv_scale Intra DC Prediction block[y][x] dc[1]
Definition: snow.txt:400
powf
#define powf(x, y)
Definition: libm.h:52
AVCOL_TRC_SMPTE240M
@ AVCOL_TRC_SMPTE240M
Definition: pixfmt.h:674
height
#define height
Definition: dsp.h:89
codec_internal.h
MOD_MASK
#define MOD_MASK
Definition: exr.c:514
dwa_uncompress
static int dwa_uncompress(const EXRContext *s, const uint8_t *src, int compressed_size, int uncompressed_size, EXRThreadData *td)
Definition: exr.c:997
shift
static int shift(int a, int b)
Definition: bonk.c:261
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
AVCOL_TRC_SMPTEST2084
@ AVCOL_TRC_SMPTEST2084
Definition: pixfmt.h:684
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
AVCOL_TRC_LOG
@ AVCOL_TRC_LOG
"Logarithmic transfer characteristic (100:1 range)"
Definition: pixfmt.h:676
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:424
EXRTileAttribute::xSize
int32_t xSize
Definition: exr.c:108
bytestream2_get_ne16
#define bytestream2_get_ne16
Definition: bytestream.h:119
AV_PIX_FMT_GBRPF32
#define AV_PIX_FMT_GBRPF32
Definition: pixfmt.h:578
AV_PIX_FMT_RGB48
#define AV_PIX_FMT_RGB48
Definition: pixfmt.h:525
size
int size
Definition: twinvq_data.h:10344
EXRThreadData::tmp
uint8_t * tmp
Definition: exr.c:118
EXRContext::is_tile
int is_tile
Definition: exr.c:172
EXR_TILE_LEVEL_MIPMAP
@ EXR_TILE_LEVEL_MIPMAP
Definition: exr.c:85
FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM
#define FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM
The decoder extracts and fills its parameters even if the frame is skipped due to the skip_frame sett...
Definition: codec_internal.h:55
avpriv_report_missing_feature
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
EXRContext::gamma
float gamma
Definition: exr.c:200
ac_uncompress
static int ac_uncompress(const EXRContext *s, GetByteContext *gb, float *block)
Definition: exr.c:900
diff
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
Definition: vf_paletteuse.c:166
EXRContext::gb
GetByteContext gb
Definition: exr.c:181
idct_1d
static void idct_1d(float *blk, int step)
Definition: exr.c:921
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
EXRContext::ymin
int32_t ymin
Definition: exr.c:166
csp.h
AV_CODEC_CAP_SLICE_THREADS
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
Definition: codec.h:99
planes
static const struct @585 planes[]
line
Definition: graph2dot.c:48
av_dict_free
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition: dict.c:233
EXR_ZIP16
@ EXR_ZIP16
Definition: exr.c:66
EXRContext::apply_trc_type
enum AVColorTransferCharacteristic apply_trc_type
Definition: exr.c:199
ff_vlc_init_sparse
int ff_vlc_init_sparse(VLC *vlc, int nb_bits, int nb_codes, const void *bits, int bits_wrap, int bits_size, const void *codes, int codes_wrap, int codes_size, const void *symbols, int symbols_wrap, int symbols_size, int flags)
Build VLC decoding tables suitable for use with get_vlc2().
Definition: vlc.c:250
version
version
Definition: libkvazaar.c:313
M_PI
#define M_PI
Definition: mathematics.h:67
half2float.h
unpack_3
static void unpack_3(const uint8_t b[3], uint16_t s[16])
Definition: exr.c:813
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
AVCOL_TRC_BT709
@ AVCOL_TRC_BT709
also ITU-R BT1361
Definition: pixfmt.h:668
AV_OPT_TYPE_FLOAT
@ AV_OPT_TYPE_FLOAT
Underlying C type is float.
Definition: opt.h:271
dct_inverse
static void dct_inverse(float *block)
Definition: exr.c:965
av_csp_trc_function
double(* av_csp_trc_function)(double)
Function pointer representing a double -> double transfer function that performs either an OETF trans...
Definition: csp.h:91
EXRContext::selected_part
int selected_part
Definition: exr.c:193
AV_OPT_FLAG_DEPRECATED
#define AV_OPT_FLAG_DEPRECATED
Set if option is deprecated, users should refer to AVOption.help text for more information.
Definition: opt.h:386
EXRContext::h2f_tables
Half2FloatTables h2f_tables
Definition: exr.c:205
ExrTileLevelRound
ExrTileLevelRound
Definition: exr.c:90
OFFSET
#define OFFSET(x)
Definition: exr.c:2406
av_malloc
#define av_malloc(s)
Definition: ops_asmgen.c:44
AV_PIX_FMT_YA16
#define AV_PIX_FMT_YA16
Definition: pixfmt.h:524
FFMIN3
#define FFMIN3(a, b, c)
Definition: macros.h:50
EXRContext::offset_table
uint8_t * offset_table
Definition: exr.c:196
HUF_ENCSIZE
#define HUF_ENCSIZE
Definition: exr.c:309
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:32
common.h
EXRContext::buf
const uint8_t * buf
Definition: exr.c:182
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:58
EXRThreadData::xsize
int xsize
Definition: exr.c:138
av_fast_padded_malloc
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional AV_INPUT_BUFFER_PADDING_SIZE at the end w...
Definition: utils.c:53
EXR_PXR24
@ EXR_PXR24
Definition: exr.c:68
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
av_toupper
static av_const int av_toupper(int c)
Locale-independent conversion of ASCII characters to uppercase.
Definition: avstring.h:227
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
av_d2q
AVRational av_d2q(double d, int max)
Convert a double precision floating point number to a rational.
Definition: rational.c:106
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
EXR_UINT
@ EXR_UINT
Definition: exr.c:77
huf_unpack_enc_table
static int huf_unpack_enc_table(GetByteContext *gb, int32_t im, int32_t iM, uint64_t *freq)
Definition: exr.c:339
AVCodecContext::height
int height
Definition: avcodec.h:600
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:639
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
EXR_B44
@ EXR_B44
Definition: exr.c:69
avcodec.h
EXRContext::nb_channels
int nb_channels
Definition: exr.c:186
ff_zigzag_direct
const uint8_t ff_zigzag_direct[64]
Definition: mathtables.c:137
AV_PIX_FMT_YAF16
#define AV_PIX_FMT_YAF16
Definition: pixfmt.h:584
ff_vlc_free
void ff_vlc_free(VLC *vlc)
Definition: vlc.c:580
ret
ret
Definition: filter_design.txt:187
huf_decode
static int huf_decode(VLC *vlc, GetByteContext *gb, int nbits, int run_sym, int no, uint16_t *out)
Definition: exr.c:428
half2float
static uint32_t half2float(uint16_t h, const Half2FloatTables *t)
Definition: half2float.h:39
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:81
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:265
ff_init_half2float_tables
void ff_init_half2float_tables(Half2FloatTables *t)
Definition: half2float.c:39
rle_uncompress
static int rle_uncompress(const EXRContext *ctx, const uint8_t *src, int compressed_size, int uncompressed_size, EXRThreadData *td)
Definition: exr.c:267
float2half
static uint16_t float2half(uint32_t f, const Float2HalfTables *t)
Definition: float2half.h:38
EXRThreadData::dc_size
unsigned dc_size
Definition: exr.c:128
HuffEntry::code
uint32_t code
Definition: exr.c:99
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
EXRThreadData::freq
uint64_t * freq
Definition: exr.c:144
EXRContext::is_multipart
int is_multipart
Definition: exr.c:173
AVCodecContext
main external API structure.
Definition: avcodec.h:439
pxr24_uncompress
static int pxr24_uncompress(const EXRContext *s, const uint8_t *src, int compressed_size, int uncompressed_size, EXRThreadData *td)
Definition: exr.c:694
EXRContext::channels
EXRChannel * channels
Definition: exr.c:185
EXR_UNKNOWN
@ EXR_UNKNOWN
Definition: exr.c:80
EXRContext::ymax
int32_t ymax
Definition: exr.c:166
EXRContext::ydelta
uint32_t ydelta
Definition: exr.c:167
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
VLC
Definition: vlc.h:50
wdec16
static void wdec16(uint16_t l, uint16_t h, uint16_t *a, uint16_t *b)
Definition: exr.c:516
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
AV_PIX_FMT_GBRAPF32
#define AV_PIX_FMT_GBRAPF32
Definition: pixfmt.h:579
EXRThreadData::run_sym
int run_sym
Definition: exr.c:142
AV_PIX_FMT_GBRAPF16
#define AV_PIX_FMT_GBRAPF16
Definition: pixfmt.h:577
HuffEntry
Definition: exr.c:96
AV_PIX_FMT_FLAG_PLANAR
#define AV_PIX_FMT_FLAG_PLANAR
At least one pixel component is not in the first data plane.
Definition: pixdesc.h:132
VLC::table
VLCElem * table
Definition: vlc.h:52
AVCOL_TRC_SMPTE170M
@ AVCOL_TRC_SMPTE170M
also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC
Definition: pixfmt.h:673
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
M
#define M(chr)
Definition: exr.c:178
EXR_TILE_LEVEL_UNKNOWN
@ EXR_TILE_LEVEL_UNKNOWN
Definition: exr.c:87
av_intfloat32::f
float f
Definition: intfloat.h:29
desc
const char * desc
Definition: libsvtav1.c:83
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
mem.h
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:37
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
huf_uncompress
static int huf_uncompress(const EXRContext *s, EXRThreadData *td, GetByteContext *gb, uint16_t *dst, int dst_size)
Definition: exr.c:457
ExrCompr
ExrCompr
Definition: exr.c:62
scale
static void scale(int *out, const int *in, const int w, const int h, const int shift)
Definition: intra.c:278
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
alpha
static const int16_t alpha[]
Definition: ilbcdata.h:55
AVPacket
This structure stores compressed data.
Definition: packet.h:572
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:466
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:86
zip_uncompress
static int zip_uncompress(const EXRContext *s, const uint8_t *src, int compressed_size, int uncompressed_size, EXRThreadData *td)
Definition: exr.c:208
EXRContext::buf_size
int buf_size
Definition: exr.c:183
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:600
int32_t
int32_t
Definition: audioconvert.c:56
bytestream.h
imgutils.h
bytestream2_init
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:137
ExrTileLevelMode
ExrTileLevelMode
Definition: exr.c:83
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h:480
block
The exact code depends on how similar the blocks are and how related they are to the block
Definition: filter_design.txt:207
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
EXRTileAttribute::ySize
int32_t ySize
Definition: exr.c:109
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
exr_class
static const AVClass exr_class
Definition: exr.c:2457
BswapDSPContext
Definition: bswapdsp.h:24
h
h
Definition: vp9dsp_template.c:2070
avstring.h
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
Definition: opt.h:276
EXRContext::xmin
int32_t xmin
Definition: exr.c:165
EXRContext::xdelta
uint32_t xdelta
Definition: exr.c:167
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
AVCodecContext::execute2
int(* execute2)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count)
The codec may call this to execute several independent things.
Definition: avcodec.h:1622
float2half.h
skip
static void BS_FUNC() skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
Definition: bitstream_template.h:383
src
#define src
Definition: vp8dsp.c:248
line
The official guide to swscale for confused that consecutive non overlapping rectangles of slice_bottom special converter These generally are unscaled converters of common like for each output line the vertical scaler pulls lines from a ring buffer When the ring buffer does not contain the wanted line
Definition: swscale.txt:40
channel
channel
Definition: ebur128.h:39
EXRContext::dsp
ExrDSPContext dsp
Definition: exr.c:152
EXR_UNKN
@ EXR_UNKN
Definition: exr.c:73
EXRContext
Definition: exr.c:148
EXRChannel
Definition: exr.c:102