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