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