FFmpeg
pngdec.c
Go to the documentation of this file.
1 /*
2  * PNG image format
3  * Copyright (c) 2003 Fabrice Bellard
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 //#define DEBUG
23 
24 #include "config_components.h"
25 
26 #include "libavutil/attributes.h"
27 #include "libavutil/avassert.h"
28 #include "libavutil/bprint.h"
29 #include "libavutil/crc.h"
30 #include "libavutil/csp.h"
31 #include "libavutil/imgutils.h"
32 #include "libavutil/intreadwrite.h"
34 #include "libavutil/mem.h"
35 #include "libavutil/pixfmt.h"
36 #include "libavutil/rational.h"
37 #include "libavutil/stereo3d.h"
38 
39 #include "avcodec.h"
40 #include "bytestream.h"
41 #include "codec_internal.h"
42 #include "decode.h"
43 #include "exif_internal.h"
44 #include "apng.h"
45 #include "png.h"
46 #include "pngdsp.h"
47 #include "progressframe.h"
48 #include "thread.h"
49 #include "zlib_wrapper.h"
50 
51 #include <zlib.h>
52 
54  PNG_IHDR = 1 << 0,
55  PNG_PLTE = 1 << 1,
56 };
57 
59  PNG_IDAT = 1 << 0,
60  PNG_ALLIMAGE = 1 << 1,
61 };
62 
63 typedef struct PNGDecContext {
66 
70 
72 
73  uint8_t iccp_name[82];
74  uint8_t *iccp_data;
75  size_t iccp_data_len;
76 
78 
79  int have_chrm;
80  uint32_t white_point[2];
81  uint32_t display_primaries[3][2];
82  int gamma;
83  int have_srgb;
84  int have_cicp;
88  int have_clli;
89  uint32_t clli_max;
90  uint32_t clli_avg;
91  /* Mastering Display Color Volume */
92  int have_mdcv;
93  uint16_t mdcv_primaries[3][2];
94  uint16_t mdcv_white_point[2];
95  uint32_t mdcv_max_lum;
96  uint32_t mdcv_min_lum;
97 
100  int width, height;
101  int cur_w, cur_h;
109  int channels;
111  int bpp;
112  int has_trns;
115 
116  uint32_t palette[256];
117  uint8_t *crow_buf;
118  uint8_t *last_row;
119  unsigned int last_row_size;
120  uint8_t *tmp_row;
121  unsigned int tmp_row_size;
122  uint8_t *buffer;
124  int pass;
125  int crow_size; /* compressed row size (include filter type) */
126  int row_size; /* decompressed row size */
127  int pass_row_size; /* decompress row size of the current pass */
128  int y;
130 
132 } PNGDecContext;
133 
134 /* Mask to determine which pixels are valid in a pass */
135 static const uint8_t png_pass_mask[NB_PASSES] = {
136  0x01, 0x01, 0x11, 0x11, 0x55, 0x55, 0xff,
137 };
138 
139 /* Mask to determine which y pixels can be written in a pass */
140 static const uint8_t png_pass_dsp_ymask[NB_PASSES] = {
141  0xff, 0xff, 0x0f, 0xff, 0x33, 0xff, 0x55,
142 };
143 
144 /* Mask to determine which pixels to overwrite while displaying */
145 static const uint8_t png_pass_dsp_mask[NB_PASSES] = {
146  0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff
147 };
148 
149 /* NOTE: we try to construct a good looking image at each pass. width
150  * is the original image width. We also do pixel format conversion at
151  * this stage */
152 static void png_put_interlaced_row(uint8_t *dst, int width,
153  int bits_per_pixel, int pass,
154  int color_type, const uint8_t *src)
155 {
156  int x, mask, dsp_mask, j, src_x, b, bpp;
157  uint8_t *d;
158  const uint8_t *s;
159 
160  mask = png_pass_mask[pass];
161  dsp_mask = png_pass_dsp_mask[pass];
162 
163  switch (bits_per_pixel) {
164  case 1:
165  src_x = 0;
166  for (x = 0; x < width; x++) {
167  j = (x & 7);
168  if ((dsp_mask << j) & 0x80) {
169  b = (src[src_x >> 3] >> (7 - (src_x & 7))) & 1;
170  dst[x >> 3] &= 0xFF7F>>j;
171  dst[x >> 3] |= b << (7 - j);
172  }
173  if ((mask << j) & 0x80)
174  src_x++;
175  }
176  break;
177  case 2:
178  src_x = 0;
179  for (x = 0; x < width; x++) {
180  int j2 = 2 * (x & 3);
181  j = (x & 7);
182  if ((dsp_mask << j) & 0x80) {
183  b = (src[src_x >> 2] >> (6 - 2*(src_x & 3))) & 3;
184  dst[x >> 2] &= 0xFF3F>>j2;
185  dst[x >> 2] |= b << (6 - j2);
186  }
187  if ((mask << j) & 0x80)
188  src_x++;
189  }
190  break;
191  case 4:
192  src_x = 0;
193  for (x = 0; x < width; x++) {
194  int j2 = 4*(x&1);
195  j = (x & 7);
196  if ((dsp_mask << j) & 0x80) {
197  b = (src[src_x >> 1] >> (4 - 4*(src_x & 1))) & 15;
198  dst[x >> 1] &= 0xFF0F>>j2;
199  dst[x >> 1] |= b << (4 - j2);
200  }
201  if ((mask << j) & 0x80)
202  src_x++;
203  }
204  break;
205  default:
206  bpp = bits_per_pixel >> 3;
207  d = dst;
208  s = src;
209  for (x = 0; x < width; x++) {
210  j = x & 7;
211  if ((dsp_mask << j) & 0x80) {
212  memcpy(d, s, bpp);
213  }
214  d += bpp;
215  if ((mask << j) & 0x80)
216  s += bpp;
217  }
218  break;
219  }
220 }
221 
222 #define UNROLL1(bpp, op) \
223  { \
224  r = dst[0]; \
225  if (bpp >= 2) \
226  g = dst[1]; \
227  if (bpp >= 3) \
228  b = dst[2]; \
229  if (bpp >= 4) \
230  a = dst[3]; \
231  for (; i <= size - bpp; i += bpp) { \
232  dst[i + 0] = r = op(r, src[i + 0], last[i + 0]); \
233  if (bpp == 1) \
234  continue; \
235  dst[i + 1] = g = op(g, src[i + 1], last[i + 1]); \
236  if (bpp == 2) \
237  continue; \
238  dst[i + 2] = b = op(b, src[i + 2], last[i + 2]); \
239  if (bpp == 3) \
240  continue; \
241  dst[i + 3] = a = op(a, src[i + 3], last[i + 3]); \
242  } \
243  }
244 
245 #define UNROLL_FILTER(op) \
246  if (bpp == 1) { \
247  UNROLL1(1, op) \
248  } else if (bpp == 2) { \
249  UNROLL1(2, op) \
250  } else if (bpp == 3) { \
251  UNROLL1(3, op) \
252  } else if (bpp == 4) { \
253  UNROLL1(4, op) \
254  } \
255  for (; i < size; i++) { \
256  dst[i] = op(dst[i - bpp], src[i], last[i]); \
257  }
258 
259 /* NOTE: 'dst' can be equal to 'last' */
260 void ff_png_filter_row(PNGDSPContext *dsp, uint8_t *dst, int filter_type,
261  const uint8_t *src, const uint8_t *last, int size, int bpp)
262 {
263  int i, p, r, g, b, a;
264 
265  switch (filter_type) {
267  memcpy(dst, src, size);
268  break;
270  for (i = 0; i < bpp; i++)
271  dst[i] = src[i];
272  if (bpp == 4) {
273  p = *(int *)dst;
274  for (; i < size; i += bpp) {
275  unsigned s = *(const int *)(src + i);
276  p = ((s & 0x7f7f7f7f) + (p & 0x7f7f7f7f)) ^ ((s ^ p) & 0x80808080);
277  *(int *)(dst + i) = p;
278  }
279  } else {
280 #define OP_SUB(x, s, l) ((x) + (s))
282  }
283  break;
284  case PNG_FILTER_VALUE_UP:
285  dsp->add_bytes_l2(dst, src, last, size);
286  break;
288  for (i = 0; i < bpp; i++) {
289  p = (last[i] >> 1);
290  dst[i] = p + src[i];
291  }
292 #define OP_AVG(x, s, l) (((((x) + (l)) >> 1) + (s)) & 0xff)
294  break;
296  for (i = 0; i < bpp; i++) {
297  p = last[i];
298  dst[i] = p + src[i];
299  }
300  if (bpp > 2 && size > 4) {
301  /* would write off the end of the array if we let it process
302  * the last pixel with bpp=3 */
303  int w = (bpp & 3) ? size - 3 : size;
304 
305  if (w > i) {
306  dsp->add_paeth_prediction(dst + i, src + i, last + i, size - i, bpp);
307  i = w;
308  }
309  }
310  ff_png_add_paeth_prediction(dst + i, src + i, last + i, size - i, bpp);
311  break;
312  }
313 }
314 
315 /* This used to be called "deloco" in FFmpeg
316  * and is actually an inverse reversible colorspace transformation */
317 #define YUV2RGB(NAME, TYPE) \
318 static void deloco_ ## NAME(TYPE *dst, int size, int alpha) \
319 { \
320  int i; \
321  for (i = 0; i < size - 2; i += 3 + alpha) { \
322  int g = dst [i + 1]; \
323  dst[i + 0] += g; \
324  dst[i + 2] += g; \
325  } \
326 }
327 
328 YUV2RGB(rgb8, uint8_t)
329 YUV2RGB(rgb16, uint16_t)
330 
332 {
333  if (s->interlace_type) {
334  return 100 - 100 * s->pass / (NB_PASSES - 1);
335  } else {
336  return 100 - 100 * s->y / s->cur_h;
337  }
338 }
339 
340 /* process exactly one decompressed row */
341 static void png_handle_row(PNGDecContext *s, uint8_t *dst, ptrdiff_t dst_stride)
342 {
343  uint8_t *ptr, *last_row;
344  int got_line;
345 
346  if (!s->interlace_type) {
347  ptr = dst + dst_stride * (s->y + s->y_offset) + s->x_offset * s->bpp;
348  if (s->y == 0)
349  last_row = s->last_row;
350  else
351  last_row = ptr - dst_stride;
352 
353  ff_png_filter_row(&s->dsp, ptr, s->crow_buf[0], s->crow_buf + 1,
354  last_row, s->row_size, s->bpp);
355  /* loco lags by 1 row so that it doesn't interfere with top prediction */
356  if (s->filter_type == PNG_FILTER_TYPE_LOCO && s->y > 0) {
357  if (s->bit_depth == 16) {
358  deloco_rgb16((uint16_t *)(ptr - dst_stride), s->row_size / 2,
359  s->color_type == PNG_COLOR_TYPE_RGB_ALPHA);
360  } else {
361  deloco_rgb8(ptr - dst_stride, s->row_size,
362  s->color_type == PNG_COLOR_TYPE_RGB_ALPHA);
363  }
364  }
365  s->y++;
366  if (s->y == s->cur_h) {
367  s->pic_state |= PNG_ALLIMAGE;
368  if (s->filter_type == PNG_FILTER_TYPE_LOCO) {
369  if (s->bit_depth == 16) {
370  deloco_rgb16((uint16_t *)ptr, s->row_size / 2,
371  s->color_type == PNG_COLOR_TYPE_RGB_ALPHA);
372  } else {
373  deloco_rgb8(ptr, s->row_size,
374  s->color_type == PNG_COLOR_TYPE_RGB_ALPHA);
375  }
376  }
377  }
378  } else {
379  got_line = 0;
380  for (;;) {
381  ptr = dst + dst_stride * (s->y + s->y_offset) + s->x_offset * s->bpp;
382  if ((ff_png_pass_ymask[s->pass] << (s->y & 7)) & 0x80) {
383  /* if we already read one row, it is time to stop to
384  * wait for the next one */
385  if (got_line)
386  break;
387  ff_png_filter_row(&s->dsp, s->tmp_row, s->crow_buf[0], s->crow_buf + 1,
388  s->last_row, s->pass_row_size, s->bpp);
389  FFSWAP(uint8_t *, s->last_row, s->tmp_row);
390  FFSWAP(unsigned int, s->last_row_size, s->tmp_row_size);
391  got_line = 1;
392  }
393  if ((png_pass_dsp_ymask[s->pass] << (s->y & 7)) & 0x80) {
394  png_put_interlaced_row(ptr, s->cur_w, s->bits_per_pixel, s->pass,
395  s->color_type, s->last_row);
396  }
397  s->y++;
398  if (s->y == s->cur_h) {
399  memset(s->last_row, 0, s->row_size);
400  for (;;) {
401  if (s->pass == NB_PASSES - 1) {
402  s->pic_state |= PNG_ALLIMAGE;
403  goto the_end;
404  } else {
405  s->pass++;
406  s->y = 0;
407  s->pass_row_size = ff_png_pass_row_size(s->pass,
408  s->bits_per_pixel,
409  s->cur_w);
410  s->crow_size = s->pass_row_size + 1;
411  if (s->pass_row_size != 0)
412  break;
413  /* skip pass if empty row */
414  }
415  }
416  }
417  }
418 the_end:;
419  }
420 }
421 
423  uint8_t *dst, ptrdiff_t dst_stride)
424 {
425  z_stream *const zstream = &s->zstream.zstream;
426  int ret;
427  zstream->avail_in = bytestream2_get_bytes_left(gb);
428  zstream->next_in = gb->buffer;
429 
430  /* decode one line if possible */
431  while (zstream->avail_in > 0) {
432  ret = inflate(zstream, Z_PARTIAL_FLUSH);
433  if (ret != Z_OK && ret != Z_STREAM_END) {
434  av_log(s->avctx, AV_LOG_ERROR, "inflate returned error %d\n", ret);
435  return AVERROR_EXTERNAL;
436  }
437  if (zstream->avail_out == 0) {
438  if (!(s->pic_state & PNG_ALLIMAGE)) {
439  png_handle_row(s, dst, dst_stride);
440  }
441  zstream->avail_out = s->crow_size;
442  zstream->next_out = s->crow_buf;
443  }
444  if (ret == Z_STREAM_END && zstream->avail_in > 0) {
445  av_log(s->avctx, AV_LOG_WARNING,
446  "%d undecompressed bytes left in buffer\n", zstream->avail_in);
447  return 0;
448  }
449  }
450  return 0;
451 }
452 
453 static int decode_zbuf(AVBPrint *bp, const uint8_t *data,
454  const uint8_t *data_end, void *logctx)
455 {
456  FFZStream z;
457  z_stream *const zstream = &z.zstream;
458  unsigned char *buf;
459  unsigned buf_size;
460  int ret = ff_inflate_init(&z, logctx);
461  if (ret < 0)
462  return ret;
463 
464  zstream->next_in = data;
465  zstream->avail_in = data_end - data;
467 
468  while (zstream->avail_in > 0) {
469  av_bprint_get_buffer(bp, 2, &buf, &buf_size);
470  if (buf_size < 2) {
471  ret = AVERROR(ENOMEM);
472  goto fail;
473  }
474  zstream->next_out = buf;
475  zstream->avail_out = buf_size - 1;
476  ret = inflate(zstream, Z_PARTIAL_FLUSH);
477  if (ret != Z_OK && ret != Z_STREAM_END) {
479  goto fail;
480  }
481  bp->len += zstream->next_out - buf;
482  if (ret == Z_STREAM_END)
483  break;
484  }
485  ff_inflate_end(&z);
486  bp->str[bp->len] = 0;
487  return 0;
488 
489 fail:
490  ff_inflate_end(&z);
492  return ret;
493 }
494 
495 static char *iso88591_to_utf8(const char *in, size_t size_in)
496 {
497  size_t extra = 0, i;
498  char *out, *q;
499 
500  for (i = 0; i < size_in; i++)
501  extra += !!(in[i] & 0x80);
502  if (size_in == SIZE_MAX || extra > SIZE_MAX - size_in - 1)
503  return NULL;
504  q = out = av_malloc(size_in + extra + 1);
505  if (!out)
506  return NULL;
507  for (i = 0; i < size_in; i++) {
508  if (in[i] & 0x80) {
509  *(q++) = 0xC0 | (in[i] >> 6);
510  *(q++) = 0x80 | (in[i] & 0x3F);
511  } else {
512  *(q++) = in[i];
513  }
514  }
515  *(q++) = 0;
516  return out;
517 }
518 
519 static int decode_text_to_exif(PNGDecContext *s, const char *txt_utf8)
520 {
521  size_t len = strlen(txt_utf8);
522  const char *ptr = txt_utf8;
523  const char *end = txt_utf8 + len;
524  size_t exif_len = 0;
525  uint8_t *exif_ptr;
526  const uint8_t *exif_end;
527 
528  // first we find a newline
529  while (*ptr++ != '\n') {
530  if (ptr >= end)
532  }
533 
534  // we check for "exif" and skip over it
535  if (end - ptr < 4 || strncmp("exif", ptr, 4))
536  return AVERROR_INVALIDDATA;
537  ptr += 3;
538 
539  // then we find the next printable non-space character
540  while (!av_isgraph(*++ptr)) {
541  if (ptr >= end)
543  }
544 
545  // parse the length
546  while (av_isdigit(*ptr)) {
547  size_t nlen = exif_len * 10 + (*ptr - '0');
548  if (nlen < exif_len) // overflow
549  return AVERROR_INVALIDDATA;
550  exif_len = nlen;
551  if (++ptr >= end)
553  }
554 
555  // then we find the next printable non-space character
556  while (!av_isgraph(*ptr)) {
557  if (++ptr >= end)
559  }
560 
561  // first condition checks for overflow in 2 * exif_len
562  if (exif_len > SIZE_MAX / 2 || end - ptr < 2 * exif_len)
563  return AVERROR_INVALIDDATA;
564  if (exif_len < 10)
565  return AVERROR_INVALIDDATA;
566 
567  av_buffer_unref(&s->exif_data);
568  // the buffer starts with "Exif " which we skip over
569  // we don't use AV_EXIF_EXIF00 because that disagrees
570  // with the eXIf chunk format
571  s->exif_data = av_buffer_alloc(exif_len - 6);
572  if (!s->exif_data)
573  return AVERROR(ENOMEM);
574 
575  // we subtract one because we call ++ptr later
576  // compiler will optimize out the call
577  ptr += strlen("Exif ") * 2 - 1;
578 
579  exif_ptr = s->exif_data->data;
580  exif_end = exif_ptr + s->exif_data->size;
581 
582  while (exif_ptr < exif_end) {
583  while (++ptr < end) {
584  if (*ptr >= '0' && *ptr <= '9') {
585  *exif_ptr = (*ptr - '0') << 4;
586  break;
587  }
588  if (*ptr >= 'a' && *ptr <= 'f') {
589  *exif_ptr = (*ptr - 'a' + 10) << 4;
590  break;
591  }
592  }
593  while (++ptr < end) {
594  if (*ptr >= '0' && *ptr <= '9') {
595  *exif_ptr += *ptr - '0';
596  break;
597  }
598  if (*ptr >= 'a' && *ptr <= 'f') {
599  *exif_ptr += *ptr - 'a' + 10;
600  break;
601  }
602  }
603  if (ptr > end)
604  return AVERROR_INVALIDDATA;
605  exif_ptr++;
606  }
607 
608  return 0;
609 }
610 
611 static int decode_text_chunk(PNGDecContext *s, GetByteContext *gb, int compressed)
612 {
613  int ret, method;
614  const uint8_t *data = gb->buffer;
615  const uint8_t *data_end = gb->buffer_end;
616  const char *keyword = data;
617  const char *keyword_end = memchr(keyword, 0, data_end - data);
618  char *kw_utf8 = NULL, *txt_utf8 = NULL;
619  const char *text;
620  unsigned text_len;
621  AVBPrint bp;
622 
623  if (!keyword_end)
624  return AVERROR_INVALIDDATA;
625  data = keyword_end + 1;
626 
627  if (compressed) {
628  if (data == data_end)
629  return AVERROR_INVALIDDATA;
630  method = *(data++);
631  if (method)
632  return AVERROR_INVALIDDATA;
633  if ((ret = decode_zbuf(&bp, data, data_end, s->avctx)) < 0)
634  return ret;
635  text = bp.str;
636  text_len = bp.len;
637  } else {
638  text = data;
639  text_len = data_end - data;
640  }
641 
642  txt_utf8 = iso88591_to_utf8(text, text_len);
643  if (compressed)
644  av_bprint_finalize(&bp, NULL);
645  if (!txt_utf8)
646  return AVERROR(ENOMEM);
647  kw_utf8 = iso88591_to_utf8(keyword, keyword_end - keyword);
648  if (!kw_utf8) {
649  av_free(txt_utf8);
650  return AVERROR(ENOMEM);
651  }
652 
653  if (!strcmp(kw_utf8, "Raw profile type exif")) {
654  ret = decode_text_to_exif(s, txt_utf8);
655  if (ret < 0) {;
656  av_buffer_unref(&s->exif_data);
657  } else {
658  av_freep(&kw_utf8);
659  av_freep(&txt_utf8);
660  return ret;
661  }
662  }
663 
664  av_dict_set(&s->frame_metadata, kw_utf8, txt_utf8,
666  return 0;
667 }
668 
670  GetByteContext *gb)
671 {
672  if (bytestream2_get_bytes_left(gb) != 13)
673  return AVERROR_INVALIDDATA;
674 
675  if (s->pic_state & PNG_IDAT) {
676  av_log(avctx, AV_LOG_ERROR, "IHDR after IDAT\n");
677  return AVERROR_INVALIDDATA;
678  }
679 
680  if (s->hdr_state & PNG_IHDR) {
681  av_log(avctx, AV_LOG_ERROR, "Multiple IHDR\n");
682  return AVERROR_INVALIDDATA;
683  }
684 
685  s->width = s->cur_w = bytestream2_get_be32(gb);
686  s->height = s->cur_h = bytestream2_get_be32(gb);
687  if (av_image_check_size(s->width, s->height, 0, avctx)) {
688  s->cur_w = s->cur_h = s->width = s->height = 0;
689  av_log(avctx, AV_LOG_ERROR, "Invalid image size\n");
690  return AVERROR_INVALIDDATA;
691  }
692  s->bit_depth = bytestream2_get_byte(gb);
693  if (s->bit_depth != 1 && s->bit_depth != 2 && s->bit_depth != 4 &&
694  s->bit_depth != 8 && s->bit_depth != 16) {
695  av_log(avctx, AV_LOG_ERROR, "Invalid bit depth\n");
696  goto error;
697  }
698  s->color_type = bytestream2_get_byte(gb);
699  s->compression_type = bytestream2_get_byte(gb);
700  if (s->compression_type) {
701  av_log(avctx, AV_LOG_ERROR, "Invalid compression method %d\n", s->compression_type);
702  goto error;
703  }
704  s->filter_type = bytestream2_get_byte(gb);
705  s->interlace_type = bytestream2_get_byte(gb);
706  s->hdr_state |= PNG_IHDR;
707  if (avctx->debug & FF_DEBUG_PICT_INFO)
708  av_log(avctx, AV_LOG_DEBUG, "width=%d height=%d depth=%d color_type=%d "
709  "compression_type=%d filter_type=%d interlace_type=%d\n",
710  s->width, s->height, s->bit_depth, s->color_type,
711  s->compression_type, s->filter_type, s->interlace_type);
712 
713  return 0;
714 error:
715  s->cur_w = s->cur_h = s->width = s->height = 0;
716  s->bit_depth = 8;
717  return AVERROR_INVALIDDATA;
718 }
719 
721  GetByteContext *gb)
722 {
723  if (s->pic_state & PNG_IDAT) {
724  av_log(avctx, AV_LOG_ERROR, "pHYs after IDAT\n");
725  return AVERROR_INVALIDDATA;
726  }
727  avctx->sample_aspect_ratio.num = bytestream2_get_be32(gb);
728  avctx->sample_aspect_ratio.den = bytestream2_get_be32(gb);
729  if (avctx->sample_aspect_ratio.num < 0 || avctx->sample_aspect_ratio.den < 0)
730  avctx->sample_aspect_ratio = (AVRational){ 0, 1 };
731  bytestream2_skip(gb, 1); /* unit specifier */
732 
733  return 0;
734 }
735 
737  GetByteContext *gb)
738 {
739  if (!(s->hdr_state & PNG_IHDR)) {
740  av_log(avctx, AV_LOG_ERROR, "eXIf before IHDR\n");
741  return AVERROR_INVALIDDATA;
742  }
743 
744  av_buffer_unref(&s->exif_data);
745  s->exif_data = av_buffer_alloc(bytestream2_get_bytes_left(gb));
746  if (!s->exif_data)
747  return AVERROR(ENOMEM);
748  bytestream2_get_buffer(gb, s->exif_data->data, s->exif_data->size);
749 
750  return 0;
751 }
752 
753 /*
754  * This populates AVCodecContext fields so it must be called before
755  * ff_thread_finish_setup() to avoid a race condition with respect to the
756  * generic copying of avctx fields.
757  */
759 {
760  PNGDecContext *s = avctx->priv_data;
761  int ret;
762 
763  if (s->have_cicp) {
764  if (s->cicp_primaries >= AVCOL_PRI_NB)
765  av_log(avctx, AV_LOG_WARNING, "unrecognized cICP primaries\n");
766  else
767  avctx->color_primaries = frame->color_primaries = s->cicp_primaries;
768  if (s->cicp_trc >= AVCOL_TRC_NB)
769  av_log(avctx, AV_LOG_WARNING, "unrecognized cICP transfer\n");
770  else
771  avctx->color_trc = frame->color_trc = s->cicp_trc;
772  if (s->cicp_range == 0) {
773  av_log(avctx, AV_LOG_WARNING, "tv-range cICP tag found. Colors may be wrong\n");
774  avctx->color_range = frame->color_range = AVCOL_RANGE_MPEG;
775  } else if (s->cicp_range != 1) {
776  /* we already printed a warning when parsing the cICP chunk */
777  avctx->color_range = frame->color_range = AVCOL_RANGE_UNSPECIFIED;
778  }
779  } else if (s->iccp_data) {
780  AVFrameSideData *sd;
782  s->iccp_data_len, &sd);
783  if (ret < 0)
784  return ret;
785  if (sd) {
786  memcpy(sd->data, s->iccp_data, s->iccp_data_len);
787  av_dict_set(&sd->metadata, "name", s->iccp_name, 0);
788  }
789  } else if (s->have_srgb) {
790  avctx->color_primaries = frame->color_primaries = AVCOL_PRI_BT709;
791  avctx->color_trc = frame->color_trc = AVCOL_TRC_IEC61966_2_1;
792  } else if (s->have_chrm) {
794  enum AVColorPrimaries prim;
795  desc.wp.x = av_make_q(s->white_point[0], 100000);
796  desc.wp.y = av_make_q(s->white_point[1], 100000);
797  desc.prim.r.x = av_make_q(s->display_primaries[0][0], 100000);
798  desc.prim.r.y = av_make_q(s->display_primaries[0][1], 100000);
799  desc.prim.g.x = av_make_q(s->display_primaries[1][0], 100000);
800  desc.prim.g.y = av_make_q(s->display_primaries[1][1], 100000);
801  desc.prim.b.x = av_make_q(s->display_primaries[2][0], 100000);
802  desc.prim.b.y = av_make_q(s->display_primaries[2][1], 100000);
804  if (prim != AVCOL_PRI_UNSPECIFIED)
805  avctx->color_primaries = frame->color_primaries = prim;
806  else
807  av_log(avctx, AV_LOG_WARNING, "unknown cHRM primaries\n");
808  }
809 
810  /* these chunks override gAMA */
811  if (s->iccp_data || s->have_srgb || s->have_cicp) {
812  av_dict_set(&s->frame_metadata, "gamma", NULL, 0);
813  } else if (s->gamma) {
814  /*
815  * These values are 100000/2.2, 100000/2.8, 100000/2.6, and
816  * 100000/1.0 respectively. 45455, 35714, and 38462, and 100000.
817  * There's a 0.001 gamma tolerance here in case of floating
818  * point issues when the PNG was written.
819  *
820  * None of the other enums have a pure gamma curve so it makes
821  * sense to leave those to sRGB and cICP.
822  */
823  if (s->gamma > 45355 && s->gamma < 45555)
824  avctx->color_trc = frame->color_trc = AVCOL_TRC_GAMMA22;
825  else if (s->gamma > 35614 && s->gamma < 35814)
826  avctx->color_trc = frame->color_trc = AVCOL_TRC_GAMMA28;
827  else if (s->gamma > 38362 && s->gamma < 38562)
828  avctx->color_trc = frame->color_trc = AVCOL_TRC_SMPTE428;
829  else if (s->gamma > 99900 && s->gamma < 100100)
830  avctx->color_trc = frame->color_trc = AVCOL_TRC_LINEAR;
831  }
832 
833  /* PNG only supports RGB */
834  avctx->colorspace = frame->colorspace = AVCOL_SPC_RGB;
835  if (!s->have_cicp || s->cicp_range == 1)
836  avctx->color_range = frame->color_range = AVCOL_RANGE_JPEG;
837 
838  /*
839  * tRNS sets alpha depth to full, so we ignore sBIT if set.
840  * As a result we must wait until now to set
841  * avctx->bits_per_raw_sample in case tRNS appears after sBIT
842  */
843  if (!s->has_trns && s->significant_bits > 0)
844  avctx->bits_per_raw_sample = s->significant_bits;
845 
846  if (s->have_clli) {
848 
849  ret = ff_decode_content_light_new(avctx, frame, &clli);
850  if (ret < 0)
851  return ret;
852 
853  if (clli) {
854  /*
855  * 0.0001 divisor value
856  * see: https://www.w3.org/TR/png-3/#cLLI-chunk
857  */
858  clli->MaxCLL = s->clli_max / 10000;
859  clli->MaxFALL = s->clli_avg / 10000;
860  }
861  }
862 
863  if (s->have_mdcv) {
865 
866  ret = ff_decode_mastering_display_new(avctx, frame, &mdcv);
867  if (ret < 0)
868  return ret;
869 
870  if (mdcv) {
871  mdcv->has_primaries = 1;
872  for (int i = 0; i < 3; i++) {
873  mdcv->display_primaries[i][0] = av_make_q(s->mdcv_primaries[i][0], 50000);
874  mdcv->display_primaries[i][1] = av_make_q(s->mdcv_primaries[i][1], 50000);
875  }
876  mdcv->white_point[0] = av_make_q(s->mdcv_white_point[0], 50000);
877  mdcv->white_point[1] = av_make_q(s->mdcv_white_point[1], 50000);
878  mdcv->has_luminance = 1;
879  mdcv->max_luminance = av_make_q(s->mdcv_max_lum, 10000);
880  mdcv->min_luminance = av_make_q(s->mdcv_min_lum, 10000);
881  }
882  }
883 
884  return 0;
885 }
886 
888  GetByteContext *gb, AVFrame *p)
889 {
890  int ret;
891  size_t byte_depth = s->bit_depth > 8 ? 2 : 1;
892 
893  if (!p)
894  return AVERROR_INVALIDDATA;
895  if (!(s->hdr_state & PNG_IHDR)) {
896  av_log(avctx, AV_LOG_ERROR, "IDAT without IHDR\n");
897  return AVERROR_INVALIDDATA;
898  }
899  if (!(s->pic_state & PNG_IDAT)) {
900  /* init image info */
901  ret = ff_set_dimensions(avctx, s->width, s->height);
902  if (ret < 0)
903  return ret;
904 
905  s->channels = ff_png_get_nb_channels(s->color_type);
906  s->bits_per_pixel = s->bit_depth * s->channels;
907  s->bpp = (s->bits_per_pixel + 7) >> 3;
908  s->row_size = (s->cur_w * s->bits_per_pixel + 7) >> 3;
909 
910  if ((s->bit_depth == 2 || s->bit_depth == 4 || s->bit_depth == 8) &&
911  s->color_type == PNG_COLOR_TYPE_RGB) {
912  avctx->pix_fmt = AV_PIX_FMT_RGB24;
913  } else if ((s->bit_depth == 2 || s->bit_depth == 4 || s->bit_depth == 8) &&
914  s->color_type == PNG_COLOR_TYPE_RGB_ALPHA) {
915  avctx->pix_fmt = AV_PIX_FMT_RGBA;
916  } else if ((s->bit_depth == 2 || s->bit_depth == 4 || s->bit_depth == 8) &&
917  s->color_type == PNG_COLOR_TYPE_GRAY) {
918  avctx->pix_fmt = AV_PIX_FMT_GRAY8;
919  } else if (s->bit_depth == 16 &&
920  s->color_type == PNG_COLOR_TYPE_GRAY) {
921  avctx->pix_fmt = AV_PIX_FMT_GRAY16BE;
922  } else if (s->bit_depth == 16 &&
923  s->color_type == PNG_COLOR_TYPE_RGB) {
924  avctx->pix_fmt = AV_PIX_FMT_RGB48BE;
925  } else if (s->bit_depth == 16 &&
926  s->color_type == PNG_COLOR_TYPE_RGB_ALPHA) {
927  avctx->pix_fmt = AV_PIX_FMT_RGBA64BE;
928  } else if ((s->bits_per_pixel == 1 || s->bits_per_pixel == 2 || s->bits_per_pixel == 4 || s->bits_per_pixel == 8) &&
929  s->color_type == PNG_COLOR_TYPE_PALETTE) {
931  } else if (s->bit_depth == 1 && s->bits_per_pixel == 1 && avctx->codec_id != AV_CODEC_ID_APNG) {
932  avctx->pix_fmt = AV_PIX_FMT_MONOBLACK;
933  } else if (s->bit_depth == 8 &&
934  s->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
935  avctx->pix_fmt = AV_PIX_FMT_YA8;
936  } else if (s->bit_depth == 16 &&
937  s->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
938  avctx->pix_fmt = AV_PIX_FMT_YA16BE;
939  } else {
941  "Bit depth %d color type %d",
942  s->bit_depth, s->color_type);
943  return AVERROR_PATCHWELCOME;
944  }
945 
946  if (s->has_trns && s->color_type != PNG_COLOR_TYPE_PALETTE) {
947  switch (avctx->pix_fmt) {
948  case AV_PIX_FMT_RGB24:
949  avctx->pix_fmt = AV_PIX_FMT_RGBA;
950  break;
951 
952  case AV_PIX_FMT_RGB48BE:
953  avctx->pix_fmt = AV_PIX_FMT_RGBA64BE;
954  break;
955 
956  case AV_PIX_FMT_GRAY8:
957  avctx->pix_fmt = AV_PIX_FMT_YA8;
958  break;
959 
960  case AV_PIX_FMT_GRAY16BE:
961  avctx->pix_fmt = AV_PIX_FMT_YA16BE;
962  break;
963 
964  default:
965  avpriv_request_sample(avctx, "bit depth %d "
966  "and color type %d with TRNS",
967  s->bit_depth, s->color_type);
968  return AVERROR_INVALIDDATA;
969  }
970 
971  s->bpp += byte_depth;
972  }
973 
974  /* PNG spec mandates independent alpha channel */
975  if (s->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
976  s->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
978 
979  ff_progress_frame_unref(&s->picture);
980  if (s->dispose_op == APNG_DISPOSE_OP_PREVIOUS) {
981  /* We only need a buffer for the current picture. */
982  ret = ff_thread_get_buffer(avctx, p, 0);
983  if (ret < 0)
984  return ret;
985  } else if (s->dispose_op == APNG_DISPOSE_OP_BACKGROUND) {
986  /* We need a buffer for the current picture as well as
987  * a buffer for the reference to retain. */
988  ret = ff_progress_frame_get_buffer(avctx, &s->picture,
990  if (ret < 0)
991  return ret;
992  ret = ff_thread_get_buffer(avctx, p, 0);
993  if (ret < 0)
994  return ret;
995  } else {
996  /* The picture output this time and the reference to retain coincide. */
997  ret = ff_progress_frame_get_buffer(avctx, &s->picture,
999  if (ret < 0)
1000  return ret;
1001  ret = av_frame_ref(p, s->picture.f);
1002  if (ret < 0)
1003  return ret;
1004  }
1005 
1006  p->pict_type = AV_PICTURE_TYPE_I;
1007  p->flags |= AV_FRAME_FLAG_KEY;
1008  p->flags |= AV_FRAME_FLAG_INTERLACED * !!s->interlace_type;
1009 
1010  if ((ret = populate_avctx_color_fields(avctx, p)) < 0)
1011  return ret;
1012  ff_thread_finish_setup(avctx);
1013 
1014  /* compute the compressed row size */
1015  if (!s->interlace_type) {
1016  s->crow_size = s->row_size + 1;
1017  } else {
1018  s->pass = 0;
1019  s->pass_row_size = ff_png_pass_row_size(s->pass,
1020  s->bits_per_pixel,
1021  s->cur_w);
1022  s->crow_size = s->pass_row_size + 1;
1023  }
1024  ff_dlog(avctx, "row_size=%d crow_size =%d\n",
1025  s->row_size, s->crow_size);
1026 
1027  /* copy the palette if needed */
1028  if (avctx->pix_fmt == AV_PIX_FMT_PAL8)
1029  memcpy(p->data[1], s->palette, 256 * sizeof(uint32_t));
1030  /* empty row is used if differencing to the first row */
1031  av_fast_padded_mallocz(&s->last_row, &s->last_row_size, s->row_size);
1032  if (!s->last_row)
1033  return AVERROR_INVALIDDATA;
1034  if (s->interlace_type ||
1035  s->color_type == PNG_COLOR_TYPE_RGB_ALPHA) {
1036  av_fast_padded_malloc(&s->tmp_row, &s->tmp_row_size, s->row_size);
1037  if (!s->tmp_row)
1038  return AVERROR_INVALIDDATA;
1039  }
1040  /* compressed row */
1041  av_fast_padded_malloc(&s->buffer, &s->buffer_size, s->row_size + 16);
1042  if (!s->buffer)
1043  return AVERROR(ENOMEM);
1044 
1045  /* we want crow_buf+1 to be 16-byte aligned */
1046  s->crow_buf = s->buffer + 15;
1047  s->zstream.zstream.avail_out = s->crow_size;
1048  s->zstream.zstream.next_out = s->crow_buf;
1049  }
1050 
1051  s->pic_state |= PNG_IDAT;
1052 
1053  /* set image to non-transparent bpp while decompressing */
1054  if (s->has_trns && s->color_type != PNG_COLOR_TYPE_PALETTE)
1055  s->bpp -= byte_depth;
1056 
1057  ret = png_decode_idat(s, gb, p->data[0], p->linesize[0]);
1058 
1059  if (s->has_trns && s->color_type != PNG_COLOR_TYPE_PALETTE)
1060  s->bpp += byte_depth;
1061 
1062  if (ret < 0)
1063  return ret;
1064 
1065  return 0;
1066 }
1067 
1069  GetByteContext *gb)
1070 {
1071  int length = bytestream2_get_bytes_left(gb);
1072  int n, i, r, g, b;
1073 
1074  if ((length % 3) != 0 || length > 256 * 3)
1075  return AVERROR_INVALIDDATA;
1076  /* read the palette */
1077  n = length / 3;
1078  for (i = 0; i < n; i++) {
1079  r = bytestream2_get_byte(gb);
1080  g = bytestream2_get_byte(gb);
1081  b = bytestream2_get_byte(gb);
1082  s->palette[i] = (0xFFU << 24) | (r << 16) | (g << 8) | b;
1083  }
1084  for (; i < 256; i++)
1085  s->palette[i] = (0xFFU << 24);
1086  s->hdr_state |= PNG_PLTE;
1087 
1088  return 0;
1089 }
1090 
1092  GetByteContext *gb)
1093 {
1094  int length = bytestream2_get_bytes_left(gb);
1095  int v, i;
1096 
1097  if (!(s->hdr_state & PNG_IHDR)) {
1098  av_log(avctx, AV_LOG_ERROR, "trns before IHDR\n");
1099  return AVERROR_INVALIDDATA;
1100  }
1101 
1102  if (s->pic_state & PNG_IDAT) {
1103  av_log(avctx, AV_LOG_ERROR, "trns after IDAT\n");
1104  return AVERROR_INVALIDDATA;
1105  }
1106 
1107  if (s->color_type == PNG_COLOR_TYPE_PALETTE) {
1108  if (length > 256 || !(s->hdr_state & PNG_PLTE))
1109  return AVERROR_INVALIDDATA;
1110 
1111  for (i = 0; i < length; i++) {
1112  unsigned v = bytestream2_get_byte(gb);
1113  s->palette[i] = (s->palette[i] & 0x00ffffff) | (v << 24);
1114  }
1115  } else if (s->color_type == PNG_COLOR_TYPE_GRAY || s->color_type == PNG_COLOR_TYPE_RGB) {
1116  if ((s->color_type == PNG_COLOR_TYPE_GRAY && length != 2) ||
1117  (s->color_type == PNG_COLOR_TYPE_RGB && length != 6) ||
1118  s->bit_depth == 1)
1119  return AVERROR_INVALIDDATA;
1120 
1121  for (i = 0; i < length / 2; i++) {
1122  /* only use the least significant bits */
1123  v = av_zero_extend(bytestream2_get_be16(gb), s->bit_depth);
1124 
1125  if (s->bit_depth > 8)
1126  AV_WB16(&s->transparent_color_be[2 * i], v);
1127  else
1128  s->transparent_color_be[i] = v;
1129  }
1130  } else {
1131  return AVERROR_INVALIDDATA;
1132  }
1133 
1134  s->has_trns = 1;
1135 
1136  return 0;
1137 }
1138 
1140 {
1141  int ret, cnt = 0;
1142  AVBPrint bp;
1143 
1144  while ((s->iccp_name[cnt++] = bytestream2_get_byte(gb)) && cnt < 81);
1145  if (cnt > 80) {
1146  av_log(s->avctx, AV_LOG_ERROR, "iCCP with invalid name!\n");
1148  goto fail;
1149  }
1150 
1151  if (bytestream2_get_byte(gb) != 0) {
1152  av_log(s->avctx, AV_LOG_ERROR, "iCCP with invalid compression!\n");
1154  goto fail;
1155  }
1156 
1157  if ((ret = decode_zbuf(&bp, gb->buffer, gb->buffer_end, s->avctx)) < 0)
1158  return ret;
1159 
1160  av_freep(&s->iccp_data);
1161  ret = av_bprint_finalize(&bp, (char **)&s->iccp_data);
1162  if (ret < 0)
1163  return ret;
1164  s->iccp_data_len = bp.len;
1165 
1166  return 0;
1167 fail:
1168  s->iccp_name[0] = 0;
1169  return ret;
1170 }
1171 
1173  GetByteContext *gb)
1174 {
1175  int bits = 0;
1176  int channels;
1177  int remainder = bytestream2_get_bytes_left(gb);
1178 
1179  if (!(s->hdr_state & PNG_IHDR)) {
1180  av_log(avctx, AV_LOG_ERROR, "sBIT before IHDR\n");
1181  return AVERROR_INVALIDDATA;
1182  }
1183 
1184  if (s->pic_state & PNG_IDAT) {
1185  av_log(avctx, AV_LOG_WARNING, "Ignoring illegal sBIT chunk after IDAT\n");
1186  return 0;
1187  }
1188 
1189  channels = s->color_type & PNG_COLOR_MASK_PALETTE ? 3 : ff_png_get_nb_channels(s->color_type);
1190 
1191  if (remainder != channels) {
1192  av_log(avctx, AV_LOG_WARNING, "Invalid sBIT size: %d, expected: %d\n", remainder, channels);
1193  /* not enough space left in chunk to read info */
1194  if (remainder < channels)
1195  return 0;
1196  }
1197 
1198  for (int i = 0; i < channels; i++) {
1199  int b = bytestream2_get_byteu(gb);
1200  bits = FFMAX(b, bits);
1201  }
1202 
1203  if (bits <= 0 || bits > (s->color_type & PNG_COLOR_MASK_PALETTE ? 8 : s->bit_depth)) {
1204  av_log(avctx, AV_LOG_WARNING, "Invalid significant bits: %d\n", bits);
1205  return 0;
1206  }
1207  s->significant_bits = bits;
1208 
1209  return 0;
1210 }
1211 
1213 {
1214  if (s->bits_per_pixel == 1 && s->color_type == PNG_COLOR_TYPE_PALETTE) {
1215  int i, j, k;
1216  uint8_t *pd = p->data[0];
1217  for (j = 0; j < s->height; j++) {
1218  i = s->width / 8;
1219  for (k = 7; k >= 1; k--)
1220  if ((s->width&7) >= k)
1221  pd[8*i + k - 1] = (pd[i]>>8-k) & 1;
1222  for (i--; i >= 0; i--) {
1223  pd[8*i + 7]= pd[i] & 1;
1224  pd[8*i + 6]= (pd[i]>>1) & 1;
1225  pd[8*i + 5]= (pd[i]>>2) & 1;
1226  pd[8*i + 4]= (pd[i]>>3) & 1;
1227  pd[8*i + 3]= (pd[i]>>4) & 1;
1228  pd[8*i + 2]= (pd[i]>>5) & 1;
1229  pd[8*i + 1]= (pd[i]>>6) & 1;
1230  pd[8*i + 0]= pd[i]>>7;
1231  }
1232  pd += p->linesize[0];
1233  }
1234  } else if (s->bits_per_pixel == 2) {
1235  int i, j;
1236  uint8_t *pd = p->data[0];
1237  for (j = 0; j < s->height; j++) {
1238  i = s->width / 4;
1239  if (s->color_type == PNG_COLOR_TYPE_PALETTE) {
1240  if ((s->width&3) >= 3) pd[4*i + 2]= (pd[i] >> 2) & 3;
1241  if ((s->width&3) >= 2) pd[4*i + 1]= (pd[i] >> 4) & 3;
1242  if ((s->width&3) >= 1) pd[4*i + 0]= pd[i] >> 6;
1243  for (i--; i >= 0; i--) {
1244  pd[4*i + 3]= pd[i] & 3;
1245  pd[4*i + 2]= (pd[i]>>2) & 3;
1246  pd[4*i + 1]= (pd[i]>>4) & 3;
1247  pd[4*i + 0]= pd[i]>>6;
1248  }
1249  } else {
1250  if ((s->width&3) >= 3) pd[4*i + 2]= ((pd[i]>>2) & 3)*0x55;
1251  if ((s->width&3) >= 2) pd[4*i + 1]= ((pd[i]>>4) & 3)*0x55;
1252  if ((s->width&3) >= 1) pd[4*i + 0]= ( pd[i]>>6 )*0x55;
1253  for (i--; i >= 0; i--) {
1254  pd[4*i + 3]= ( pd[i] & 3)*0x55;
1255  pd[4*i + 2]= ((pd[i]>>2) & 3)*0x55;
1256  pd[4*i + 1]= ((pd[i]>>4) & 3)*0x55;
1257  pd[4*i + 0]= ( pd[i]>>6 )*0x55;
1258  }
1259  }
1260  pd += p->linesize[0];
1261  }
1262  } else if (s->bits_per_pixel == 4) {
1263  int i, j;
1264  uint8_t *pd = p->data[0];
1265  for (j = 0; j < s->height; j++) {
1266  i = s->width/2;
1267  if (s->color_type == PNG_COLOR_TYPE_PALETTE) {
1268  if (s->width&1) pd[2*i+0]= pd[i]>>4;
1269  for (i--; i >= 0; i--) {
1270  pd[2*i + 1] = pd[i] & 15;
1271  pd[2*i + 0] = pd[i] >> 4;
1272  }
1273  } else {
1274  if (s->width & 1) pd[2*i + 0]= (pd[i] >> 4) * 0x11;
1275  for (i--; i >= 0; i--) {
1276  pd[2*i + 1] = (pd[i] & 15) * 0x11;
1277  pd[2*i + 0] = (pd[i] >> 4) * 0x11;
1278  }
1279  }
1280  pd += p->linesize[0];
1281  }
1282  }
1283 }
1284 
1286  GetByteContext *gb)
1287 {
1288  uint32_t sequence_number;
1289  int cur_w, cur_h, x_offset, y_offset, dispose_op, blend_op;
1290 
1292  return AVERROR_INVALIDDATA;
1293 
1294  if (!(s->hdr_state & PNG_IHDR)) {
1295  av_log(avctx, AV_LOG_ERROR, "fctl before IHDR\n");
1296  return AVERROR_INVALIDDATA;
1297  }
1298 
1299  if (s->pic_state & PNG_IDAT) {
1300  av_log(avctx, AV_LOG_ERROR, "fctl after IDAT\n");
1301  return AVERROR_INVALIDDATA;
1302  }
1303 
1304  sequence_number = bytestream2_get_be32(gb);
1305  cur_w = bytestream2_get_be32(gb);
1306  cur_h = bytestream2_get_be32(gb);
1307  x_offset = bytestream2_get_be32(gb);
1308  y_offset = bytestream2_get_be32(gb);
1309  bytestream2_skip(gb, 4); /* delay_num (2), delay_den (2) */
1310  dispose_op = bytestream2_get_byte(gb);
1311  blend_op = bytestream2_get_byte(gb);
1312 
1313  if (sequence_number == 0 &&
1314  (cur_w != s->width ||
1315  cur_h != s->height ||
1316  x_offset != 0 ||
1317  y_offset != 0) ||
1318  cur_w <= 0 || cur_h <= 0 ||
1319  x_offset < 0 || y_offset < 0 ||
1320  cur_w > s->width - x_offset|| cur_h > s->height - y_offset)
1321  return AVERROR_INVALIDDATA;
1322 
1323  if (blend_op != APNG_BLEND_OP_OVER && blend_op != APNG_BLEND_OP_SOURCE) {
1324  av_log(avctx, AV_LOG_ERROR, "Invalid blend_op %d\n", blend_op);
1325  return AVERROR_INVALIDDATA;
1326  }
1327 
1328  if ((sequence_number == 0 || !s->last_picture.f) &&
1329  dispose_op == APNG_DISPOSE_OP_PREVIOUS) {
1330  // No previous frame to revert to for the first frame
1331  // Spec says to just treat it as a APNG_DISPOSE_OP_BACKGROUND
1332  dispose_op = APNG_DISPOSE_OP_BACKGROUND;
1333  }
1334 
1335  if (blend_op == APNG_BLEND_OP_OVER && !s->has_trns && (
1336  avctx->pix_fmt == AV_PIX_FMT_RGB24 ||
1337  avctx->pix_fmt == AV_PIX_FMT_RGB48BE ||
1338  avctx->pix_fmt == AV_PIX_FMT_GRAY8 ||
1339  avctx->pix_fmt == AV_PIX_FMT_GRAY16BE ||
1340  avctx->pix_fmt == AV_PIX_FMT_MONOBLACK
1341  )) {
1342  // APNG_BLEND_OP_OVER is the same as APNG_BLEND_OP_SOURCE when there is no alpha channel
1343  blend_op = APNG_BLEND_OP_SOURCE;
1344  }
1345 
1346  s->cur_w = cur_w;
1347  s->cur_h = cur_h;
1348  s->x_offset = x_offset;
1349  s->y_offset = y_offset;
1350  s->dispose_op = dispose_op;
1351  s->blend_op = blend_op;
1352 
1353  return 0;
1354 }
1355 
1357 {
1358  int i, j;
1359  uint8_t *pd = p->data[0];
1360  uint8_t *pd_last = s->last_picture.f->data[0];
1361  int ls = av_image_get_linesize(p->format, s->width, 0);
1362 
1363  ls = FFMIN(ls, s->width * s->bpp);
1364 
1365  ff_progress_frame_await(&s->last_picture, INT_MAX);
1366  for (j = 0; j < s->height; j++) {
1367  for (i = 0; i < ls; i++)
1368  pd[i] += pd_last[i];
1369  pd += p->linesize[0];
1370  pd_last += s->last_picture.f->linesize[0];
1371  }
1372 }
1373 
1374 // divide by 255 and round to nearest
1375 // apply a fast variant: (X+127)/255 = ((X+127)*257+257)>>16 = ((X+128)*257)>>16
1376 #define FAST_DIV255(x) ((((x) + 128) * 257) >> 16)
1377 
1379  AVFrame *p)
1380 {
1381  uint8_t *dst = p->data[0];
1382  ptrdiff_t dst_stride = p->linesize[0];
1383  const uint8_t *src = s->last_picture.f->data[0];
1384  ptrdiff_t src_stride = s->last_picture.f->linesize[0];
1385  const int bpp = s->color_type == PNG_COLOR_TYPE_PALETTE ? 4 : s->bpp;
1386 
1387  size_t x, y;
1388 
1389  if (s->blend_op == APNG_BLEND_OP_OVER &&
1390  avctx->pix_fmt != AV_PIX_FMT_RGBA &&
1391  avctx->pix_fmt != AV_PIX_FMT_GRAY8A) {
1392  avpriv_request_sample(avctx, "Blending with pixel format %s",
1393  av_get_pix_fmt_name(avctx->pix_fmt));
1394  return AVERROR_PATCHWELCOME;
1395  }
1396 
1397  ff_progress_frame_await(&s->last_picture, INT_MAX);
1398 
1399  // copy unchanged rectangles from the last frame
1400  for (y = 0; y < s->y_offset; y++)
1401  memcpy(dst + y * dst_stride, src + y * src_stride, p->width * bpp);
1402  for (y = s->y_offset; y < s->y_offset + s->cur_h; y++) {
1403  memcpy(dst + y * dst_stride, src + y * src_stride, s->x_offset * bpp);
1404  memcpy(dst + y * dst_stride + (s->x_offset + s->cur_w) * bpp,
1405  src + y * src_stride + (s->x_offset + s->cur_w) * bpp,
1406  (p->width - s->cur_w - s->x_offset) * bpp);
1407  }
1408  for (y = s->y_offset + s->cur_h; y < p->height; y++)
1409  memcpy(dst + y * dst_stride, src + y * src_stride, p->width * bpp);
1410 
1411  if (s->blend_op == APNG_BLEND_OP_OVER) {
1412  // Perform blending
1413  for (y = s->y_offset; y < s->y_offset + s->cur_h; ++y) {
1414  uint8_t *foreground = dst + dst_stride * y + bpp * s->x_offset;
1415  const uint8_t *background = src + src_stride * y + bpp * s->x_offset;
1416  for (x = s->x_offset; x < s->x_offset + s->cur_w; ++x, foreground += bpp, background += bpp) {
1417  size_t b;
1418  uint8_t foreground_alpha, background_alpha, output_alpha;
1419  uint8_t output[10];
1420 
1421  // Since we might be blending alpha onto alpha, we use the following equations:
1422  // output_alpha = foreground_alpha + (1 - foreground_alpha) * background_alpha
1423  // output = (foreground_alpha * foreground + (1 - foreground_alpha) * background_alpha * background) / output_alpha
1424 
1425  switch (avctx->pix_fmt) {
1426  case AV_PIX_FMT_RGBA:
1427  foreground_alpha = foreground[3];
1428  background_alpha = background[3];
1429  break;
1430 
1431  case AV_PIX_FMT_GRAY8A:
1432  foreground_alpha = foreground[1];
1433  background_alpha = background[1];
1434  break;
1435  }
1436 
1437  if (foreground_alpha == 255)
1438  continue;
1439 
1440  if (foreground_alpha == 0) {
1441  memcpy(foreground, background, bpp);
1442  continue;
1443  }
1444 
1445  output_alpha = foreground_alpha + FAST_DIV255((255 - foreground_alpha) * background_alpha);
1446 
1447  av_assert0(bpp <= 10);
1448 
1449  for (b = 0; b < bpp - 1; ++b) {
1450  if (output_alpha == 0) {
1451  output[b] = 0;
1452  } else if (background_alpha == 255) {
1453  output[b] = FAST_DIV255(foreground_alpha * foreground[b] + (255 - foreground_alpha) * background[b]);
1454  } else {
1455  output[b] = (255 * foreground_alpha * foreground[b] + (255 - foreground_alpha) * background_alpha * background[b]) / (255 * output_alpha);
1456  }
1457  }
1458  output[b] = output_alpha;
1459  memcpy(foreground, output, bpp);
1460  }
1461  }
1462  }
1463 
1464  return 0;
1465 }
1466 
1468 {
1469  // need to reset a rectangle to black
1470  av_unused int ret = av_frame_copy(s->picture.f, p);
1471  const int bpp = s->color_type == PNG_COLOR_TYPE_PALETTE ? 4 : s->bpp;
1472  const ptrdiff_t dst_stride = s->picture.f->linesize[0];
1473  uint8_t *dst = s->picture.f->data[0] + s->y_offset * dst_stride + bpp * s->x_offset;
1474 
1475  av_assert1(ret >= 0);
1476 
1477  for (size_t y = 0; y < s->cur_h; y++) {
1478  memset(dst, 0, bpp * s->cur_w);
1479  dst += dst_stride;
1480  }
1481 }
1482 
1484  AVFrame *p, const AVPacket *avpkt)
1485 {
1486  const AVCRC *crc_tab = av_crc_get_table(AV_CRC_32_IEEE_LE);
1487  uint32_t tag, length;
1488  int decode_next_dat = 0;
1489  int i, ret;
1490 
1491  for (;;) {
1492  GetByteContext gb_chunk;
1493 
1494  length = bytestream2_get_bytes_left(&s->gb);
1495  if (length <= 0) {
1496 
1497  if (avctx->codec_id == AV_CODEC_ID_PNG &&
1498  avctx->skip_frame == AVDISCARD_ALL) {
1499  return 0;
1500  }
1501 
1502  if (CONFIG_APNG_DECODER && avctx->codec_id == AV_CODEC_ID_APNG && length == 0) {
1503  if (!(s->pic_state & PNG_IDAT))
1504  return 0;
1505  else
1506  goto exit_loop;
1507  }
1508  av_log(avctx, AV_LOG_ERROR, "%d bytes left\n", length);
1509  if ( s->pic_state & PNG_ALLIMAGE
1511  goto exit_loop;
1513  goto fail;
1514  }
1515 
1516  length = bytestream2_get_be32(&s->gb);
1517  if (length > 0x7fffffff || length + 8 > bytestream2_get_bytes_left(&s->gb)) {
1518  av_log(avctx, AV_LOG_ERROR, "chunk too big\n");
1520  goto fail;
1521  }
1522  if (avctx->err_recognition & (AV_EF_CRCCHECK | AV_EF_IGNORE_ERR)) {
1523  uint32_t crc_sig = AV_RB32(s->gb.buffer + length + 4);
1524  uint32_t crc_cal = ~av_crc(crc_tab, UINT32_MAX, s->gb.buffer, length + 4);
1525  if (crc_sig ^ crc_cal) {
1526  av_log(avctx, AV_LOG_ERROR, "CRC mismatch in chunk");
1527  if (avctx->err_recognition & AV_EF_EXPLODE) {
1528  av_log(avctx, AV_LOG_ERROR, ", quitting\n");
1530  goto fail;
1531  }
1532  av_log(avctx, AV_LOG_ERROR, ", skipping\n");
1533  bytestream2_skip(&s->gb, length + 8); /* tag */
1534  continue;
1535  }
1536  }
1537  tag = bytestream2_get_le32(&s->gb);
1538  if (avctx->debug & FF_DEBUG_STARTCODE)
1539  av_log(avctx, AV_LOG_DEBUG, "png: tag=%s length=%u\n",
1540  av_fourcc2str(tag), length);
1541 
1542  bytestream2_init(&gb_chunk, s->gb.buffer, length);
1543  bytestream2_skip(&s->gb, length + 4);
1544 
1545  if (avctx->codec_id == AV_CODEC_ID_PNG &&
1546  avctx->skip_frame == AVDISCARD_ALL) {
1547  switch(tag) {
1548  case MKTAG('I', 'H', 'D', 'R'):
1549  case MKTAG('p', 'H', 'Y', 's'):
1550  case MKTAG('t', 'E', 'X', 't'):
1551  case MKTAG('I', 'D', 'A', 'T'):
1552  case MKTAG('t', 'R', 'N', 'S'):
1553  case MKTAG('s', 'R', 'G', 'B'):
1554  case MKTAG('c', 'I', 'C', 'P'):
1555  case MKTAG('c', 'H', 'R', 'M'):
1556  case MKTAG('g', 'A', 'M', 'A'):
1557  break;
1558  default:
1559  continue;
1560  }
1561  }
1562 
1563  switch (tag) {
1564  case MKTAG('I', 'H', 'D', 'R'):
1565  if ((ret = decode_ihdr_chunk(avctx, s, &gb_chunk)) < 0)
1566  goto fail;
1567  break;
1568  case MKTAG('p', 'H', 'Y', 's'):
1569  if ((ret = decode_phys_chunk(avctx, s, &gb_chunk)) < 0)
1570  goto fail;
1571  break;
1572  case MKTAG('f', 'c', 'T', 'L'):
1573  if (!CONFIG_APNG_DECODER || avctx->codec_id != AV_CODEC_ID_APNG)
1574  continue;
1575  if ((ret = decode_fctl_chunk(avctx, s, &gb_chunk)) < 0)
1576  goto fail;
1577  decode_next_dat = 1;
1578  break;
1579  case MKTAG('f', 'd', 'A', 'T'):
1580  if (!CONFIG_APNG_DECODER || avctx->codec_id != AV_CODEC_ID_APNG)
1581  continue;
1582  if (!decode_next_dat || bytestream2_get_bytes_left(&gb_chunk) < 4) {
1584  goto fail;
1585  }
1586  bytestream2_get_be32(&gb_chunk);
1588  case MKTAG('I', 'D', 'A', 'T'):
1589  if (CONFIG_APNG_DECODER && avctx->codec_id == AV_CODEC_ID_APNG && !decode_next_dat)
1590  continue;
1591  if ((ret = decode_idat_chunk(avctx, s, &gb_chunk, p)) < 0)
1592  goto fail;
1593  break;
1594  case MKTAG('P', 'L', 'T', 'E'):
1595  decode_plte_chunk(avctx, s, &gb_chunk);
1596  break;
1597  case MKTAG('t', 'R', 'N', 'S'):
1598  decode_trns_chunk(avctx, s, &gb_chunk);
1599  break;
1600  case MKTAG('t', 'E', 'X', 't'):
1601  if (decode_text_chunk(s, &gb_chunk, 0) < 0)
1602  av_log(avctx, AV_LOG_WARNING, "Broken tEXt chunk\n");
1603  break;
1604  case MKTAG('z', 'T', 'X', 't'):
1605  if (decode_text_chunk(s, &gb_chunk, 1) < 0)
1606  av_log(avctx, AV_LOG_WARNING, "Broken zTXt chunk\n");
1607  break;
1608  case MKTAG('s', 'T', 'E', 'R'): {
1609  int mode = bytestream2_get_byte(&gb_chunk);
1610 
1611  if (mode == 0 || mode == 1) {
1612  s->stereo_mode = mode;
1613  } else {
1614  av_log(avctx, AV_LOG_WARNING,
1615  "Unknown value in sTER chunk (%d)\n", mode);
1616  }
1617  break;
1618  }
1619  case MKTAG('c', 'I', 'C', 'P'):
1620  s->cicp_primaries = bytestream2_get_byte(&gb_chunk);
1621  s->cicp_trc = bytestream2_get_byte(&gb_chunk);
1622  if (bytestream2_get_byte(&gb_chunk) != 0)
1623  av_log(avctx, AV_LOG_WARNING, "nonzero cICP matrix\n");
1624  s->cicp_range = bytestream2_get_byte(&gb_chunk);
1625  if (s->cicp_range != 0 && s->cicp_range != 1)
1626  av_log(avctx, AV_LOG_WARNING, "invalid cICP range: %d\n", s->cicp_range);
1627  s->have_cicp = 1;
1628  break;
1629  case MKTAG('s', 'R', 'G', 'B'):
1630  /* skip rendering intent byte */
1631  bytestream2_skip(&gb_chunk, 1);
1632  s->have_srgb = 1;
1633  break;
1634  case MKTAG('i', 'C', 'C', 'P'): {
1635  if ((ret = decode_iccp_chunk(s, &gb_chunk)) < 0)
1636  goto fail;
1637  break;
1638  }
1639  case MKTAG('c', 'H', 'R', 'M'): {
1640  s->have_chrm = 1;
1641 
1642  s->white_point[0] = bytestream2_get_be32(&gb_chunk);
1643  s->white_point[1] = bytestream2_get_be32(&gb_chunk);
1644 
1645  /* RGB Primaries */
1646  for (i = 0; i < 3; i++) {
1647  s->display_primaries[i][0] = bytestream2_get_be32(&gb_chunk);
1648  s->display_primaries[i][1] = bytestream2_get_be32(&gb_chunk);
1649  }
1650 
1651  break;
1652  }
1653  case MKTAG('s', 'B', 'I', 'T'):
1654  if ((ret = decode_sbit_chunk(avctx, s, &gb_chunk)) < 0)
1655  goto fail;
1656  break;
1657  case MKTAG('g', 'A', 'M', 'A'): {
1658  AVBPrint bp;
1659  char *gamma_str;
1660  s->gamma = bytestream2_get_be32(&gb_chunk);
1661 
1663  av_bprintf(&bp, "%i/%i", s->gamma, 100000);
1664  ret = av_bprint_finalize(&bp, &gamma_str);
1665  if (ret < 0)
1666  return ret;
1667 
1668  av_dict_set(&s->frame_metadata, "gamma", gamma_str, AV_DICT_DONT_STRDUP_VAL);
1669 
1670  break;
1671  }
1672  case MKTAG('c', 'L', 'L', 'i'): /* legacy spelling, for backwards compat */
1673  case MKTAG('c', 'L', 'L', 'I'):
1674  if (bytestream2_get_bytes_left(&gb_chunk) != 8) {
1675  av_log(avctx, AV_LOG_WARNING, "Invalid cLLI chunk size: %d\n", bytestream2_get_bytes_left(&gb_chunk));
1676  break;
1677  }
1678  s->have_clli = 1;
1679  s->clli_max = bytestream2_get_be32u(&gb_chunk);
1680  s->clli_avg = bytestream2_get_be32u(&gb_chunk);
1681  break;
1682  case MKTAG('m', 'D', 'C', 'v'): /* legacy spelling, for backward compat */
1683  case MKTAG('m', 'D', 'C', 'V'):
1684  if (bytestream2_get_bytes_left(&gb_chunk) != 24) {
1685  av_log(avctx, AV_LOG_WARNING, "Invalid mDCV chunk size: %d\n", bytestream2_get_bytes_left(&gb_chunk));
1686  break;
1687  }
1688  s->have_mdcv = 1;
1689  for (int i = 0; i < 3; i++) {
1690  s->mdcv_primaries[i][0] = bytestream2_get_be16u(&gb_chunk);
1691  s->mdcv_primaries[i][1] = bytestream2_get_be16u(&gb_chunk);
1692  }
1693  s->mdcv_white_point[0] = bytestream2_get_be16u(&gb_chunk);
1694  s->mdcv_white_point[1] = bytestream2_get_be16u(&gb_chunk);
1695  s->mdcv_max_lum = bytestream2_get_be32u(&gb_chunk);
1696  s->mdcv_min_lum = bytestream2_get_be32u(&gb_chunk);
1697  break;
1698  case MKTAG('e', 'X', 'I', 'f'):
1699  ret = decode_exif_chunk(avctx, s, &gb_chunk);
1700  if (ret < 0)
1701  goto fail;
1702  break;
1703  case MKTAG('I', 'E', 'N', 'D'):
1704  if (!(s->pic_state & PNG_ALLIMAGE))
1705  av_log(avctx, AV_LOG_ERROR, "IEND without all image\n");
1706  if (!(s->pic_state & (PNG_ALLIMAGE|PNG_IDAT))) {
1708  goto fail;
1709  }
1710  goto exit_loop;
1711  }
1712  }
1713 exit_loop:
1714 
1715  if (!p)
1716  return AVERROR_INVALIDDATA;
1717 
1718  if (avctx->codec_id == AV_CODEC_ID_PNG &&
1719  avctx->skip_frame == AVDISCARD_ALL) {
1720  return 0;
1721  }
1722 
1725  goto fail;
1726  }
1727 
1728  if (s->bits_per_pixel <= 4)
1729  handle_small_bpp(s, p);
1730 
1731  if (s->exif_data) {
1732  // we swap because ff_decode_exif_attach_buffer adds to p->metadata
1733  FFSWAP(AVDictionary *, p->metadata, s->frame_metadata);
1734  ret = ff_decode_exif_attach_buffer(avctx, p, &s->exif_data, AV_EXIF_TIFF_HEADER);
1735  FFSWAP(AVDictionary *, p->metadata, s->frame_metadata);
1736  if (ret < 0) {
1737  av_log(avctx, AV_LOG_WARNING, "unable to attach EXIF buffer\n");
1738  return ret;
1739  }
1740  }
1741 
1742  if (s->color_type == PNG_COLOR_TYPE_PALETTE && avctx->codec_id == AV_CODEC_ID_APNG) {
1743  for (int y = 0; y < s->height; y++) {
1744  uint8_t *row = &p->data[0][p->linesize[0] * y];
1745 
1746  for (int x = s->width - 1; x >= 0; x--) {
1747  const uint8_t idx = row[x];
1748 
1749  row[4*x+2] = s->palette[idx] & 0xFF;
1750  row[4*x+1] = (s->palette[idx] >> 8 ) & 0xFF;
1751  row[4*x+0] = (s->palette[idx] >> 16) & 0xFF;
1752  row[4*x+3] = s->palette[idx] >> 24;
1753  }
1754  }
1755  }
1756 
1757  /* apply transparency if needed */
1758  if (s->has_trns && s->color_type != PNG_COLOR_TYPE_PALETTE) {
1759  size_t byte_depth = s->bit_depth > 8 ? 2 : 1;
1760  size_t raw_bpp = s->bpp - byte_depth;
1761  ptrdiff_t x, y;
1762 
1763  av_assert0(s->bit_depth > 1);
1764 
1765  for (y = 0; y < s->height; ++y) {
1766  uint8_t *row = &p->data[0][p->linesize[0] * y];
1767 
1768  if (s->bpp == 2 && byte_depth == 1) {
1769  uint8_t *pixel = &row[2 * s->width - 1];
1770  uint8_t *rowp = &row[1 * s->width - 1];
1771  int tcolor = s->transparent_color_be[0];
1772  for (x = s->width; x > 0; --x) {
1773  *pixel-- = *rowp == tcolor ? 0 : 0xff;
1774  *pixel-- = *rowp--;
1775  }
1776  } else if (s->bpp == 4 && byte_depth == 1) {
1777  uint8_t *pixel = &row[4 * s->width - 1];
1778  uint8_t *rowp = &row[3 * s->width - 1];
1779  int tcolor = AV_RL24(s->transparent_color_be);
1780  for (x = s->width; x > 0; --x) {
1781  *pixel-- = AV_RL24(rowp-2) == tcolor ? 0 : 0xff;
1782  *pixel-- = *rowp--;
1783  *pixel-- = *rowp--;
1784  *pixel-- = *rowp--;
1785  }
1786  } else {
1787  /* since we're updating in-place, we have to go from right to left */
1788  for (x = s->width; x > 0; --x) {
1789  uint8_t *pixel = &row[s->bpp * (x - 1)];
1790  memmove(pixel, &row[raw_bpp * (x - 1)], raw_bpp);
1791 
1792  if (!memcmp(pixel, s->transparent_color_be, raw_bpp)) {
1793  memset(&pixel[raw_bpp], 0, byte_depth);
1794  } else {
1795  memset(&pixel[raw_bpp], 0xff, byte_depth);
1796  }
1797  }
1798  }
1799  }
1800  }
1801 
1802  /* handle P-frames only if a predecessor frame is available */
1803  if (s->last_picture.f) {
1804  if ( !(avpkt->flags & AV_PKT_FLAG_KEY) && avctx->codec_tag != AV_RL32("MPNG")
1805  && s->last_picture.f->width == p->width
1806  && s->last_picture.f->height== p->height
1807  && s->last_picture.f->format== p->format
1808  ) {
1809  if (CONFIG_PNG_DECODER && avctx->codec_id != AV_CODEC_ID_APNG)
1811  else if (CONFIG_APNG_DECODER &&
1812  avctx->codec_id == AV_CODEC_ID_APNG &&
1813  (ret = handle_p_frame_apng(avctx, s, p)) < 0)
1814  goto fail;
1815  }
1816  }
1817  if (CONFIG_APNG_DECODER && s->dispose_op == APNG_DISPOSE_OP_BACKGROUND)
1819 
1820  ret = 0;
1821 fail:
1822  if (s->picture.f)
1823  ff_progress_frame_report(&s->picture, INT_MAX);
1824 
1825  return ret;
1826 }
1827 
1829 {
1830  av_freep(&s->iccp_data);
1831  s->iccp_data_len = 0;
1832  s->iccp_name[0] = 0;
1833 
1834  s->stereo_mode = -1;
1835 
1836  s->have_chrm = 0;
1837  s->have_srgb = 0;
1838  s->have_cicp = 0;
1839 
1840  av_dict_free(&s->frame_metadata);
1841 }
1842 
1844 {
1845  int ret;
1846 
1847  if (s->stereo_mode >= 0) {
1849  if (!stereo3d) {
1850  ret = AVERROR(ENOMEM);
1851  goto fail;
1852  }
1853 
1854  stereo3d->type = AV_STEREO3D_SIDEBYSIDE;
1855  stereo3d->flags = s->stereo_mode ? 0 : AV_STEREO3D_FLAG_INVERT;
1856  }
1857 
1858  FFSWAP(AVDictionary*, f->metadata, s->frame_metadata);
1859 
1860  return 0;
1861 fail:
1862  av_frame_unref(f);
1863  return ret;
1864 }
1865 
1866 #if CONFIG_PNG_DECODER
1867 static int decode_frame_png(AVCodecContext *avctx, AVFrame *p,
1868  int *got_frame, AVPacket *avpkt)
1869 {
1870  PNGDecContext *const s = avctx->priv_data;
1871  const uint8_t *buf = avpkt->data;
1872  int buf_size = avpkt->size;
1873  int64_t sig;
1874  int ret;
1875 
1877 
1878  bytestream2_init(&s->gb, buf, buf_size);
1879 
1880  /* check signature */
1881  sig = bytestream2_get_be64(&s->gb);
1882  if (sig != PNGSIG &&
1883  sig != MNGSIG) {
1884  av_log(avctx, AV_LOG_ERROR, "Invalid PNG signature 0x%08"PRIX64".\n", sig);
1885  return AVERROR_INVALIDDATA;
1886  }
1887 
1888  s->y = s->has_trns = 0;
1889  s->hdr_state = 0;
1890  s->pic_state = 0;
1891 
1892  /* Reset z_stream */
1893  ret = inflateReset(&s->zstream.zstream);
1894  if (ret != Z_OK)
1895  return AVERROR_EXTERNAL;
1896 
1897  if ((ret = decode_frame_common(avctx, s, p, avpkt)) < 0)
1898  goto the_end;
1899 
1900  if (avctx->skip_frame == AVDISCARD_ALL) {
1901  *got_frame = 0;
1902  ret = bytestream2_tell(&s->gb);
1903  goto the_end;
1904  }
1905 
1906  ret = output_frame(s, p);
1907  if (ret < 0)
1908  goto the_end;
1909 
1910  if (!(avctx->active_thread_type & FF_THREAD_FRAME)) {
1911  ff_progress_frame_unref(&s->last_picture);
1912  FFSWAP(ProgressFrame, s->picture, s->last_picture);
1913  }
1914 
1915  *got_frame = 1;
1916 
1917  ret = bytestream2_tell(&s->gb);
1918 the_end:
1919  s->crow_buf = NULL;
1920  return ret;
1921 }
1922 #endif
1923 
1924 #if CONFIG_APNG_DECODER
1925 static int decode_frame_apng(AVCodecContext *avctx, AVFrame *p,
1926  int *got_frame, AVPacket *avpkt)
1927 {
1928  PNGDecContext *const s = avctx->priv_data;
1929  int ret;
1930 
1932 
1933  if (!(s->hdr_state & PNG_IHDR)) {
1934  if (!avctx->extradata_size)
1935  return AVERROR_INVALIDDATA;
1936 
1937  if ((ret = inflateReset(&s->zstream.zstream)) != Z_OK)
1938  return AVERROR_EXTERNAL;
1939  bytestream2_init(&s->gb, avctx->extradata, avctx->extradata_size);
1940  if ((ret = decode_frame_common(avctx, s, NULL, avpkt)) < 0)
1941  return ret;
1942  }
1943 
1944  /* reset state for a new frame */
1945  if ((ret = inflateReset(&s->zstream.zstream)) != Z_OK)
1946  return AVERROR_EXTERNAL;
1947  s->y = 0;
1948  s->pic_state = 0;
1949  bytestream2_init(&s->gb, avpkt->data, avpkt->size);
1950  if ((ret = decode_frame_common(avctx, s, p, avpkt)) < 0)
1951  return ret;
1952 
1953  if (!(s->pic_state & PNG_ALLIMAGE))
1954  av_log(avctx, AV_LOG_WARNING, "Frame did not contain a complete image\n");
1955  if (!(s->pic_state & (PNG_ALLIMAGE|PNG_IDAT)))
1956  return AVERROR_INVALIDDATA;
1957 
1958  ret = output_frame(s, p);
1959  if (ret < 0)
1960  return ret;
1961 
1962  if (!(avctx->active_thread_type & FF_THREAD_FRAME)) {
1963  if (s->dispose_op != APNG_DISPOSE_OP_PREVIOUS)
1964  FFSWAP(ProgressFrame, s->picture, s->last_picture);
1965  ff_progress_frame_unref(&s->picture);
1966  }
1967 
1968  *got_frame = 1;
1969  return bytestream2_tell(&s->gb);
1970 }
1971 #endif
1972 
1973 #if HAVE_THREADS
1975 {
1976  PNGDecContext *psrc = src->priv_data;
1977  PNGDecContext *pdst = dst->priv_data;
1978  const ProgressFrame *src_frame;
1979 
1980  if (dst == src)
1981  return 0;
1982 
1983  if (CONFIG_APNG_DECODER && dst->codec_id == AV_CODEC_ID_APNG) {
1984 
1985  pdst->width = psrc->width;
1986  pdst->height = psrc->height;
1987  pdst->bit_depth = psrc->bit_depth;
1988  pdst->color_type = psrc->color_type;
1989  pdst->compression_type = psrc->compression_type;
1990  pdst->interlace_type = psrc->interlace_type;
1991  pdst->filter_type = psrc->filter_type;
1992  pdst->has_trns = psrc->has_trns;
1993  memcpy(pdst->transparent_color_be, psrc->transparent_color_be, sizeof(pdst->transparent_color_be));
1994 
1995  memcpy(pdst->palette, psrc->palette, sizeof(pdst->palette));
1996 
1997  pdst->hdr_state |= psrc->hdr_state;
1998  }
1999 
2000  src_frame = psrc->dispose_op == APNG_DISPOSE_OP_PREVIOUS ?
2001  &psrc->last_picture : &psrc->picture;
2002 
2003  ff_progress_frame_replace(&pdst->last_picture, src_frame);
2004 
2005  return 0;
2006 }
2007 #endif
2008 
2010 {
2011  PNGDecContext *s = avctx->priv_data;
2012 
2013  s->avctx = avctx;
2014 
2015  ff_pngdsp_init(&s->dsp);
2016 
2017  return ff_inflate_init(&s->zstream, avctx);
2018 }
2019 
2021 {
2022  PNGDecContext *s = avctx->priv_data;
2023 
2024  ff_progress_frame_unref(&s->last_picture);
2025  ff_progress_frame_unref(&s->picture);
2026  av_freep(&s->buffer);
2027  s->buffer_size = 0;
2028  av_freep(&s->last_row);
2029  s->last_row_size = 0;
2030  av_freep(&s->tmp_row);
2031  s->tmp_row_size = 0;
2032 
2033  av_freep(&s->iccp_data);
2034  av_buffer_unref(&s->exif_data);
2035  av_dict_free(&s->frame_metadata);
2036  ff_inflate_end(&s->zstream);
2037 
2038  return 0;
2039 }
2040 
2041 #if CONFIG_APNG_DECODER
2042 const FFCodec ff_apng_decoder = {
2043  .p.name = "apng",
2044  CODEC_LONG_NAME("APNG (Animated Portable Network Graphics) image"),
2045  .p.type = AVMEDIA_TYPE_VIDEO,
2046  .p.id = AV_CODEC_ID_APNG,
2047  .priv_data_size = sizeof(PNGDecContext),
2048  .init = png_dec_init,
2049  .close = png_dec_end,
2050  FF_CODEC_DECODE_CB(decode_frame_apng),
2052  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
2053  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP |
2056 };
2057 #endif
2058 
2059 #if CONFIG_PNG_DECODER
2060 const FFCodec ff_png_decoder = {
2061  .p.name = "png",
2062  CODEC_LONG_NAME("PNG (Portable Network Graphics) image"),
2063  .p.type = AVMEDIA_TYPE_VIDEO,
2064  .p.id = AV_CODEC_ID_PNG,
2065  .priv_data_size = sizeof(PNGDecContext),
2066  .init = png_dec_init,
2067  .close = png_dec_end,
2068  FF_CODEC_DECODE_CB(decode_frame_png),
2070  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
2071  .caps_internal = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM |
2075 };
2076 #endif
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:32
PNG_PLTE
@ PNG_PLTE
Definition: pngdec.c:55
PNGDSPContext
Definition: pngdsp.h:29
AVMasteringDisplayMetadata::has_primaries
int has_primaries
Flag indicating whether the display primaries (and white point) are set.
Definition: mastering_display_metadata.h:62
ff_progress_frame_report
void ff_progress_frame_report(ProgressFrame *f, int n)
Notify later decoding threads when part of their reference frame is ready.
Definition: decode.c:1967
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
AV_BPRINT_SIZE_UNLIMITED
#define AV_BPRINT_SIZE_UNLIMITED
AVMasteringDisplayMetadata::max_luminance
AVRational max_luminance
Max luminance of mastering display (cd/m^2).
Definition: mastering_display_metadata.h:57
PNGDecContext::clli_max
uint32_t clli_max
Definition: pngdec.c:89
AV_EF_EXPLODE
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition: defs.h:51
clear_frame_metadata
static void clear_frame_metadata(PNGDecContext *s)
Definition: pngdec.c:1828
AVCodecContext::alpha_mode
enum AVAlphaMode alpha_mode
Indicates how the alpha channel of the video is represented.
Definition: avcodec.h:1944
ff_png_pass_row_size
int ff_png_pass_row_size(int pass, int bits_per_pixel, int width)
Definition: png.c:54
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:43
PNGDecContext::have_srgb
int have_srgb
Definition: pngdec.c:83
PNGDecContext::cicp_range
enum AVColorRange cicp_range
Definition: pngdec.c:87
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
AV_PIX_FMT_YA8
@ AV_PIX_FMT_YA8
8 bits gray, 8 bits alpha
Definition: pixfmt.h:140
AVALPHA_MODE_STRAIGHT
@ AVALPHA_MODE_STRAIGHT
Alpha channel is independent of color values.
Definition: pixfmt.h:813
bytestream2_get_bytes_left
static av_always_inline int bytestream2_get_bytes_left(const GetByteContext *g)
Definition: bytestream.h:158
AVCodecContext::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:667
AVColorTransferCharacteristic
AVColorTransferCharacteristic
Color Transfer Characteristic.
Definition: pixfmt.h:666
out
static FILE * out
Definition: movenc.c:55
av_bprint_init
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition: bprint.c:69
GetByteContext
Definition: bytestream.h:33
PNG_ALLIMAGE
@ PNG_ALLIMAGE
Definition: pngdec.c:60
bytestream2_tell
static av_always_inline int bytestream2_tell(const GetByteContext *g)
Definition: bytestream.h:192
AVColorPrimariesDesc
Struct that contains both white point location and primaries location, providing the complete descrip...
Definition: csp.h:78
ff_png_pass_ymask
const uint8_t ff_png_pass_ymask[NB_PASSES]
Definition: png.c:27
AVCRC
uint32_t AVCRC
Definition: crc.h:46
PNGDecContext::last_row_size
unsigned int last_row_size
Definition: pngdec.c:119
APNG_FCTL_CHUNK_SIZE
#define APNG_FCTL_CHUNK_SIZE
Definition: apng.h:42
decode_phys_chunk
static int decode_phys_chunk(AVCodecContext *avctx, PNGDecContext *s, GetByteContext *gb)
Definition: pngdec.c:720
AVCOL_TRC_LINEAR
@ AVCOL_TRC_LINEAR
"Linear transfer characteristics"
Definition: pixfmt.h:675
PNGDecContext::bit_depth
int bit_depth
Definition: pngdec.c:104
AVMasteringDisplayMetadata::display_primaries
AVRational display_primaries[3][2]
CIE 1931 xy chromaticity coords of color primaries (r, g, b order).
Definition: mastering_display_metadata.h:42
AVMasteringDisplayMetadata::has_luminance
int has_luminance
Flag indicating whether the luminance (min_ and max_) have been set.
Definition: mastering_display_metadata.h:67
AVCodecContext::err_recognition
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
Definition: avcodec.h:1410
rational.h
int64_t
long long int64_t
Definition: coverity.c:34
output
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce output
Definition: filter_design.txt:226
PNGDecContext::crow_size
int crow_size
Definition: pngdec.c:125
av_unused
#define av_unused
Definition: attributes.h:164
mask
int mask
Definition: mediacodecdec_common.c:154
decode_text_chunk
static int decode_text_chunk(PNGDecContext *s, GetByteContext *gb, int compressed)
Definition: pngdec.c:611
PNGDecContext::mdcv_white_point
uint16_t mdcv_white_point[2]
Definition: pngdec.c:94
AVContentLightMetadata::MaxCLL
unsigned MaxCLL
Max content light level (cd/m^2).
Definition: mastering_display_metadata.h:111
mode
Definition: swscale.c:60
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:434
AVCOL_TRC_NB
@ AVCOL_TRC_NB
Not part of ABI.
Definition: pixfmt.h:688
AV_PIX_FMT_RGBA64BE
@ AV_PIX_FMT_RGBA64BE
packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is st...
Definition: pixfmt.h:202
AVCodecContext::color_trc
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:660
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:777
AVPacket::data
uint8_t * data
Definition: packet.h:595
APNG_BLEND_OP_SOURCE
@ APNG_BLEND_OP_SOURCE
Definition: apng.h:37
PNGDecContext::have_clli
int have_clli
Definition: pngdec.c:88
b
#define b
Definition: input.c:43
ff_progress_frame_get_buffer
int ff_progress_frame_get_buffer(AVCodecContext *avctx, ProgressFrame *f, int flags)
Wrapper around ff_progress_frame_alloc() and ff_thread_get_buffer().
Definition: decode.c:1927
data
const char data[16]
Definition: mxf.c:149
FFCodec
Definition: codec_internal.h:127
PNGDecContext::row_size
int row_size
Definition: pngdec.c:126
FFZStream::zstream
z_stream zstream
Definition: zlib_wrapper.h:28
AVCOL_SPC_RGB
@ AVCOL_SPC_RGB
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB), YZX and ST 428-1
Definition: pixfmt.h:701
PNGDecContext::width
int width
Definition: pngdec.c:100
AVDictionary
Definition: dict.c:32
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
AVColorPrimaries
AVColorPrimaries
Chromaticity coordinates of the source primaries.
Definition: pixfmt.h:636
PNGDecContext::picture
ProgressFrame picture
Definition: pngdec.c:69
AV_CODEC_ID_APNG
@ AV_CODEC_ID_APNG
Definition: codec_id.h:269
PNGDecContext::tmp_row_size
unsigned int tmp_row_size
Definition: pngdec.c:121
PNGDecContext::color_type
int color_type
Definition: pngdec.c:105
PNGDecContext::cur_h
int cur_h
Definition: pngdec.c:101
ff_set_dimensions
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
Definition: utils.c:91
PNGDecContext::bits_per_pixel
int bits_per_pixel
Definition: pngdec.c:110
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:650
thread.h
PNGDecContext::gamma
int gamma
Definition: pngdec.c:82
FF_DEBUG_PICT_INFO
#define FF_DEBUG_PICT_INFO
Definition: avcodec.h:1387
NB_PASSES
#define NB_PASSES
Definition: png.h:47
PNGDecContext::blend_op
uint8_t blend_op
Definition: pngdec.c:103
AVContentLightMetadata
Content light level needed by to transmit HDR over HDMI (CTA-861.3).
Definition: mastering_display_metadata.h:107
crc.h
AV_PIX_FMT_GRAY16BE
@ AV_PIX_FMT_GRAY16BE
Y , 16bpp, big-endian.
Definition: pixfmt.h:104
close
static av_cold void close(AVCodecParserContext *s)
Definition: apv_parser.c:197
AV_STEREO3D_SIDEBYSIDE
@ AV_STEREO3D_SIDEBYSIDE
Views are next to each other.
Definition: stereo3d.h:64
bytestream2_skip
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
Definition: bytestream.h:168
FAST_DIV255
#define FAST_DIV255(x)
Definition: pngdec.c:1376
PNGImageState
PNGImageState
Definition: pngdec.c:58
PNG_FILTER_TYPE_LOCO
#define PNG_FILTER_TYPE_LOCO
Definition: png.h:39
PNGDecContext::mdcv_max_lum
uint32_t mdcv_max_lum
Definition: pngdec.c:95
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
AVCOL_TRC_IEC61966_2_1
@ AVCOL_TRC_IEC61966_2_1
IEC 61966-2-1 (sRGB or sYCC)
Definition: pixfmt.h:680
PNGDecContext::pass_row_size
int pass_row_size
Definition: pngdec.c:127
AVCodecContext::skip_frame
enum AVDiscard skip_frame
Skip decoding for selected frames.
Definition: avcodec.h:1674
fail
#define fail()
Definition: checkasm.h:224
inflate
static void inflate(uint8_t *dst, const uint8_t *p1, int width, int threshold, const uint8_t *coordinates[], int coord, int maxc)
Definition: vf_neighbor.c:194
png_dec_end
static av_cold int png_dec_end(AVCodecContext *avctx)
Definition: pngdec.c:2020
OP_AVG
#define OP_AVG(x, s, l)
AVCOL_TRC_GAMMA28
@ AVCOL_TRC_GAMMA28
also ITU-R BT470BG
Definition: pixfmt.h:672
PNGDecContext::pic_state
enum PNGImageState pic_state
Definition: pngdec.c:99
AVERROR_BUFFER_TOO_SMALL
#define AVERROR_BUFFER_TOO_SMALL
Buffer too small.
Definition: error.h:53
decode_idat_chunk
static int decode_idat_chunk(AVCodecContext *avctx, PNGDecContext *s, GetByteContext *gb, AVFrame *p)
Definition: pngdec.c:887
png_pass_dsp_ymask
static const uint8_t png_pass_dsp_ymask[NB_PASSES]
Definition: pngdec.c:140
AVRational::num
int num
Numerator.
Definition: rational.h:59
progressframe.h
PNG_COLOR_TYPE_RGB_ALPHA
#define PNG_COLOR_TYPE_RGB_ALPHA
Definition: png.h:36
PNGDecContext::crow_buf
uint8_t * crow_buf
Definition: pngdec.c:117
AVCOL_TRC_GAMMA22
@ AVCOL_TRC_GAMMA22
also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
Definition: pixfmt.h:671
AV_DICT_DONT_STRDUP_VAL
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that's been allocated with av_malloc() or another memory allocation functio...
Definition: dict.h:79
PNGDecContext::last_row
uint8_t * last_row
Definition: pngdec.c:118
PNGDecContext::height
int height
Definition: pngdec.c:100
avassert.h
FF_CODEC_CAP_USES_PROGRESSFRAMES
#define FF_CODEC_CAP_USES_PROGRESSFRAMES
The decoder might make use of the ProgressFrame API.
Definition: codec_internal.h:69
AVCodecContext::color_primaries
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition: avcodec.h:653
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
pngdsp.h
zlib_wrapper.h
av_cold
#define av_cold
Definition: attributes.h:119
AV_FRAME_FLAG_KEY
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition: frame.h:649
PNGDecContext::have_cicp
int have_cicp
Definition: pngdec.c:84
YUV2RGB
#define YUV2RGB(NAME, TYPE)
Definition: pngdec.c:317
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:523
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:347
stereo3d.h
AVMasteringDisplayMetadata::white_point
AVRational white_point[2]
CIE 1931 xy chromaticity coords of white point.
Definition: mastering_display_metadata.h:47
intreadwrite.h
PNGDecContext::tmp_row
uint8_t * tmp_row
Definition: pngdec.c:120
s
#define s(width, name)
Definition: cbs_vp9.c:198
PNGDecContext::clli_avg
uint32_t clli_avg
Definition: pngdec.c:90
AVCOL_PRI_NB
@ AVCOL_PRI_NB
Not part of ABI.
Definition: pixfmt.h:654
ff_apng_decoder
const FFCodec ff_apng_decoder
PNGDecContext::y_offset
int y_offset
Definition: pngdec.c:102
PNGDecContext::palette
uint32_t palette[256]
Definition: pngdec.c:116
g
const char * g
Definition: vf_curves.c:128
AV_GET_BUFFER_FLAG_REF
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
Definition: avcodec.h:411
ff_thread_get_buffer
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
Definition: pthread_frame.c:1044
GetByteContext::buffer
const uint8_t * buffer
Definition: bytestream.h:34
PNG_COLOR_TYPE_RGB
#define PNG_COLOR_TYPE_RGB
Definition: png.h:35
ff_png_decoder
const FFCodec ff_png_decoder
bits
uint8_t bits
Definition: vp3data.h:128
AV_EF_IGNORE_ERR
#define AV_EF_IGNORE_ERR
ignore errors and continue
Definition: defs.h:53
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
PNGDecContext::hdr_state
enum PNGHeaderState hdr_state
Definition: pngdec.c:98
AVCodecContext::bits_per_raw_sample
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
Definition: avcodec.h:1565
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
PNGDecContext::iccp_data
uint8_t * iccp_data
Definition: pngdec.c:74
ff_progress_frame_unref
void ff_progress_frame_unref(ProgressFrame *f)
Give up a reference to the underlying frame contained in a ProgressFrame and reset the ProgressFrame,...
Definition: decode.c:1950
ff_progress_frame_await
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before ff_progress_frame_await() has been called on them. reget_buffer() and buffer age optimizations no longer work. *The contents of buffers must not be written to after ff_progress_frame_report() has been called on them. This includes draw_edges(). Porting codecs to frame threading
channels
channels
Definition: aptx.h:31
decode.h
percent_missing
static int percent_missing(PNGDecContext *s)
Definition: pngdec.c:331
av_csp_primaries_id_from_desc
enum AVColorPrimaries av_csp_primaries_id_from_desc(const AVColorPrimariesDesc *prm)
Detects which enum AVColorPrimaries constant corresponds to the given complete gamut description.
Definition: csp.c:115
AVCOL_PRI_UNSPECIFIED
@ AVCOL_PRI_UNSPECIFIED
Definition: pixfmt.h:639
av_fallthrough
#define av_fallthrough
Definition: attributes.h:67
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:332
AV_PIX_FMT_RGBA
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
Definition: pixfmt.h:100
ff_decode_mastering_display_new
int ff_decode_mastering_display_new(const AVCodecContext *avctx, AVFrame *frame, AVMasteringDisplayMetadata **mdm)
Wrapper around av_mastering_display_metadata_create_side_data(), which rejects side data overridden b...
Definition: decode.c:2251
AVCodecContext::codec_id
enum AVCodecID codec_id
Definition: avcodec.h:449
AVStereo3D::flags
int flags
Additional information about the frame packing.
Definition: stereo3d.h:212
AV_CODEC_ID_PNG
@ AV_CODEC_ID_PNG
Definition: codec_id.h:113
if
if(ret)
Definition: filter_design.txt:179
PNGDecContext
Definition: pngdec.c:63
AV_CODEC_CAP_FRAME_THREADS
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: codec.h:95
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:232
AV_PIX_FMT_GRAY8A
@ AV_PIX_FMT_GRAY8A
alias for AV_PIX_FMT_YA8
Definition: pixfmt.h:143
PNGDecContext::cicp_primaries
enum AVColorPrimaries cicp_primaries
Definition: pngdec.c:85
NULL
#define NULL
Definition: coverity.c:32
PNGDecContext::filter_type
int filter_type
Definition: pngdec.c:108
png_decode_idat
static int png_decode_idat(PNGDecContext *s, GetByteContext *gb, uint8_t *dst, ptrdiff_t dst_stride)
Definition: pngdec.c:422
exif_internal.h
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
png_dec_init
static av_cold int png_dec_init(AVCodecContext *avctx)
Definition: pngdec.c:2009
AVCodecContext::color_range
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: avcodec.h:677
av_buffer_unref
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:139
AV_EXIF_TIFF_HEADER
@ AV_EXIF_TIFF_HEADER
The TIFF header starts with 0x49492a00, or 0x4d4d002a.
Definition: exif.h:63
apng.h
pixel
uint8_t pixel
Definition: tiny_ssim.c:41
AV_WB16
#define AV_WB16(p, v)
Definition: intreadwrite.h:401
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AV_PIX_FMT_MONOBLACK
@ AV_PIX_FMT_MONOBLACK
Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb.
Definition: pixfmt.h:83
APNG_BLEND_OP_OVER
@ APNG_BLEND_OP_OVER
Definition: apng.h:38
AVCOL_PRI_BT709
@ AVCOL_PRI_BT709
also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP 177 Annex B
Definition: pixfmt.h:638
PNGDecContext::channels
int channels
Definition: pngdec.c:109
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:278
AV_FRAME_DATA_ICC_PROFILE
@ AV_FRAME_DATA_ICC_PROFILE
The data contains an ICC profile as an opaque octet buffer following the format described by ISO 1507...
Definition: frame.h:144
PNGDecContext::exif_data
AVBufferRef * exif_data
Definition: pngdec.c:131
PNG_COLOR_TYPE_GRAY
#define PNG_COLOR_TYPE_GRAY
Definition: png.h:33
bytestream2_get_buffer
static av_always_inline unsigned int bytestream2_get_buffer(GetByteContext *g, uint8_t *dst, unsigned int size)
Definition: bytestream.h:267
UPDATE_THREAD_CONTEXT
#define UPDATE_THREAD_CONTEXT(func)
Definition: codec_internal.h:341
decode_sbit_chunk
static int decode_sbit_chunk(AVCodecContext *avctx, PNGDecContext *s, GetByteContext *gb)
Definition: pngdec.c:1172
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:81
AV_EF_CRCCHECK
#define AV_EF_CRCCHECK
Verify checksums embedded in the bitstream (could be of either encoded or decoded data,...
Definition: defs.h:48
apng_reset_background
static void apng_reset_background(PNGDecContext *s, const AVFrame *p)
Definition: pngdec.c:1467
AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_UNSPECIFIED
Definition: pixfmt.h:743
output_frame
static int output_frame(PNGDecContext *s, AVFrame *f)
Definition: pngdec.c:1843
png_pass_mask
static const uint8_t png_pass_mask[NB_PASSES]
Definition: pngdec.c:135
PNGDecContext::pass
int pass
Definition: pngdec.c:124
PNGDecContext::iccp_name
uint8_t iccp_name[82]
Definition: pngdec.c:73
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:28
APNG_DISPOSE_OP_PREVIOUS
@ APNG_DISPOSE_OP_PREVIOUS
Definition: apng.h:33
handle_small_bpp
static void handle_small_bpp(PNGDecContext *s, AVFrame *p)
Definition: pngdec.c:1212
PNG_FILTER_VALUE_NONE
#define PNG_FILTER_VALUE_NONE
Definition: png.h:40
f
f
Definition: af_crystalizer.c:122
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:551
AV_PIX_FMT_RGB24
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition: pixfmt.h:75
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
PNGDecContext::gb
GetByteContext gb
Definition: pngdec.c:67
AVPacket::size
int size
Definition: packet.h:596
ff_decode_exif_attach_buffer
int ff_decode_exif_attach_buffer(AVCodecContext *avctx, AVFrame *frame, AVBufferRef **pbuf, enum AVExifHeaderMode header_mode)
Attach the data buffer to the frame.
Definition: decode.c:2484
handle_p_frame_png
static void handle_p_frame_png(PNGDecContext *s, AVFrame *p)
Definition: pngdec.c:1356
height
#define height
Definition: dsp.h:89
av_frame_ref
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition: frame.c:278
av_bprint_finalize
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:235
codec_internal.h
PNGDecContext::white_point
uint32_t white_point[2]
Definition: pngdec.c:80
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
av_frame_copy
int av_frame_copy(AVFrame *dst, const AVFrame *src)
Copy the frame data from src to dst.
Definition: frame.c:711
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
png_put_interlaced_row
static void png_put_interlaced_row(uint8_t *dst, int width, int bits_per_pixel, int pass, int color_type, const uint8_t *src)
Definition: pngdec.c:152
AV_PIX_FMT_YA16BE
@ AV_PIX_FMT_YA16BE
16 bits gray, 16 bits alpha (big-endian)
Definition: pixfmt.h:209
PNG_FILTER_VALUE_AVG
#define PNG_FILTER_VALUE_AVG
Definition: png.h:43
size
int size
Definition: twinvq_data.h:10344
av_make_q
static AVRational av_make_q(int num, int den)
Create an AVRational.
Definition: rational.h:71
ff_frame_new_side_data
int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrame *frame, enum AVFrameSideDataType type, size_t size, AVFrameSideData **psd)
Wrapper around av_frame_new_side_data, which rejects side data overridden by the demuxer.
Definition: decode.c:2172
AV_RB32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
Definition: bytestream.h:96
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.
AVFrameSideData::data
uint8_t * data
Definition: frame.h:291
PNG_FILTER_VALUE_PAETH
#define PNG_FILTER_VALUE_PAETH
Definition: png.h:44
AV_RL24
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_RL24
Definition: bytestream.h:93
PNGDecContext::buffer
uint8_t * buffer
Definition: pngdec.c:122
PNGDecContext::zstream
FFZStream zstream
Definition: pngdec.c:129
av_isgraph
static av_const int av_isgraph(int c)
Locale-independent conversion of ASCII isgraph.
Definition: avstring.h:210
PNG_FILTER_VALUE_UP
#define PNG_FILTER_VALUE_UP
Definition: png.h:42
FF_COMPLIANCE_NORMAL
#define FF_COMPLIANCE_NORMAL
Definition: defs.h:60
av_isdigit
static av_const int av_isdigit(int c)
Locale-independent conversion of ASCII isdigit.
Definition: avstring.h:202
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
PNGDecContext::dispose_op
uint8_t dispose_op
Definition: pngdec.c:103
csp.h
av_crc_get_table
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
Definition: crc.c:389
AVERROR_EXTERNAL
#define AVERROR_EXTERNAL
Generic error in an external library.
Definition: error.h:59
attributes.h
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:601
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
av_buffer_alloc
AVBufferRef * av_buffer_alloc(size_t size)
Allocate an AVBuffer of the given size using av_malloc().
Definition: buffer.c:77
decode_trns_chunk
static int decode_trns_chunk(AVCodecContext *avctx, PNGDecContext *s, GetByteContext *gb)
Definition: pngdec.c:1091
av_zero_extend
#define av_zero_extend
Definition: common.h:151
AV_STEREO3D_FLAG_INVERT
#define AV_STEREO3D_FLAG_INVERT
Inverted views, Right/Bottom represents the left view.
Definition: stereo3d.h:194
PNGSIG
#define PNGSIG
Definition: png.h:49
PNGDecContext::buffer_size
int buffer_size
Definition: pngdec.c:123
populate_avctx_color_fields
static int populate_avctx_color_fields(AVCodecContext *avctx, AVFrame *frame)
Definition: pngdec.c:758
FF_THREAD_FRAME
#define FF_THREAD_FRAME
Decode more than one frame at once.
Definition: avcodec.h:1584
PNGDecContext::stereo_mode
int stereo_mode
Definition: pngdec.c:77
ff_pngdsp_init
av_cold void ff_pngdsp_init(PNGDSPContext *dsp)
Definition: pngdsp.c:85
av_image_get_linesize
int av_image_get_linesize(enum AVPixelFormat pix_fmt, int width, int plane)
Compute the size of an image line with format pix_fmt and width width for the plane plane.
Definition: imgutils.c:76
PNGDecContext::frame_metadata
AVDictionary * frame_metadata
Definition: pngdec.c:71
PNGDSPContext::add_bytes_l2
void(* add_bytes_l2)(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int w)
Definition: pngdsp.h:30
APNG_DISPOSE_OP_BACKGROUND
@ APNG_DISPOSE_OP_BACKGROUND
Definition: apng.h:32
PNGDecContext::significant_bits
int significant_bits
Definition: pngdec.c:114
PNG_FILTER_VALUE_SUB
#define PNG_FILTER_VALUE_SUB
Definition: png.h:41
bprint.h
AV_PIX_FMT_RGB48BE
@ AV_PIX_FMT_RGB48BE
packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big...
Definition: pixfmt.h:109
av_malloc
#define av_malloc(s)
Definition: ops_asmgen.c:44
AVCodecContext::extradata
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition: avcodec.h:522
decode_exif_chunk
static int decode_exif_chunk(AVCodecContext *avctx, PNGDecContext *s, GetByteContext *gb)
Definition: pngdec.c:736
PNGDecContext::x_offset
int x_offset
Definition: pngdec.c:102
PNGDecContext::display_primaries
uint32_t display_primaries[3][2]
Definition: pngdec.c:81
ff_png_filter_row
void ff_png_filter_row(PNGDSPContext *dsp, uint8_t *dst, int filter_type, const uint8_t *src, const uint8_t *last, int size, int bpp)
Definition: pngdec.c:260
PNGDecContext::mdcv_primaries
uint16_t mdcv_primaries[3][2]
Definition: pngdec.c:93
av_bprint_get_buffer
void av_bprint_get_buffer(AVBPrint *buf, unsigned size, unsigned char **mem, unsigned *actual_size)
Allocate bytes in the buffer for external use.
Definition: bprint.c:218
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:58
png_handle_row
static void png_handle_row(PNGDecContext *s, uint8_t *dst, ptrdiff_t dst_stride)
Definition: pngdec.c:341
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
FF_DEBUG_STARTCODE
#define FF_DEBUG_STARTCODE
Definition: avcodec.h:1394
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
decode_fctl_chunk
static int decode_fctl_chunk(AVCodecContext *avctx, PNGDecContext *s, GetByteContext *gb)
Definition: pngdec.c:1285
decode_plte_chunk
static int decode_plte_chunk(AVCodecContext *avctx, PNGDecContext *s, GetByteContext *gb)
Definition: pngdec.c:1068
av_frame_unref
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:496
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
AVMasteringDisplayMetadata
Mastering display metadata capable of representing the color volume of the display used to master the...
Definition: mastering_display_metadata.h:38
len
int len
Definition: vorbis_enc_data.h:426
ff_inflate_end
void ff_inflate_end(FFZStream *zstream)
Wrapper around inflateEnd().
GetByteContext::buffer_end
const uint8_t * buffer_end
Definition: bytestream.h:34
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:639
AV_FRAME_FLAG_INTERLACED
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition: frame.h:657
PNGDecContext::avctx
AVCodecContext * avctx
Definition: pngdec.c:65
PNGDSPContext::add_paeth_prediction
void(* add_paeth_prediction)(uint8_t *dst, const uint8_t *src, const uint8_t *top, int w, int bpp)
Definition: pngdsp.h:35
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:760
FF_CODEC_CAP_ICC_PROFILES
#define FF_CODEC_CAP_ICC_PROFILES
Codec supports embedded ICC profiles (AV_FRAME_DATA_ICC_PROFILE).
Definition: codec_internal.h:82
avcodec.h
PNGHeaderState
PNGHeaderState
Definition: pngdec.c:53
AV_PIX_FMT_PAL8
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
Definition: pixfmt.h:84
tag
uint32_t tag
Definition: movenc.c:2046
ret
ret
Definition: filter_design.txt:187
pixfmt.h
FFSWAP
#define FFSWAP(type, a, b)
Definition: macros.h:52
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
PNGDecContext::iccp_data_len
size_t iccp_data_len
Definition: pngdec.c:75
AVCodecContext::strict_std_compliance
int strict_std_compliance
strictly follow the standard (MPEG-4, ...).
Definition: avcodec.h:1369
AVStereo3D::type
enum AVStereo3DType type
How views are packed within the video.
Definition: stereo3d.h:207
ff_decode_content_light_new
int ff_decode_content_light_new(const AVCodecContext *avctx, AVFrame *frame, AVContentLightMetadata **clm)
Wrapper around av_content_light_metadata_create_side_data(), which rejects side data overridden by th...
Definition: decode.c:2296
av_bprintf
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:122
ff_thread_finish_setup
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before as well as code calling up to before the decode process starts Call ff_thread_finish_setup() afterwards. If some code can 't be moved
PNGDecContext::compression_type
int compression_type
Definition: pngdec.c:106
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
U
#define U(x)
Definition: vpx_arith.h:37
ff_progress_frame_replace
void ff_progress_frame_replace(ProgressFrame *dst, const ProgressFrame *src)
Do nothing if dst and src already refer to the same AVFrame; otherwise unreference dst and if src is ...
Definition: decode.c:1957
iso88591_to_utf8
static char * iso88591_to_utf8(const char *in, size_t size_in)
Definition: pngdec.c:495
PNG_IHDR
@ PNG_IHDR
Definition: pngdec.c:54
AVCodecContext
main external API structure.
Definition: avcodec.h:439
AVCodecContext::active_thread_type
int active_thread_type
Which multithreading methods are in use by the codec.
Definition: avcodec.h:1592
decode_frame_common
static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s, AVFrame *p, const AVPacket *avpkt)
Definition: pngdec.c:1483
av_crc
uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)
Calculate the CRC of a block.
Definition: crc.c:421
UNROLL_FILTER
#define UNROLL_FILTER(op)
Definition: pngdec.c:245
AVRational::den
int den
Denominator.
Definition: rational.h:60
mode
mode
Definition: ebur128.h:83
PNGDecContext::last_picture
ProgressFrame last_picture
Definition: pngdec.c:68
PNGDecContext::mdcv_min_lum
uint32_t mdcv_min_lum
Definition: pngdec.c:96
PNGDecContext::transparent_color_be
uint8_t transparent_color_be[6]
Definition: pngdec.c:113
update_thread_context
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before as well as code calling up to before the decode process starts Call have update_thread_context() run it in the next thread. Add AV_CODEC_CAP_FRAME_THREADS to the codec capabilities. There will be very little speed gain at this point but it should work. Use ff_thread_get_buffer()(or ff_progress_frame_get_buffer() in case you have inter-frame dependencies and use the ProgressFrame API) to allocate frame buffers. Call ff_progress_frame_report() after some part of the current picture has decoded. A good place to put this is where draw_horiz_band() is called - add this if it isn 't called anywhere
av_fast_padded_mallocz
void av_fast_padded_mallocz(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_padded_malloc except that buffer will always be 0-initialized after call.
Definition: utils.c:66
PNGDecContext::have_chrm
int have_chrm
Definition: pngdec.c:79
png_pass_dsp_mask
static const uint8_t png_pass_dsp_mask[NB_PASSES]
Definition: pngdec.c:145
AVCodecContext::discard_damaged_percentage
int discard_damaged_percentage
The percentage of damaged samples to discard a frame.
Definition: avcodec.h:1829
ff_png_get_nb_channels
int ff_png_get_nb_channels(int color_type)
Definition: png.c:41
PNG_COLOR_MASK_PALETTE
#define PNG_COLOR_MASK_PALETTE
Definition: png.h:29
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
AVMasteringDisplayMetadata::min_luminance
AVRational min_luminance
Min luminance of mastering display (cd/m^2).
Definition: mastering_display_metadata.h:52
decode_text_to_exif
static int decode_text_to_exif(PNGDecContext *s, const char *txt_utf8)
Definition: pngdec.c:519
AVCodecContext::debug
int debug
debug
Definition: avcodec.h:1386
PNG_IDAT
@ PNG_IDAT
Definition: pngdec.c:59
AV_CRC_32_IEEE_LE
@ AV_CRC_32_IEEE_LE
Definition: crc.h:53
decode_iccp_chunk
static int decode_iccp_chunk(PNGDecContext *s, GetByteContext *gb)
Definition: pngdec.c:1139
desc
const char * desc
Definition: libsvtav1.c:83
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
FFZStream
Definition: zlib_wrapper.h:27
mem.h
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
mastering_display_metadata.h
decode_ihdr_chunk
static int decode_ihdr_chunk(AVCodecContext *avctx, PNGDecContext *s, GetByteContext *gb)
Definition: pngdec.c:669
PNGDecContext::dsp
PNGDSPContext dsp
Definition: pngdec.c:64
av_stereo3d_create_side_data
AVStereo3D * av_stereo3d_create_side_data(AVFrame *frame)
Allocate a complete AVFrameSideData and add it to the frame.
Definition: stereo3d.c:53
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:37
AVFrameSideData
Structure to hold side data for an AVFrame.
Definition: frame.h:289
w
uint8_t w
Definition: llvidencdsp.c:39
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVCodecContext::codec_tag
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
Definition: avcodec.h:464
ProgressFrame
The ProgressFrame structure.
Definition: progressframe.h:73
AVPacket
This structure stores compressed data.
Definition: packet.h:572
AVContentLightMetadata::MaxFALL
unsigned MaxFALL
Max average light level per frame (cd/m^2).
Definition: mastering_display_metadata.h:116
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:466
png.h
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
ff_inflate_init
int ff_inflate_init(FFZStream *zstream, void *logctx)
Wrapper around inflateInit().
ff_png_add_paeth_prediction
void ff_png_add_paeth_prediction(uint8_t *dst, const uint8_t *src, const uint8_t *top, int w, int bpp)
Definition: pngdsp.c:58
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
PNG_COLOR_TYPE_GRAY_ALPHA
#define PNG_COLOR_TYPE_GRAY_ALPHA
Definition: png.h:37
AVFrameSideData::metadata
AVDictionary * metadata
Definition: frame.h:293
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
AVCOL_TRC_SMPTE428
@ AVCOL_TRC_SMPTE428
SMPTE ST 428-1.
Definition: pixfmt.h:685
MNGSIG
#define MNGSIG
Definition: png.h:50
PNGDecContext::cicp_trc
enum AVColorTransferCharacteristic cicp_trc
Definition: pngdec.c:86
PNGDecContext::interlace_type
int interlace_type
Definition: pngdec.c:107
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
AVStereo3D
Stereo 3D type: this structure describes how two videos are packed within a single video surface,...
Definition: stereo3d.h:203
handle_p_frame_apng
static int handle_p_frame_apng(AVCodecContext *avctx, PNGDecContext *s, AVFrame *p)
Definition: pngdec.c:1378
PNGDecContext::y
int y
Definition: pngdec.c:128
av_image_check_size
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
Definition: imgutils.c:318
OP_SUB
#define OP_SUB(x, s, l)
width
#define width
Definition: dsp.h:89
PNGDecContext::have_mdcv
int have_mdcv
Definition: pngdec.c:92
AVColorRange
AVColorRange
Visual content value range.
Definition: pixfmt.h:742
decode_zbuf
static int decode_zbuf(AVBPrint *bp, const uint8_t *data, const uint8_t *data_end, void *logctx)
Definition: pngdec.c:453
PNGDecContext::cur_w
int cur_w
Definition: pngdec.c:101
AVCodecContext::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.
Definition: avcodec.h:624
PNG_COLOR_TYPE_PALETTE
#define PNG_COLOR_TYPE_PALETTE
Definition: png.h:34
src
#define src
Definition: vp8dsp.c:248
AV_DICT_DONT_STRDUP_KEY
#define AV_DICT_DONT_STRDUP_KEY
Take ownership of a key that's been allocated with av_malloc() or another memory allocation function.
Definition: dict.h:77
PNGDecContext::bpp
int bpp
Definition: pngdec.c:111
av_get_pix_fmt_name
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:3376
PNGDecContext::has_trns
int has_trns
Definition: pngdec.c:112
av_fourcc2str
#define av_fourcc2str(fourcc)
Definition: avutil.h:347