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 "libavutil/bprint.h"
25 #include "libavutil/imgutils.h"
26 #include "avcodec.h"
27 #include "bytestream.h"
28 #include "internal.h"
29 #include "png.h"
30 #include "pngdsp.h"
31 
32 /* TODO:
33  * - add 16 bit depth support
34  */
35 
36 #include <zlib.h>
37 
38 //#define DEBUG
39 
40 typedef struct PNGDecContext {
43 
46 
47  int state;
48  int width, height;
49  int bit_depth;
54  int channels;
56  int bpp;
57 
60  uint32_t palette[256];
64  int pass;
65  int crow_size; /* compressed row size (include filter type) */
66  int row_size; /* decompressed row size */
67  int pass_row_size; /* decompress row size of the current pass */
68  int y;
69  z_stream zstream;
71 
72 /* Mask to determine which pixels are valid in a pass */
73 static const uint8_t png_pass_mask[NB_PASSES] = {
74  0x01, 0x01, 0x11, 0x11, 0x55, 0x55, 0xff,
75 };
76 
77 /* Mask to determine which y pixels can be written in a pass */
79  0xff, 0xff, 0x0f, 0xff, 0x33, 0xff, 0x55,
80 };
81 
82 /* Mask to determine which pixels to overwrite while displaying */
84  0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff
85 };
86 
87 /* NOTE: we try to construct a good looking image at each pass. width
88  is the original image width. We also do pixel format conversion at
89  this stage */
91  int bits_per_pixel, int pass,
92  int color_type, const uint8_t *src)
93 {
94  int x, mask, dsp_mask, j, src_x, b, bpp;
95  uint8_t *d;
96  const uint8_t *s;
97 
98  mask = png_pass_mask[pass];
99  dsp_mask = png_pass_dsp_mask[pass];
100 
101  switch (bits_per_pixel) {
102  case 1:
103  src_x = 0;
104  for (x = 0; x < width; x++) {
105  j = (x & 7);
106  if ((dsp_mask << j) & 0x80) {
107  b = (src[src_x >> 3] >> (7 - (src_x & 7))) & 1;
108  dst[x >> 3] &= 0xFF7F>>j;
109  dst[x >> 3] |= b << (7 - j);
110  }
111  if ((mask << j) & 0x80)
112  src_x++;
113  }
114  break;
115  case 2:
116  src_x = 0;
117  for (x = 0; x < width; x++) {
118  int j2 = 2 * (x & 3);
119  j = (x & 7);
120  if ((dsp_mask << j) & 0x80) {
121  b = (src[src_x >> 2] >> (6 - 2*(src_x & 3))) & 3;
122  dst[x >> 2] &= 0xFF3F>>j2;
123  dst[x >> 2] |= b << (6 - j2);
124  }
125  if ((mask << j) & 0x80)
126  src_x++;
127  }
128  break;
129  case 4:
130  src_x = 0;
131  for (x = 0; x < width; x++) {
132  int j2 = 4*(x&1);
133  j = (x & 7);
134  if ((dsp_mask << j) & 0x80) {
135  b = (src[src_x >> 1] >> (4 - 4*(src_x & 1))) & 15;
136  dst[x >> 1] &= 0xFF0F>>j2;
137  dst[x >> 1] |= b << (4 - j2);
138  }
139  if ((mask << j) & 0x80)
140  src_x++;
141  }
142  break;
143  default:
144  bpp = bits_per_pixel >> 3;
145  d = dst;
146  s = src;
147  for (x = 0; x < width; x++) {
148  j = x & 7;
149  if ((dsp_mask << j) & 0x80) {
150  memcpy(d, s, bpp);
151  }
152  d += bpp;
153  if ((mask << j) & 0x80)
154  s += bpp;
155  }
156  break;
157  }
158 }
159 
161 {
162  int i;
163  for (i = 0; i < w; i++) {
164  int a, b, c, p, pa, pb, pc;
165 
166  a = dst[i - bpp];
167  b = top[i];
168  c = top[i - bpp];
169 
170  p = b - c;
171  pc = a - c;
172 
173  pa = abs(p);
174  pb = abs(pc);
175  pc = abs(p + pc);
176 
177  if (pa <= pb && pa <= pc)
178  p = a;
179  else if (pb <= pc)
180  p = b;
181  else
182  p = c;
183  dst[i] = p + src[i];
184  }
185 }
186 
187 #define UNROLL1(bpp, op) {\
188  r = dst[0];\
189  if(bpp >= 2) g = dst[1];\
190  if(bpp >= 3) b = dst[2];\
191  if(bpp >= 4) a = dst[3];\
192  for(; i <= size - bpp; i+=bpp) {\
193  dst[i+0] = r = op(r, src[i+0], last[i+0]);\
194  if(bpp == 1) continue;\
195  dst[i+1] = g = op(g, src[i+1], last[i+1]);\
196  if(bpp == 2) continue;\
197  dst[i+2] = b = op(b, src[i+2], last[i+2]);\
198  if(bpp == 3) continue;\
199  dst[i+3] = a = op(a, src[i+3], last[i+3]);\
200  }\
201 }
202 
203 #define UNROLL_FILTER(op)\
204  if(bpp == 1) UNROLL1(1, op)\
205  else if(bpp == 2) UNROLL1(2, op)\
206  else if(bpp == 3) UNROLL1(3, op)\
207  else if(bpp == 4) UNROLL1(4, op)\
208  for (; i < size; i++) {\
209  dst[i] = op(dst[i-bpp], src[i], last[i]);\
210  }\
211 
212 /* NOTE: 'dst' can be equal to 'last' */
214  uint8_t *src, uint8_t *last, int size, int bpp)
215 {
216  int i, p, r, g, b, a;
217 
218  switch (filter_type) {
220  memcpy(dst, src, size);
221  break;
223  for (i = 0; i < bpp; i++) {
224  dst[i] = src[i];
225  }
226  if (bpp == 4) {
227  p = *(int*)dst;
228  for (; i < size; i += bpp) {
229  int s = *(int*)(src + i);
230  p = ((s & 0x7f7f7f7f) + (p & 0x7f7f7f7f)) ^ ((s ^ p) & 0x80808080);
231  *(int*)(dst + i) = p;
232  }
233  } else {
234 #define OP_SUB(x,s,l) x+s
236  }
237  break;
238  case PNG_FILTER_VALUE_UP:
239  dsp->add_bytes_l2(dst, src, last, size);
240  break;
242  for (i = 0; i < bpp; i++) {
243  p = (last[i] >> 1);
244  dst[i] = p + src[i];
245  }
246 #define OP_AVG(x,s,l) (((x + l) >> 1) + s) & 0xff
248  break;
250  for (i = 0; i < bpp; i++) {
251  p = last[i];
252  dst[i] = p + src[i];
253  }
254  if (bpp > 2 && size > 4) {
255  // would write off the end of the array if we let it process the last pixel with bpp=3
256  int w = bpp == 4 ? size : size - 3;
257  dsp->add_paeth_prediction(dst + i, src + i, last + i, w - i, bpp);
258  i = w;
259  }
260  ff_add_png_paeth_prediction(dst + i, src + i, last + i, size - i, bpp);
261  break;
262  }
263 }
264 
265 /* This used to be called "deloco" in FFmpeg
266  * and is actually an inverse reversible colorspace transformation */
267 #define YUV2RGB(NAME, TYPE) \
268 static void deloco_ ## NAME(TYPE *dst, int size, int alpha) \
269 { \
270  int i; \
271  for (i = 0; i < size; i += 3 + alpha) { \
272  int g = dst [i+1]; \
273  dst[i+0] += g; \
274  dst[i+2] += g; \
275  } \
276 }
277 
278 YUV2RGB(rgb8, uint8_t)
279 YUV2RGB(rgb16, uint16_t)
280 
281 /* process exactly one decompressed row */
283 {
284  uint8_t *ptr, *last_row;
285  int got_line;
286 
287  if (!s->interlace_type) {
288  ptr = s->image_buf + s->image_linesize * s->y;
289  if (s->y == 0)
290  last_row = s->last_row;
291  else
292  last_row = ptr - s->image_linesize;
293 
294  png_filter_row(&s->dsp, ptr, s->crow_buf[0], s->crow_buf + 1,
295  last_row, s->row_size, s->bpp);
296  /* loco lags by 1 row so that it doesn't interfere with top prediction */
297  if (s->filter_type == PNG_FILTER_TYPE_LOCO && s->y > 0) {
298  if (s->bit_depth == 16) {
299  deloco_rgb16((uint16_t *)(ptr - s->image_linesize), s->row_size / 2,
300  s->color_type == PNG_COLOR_TYPE_RGB_ALPHA);
301  } else {
302  deloco_rgb8(ptr - s->image_linesize, s->row_size,
303  s->color_type == PNG_COLOR_TYPE_RGB_ALPHA);
304  }
305  }
306  s->y++;
307  if (s->y == s->height) {
308  s->state |= PNG_ALLIMAGE;
309  if (s->filter_type == PNG_FILTER_TYPE_LOCO) {
310  if (s->bit_depth == 16) {
311  deloco_rgb16((uint16_t *)ptr, s->row_size / 2,
312  s->color_type == PNG_COLOR_TYPE_RGB_ALPHA);
313  } else {
314  deloco_rgb8(ptr, s->row_size,
315  s->color_type == PNG_COLOR_TYPE_RGB_ALPHA);
316  }
317  }
318  }
319  } else {
320  got_line = 0;
321  for (;;) {
322  ptr = s->image_buf + s->image_linesize * s->y;
323  if ((ff_png_pass_ymask[s->pass] << (s->y & 7)) & 0x80) {
324  /* if we already read one row, it is time to stop to
325  wait for the next one */
326  if (got_line)
327  break;
328  png_filter_row(&s->dsp, s->tmp_row, s->crow_buf[0], s->crow_buf + 1,
329  s->last_row, s->pass_row_size, s->bpp);
330  FFSWAP(uint8_t*, s->last_row, s->tmp_row);
331  got_line = 1;
332  }
333  if ((png_pass_dsp_ymask[s->pass] << (s->y & 7)) & 0x80) {
334  png_put_interlaced_row(ptr, s->width, s->bits_per_pixel, s->pass,
335  s->color_type, s->last_row);
336  }
337  s->y++;
338  if (s->y == s->height) {
339  memset(s->last_row, 0, s->row_size);
340  for (;;) {
341  if (s->pass == NB_PASSES - 1) {
342  s->state |= PNG_ALLIMAGE;
343  goto the_end;
344  } else {
345  s->pass++;
346  s->y = 0;
347  s->pass_row_size = ff_png_pass_row_size(s->pass,
348  s->bits_per_pixel,
349  s->width);
350  s->crow_size = s->pass_row_size + 1;
351  if (s->pass_row_size != 0)
352  break;
353  /* skip pass if empty row */
354  }
355  }
356  }
357  }
358  the_end: ;
359  }
360 }
361 
363 {
364  int ret;
365  s->zstream.avail_in = FFMIN(length, bytestream2_get_bytes_left(&s->gb));
366  s->zstream.next_in = (unsigned char *)s->gb.buffer;
367  bytestream2_skip(&s->gb, length);
368 
369  /* decode one line if possible */
370  while (s->zstream.avail_in > 0) {
371  ret = inflate(&s->zstream, Z_PARTIAL_FLUSH);
372  if (ret != Z_OK && ret != Z_STREAM_END) {
373  av_log(s->avctx, AV_LOG_ERROR, "inflate returned %d\n", ret);
374  return -1;
375  }
376  if (s->zstream.avail_out == 0) {
377  if (!(s->state & PNG_ALLIMAGE)) {
378  png_handle_row(s);
379  }
380  s->zstream.avail_out = s->crow_size;
381  s->zstream.next_out = s->crow_buf;
382  }
383  }
384  return 0;
385 }
386 
387 static int decode_zbuf(AVBPrint *bp, const uint8_t *data,
388  const uint8_t *data_end)
389 {
390  z_stream zstream;
391  unsigned char *buf;
392  unsigned buf_size;
393  int ret;
394 
395  zstream.zalloc = ff_png_zalloc;
396  zstream.zfree = ff_png_zfree;
397  zstream.opaque = NULL;
398  if (inflateInit(&zstream) != Z_OK)
399  return AVERROR_EXTERNAL;
400  zstream.next_in = (unsigned char *)data;
401  zstream.avail_in = data_end - data;
402  av_bprint_init(bp, 0, -1);
403 
404  while (zstream.avail_in > 0) {
405  av_bprint_get_buffer(bp, 1, &buf, &buf_size);
406  if (!buf_size) {
407  ret = AVERROR(ENOMEM);
408  goto fail;
409  }
410  zstream.next_out = buf;
411  zstream.avail_out = buf_size;
412  ret = inflate(&zstream, Z_PARTIAL_FLUSH);
413  if (ret != Z_OK && ret != Z_STREAM_END) {
414  ret = AVERROR_EXTERNAL;
415  goto fail;
416  }
417  bp->len += zstream.next_out - buf;
418  if (ret == Z_STREAM_END)
419  break;
420  }
421  inflateEnd(&zstream);
422  bp->str[bp->len] = 0;
423  return 0;
424 
425 fail:
426  inflateEnd(&zstream);
428  return ret;
429 }
430 
431 static uint8_t *iso88591_to_utf8(const uint8_t *in, size_t size_in)
432 {
433  size_t extra = 0, i;
434  uint8_t *out, *q;
435 
436  for (i = 0; i < size_in; i++)
437  extra += in[i] >= 0x80;
438  if (size_in == SIZE_MAX || extra > SIZE_MAX - size_in - 1)
439  return NULL;
440  q = out = av_malloc(size_in + extra + 1);
441  if (!out)
442  return NULL;
443  for (i = 0; i < size_in; i++) {
444  if (in[i] >= 0x80) {
445  *(q++) = 0xC0 | (in[i] >> 6);
446  *(q++) = 0x80 | (in[i] & 0x3F);
447  } else {
448  *(q++) = in[i];
449  }
450  }
451  *(q++) = 0;
452  return out;
453 }
454 
455 static int decode_text_chunk(PNGDecContext *s, uint32_t length, int compressed,
456  AVDictionary **dict)
457 {
458  int ret, method;
459  const uint8_t *data = s->gb.buffer;
460  const uint8_t *data_end = data + length;
461  const uint8_t *keyword = data;
462  const uint8_t *keyword_end = memchr(keyword, 0, data_end - keyword);
463  uint8_t *kw_utf8 = NULL, *text, *txt_utf8 = NULL;
464  unsigned text_len;
465  AVBPrint bp;
466 
467  if (!keyword_end)
468  return AVERROR_INVALIDDATA;
469  data = keyword_end + 1;
470 
471  if (compressed) {
472  if (data == data_end)
473  return AVERROR_INVALIDDATA;
474  method = *(data++);
475  if (method)
476  return AVERROR_INVALIDDATA;
477  if ((ret = decode_zbuf(&bp, data, data_end)) < 0)
478  return ret;
479  text_len = bp.len;
480  av_bprint_finalize(&bp, (char **)&text);
481  if (!text)
482  return AVERROR(ENOMEM);
483  } else {
484  text = (uint8_t *)data;
485  text_len = data_end - text;
486  }
487 
488  kw_utf8 = iso88591_to_utf8(keyword, keyword_end - keyword);
489  txt_utf8 = iso88591_to_utf8(text, text_len);
490  if (text != data)
491  av_free(text);
492  if (!(kw_utf8 && txt_utf8)) {
493  av_free(kw_utf8);
494  av_free(txt_utf8);
495  return AVERROR(ENOMEM);
496  }
497 
498  av_dict_set(dict, kw_utf8, txt_utf8,
500  return 0;
501 }
502 
504  void *data, int *got_frame,
505  AVPacket *avpkt)
506 {
507  PNGDecContext * const s = avctx->priv_data;
508  const uint8_t *buf = avpkt->data;
509  int buf_size = avpkt->size;
510  AVFrame *p = data;
511  AVDictionary *metadata = NULL;
512  uint8_t *crow_buf_base = NULL;
513  uint32_t tag, length;
514  int64_t sig;
515  int ret;
516 
517  bytestream2_init(&s->gb, buf, buf_size);
518 
519  /* check signature */
520  sig = bytestream2_get_be64(&s->gb);
521  if (sig != PNGSIG &&
522  sig != MNGSIG) {
523  av_log(avctx, AV_LOG_ERROR, "Missing png signature\n");
524  return -1;
525  }
526 
527  s->y = s->state = 0;
528 
529  /* init the zlib */
530  s->zstream.zalloc = ff_png_zalloc;
531  s->zstream.zfree = ff_png_zfree;
532  s->zstream.opaque = NULL;
533  ret = inflateInit(&s->zstream);
534  if (ret != Z_OK) {
535  av_log(avctx, AV_LOG_ERROR, "inflateInit returned %d\n", ret);
536  return -1;
537  }
538  for (;;) {
539  if (bytestream2_get_bytes_left(&s->gb) <= 0) {
540  av_log(avctx, AV_LOG_ERROR, "No bytes left\n");
541  goto fail;
542  }
543 
544  length = bytestream2_get_be32(&s->gb);
545  if (length > 0x7fffffff || length > bytestream2_get_bytes_left(&s->gb)) {
546  av_log(avctx, AV_LOG_ERROR, "chunk too big\n");
547  goto fail;
548  }
549  tag = bytestream2_get_le32(&s->gb);
550  if (avctx->debug & FF_DEBUG_STARTCODE)
551  av_log(avctx, AV_LOG_DEBUG, "png: tag=%c%c%c%c length=%u\n",
552  (tag & 0xff),
553  ((tag >> 8) & 0xff),
554  ((tag >> 16) & 0xff),
555  ((tag >> 24) & 0xff), length);
556  switch (tag) {
557  case MKTAG('I', 'H', 'D', 'R'):
558  if (length != 13)
559  goto fail;
560  s->width = bytestream2_get_be32(&s->gb);
561  s->height = bytestream2_get_be32(&s->gb);
562  if (av_image_check_size(s->width, s->height, 0, avctx)) {
563  s->width = s->height = 0;
564  av_log(avctx, AV_LOG_ERROR, "Invalid image size\n");
565  goto fail;
566  }
567  s->bit_depth = bytestream2_get_byte(&s->gb);
568  s->color_type = bytestream2_get_byte(&s->gb);
569  s->compression_type = bytestream2_get_byte(&s->gb);
570  s->filter_type = bytestream2_get_byte(&s->gb);
571  s->interlace_type = bytestream2_get_byte(&s->gb);
572  bytestream2_skip(&s->gb, 4); /* crc */
573  s->state |= PNG_IHDR;
574  if (avctx->debug & FF_DEBUG_PICT_INFO)
575  av_log(avctx, AV_LOG_DEBUG, "width=%d height=%d depth=%d color_type=%d "
576  "compression_type=%d filter_type=%d interlace_type=%d\n",
577  s->width, s->height, s->bit_depth, s->color_type,
579  break;
580  case MKTAG('p', 'H', 'Y', 's'):
581  if (s->state & PNG_IDAT) {
582  av_log(avctx, AV_LOG_ERROR, "pHYs after IDAT\n");
583  goto fail;
584  }
585  avctx->sample_aspect_ratio.num = bytestream2_get_be32(&s->gb);
586  avctx->sample_aspect_ratio.den = bytestream2_get_be32(&s->gb);
587  if (avctx->sample_aspect_ratio.num < 0 || avctx->sample_aspect_ratio.den < 0)
588  avctx->sample_aspect_ratio = (AVRational){ 0, 1 };
589  bytestream2_skip(&s->gb, 1); /* unit specifier */
590  bytestream2_skip(&s->gb, 4); /* crc */
591  break;
592  case MKTAG('I', 'D', 'A', 'T'):
593  if (!(s->state & PNG_IHDR)) {
594  av_log(avctx, AV_LOG_ERROR, "IDAT without IHDR\n");
595  goto fail;
596  }
597  if (!(s->state & PNG_IDAT)) {
598  /* init image info */
599  avctx->width = s->width;
600  avctx->height = s->height;
601 
603  s->bits_per_pixel = s->bit_depth * s->channels;
604  s->bpp = (s->bits_per_pixel + 7) >> 3;
605  s->row_size = (avctx->width * s->bits_per_pixel + 7) >> 3;
606 
607  if ((s->bit_depth == 2 || s->bit_depth == 4 || s->bit_depth == 8) &&
609  avctx->pix_fmt = AV_PIX_FMT_RGB24;
610  } else if ((s->bit_depth == 2 || s->bit_depth == 4 || s->bit_depth == 8) &&
612  avctx->pix_fmt = AV_PIX_FMT_RGBA;
613  } else if ((s->bit_depth == 2 || s->bit_depth == 4 || s->bit_depth == 8) &&
615  avctx->pix_fmt = AV_PIX_FMT_GRAY8;
616  } else if (s->bit_depth == 16 &&
618  avctx->pix_fmt = AV_PIX_FMT_GRAY16BE;
619  } else if (s->bit_depth == 16 &&
621  avctx->pix_fmt = AV_PIX_FMT_RGB48BE;
622  } else if (s->bit_depth == 16 &&
624  avctx->pix_fmt = AV_PIX_FMT_RGBA64BE;
625  } else if ((s->bits_per_pixel == 1 || s->bits_per_pixel == 2 || s->bits_per_pixel == 4 || s->bits_per_pixel == 8) &&
627  avctx->pix_fmt = AV_PIX_FMT_PAL8;
628  } else if (s->bit_depth == 1) {
629  avctx->pix_fmt = AV_PIX_FMT_MONOBLACK;
630  } else if (s->bit_depth == 8 &&
632  avctx->pix_fmt = AV_PIX_FMT_Y400A;
633  } else {
634  av_log(avctx, AV_LOG_ERROR, "unsupported bit depth %d "
635  "and color type %d\n",
636  s->bit_depth, s->color_type);
637  goto fail;
638  }
639 
640  if (ff_get_buffer(avctx, p, AV_GET_BUFFER_FLAG_REF) < 0)
641  goto fail;
643  p->key_frame = 1;
645 
646  /* compute the compressed row size */
647  if (!s->interlace_type) {
648  s->crow_size = s->row_size + 1;
649  } else {
650  s->pass = 0;
652  s->bits_per_pixel,
653  s->width);
654  s->crow_size = s->pass_row_size + 1;
655  }
656  av_dlog(avctx, "row_size=%d crow_size =%d\n",
657  s->row_size, s->crow_size);
658  s->image_buf = p->data[0];
659  s->image_linesize = p->linesize[0];
660  /* copy the palette if needed */
661  if (avctx->pix_fmt == AV_PIX_FMT_PAL8)
662  memcpy(p->data[1], s->palette, 256 * sizeof(uint32_t));
663  /* empty row is used if differencing to the first row */
664  s->last_row = av_mallocz(s->row_size);
665  if (!s->last_row)
666  goto fail;
667  if (s->interlace_type ||
669  s->tmp_row = av_malloc(s->row_size);
670  if (!s->tmp_row)
671  goto fail;
672  }
673  /* compressed row */
674  crow_buf_base = av_malloc(s->row_size + 16);
675  if (!crow_buf_base)
676  goto fail;
677 
678  /* we want crow_buf+1 to be 16-byte aligned */
679  s->crow_buf = crow_buf_base + 15;
680  s->zstream.avail_out = s->crow_size;
681  s->zstream.next_out = s->crow_buf;
682  }
683  s->state |= PNG_IDAT;
684  if (png_decode_idat(s, length) < 0)
685  goto fail;
686  bytestream2_skip(&s->gb, 4); /* crc */
687  break;
688  case MKTAG('P', 'L', 'T', 'E'):
689  {
690  int n, i, r, g, b;
691 
692  if ((length % 3) != 0 || length > 256 * 3)
693  goto skip_tag;
694  /* read the palette */
695  n = length / 3;
696  for (i = 0; i < n; i++) {
697  r = bytestream2_get_byte(&s->gb);
698  g = bytestream2_get_byte(&s->gb);
699  b = bytestream2_get_byte(&s->gb);
700  s->palette[i] = (0xFFU << 24) | (r << 16) | (g << 8) | b;
701  }
702  for (; i < 256; i++) {
703  s->palette[i] = (0xFFU << 24);
704  }
705  s->state |= PNG_PLTE;
706  bytestream2_skip(&s->gb, 4); /* crc */
707  }
708  break;
709  case MKTAG('t', 'R', 'N', 'S'):
710  {
711  int v, i;
712 
713  /* read the transparency. XXX: Only palette mode supported */
715  length > 256 ||
716  !(s->state & PNG_PLTE))
717  goto skip_tag;
718  for (i = 0; i < length; i++) {
719  v = bytestream2_get_byte(&s->gb);
720  s->palette[i] = (s->palette[i] & 0x00ffffff) | (v << 24);
721  }
722  bytestream2_skip(&s->gb, 4); /* crc */
723  }
724  break;
725  case MKTAG('t', 'E', 'X', 't'):
726  if (decode_text_chunk(s, length, 0, &metadata) < 0)
727  av_log(avctx, AV_LOG_WARNING, "Broken tEXt chunk\n");
728  bytestream2_skip(&s->gb, length + 4);
729  break;
730  case MKTAG('z', 'T', 'X', 't'):
731  if (decode_text_chunk(s, length, 1, &metadata) < 0)
732  av_log(avctx, AV_LOG_WARNING, "Broken zTXt chunk\n");
733  bytestream2_skip(&s->gb, length + 4);
734  break;
735  case MKTAG('I', 'E', 'N', 'D'):
736  if (!(s->state & PNG_ALLIMAGE))
737  av_log(avctx, AV_LOG_ERROR, "IEND without all image\n");
738  if (!(s->state & (PNG_ALLIMAGE|PNG_IDAT))) {
739  goto fail;
740  }
741  bytestream2_skip(&s->gb, 4); /* crc */
742  goto exit_loop;
743  default:
744  /* skip tag */
745  skip_tag:
746  bytestream2_skip(&s->gb, length + 4);
747  break;
748  }
749  }
750  exit_loop:
751 
752  if (s->bits_per_pixel == 1 && s->color_type == PNG_COLOR_TYPE_PALETTE){
753  int i, j, k;
754  uint8_t *pd = p->data[0];
755  for (j = 0; j < s->height; j++) {
756  i = s->width / 8;
757  for (k = 7; k >= 1; k--)
758  if ((s->width&7) >= k)
759  pd[8*i + k - 1] = (pd[i]>>8-k) & 1;
760  for (i--; i >= 0; i--) {
761  pd[8*i + 7]= pd[i] & 1;
762  pd[8*i + 6]= (pd[i]>>1) & 1;
763  pd[8*i + 5]= (pd[i]>>2) & 1;
764  pd[8*i + 4]= (pd[i]>>3) & 1;
765  pd[8*i + 3]= (pd[i]>>4) & 1;
766  pd[8*i + 2]= (pd[i]>>5) & 1;
767  pd[8*i + 1]= (pd[i]>>6) & 1;
768  pd[8*i + 0]= pd[i]>>7;
769  }
770  pd += s->image_linesize;
771  }
772  }
773  if (s->bits_per_pixel == 2){
774  int i, j;
775  uint8_t *pd = p->data[0];
776  for (j = 0; j < s->height; j++) {
777  i = s->width / 4;
779  if ((s->width&3) >= 3) pd[4*i + 2]= (pd[i] >> 2) & 3;
780  if ((s->width&3) >= 2) pd[4*i + 1]= (pd[i] >> 4) & 3;
781  if ((s->width&3) >= 1) pd[4*i + 0]= pd[i] >> 6;
782  for (i--; i >= 0; i--) {
783  pd[4*i + 3]= pd[i] & 3;
784  pd[4*i + 2]= (pd[i]>>2) & 3;
785  pd[4*i + 1]= (pd[i]>>4) & 3;
786  pd[4*i + 0]= pd[i]>>6;
787  }
788  } else {
789  if ((s->width&3) >= 3) pd[4*i + 2]= ((pd[i]>>2) & 3)*0x55;
790  if ((s->width&3) >= 2) pd[4*i + 1]= ((pd[i]>>4) & 3)*0x55;
791  if ((s->width&3) >= 1) pd[4*i + 0]= ( pd[i]>>6 )*0x55;
792  for (i--; i >= 0; i--) {
793  pd[4*i + 3]= ( pd[i] & 3)*0x55;
794  pd[4*i + 2]= ((pd[i]>>2) & 3)*0x55;
795  pd[4*i + 1]= ((pd[i]>>4) & 3)*0x55;
796  pd[4*i + 0]= ( pd[i]>>6 )*0x55;
797  }
798  }
799  pd += s->image_linesize;
800  }
801  }
802  if (s->bits_per_pixel == 4){
803  int i, j;
804  uint8_t *pd = p->data[0];
805  for (j = 0; j < s->height; j++) {
806  i = s->width/2;
808  if (s->width&1) pd[2*i+0]= pd[i]>>4;
809  for (i--; i >= 0; i--) {
810  pd[2*i + 1] = pd[i] & 15;
811  pd[2*i + 0] = pd[i] >> 4;
812  }
813  } else {
814  if (s->width & 1) pd[2*i + 0]= (pd[i] >> 4) * 0x11;
815  for (i--; i >= 0; i--) {
816  pd[2*i + 1] = (pd[i] & 15) * 0x11;
817  pd[2*i + 0] = (pd[i] >> 4) * 0x11;
818  }
819  }
820  pd += s->image_linesize;
821  }
822  }
823 
824  /* handle p-frames only if a predecessor frame is available */
825  if (s->prev->data[0]) {
826  if ( !(avpkt->flags & AV_PKT_FLAG_KEY)
827  && s->prev->width == p->width
828  && s->prev->height== p->height
829  && s->prev->format== p->format
830  ) {
831  int i, j;
832  uint8_t *pd = p->data[0];
833  uint8_t *pd_last = s->prev->data[0];
834 
835  for (j = 0; j < s->height; j++) {
836  for (i = 0; i < s->width * s->bpp; i++) {
837  pd[i] += pd_last[i];
838  }
839  pd += s->image_linesize;
840  pd_last += s->image_linesize;
841  }
842  }
843  }
844 
845  av_frame_set_metadata(p, metadata);
846  metadata = NULL;
847 
848  av_frame_unref(s->prev);
849  if ((ret = av_frame_ref(s->prev, p)) < 0)
850  goto fail;
851 
852  *got_frame = 1;
853 
854  ret = bytestream2_tell(&s->gb);
855  the_end:
856  inflateEnd(&s->zstream);
857  av_free(crow_buf_base);
858  s->crow_buf = NULL;
859  av_freep(&s->last_row);
860  av_freep(&s->tmp_row);
861  return ret;
862  fail:
863  av_dict_free(&metadata);
864  ret = -1;
865  goto the_end;
866 }
867 
869 {
870  PNGDecContext *s = avctx->priv_data;
871 
872  s->prev = av_frame_alloc();
873  if (!s->prev)
874  return AVERROR(ENOMEM);
875 
876  ff_pngdsp_init(&s->dsp);
877 
878  s->avctx = avctx;
879 
880  return 0;
881 }
882 
884 {
885  PNGDecContext *s = avctx->priv_data;
886 
887  av_frame_free(&s->prev);
888 
889  return 0;
890 }
891 
893  .name = "png",
894  .type = AVMEDIA_TYPE_VIDEO,
895  .id = AV_CODEC_ID_PNG,
896  .priv_data_size = sizeof(PNGDecContext),
897  .init = png_dec_init,
898  .close = png_dec_end,
899  .decode = decode_frame,
900  .capabilities = CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
901  .long_name = NULL_IF_CONFIG_SMALL("PNG (Portable Network Graphics) image"),
902 };
AVFrame * prev
Definition: pngdec.c:45
#define PNG_FILTER_VALUE_AVG
Definition: png.h:41
static void png_handle_row(PNGDecContext *s)
Definition: pngdec.c:282
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:205
float v
const char * s
Definition: avisynth_c.h:668
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
int width
Definition: pngdec.c:48
misc image utilities
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition: pixfmt.h:70
int pass_row_size
Definition: pngdec.c:67
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
uint8_t * tmp_row
Definition: pngdec.c:63
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:154
#define PNG_PLTE
Definition: png.h:48
int num
numerator
Definition: rational.h:44
static int decode_text_chunk(PNGDecContext *s, uint32_t length, int compressed, AVDictionary **dict)
Definition: pngdec.c:455
About Git write you should know how to use GIT properly Luckily Git comes with excellent documentation git help man git shows you the available git< command > help man git< command > shows information about the subcommand< command > The most comprehensive manual is the website Git Reference visit they are quite exhaustive You do not need a special username or password All you need is to provide a ssh public key to the Git server admin What follows now is a basic introduction to Git and some FFmpeg specific guidelines Read it at least if you are granted commit privileges to the FFmpeg project you are expected to be familiar with these rules I if not You can get git from etc no matter how small Every one of them has been saved from looking like a fool by this many times It s very easy for stray debug output or cosmetic modifications to slip in
Definition: git-howto.txt:5
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel...
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:130
av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (%s)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic?ac->func_descr_generic:ac->func_descr)
#define PNG_COLOR_TYPE_RGB
Definition: png.h:33
void(* add_bytes_l2)(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w)
Definition: pngdsp.h:28
#define PNG_COLOR_TYPE_GRAY_ALPHA
Definition: png.h:35
text(-8, 1,'a)')
#define PNG_COLOR_TYPE_PALETTE
Definition: png.h:32
#define PNG_IHDR
Definition: png.h:45
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:193
output residual component w
int filter_type
Definition: pngdec.c:53
void ff_add_png_paeth_prediction(uint8_t *dst, uint8_t *src, uint8_t *top, int w, int bpp)
Definition: pngdec.c:160
#define AV_DICT_DONT_STRDUP_KEY
Take ownership of a key that&#39;s been allocated with av_malloc() and children.
Definition: dict.h:69
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
set threshold d
#define PNG_FILTER_VALUE_PAETH
Definition: png.h:42
AVCodec ff_png_decoder
Definition: pngdec.c:892
int state
Definition: pngdec.c:47
uint8_t
#define av_cold
Definition: attributes.h:78
#define PNG_COLOR_TYPE_RGB_ALPHA
Definition: png.h:34
8 bit with PIX_FMT_RGB32 palette
Definition: pixfmt.h:79
#define b
Definition: input.c:42
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:209
#define PNG_ALLIMAGE
Definition: png.h:47
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
uint8_t * data
const uint8_t * buffer
Definition: bytestream.h:33
uint32_t tag
Definition: movenc.c:894
int interlaced_frame
The content of the picture is interlaced.
Definition: frame.h:270
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Discrete Time axis x
#define U(x)
int width
width and height of the video frame
Definition: frame.h:122
static const uint8_t png_pass_dsp_mask[NB_PASSES]
Definition: pngdec.c:83
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:183
static const uint16_t mask[17]
Definition: lzw.c:37
#define OP_SUB(x, s, l)
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
Definition: bytestream.h:159
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Init a print buffer.
Definition: bprint.c:68
uint8_t * crow_buf
Definition: pngdec.c:61
Spectrum Plot time data
const char * r
Definition: vf_curves.c:94
int pass
Definition: pngdec.c:64
int ff_png_get_nb_channels(int color_type)
Definition: png.c:49
int height
Definition: pngdec.c:48
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values. ...
Definition: dict.c:162
static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g)
Definition: bytestream.h:149
#define PNGSIG
Definition: png.h:52
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
int bits_per_pixel
Definition: pngdec.c:55
GetByteContext gb
Definition: pngdec.c:44
external API header
#define NB_PASSES
Definition: png.h:50
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
Definition: pixfmt.h:97
int size
int flags
A combination of AV_PKT_FLAG values.
z_stream zstream
Definition: pngdec.c:69
#define FF_DEBUG_STARTCODE
struct AVRational AVRational
rational number numerator/denominator
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:231
Buffer to print data progressively.
Definition: bprint.h:75
FFT buffer for g
Definition: stft_peak.m:17
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:144
void av_frame_set_metadata(AVFrame *frame, AVDictionary *val)
#define FFMIN(a, b)
Definition: common.h:58
#define PNG_FILTER_VALUE_SUB
Definition: png.h:39
uint32_t palette[256]
Definition: pngdec.c:60
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that&#39;s been allocated with av_malloc() and chilren.
Definition: dict.h:72
#define PNG_COLOR_TYPE_GRAY
Definition: png.h:31
ret
Definition: avfilter.c:821
static void png_filter_row(PNGDSPContext *dsp, uint8_t *dst, int filter_type, uint8_t *src, uint8_t *last, int size, int bpp)
Definition: pngdec.c:213
int width
picture width / height.
uint8_t * last_row
Definition: pngdec.c:62
AVCodecContext * avctx
Definition: pngdec.c:42
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:176
static int decode_zbuf(AVBPrint *bp, const uint8_t *data, const uint8_t *data_end)
Definition: pngdec.c:387
int channels
Definition: pngdec.c:54
static uint8_t * iso88591_to_utf8(const uint8_t *in, size_t size_in)
Definition: pngdec.c:431
static av_always_inline int bytestream2_tell(GetByteContext *g)
Definition: bytestream.h:183
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames...
Definition: frame.h:134
for k
static av_cold int png_dec_init(AVCodecContext *avctx)
Definition: pngdec.c:868
NULL
Definition: eval.c:55
AVS_Value src
Definition: avisynth_c.h:523
#define PNG_FILTER_VALUE_UP
Definition: png.h:40
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:101
#define PNG_FILTER_TYPE_LOCO
Definition: png.h:37
main external API structure.
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
int interlace_type
Definition: pngdec.c:52
void * buf
Definition: avisynth_c.h:594
const uint8_t ff_png_pass_ymask[NB_PASSES]
Definition: png.c:25
int image_linesize
Definition: pngdec.c:59
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:62
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
Y , 16bpp, big-endian.
Definition: pixfmt.h:101
synthesis window for stochastic i
#define OP_AVG(x, s, l)
struct PNGDecContext PNGDecContext
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:330
uint8_t * image_buf
Definition: pngdec.c:58
void ff_pngdsp_init(PNGDSPContext *dsp)
Definition: pngdsp.c:42
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer 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.Buffer references ownership and permissions
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:95
#define AV_PIX_FMT_Y400A
Definition: pixfmt.h:250
int av_frame_ref(AVFrame *dst, AVFrame *src)
Setup a new reference to the data described by an given frame.
Definition: frame.c:228
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
#define FF_DEBUG_PICT_INFO
#define YUV2RGB(NAME, TYPE)
Definition: pngdec.c:267
static const uint8_t png_pass_mask[NB_PASSES]
Definition: pngdec.c:73
Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb...
Definition: pixfmt.h:78
#define PNG_IDAT
Definition: png.h:46
Y , 8bpp.
Definition: pixfmt.h:76
static av_cold int png_dec_end(AVCodecContext *avctx)
Definition: pngdec.c:883
void(* add_paeth_prediction)(uint8_t *dst, uint8_t *src, uint8_t *top, int w, int bpp)
Definition: pngdsp.h:33
common internal api header.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:162
#define PNG_FILTER_VALUE_NONE
Definition: png.h:38
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:108
static double c[64]
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:111
static const uint8_t png_pass_dsp_ymask[NB_PASSES]
Definition: pngdec.c:78
int den
denominator
Definition: rational.h:45
void ff_png_zfree(void *opaque, void *ptr)
Definition: png.c:44
static int png_decode_idat(PNGDecContext *s, int length)
Definition: pngdec.c:362
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:139
int row_size
Definition: pngdec.c:66
PNGDSPContext dsp
Definition: pngdec.c:41
int compression_type
Definition: pngdec.c:51
int ff_png_pass_row_size(int pass, int bits_per_pixel, int width)
Definition: png.c:62
int height
Definition: frame.h:122
int bit_depth
Definition: pngdec.c:49
int color_type
Definition: pngdec.c:50
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> out
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
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:90
#define FFSWAP(type, a, b)
Definition: common.h:61
const char int length
Definition: avisynth_c.h:668
int crow_size
Definition: pngdec.c:65
#define MKTAG(a, b, c, d)
Definition: common.h:282
void * ff_png_zalloc(void *opaque, unsigned int items, unsigned int size)
Definition: png.c:39
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: pngdec.c:503
#define AVERROR_EXTERNAL
Generic error in an external library.
Definition: error.h:57
This structure stores compressed data.
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
#define UNROLL_FILTER(op)
Definition: pngdec.c:203
#define MNGSIG
Definition: png.h:53