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/opt.h"
44 #include "libavutil/half2float.h"
45 
46 #include "avcodec.h"
47 #include "bytestream.h"
48 
49 #if HAVE_BIGENDIAN
50 #include "bswapdsp.h"
51 #endif
52 
53 #include "codec_internal.h"
54 #include "decode.h"
55 #include "exrdsp.h"
56 #include "get_bits.h"
57 #include "mathops.h"
58 #include "thread.h"
59 
60 enum ExrCompr {
72 };
73 
79 };
80 
86 };
87 
92 };
93 
94 typedef struct HuffEntry {
95  uint8_t len;
96  uint16_t sym;
97  uint32_t code;
98 } HuffEntry;
99 
100 typedef struct EXRChannel {
101  int xsub, ysub;
103 } EXRChannel;
104 
105 typedef struct EXRTileAttribute {
111 
112 typedef struct EXRThreadData {
115 
116  uint8_t *tmp;
117  int tmp_size;
118 
119  uint8_t *bitmap;
120  uint16_t *lut;
121 
122  uint8_t *ac_data;
123  unsigned ac_size;
124 
125  uint8_t *dc_data;
126  unsigned dc_size;
127 
128  uint8_t *rle_data;
129  unsigned rle_size;
130 
131  uint8_t *rle_raw_data;
132  unsigned rle_raw_size;
133 
134  float block[3][64];
135 
136  int ysize, xsize;
137 
139 
140  int run_sym;
142  uint64_t *freq;
144 } EXRThreadData;
145 
146 typedef struct EXRContext {
147  AVClass *class;
151 
152 #if HAVE_BIGENDIAN
153  BswapDSPContext bbdsp;
154 #endif
155 
158  int channel_offsets[4]; // 0 = red, 1 = green, 2 = blue and 3 = alpha
160 
161  int w, h;
162  uint32_t sar;
165  uint32_t xdelta, ydelta;
166 
168 
169  EXRTileAttribute tile_attr; /* header data attribute of tile */
170  int is_tile; /* 0 if scanline, 1 if tile */
173 
174  int is_luma;/* 1 if there is an Y plane */
175 
177  const uint8_t *buf;
178  int buf_size;
179 
183  uint32_t chunk_count;
184 
186 
187  const char *layer;
189 
191  float gamma;
193 
194  uint8_t *offset_table;
195 
197 } EXRContext;
198 
199 static int zip_uncompress(const EXRContext *s, const uint8_t *src, int compressed_size,
200  int uncompressed_size, EXRThreadData *td)
201 {
202  unsigned long dest_len = uncompressed_size;
203 
204  if (uncompress(td->tmp, &dest_len, src, compressed_size) != Z_OK ||
205  dest_len != uncompressed_size)
206  return AVERROR_INVALIDDATA;
207 
208  av_assert1(uncompressed_size % 2 == 0);
209 
210  s->dsp.predictor(td->tmp, uncompressed_size);
211  s->dsp.reorder_pixels(td->uncompressed_data, td->tmp, uncompressed_size);
212 
213  return 0;
214 }
215 
216 static int rle(uint8_t *dst, const uint8_t *src,
217  int compressed_size, int uncompressed_size)
218 {
219  uint8_t *d = dst;
220  const int8_t *s = src;
221  int ssize = compressed_size;
222  int dsize = uncompressed_size;
223  uint8_t *dend = d + dsize;
224  int count;
225 
226  while (ssize > 0) {
227  count = *s++;
228 
229  if (count < 0) {
230  count = -count;
231 
232  if ((dsize -= count) < 0 ||
233  (ssize -= count + 1) < 0)
234  return AVERROR_INVALIDDATA;
235 
236  while (count--)
237  *d++ = *s++;
238  } else {
239  count++;
240 
241  if ((dsize -= count) < 0 ||
242  (ssize -= 2) < 0)
243  return AVERROR_INVALIDDATA;
244 
245  while (count--)
246  *d++ = *s;
247 
248  s++;
249  }
250  }
251 
252  if (dend != d)
253  return AVERROR_INVALIDDATA;
254 
255  return 0;
256 }
257 
258 static int rle_uncompress(const EXRContext *ctx, const uint8_t *src, int compressed_size,
259  int uncompressed_size, EXRThreadData *td)
260 {
261  rle(td->tmp, src, compressed_size, uncompressed_size);
262 
263  av_assert1(uncompressed_size % 2 == 0);
264 
265  ctx->dsp.predictor(td->tmp, uncompressed_size);
266  ctx->dsp.reorder_pixels(td->uncompressed_data, td->tmp, uncompressed_size);
267 
268  return 0;
269 }
270 
271 #define USHORT_RANGE (1 << 16)
272 #define BITMAP_SIZE (1 << 13)
273 
274 static uint16_t reverse_lut(const uint8_t *bitmap, uint16_t *lut)
275 {
276  int i, k = 0;
277 
278  for (i = 0; i < USHORT_RANGE; i++)
279  if ((i == 0) || (bitmap[i >> 3] & (1 << (i & 7))))
280  lut[k++] = i;
281 
282  i = k - 1;
283 
284  memset(lut + k, 0, (USHORT_RANGE - k) * 2);
285 
286  return i;
287 }
288 
289 static void apply_lut(const uint16_t *lut, uint16_t *dst, int dsize)
290 {
291  int i;
292 
293  for (i = 0; i < dsize; ++i)
294  dst[i] = lut[dst[i]];
295 }
296 
297 #define HUF_ENCBITS 16 // literal (value) bit length
298 #define HUF_ENCSIZE ((1 << HUF_ENCBITS) + 1) // encoding table size
299 
300 static void huf_canonical_code_table(uint64_t *freq)
301 {
302  uint64_t c, n[59] = { 0 };
303  int i;
304 
305  for (i = 0; i < HUF_ENCSIZE; i++)
306  n[freq[i]] += 1;
307 
308  c = 0;
309  for (i = 58; i > 0; --i) {
310  uint64_t nc = ((c + n[i]) >> 1);
311  n[i] = c;
312  c = nc;
313  }
314 
315  for (i = 0; i < HUF_ENCSIZE; ++i) {
316  int l = freq[i];
317 
318  if (l > 0)
319  freq[i] = l | (n[l]++ << 6);
320  }
321 }
322 
323 #define SHORT_ZEROCODE_RUN 59
324 #define LONG_ZEROCODE_RUN 63
325 #define SHORTEST_LONG_RUN (2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN)
326 #define LONGEST_LONG_RUN (255 + SHORTEST_LONG_RUN)
327 
329  int32_t im, int32_t iM, uint64_t *freq)
330 {
331  GetBitContext gbit;
332  int ret = init_get_bits8(&gbit, gb->buffer, bytestream2_get_bytes_left(gb));
333  if (ret < 0)
334  return ret;
335 
336  for (; im <= iM; im++) {
337  int l;
338  if (get_bits_left(&gbit) < 6)
339  return AVERROR_INVALIDDATA;
340  l = freq[im] = get_bits(&gbit, 6);
341 
342  if (l == LONG_ZEROCODE_RUN) {
343  int zerun = get_bits(&gbit, 8) + SHORTEST_LONG_RUN;
344 
345  if (im + zerun > iM + 1)
346  return AVERROR_INVALIDDATA;
347 
348  while (zerun--)
349  freq[im++] = 0;
350 
351  im--;
352  } else if (l >= SHORT_ZEROCODE_RUN) {
353  int zerun = l - SHORT_ZEROCODE_RUN + 2;
354 
355  if (im + zerun > iM + 1)
356  return AVERROR_INVALIDDATA;
357 
358  while (zerun--)
359  freq[im++] = 0;
360 
361  im--;
362  }
363  }
364 
365  bytestream2_skip(gb, (get_bits_count(&gbit) + 7) / 8);
367 
368  return 0;
369 }
370 
371 static int huf_build_dec_table(const EXRContext *s,
372  EXRThreadData *td, int im, int iM)
373 {
374  int j = 0;
375 
376  td->run_sym = -1;
377  for (int i = im; i < iM; i++) {
378  td->he[j].sym = i;
379  td->he[j].len = td->freq[i] & 63;
380  td->he[j].code = td->freq[i] >> 6;
381  if (td->he[j].len > 32) {
382  avpriv_request_sample(s->avctx, "Too big code length");
383  return AVERROR_PATCHWELCOME;
384  }
385  if (td->he[j].len > 0)
386  j++;
387  else
388  td->run_sym = i;
389  }
390 
391  if (im > 0)
392  td->run_sym = 0;
393  else if (iM < 65535)
394  td->run_sym = 65535;
395 
396  if (td->run_sym == -1) {
397  avpriv_request_sample(s->avctx, "No place for run symbol");
398  return AVERROR_PATCHWELCOME;
399  }
400 
401  td->he[j].sym = td->run_sym;
402  td->he[j].len = td->freq[iM] & 63;
403  if (td->he[j].len > 32) {
404  avpriv_request_sample(s->avctx, "Too big code length");
405  return AVERROR_PATCHWELCOME;
406  }
407  td->he[j].code = td->freq[iM] >> 6;
408  j++;
409 
410  ff_vlc_free(&td->vlc);
411  return ff_vlc_init_sparse(&td->vlc, 12, j,
412  &td->he[0].len, sizeof(td->he[0]), sizeof(td->he[0].len),
413  &td->he[0].code, sizeof(td->he[0]), sizeof(td->he[0].code),
414  &td->he[0].sym, sizeof(td->he[0]), sizeof(td->he[0].sym), 0);
415 }
416 
417 static int huf_decode(VLC *vlc, GetByteContext *gb, int nbits, int run_sym,
418  int no, uint16_t *out)
419 {
420  GetBitContext gbit;
421  int oe = 0;
422 
423  init_get_bits(&gbit, gb->buffer, nbits);
424  while (get_bits_left(&gbit) > 0 && oe < no) {
425  uint16_t x = get_vlc2(&gbit, vlc->table, 12, 3);
426 
427  if (x == run_sym) {
428  int run = get_bits(&gbit, 8);
429  uint16_t fill;
430 
431  if (oe == 0 || oe + run > no)
432  return AVERROR_INVALIDDATA;
433 
434  fill = out[oe - 1];
435 
436  while (run-- > 0)
437  out[oe++] = fill;
438  } else {
439  out[oe++] = x;
440  }
441  }
442 
443  return 0;
444 }
445 
446 static int huf_uncompress(const EXRContext *s,
447  EXRThreadData *td,
448  GetByteContext *gb,
449  uint16_t *dst, int dst_size)
450 {
451  int32_t im, iM;
452  uint32_t nBits;
453  int ret;
454 
455  im = bytestream2_get_le32(gb);
456  iM = bytestream2_get_le32(gb);
457  bytestream2_skip(gb, 4);
458  nBits = bytestream2_get_le32(gb);
459  if (im < 0 || im >= HUF_ENCSIZE ||
460  iM < 0 || iM >= HUF_ENCSIZE)
461  return AVERROR_INVALIDDATA;
462 
463  bytestream2_skip(gb, 4);
464 
465  if (!td->freq)
466  td->freq = av_malloc_array(HUF_ENCSIZE, sizeof(*td->freq));
467  if (!td->he)
468  td->he = av_calloc(HUF_ENCSIZE, sizeof(*td->he));
469  if (!td->freq || !td->he) {
470  ret = AVERROR(ENOMEM);
471  return ret;
472  }
473 
474  memset(td->freq, 0, sizeof(*td->freq) * HUF_ENCSIZE);
475  if ((ret = huf_unpack_enc_table(gb, im, iM, td->freq)) < 0)
476  return ret;
477 
478  if (nBits > 8 * bytestream2_get_bytes_left(gb)) {
480  return ret;
481  }
482 
483  if ((ret = huf_build_dec_table(s, td, im, iM)) < 0)
484  return ret;
485  return huf_decode(&td->vlc, gb, nBits, td->run_sym, dst_size, dst);
486 }
487 
488 static inline void wdec14(uint16_t l, uint16_t h, uint16_t *a, uint16_t *b)
489 {
490  int16_t ls = l;
491  int16_t hs = h;
492  int hi = hs;
493  int ai = ls + (hi & 1) + (hi >> 1);
494  int16_t as = ai;
495  int16_t bs = ai - hi;
496 
497  *a = as;
498  *b = bs;
499 }
500 
501 #define NBITS 16
502 #define A_OFFSET (1 << (NBITS - 1))
503 #define MOD_MASK ((1 << NBITS) - 1)
504 
505 static inline void wdec16(uint16_t l, uint16_t h, uint16_t *a, uint16_t *b)
506 {
507  int m = l;
508  int d = h;
509  int bb = (m - (d >> 1)) & MOD_MASK;
510  int aa = (d + bb - A_OFFSET) & MOD_MASK;
511  *b = bb;
512  *a = aa;
513 }
514 
515 static void wav_decode(uint16_t *in, int nx, int ox,
516  int ny, int oy, uint16_t mx)
517 {
518  int w14 = (mx < (1 << 14));
519  int n = (nx > ny) ? ny : nx;
520  int p = 1;
521  int p2;
522 
523  while (p <= n)
524  p <<= 1;
525 
526  p >>= 1;
527  p2 = p;
528  p >>= 1;
529 
530  while (p >= 1) {
531  uint16_t *py = in;
532  uint16_t *ey = in + oy * (ny - p2);
533  uint16_t i00, i01, i10, i11;
534  int oy1 = oy * p;
535  int oy2 = oy * p2;
536  int ox1 = ox * p;
537  int ox2 = ox * p2;
538 
539  for (; py <= ey; py += oy2) {
540  uint16_t *px = py;
541  uint16_t *ex = py + ox * (nx - p2);
542 
543  for (; px <= ex; px += ox2) {
544  uint16_t *p01 = px + ox1;
545  uint16_t *p10 = px + oy1;
546  uint16_t *p11 = p10 + ox1;
547 
548  if (w14) {
549  wdec14(*px, *p10, &i00, &i10);
550  wdec14(*p01, *p11, &i01, &i11);
551  wdec14(i00, i01, px, p01);
552  wdec14(i10, i11, p10, p11);
553  } else {
554  wdec16(*px, *p10, &i00, &i10);
555  wdec16(*p01, *p11, &i01, &i11);
556  wdec16(i00, i01, px, p01);
557  wdec16(i10, i11, p10, p11);
558  }
559  }
560 
561  if (nx & p) {
562  uint16_t *p10 = px + oy1;
563 
564  if (w14)
565  wdec14(*px, *p10, &i00, p10);
566  else
567  wdec16(*px, *p10, &i00, p10);
568 
569  *px = i00;
570  }
571  }
572 
573  if (ny & p) {
574  uint16_t *px = py;
575  uint16_t *ex = py + ox * (nx - p2);
576 
577  for (; px <= ex; px += ox2) {
578  uint16_t *p01 = px + ox1;
579 
580  if (w14)
581  wdec14(*px, *p01, &i00, p01);
582  else
583  wdec16(*px, *p01, &i00, p01);
584 
585  *px = i00;
586  }
587  }
588 
589  p2 = p;
590  p >>= 1;
591  }
592 }
593 
594 static int piz_uncompress(const EXRContext *s, const uint8_t *src, int ssize,
595  int dsize, EXRThreadData *td)
596 {
597  GetByteContext gb;
598  uint16_t maxval, min_non_zero, max_non_zero;
599  uint16_t *ptr;
600  uint16_t *tmp = (uint16_t *)td->tmp;
601  uint16_t *out;
602  uint16_t *in;
603  int ret, i, j;
604  int pixel_half_size;/* 1 for half, 2 for float and uint32 */
606  int tmp_offset;
607 
608  if (!td->bitmap)
609  td->bitmap = av_malloc(BITMAP_SIZE);
610  if (!td->lut)
611  td->lut = av_malloc(1 << 17);
612  if (!td->bitmap || !td->lut) {
613  av_freep(&td->bitmap);
614  av_freep(&td->lut);
615  return AVERROR(ENOMEM);
616  }
617 
618  bytestream2_init(&gb, src, ssize);
619  min_non_zero = bytestream2_get_le16(&gb);
620  max_non_zero = bytestream2_get_le16(&gb);
621 
622  if (max_non_zero >= BITMAP_SIZE)
623  return AVERROR_INVALIDDATA;
624 
625  memset(td->bitmap, 0, FFMIN(min_non_zero, BITMAP_SIZE));
626  if (min_non_zero <= max_non_zero)
627  bytestream2_get_buffer(&gb, td->bitmap + min_non_zero,
628  max_non_zero - min_non_zero + 1);
629  memset(td->bitmap + max_non_zero + 1, 0, BITMAP_SIZE - max_non_zero - 1);
630 
631  maxval = reverse_lut(td->bitmap, td->lut);
632 
633  bytestream2_skip(&gb, 4);
634  ret = huf_uncompress(s, td, &gb, tmp, dsize / sizeof(uint16_t));
635  if (ret)
636  return ret;
637 
638  ptr = tmp;
639  for (i = 0; i < s->nb_channels; i++) {
640  channel = &s->channels[i];
641 
642  if (channel->pixel_type == EXR_HALF)
643  pixel_half_size = 1;
644  else
645  pixel_half_size = 2;
646 
647  for (j = 0; j < pixel_half_size; j++)
648  wav_decode(ptr + j, td->xsize, pixel_half_size, td->ysize,
649  td->xsize * pixel_half_size, maxval);
650  ptr += td->xsize * td->ysize * pixel_half_size;
651  }
652 
653  apply_lut(td->lut, tmp, dsize / sizeof(uint16_t));
654 
655  out = (uint16_t *)td->uncompressed_data;
656  for (i = 0; i < td->ysize; i++) {
657  tmp_offset = 0;
658  for (j = 0; j < s->nb_channels; j++) {
659  channel = &s->channels[j];
660  if (channel->pixel_type == EXR_HALF)
661  pixel_half_size = 1;
662  else
663  pixel_half_size = 2;
664 
665  in = tmp + tmp_offset * td->xsize * td->ysize + i * td->xsize * pixel_half_size;
666  tmp_offset += pixel_half_size;
667 
668 #if HAVE_BIGENDIAN
669  s->bbdsp.bswap16_buf(out, in, td->xsize * pixel_half_size);
670 #else
671  memcpy(out, in, td->xsize * 2 * pixel_half_size);
672 #endif
673  out += td->xsize * pixel_half_size;
674  }
675  }
676 
677  return 0;
678 }
679 
680 static int pxr24_uncompress(const EXRContext *s, const uint8_t *src,
681  int compressed_size, int uncompressed_size,
682  EXRThreadData *td)
683 {
684  unsigned long dest_len, expected_len = 0;
685  const uint8_t *in = td->tmp;
686  uint8_t *out;
687  int c, i, j;
688 
689  for (i = 0; i < s->nb_channels; i++) {
690  if (s->channels[i].pixel_type == EXR_FLOAT) {
691  expected_len += (td->xsize * td->ysize * 3);/* PRX 24 store float in 24 bit instead of 32 */
692  } else if (s->channels[i].pixel_type == EXR_HALF) {
693  expected_len += (td->xsize * td->ysize * 2);
694  } else {//UINT 32
695  expected_len += (td->xsize * td->ysize * 4);
696  }
697  }
698 
699  dest_len = expected_len;
700 
701  if (uncompress(td->tmp, &dest_len, src, compressed_size) != Z_OK) {
702  return AVERROR_INVALIDDATA;
703  } else if (dest_len != expected_len) {
704  return AVERROR_INVALIDDATA;
705  }
706 
707  out = td->uncompressed_data;
708  for (i = 0; i < td->ysize; i++)
709  for (c = 0; c < s->nb_channels; c++) {
710  EXRChannel *channel = &s->channels[c];
711  const uint8_t *ptr[4];
712  uint32_t pixel = 0;
713 
714  switch (channel->pixel_type) {
715  case EXR_FLOAT:
716  ptr[0] = in;
717  ptr[1] = ptr[0] + td->xsize;
718  ptr[2] = ptr[1] + td->xsize;
719  in = ptr[2] + td->xsize;
720 
721  for (j = 0; j < td->xsize; ++j) {
722  uint32_t diff = ((unsigned)*(ptr[0]++) << 24) |
723  (*(ptr[1]++) << 16) |
724  (*(ptr[2]++) << 8);
725  pixel += diff;
726  bytestream_put_le32(&out, pixel);
727  }
728  break;
729  case EXR_HALF:
730  ptr[0] = in;
731  ptr[1] = ptr[0] + td->xsize;
732  in = ptr[1] + td->xsize;
733  for (j = 0; j < td->xsize; j++) {
734  uint32_t diff = (*(ptr[0]++) << 8) | *(ptr[1]++);
735 
736  pixel += diff;
737  bytestream_put_le16(&out, pixel);
738  }
739  break;
740  case EXR_UINT:
741  ptr[0] = in;
742  ptr[1] = ptr[0] + s->xdelta;
743  ptr[2] = ptr[1] + s->xdelta;
744  ptr[3] = ptr[2] + s->xdelta;
745  in = ptr[3] + s->xdelta;
746 
747  for (j = 0; j < s->xdelta; ++j) {
748  uint32_t diff = ((uint32_t)*(ptr[0]++) << 24) |
749  (*(ptr[1]++) << 16) |
750  (*(ptr[2]++) << 8 ) |
751  (*(ptr[3]++));
752  pixel += diff;
753  bytestream_put_le32(&out, pixel);
754  }
755  break;
756  default:
757  return AVERROR_INVALIDDATA;
758  }
759  }
760 
761  return 0;
762 }
763 
764 static void unpack_14(const uint8_t b[14], uint16_t s[16])
765 {
766  uint16_t shift = (b[ 2] >> 2) & 15;
767  uint16_t bias = (0x20 << shift);
768  int i;
769 
770  s[ 0] = (b[0] << 8) | b[1];
771 
772  s[ 4] = s[ 0] + ((((b[ 2] << 4) | (b[ 3] >> 4)) & 0x3f) << shift) - bias;
773  s[ 8] = s[ 4] + ((((b[ 3] << 2) | (b[ 4] >> 6)) & 0x3f) << shift) - bias;
774  s[12] = s[ 8] + ((b[ 4] & 0x3f) << shift) - bias;
775 
776  s[ 1] = s[ 0] + ((b[ 5] >> 2) << shift) - bias;
777  s[ 5] = s[ 4] + ((((b[ 5] << 4) | (b[ 6] >> 4)) & 0x3f) << shift) - bias;
778  s[ 9] = s[ 8] + ((((b[ 6] << 2) | (b[ 7] >> 6)) & 0x3f) << shift) - bias;
779  s[13] = s[12] + ((b[ 7] & 0x3f) << shift) - bias;
780 
781  s[ 2] = s[ 1] + ((b[ 8] >> 2) << shift) - bias;
782  s[ 6] = s[ 5] + ((((b[ 8] << 4) | (b[ 9] >> 4)) & 0x3f) << shift) - bias;
783  s[10] = s[ 9] + ((((b[ 9] << 2) | (b[10] >> 6)) & 0x3f) << shift) - bias;
784  s[14] = s[13] + ((b[10] & 0x3f) << shift) - bias;
785 
786  s[ 3] = s[ 2] + ((b[11] >> 2) << shift) - bias;
787  s[ 7] = s[ 6] + ((((b[11] << 4) | (b[12] >> 4)) & 0x3f) << shift) - bias;
788  s[11] = s[10] + ((((b[12] << 2) | (b[13] >> 6)) & 0x3f) << shift) - bias;
789  s[15] = s[14] + ((b[13] & 0x3f) << shift) - bias;
790 
791  for (i = 0; i < 16; ++i) {
792  if (s[i] & 0x8000)
793  s[i] &= 0x7fff;
794  else
795  s[i] = ~s[i];
796  }
797 }
798 
799 static void unpack_3(const uint8_t b[3], uint16_t s[16])
800 {
801  int i;
802 
803  s[0] = (b[0] << 8) | b[1];
804 
805  if (s[0] & 0x8000)
806  s[0] &= 0x7fff;
807  else
808  s[0] = ~s[0];
809 
810  for (i = 1; i < 16; i++)
811  s[i] = s[0];
812 }
813 
814 
815 static int b44_uncompress(const EXRContext *s, const uint8_t *src, int compressed_size,
816  int uncompressed_size, EXRThreadData *td) {
817  const int8_t *sr = src;
818  int stay_to_uncompress = compressed_size;
819  int nb_b44_block_w, nb_b44_block_h;
820  int index_tl_x, index_tl_y, index_out, index_tmp;
821  uint16_t tmp_buffer[16]; /* B44 use 4x4 half float pixel */
822  int c, iY, iX, y, x;
823  int target_channel_offset = 0;
824 
825  /* calc B44 block count */
826  nb_b44_block_w = td->xsize / 4;
827  if ((td->xsize % 4) != 0)
828  nb_b44_block_w++;
829 
830  nb_b44_block_h = td->ysize / 4;
831  if ((td->ysize % 4) != 0)
832  nb_b44_block_h++;
833 
834  for (c = 0; c < s->nb_channels; c++) {
835  if (s->channels[c].pixel_type == EXR_HALF) {/* B44 only compress half float data */
836  for (iY = 0; iY < nb_b44_block_h; iY++) {
837  for (iX = 0; iX < nb_b44_block_w; iX++) {/* For each B44 block */
838  if (stay_to_uncompress < 3)
839  return AVERROR_INVALIDDATA;
840 
841  if (src[compressed_size - stay_to_uncompress + 2] == 0xfc) { /* B44A block */
842  unpack_3(sr, tmp_buffer);
843  sr += 3;
844  stay_to_uncompress -= 3;
845  } else {/* B44 Block */
846  if (stay_to_uncompress < 14)
847  return AVERROR_INVALIDDATA;
848  unpack_14(sr, tmp_buffer);
849  sr += 14;
850  stay_to_uncompress -= 14;
851  }
852 
853  /* copy data to uncompress buffer (B44 block can exceed target resolution)*/
854  index_tl_x = iX * 4;
855  index_tl_y = iY * 4;
856 
857  for (y = index_tl_y; y < FFMIN(index_tl_y + 4, td->ysize); y++) {
858  for (x = index_tl_x; x < FFMIN(index_tl_x + 4, td->xsize); x++) {
859  index_out = target_channel_offset * td->xsize + y * td->channel_line_size + 2 * x;
860  index_tmp = (y-index_tl_y) * 4 + (x-index_tl_x);
861  td->uncompressed_data[index_out] = tmp_buffer[index_tmp] & 0xff;
862  td->uncompressed_data[index_out + 1] = tmp_buffer[index_tmp] >> 8;
863  }
864  }
865  }
866  }
867  target_channel_offset += 2;
868  } else {/* Float or UINT 32 channel */
869  if (stay_to_uncompress < td->ysize * td->xsize * 4)
870  return AVERROR_INVALIDDATA;
871 
872  for (y = 0; y < td->ysize; y++) {
873  index_out = target_channel_offset * td->xsize + y * td->channel_line_size;
874  memcpy(&td->uncompressed_data[index_out], sr, td->xsize * 4);
875  sr += td->xsize * 4;
876  }
877  target_channel_offset += 4;
878 
879  stay_to_uncompress -= td->ysize * td->xsize * 4;
880  }
881  }
882 
883  return 0;
884 }
885 
886 static int ac_uncompress(const EXRContext *s, GetByteContext *gb, float *block)
887 {
888  int ret = 0, n = 1;
889 
890  while (n < 64) {
891  uint16_t val = bytestream2_get_ne16(gb);
892 
893  if (val == 0xff00) {
894  n = 64;
895  } else if ((val >> 8) == 0xff) {
896  n += val & 0xff;
897  } else {
898  ret = n;
899  block[ff_zigzag_direct[n]] = av_int2float(half2float(val, &s->h2f_tables));
900  n++;
901  }
902  }
903 
904  return ret;
905 }
906 
907 static void idct_1d(float *blk, int step)
908 {
909  const float a = .5f * cosf( M_PI / 4.f);
910  const float b = .5f * cosf( M_PI / 16.f);
911  const float c = .5f * cosf( M_PI / 8.f);
912  const float d = .5f * cosf(3.f*M_PI / 16.f);
913  const float e = .5f * cosf(5.f*M_PI / 16.f);
914  const float f = .5f * cosf(3.f*M_PI / 8.f);
915  const float g = .5f * cosf(7.f*M_PI / 16.f);
916 
917  float alpha[4], beta[4], theta[4], gamma[4];
918 
919  alpha[0] = c * blk[2 * step];
920  alpha[1] = f * blk[2 * step];
921  alpha[2] = c * blk[6 * step];
922  alpha[3] = f * blk[6 * step];
923 
924  beta[0] = b * blk[1 * step] + d * blk[3 * step] + e * blk[5 * step] + g * blk[7 * step];
925  beta[1] = d * blk[1 * step] - g * blk[3 * step] - b * blk[5 * step] - e * blk[7 * step];
926  beta[2] = e * blk[1 * step] - b * blk[3 * step] + g * blk[5 * step] + d * blk[7 * step];
927  beta[3] = g * blk[1 * step] - e * blk[3 * step] + d * blk[5 * step] - b * blk[7 * step];
928 
929  theta[0] = a * (blk[0 * step] + blk[4 * step]);
930  theta[3] = a * (blk[0 * step] - blk[4 * step]);
931 
932  theta[1] = alpha[0] + alpha[3];
933  theta[2] = alpha[1] - alpha[2];
934 
935  gamma[0] = theta[0] + theta[1];
936  gamma[1] = theta[3] + theta[2];
937  gamma[2] = theta[3] - theta[2];
938  gamma[3] = theta[0] - theta[1];
939 
940  blk[0 * step] = gamma[0] + beta[0];
941  blk[1 * step] = gamma[1] + beta[1];
942  blk[2 * step] = gamma[2] + beta[2];
943  blk[3 * step] = gamma[3] + beta[3];
944 
945  blk[4 * step] = gamma[3] - beta[3];
946  blk[5 * step] = gamma[2] - beta[2];
947  blk[6 * step] = gamma[1] - beta[1];
948  blk[7 * step] = gamma[0] - beta[0];
949 }
950 
951 static void dct_inverse(float *block)
952 {
953  for (int i = 0; i < 8; i++)
954  idct_1d(block + i, 8);
955 
956  for (int i = 0; i < 8; i++) {
957  idct_1d(block, 1);
958  block += 8;
959  }
960 }
961 
962 static void convert(float y, float u, float v,
963  float *b, float *g, float *r)
964 {
965  *r = y + 1.5747f * v;
966  *g = y - 0.1873f * u - 0.4682f * v;
967  *b = y + 1.8556f * u;
968 }
969 
970 static float to_linear(float x, float scale)
971 {
972  float ax = fabsf(x);
973 
974  if (ax <= 1.f) {
975  return FFSIGN(x) * powf(ax, 2.2f * scale);
976  } else {
977  const float log_base = expf(2.2f * scale);
978 
979  return FFSIGN(x) * powf(log_base, ax - 1.f);
980  }
981 }
982 
983 static int dwa_uncompress(const EXRContext *s, const uint8_t *src, int compressed_size,
984  int uncompressed_size, EXRThreadData *td)
985 {
986  int64_t version, lo_usize, lo_size;
987  int64_t ac_size, dc_size, rle_usize, rle_csize, rle_raw_size;
988  int64_t ac_count, dc_count, ac_compression;
989  const int dc_w = td->xsize >> 3;
990  const int dc_h = td->ysize >> 3;
991  GetByteContext gb, agb;
992  int skip, ret;
993 
994  if (compressed_size <= 88)
995  return AVERROR_INVALIDDATA;
996 
997  version = AV_RL64(src + 0);
998  if (version != 2)
999  return AVERROR_INVALIDDATA;
1000 
1001  lo_usize = AV_RL64(src + 8);
1002  lo_size = AV_RL64(src + 16);
1003  ac_size = AV_RL64(src + 24);
1004  dc_size = AV_RL64(src + 32);
1005  rle_csize = AV_RL64(src + 40);
1006  rle_usize = AV_RL64(src + 48);
1007  rle_raw_size = AV_RL64(src + 56);
1008  ac_count = AV_RL64(src + 64);
1009  dc_count = AV_RL64(src + 72);
1010  ac_compression = AV_RL64(src + 80);
1011 
1012  if ( compressed_size < (uint64_t)(lo_size | ac_size | dc_size | rle_csize) || compressed_size < 88LL + lo_size + ac_size + dc_size + rle_csize
1013  || ac_count > (uint64_t)INT_MAX/2
1014  )
1015  return AVERROR_INVALIDDATA;
1016 
1017  bytestream2_init(&gb, src + 88, compressed_size - 88);
1018  skip = bytestream2_get_le16(&gb);
1019  if (skip < 2)
1020  return AVERROR_INVALIDDATA;
1021 
1022  bytestream2_skip(&gb, skip - 2);
1023 
1024  if (lo_size > 0) {
1025  if (lo_usize > uncompressed_size)
1026  return AVERROR_INVALIDDATA;
1027  bytestream2_skip(&gb, lo_size);
1028  }
1029 
1030  if (ac_size > 0) {
1031  unsigned long dest_len;
1032  GetByteContext agb = gb;
1033 
1034  if (ac_count > 3LL * td->xsize * s->scan_lines_per_block)
1035  return AVERROR_INVALIDDATA;
1036 
1037  dest_len = ac_count * 2LL;
1038 
1039  av_fast_padded_malloc(&td->ac_data, &td->ac_size, dest_len);
1040  if (!td->ac_data)
1041  return AVERROR(ENOMEM);
1042 
1043  switch (ac_compression) {
1044  case 0:
1045  ret = huf_uncompress(s, td, &agb, (int16_t *)td->ac_data, ac_count);
1046  if (ret < 0)
1047  return ret;
1048  break;
1049  case 1:
1050  if (uncompress(td->ac_data, &dest_len, agb.buffer, ac_size) != Z_OK ||
1051  dest_len != ac_count * 2LL)
1052  return AVERROR_INVALIDDATA;
1053  break;
1054  default:
1055  return AVERROR_INVALIDDATA;
1056  }
1057 
1058  bytestream2_skip(&gb, ac_size);
1059  }
1060 
1061  {
1062  unsigned long dest_len;
1063  GetByteContext agb = gb;
1064 
1065  if (dc_count != dc_w * dc_h * 3)
1066  return AVERROR_INVALIDDATA;
1067 
1068  dest_len = dc_count * 2LL;
1069 
1070  av_fast_padded_malloc(&td->dc_data, &td->dc_size, FFALIGN(dest_len, 64) * 2);
1071  if (!td->dc_data)
1072  return AVERROR(ENOMEM);
1073 
1074  if (uncompress(td->dc_data + FFALIGN(dest_len, 64), &dest_len, agb.buffer, dc_size) != Z_OK ||
1075  (dest_len != dc_count * 2LL))
1076  return AVERROR_INVALIDDATA;
1077 
1078  s->dsp.predictor(td->dc_data + FFALIGN(dest_len, 64), dest_len);
1079  s->dsp.reorder_pixels(td->dc_data, td->dc_data + FFALIGN(dest_len, 64), dest_len);
1080 
1081  bytestream2_skip(&gb, dc_size);
1082  }
1083 
1084  if (rle_raw_size > 0 && rle_csize > 0 && rle_usize > 0) {
1085  unsigned long dest_len = rle_usize;
1086 
1087  av_fast_padded_malloc(&td->rle_data, &td->rle_size, rle_usize);
1088  if (!td->rle_data)
1089  return AVERROR(ENOMEM);
1090 
1091  av_fast_padded_malloc(&td->rle_raw_data, &td->rle_raw_size, rle_raw_size);
1092  if (!td->rle_raw_data)
1093  return AVERROR(ENOMEM);
1094 
1095  if (uncompress(td->rle_data, &dest_len, gb.buffer, rle_csize) != Z_OK ||
1096  (dest_len != rle_usize))
1097  return AVERROR_INVALIDDATA;
1098 
1099  ret = rle(td->rle_raw_data, td->rle_data, rle_usize, rle_raw_size);
1100  if (ret < 0)
1101  return ret;
1102  bytestream2_skip(&gb, rle_csize);
1103  }
1104 
1105  bytestream2_init(&agb, td->ac_data, ac_count * 2);
1106 
1107  for (int y = 0; y < td->ysize; y += 8) {
1108  for (int x = 0; x < td->xsize; x += 8) {
1109  memset(td->block, 0, sizeof(td->block));
1110 
1111  for (int j = 0; j < 3; j++) {
1112  float *block = td->block[j];
1113  const int idx = (x >> 3) + (y >> 3) * dc_w + dc_w * dc_h * j;
1114  uint16_t *dc = (uint16_t *)td->dc_data;
1115  union av_intfloat32 dc_val;
1116 
1117  dc_val.i = half2float(dc[idx], &s->h2f_tables);
1118 
1119  block[0] = dc_val.f;
1120  ac_uncompress(s, &agb, block);
1121  dct_inverse(block);
1122  }
1123 
1124  {
1125  const int o = s->nb_channels == 4;
1126  float *bo = ((float *)td->uncompressed_data) +
1127  y * td->xsize * s->nb_channels + td->xsize * (o + 0) + x;
1128  float *go = ((float *)td->uncompressed_data) +
1129  y * td->xsize * s->nb_channels + td->xsize * (o + 1) + x;
1130  float *ro = ((float *)td->uncompressed_data) +
1131  y * td->xsize * s->nb_channels + td->xsize * (o + 2) + x;
1132  float *yb = td->block[0];
1133  float *ub = td->block[1];
1134  float *vb = td->block[2];
1135 
1136  for (int yy = 0; yy < 8; yy++) {
1137  for (int xx = 0; xx < 8; xx++) {
1138  const int idx = xx + yy * 8;
1139 
1140  convert(yb[idx], ub[idx], vb[idx], &bo[xx], &go[xx], &ro[xx]);
1141 
1142  bo[xx] = to_linear(bo[xx], 1.f);
1143  go[xx] = to_linear(go[xx], 1.f);
1144  ro[xx] = to_linear(ro[xx], 1.f);
1145  }
1146 
1147  bo += td->xsize * s->nb_channels;
1148  go += td->xsize * s->nb_channels;
1149  ro += td->xsize * s->nb_channels;
1150  }
1151  }
1152  }
1153  }
1154 
1155  if (s->nb_channels < 4)
1156  return 0;
1157 
1158  for (int y = 0; y < td->ysize && td->rle_raw_data; y++) {
1159  uint32_t *ao = ((uint32_t *)td->uncompressed_data) + y * td->xsize * s->nb_channels;
1160  uint8_t *ai0 = td->rle_raw_data + y * td->xsize;
1161  uint8_t *ai1 = td->rle_raw_data + y * td->xsize + rle_raw_size / 2;
1162 
1163  for (int x = 0; x < td->xsize; x++) {
1164  uint16_t ha = ai0[x] | (ai1[x] << 8);
1165 
1166  ao[x] = half2float(ha, &s->h2f_tables);
1167  }
1168  }
1169 
1170  return 0;
1171 }
1172 
1173 static int decode_block(AVCodecContext *avctx, void *tdata,
1174  int jobnr, int threadnr)
1175 {
1176  const EXRContext *s = avctx->priv_data;
1177  AVFrame *const p = s->picture;
1178  EXRThreadData *td = &s->thread_data[threadnr];
1179  const uint8_t *channel_buffer[4] = { 0 };
1180  const uint8_t *buf = s->buf;
1181  uint64_t line_offset, uncompressed_size;
1182  uint8_t *ptr;
1183  uint32_t data_size;
1184  int line, col = 0;
1185  uint64_t tile_x, tile_y, tile_level_x, tile_level_y;
1186  const uint8_t *src;
1187  int step = s->desc->flags & AV_PIX_FMT_FLAG_FLOAT ? 4 : 2 * s->desc->nb_components;
1188  int bxmin = 0, axmax = 0, window_xoffset = 0;
1189  int window_xmin, window_xmax, window_ymin, window_ymax;
1190  int data_xoffset, data_yoffset, data_window_offset, xsize, ysize;
1191  int i, x, buf_size = s->buf_size;
1192  int c, rgb_channel_count;
1193  float one_gamma = 1.0f / s->gamma;
1194  av_csp_trc_function trc_func = av_csp_trc_func_from_id(s->apply_trc_type);
1195  int ret;
1196 
1197  line_offset = AV_RL64(s->gb.buffer + jobnr * 8);
1198 
1199  if (s->is_tile) {
1200  if (buf_size < 20 || line_offset > buf_size - 20)
1201  return AVERROR_INVALIDDATA;
1202 
1203  src = buf + line_offset + 20;
1204  if (s->is_multipart)
1205  src += 4;
1206 
1207  tile_x = AV_RL32(src - 20);
1208  tile_y = AV_RL32(src - 16);
1209  tile_level_x = AV_RL32(src - 12);
1210  tile_level_y = AV_RL32(src - 8);
1211 
1212  data_size = AV_RL32(src - 4);
1213  if (data_size <= 0 || data_size > buf_size - line_offset - 20)
1214  return AVERROR_INVALIDDATA;
1215 
1216  if (tile_level_x || tile_level_y) { /* tile level, is not the full res level */
1217  avpriv_report_missing_feature(s->avctx, "Subres tile before full res tile");
1218  return AVERROR_PATCHWELCOME;
1219  }
1220 
1221  if (tile_x && s->tile_attr.xSize + (int64_t)FFMAX(s->xmin, 0) >= INT_MAX / tile_x )
1222  return AVERROR_INVALIDDATA;
1223  if (tile_y && s->tile_attr.ySize + (int64_t)FFMAX(s->ymin, 0) >= INT_MAX / tile_y )
1224  return AVERROR_INVALIDDATA;
1225 
1226  line = s->ymin + s->tile_attr.ySize * tile_y;
1227  col = s->tile_attr.xSize * tile_x;
1228 
1229  if (line < s->ymin || line > s->ymax ||
1230  s->xmin + col < s->xmin || s->xmin + col > s->xmax)
1231  return AVERROR_INVALIDDATA;
1232 
1233  td->ysize = FFMIN(s->tile_attr.ySize, s->ydelta - tile_y * s->tile_attr.ySize);
1234  td->xsize = FFMIN(s->tile_attr.xSize, s->xdelta - tile_x * s->tile_attr.xSize);
1235 
1236  if (td->xsize * (uint64_t)s->current_channel_offset > INT_MAX ||
1237  av_image_check_size2(td->xsize, td->ysize, s->avctx->max_pixels, AV_PIX_FMT_NONE, 0, s->avctx) < 0)
1238  return AVERROR_INVALIDDATA;
1239 
1240  td->channel_line_size = td->xsize * s->current_channel_offset;/* uncompress size of one line */
1241  uncompressed_size = td->channel_line_size * (uint64_t)td->ysize;/* uncompress size of the block */
1242  } else {
1243  if (buf_size < 8 || line_offset > buf_size - 8)
1244  return AVERROR_INVALIDDATA;
1245 
1246  src = buf + line_offset + 8;
1247  if (s->is_multipart)
1248  src += 4;
1249  line = AV_RL32(src - 8);
1250 
1251  if (line < s->ymin || line > s->ymax)
1252  return AVERROR_INVALIDDATA;
1253 
1254  data_size = AV_RL32(src - 4);
1255  if (data_size <= 0 || data_size > buf_size - line_offset - 8)
1256  return AVERROR_INVALIDDATA;
1257 
1258  td->ysize = FFMIN(s->scan_lines_per_block, s->ymax - line + 1); /* s->ydelta - line ?? */
1259  td->xsize = s->xdelta;
1260 
1261  if (td->xsize * (uint64_t)s->current_channel_offset > INT_MAX ||
1262  av_image_check_size2(td->xsize, td->ysize, s->avctx->max_pixels, AV_PIX_FMT_NONE, 0, s->avctx) < 0)
1263  return AVERROR_INVALIDDATA;
1264 
1265  td->channel_line_size = td->xsize * s->current_channel_offset;/* uncompress size of one line */
1266  uncompressed_size = td->channel_line_size * (uint64_t)td->ysize;/* uncompress size of the block */
1267 
1268  if ((s->compression == EXR_RAW && (data_size != uncompressed_size ||
1269  line_offset > buf_size - uncompressed_size)) ||
1270  (s->compression != EXR_RAW && (data_size > uncompressed_size ||
1271  line_offset > buf_size - data_size))) {
1272  return AVERROR_INVALIDDATA;
1273  }
1274  }
1275 
1276  window_xmin = FFMIN(avctx->width, FFMAX(0, s->xmin + col));
1277  window_xmax = FFMIN(avctx->width, FFMAX(0, s->xmin + col + td->xsize));
1278  window_ymin = FFMIN(avctx->height, FFMAX(0, line ));
1279  window_ymax = FFMIN(avctx->height, FFMAX(0, line + td->ysize));
1280  xsize = window_xmax - window_xmin;
1281  ysize = window_ymax - window_ymin;
1282 
1283  /* tile or scanline not visible skip decoding */
1284  if (xsize <= 0 || ysize <= 0)
1285  return 0;
1286 
1287  /* is the first tile or is a scanline */
1288  if(col == 0) {
1289  window_xmin = 0;
1290  /* pixels to add at the left of the display window */
1291  window_xoffset = FFMAX(0, s->xmin);
1292  /* bytes to add at the left of the display window */
1293  bxmin = window_xoffset * step;
1294  }
1295 
1296  /* is the last tile or is a scanline */
1297  if(col + td->xsize == s->xdelta) {
1298  window_xmax = avctx->width;
1299  /* bytes to add at the right of the display window */
1300  axmax = FFMAX(0, (avctx->width - (s->xmax + 1))) * step;
1301  }
1302 
1303  if (avctx->max_pixels && uncompressed_size > avctx->max_pixels * 16LL)
1304  return AVERROR_INVALIDDATA;
1305 
1306  if (data_size < uncompressed_size || s->is_tile) { /* td->tmp is use for tile reorganization */
1307  av_fast_padded_malloc(&td->tmp, &td->tmp_size, uncompressed_size);
1308  if (!td->tmp)
1309  return AVERROR(ENOMEM);
1310  }
1311 
1312  if (data_size < uncompressed_size) {
1313  av_fast_padded_malloc(&td->uncompressed_data,
1314  &td->uncompressed_size, uncompressed_size + 64);/* Force 64 padding for AVX2 reorder_pixels dst */
1315 
1316  if (!td->uncompressed_data)
1317  return AVERROR(ENOMEM);
1318 
1320  switch (s->compression) {
1321  case EXR_ZIP1:
1322  case EXR_ZIP16:
1323  ret = zip_uncompress(s, src, data_size, uncompressed_size, td);
1324  break;
1325  case EXR_PIZ:
1326  ret = piz_uncompress(s, src, data_size, uncompressed_size, td);
1327  break;
1328  case EXR_PXR24:
1329  ret = pxr24_uncompress(s, src, data_size, uncompressed_size, td);
1330  break;
1331  case EXR_RLE:
1332  ret = rle_uncompress(s, src, data_size, uncompressed_size, td);
1333  break;
1334  case EXR_B44:
1335  case EXR_B44A:
1336  ret = b44_uncompress(s, src, data_size, uncompressed_size, td);
1337  break;
1338  case EXR_DWAA:
1339  case EXR_DWAB:
1340  ret = dwa_uncompress(s, src, data_size, uncompressed_size, td);
1341  break;
1342  }
1343  if (ret < 0) {
1344  av_log(avctx, AV_LOG_ERROR, "decode_block() failed.\n");
1345  return ret;
1346  }
1347  src = td->uncompressed_data;
1348  }
1349 
1350  /* offsets to crop data outside display window */
1351  data_xoffset = FFABS(FFMIN(0, s->xmin + col)) * (s->pixel_type == EXR_HALF ? 2 : 4);
1352  data_yoffset = FFABS(FFMIN(0, line));
1353  data_window_offset = (data_yoffset * td->channel_line_size) + data_xoffset;
1354 
1355  if (!s->is_luma) {
1356  channel_buffer[0] = src + (td->xsize * s->channel_offsets[0]) + data_window_offset;
1357  channel_buffer[1] = src + (td->xsize * s->channel_offsets[1]) + data_window_offset;
1358  channel_buffer[2] = src + (td->xsize * s->channel_offsets[2]) + data_window_offset;
1359  rgb_channel_count = 3;
1360  } else { /* put y data in the first channel_buffer */
1361  channel_buffer[0] = src + (td->xsize * s->channel_offsets[1]) + data_window_offset;
1362  rgb_channel_count = 1;
1363  }
1364  if (s->channel_offsets[3] >= 0)
1365  channel_buffer[3] = src + (td->xsize * s->channel_offsets[3]) + data_window_offset;
1366 
1367  if (s->desc->flags & AV_PIX_FMT_FLAG_FLOAT) {
1368  /* todo: change this when a floating point pixel format with luma with alpha is implemented */
1369  int channel_count = s->channel_offsets[3] >= 0 ? 4 : rgb_channel_count;
1370  if (s->is_luma) {
1371  channel_buffer[1] = channel_buffer[0];
1372  channel_buffer[2] = channel_buffer[0];
1373  }
1374 
1375  for (c = 0; c < channel_count; c++) {
1376  int plane = s->desc->comp[c].plane;
1377  ptr = p->data[plane] + window_ymin * p->linesize[plane] + (window_xmin * 4);
1378 
1379  for (i = 0; i < ysize; i++, ptr += p->linesize[plane]) {
1380  const uint8_t *src;
1381  union av_intfloat32 *ptr_x;
1382 
1383  src = channel_buffer[c];
1384  ptr_x = (union av_intfloat32 *)ptr;
1385 
1386  // Zero out the start if xmin is not 0
1387  memset(ptr_x, 0, bxmin);
1388  ptr_x += window_xoffset;
1389 
1390  if (s->pixel_type == EXR_FLOAT ||
1391  s->compression == EXR_DWAA ||
1392  s->compression == EXR_DWAB) {
1393  // 32-bit
1394  union av_intfloat32 t;
1395  if (trc_func && c < 3) {
1396  for (x = 0; x < xsize; x++) {
1397  t.i = bytestream_get_le32(&src);
1398  t.f = trc_func(t.f);
1399  *ptr_x++ = t;
1400  }
1401  } else if (one_gamma != 1.f) {
1402  for (x = 0; x < xsize; x++) {
1403  t.i = bytestream_get_le32(&src);
1404  if (t.f > 0.0f && c < 3) /* avoid negative values */
1405  t.f = powf(t.f, one_gamma);
1406  *ptr_x++ = t;
1407  }
1408  } else {
1409  for (x = 0; x < xsize; x++) {
1410  t.i = bytestream_get_le32(&src);
1411  *ptr_x++ = t;
1412  }
1413  }
1414  } else if (s->pixel_type == EXR_HALF) {
1415  // 16-bit
1416  if (c < 3 || !trc_func) {
1417  for (x = 0; x < xsize; x++) {
1418  *ptr_x++ = s->gamma_table[bytestream_get_le16(&src)];
1419  }
1420  } else {
1421  for (x = 0; x < xsize; x++) {
1422  ptr_x[0].i = half2float(bytestream_get_le16(&src), &s->h2f_tables);
1423  ptr_x++;
1424  }
1425  }
1426  }
1427 
1428  // Zero out the end if xmax+1 is not w
1429  memset(ptr_x, 0, axmax);
1430  channel_buffer[c] += td->channel_line_size;
1431  }
1432  }
1433  } else {
1434 
1435  av_assert1(s->pixel_type == EXR_UINT);
1436  ptr = p->data[0] + window_ymin * p->linesize[0] + (window_xmin * s->desc->nb_components * 2);
1437 
1438  for (i = 0; i < ysize; i++, ptr += p->linesize[0]) {
1439 
1440  const uint8_t * a;
1441  const uint8_t *rgb[3];
1442  uint16_t *ptr_x;
1443 
1444  for (c = 0; c < rgb_channel_count; c++) {
1445  rgb[c] = channel_buffer[c];
1446  }
1447 
1448  if (channel_buffer[3])
1449  a = channel_buffer[3];
1450 
1451  ptr_x = (uint16_t *) ptr;
1452 
1453  // Zero out the start if xmin is not 0
1454  memset(ptr_x, 0, bxmin);
1455  ptr_x += window_xoffset * s->desc->nb_components;
1456 
1457  for (x = 0; x < xsize; x++) {
1458  for (c = 0; c < rgb_channel_count; c++) {
1459  *ptr_x++ = bytestream_get_le32(&rgb[c]) >> 16;
1460  }
1461 
1462  if (channel_buffer[3])
1463  *ptr_x++ = bytestream_get_le32(&a) >> 16;
1464  }
1465 
1466  // Zero out the end if xmax+1 is not w
1467  memset(ptr_x, 0, axmax);
1468 
1469  channel_buffer[0] += td->channel_line_size;
1470  channel_buffer[1] += td->channel_line_size;
1471  channel_buffer[2] += td->channel_line_size;
1472  if (channel_buffer[3])
1473  channel_buffer[3] += td->channel_line_size;
1474  }
1475  }
1476 
1477  return 0;
1478 }
1479 
1481 {
1482  GetByteContext *gb = &s->gb;
1483 
1484  while (bytestream2_get_bytes_left(gb) > 0) {
1485  if (!bytestream2_peek_byte(gb))
1486  break;
1487 
1488  // Process unknown variables
1489  for (int i = 0; i < 2; i++) // value_name and value_type
1490  while (bytestream2_get_byte(gb) != 0);
1491 
1492  // Skip variable length
1493  bytestream2_skip(gb, bytestream2_get_le32(gb));
1494  }
1495 }
1496 
1497 /**
1498  * Check if the variable name corresponds to its data type.
1499  *
1500  * @param s the EXRContext
1501  * @param value_name name of the variable to check
1502  * @param value_type type of the variable to check
1503  * @param minimum_length minimum length of the variable data
1504  *
1505  * @return bytes to read containing variable data
1506  * -1 if variable is not found
1507  * 0 if buffer ended prematurely
1508  */
1510  const char *value_name,
1511  const char *value_type,
1512  unsigned int minimum_length)
1513 {
1514  GetByteContext *gb = &s->gb;
1515  int var_size = -1;
1516 
1517  if (bytestream2_get_bytes_left(gb) >= minimum_length &&
1518  !strcmp(gb->buffer, value_name)) {
1519  // found value_name, jump to value_type (null terminated strings)
1520  gb->buffer += strlen(value_name) + 1;
1521  if (!strcmp(gb->buffer, value_type)) {
1522  gb->buffer += strlen(value_type) + 1;
1523  var_size = bytestream2_get_le32(gb);
1524  // don't go read past boundaries
1525  if (var_size > bytestream2_get_bytes_left(gb))
1526  var_size = 0;
1527  } else {
1528  // value_type not found, reset the buffer
1529  gb->buffer -= strlen(value_name) + 1;
1530  av_log(s->avctx, AV_LOG_WARNING,
1531  "Unknown data type %s for header variable %s.\n",
1532  value_type, value_name);
1533  }
1534  }
1535 
1536  return var_size;
1537 }
1538 
1540 {
1541  AVDictionary *metadata = NULL;
1542  GetByteContext *gb = &s->gb;
1543  int magic_number, version, flags;
1544  int layer_match = 0;
1545  int ret;
1546  int dup_channels = 0;
1547 
1548  s->current_channel_offset = 0;
1549  s->xmin = ~0;
1550  s->xmax = ~0;
1551  s->ymin = ~0;
1552  s->ymax = ~0;
1553  s->xdelta = ~0;
1554  s->ydelta = ~0;
1555  s->channel_offsets[0] = -1;
1556  s->channel_offsets[1] = -1;
1557  s->channel_offsets[2] = -1;
1558  s->channel_offsets[3] = -1;
1559  s->pixel_type = EXR_UNKNOWN;
1560  s->compression = EXR_UNKN;
1561  s->nb_channels = 0;
1562  s->w = 0;
1563  s->h = 0;
1564  s->tile_attr.xSize = -1;
1565  s->tile_attr.ySize = -1;
1566  s->is_tile = 0;
1567  s->is_multipart = 0;
1568  s->is_luma = 0;
1569  s->current_part = 0;
1570 
1571  if (bytestream2_get_bytes_left(gb) < 10) {
1572  av_log(s->avctx, AV_LOG_ERROR, "Header too short to parse.\n");
1573  return AVERROR_INVALIDDATA;
1574  }
1575 
1576  magic_number = bytestream2_get_le32(gb);
1577  if (magic_number != 20000630) {
1578  /* As per documentation of OpenEXR, it is supposed to be
1579  * int 20000630 little-endian */
1580  av_log(s->avctx, AV_LOG_ERROR, "Wrong magic number %d.\n", magic_number);
1581  return AVERROR_INVALIDDATA;
1582  }
1583 
1584  version = bytestream2_get_byte(gb);
1585  if (version != 2) {
1586  avpriv_report_missing_feature(s->avctx, "Version %d", version);
1587  return AVERROR_PATCHWELCOME;
1588  }
1589 
1590  flags = bytestream2_get_le24(gb);
1591 
1592  if (flags & 0x02)
1593  s->is_tile = 1;
1594  if (flags & 0x10)
1595  s->is_multipart = 1;
1596  if (flags & 0x08) {
1597  avpriv_report_missing_feature(s->avctx, "deep data");
1598  return AVERROR_PATCHWELCOME;
1599  }
1600 
1601  // Parse the header
1602  while (bytestream2_get_bytes_left(gb) > 0) {
1603  int var_size;
1604 
1605  while (s->is_multipart && s->current_part < s->selected_part &&
1606  bytestream2_get_bytes_left(gb) > 0) {
1607  if (bytestream2_peek_byte(gb)) {
1609  } else {
1610  bytestream2_skip(gb, 1);
1611  if (!bytestream2_peek_byte(gb))
1612  break;
1613  }
1614  bytestream2_skip(gb, 1);
1615  s->current_part++;
1616  }
1617 
1618  if (!bytestream2_peek_byte(gb)) {
1619  if (!s->is_multipart)
1620  break;
1621  bytestream2_skip(gb, 1);
1622  if (s->current_part == s->selected_part) {
1623  while (bytestream2_get_bytes_left(gb) > 0) {
1624  if (bytestream2_peek_byte(gb)) {
1626  } else {
1627  bytestream2_skip(gb, 1);
1628  if (!bytestream2_peek_byte(gb))
1629  break;
1630  }
1631  }
1632  }
1633  if (!bytestream2_peek_byte(gb))
1634  break;
1635  s->current_part++;
1636  }
1637 
1638  if ((var_size = check_header_variable(s, "channels",
1639  "chlist", 38)) >= 0) {
1640  GetByteContext ch_gb;
1641  if (!var_size) {
1643  goto fail;
1644  }
1645 
1646  bytestream2_init(&ch_gb, gb->buffer, var_size);
1647 
1648  while (bytestream2_get_bytes_left(&ch_gb) >= 19) {
1650  enum ExrPixelType current_pixel_type;
1651  int channel_index = -1;
1652  int xsub, ysub;
1653 
1654  if (strcmp(s->layer, "") != 0) {
1655  if (strncmp(ch_gb.buffer, s->layer, strlen(s->layer)) == 0) {
1656  layer_match = 1;
1657  av_log(s->avctx, AV_LOG_INFO,
1658  "Channel match layer : %s.\n", ch_gb.buffer);
1659  ch_gb.buffer += strlen(s->layer);
1660  if (*ch_gb.buffer == '.')
1661  ch_gb.buffer++; /* skip dot if not given */
1662  } else {
1663  layer_match = 0;
1664  av_log(s->avctx, AV_LOG_INFO,
1665  "Channel doesn't match layer : %s.\n", ch_gb.buffer);
1666  }
1667  } else {
1668  layer_match = 1;
1669  }
1670 
1671  if (layer_match) { /* only search channel if the layer match is valid */
1672  if (!av_strcasecmp(ch_gb.buffer, "R") ||
1673  !av_strcasecmp(ch_gb.buffer, "X") ||
1674  !av_strcasecmp(ch_gb.buffer, "U")) {
1675  channel_index = 0;
1676  s->is_luma = 0;
1677  } else if (!av_strcasecmp(ch_gb.buffer, "G") ||
1678  !av_strcasecmp(ch_gb.buffer, "V")) {
1679  channel_index = 1;
1680  s->is_luma = 0;
1681  } else if (!av_strcasecmp(ch_gb.buffer, "Y")) {
1682  channel_index = 1;
1683  s->is_luma = 1;
1684  } else if (!av_strcasecmp(ch_gb.buffer, "B") ||
1685  !av_strcasecmp(ch_gb.buffer, "Z") ||
1686  !av_strcasecmp(ch_gb.buffer, "W")) {
1687  channel_index = 2;
1688  s->is_luma = 0;
1689  } else if (!av_strcasecmp(ch_gb.buffer, "A")) {
1690  channel_index = 3;
1691  } else {
1692  av_log(s->avctx, AV_LOG_WARNING,
1693  "Unsupported channel %.256s.\n", ch_gb.buffer);
1694  }
1695  }
1696 
1697  /* skip until you get a 0 */
1698  while (bytestream2_get_bytes_left(&ch_gb) > 0 &&
1699  bytestream2_get_byte(&ch_gb))
1700  continue;
1701 
1702  if (bytestream2_get_bytes_left(&ch_gb) < 4) {
1703  av_log(s->avctx, AV_LOG_ERROR, "Incomplete header.\n");
1705  goto fail;
1706  }
1707 
1708  current_pixel_type = bytestream2_get_le32(&ch_gb);
1709  if (current_pixel_type >= EXR_UNKNOWN) {
1710  avpriv_report_missing_feature(s->avctx, "Pixel type %d",
1711  current_pixel_type);
1713  goto fail;
1714  }
1715 
1716  bytestream2_skip(&ch_gb, 4);
1717  xsub = bytestream2_get_le32(&ch_gb);
1718  ysub = bytestream2_get_le32(&ch_gb);
1719 
1720  if (xsub != 1 || ysub != 1) {
1722  "Subsampling %dx%d",
1723  xsub, ysub);
1725  goto fail;
1726  }
1727 
1728  if (channel_index >= 0 && s->channel_offsets[channel_index] == -1) { /* channel has not been previously assigned */
1729  if (s->pixel_type != EXR_UNKNOWN &&
1730  s->pixel_type != current_pixel_type) {
1731  av_log(s->avctx, AV_LOG_ERROR,
1732  "RGB channels not of the same depth.\n");
1734  goto fail;
1735  }
1736  s->pixel_type = current_pixel_type;
1737  s->channel_offsets[channel_index] = s->current_channel_offset;
1738  } else if (channel_index >= 0) {
1739  av_log(s->avctx, AV_LOG_WARNING,
1740  "Multiple channels with index %d.\n", channel_index);
1741  if (++dup_channels > 10) {
1743  goto fail;
1744  }
1745  }
1746 
1747  s->channels = av_realloc(s->channels,
1748  ++s->nb_channels * sizeof(EXRChannel));
1749  if (!s->channels) {
1750  ret = AVERROR(ENOMEM);
1751  goto fail;
1752  }
1753  channel = &s->channels[s->nb_channels - 1];
1754  channel->pixel_type = current_pixel_type;
1755  channel->xsub = xsub;
1756  channel->ysub = ysub;
1757 
1758  if (current_pixel_type == EXR_HALF) {
1759  s->current_channel_offset += 2;
1760  } else {/* Float or UINT32 */
1761  s->current_channel_offset += 4;
1762  }
1763  }
1764 
1765  /* Check if all channels are set with an offset or if the channels
1766  * are causing an overflow */
1767  if (!s->is_luma) {/* if we expected to have at least 3 channels */
1768  if (FFMIN3(s->channel_offsets[0],
1769  s->channel_offsets[1],
1770  s->channel_offsets[2]) < 0) {
1771  if (s->channel_offsets[0] < 0)
1772  av_log(s->avctx, AV_LOG_ERROR, "Missing red channel.\n");
1773  if (s->channel_offsets[1] < 0)
1774  av_log(s->avctx, AV_LOG_ERROR, "Missing green channel.\n");
1775  if (s->channel_offsets[2] < 0)
1776  av_log(s->avctx, AV_LOG_ERROR, "Missing blue channel.\n");
1778  goto fail;
1779  }
1780  }
1781 
1782  // skip one last byte and update main gb
1783  gb->buffer = ch_gb.buffer + 1;
1784  continue;
1785  } else if ((var_size = check_header_variable(s, "dataWindow", "box2i",
1786  31)) >= 0) {
1787  int xmin, ymin, xmax, ymax;
1788  if (!var_size) {
1790  goto fail;
1791  }
1792 
1793  xmin = bytestream2_get_le32(gb);
1794  ymin = bytestream2_get_le32(gb);
1795  xmax = bytestream2_get_le32(gb);
1796  ymax = bytestream2_get_le32(gb);
1797 
1798  if (xmin > xmax || ymin > ymax ||
1799  ymax == INT_MAX || xmax == INT_MAX ||
1800  (unsigned)xmax - xmin >= INT_MAX ||
1801  (unsigned)ymax - ymin >= INT_MAX) {
1803  goto fail;
1804  }
1805  s->xmin = xmin;
1806  s->xmax = xmax;
1807  s->ymin = ymin;
1808  s->ymax = ymax;
1809  s->xdelta = (s->xmax - s->xmin) + 1;
1810  s->ydelta = (s->ymax - s->ymin) + 1;
1811 
1812  continue;
1813  } else if ((var_size = check_header_variable(s, "displayWindow",
1814  "box2i", 34)) >= 0) {
1815  int32_t sx, sy, dx, dy;
1816 
1817  if (!var_size) {
1819  goto fail;
1820  }
1821 
1822  sx = bytestream2_get_le32(gb);
1823  sy = bytestream2_get_le32(gb);
1824  dx = bytestream2_get_le32(gb);
1825  dy = bytestream2_get_le32(gb);
1826 
1827  s->w = (unsigned)dx - sx + 1;
1828  s->h = (unsigned)dy - sy + 1;
1829 
1830  continue;
1831  } else if ((var_size = check_header_variable(s, "lineOrder",
1832  "lineOrder", 25)) >= 0) {
1833  int line_order;
1834  if (!var_size) {
1836  goto fail;
1837  }
1838 
1839  line_order = bytestream2_get_byte(gb);
1840  av_log(s->avctx, AV_LOG_DEBUG, "line order: %d.\n", line_order);
1841  if (line_order > 2) {
1842  av_log(s->avctx, AV_LOG_ERROR, "Unknown line order.\n");
1844  goto fail;
1845  }
1846 
1847  continue;
1848  } else if ((var_size = check_header_variable(s, "pixelAspectRatio",
1849  "float", 31)) >= 0) {
1850  if (!var_size) {
1852  goto fail;
1853  }
1854 
1855  s->sar = bytestream2_get_le32(gb);
1856 
1857  continue;
1858  } else if ((var_size = check_header_variable(s, "compression",
1859  "compression", 29)) >= 0) {
1860  if (!var_size) {
1862  goto fail;
1863  }
1864 
1865  if (s->compression == EXR_UNKN)
1866  s->compression = bytestream2_get_byte(gb);
1867  else {
1868  bytestream2_skip(gb, 1);
1869  av_log(s->avctx, AV_LOG_WARNING,
1870  "Found more than one compression attribute.\n");
1871  }
1872 
1873  continue;
1874  } else if ((var_size = check_header_variable(s, "tiles",
1875  "tiledesc", 22)) >= 0) {
1876  uint8_t tileLevel;
1877 
1878  if (!s->is_tile)
1879  av_log(s->avctx, AV_LOG_WARNING,
1880  "Found tile attribute and scanline flags. Exr will be interpreted as scanline.\n");
1881 
1882  s->tile_attr.xSize = bytestream2_get_le32(gb);
1883  s->tile_attr.ySize = bytestream2_get_le32(gb);
1884 
1885  tileLevel = bytestream2_get_byte(gb);
1886  s->tile_attr.level_mode = tileLevel & 0x0f;
1887  s->tile_attr.level_round = (tileLevel >> 4) & 0x0f;
1888 
1889  if (s->tile_attr.level_mode >= EXR_TILE_LEVEL_UNKNOWN) {
1890  avpriv_report_missing_feature(s->avctx, "Tile level mode %d",
1891  s->tile_attr.level_mode);
1893  goto fail;
1894  }
1895 
1896  if (s->tile_attr.level_round >= EXR_TILE_ROUND_UNKNOWN) {
1897  avpriv_report_missing_feature(s->avctx, "Tile level round %d",
1898  s->tile_attr.level_round);
1900  goto fail;
1901  }
1902 
1903  continue;
1904  } else if ((var_size = check_header_variable(s, "writer",
1905  "string", 1)) >= 0) {
1906  uint8_t key[256] = { 0 };
1907 
1908  bytestream2_get_buffer(gb, key, FFMIN(sizeof(key) - 1, var_size));
1909  av_dict_set(&metadata, "writer", key, 0);
1910 
1911  continue;
1912  } else if ((var_size = check_header_variable(s, "framesPerSecond",
1913  "rational", 33)) >= 0) {
1914  if (!var_size) {
1916  goto fail;
1917  }
1918 
1919  s->avctx->framerate.num = bytestream2_get_le32(gb);
1920  s->avctx->framerate.den = bytestream2_get_le32(gb);
1921 
1922  continue;
1923  } else if ((var_size = check_header_variable(s, "chunkCount",
1924  "int", 23)) >= 0) {
1925 
1926  s->chunk_count = bytestream2_get_le32(gb);
1927 
1928  continue;
1929  } else if ((var_size = check_header_variable(s, "type",
1930  "string", 16)) >= 0) {
1931  uint8_t key[256] = { 0 };
1932 
1933  bytestream2_get_buffer(gb, key, FFMIN(sizeof(key) - 1, var_size));
1934  if (strncmp("scanlineimage", key, var_size) &&
1935  strncmp("tiledimage", key, var_size)) {
1937  goto fail;
1938  }
1939 
1940  continue;
1941  } else if ((var_size = check_header_variable(s, "preview",
1942  "preview", 16)) >= 0) {
1943  uint32_t pw = bytestream2_get_le32(gb);
1944  uint32_t ph = bytestream2_get_le32(gb);
1945  uint64_t psize = pw * ph;
1946  if (psize > INT64_MAX / 4) {
1948  goto fail;
1949  }
1950  psize *= 4;
1951 
1952  if ((int64_t)psize >= bytestream2_get_bytes_left(gb)) {
1954  goto fail;
1955  }
1956 
1957  bytestream2_skip(gb, psize);
1958 
1959  continue;
1960  }
1961 
1962  // Check if there are enough bytes for a header
1963  if (bytestream2_get_bytes_left(gb) <= 9) {
1964  av_log(s->avctx, AV_LOG_ERROR, "Incomplete header\n");
1966  goto fail;
1967  }
1968 
1969  // Process unknown variables
1970  {
1971  uint8_t name[256] = { 0 };
1972  uint8_t type[256] = { 0 };
1973  uint8_t value[8192] = { 0 };
1974  int i = 0, size;
1975 
1976  while (bytestream2_get_bytes_left(gb) > 0 &&
1977  bytestream2_peek_byte(gb) && i < 255) {
1978  name[i++] = bytestream2_get_byte(gb);
1979  }
1980 
1981  bytestream2_skip(gb, 1);
1982  i = 0;
1983  while (bytestream2_get_bytes_left(gb) > 0 &&
1984  bytestream2_peek_byte(gb) && i < 255) {
1985  type[i++] = bytestream2_get_byte(gb);
1986  }
1987  bytestream2_skip(gb, 1);
1988  size = bytestream2_get_le32(gb);
1989 
1990  bytestream2_get_buffer(gb, value, FFMIN(sizeof(value) - 1, size));
1991  if (size > sizeof(value) - 1)
1992  bytestream2_skip(gb, size - (sizeof(value) - 1));
1993  if (!strcmp(type, "string"))
1994  av_dict_set(&metadata, name, value, 0);
1995  }
1996  }
1997 
1998  if (s->compression == EXR_UNKN) {
1999  av_log(s->avctx, AV_LOG_ERROR, "Missing compression attribute.\n");
2001  goto fail;
2002  }
2003 
2004  if (s->is_tile) {
2005  if (s->tile_attr.xSize < 1 || s->tile_attr.ySize < 1) {
2006  av_log(s->avctx, AV_LOG_ERROR, "Invalid tile attribute.\n");
2008  goto fail;
2009  }
2010  }
2011 
2012  if (bytestream2_get_bytes_left(gb) <= 0) {
2013  av_log(s->avctx, AV_LOG_ERROR, "Incomplete frame.\n");
2015  goto fail;
2016  }
2017 
2018  frame->metadata = metadata;
2019 
2020  // aaand we are done
2021  bytestream2_skip(gb, 1);
2022  return 0;
2023 fail:
2024  av_dict_free(&metadata);
2025  return ret;
2026 }
2027 
2028 static int decode_frame(AVCodecContext *avctx, AVFrame *picture,
2029  int *got_frame, AVPacket *avpkt)
2030 {
2031  EXRContext *s = avctx->priv_data;
2032  GetByteContext *gb = &s->gb;
2033  uint8_t *ptr;
2034 
2035  int i, y, ret, ymax;
2036  int planes;
2037  int out_line_size;
2038  int nb_blocks; /* nb scanline or nb tile */
2039  uint64_t start_offset_table;
2040  uint64_t start_next_scanline;
2041 
2042  bytestream2_init(gb, avpkt->data, avpkt->size);
2043 
2044  if ((ret = decode_header(s, picture)) < 0)
2045  return ret;
2046 
2047  if ((s->compression == EXR_DWAA || s->compression == EXR_DWAB) &&
2048  s->pixel_type == EXR_HALF) {
2049  s->current_channel_offset *= 2;
2050  for (int i = 0; i < 4; i++)
2051  s->channel_offsets[i] *= 2;
2052  }
2053 
2054  switch (s->pixel_type) {
2055  case EXR_FLOAT:
2056  case EXR_HALF:
2057  if (s->channel_offsets[3] >= 0) {
2058  if (!s->is_luma) {
2059  avctx->pix_fmt = AV_PIX_FMT_GBRAPF32;
2060  } else {
2061  /* todo: change this when a floating point pixel format with luma with alpha is implemented */
2062  avctx->pix_fmt = AV_PIX_FMT_GBRAPF32;
2063  }
2064  } else {
2065  if (!s->is_luma) {
2066  avctx->pix_fmt = AV_PIX_FMT_GBRPF32;
2067  } else {
2068  avctx->pix_fmt = AV_PIX_FMT_GRAYF32;
2069  }
2070  }
2071  break;
2072  case EXR_UINT:
2073  if (s->channel_offsets[3] >= 0) {
2074  if (!s->is_luma) {
2075  avctx->pix_fmt = AV_PIX_FMT_RGBA64;
2076  } else {
2077  avctx->pix_fmt = AV_PIX_FMT_YA16;
2078  }
2079  } else {
2080  if (!s->is_luma) {
2081  avctx->pix_fmt = AV_PIX_FMT_RGB48;
2082  } else {
2083  avctx->pix_fmt = AV_PIX_FMT_GRAY16;
2084  }
2085  }
2086  break;
2087  default:
2088  av_log(avctx, AV_LOG_ERROR, "Missing channel list.\n");
2089  return AVERROR_INVALIDDATA;
2090  }
2091 
2092  if (s->apply_trc_type != AVCOL_TRC_UNSPECIFIED)
2093  avctx->color_trc = s->apply_trc_type;
2094  else if (s->gamma > 0.9999f && s->gamma < 1.0001f)
2095  avctx->color_trc = AVCOL_TRC_LINEAR;
2096 
2097  switch (s->compression) {
2098  case EXR_RAW:
2099  case EXR_RLE:
2100  case EXR_ZIP1:
2101  s->scan_lines_per_block = 1;
2102  break;
2103  case EXR_PXR24:
2104  case EXR_ZIP16:
2105  s->scan_lines_per_block = 16;
2106  break;
2107  case EXR_PIZ:
2108  case EXR_B44:
2109  case EXR_B44A:
2110  case EXR_DWAA:
2111  s->scan_lines_per_block = 32;
2112  break;
2113  case EXR_DWAB:
2114  s->scan_lines_per_block = 256;
2115  break;
2116  default:
2117  avpriv_report_missing_feature(avctx, "Compression %d", s->compression);
2118  return AVERROR_PATCHWELCOME;
2119  }
2120 
2121  /* Verify the xmin, xmax, ymin and ymax before setting the actual image size.
2122  * It's possible for the data window can larger or outside the display window */
2123  if (s->xmin > s->xmax || s->ymin > s->ymax ||
2124  s->ydelta == 0xFFFFFFFF || s->xdelta == 0xFFFFFFFF) {
2125  av_log(avctx, AV_LOG_ERROR, "Wrong or missing size information.\n");
2126  return AVERROR_INVALIDDATA;
2127  }
2128 
2129  if ((ret = ff_set_dimensions(avctx, s->w, s->h)) < 0)
2130  return ret;
2131 
2132  ff_set_sar(s->avctx, av_d2q(av_int2float(s->sar), 255));
2133 
2134  if (avctx->skip_frame >= AVDISCARD_ALL)
2135  return avpkt->size;
2136 
2137  s->desc = av_pix_fmt_desc_get(avctx->pix_fmt);
2138  if (!s->desc)
2139  return AVERROR_INVALIDDATA;
2140 
2141  if (s->desc->flags & AV_PIX_FMT_FLAG_FLOAT) {
2142  planes = s->desc->nb_components;
2143  out_line_size = avctx->width * 4;
2144  } else {
2145  planes = 1;
2146  out_line_size = avctx->width * 2 * s->desc->nb_components;
2147  }
2148 
2149  if (s->is_tile) {
2150  nb_blocks = ((s->xdelta + s->tile_attr.xSize - 1) / s->tile_attr.xSize) *
2151  ((s->ydelta + s->tile_attr.ySize - 1) / s->tile_attr.ySize);
2152  } else { /* scanline */
2153  nb_blocks = (s->ydelta + s->scan_lines_per_block - 1) /
2154  s->scan_lines_per_block;
2155  }
2156 
2157  if ((ret = ff_thread_get_buffer(avctx, picture, 0)) < 0)
2158  return ret;
2159 
2160  if (bytestream2_get_bytes_left(gb)/8 < nb_blocks)
2161  return AVERROR_INVALIDDATA;
2162 
2163  // check offset table and recreate it if need
2164  if (!s->is_tile && bytestream2_peek_le64(gb) == 0) {
2165  PutByteContext offset_table_writer;
2166 
2167  av_log(s->avctx, AV_LOG_DEBUG, "recreating invalid scanline offset table\n");
2168 
2169  s->offset_table = av_realloc_f(s->offset_table, nb_blocks, 8);
2170  if (!s->offset_table)
2171  return AVERROR(ENOMEM);
2172 
2173  start_offset_table = bytestream2_tell(gb);
2174  start_next_scanline = start_offset_table + nb_blocks * 8;
2175  bytestream2_init_writer(&offset_table_writer, s->offset_table, nb_blocks * 8);
2176 
2177  for (y = 0; y < nb_blocks; y++) {
2178  /* write offset of prev scanline in offset table */
2179  bytestream2_put_le64(&offset_table_writer, start_next_scanline);
2180 
2181  /* get len of next scanline */
2182  bytestream2_seek(gb, start_next_scanline + 4, SEEK_SET);/* skip line number */
2183  start_next_scanline += (bytestream2_get_le32(gb) + 8);
2184  }
2185  bytestream2_init(gb, s->offset_table, nb_blocks * 8);
2186  }
2187 
2188  // save pointer we are going to use in decode_block
2189  s->buf = avpkt->data;
2190  s->buf_size = avpkt->size;
2191 
2192  // Zero out the start if ymin is not 0
2193  for (i = 0; i < planes; i++) {
2194  ptr = picture->data[i];
2195  for (y = 0; y < FFMIN(s->ymin, s->h); y++) {
2196  memset(ptr, 0, out_line_size);
2197  ptr += picture->linesize[i];
2198  }
2199  }
2200 
2201  s->picture = picture;
2202 
2203  avctx->execute2(avctx, decode_block, s->thread_data, NULL, nb_blocks);
2204 
2205  ymax = FFMAX(0, s->ymax + 1);
2206  // Zero out the end if ymax+1 is not h
2207  if (ymax < avctx->height)
2208  for (i = 0; i < planes; i++) {
2209  ptr = picture->data[i] + (ymax * picture->linesize[i]);
2210  for (y = ymax; y < avctx->height; y++) {
2211  memset(ptr, 0, out_line_size);
2212  ptr += picture->linesize[i];
2213  }
2214  }
2215 
2216  picture->pict_type = AV_PICTURE_TYPE_I;
2217  *got_frame = 1;
2218 
2219  return avpkt->size;
2220 }
2221 
2223 {
2224  EXRContext *s = avctx->priv_data;
2225  uint32_t i;
2226  union av_intfloat32 t;
2227  float one_gamma = 1.0f / s->gamma;
2228  av_csp_trc_function trc_func = NULL;
2229 
2230  ff_init_half2float_tables(&s->h2f_tables);
2231 
2232  s->avctx = avctx;
2233 
2234  ff_exrdsp_init(&s->dsp);
2235 
2236 #if HAVE_BIGENDIAN
2237  ff_bswapdsp_init(&s->bbdsp);
2238 #endif
2239 
2240  trc_func = av_csp_trc_func_from_id(s->apply_trc_type);
2241  if (trc_func) {
2242  for (i = 0; i < 65536; ++i) {
2243  t.i = half2float(i, &s->h2f_tables);
2244  t.f = trc_func(t.f);
2245  s->gamma_table[i] = t;
2246  }
2247  } else {
2248  if (one_gamma > 0.9999f && one_gamma < 1.0001f) {
2249  for (i = 0; i < 65536; ++i) {
2250  s->gamma_table[i].i = half2float(i, &s->h2f_tables);
2251  }
2252  } else {
2253  for (i = 0; i < 65536; ++i) {
2254  t.i = half2float(i, &s->h2f_tables);
2255  /* If negative value we reuse half value */
2256  if (t.f <= 0.0f) {
2257  s->gamma_table[i] = t;
2258  } else {
2259  t.f = powf(t.f, one_gamma);
2260  s->gamma_table[i] = t;
2261  }
2262  }
2263  }
2264  }
2265 
2266  // allocate thread data, used for non EXR_RAW compression types
2267  s->thread_data = av_calloc(avctx->thread_count, sizeof(*s->thread_data));
2268  if (!s->thread_data)
2269  return AVERROR(ENOMEM);
2270 
2271  return 0;
2272 }
2273 
2275 {
2276  EXRContext *s = avctx->priv_data;
2277  int i;
2278  for (i = 0; i < avctx->thread_count; i++) {
2279  EXRThreadData *td = &s->thread_data[i];
2280  av_freep(&td->uncompressed_data);
2281  av_freep(&td->tmp);
2282  av_freep(&td->bitmap);
2283  av_freep(&td->lut);
2284  av_freep(&td->he);
2285  av_freep(&td->freq);
2286  av_freep(&td->ac_data);
2287  av_freep(&td->dc_data);
2288  av_freep(&td->rle_data);
2289  av_freep(&td->rle_raw_data);
2290  ff_vlc_free(&td->vlc);
2291  }
2292 
2293  av_freep(&s->thread_data);
2294  av_freep(&s->channels);
2295  av_freep(&s->offset_table);
2296 
2297  return 0;
2298 }
2299 
2300 #define OFFSET(x) offsetof(EXRContext, x)
2301 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
2302 static const AVOption options[] = {
2303  { "layer", "Set the decoding layer", OFFSET(layer),
2304  AV_OPT_TYPE_STRING, { .str = "" }, 0, 0, VD },
2305  { "part", "Set the decoding part", OFFSET(selected_part),
2306  AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VD },
2307  { "gamma", "Set the float gamma value when decoding", OFFSET(gamma),
2308  AV_OPT_TYPE_FLOAT, { .dbl = 1.0f }, 0.001, FLT_MAX, VD },
2309 
2310  // XXX: Note the abuse of the enum using AVCOL_TRC_UNSPECIFIED to subsume the existing gamma option
2311  { "apply_trc", "color transfer characteristics to apply to EXR linear input", OFFSET(apply_trc_type),
2312  AV_OPT_TYPE_INT, {.i64 = AVCOL_TRC_UNSPECIFIED }, 1, AVCOL_TRC_NB-1, VD, "apply_trc_type"},
2313  { "bt709", "BT.709", 0,
2314  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT709 }, INT_MIN, INT_MAX, VD, "apply_trc_type"},
2315  { "gamma", "gamma", 0,
2316  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_UNSPECIFIED }, INT_MIN, INT_MAX, VD, "apply_trc_type"},
2317  { "gamma22", "BT.470 M", 0,
2318  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_GAMMA22 }, INT_MIN, INT_MAX, VD, "apply_trc_type"},
2319  { "gamma28", "BT.470 BG", 0,
2320  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_GAMMA28 }, INT_MIN, INT_MAX, VD, "apply_trc_type"},
2321  { "smpte170m", "SMPTE 170 M", 0,
2322  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE170M }, INT_MIN, INT_MAX, VD, "apply_trc_type"},
2323  { "smpte240m", "SMPTE 240 M", 0,
2324  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE240M }, INT_MIN, INT_MAX, VD, "apply_trc_type"},
2325  { "linear", "Linear", 0,
2326  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LINEAR }, INT_MIN, INT_MAX, VD, "apply_trc_type"},
2327  { "log", "Log", 0,
2328  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LOG }, INT_MIN, INT_MAX, VD, "apply_trc_type"},
2329  { "log_sqrt", "Log square root", 0,
2330  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LOG_SQRT }, INT_MIN, INT_MAX, VD, "apply_trc_type"},
2331  { "iec61966_2_4", "IEC 61966-2-4", 0,
2332  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_IEC61966_2_4 }, INT_MIN, INT_MAX, VD, "apply_trc_type"},
2333  { "bt1361", "BT.1361", 0,
2334  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT1361_ECG }, INT_MIN, INT_MAX, VD, "apply_trc_type"},
2335  { "iec61966_2_1", "IEC 61966-2-1", 0,
2336  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_IEC61966_2_1 }, INT_MIN, INT_MAX, VD, "apply_trc_type"},
2337  { "bt2020_10bit", "BT.2020 - 10 bit", 0,
2338  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT2020_10 }, INT_MIN, INT_MAX, VD, "apply_trc_type"},
2339  { "bt2020_12bit", "BT.2020 - 12 bit", 0,
2340  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT2020_12 }, INT_MIN, INT_MAX, VD, "apply_trc_type"},
2341  { "smpte2084", "SMPTE ST 2084", 0,
2342  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTEST2084 }, INT_MIN, INT_MAX, VD, "apply_trc_type"},
2343  { "smpte428_1", "SMPTE ST 428-1", 0,
2344  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTEST428_1 }, INT_MIN, INT_MAX, VD, "apply_trc_type"},
2345 
2346  { NULL },
2347 };
2348 
2349 static const AVClass exr_class = {
2350  .class_name = "EXR",
2351  .item_name = av_default_item_name,
2352  .option = options,
2353  .version = LIBAVUTIL_VERSION_INT,
2354 };
2355 
2357  .p.name = "exr",
2358  CODEC_LONG_NAME("OpenEXR image"),
2359  .p.type = AVMEDIA_TYPE_VIDEO,
2360  .p.id = AV_CODEC_ID_EXR,
2361  .priv_data_size = sizeof(EXRContext),
2362  .init = decode_init,
2363  .close = decode_end,
2365  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS |
2367  .caps_internal = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM,
2368  .p.priv_class = &exr_class,
2369 };
bswapdsp.h
EXRTileAttribute::level_round
enum ExrTileLevelRound level_round
Definition: exr.c:109
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
EXRThreadData
Definition: exr.c:112
td
#define td
Definition: regdef.h:70
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:90
Half2FloatTables
Definition: half2float.h:27
EXRThreadData::uncompressed_size
int uncompressed_size
Definition: exr.c:114
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:694
r
const char * r
Definition: vf_curves.c:126
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:132
EXRTileAttribute
Definition: exr.c:105
AVColorTransferCharacteristic
AVColorTransferCharacteristic
Color Transfer Characteristic.
Definition: pixfmt.h:570
out
FILE * out
Definition: movenc.c:54
EXRThreadData::lut
uint16_t * lut
Definition: exr.c:120
GetByteContext
Definition: bytestream.h:33
EXR_TILE_LEVEL_ONE
@ EXR_TILE_LEVEL_ONE
Definition: exr.c:82
u
#define u(width, name, range_min, range_max)
Definition: cbs_h2645.c:250
EXRThreadData::uncompressed_data
uint8_t * uncompressed_data
Definition: exr.c:113
VD
#define VD
Definition: exr.c:2301
HuffEntry::len
uint8_t len
Definition: exr.c:95
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:2964
AVCOL_TRC_LINEAR
@ AVCOL_TRC_LINEAR
"Linear transfer characteristics"
Definition: pixfmt.h:579
decode_header
static int decode_header(EXRContext *s, AVFrame *frame)
Definition: exr.c:1539
EXRContext::layer
const char * layer
Definition: exr.c:187
av_strcasecmp
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
Definition: avstring.c:207
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:266
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:2028
ph
static int FUNC() ph(CodedBitstreamContext *ctx, RWContext *rw, H266RawPH *current)
Definition: cbs_h266_syntax_template.c:3000
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:340
EXRContext::chunk_count
uint32_t chunk_count
Definition: exr.c:183
EXRContext::picture
AVFrame * picture
Definition: exr.c:148
AVCOL_TRC_NB
@ AVCOL_TRC_NB
Not part of ABI.
Definition: pixfmt.h:592
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
EXRThreadData::rle_data
uint8_t * rle_data
Definition: exr.c:128
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:1022
AVPacket::data
uint8_t * data
Definition: packet.h:491
av_intfloat32::i
uint32_t i
Definition: intfloat.h:28
ExrPixelType
ExrPixelType
Definition: exr.c:74
AVOption
AVOption.
Definition: opt.h:251
b
#define b
Definition: input.c:41
AVCOL_TRC_UNSPECIFIED
@ AVCOL_TRC_UNSPECIFIED
Definition: pixfmt.h:573
decode_init
static av_cold int decode_init(AVCodecContext *avctx)
Definition: exr.c:2222
reverse_lut
static uint16_t reverse_lut(const uint8_t *bitmap, uint16_t *lut)
Definition: exr.c:274
expf
#define expf(x)
Definition: libm.h:283
FFCodec
Definition: codec_internal.h:127
EXRThreadData::vlc
VLC vlc
Definition: exr.c:143
float.h
AVCOL_TRC_BT2020_12
@ AVCOL_TRC_BT2020_12
ITU-R BT2020 for 12-bit system.
Definition: pixfmt.h:586
EXRThreadData::ysize
int ysize
Definition: exr.c:136
piz_uncompress
static int piz_uncompress(const EXRContext *s, const uint8_t *src, int ssize, int dsize, EXRThreadData *td)
Definition: exr.c:594
AVDictionary
Definition: dict.c:34
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
options
static const AVOption options[]
Definition: exr.c:2302
EXRThreadData::tmp_size
int tmp_size
Definition: exr.c:117
intfloat.h
EXRThreadData::dc_data
uint8_t * dc_data
Definition: exr.c:125
ff_set_dimensions
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
Definition: utils.c:94
EXRThreadData::rle_size
unsigned rle_size
Definition: exr.c:129
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:514
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:815
rle
static int rle(uint8_t *dst, const uint8_t *src, int compressed_size, int uncompressed_size)
Definition: exr.c:216
convert
static void convert(float y, float u, float v, float *b, float *g, float *r)
Definition: exr.c:962
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:361
EXRContext::channel_offsets
int channel_offsets[4]
Definition: exr.c:158
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:30
ff_thread_get_buffer
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before as well as code calling up to before the decode process starts Call have so the codec calls ff_thread_report set FF_CODEC_CAP_ALLOCATE_PROGRESS in FFCodec caps_internal and use ff_thread_get_buffer() to allocate frames. Otherwise decode directly into the user-supplied frames. Call ff_thread_report_progress() after some part of the current picture has decoded. A good place to put this is where draw_horiz_band() is called - add this if it isn 't called anywhere
EXR_B44A
@ EXR_B44A
Definition: exr.c:68
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:291
EXR_HALF
@ EXR_HALF
Definition: exr.c:76
bytestream2_skip
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
Definition: bytestream.h:168
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:335
rgb
Definition: rpzaenc.c:60
EXR_DWAA
@ EXR_DWAA
Definition: exr.c:69
EXRContext::tile_attr
EXRTileAttribute tile_attr
Definition: exr.c:169
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:289
AVCOL_TRC_IEC61966_2_1
@ AVCOL_TRC_IEC61966_2_1
IEC 61966-2-1 (sRGB or sYCC)
Definition: pixfmt.h:584
cosf
#define cosf(x)
Definition: libm.h:78
AVCodecContext::skip_frame
enum AVDiscard skip_frame
Skip decoding for selected frames.
Definition: avcodec.h:1766
fail
#define fail()
Definition: checkasm.h:138
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:1532
EXR_TILE_LEVEL_RIPMAP
@ EXR_TILE_LEVEL_RIPMAP
Definition: exr.c:84
EXR_TILE_ROUND_UNKNOWN
@ EXR_TILE_ROUND_UNKNOWN
Definition: exr.c:91
FFSIGN
#define FFSIGN(a)
Definition: common.h:66
GetBitContext
Definition: get_bits.h:108
ub
#define ub(width, name)
Definition: cbs_h2645.c:400
AVCOL_TRC_GAMMA28
@ AVCOL_TRC_GAMMA28
also ITU-R BT470BG
Definition: pixfmt.h:576
EXRContext::current_part
int current_part
Definition: exr.c:172
val
static double val(void *priv, double ch)
Definition: aeval.c:78
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
scale
static av_always_inline float scale(float x, float s)
Definition: vf_v360.c:1389
AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_GRAY16
Definition: pixfmt.h:452
AVCOL_TRC_LOG_SQRT
@ AVCOL_TRC_LOG_SQRT
"Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)"
Definition: pixfmt.h:581
fabsf
static __device__ float fabsf(float a)
Definition: cuda_runtime.h:181
EXRContext::avctx
AVCodecContext * avctx
Definition: exr.c:149
ff_exr_decoder
const FFCodec ff_exr_decoder
Definition: exr.c:2356
AVCOL_TRC_SMPTEST428_1
@ AVCOL_TRC_SMPTEST428_1
Definition: pixfmt.h:590
huf_build_dec_table
static int huf_build_dec_table(const EXRContext *s, EXRThreadData *td, int im, int iM)
Definition: exr.c:371
EXRThreadData::he
HuffEntry * he
Definition: exr.c:141
AVCOL_TRC_GAMMA22
@ AVCOL_TRC_GAMMA22
also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
Definition: pixfmt.h:575
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:167
EXRContext::h
int h
Definition: exr.c:161
EXRThreadData::rle_raw_data
uint8_t * rle_raw_data
Definition: exr.c:131
EXR_DWAB
@ EXR_DWAB
Definition: exr.c:70
ExrDSPContext
Definition: exrdsp.h:25
EXRThreadData::channel_line_size
int channel_line_size
Definition: exr.c:138
USHORT_RANGE
#define USHORT_RANGE
Definition: exr.c:271
avassert.h
to_linear
static float to_linear(float x, float scale)
Definition: exr.c:970
decode_end
static av_cold int decode_end(AVCodecContext *avctx)
Definition: exr.c:2274
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
av_cold
#define av_cold
Definition: attributes.h:90
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:545
EXRContext::sar
uint32_t sar
Definition: exr.c:162
EXRThreadData::ac_size
unsigned ac_size
Definition: exr.c:123
EXR_FLOAT
@ EXR_FLOAT
Definition: exr.c:77
BITMAP_SIZE
#define BITMAP_SIZE
Definition: exr.c:272
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:156
EXRThreadData::ac_data
uint8_t * ac_data
Definition: exr.c:122
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:306
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:1509
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:300
AVCOL_TRC_BT1361_ECG
@ AVCOL_TRC_BT1361_ECG
ITU-R BT1361 Extended Colour Gamut.
Definition: pixfmt.h:583
g
const char * g
Definition: vf_curves.c:127
GetByteContext::buffer
const uint8_t * buffer
Definition: bytestream.h:34
EXRContext::current_channel_offset
int current_channel_offset
Definition: exr.c:182
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts_bsf.c:365
HuffEntry::sym
uint16_t sym
Definition: exr.c:96
EXRContext::xmax
int32_t xmax
Definition: exr.c:163
decode_block
static int decode_block(AVCodecContext *avctx, void *tdata, int jobnr, int threadnr)
Definition: exr.c:1173
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
EXRChannel::pixel_type
enum ExrPixelType pixel_type
Definition: exr.c:102
ctx
AVFormatContext * ctx
Definition: movenc.c:48
decode.h
get_bits.h
AVCodecContext::max_pixels
int64_t max_pixels
The number of pixels per image to maximally accept.
Definition: avcodec.h:1959
SHORTEST_LONG_RUN
#define SHORTEST_LONG_RUN
Definition: exr.c:325
blk
#define blk(i)
Definition: sha.c:186
skip_header_chunk
static void skip_header_chunk(EXRContext *s)
Definition: exr.c:1480
key
const char * key
Definition: hwcontext_opencl.c:174
AV_PIX_FMT_GRAYF32
#define AV_PIX_FMT_GRAYF32
Definition: pixfmt.h:501
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:272
frame
static AVFrame * frame
Definition: demux_decode.c:54
EXR_ZIP1
@ EXR_ZIP1
Definition: exr.c:63
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:65
if
if(ret)
Definition: filter_design.txt:179
EXRContext::desc
const AVPixFmtDescriptor * desc
Definition: exr.c:159
AV_CODEC_CAP_FRAME_THREADS
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: codec.h:110
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:219
av_realloc_f
#define av_realloc_f(p, o, n)
Definition: tableprint_vlc.h:32
EXRContext::is_luma
int is_luma
Definition: exr.c:174
AV_CODEC_ID_EXR
@ AV_CODEC_ID_EXR
Definition: codec_id.h:232
AV_PIX_FMT_RGBA64
#define AV_PIX_FMT_RGBA64
Definition: pixfmt.h:458
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
ff_bswapdsp_init
av_cold void ff_bswapdsp_init(BswapDSPContext *c)
Definition: bswapdsp.c:49
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:203
bias
static int bias(int x, int c)
Definition: vqcdec.c:113
LONG_ZEROCODE_RUN
#define LONG_ZEROCODE_RUN
Definition: exr.c:324
pixel
uint8_t pixel
Definition: tiny_ssim.c:41
SHORT_ZEROCODE_RUN
#define SHORT_ZEROCODE_RUN
Definition: exr.c:323
AVCOL_TRC_IEC61966_2_4
@ AVCOL_TRC_IEC61966_2_4
IEC 61966-2-4.
Definition: pixfmt.h:582
EXR_RLE
@ EXR_RLE
Definition: exr.c:62
EXR_TILE_ROUND_UP
@ EXR_TILE_ROUND_UP
Definition: exr.c:89
EXRChannel::ysub
int ysub
Definition: exr.c:101
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:237
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:279
EXRThreadData::block
float block[3][64]
Definition: exr.c:134
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:109
mathops.h
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:49
EXRContext::w
int w
Definition: exr.c:161
AVCOL_TRC_BT2020_10
@ AVCOL_TRC_BT2020_10
ITU-R BT2020 for 10-bit system.
Definition: pixfmt.h:585
av_intfloat32
Definition: intfloat.h:27
unpack_14
static void unpack_14(const uint8_t b[14], uint16_t s[16])
Definition: exr.c:764
EXR_PIZ
@ EXR_PIZ
Definition: exr.c:65
A_OFFSET
#define A_OFFSET
Definition: exr.c:502
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:652
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
bytestream2_get_bytes_left
static av_always_inline int bytestream2_get_bytes_left(GetByteContext *g)
Definition: bytestream.h:158
bytestream2_tell
static av_always_inline int bytestream2_tell(GetByteContext *g)
Definition: bytestream.h:192
EXRThreadData::bitmap
uint8_t * bitmap
Definition: exr.c:119
PutByteContext
Definition: bytestream.h:37
EXRContext::pixel_type
enum ExrPixelType pixel_type
Definition: exr.c:157
EXRTileAttribute::level_mode
enum ExrTileLevelMode level_mode
Definition: exr.c:108
EXRChannel::xsub
int xsub
Definition: exr.c:101
EXRContext::thread_data
EXRThreadData * thread_data
Definition: exr.c:185
EXR_RAW
@ EXR_RAW
Definition: exr.c:61
f
f
Definition: af_crystalizer.c:121
AVFrame::pict_type
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:442
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:488
AVPacket::size
int size
Definition: packet.h:492
wav_decode
static void wav_decode(uint16_t *in, int nx, int ox, int ny, int oy, uint16_t mx)
Definition: exr.c:515
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:50
AVCOL_TRC_SMPTE240M
@ AVCOL_TRC_SMPTE240M
Definition: pixfmt.h:578
codec_internal.h
MOD_MASK
#define MOD_MASK
Definition: exr.c:503
dwa_uncompress
static int dwa_uncompress(const EXRContext *s, const uint8_t *src, int compressed_size, int uncompressed_size, EXRThreadData *td)
Definition: exr.c:983
shift
static int shift(int a, int b)
Definition: bonk.c:262
AVCOL_TRC_SMPTEST2084
@ AVCOL_TRC_SMPTEST2084
Definition: pixfmt.h:588
AVCOL_TRC_LOG
@ AVCOL_TRC_LOG
"Logarithmic transfer characteristic (100:1 range)"
Definition: pixfmt.h:580
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:425
EXRTileAttribute::xSize
int32_t xSize
Definition: exr.c:106
bytestream2_get_ne16
#define bytestream2_get_ne16
Definition: bytestream.h:119
AV_PIX_FMT_GBRPF32
#define AV_PIX_FMT_GBRPF32
Definition: pixfmt.h:498
AV_PIX_FMT_RGB48
#define AV_PIX_FMT_RGB48
Definition: pixfmt.h:454
size
int size
Definition: twinvq_data.h:10344
EXRThreadData::tmp
uint8_t * tmp
Definition: exr.c:116
EXRContext::is_tile
int is_tile
Definition: exr.c:170
EXR_TILE_LEVEL_MIPMAP
@ EXR_TILE_LEVEL_MIPMAP
Definition: exr.c:83
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:54
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:191
ac_uncompress
static int ac_uncompress(const EXRContext *s, GetByteContext *gb, float *block)
Definition: exr.c:886
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:164
EXRContext::gb
GetByteContext gb
Definition: exr.c:176
idct_1d
static void idct_1d(float *blk, int step)
Definition: exr.c:907
height
#define height
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:164
csp.h
AV_CODEC_CAP_SLICE_THREADS
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
Definition: codec.h:114
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:225
EXR_ZIP16
@ EXR_ZIP16
Definition: exr.c:64
EXRContext::apply_trc_type
enum AVColorTransferCharacteristic apply_trc_type
Definition: exr.c:190
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:321
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:799
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:191
AVCOL_TRC_BT709
@ AVCOL_TRC_BT709
also ITU-R BT1361
Definition: pixfmt.h:572
AV_OPT_TYPE_FLOAT
@ AV_OPT_TYPE_FLOAT
Definition: opt.h:228
dct_inverse
static void dct_inverse(float *block)
Definition: exr.c:951
av_csp_trc_function
double(* av_csp_trc_function)(double)
Function pointer representing a double -> double transfer function that performs an EOTF transfer inv...
Definition: csp.h:87
EXRContext::selected_part
int selected_part
Definition: exr.c:188
EXRContext::h2f_tables
Half2FloatTables h2f_tables
Definition: exr.c:196
ExrTileLevelRound
ExrTileLevelRound
Definition: exr.c:88
OFFSET
#define OFFSET(x)
Definition: exr.c:2300
AV_PIX_FMT_YA16
#define AV_PIX_FMT_YA16
Definition: pixfmt.h:453
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:255
FFMIN3
#define FFMIN3(a, b, c)
Definition: macros.h:50
EXRContext::offset_table
uint8_t * offset_table
Definition: exr.c:194
HUF_ENCSIZE
#define HUF_ENCSIZE
Definition: exr.c:298
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:31
common.h
EXRContext::buf
const uint8_t * buf
Definition: exr.c:177
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:56
EXRThreadData::xsize
int xsize
Definition: exr.c:136
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:52
EXR_PXR24
@ EXR_PXR24
Definition: exr.c:66
planes
static const struct @363 planes[]
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
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:194
EXR_UINT
@ EXR_UINT
Definition: exr.c:75
huf_unpack_enc_table
static int huf_unpack_enc_table(GetByteContext *gb, int32_t im, int32_t iM, uint64_t *freq)
Definition: exr.c:328
AVCodecContext::height
int height
Definition: avcodec.h:621
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:658
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:262
EXR_B44
@ EXR_B44
Definition: exr.c:67
avcodec.h
EXRContext::nb_channels
int nb_channels
Definition: exr.c:181
ff_zigzag_direct
const uint8_t ff_zigzag_direct[64]
Definition: mathtables.c:98
ff_vlc_free
void ff_vlc_free(VLC *vlc)
Definition: vlc.c:509
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:417
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:71
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:258
EXRContext::gamma_table
union av_intfloat32 gamma_table[65536]
Definition: exr.c:192
EXRThreadData::dc_size
unsigned dc_size
Definition: exr.c:126
HuffEntry::code
uint32_t code
Definition: exr.c:97
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
EXRThreadData::freq
uint64_t * freq
Definition: exr.c:142
EXRContext::is_multipart
int is_multipart
Definition: exr.c:171
AVCodecContext
main external API structure.
Definition: avcodec.h:441
pxr24_uncompress
static int pxr24_uncompress(const EXRContext *s, const uint8_t *src, int compressed_size, int uncompressed_size, EXRThreadData *td)
Definition: exr.c:680
EXRContext::channels
EXRChannel * channels
Definition: exr.c:180
EXR_UNKNOWN
@ EXR_UNKNOWN
Definition: exr.c:78
EXRContext::ymax
int32_t ymax
Definition: exr.c:164
EXRContext::ydelta
uint32_t ydelta
Definition: exr.c:165
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
VLC
Definition: vlc.h:33
wdec16
static void wdec16(uint16_t l, uint16_t h, uint16_t *a, uint16_t *b)
Definition: exr.c:505
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:225
AV_PIX_FMT_GBRAPF32
#define AV_PIX_FMT_GBRAPF32
Definition: pixfmt.h:499
AVFrame::metadata
AVDictionary * metadata
metadata.
Definition: frame.h:708
EXRThreadData::run_sym
int run_sym
Definition: exr.c:140
HuffEntry
Definition: exr.c:94
VLC::table
VLCElem * table
Definition: vlc.h:35
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:577
EXR_TILE_LEVEL_UNKNOWN
@ EXR_TILE_LEVEL_UNKNOWN
Definition: exr.c:85
av_intfloat32::f
float f
Definition: intfloat.h:29
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:36
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:446
ExrCompr
ExrCompr
Definition: exr.c:60
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:468
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:468
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
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:88
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
zip_uncompress
static int zip_uncompress(const EXRContext *s, const uint8_t *src, int compressed_size, int uncompressed_size, EXRThreadData *td)
Definition: exr.c:199
EXRContext::buf_size
int buf_size
Definition: exr.c:178
d
d
Definition: ffmpeg_filter.c:368
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:621
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
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:474
ExrTileLevelMode
ExrTileLevelMode
Definition: exr.c:81
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:385
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:107
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:2349
BswapDSPContext
Definition: bswapdsp.h:24
h
h
Definition: vp9dsp_template.c:2038
avstring.h
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Definition: opt.h:229
EXRContext::xmin
int32_t xmin
Definition: exr.c:163
EXRContext::xdelta
uint32_t xdelta
Definition: exr.c:165
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:234
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:1581
skip
static void BS_FUNC() skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
Definition: bitstream_template.h:375
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
av_realloc
void * av_realloc(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory.
Definition: mem.c:153
EXRContext::dsp
ExrDSPContext dsp
Definition: exr.c:150
EXR_UNKN
@ EXR_UNKN
Definition: exr.c:71
EXRContext
Definition: exr.c:146
EXRChannel
Definition: exr.c:100