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