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  if (bytestream2_get_bytes_left(&gb) < 4)
641  return AVERROR_INVALIDDATA;
642 
643  maxval = reverse_lut(td->bitmap, td->lut);
644 
645  bytestream2_skip(&gb, 4);
646  ret = huf_uncompress(s, td, &gb, tmp, dsize / sizeof(uint16_t));
647  if (ret)
648  return ret;
649 
650  ptr = tmp;
651  for (i = 0; i < s->nb_channels; i++) {
652  channel = &s->channels[i];
653 
654  if (channel->pixel_type == EXR_HALF)
655  pixel_half_size = 1;
656  else
657  pixel_half_size = 2;
658 
659  for (j = 0; j < pixel_half_size; j++)
660  wav_decode(ptr + j, td->xsize, pixel_half_size, td->ysize,
661  td->xsize * pixel_half_size, maxval);
662  ptr += td->xsize * td->ysize * pixel_half_size;
663  }
664 
665  apply_lut(td->lut, tmp, dsize / sizeof(uint16_t));
666 
667  out = (uint16_t *)td->uncompressed_data;
668  for (i = 0; i < td->ysize; i++) {
669  tmp_offset = 0;
670  for (j = 0; j < s->nb_channels; j++) {
671  channel = &s->channels[j];
672  if (channel->pixel_type == EXR_HALF)
673  pixel_half_size = 1;
674  else
675  pixel_half_size = 2;
676 
677  in = tmp + tmp_offset * td->xsize * td->ysize + i * td->xsize * pixel_half_size;
678  tmp_offset += pixel_half_size;
679 
680 #if HAVE_BIGENDIAN
681  s->bbdsp.bswap16_buf(out, in, td->xsize * pixel_half_size);
682 #else
683  memcpy(out, in, td->xsize * 2 * pixel_half_size);
684 #endif
685  out += td->xsize * pixel_half_size;
686  }
687  }
688 
689  return 0;
690 }
691 
692 static int pxr24_uncompress(const EXRContext *s, const uint8_t *src,
693  int compressed_size, int uncompressed_size,
694  EXRThreadData *td)
695 {
696  unsigned long dest_len, expected_len = 0;
697  const uint8_t *in = td->tmp;
698  uint8_t *out;
699  int c, i, j;
700 
701  for (i = 0; i < s->nb_channels; i++) {
702  if (s->channels[i].pixel_type == EXR_FLOAT) {
703  expected_len += (td->xsize * td->ysize * 3);/* PRX 24 store float in 24 bit instead of 32 */
704  } else if (s->channels[i].pixel_type == EXR_HALF) {
705  expected_len += (td->xsize * td->ysize * 2);
706  } else {//UINT 32
707  expected_len += (td->xsize * td->ysize * 4);
708  }
709  }
710 
711  dest_len = expected_len;
712 
713  if (uncompress(td->tmp, &dest_len, src, compressed_size) != Z_OK) {
714  return AVERROR_INVALIDDATA;
715  } else if (dest_len != expected_len) {
716  return AVERROR_INVALIDDATA;
717  }
718 
719  out = td->uncompressed_data;
720  for (i = 0; i < td->ysize; i++)
721  for (c = 0; c < s->nb_channels; c++) {
722  EXRChannel *channel = &s->channels[c];
723  const uint8_t *ptr[4];
724  uint32_t pixel = 0;
725 
726  switch (channel->pixel_type) {
727  case EXR_FLOAT:
728  ptr[0] = in;
729  ptr[1] = ptr[0] + td->xsize;
730  ptr[2] = ptr[1] + td->xsize;
731  in = ptr[2] + td->xsize;
732 
733  for (j = 0; j < td->xsize; ++j) {
734  uint32_t diff = ((unsigned)*(ptr[0]++) << 24) |
735  (*(ptr[1]++) << 16) |
736  (*(ptr[2]++) << 8);
737  pixel += diff;
738  bytestream_put_le32(&out, pixel);
739  }
740  break;
741  case EXR_HALF:
742  ptr[0] = in;
743  ptr[1] = ptr[0] + td->xsize;
744  in = ptr[1] + td->xsize;
745  for (j = 0; j < td->xsize; j++) {
746  uint32_t diff = (*(ptr[0]++) << 8) | *(ptr[1]++);
747 
748  pixel += diff;
749  bytestream_put_le16(&out, pixel);
750  }
751  break;
752  case EXR_UINT:
753  ptr[0] = in;
754  ptr[1] = ptr[0] + td->xsize;
755  ptr[2] = ptr[1] + td->xsize;
756  ptr[3] = ptr[2] + td->xsize;
757  in = ptr[3] + td->xsize;
758 
759  for (j = 0; j < td->xsize; ++j) {
760  uint32_t diff = ((uint32_t)*(ptr[0]++) << 24) |
761  (*(ptr[1]++) << 16) |
762  (*(ptr[2]++) << 8 ) |
763  (*(ptr[3]++));
764  pixel += diff;
765  bytestream_put_le32(&out, pixel);
766  }
767  break;
768  default:
769  return AVERROR_INVALIDDATA;
770  }
771  }
772 
773  return 0;
774 }
775 
776 static void unpack_14(const uint8_t b[14], uint16_t s[16])
777 {
778  uint16_t shift = (b[ 2] >> 2) & 15;
779  uint16_t bias = (0x20 << shift);
780  int i;
781 
782  s[ 0] = (b[0] << 8) | b[1];
783 
784  s[ 4] = s[ 0] + ((((b[ 2] << 4) | (b[ 3] >> 4)) & 0x3f) << shift) - bias;
785  s[ 8] = s[ 4] + ((((b[ 3] << 2) | (b[ 4] >> 6)) & 0x3f) << shift) - bias;
786  s[12] = s[ 8] + ((b[ 4] & 0x3f) << shift) - bias;
787 
788  s[ 1] = s[ 0] + ((b[ 5] >> 2) << shift) - bias;
789  s[ 5] = s[ 4] + ((((b[ 5] << 4) | (b[ 6] >> 4)) & 0x3f) << shift) - bias;
790  s[ 9] = s[ 8] + ((((b[ 6] << 2) | (b[ 7] >> 6)) & 0x3f) << shift) - bias;
791  s[13] = s[12] + ((b[ 7] & 0x3f) << shift) - bias;
792 
793  s[ 2] = s[ 1] + ((b[ 8] >> 2) << shift) - bias;
794  s[ 6] = s[ 5] + ((((b[ 8] << 4) | (b[ 9] >> 4)) & 0x3f) << shift) - bias;
795  s[10] = s[ 9] + ((((b[ 9] << 2) | (b[10] >> 6)) & 0x3f) << shift) - bias;
796  s[14] = s[13] + ((b[10] & 0x3f) << shift) - bias;
797 
798  s[ 3] = s[ 2] + ((b[11] >> 2) << shift) - bias;
799  s[ 7] = s[ 6] + ((((b[11] << 4) | (b[12] >> 4)) & 0x3f) << shift) - bias;
800  s[11] = s[10] + ((((b[12] << 2) | (b[13] >> 6)) & 0x3f) << shift) - bias;
801  s[15] = s[14] + ((b[13] & 0x3f) << shift) - bias;
802 
803  for (i = 0; i < 16; ++i) {
804  if (s[i] & 0x8000)
805  s[i] &= 0x7fff;
806  else
807  s[i] = ~s[i];
808  }
809 }
810 
811 static void unpack_3(const uint8_t b[3], uint16_t s[16])
812 {
813  int i;
814 
815  s[0] = (b[0] << 8) | b[1];
816 
817  if (s[0] & 0x8000)
818  s[0] &= 0x7fff;
819  else
820  s[0] = ~s[0];
821 
822  for (i = 1; i < 16; i++)
823  s[i] = s[0];
824 }
825 
826 
827 static int b44_uncompress(const EXRContext *s, const uint8_t *src, int compressed_size,
828  int uncompressed_size, EXRThreadData *td) {
829  const int8_t *sr = src;
830  int stay_to_uncompress = compressed_size;
831  int nb_b44_block_w, nb_b44_block_h;
832  int index_tl_x, index_tl_y, index_out, index_tmp;
833  uint16_t tmp_buffer[16]; /* B44 use 4x4 half float pixel */
834  int c, iY, iX, y, x;
835  int target_channel_offset = 0;
836 
837  /* calc B44 block count */
838  nb_b44_block_w = td->xsize / 4;
839  if ((td->xsize % 4) != 0)
840  nb_b44_block_w++;
841 
842  nb_b44_block_h = td->ysize / 4;
843  if ((td->ysize % 4) != 0)
844  nb_b44_block_h++;
845 
846  for (c = 0; c < s->nb_channels; c++) {
847  if (s->channels[c].pixel_type == EXR_HALF) {/* B44 only compress half float data */
848  for (iY = 0; iY < nb_b44_block_h; iY++) {
849  for (iX = 0; iX < nb_b44_block_w; iX++) {/* For each B44 block */
850  if (stay_to_uncompress < 3)
851  return AVERROR_INVALIDDATA;
852 
853  if (src[compressed_size - stay_to_uncompress + 2] == 0xfc) { /* B44A block */
854  unpack_3(sr, tmp_buffer);
855  sr += 3;
856  stay_to_uncompress -= 3;
857  } else {/* B44 Block */
858  if (stay_to_uncompress < 14)
859  return AVERROR_INVALIDDATA;
860  unpack_14(sr, tmp_buffer);
861  sr += 14;
862  stay_to_uncompress -= 14;
863  }
864 
865  /* copy data to uncompress buffer (B44 block can exceed target resolution)*/
866  index_tl_x = iX * 4;
867  index_tl_y = iY * 4;
868 
869  for (y = index_tl_y; y < FFMIN(index_tl_y + 4, td->ysize); y++) {
870  for (x = index_tl_x; x < FFMIN(index_tl_x + 4, td->xsize); x++) {
871  index_out = target_channel_offset * td->xsize + y * td->channel_line_size + 2 * x;
872  index_tmp = (y-index_tl_y) * 4 + (x-index_tl_x);
873  td->uncompressed_data[index_out] = tmp_buffer[index_tmp] & 0xff;
874  td->uncompressed_data[index_out + 1] = tmp_buffer[index_tmp] >> 8;
875  }
876  }
877  }
878  }
879  target_channel_offset += 2;
880  } else {/* Float or UINT 32 channel */
881  if (stay_to_uncompress < td->ysize * td->xsize * 4)
882  return AVERROR_INVALIDDATA;
883 
884  for (y = 0; y < td->ysize; y++) {
885  index_out = target_channel_offset * td->xsize + y * td->channel_line_size;
886  memcpy(&td->uncompressed_data[index_out], sr, td->xsize * 4);
887  sr += td->xsize * 4;
888  }
889  target_channel_offset += 4;
890 
891  stay_to_uncompress -= td->ysize * td->xsize * 4;
892  }
893  }
894 
895  return 0;
896 }
897 
898 static int ac_uncompress(const EXRContext *s, GetByteContext *gb, float *block)
899 {
900  int ret = 0, n = 1;
901 
902  while (n < 64) {
903  uint16_t val = bytestream2_get_ne16(gb);
904 
905  if (val == 0xff00) {
906  n = 64;
907  } else if ((val >> 8) == 0xff) {
908  n += val & 0xff;
909  } else {
910  ret = n;
911  block[ff_zigzag_direct[n]] = av_int2float(half2float(val, &s->h2f_tables));
912  n++;
913  }
914  }
915 
916  return ret;
917 }
918 
919 static void idct_1d(float *blk, int step)
920 {
921  const float a = .5f * cosf( M_PI / 4.f);
922  const float b = .5f * cosf( M_PI / 16.f);
923  const float c = .5f * cosf( M_PI / 8.f);
924  const float d = .5f * cosf(3.f*M_PI / 16.f);
925  const float e = .5f * cosf(5.f*M_PI / 16.f);
926  const float f = .5f * cosf(3.f*M_PI / 8.f);
927  const float g = .5f * cosf(7.f*M_PI / 16.f);
928 
929  float alpha[4], beta[4], theta[4], gamma[4];
930 
931  alpha[0] = c * blk[2 * step];
932  alpha[1] = f * blk[2 * step];
933  alpha[2] = c * blk[6 * step];
934  alpha[3] = f * blk[6 * step];
935 
936  beta[0] = b * blk[1 * step] + d * blk[3 * step] + e * blk[5 * step] + g * blk[7 * step];
937  beta[1] = d * blk[1 * step] - g * blk[3 * step] - b * blk[5 * step] - e * blk[7 * step];
938  beta[2] = e * blk[1 * step] - b * blk[3 * step] + g * blk[5 * step] + d * blk[7 * step];
939  beta[3] = g * blk[1 * step] - e * blk[3 * step] + d * blk[5 * step] - b * blk[7 * step];
940 
941  theta[0] = a * (blk[0 * step] + blk[4 * step]);
942  theta[3] = a * (blk[0 * step] - blk[4 * step]);
943 
944  theta[1] = alpha[0] + alpha[3];
945  theta[2] = alpha[1] - alpha[2];
946 
947  gamma[0] = theta[0] + theta[1];
948  gamma[1] = theta[3] + theta[2];
949  gamma[2] = theta[3] - theta[2];
950  gamma[3] = theta[0] - theta[1];
951 
952  blk[0 * step] = gamma[0] + beta[0];
953  blk[1 * step] = gamma[1] + beta[1];
954  blk[2 * step] = gamma[2] + beta[2];
955  blk[3 * step] = gamma[3] + beta[3];
956 
957  blk[4 * step] = gamma[3] - beta[3];
958  blk[5 * step] = gamma[2] - beta[2];
959  blk[6 * step] = gamma[1] - beta[1];
960  blk[7 * step] = gamma[0] - beta[0];
961 }
962 
963 static void dct_inverse(float *block)
964 {
965  for (int i = 0; i < 8; i++)
966  idct_1d(block + i, 8);
967 
968  for (int i = 0; i < 8; i++) {
969  idct_1d(block, 1);
970  block += 8;
971  }
972 }
973 
974 static void convert(float y, float u, float v,
975  float *b, float *g, float *r)
976 {
977  *r = y + 1.5747f * v;
978  *g = y - 0.1873f * u - 0.4682f * v;
979  *b = y + 1.8556f * u;
980 }
981 
982 static float to_linear(float x, float scale)
983 {
984  float ax = fabsf(x);
985 
986  if (ax <= 1.f) {
987  return FFSIGN(x) * powf(ax, 2.2f * scale);
988  } else {
989  const float log_base = expf(2.2f * scale);
990 
991  return FFSIGN(x) * powf(log_base, ax - 1.f);
992  }
993 }
994 
995 static int dwa_uncompress(const EXRContext *s, const uint8_t *src, int compressed_size,
996  int uncompressed_size, EXRThreadData *td)
997 {
998  int64_t version, lo_usize, lo_size;
999  int64_t ac_size, dc_size, rle_usize, rle_csize, rle_raw_size;
1000  int64_t ac_count, dc_count, ac_compression;
1001  const int dc_w = (td->xsize + 7) >> 3;
1002  const int dc_h = (td->ysize + 7) >> 3;
1003  GetByteContext gb, agb;
1004  int skip, ret;
1005  int have_rle = 0;
1006 
1007  if (compressed_size <= 88)
1008  return AVERROR_INVALIDDATA;
1009 
1010  version = AV_RL64(src + 0);
1011  if (version != 2)
1012  return AVERROR_INVALIDDATA;
1013 
1014  if (s->nb_channels < 3) {
1015  avpriv_request_sample(s->avctx, "Gray DWA");
1016  return AVERROR_PATCHWELCOME;
1017  }
1018 
1019  lo_usize = AV_RL64(src + 8);
1020  lo_size = AV_RL64(src + 16);
1021  ac_size = AV_RL64(src + 24);
1022  dc_size = AV_RL64(src + 32);
1023  rle_csize = AV_RL64(src + 40);
1024  rle_usize = AV_RL64(src + 48);
1025  rle_raw_size = AV_RL64(src + 56);
1026  ac_count = AV_RL64(src + 64);
1027  dc_count = AV_RL64(src + 72);
1028  ac_compression = AV_RL64(src + 80);
1029 
1030  if ( compressed_size < (uint64_t)(lo_size | ac_size | dc_size | rle_csize) || compressed_size < 88LL + lo_size + ac_size + dc_size + rle_csize
1031  || ac_count > (uint64_t)INT_MAX/2
1032  )
1033  return AVERROR_INVALIDDATA;
1034 
1035  if (ac_size <= 0) {
1036  avpriv_request_sample(s->avctx, "Zero ac_size");
1037  return AVERROR_INVALIDDATA;
1038  }
1039 
1040  if ((uint64_t)rle_raw_size > INT_MAX) {
1041  avpriv_request_sample(s->avctx, "Too big rle_raw_size");
1042  return AVERROR_INVALIDDATA;
1043  }
1044 
1045  if (td->xsize % 8 || td->ysize % 8) {
1046  avpriv_request_sample(s->avctx, "odd dimensions DWA");
1047  }
1048 
1049  bytestream2_init(&gb, src + 88, compressed_size - 88);
1050  skip = bytestream2_get_le16(&gb);
1051  if (skip < 2)
1052  return AVERROR_INVALIDDATA;
1053 
1054  bytestream2_skip(&gb, skip - 2);
1055 
1056  if (lo_size > 0) {
1057  if (lo_usize > uncompressed_size)
1058  return AVERROR_INVALIDDATA;
1059  bytestream2_skip(&gb, lo_size);
1060  }
1061 
1062  if (ac_size > 0) {
1063  unsigned long dest_len;
1064  GetByteContext agb = gb;
1065 
1066  if (ac_count > 3LL * td->xsize * s->scan_lines_per_block)
1067  return AVERROR_INVALIDDATA;
1068 
1069  dest_len = ac_count * 2LL;
1070 
1071  av_fast_padded_malloc(&td->ac_data, &td->ac_size, dest_len);
1072  if (!td->ac_data)
1073  return AVERROR(ENOMEM);
1074 
1075  switch (ac_compression) {
1076  case 0:
1077  ret = huf_uncompress(s, td, &agb, (int16_t *)td->ac_data, ac_count);
1078  if (ret < 0)
1079  return ret;
1080  break;
1081  case 1:
1082  if (uncompress(td->ac_data, &dest_len, agb.buffer, ac_size) != Z_OK ||
1083  dest_len != ac_count * 2LL)
1084  return AVERROR_INVALIDDATA;
1085  break;
1086  default:
1087  return AVERROR_INVALIDDATA;
1088  }
1089 
1090  bytestream2_skip(&gb, ac_size);
1091  }
1092 
1093  {
1094  unsigned long dest_len;
1095  GetByteContext agb = gb;
1096 
1097  if (dc_count != dc_w * dc_h * 3)
1098  return AVERROR_INVALIDDATA;
1099 
1100  dest_len = dc_count * 2LL;
1101 
1102  av_fast_padded_malloc(&td->dc_data, &td->dc_size, FFALIGN(dest_len, 64) * 2);
1103  if (!td->dc_data)
1104  return AVERROR(ENOMEM);
1105 
1106  if (uncompress(td->dc_data + FFALIGN(dest_len, 64), &dest_len, agb.buffer, dc_size) != Z_OK ||
1107  (dest_len != dc_count * 2LL))
1108  return AVERROR_INVALIDDATA;
1109 
1110  s->dsp.predictor(td->dc_data + FFALIGN(dest_len, 64), dest_len);
1111  s->dsp.reorder_pixels(td->dc_data, td->dc_data + FFALIGN(dest_len, 64), dest_len);
1112 
1113  bytestream2_skip(&gb, dc_size);
1114  }
1115 
1116  if (rle_raw_size > 0 && rle_csize > 0 && rle_usize > 0) {
1117  unsigned long dest_len = rle_usize;
1118 
1119  if (2LL * td->xsize * td->ysize > rle_raw_size)
1120  return AVERROR_INVALIDDATA;
1121 
1122  av_fast_padded_malloc(&td->rle_data, &td->rle_size, rle_usize);
1123  if (!td->rle_data)
1124  return AVERROR(ENOMEM);
1125 
1126  av_fast_padded_malloc(&td->rle_raw_data, &td->rle_raw_size, rle_raw_size);
1127  if (!td->rle_raw_data)
1128  return AVERROR(ENOMEM);
1129 
1130  if (uncompress(td->rle_data, &dest_len, gb.buffer, rle_csize) != Z_OK ||
1131  (dest_len != rle_usize))
1132  return AVERROR_INVALIDDATA;
1133 
1134  ret = rle(td->rle_raw_data, td->rle_data, rle_usize, rle_raw_size);
1135  if (ret < 0)
1136  return ret;
1137  bytestream2_skip(&gb, rle_csize);
1138 
1139  have_rle = 1;
1140  }
1141 
1142  bytestream2_init(&agb, td->ac_data, ac_count * 2);
1143 
1144  for (int y = 0; y < td->ysize; y += 8) {
1145  for (int x = 0; x < td->xsize; x += 8) {
1146  const int o = s->nb_channels == 4;
1147  float *yb = td->block[0];
1148  float *ub = td->block[1];
1149  float *vb = td->block[2];
1150  int bw = FFMIN(8, td->xsize - x);
1151  int bh = FFMIN(8, td->ysize - y);
1152 
1153  memset(td->block, 0, sizeof(td->block));
1154 
1155  for (int j = 0; j < 3; j++) {
1156  float *block = td->block[j];
1157  const int idx = (x >> 3) + (y >> 3) * dc_w + dc_w * dc_h * j;
1158  uint16_t *dc = (uint16_t *)td->dc_data;
1159  union av_intfloat32 dc_val;
1160 
1161  dc_val.i = half2float(dc[idx], &s->h2f_tables);
1162 
1163  block[0] = dc_val.f;
1164  ac_uncompress(s, &agb, block);
1165  dct_inverse(block);
1166  }
1167 
1168  if (s->pixel_type == EXR_HALF) {
1169  uint16_t *bo = ((uint16_t *)td->uncompressed_data) +
1170  y * td->xsize * s->nb_channels + td->xsize * (o + 0) + x;
1171  uint16_t *go = ((uint16_t *)td->uncompressed_data) +
1172  y * td->xsize * s->nb_channels + td->xsize * (o + 1) + x;
1173  uint16_t *ro = ((uint16_t *)td->uncompressed_data) +
1174  y * td->xsize * s->nb_channels + td->xsize * (o + 2) + x;
1175 
1176  for (int yy = 0; yy < bh; yy++) {
1177  for (int xx = 0; xx < bw; xx++) {
1178  const int idx = xx + yy * 8;
1179  float b, g, r;
1180 
1181  convert(yb[idx], ub[idx], vb[idx], &b, &g, &r);
1182 
1183  bo[xx] = float2half(av_float2int(to_linear(b, 1.f)), &s->f2h_tables);
1184  go[xx] = float2half(av_float2int(to_linear(g, 1.f)), &s->f2h_tables);
1185  ro[xx] = float2half(av_float2int(to_linear(r, 1.f)), &s->f2h_tables);
1186  }
1187 
1188  bo += td->xsize * s->nb_channels;
1189  go += td->xsize * s->nb_channels;
1190  ro += td->xsize * s->nb_channels;
1191  }
1192  } else {
1193  float *bo = ((float *)td->uncompressed_data) +
1194  y * td->xsize * s->nb_channels + td->xsize * (o + 0) + x;
1195  float *go = ((float *)td->uncompressed_data) +
1196  y * td->xsize * s->nb_channels + td->xsize * (o + 1) + x;
1197  float *ro = ((float *)td->uncompressed_data) +
1198  y * td->xsize * s->nb_channels + td->xsize * (o + 2) + x;
1199 
1200  for (int yy = 0; yy < bh; yy++) {
1201  for (int xx = 0; xx < bw; xx++) {
1202  const int idx = xx + yy * 8;
1203 
1204  convert(yb[idx], ub[idx], vb[idx], &bo[xx], &go[xx], &ro[xx]);
1205 
1206  bo[xx] = to_linear(bo[xx], 1.f);
1207  go[xx] = to_linear(go[xx], 1.f);
1208  ro[xx] = to_linear(ro[xx], 1.f);
1209  }
1210 
1211  bo += td->xsize * s->nb_channels;
1212  go += td->xsize * s->nb_channels;
1213  ro += td->xsize * s->nb_channels;
1214  }
1215  }
1216  }
1217  }
1218 
1219  if (s->nb_channels < 4)
1220  return 0;
1221 
1222  if (s->pixel_type == EXR_HALF) {
1223  for (int y = 0; y < td->ysize && have_rle; y++) {
1224  uint16_t *ao = ((uint16_t *)td->uncompressed_data) + y * td->xsize * s->nb_channels;
1225  uint8_t *ai0 = td->rle_raw_data + y * td->xsize;
1226  uint8_t *ai1 = td->rle_raw_data + y * td->xsize + rle_raw_size / 2;
1227 
1228  for (int x = 0; x < td->xsize; x++)
1229  ao[x] = ai0[x] | (ai1[x] << 8);
1230  }
1231  } else {
1232  for (int y = 0; y < td->ysize && have_rle; y++) {
1233  uint32_t *ao = ((uint32_t *)td->uncompressed_data) + y * td->xsize * s->nb_channels;
1234  uint8_t *ai0 = td->rle_raw_data + y * td->xsize;
1235  uint8_t *ai1 = td->rle_raw_data + y * td->xsize + rle_raw_size / 2;
1236 
1237  for (int x = 0; x < td->xsize; x++) {
1238  uint16_t ha = ai0[x] | (ai1[x] << 8);
1239 
1240  ao[x] = half2float(ha, &s->h2f_tables);
1241  }
1242  }
1243  }
1244 
1245  return 0;
1246 }
1247 
1248 static int decode_block(AVCodecContext *avctx, void *tdata,
1249  int jobnr, int threadnr)
1250 {
1251  const EXRContext *s = avctx->priv_data;
1252  AVFrame *const p = s->picture;
1253  EXRThreadData *td = &s->thread_data[threadnr];
1254  const uint8_t *channel_buffer[4] = { 0 };
1255  const uint8_t *buf = s->buf;
1256  uint64_t line_offset, uncompressed_size;
1257  uint8_t *ptr;
1258  uint32_t data_size;
1259  int line, col = 0;
1260  uint64_t tile_x, tile_y, tile_level_x, tile_level_y;
1261  const uint8_t *src;
1262  int step = s->desc->comp[0].step;
1263  int bxmin = 0, axmax = 0, window_xoffset = 0;
1264  int window_xmin, window_xmax, window_ymin, window_ymax;
1265  int data_xoffset, data_yoffset, data_window_offset, xsize, ysize;
1266  int i, x, buf_size = s->buf_size;
1267  int c, rgb_channel_count;
1268 #if FF_API_EXR_GAMMA
1269  float one_gamma = 1.0f / s->gamma;
1270  av_csp_trc_function trc_func = av_csp_trc_func_from_id(s->apply_trc_type);
1271 #endif
1272  int ret;
1273 
1274  line_offset = AV_RL64(s->gb.buffer + jobnr * 8);
1275 
1276  if (s->is_tile) {
1277  if (buf_size < 20 || line_offset > buf_size - 20)
1278  return AVERROR_INVALIDDATA;
1279 
1280  src = buf + line_offset + 20;
1281  if (s->is_multipart)
1282  src += 4;
1283 
1284  tile_x = AV_RL32(src - 20);
1285  tile_y = AV_RL32(src - 16);
1286  tile_level_x = AV_RL32(src - 12);
1287  tile_level_y = AV_RL32(src - 8);
1288 
1289  data_size = AV_RL32(src - 4);
1290  if (data_size <= 0 || data_size > buf_size - line_offset - 20)
1291  return AVERROR_INVALIDDATA;
1292 
1293  if (tile_level_x || tile_level_y) { /* tile level, is not the full res level */
1294  avpriv_report_missing_feature(s->avctx, "Subres tile before full res tile");
1295  return AVERROR_PATCHWELCOME;
1296  }
1297 
1298  if (tile_x && s->tile_attr.xSize + (int64_t)FFMAX(s->xmin, 0) >= INT_MAX / tile_x )
1299  return AVERROR_INVALIDDATA;
1300  if (tile_y && s->tile_attr.ySize + (int64_t)FFMAX(s->ymin, 0) >= INT_MAX / tile_y )
1301  return AVERROR_INVALIDDATA;
1302 
1303  line = s->ymin + s->tile_attr.ySize * tile_y;
1304  col = s->tile_attr.xSize * tile_x;
1305 
1306  if (line < s->ymin || line > s->ymax ||
1307  s->xmin + col < s->xmin || s->xmin + col > s->xmax)
1308  return AVERROR_INVALIDDATA;
1309 
1310  td->ysize = FFMIN(s->tile_attr.ySize, s->ydelta - tile_y * s->tile_attr.ySize);
1311  td->xsize = FFMIN(s->tile_attr.xSize, s->xdelta - tile_x * s->tile_attr.xSize);
1312 
1313  if (td->xsize * (uint64_t)s->current_channel_offset > INT_MAX ||
1314  av_image_check_size2(td->xsize, td->ysize, s->avctx->max_pixels, AV_PIX_FMT_NONE, 0, s->avctx) < 0)
1315  return AVERROR_INVALIDDATA;
1316 
1317  td->channel_line_size = td->xsize * s->current_channel_offset;/* uncompress size of one line */
1318  uncompressed_size = td->channel_line_size * (uint64_t)td->ysize;/* uncompress size of the block */
1319  } else {
1320  if (buf_size < 8 || line_offset > buf_size - 8)
1321  return AVERROR_INVALIDDATA;
1322 
1323  src = buf + line_offset + 8;
1324  if (s->is_multipart)
1325  src += 4;
1326  line = AV_RL32(src - 8);
1327 
1328  if (line < s->ymin || line > s->ymax)
1329  return AVERROR_INVALIDDATA;
1330 
1331  data_size = AV_RL32(src - 4);
1332  if (data_size <= 0 || data_size > buf_size - line_offset - 8)
1333  return AVERROR_INVALIDDATA;
1334 
1335  td->ysize = FFMIN(s->scan_lines_per_block, s->ymax - line + 1); /* s->ydelta - line ?? */
1336  td->xsize = s->xdelta;
1337 
1338  if (td->xsize * (uint64_t)s->current_channel_offset > INT_MAX ||
1339  av_image_check_size2(td->xsize, td->ysize, s->avctx->max_pixels, AV_PIX_FMT_NONE, 0, s->avctx) < 0)
1340  return AVERROR_INVALIDDATA;
1341 
1342  td->channel_line_size = td->xsize * s->current_channel_offset;/* uncompress size of one line */
1343  uncompressed_size = td->channel_line_size * (uint64_t)td->ysize;/* uncompress size of the block */
1344 
1345  if ((s->compression == EXR_RAW && (data_size != uncompressed_size ||
1346  line_offset > buf_size - uncompressed_size)) ||
1347  (s->compression != EXR_RAW && (data_size > uncompressed_size ||
1348  line_offset > buf_size - data_size))) {
1349  return AVERROR_INVALIDDATA;
1350  }
1351  }
1352 
1353  window_xmin = FFMIN(avctx->width, FFMAX(0, s->xmin + col));
1354  window_xmax = FFMIN(avctx->width, FFMAX(0, s->xmin + col + td->xsize));
1355  window_ymin = FFMIN(avctx->height, FFMAX(0, line ));
1356  window_ymax = FFMIN(avctx->height, FFMAX(0, line + td->ysize));
1357  xsize = window_xmax - window_xmin;
1358  ysize = window_ymax - window_ymin;
1359 
1360  /* tile or scanline not visible skip decoding */
1361  if (xsize <= 0 || ysize <= 0)
1362  return 0;
1363 
1364  /* is the first tile or is a scanline */
1365  if(col == 0) {
1366  window_xmin = 0;
1367  /* pixels to add at the left of the display window */
1368  window_xoffset = FFMAX(0, s->xmin);
1369  /* bytes to add at the left of the display window */
1370  bxmin = window_xoffset * step;
1371  }
1372 
1373  /* is the last tile or is a scanline */
1374  if(col + td->xsize == s->xdelta) {
1375  window_xmax = avctx->width;
1376  /* bytes to add at the right of the display window */
1377  axmax = FFMAX(0, (avctx->width - (s->xmax + 1))) * step;
1378  }
1379 
1380  if (avctx->max_pixels && uncompressed_size > avctx->max_pixels * 16LL)
1381  return AVERROR_INVALIDDATA;
1382 
1383  if (data_size < uncompressed_size || s->is_tile) { /* td->tmp is use for tile reorganization */
1384  av_fast_padded_malloc(&td->tmp, &td->tmp_size, uncompressed_size);
1385  if (!td->tmp)
1386  return AVERROR(ENOMEM);
1387  }
1388 
1389  if (data_size < uncompressed_size) {
1391  &td->uncompressed_size, uncompressed_size + 64);/* Force 64 padding for AVX2 reorder_pixels dst */
1392 
1393  if (!td->uncompressed_data)
1394  return AVERROR(ENOMEM);
1395 
1397  switch (s->compression) {
1398  case EXR_ZIP1:
1399  case EXR_ZIP16:
1400  ret = zip_uncompress(s, src, data_size, uncompressed_size, td);
1401  break;
1402  case EXR_PIZ:
1403  ret = piz_uncompress(s, src, data_size, uncompressed_size, td);
1404  break;
1405  case EXR_PXR24:
1406  ret = pxr24_uncompress(s, src, data_size, uncompressed_size, td);
1407  break;
1408  case EXR_RLE:
1409  ret = rle_uncompress(s, src, data_size, uncompressed_size, td);
1410  break;
1411  case EXR_B44:
1412  case EXR_B44A:
1413  ret = b44_uncompress(s, src, data_size, uncompressed_size, td);
1414  break;
1415  case EXR_DWAA:
1416  case EXR_DWAB:
1417  ret = dwa_uncompress(s, src, data_size, uncompressed_size, td);
1418  break;
1419  }
1420  if (ret < 0) {
1421  av_log(avctx, AV_LOG_ERROR, "decode_block() failed.\n");
1422  return ret;
1423  }
1424  src = td->uncompressed_data;
1425  }
1426 
1427  /* offsets to crop data outside display window */
1428  data_xoffset = FFABS(FFMIN(0, s->xmin + col)) * (s->pixel_type == EXR_HALF ? 2 : 4);
1429  data_yoffset = FFABS(FFMIN(0, line));
1430  data_window_offset = (data_yoffset * td->channel_line_size) + data_xoffset;
1431 
1432  if (s->channel_offsets[3] >= 0)
1433  channel_buffer[3] = src + (td->xsize * s->channel_offsets[3]) + data_window_offset;
1434  if (!s->is_luma) {
1435  channel_buffer[0] = src + (td->xsize * s->channel_offsets[0]) + data_window_offset;
1436  channel_buffer[1] = src + (td->xsize * s->channel_offsets[1]) + data_window_offset;
1437  channel_buffer[2] = src + (td->xsize * s->channel_offsets[2]) + data_window_offset;
1438  rgb_channel_count = 3;
1439  } else { /* put y data in the first channel_buffer and if needed, alpha in the second */
1440  channel_buffer[0] = src + (td->xsize * s->channel_offsets[1]) + data_window_offset;
1441  if (!(s->desc->flags & AV_PIX_FMT_FLAG_PLANAR))
1442  channel_buffer[1] = channel_buffer[3];
1443  rgb_channel_count = 1;
1444  }
1445 
1446  if (s->desc->flags & AV_PIX_FMT_FLAG_FLOAT) {
1447  for (c = 0; c < s->desc->nb_components; c++) {
1448  int plane = s->desc->comp[c].plane;
1449  ptr = p->data[plane] + window_ymin * p->linesize[plane] + (window_xmin * step) + s->desc->comp[c].offset;
1450 
1451  for (i = 0; i < ysize; i++, ptr += p->linesize[plane]) {
1452  const uint8_t *src = channel_buffer[c];
1453  uint8_t *ptr_x = ptr + window_xoffset * step;
1454 
1455  // Zero out the start if xmin is not 0
1456  if (s->desc->flags & AV_PIX_FMT_FLAG_PLANAR || !c)
1457  memset(ptr, 0, bxmin);
1458 
1459  if (s->pixel_type == EXR_FLOAT) {
1460  // 32-bit
1461 #if FF_API_EXR_GAMMA
1462  if (trc_func && (!c || (c < 3 && s->desc->flags & AV_PIX_FMT_FLAG_PLANAR))) {
1463  for (int x = 0; x < xsize; x++, ptr_x += step) {
1464  float f = av_int2float(bytestream_get_le32(&src));
1465  AV_WN32A(ptr_x, av_float2int(trc_func(f)));
1466  }
1467  } else if (one_gamma != 1.f) {
1468  for (int x = 0; x < xsize; x++, ptr_x += step) {
1469  float f = av_int2float(bytestream_get_le32(&src));
1470  if (f > 0.0f && c < 3) /* avoid negative values */
1471  f = powf(f, one_gamma);
1472  AV_WN32A(ptr_x, av_float2int(f));
1473  }
1474  } else
1475 #endif
1476  for (int x = 0; x < xsize; x++, ptr_x += step)
1477  AV_WN32A(ptr_x, bytestream_get_le32(&src));
1478  } else if (s->pixel_type == EXR_HALF) {
1479  // 16-bit
1480 #if FF_API_EXR_GAMMA
1481  if (one_gamma != 1.f || (trc_func && (!c || (c < 3 && s->desc->flags & AV_PIX_FMT_FLAG_PLANAR)))) {
1482  for (int x = 0; x < xsize; x++, ptr_x += step)
1483  AV_WN16A(ptr_x, s->gamma_table[bytestream_get_le16(&src)]);
1484  } else
1485 #endif
1486  for (int x = 0; x < xsize; x++, ptr_x += step)
1487  AV_WN16A(ptr_x, bytestream_get_le16(&src));
1488  }
1489 
1490  // Zero out the end if xmax+1 is not w
1491  if (s->desc->flags & AV_PIX_FMT_FLAG_PLANAR || !c)
1492  memset(ptr_x, 0, axmax);
1493  channel_buffer[c] += td->channel_line_size;
1494  }
1495  }
1496  } else {
1497 
1498  av_assert1(s->pixel_type == EXR_UINT);
1499  ptr = p->data[0] + window_ymin * p->linesize[0] + (window_xmin * s->desc->nb_components * 2);
1500 
1501  for (i = 0; i < ysize; i++, ptr += p->linesize[0]) {
1502 
1503  const uint8_t * a;
1504  const uint8_t *rgb[3];
1505  uint16_t *ptr_x;
1506 
1507  for (c = 0; c < rgb_channel_count; c++) {
1508  rgb[c] = channel_buffer[c];
1509  }
1510 
1511  if (channel_buffer[3])
1512  a = channel_buffer[3];
1513 
1514  ptr_x = (uint16_t *) ptr;
1515 
1516  // Zero out the start if xmin is not 0
1517  memset(ptr_x, 0, bxmin);
1518  ptr_x += window_xoffset * s->desc->nb_components;
1519 
1520  for (x = 0; x < xsize; x++) {
1521  for (c = 0; c < rgb_channel_count; c++) {
1522  *ptr_x++ = bytestream_get_le32(&rgb[c]) >> 16;
1523  }
1524 
1525  if (channel_buffer[3])
1526  *ptr_x++ = bytestream_get_le32(&a) >> 16;
1527  }
1528 
1529  // Zero out the end if xmax+1 is not w
1530  memset(ptr_x, 0, axmax);
1531 
1532  channel_buffer[0] += td->channel_line_size;
1533  channel_buffer[1] += td->channel_line_size;
1534  channel_buffer[2] += td->channel_line_size;
1535  if (channel_buffer[3])
1536  channel_buffer[3] += td->channel_line_size;
1537  }
1538  }
1539 
1540  return 0;
1541 }
1542 
1544 {
1545  GetByteContext *gb = &s->gb;
1546 
1547  while (bytestream2_get_bytes_left(gb) > 0) {
1548  if (!bytestream2_peek_byte(gb))
1549  break;
1550 
1551  // Process unknown variables
1552  for (int i = 0; i < 2; i++) // value_name and value_type
1553  while (bytestream2_get_byte(gb) != 0);
1554 
1555  // Skip variable length
1556  bytestream2_skip(gb, bytestream2_get_le32(gb));
1557  }
1558 }
1559 
1560 /**
1561  * Check if the variable name corresponds to its data type.
1562  *
1563  * @param s the EXRContext
1564  * @param value_name name of the variable to check
1565  * @param value_type type of the variable to check
1566  * @param minimum_length minimum length of the variable data
1567  *
1568  * @return bytes to read containing variable data
1569  * -1 if variable is not found
1570  * 0 if buffer ended prematurely
1571  */
1573  const char *value_name,
1574  const char *value_type,
1575  unsigned int minimum_length)
1576 {
1577  GetByteContext *gb = &s->gb;
1578  int var_size = -1;
1579 
1580  if (bytestream2_get_bytes_left(gb) >= minimum_length &&
1581  !strcmp(gb->buffer, value_name)) {
1582  // found value_name, jump to value_type (null terminated strings)
1583  gb->buffer += strlen(value_name) + 1;
1584  if (!strcmp(gb->buffer, value_type)) {
1585  gb->buffer += strlen(value_type) + 1;
1586  var_size = bytestream2_get_le32(gb);
1587  // don't go read past boundaries
1588  if (var_size > bytestream2_get_bytes_left(gb))
1589  var_size = 0;
1590  } else {
1591  // value_type not found, reset the buffer
1592  gb->buffer -= strlen(value_name) + 1;
1593  av_log(s->avctx, AV_LOG_WARNING,
1594  "Unknown data type %s for header variable %s.\n",
1595  value_type, value_name);
1596  }
1597  }
1598 
1599  return var_size;
1600 }
1601 
1603 {
1605  GetByteContext *gb = &s->gb;
1606  int magic_number, version, flags;
1607  int layer_match = 0;
1608  int ret;
1609  int dup_channels = 0;
1610 
1611  s->current_channel_offset = 0;
1612  s->xmin = ~0;
1613  s->xmax = ~0;
1614  s->ymin = ~0;
1615  s->ymax = ~0;
1616  s->xdelta = ~0;
1617  s->ydelta = ~0;
1618  s->channel_offsets[0] = -1;
1619  s->channel_offsets[1] = -1;
1620  s->channel_offsets[2] = -1;
1621  s->channel_offsets[3] = -1;
1622  s->pixel_type = EXR_UNKNOWN;
1623  s->compression = EXR_UNKN;
1624  s->nb_channels = 0;
1625  s->w = 0;
1626  s->h = 0;
1627  s->tile_attr.xSize = -1;
1628  s->tile_attr.ySize = -1;
1629  s->is_tile = 0;
1630  s->is_multipart = 0;
1631  s->is_luma = 0;
1632  s->has_channel = 0;
1633  s->current_part = 0;
1634 
1635  if (bytestream2_get_bytes_left(gb) < 10) {
1636  av_log(s->avctx, AV_LOG_ERROR, "Header too short to parse.\n");
1637  return AVERROR_INVALIDDATA;
1638  }
1639 
1640  magic_number = bytestream2_get_le32(gb);
1641  if (magic_number != 20000630) {
1642  /* As per documentation of OpenEXR, it is supposed to be
1643  * int 20000630 little-endian */
1644  av_log(s->avctx, AV_LOG_ERROR, "Wrong magic number %d.\n", magic_number);
1645  return AVERROR_INVALIDDATA;
1646  }
1647 
1648  version = bytestream2_get_byte(gb);
1649  if (version != 2) {
1650  avpriv_report_missing_feature(s->avctx, "Version %d", version);
1651  return AVERROR_PATCHWELCOME;
1652  }
1653 
1654  flags = bytestream2_get_le24(gb);
1655 
1656  if (flags & 0x02)
1657  s->is_tile = 1;
1658  if (flags & 0x10)
1659  s->is_multipart = 1;
1660  if (flags & 0x08) {
1661  avpriv_report_missing_feature(s->avctx, "deep data");
1662  return AVERROR_PATCHWELCOME;
1663  }
1664 
1665  // Parse the header
1666  while (bytestream2_get_bytes_left(gb) > 0) {
1667  int var_size;
1668 
1669  while (s->is_multipart && s->current_part < s->selected_part &&
1670  bytestream2_get_bytes_left(gb) > 0) {
1671  if (bytestream2_peek_byte(gb)) {
1673  } else {
1674  bytestream2_skip(gb, 1);
1675  if (!bytestream2_peek_byte(gb))
1676  break;
1677  }
1678  bytestream2_skip(gb, 1);
1679  s->current_part++;
1680  }
1681 
1682  if (!bytestream2_peek_byte(gb)) {
1683  if (!s->is_multipart)
1684  break;
1685  bytestream2_skip(gb, 1);
1686  if (s->current_part == s->selected_part) {
1687  while (bytestream2_get_bytes_left(gb) > 0) {
1688  if (bytestream2_peek_byte(gb)) {
1690  } else {
1691  bytestream2_skip(gb, 1);
1692  if (!bytestream2_peek_byte(gb))
1693  break;
1694  }
1695  }
1696  }
1697  if (!bytestream2_peek_byte(gb))
1698  break;
1699  s->current_part++;
1700  }
1701 
1702  if ((var_size = check_header_variable(s, "channels",
1703  "chlist", 38)) >= 0) {
1704  GetByteContext ch_gb;
1705  if (!var_size) {
1707  goto fail;
1708  }
1709 
1710  bytestream2_init(&ch_gb, gb->buffer, var_size);
1711 
1712  while (bytestream2_get_bytes_left(&ch_gb) >= 19) {
1714  enum ExrPixelType current_pixel_type;
1715  int channel_index = -1;
1716  int xsub, ysub;
1717 
1718  if (strcmp(s->layer, "") != 0) {
1719  if (strncmp(ch_gb.buffer, s->layer, strlen(s->layer)) == 0) {
1720  layer_match = 1;
1721  av_log(s->avctx, AV_LOG_INFO,
1722  "Channel match layer : %s.\n", ch_gb.buffer);
1723  ch_gb.buffer += strlen(s->layer);
1724  if (*ch_gb.buffer == '.')
1725  ch_gb.buffer++; /* skip dot if not given */
1726  } else {
1727  layer_match = 0;
1728  av_log(s->avctx, AV_LOG_INFO,
1729  "Channel doesn't match layer : %s.\n", ch_gb.buffer);
1730  }
1731  } else {
1732  layer_match = 1;
1733  }
1734 
1735  if (layer_match) { /* only search channel if the layer match is valid */
1736  if (strlen(ch_gb.buffer) == 1) {
1737  int ch_chr = av_toupper(*ch_gb.buffer);
1738  if (ch_chr >= 'A' && ch_chr <= 'Z')
1739  s->has_channel |= M(ch_chr);
1740  av_log(s->avctx, AV_LOG_DEBUG, "%c\n", ch_chr);
1741  }
1742 
1743  if (!av_strcasecmp(ch_gb.buffer, "R") ||
1744  !av_strcasecmp(ch_gb.buffer, "X") ||
1745  !av_strcasecmp(ch_gb.buffer, "U")) {
1746  channel_index = 0;
1747  } else if (!av_strcasecmp(ch_gb.buffer, "G") ||
1748  !av_strcasecmp(ch_gb.buffer, "V")) {
1749  channel_index = 1;
1750  } else if (!av_strcasecmp(ch_gb.buffer, "Y")) {
1751  channel_index = 1;
1752  } else if (!av_strcasecmp(ch_gb.buffer, "B") ||
1753  !av_strcasecmp(ch_gb.buffer, "Z") ||
1754  !av_strcasecmp(ch_gb.buffer, "W")) {
1755  channel_index = 2;
1756  } else if (!av_strcasecmp(ch_gb.buffer, "A")) {
1757  channel_index = 3;
1758  } else {
1759  av_log(s->avctx, AV_LOG_WARNING,
1760  "Unsupported channel %.256s.\n", ch_gb.buffer);
1761  }
1762  }
1763 
1764  /* skip until you get a 0 */
1765  while (bytestream2_get_bytes_left(&ch_gb) > 0 &&
1766  bytestream2_get_byte(&ch_gb))
1767  continue;
1768 
1769  if (bytestream2_get_bytes_left(&ch_gb) < 4) {
1770  av_log(s->avctx, AV_LOG_ERROR, "Incomplete header.\n");
1772  goto fail;
1773  }
1774 
1775  current_pixel_type = bytestream2_get_le32(&ch_gb);
1776  if (current_pixel_type >= EXR_UNKNOWN) {
1777  avpriv_report_missing_feature(s->avctx, "Pixel type %d",
1778  current_pixel_type);
1780  goto fail;
1781  }
1782 
1783  bytestream2_skip(&ch_gb, 4);
1784  xsub = bytestream2_get_le32(&ch_gb);
1785  ysub = bytestream2_get_le32(&ch_gb);
1786 
1787  if (xsub != 1 || ysub != 1) {
1789  "Subsampling %dx%d",
1790  xsub, ysub);
1792  goto fail;
1793  }
1794 
1795  if (channel_index >= 0 && s->channel_offsets[channel_index] == -1) { /* channel has not been previously assigned */
1796  if (s->pixel_type != EXR_UNKNOWN &&
1797  s->pixel_type != current_pixel_type) {
1798  av_log(s->avctx, AV_LOG_ERROR,
1799  "RGB channels not of the same depth.\n");
1801  goto fail;
1802  }
1803  s->pixel_type = current_pixel_type;
1804  s->channel_offsets[channel_index] = s->current_channel_offset;
1805  } else if (channel_index >= 0) {
1806  av_log(s->avctx, AV_LOG_WARNING,
1807  "Multiple channels with index %d.\n", channel_index);
1808  if (++dup_channels > 10) {
1810  goto fail;
1811  }
1812  }
1813 
1814  av_assert0(s->nb_channels < INT_MAX); // Impossible due to size of the bitstream
1815  EXRChannel *new_channels = av_realloc_array(s->channels,
1816  s->nb_channels + 1,
1817  sizeof(EXRChannel));
1818  if (!new_channels) {
1819  ret = AVERROR(ENOMEM);
1820  goto fail;
1821  }
1822  s->nb_channels ++;
1823  s->channels = new_channels;
1824 
1825  channel = &s->channels[s->nb_channels - 1];
1826  channel->pixel_type = current_pixel_type;
1827  channel->xsub = xsub;
1828  channel->ysub = ysub;
1829 
1830  if (current_pixel_type == EXR_HALF) {
1831  s->current_channel_offset += 2;
1832  } else {/* Float or UINT32 */
1833  s->current_channel_offset += 4;
1834  }
1835  }
1836  if (!((M('R') + M('G') + M('B')) & ~s->has_channel)) {
1837  s->is_luma = 0;
1838  } else if (!((M('X') + M('Y') + M('Z')) & ~s->has_channel)) {
1839  s->is_luma = 0;
1840  } else if (!((M('Y') + M('U') + M('V')) & ~s->has_channel)) {
1841  s->is_luma = 0;
1842  } else if (!((M('Y') ) & ~s->has_channel) &&
1843  !((M('R') + M('G') + M('B') + M('U') + M('V') + M('X') + M('Z')) & s->has_channel)) {
1844  s->is_luma = 1;
1845  } else {
1846  avpriv_request_sample(s->avctx, "Uncommon channel combination");
1848  goto fail;
1849  }
1850 
1851  /* Check if all channels are set with an offset or if the channels
1852  * are causing an overflow */
1853  if (!s->is_luma) {/* if we expected to have at least 3 channels */
1854  if (FFMIN3(s->channel_offsets[0],
1855  s->channel_offsets[1],
1856  s->channel_offsets[2]) < 0) {
1857  if (s->channel_offsets[0] < 0)
1858  av_log(s->avctx, AV_LOG_ERROR, "Missing red channel.\n");
1859  if (s->channel_offsets[1] < 0)
1860  av_log(s->avctx, AV_LOG_ERROR, "Missing green channel.\n");
1861  if (s->channel_offsets[2] < 0)
1862  av_log(s->avctx, AV_LOG_ERROR, "Missing blue channel.\n");
1864  goto fail;
1865  }
1866  }
1867 
1868  // skip one last byte and update main gb
1869  gb->buffer = ch_gb.buffer + 1;
1870  continue;
1871  } else if ((var_size = check_header_variable(s, "dataWindow", "box2i",
1872  31)) >= 0) {
1873  int xmin, ymin, xmax, ymax;
1874  if (!var_size) {
1876  goto fail;
1877  }
1878 
1879  xmin = bytestream2_get_le32(gb);
1880  ymin = bytestream2_get_le32(gb);
1881  xmax = bytestream2_get_le32(gb);
1882  ymax = bytestream2_get_le32(gb);
1883 
1884  if (xmin > xmax || ymin > ymax ||
1885  ymax == INT_MAX || xmax == INT_MAX ||
1886  (unsigned)xmax - xmin >= INT_MAX ||
1887  (unsigned)ymax - ymin >= INT_MAX) {
1889  goto fail;
1890  }
1891  s->xmin = xmin;
1892  s->xmax = xmax;
1893  s->ymin = ymin;
1894  s->ymax = ymax;
1895  s->xdelta = (s->xmax - s->xmin) + 1;
1896  s->ydelta = (s->ymax - s->ymin) + 1;
1897 
1898  continue;
1899  } else if ((var_size = check_header_variable(s, "displayWindow",
1900  "box2i", 34)) >= 0) {
1901  int32_t sx, sy, dx, dy;
1902 
1903  if (!var_size) {
1905  goto fail;
1906  }
1907 
1908  sx = bytestream2_get_le32(gb);
1909  sy = bytestream2_get_le32(gb);
1910  dx = bytestream2_get_le32(gb);
1911  dy = bytestream2_get_le32(gb);
1912 
1913  s->w = (unsigned)dx - sx + 1;
1914  s->h = (unsigned)dy - sy + 1;
1915 
1916  continue;
1917  } else if ((var_size = check_header_variable(s, "lineOrder",
1918  "lineOrder", 25)) >= 0) {
1919  int line_order;
1920  if (!var_size) {
1922  goto fail;
1923  }
1924 
1925  line_order = bytestream2_get_byte(gb);
1926  av_log(s->avctx, AV_LOG_DEBUG, "line order: %d.\n", line_order);
1927  if (line_order > 2) {
1928  av_log(s->avctx, AV_LOG_ERROR, "Unknown line order.\n");
1930  goto fail;
1931  }
1932 
1933  continue;
1934  } else if ((var_size = check_header_variable(s, "pixelAspectRatio",
1935  "float", 31)) >= 0) {
1936  if (!var_size) {
1938  goto fail;
1939  }
1940 
1941  s->sar = bytestream2_get_le32(gb);
1942 
1943  continue;
1944  } else if ((var_size = check_header_variable(s, "compression",
1945  "compression", 29)) >= 0) {
1946  if (!var_size) {
1948  goto fail;
1949  }
1950 
1951  if (s->compression == EXR_UNKN)
1952  s->compression = bytestream2_get_byte(gb);
1953  else {
1954  bytestream2_skip(gb, 1);
1955  av_log(s->avctx, AV_LOG_WARNING,
1956  "Found more than one compression attribute.\n");
1957  }
1958 
1959  continue;
1960  } else if ((var_size = check_header_variable(s, "tiles",
1961  "tiledesc", 22)) >= 0) {
1962  uint8_t tileLevel;
1963 
1964  if (!s->is_tile)
1965  av_log(s->avctx, AV_LOG_WARNING,
1966  "Found tile attribute and scanline flags. Exr will be interpreted as scanline.\n");
1967 
1968  s->tile_attr.xSize = bytestream2_get_le32(gb);
1969  s->tile_attr.ySize = bytestream2_get_le32(gb);
1970 
1971  tileLevel = bytestream2_get_byte(gb);
1972  s->tile_attr.level_mode = tileLevel & 0x0f;
1973  s->tile_attr.level_round = (tileLevel >> 4) & 0x0f;
1974 
1975  if (s->tile_attr.level_mode >= EXR_TILE_LEVEL_UNKNOWN) {
1976  avpriv_report_missing_feature(s->avctx, "Tile level mode %d",
1977  s->tile_attr.level_mode);
1979  goto fail;
1980  }
1981 
1982  if (s->tile_attr.level_round >= EXR_TILE_ROUND_UNKNOWN) {
1983  avpriv_report_missing_feature(s->avctx, "Tile level round %d",
1984  s->tile_attr.level_round);
1986  goto fail;
1987  }
1988 
1989  continue;
1990  } else if ((var_size = check_header_variable(s, "writer",
1991  "string", 1)) >= 0) {
1992  uint8_t key[256] = { 0 };
1993 
1994  bytestream2_get_buffer(gb, key, FFMIN(sizeof(key) - 1, var_size));
1995  av_dict_set(&metadata, "writer", key, 0);
1996 
1997  continue;
1998  } else if ((var_size = check_header_variable(s, "framesPerSecond",
1999  "rational", 33)) >= 0) {
2000  if (!var_size) {
2002  goto fail;
2003  }
2004 
2005  s->avctx->framerate.num = bytestream2_get_le32(gb);
2006  s->avctx->framerate.den = bytestream2_get_le32(gb);
2007 
2008  continue;
2009  } else if ((var_size = check_header_variable(s, "chunkCount",
2010  "int", 23)) >= 0) {
2011 
2012  s->chunk_count = bytestream2_get_le32(gb);
2013 
2014  continue;
2015  } else if ((var_size = check_header_variable(s, "type",
2016  "string", 16)) >= 0) {
2017  uint8_t key[256] = { 0 };
2018 
2019  bytestream2_get_buffer(gb, key, FFMIN(sizeof(key) - 1, var_size));
2020  if (strncmp("scanlineimage", key, var_size) &&
2021  strncmp("tiledimage", key, var_size)) {
2023  goto fail;
2024  }
2025 
2026  continue;
2027  } else if ((var_size = check_header_variable(s, "preview",
2028  "preview", 16)) >= 0) {
2029  uint32_t pw = bytestream2_get_le32(gb);
2030  uint32_t ph = bytestream2_get_le32(gb);
2031  uint64_t psize = pw * (uint64_t)ph;
2032  if (psize > INT64_MAX / 4) {
2034  goto fail;
2035  }
2036  psize *= 4;
2037 
2038  if ((int64_t)psize >= bytestream2_get_bytes_left(gb)) {
2040  goto fail;
2041  }
2042 
2043  bytestream2_skip(gb, psize);
2044 
2045  continue;
2046  }
2047 
2048  // Check if there are enough bytes for a header
2049  if (bytestream2_get_bytes_left(gb) <= 9) {
2050  av_log(s->avctx, AV_LOG_ERROR, "Incomplete header\n");
2052  goto fail;
2053  }
2054 
2055  // Process unknown variables
2056  {
2057  uint8_t name[256] = { 0 };
2058  uint8_t type[256] = { 0 };
2059  uint8_t value[8192] = { 0 };
2060  int i = 0, size;
2061 
2062  while (bytestream2_get_bytes_left(gb) > 0 &&
2063  bytestream2_peek_byte(gb) && i < 255) {
2064  name[i++] = bytestream2_get_byte(gb);
2065  }
2066 
2067  bytestream2_skip(gb, 1);
2068  i = 0;
2069  while (bytestream2_get_bytes_left(gb) > 0 &&
2070  bytestream2_peek_byte(gb) && i < 255) {
2071  type[i++] = bytestream2_get_byte(gb);
2072  }
2073  bytestream2_skip(gb, 1);
2074  size = bytestream2_get_le32(gb);
2075 
2076  bytestream2_get_buffer(gb, value, FFMIN(sizeof(value) - 1, size));
2077  if (size > sizeof(value) - 1)
2078  bytestream2_skip(gb, size - (sizeof(value) - 1));
2079  if (!strcmp(type, "string"))
2080  av_dict_set(&metadata, name, value, 0);
2081  }
2082  }
2083 
2084  if (s->compression == EXR_UNKN) {
2085  av_log(s->avctx, AV_LOG_ERROR, "Missing compression attribute.\n");
2087  goto fail;
2088  }
2089 
2090  if (s->is_tile) {
2091  if (s->tile_attr.xSize < 1 || s->tile_attr.ySize < 1) {
2092  av_log(s->avctx, AV_LOG_ERROR, "Invalid tile attribute.\n");
2094  goto fail;
2095  }
2096  }
2097 
2098  if (bytestream2_get_bytes_left(gb) <= 0) {
2099  av_log(s->avctx, AV_LOG_ERROR, "Incomplete frame.\n");
2101  goto fail;
2102  }
2103 
2104  frame->metadata = metadata;
2105 
2106  // aaand we are done
2107  bytestream2_skip(gb, 1);
2108  return 0;
2109 fail:
2111  return ret;
2112 }
2113 
2114 static int decode_frame(AVCodecContext *avctx, AVFrame *picture,
2115  int *got_frame, AVPacket *avpkt)
2116 {
2117  EXRContext *s = avctx->priv_data;
2118  GetByteContext *gb = &s->gb;
2119  uint8_t *ptr;
2120 
2121  int i, y, ret, ymax;
2122  int planes;
2123  int out_line_size;
2124  int nb_blocks; /* nb scanline or nb tile */
2125  uint64_t start_offset_table;
2126  uint64_t start_next_scanline;
2127 
2128  bytestream2_init(gb, avpkt->data, avpkt->size);
2129 
2130  if ((ret = decode_header(s, picture)) < 0)
2131  return ret;
2132 
2133  if (s->compression == EXR_DWAA ||
2134  s->compression == EXR_DWAB) {
2135  for (int i = 0; i<s->nb_channels; i++) {
2136  EXRChannel *channel = &s->channels[i];
2137  if (channel->pixel_type != s->pixel_type) {
2138  avpriv_request_sample(s->avctx, "mixed pixel type DWA");
2139  return AVERROR_PATCHWELCOME;
2140  }
2141  }
2142  }
2143 
2144  switch (s->pixel_type) {
2145  case EXR_HALF:
2146  if (s->channel_offsets[3] >= 0) {
2147  if (!s->is_luma) {
2148  avctx->pix_fmt = AV_PIX_FMT_GBRAPF16;
2149  } else {
2150  avctx->pix_fmt = AV_PIX_FMT_YAF16;
2151  }
2152  } else {
2153  if (!s->is_luma) {
2154  avctx->pix_fmt = AV_PIX_FMT_GBRPF16;
2155  } else {
2156  avctx->pix_fmt = AV_PIX_FMT_GRAYF16;
2157  }
2158  }
2159  break;
2160  case EXR_FLOAT:
2161  if (s->channel_offsets[3] >= 0) {
2162  if (!s->is_luma) {
2163  avctx->pix_fmt = AV_PIX_FMT_GBRAPF32;
2164  } else {
2165  avctx->pix_fmt = AV_PIX_FMT_YAF32;
2166  }
2167  } else {
2168  if (!s->is_luma) {
2169  avctx->pix_fmt = AV_PIX_FMT_GBRPF32;
2170  } else {
2171  avctx->pix_fmt = AV_PIX_FMT_GRAYF32;
2172  }
2173  }
2174  break;
2175  case EXR_UINT:
2176  if (s->channel_offsets[3] >= 0) {
2177  if (!s->is_luma) {
2178  avctx->pix_fmt = AV_PIX_FMT_RGBA64;
2179  } else {
2180  avctx->pix_fmt = AV_PIX_FMT_YA16;
2181  }
2182  } else {
2183  if (!s->is_luma) {
2184  avctx->pix_fmt = AV_PIX_FMT_RGB48;
2185  } else {
2186  avctx->pix_fmt = AV_PIX_FMT_GRAY16;
2187  }
2188  }
2189  break;
2190  default:
2191  av_log(avctx, AV_LOG_ERROR, "Missing channel list.\n");
2192  return AVERROR_INVALIDDATA;
2193  }
2194 
2195  if (s->channel_offsets[3] >= 0)
2197 
2198 #if FF_API_EXR_GAMMA
2199  if (s->apply_trc_type != AVCOL_TRC_UNSPECIFIED)
2200  avctx->color_trc = s->apply_trc_type;
2201  else if (s->gamma > 0.9999f && s->gamma < 1.0001f)
2202 #endif
2203  avctx->color_trc = AVCOL_TRC_LINEAR;
2204 
2205  switch (s->compression) {
2206  case EXR_RAW:
2207  case EXR_RLE:
2208  case EXR_ZIP1:
2209  s->scan_lines_per_block = 1;
2210  break;
2211  case EXR_PXR24:
2212  case EXR_ZIP16:
2213  s->scan_lines_per_block = 16;
2214  break;
2215  case EXR_PIZ:
2216  case EXR_B44:
2217  case EXR_B44A:
2218  case EXR_DWAA:
2219  s->scan_lines_per_block = 32;
2220  break;
2221  case EXR_DWAB:
2222  s->scan_lines_per_block = 256;
2223  break;
2224  default:
2225  avpriv_report_missing_feature(avctx, "Compression %d", s->compression);
2226  return AVERROR_PATCHWELCOME;
2227  }
2228 
2229  /* Verify the xmin, xmax, ymin and ymax before setting the actual image size.
2230  * It's possible for the data window can larger or outside the display window */
2231  if (s->xmin > s->xmax || s->ymin > s->ymax ||
2232  s->ydelta == 0xFFFFFFFF || s->xdelta == 0xFFFFFFFF) {
2233  av_log(avctx, AV_LOG_ERROR, "Wrong or missing size information.\n");
2234  return AVERROR_INVALIDDATA;
2235  }
2236 
2237  if ((ret = ff_set_dimensions(avctx, s->w, s->h)) < 0)
2238  return ret;
2239 
2240  ff_set_sar(s->avctx, av_d2q(av_int2float(s->sar), 255));
2241 
2242  if (avctx->skip_frame >= AVDISCARD_ALL)
2243  return avpkt->size;
2244 
2245  s->desc = av_pix_fmt_desc_get(avctx->pix_fmt);
2246  if (!s->desc)
2247  return AVERROR_INVALIDDATA;
2248 
2250  out_line_size = avctx->width * s->desc->comp[0].step;
2251 
2252  if (s->is_tile) {
2253  if (s->tile_attr.ySize <= 0 || s->tile_attr.xSize <= 0)
2254  return AVERROR_INVALIDDATA;
2255  nb_blocks = ((s->xdelta + s->tile_attr.xSize - 1) / s->tile_attr.xSize) *
2256  ((s->ydelta + s->tile_attr.ySize - 1) / s->tile_attr.ySize);
2257  } else { /* scanline */
2258  nb_blocks = (s->ydelta + s->scan_lines_per_block - 1) /
2259  s->scan_lines_per_block;
2260  }
2261 
2262  if ((ret = ff_thread_get_buffer(avctx, picture, 0)) < 0)
2263  return ret;
2264 
2265  if (bytestream2_get_bytes_left(gb)/8 < nb_blocks)
2266  return AVERROR_INVALIDDATA;
2267 
2268  // check offset table and recreate it if need
2269  if (!s->is_tile && bytestream2_peek_le64(gb) == 0) {
2270  PutByteContext offset_table_writer;
2271 
2272  av_log(s->avctx, AV_LOG_DEBUG, "recreating invalid scanline offset table\n");
2273 
2274  s->offset_table = av_realloc_f(s->offset_table, nb_blocks, 8);
2275  if (!s->offset_table)
2276  return AVERROR(ENOMEM);
2277 
2278  start_offset_table = bytestream2_tell(gb);
2279  start_next_scanline = start_offset_table + nb_blocks * 8;
2280  bytestream2_init_writer(&offset_table_writer, s->offset_table, nb_blocks * 8);
2281 
2282  for (y = 0; y < nb_blocks; y++) {
2283  /* write offset of prev scanline in offset table */
2284  bytestream2_put_le64(&offset_table_writer, start_next_scanline);
2285 
2286  /* get len of next scanline */
2287  bytestream2_seek(gb, start_next_scanline + 4, SEEK_SET);/* skip line number */
2288  start_next_scanline += (bytestream2_get_le32(gb) + 8);
2289  }
2290  bytestream2_init(gb, s->offset_table, nb_blocks * 8);
2291  }
2292 
2293  // save pointer we are going to use in decode_block
2294  s->buf = avpkt->data;
2295  s->buf_size = avpkt->size;
2296 
2297  // Zero out the start if ymin is not 0
2298  for (i = 0; i < planes; i++) {
2299  ptr = picture->data[i];
2300  for (y = 0; y < FFMIN(s->ymin, s->h); y++) {
2301  memset(ptr, 0, out_line_size);
2302  ptr += picture->linesize[i];
2303  }
2304  }
2305 
2306  s->picture = picture;
2307 
2308  avctx->execute2(avctx, decode_block, s->thread_data, NULL, nb_blocks);
2309 
2310  ymax = FFMAX(0, s->ymax + 1);
2311  // Zero out the end if ymax+1 is not h
2312  if (ymax < avctx->height)
2313  for (i = 0; i < planes; i++) {
2314  ptr = picture->data[i] + (ymax * picture->linesize[i]);
2315  for (y = ymax; y < avctx->height; y++) {
2316  memset(ptr, 0, out_line_size);
2317  ptr += picture->linesize[i];
2318  }
2319  }
2320 
2321  picture->pict_type = AV_PICTURE_TYPE_I;
2322  *got_frame = 1;
2323 
2324  return avpkt->size;
2325 }
2326 
2328 {
2329  EXRContext *s = avctx->priv_data;
2330 #if FF_API_EXR_GAMMA
2331  uint32_t i;
2332  union av_intfloat32 t;
2333  float one_gamma = 1.0f / s->gamma;
2334  av_csp_trc_function trc_func = NULL;
2335 #endif
2336 
2337  ff_init_float2half_tables(&s->f2h_tables);
2338  ff_init_half2float_tables(&s->h2f_tables);
2339 
2340  s->avctx = avctx;
2341 
2342  ff_exrdsp_init(&s->dsp);
2343 
2344 #if HAVE_BIGENDIAN
2345  ff_bswapdsp_init(&s->bbdsp);
2346 #endif
2347 
2348 #if FF_API_EXR_GAMMA
2349  trc_func = av_csp_trc_func_from_id(s->apply_trc_type);
2350  if (trc_func) {
2351  for (i = 0; i < 65536; ++i) {
2352  t.i = half2float(i, &s->h2f_tables);
2353  t.f = trc_func(t.f);
2354  s->gamma_table[i] = float2half(av_float2int(t.f), &s->f2h_tables);
2355  }
2356  } else if (one_gamma != 1.0f) {
2357  for (i = 0; i < 65536; ++i) {
2358  t.i = half2float(i, &s->h2f_tables);
2359  /* If negative value we reuse half value */
2360  if (t.f <= 0.0f) {
2361  s->gamma_table[i] = i;
2362  } else {
2363  t.f = powf(t.f, one_gamma);
2364  s->gamma_table[i] = float2half(t.i, &s->f2h_tables);
2365  }
2366  }
2367  }
2368 #endif
2369 
2370  // allocate thread data, used for non EXR_RAW compression types
2371  s->thread_data = av_calloc(avctx->thread_count, sizeof(*s->thread_data));
2372  if (!s->thread_data)
2373  return AVERROR(ENOMEM);
2374 
2375  return 0;
2376 }
2377 
2379 {
2380  EXRContext *s = avctx->priv_data;
2381  int i;
2382  for (i = 0; i < avctx->thread_count; i++) {
2383  EXRThreadData *td = &s->thread_data[i];
2385  av_freep(&td->tmp);
2386  av_freep(&td->bitmap);
2387  av_freep(&td->lut);
2388  av_freep(&td->he);
2389  av_freep(&td->freq);
2390  av_freep(&td->ac_data);
2391  av_freep(&td->dc_data);
2392  av_freep(&td->rle_data);
2393  av_freep(&td->rle_raw_data);
2394  ff_vlc_free(&td->vlc);
2395  }
2396 
2397  av_freep(&s->thread_data);
2398  av_freep(&s->channels);
2399  av_freep(&s->offset_table);
2400 
2401  return 0;
2402 }
2403 
2404 #define OFFSET(x) offsetof(EXRContext, x)
2405 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
2406 static const AVOption options[] = {
2407  { "layer", "Set the decoding layer", OFFSET(layer),
2408  AV_OPT_TYPE_STRING, { .str = "" }, 0, 0, VD },
2409  { "part", "Set the decoding part", OFFSET(selected_part),
2410  AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VD },
2411 #if FF_API_EXR_GAMMA
2412  { "gamma", "Set the float gamma value when decoding (deprecated, use a scaler)", OFFSET(gamma),
2413  AV_OPT_TYPE_FLOAT, { .dbl = 1.0f }, 0.001, FLT_MAX, VD | AV_OPT_FLAG_DEPRECATED },
2414 
2415  // XXX: Note the abuse of the enum using AVCOL_TRC_UNSPECIFIED to subsume the existing gamma option
2416  { "apply_trc", "color transfer characteristics to apply to EXR linear input (deprecated, use a scaler)", OFFSET(apply_trc_type),
2417  AV_OPT_TYPE_INT, {.i64 = AVCOL_TRC_UNSPECIFIED }, 1, AVCOL_TRC_NB-1, VD | AV_OPT_FLAG_DEPRECATED, .unit = "apply_trc_type"},
2418  { "bt709", "BT.709", 0,
2419  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT709 }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2420  { "gamma", "gamma", 0,
2421  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_UNSPECIFIED }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2422  { "gamma22", "BT.470 M", 0,
2423  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_GAMMA22 }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2424  { "gamma28", "BT.470 BG", 0,
2425  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_GAMMA28 }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2426  { "smpte170m", "SMPTE 170 M", 0,
2427  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE170M }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2428  { "smpte240m", "SMPTE 240 M", 0,
2429  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE240M }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2430  { "linear", "Linear", 0,
2431  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LINEAR }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2432  { "log", "Log", 0,
2433  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LOG }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2434  { "log_sqrt", "Log square root", 0,
2435  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LOG_SQRT }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2436  { "iec61966_2_4", "IEC 61966-2-4", 0,
2437  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_IEC61966_2_4 }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2438  { "bt1361", "BT.1361", 0,
2439  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT1361_ECG }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2440  { "iec61966_2_1", "IEC 61966-2-1", 0,
2441  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_IEC61966_2_1 }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2442  { "bt2020_10bit", "BT.2020 - 10 bit", 0,
2443  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT2020_10 }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2444  { "bt2020_12bit", "BT.2020 - 12 bit", 0,
2445  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT2020_12 }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2446  { "smpte2084", "SMPTE ST 2084", 0,
2447  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTEST2084 }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2448  { "smpte428_1", "SMPTE ST 428-1", 0,
2449  AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTEST428_1 }, INT_MIN, INT_MAX, VD, .unit = "apply_trc_type"},
2450 #endif
2451 
2452  { NULL },
2453 };
2454 
2455 static const AVClass exr_class = {
2456  .class_name = "EXR",
2457  .item_name = av_default_item_name,
2458  .option = options,
2459  .version = LIBAVUTIL_VERSION_INT,
2460 };
2461 
2463  .p.name = "exr",
2464  CODEC_LONG_NAME("OpenEXR image"),
2465  .p.type = AVMEDIA_TYPE_VIDEO,
2466  .p.id = AV_CODEC_ID_EXR,
2467  .priv_data_size = sizeof(EXRContext),
2468  .init = decode_init,
2469  .close = decode_end,
2471  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS |
2473  .caps_internal = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM,
2474  .p.priv_class = &exr_class,
2475 };
flags
const SwsFlags flags[]
Definition: swscale.c:71
bswapdsp.h
EXRTileAttribute::level_round
enum ExrTileLevelRound level_round
Definition: exr.c:111
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
EXRThreadData
Definition: exr.c:114
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
EXR_TILE_ROUND_DOWN
@ EXR_TILE_ROUND_DOWN
Definition: exr.c:92
AVCodecContext::alpha_mode
enum AVAlphaMode alpha_mode
Indicates how the alpha channel of the video is represented.
Definition: avcodec.h:1944
Half2FloatTables
Definition: half2float.h:27
EXRThreadData::uncompressed_size
int uncompressed_size
Definition: exr.c:116
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:688
r
const char * r
Definition: vf_curves.c:127
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
EXRThreadData::rle_raw_size
unsigned rle_raw_size
Definition: exr.c:134
AVALPHA_MODE_PREMULTIPLIED
@ AVALPHA_MODE_PREMULTIPLIED
Alpha channel is multiplied into color values.
Definition: pixfmt.h:812
bytestream2_get_bytes_left
static av_always_inline int bytestream2_get_bytes_left(const GetByteContext *g)
Definition: bytestream.h:158
EXRTileAttribute
Definition: exr.c:107
AVColorTransferCharacteristic
AVColorTransferCharacteristic
Color Transfer Characteristic.
Definition: pixfmt.h:666
out
static FILE * out
Definition: movenc.c:55
EXRThreadData::lut
uint16_t * lut
Definition: exr.c:122
Float2HalfTables
Definition: float2half.h:27
GetByteContext
Definition: bytestream.h:33
EXR_TILE_LEVEL_ONE
@ EXR_TILE_LEVEL_ONE
Definition: exr.c:84
ff_init_float2half_tables
void ff_init_float2half_tables(Float2HalfTables *t)
Definition: float2half.c:21
EXRThreadData::uncompressed_data
uint8_t * uncompressed_data
Definition: exr.c:115
VD
#define VD
Definition: exr.c:2405
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:1602
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:2114
ph
static int FUNC() ph(CodedBitstreamContext *ctx, RWContext *rw, H266RawPH *current)
Definition: cbs_h266_syntax_template.c:3052
bytestream2_seek
static av_always_inline int bytestream2_seek(GetByteContext *g, int offset, int whence)
Definition: bytestream.h:212
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h: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:660
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:2327
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:2406
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:827
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:974
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
EXR_B44A
@ EXR_B44A
Definition: exr.c:70
av_csp_trc_func_from_id
av_csp_trc_function av_csp_trc_func_from_id(enum AVColorTransferCharacteristic trc)
Determine the function needed to apply the given AVColorTransferCharacteristic to linear input.
Definition: csp.c:468
EXR_HALF
@ EXR_HALF
Definition: exr.c:78
px
#define px
Definition: ops_tmpl_float.c:35
close
static av_cold void close(AVCodecParserContext *s)
Definition: apv_parser.c:197
bytestream2_skip
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
Definition: bytestream.h:168
av_pix_fmt_count_planes
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3496
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:337
ub
#define ub(width, name)
Definition: cbs_apv.c:125
rgb
Definition: rpzaenc.c:60
EXR_DWAA
@ EXR_DWAA
Definition: exr.c:71
EXRContext::tile_attr
EXRTileAttribute tile_attr
Definition: exr.c:171
mx
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t mx
Definition: dsp.h:57
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
apply_lut
static void apply_lut(const uint16_t *lut, uint16_t *dst, int dsize)
Definition: exr.c: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:1674
fail
#define fail()
Definition: checkasm.h:220
av_int2float
static av_always_inline float av_int2float(uint32_t i)
Reinterpret a 32-bit integer as a float.
Definition: intfloat.h:40
AVCodecContext::thread_count
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
Definition: avcodec.h:1573
EXR_TILE_LEVEL_RIPMAP
@ EXR_TILE_LEVEL_RIPMAP
Definition: exr.c:86
EXR_TILE_ROUND_UNKNOWN
@ EXR_TILE_ROUND_UNKNOWN
Definition: exr.c:93
FFSIGN
#define FFSIGN(a)
Definition: common.h:75
GetBitContext
Definition: get_bits.h:109
AVCOL_TRC_GAMMA28
@ AVCOL_TRC_GAMMA28
also ITU-R BT470BG
Definition: pixfmt.h:672
EXRContext::current_part
int current_part
Definition: exr.c:174
val
static double val(void *priv, double ch)
Definition: aeval.c:77
AV_PIX_FMT_GRAYF16
#define AV_PIX_FMT_GRAYF16
Definition: pixfmt.h:581
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_GRAY16
Definition: pixfmt.h:522
AV_PIX_FMT_YAF32
#define AV_PIX_FMT_YAF32
Definition: pixfmt.h:585
AVCOL_TRC_LOG_SQRT
@ AVCOL_TRC_LOG_SQRT
"Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)"
Definition: pixfmt.h:677
fabsf
static __device__ float fabsf(float a)
Definition: cuda_runtime.h:181
EXRContext::avctx
AVCodecContext * avctx
Definition: exr.c:151
ff_exr_decoder
const FFCodec ff_exr_decoder
Definition: exr.c:2462
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:982
decode_end
static av_cold int decode_end(AVCodecContext *avctx)
Definition: exr.c:2378
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:1572
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
av_realloc_array
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition: mem.c:217
g
const char * g
Definition: vf_curves.c:128
ff_thread_get_buffer
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
Definition: pthread_frame.c:1044
GetByteContext::buffer
const uint8_t * buffer
Definition: bytestream.h:34
EXRContext::current_channel_offset
int current_channel_offset
Definition: exr.c:187
HuffEntry::sym
uint16_t sym
Definition: exr.c:98
EXRContext::xmax
int32_t xmax
Definition: exr.c:165
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
decode_block
static int decode_block(AVCodecContext *avctx, void *tdata, int jobnr, int threadnr)
Definition: exr.c:1248
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
EXRChannel::pixel_type
enum ExrPixelType pixel_type
Definition: exr.c:104
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
decode.h
get_bits.h
EXRContext::gamma_table
uint16_t gamma_table[65536]
Definition: exr.c:201
AV_WN16A
#define AV_WN16A(p, v)
Definition: intreadwrite.h:530
AVCodecContext::max_pixels
int64_t max_pixels
The number of pixels per image to maximally accept.
Definition: avcodec.h:1794
SHORTEST_LONG_RUN
#define SHORTEST_LONG_RUN
Definition: exr.c:334
blk
#define blk(i)
Definition: sha.c:186
skip_header_chunk
static void skip_header_chunk(EXRContext *s)
Definition: exr.c:1543
key
const char * key
Definition: hwcontext_opencl.c:189
AV_PIX_FMT_GRAYF32
#define AV_PIX_FMT_GRAYF32
Definition: pixfmt.h:582
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:332
tmp
static uint8_t tmp[40]
Definition: aes_ctr.c:52
EXR_ZIP1
@ EXR_ZIP1
Definition: exr.c:65
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:74
if
if(ret)
Definition: filter_design.txt:179
EXRContext::desc
const AVPixFmtDescriptor * desc
Definition: exr.c:161
AV_CODEC_CAP_FRAME_THREADS
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: codec.h:95
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:232
av_realloc_f
#define av_realloc_f(p, o, n)
Definition: tableprint_vlc.h:33
EXRContext::is_luma
int is_luma
Definition: exr.c:176
AV_CODEC_ID_EXR
@ AV_CODEC_ID_EXR
Definition: codec_id.h:234
AV_PIX_FMT_RGBA64
#define AV_PIX_FMT_RGBA64
Definition: pixfmt.h:529
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
ff_bswapdsp_init
av_cold void ff_bswapdsp_init(BswapDSPContext *c)
Definition: bswapdsp.c:37
metadata
Stream codec metadata
Definition: ogg-flac-chained-meta.txt:2
exrdsp.h
NULL
#define NULL
Definition: coverity.c:32
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
run
uint8_t run
Definition: svq3.c:207
bias
static int bias(int x, int c)
Definition: vqcdec.c:115
LONG_ZEROCODE_RUN
#define LONG_ZEROCODE_RUN
Definition: exr.c: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:242
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:278
EXRThreadData::block
float block[3][64]
Definition: exr.c:136
ff_set_sar
int ff_set_sar(AVCodecContext *avctx, AVRational sar)
Check that the provided sample aspect ratio is valid and set it on the codec context.
Definition: utils.c:106
mathops.h
options
Definition: swscale.c:44
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
planes
static const struct @561 planes[]
unpack_14
static void unpack_14(const uint8_t b[14], uint16_t s[16])
Definition: exr.c:776
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:645
AV_PIX_FMT_GBRPF16
#define AV_PIX_FMT_GBRPF16
Definition: pixfmt.h:576
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
EXRContext::f2h_tables
Float2HalfTables f2h_tables
Definition: exr.c:204
EXRThreadData::bitmap
uint8_t * bitmap
Definition: exr.c:121
PutByteContext
Definition: bytestream.h:37
EXRContext::pixel_type
enum ExrPixelType pixel_type
Definition: exr.c:159
EXRTileAttribute::level_mode
enum ExrTileLevelMode level_mode
Definition: exr.c:110
EXRChannel::xsub
int xsub
Definition: exr.c:103
EXRContext::thread_data
EXRThreadData * thread_data
Definition: exr.c:190
EXR_RAW
@ EXR_RAW
Definition: exr.c:63
f
f
Definition: af_crystalizer.c:122
AVFrame::pict_type
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h: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:995
shift
static int shift(int a, int b)
Definition: bonk.c:261
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
AVCOL_TRC_SMPTEST2084
@ AVCOL_TRC_SMPTEST2084
Definition: pixfmt.h:684
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
AVCOL_TRC_LOG
@ AVCOL_TRC_LOG
"Logarithmic transfer characteristic (100:1 range)"
Definition: pixfmt.h:676
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:424
EXRTileAttribute::xSize
int32_t xSize
Definition: exr.c:108
bytestream2_get_ne16
#define bytestream2_get_ne16
Definition: bytestream.h:119
AV_PIX_FMT_GBRPF32
#define AV_PIX_FMT_GBRPF32
Definition: pixfmt.h:578
AV_PIX_FMT_RGB48
#define AV_PIX_FMT_RGB48
Definition: pixfmt.h:525
size
int size
Definition: twinvq_data.h:10344
EXRThreadData::tmp
uint8_t * tmp
Definition: exr.c:118
EXRContext::is_tile
int is_tile
Definition: exr.c:172
EXR_TILE_LEVEL_MIPMAP
@ EXR_TILE_LEVEL_MIPMAP
Definition: exr.c:85
FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM
#define FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM
The decoder extracts and fills its parameters even if the frame is skipped due to the skip_frame sett...
Definition: codec_internal.h: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:898
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:919
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:811
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:963
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:2404
AV_PIX_FMT_YA16
#define AV_PIX_FMT_YA16
Definition: pixfmt.h:524
FFMIN3
#define FFMIN3(a, b, c)
Definition: macros.h:50
EXRContext::offset_table
uint8_t * offset_table
Definition: exr.c:196
HUF_ENCSIZE
#define HUF_ENCSIZE
Definition: exr.c: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:58
EXRThreadData::xsize
int xsize
Definition: exr.c:138
av_fast_padded_malloc
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional AV_INPUT_BUFFER_PADDING_SIZE at the end w...
Definition: utils.c:53
EXR_PXR24
@ EXR_PXR24
Definition: exr.c:68
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
av_toupper
static av_const int av_toupper(int c)
Locale-independent conversion of ASCII characters to uppercase.
Definition: avstring.h:227
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
av_d2q
AVRational av_d2q(double d, int max)
Convert a double precision floating point number to a rational.
Definition: rational.c:106
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
EXR_UINT
@ EXR_UINT
Definition: exr.c:77
huf_unpack_enc_table
static int huf_unpack_enc_table(GetByteContext *gb, int32_t im, int32_t iM, uint64_t *freq)
Definition: exr.c:337
AVCodecContext::height
int height
Definition: avcodec.h:600
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:639
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
EXR_B44
@ EXR_B44
Definition: exr.c:69
avcodec.h
EXRContext::nb_channels
int nb_channels
Definition: exr.c:186
ff_zigzag_direct
const uint8_t ff_zigzag_direct[64]
Definition: mathtables.c:137
AV_PIX_FMT_YAF16
#define AV_PIX_FMT_YAF16
Definition: pixfmt.h:584
ff_vlc_free
void ff_vlc_free(VLC *vlc)
Definition: vlc.c:580
ret
ret
Definition: filter_design.txt:187
huf_decode
static int huf_decode(VLC *vlc, GetByteContext *gb, int nbits, int run_sym, int no, uint16_t *out)
Definition: exr.c: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
av_malloc
void * av_malloc(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:98
ff_init_half2float_tables
void ff_init_half2float_tables(Half2FloatTables *t)
Definition: half2float.c:39
rle_uncompress
static int rle_uncompress(const EXRContext *ctx, const uint8_t *src, int compressed_size, int uncompressed_size, EXRThreadData *td)
Definition: exr.c:267
float2half
static uint16_t float2half(uint32_t f, const Float2HalfTables *t)
Definition: float2half.h:38
EXRThreadData::dc_size
unsigned dc_size
Definition: exr.c:128
HuffEntry::code
uint32_t code
Definition: exr.c:99
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
EXRThreadData::freq
uint64_t * freq
Definition: exr.c:144
EXRContext::is_multipart
int is_multipart
Definition: exr.c:173
AVCodecContext
main external API structure.
Definition: avcodec.h:439
pxr24_uncompress
static int pxr24_uncompress(const EXRContext *s, const uint8_t *src, int compressed_size, int uncompressed_size, EXRThreadData *td)
Definition: exr.c:692
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:82
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:278
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
alpha
static const int16_t alpha[]
Definition: ilbcdata.h:55
AVPacket
This structure stores compressed data.
Definition: packet.h:565
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:466
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:86
zip_uncompress
static int zip_uncompress(const EXRContext *s, const uint8_t *src, int compressed_size, int uncompressed_size, EXRThreadData *td)
Definition: exr.c:208
EXRContext::buf_size
int buf_size
Definition: exr.c:183
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:600
int32_t
int32_t
Definition: audioconvert.c:56
bytestream.h
imgutils.h
bytestream2_init
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:137
ExrTileLevelMode
ExrTileLevelMode
Definition: exr.c:83
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h: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:2455
BswapDSPContext
Definition: bswapdsp.h:24
h
h
Definition: vp9dsp_template.c:2070
avstring.h
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
Definition: opt.h:276
EXRContext::xmin
int32_t xmin
Definition: exr.c:165
EXRContext::xdelta
uint32_t xdelta
Definition: exr.c:167
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
AVCodecContext::execute2
int(* execute2)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count)
The codec may call this to execute several independent things.
Definition: avcodec.h:1622
float2half.h
skip
static void BS_FUNC() skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
Definition: bitstream_template.h:383
src
#define src
Definition: vp8dsp.c:248
line
The official guide to swscale for confused that consecutive non overlapping rectangles of slice_bottom special converter These generally are unscaled converters of common like for each output line the vertical scaler pulls lines from a ring buffer When the ring buffer does not contain the wanted line
Definition: swscale.txt:40
channel
channel
Definition: ebur128.h:39
EXRContext::dsp
ExrDSPContext dsp
Definition: exr.c:152
EXR_UNKN
@ EXR_UNKN
Definition: exr.c:73
EXRContext
Definition: exr.c:148
EXRChannel
Definition: exr.c:102