GCC Code Coverage Report
Directory: ../../../ffmpeg/ Exec Total Coverage
File: src/libavcodec/pngdec.c Lines: 608 1064 57.1 %
Date: 2019-11-22 03:34:36 Branches: 386 786 49.1 %

Line Branch Exec Source
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/avassert.h"
25
#include "libavutil/bprint.h"
26
#include "libavutil/imgutils.h"
27
#include "libavutil/intreadwrite.h"
28
#include "libavutil/stereo3d.h"
29
#include "libavutil/mastering_display_metadata.h"
30
31
#include "avcodec.h"
32
#include "bytestream.h"
33
#include "internal.h"
34
#include "apng.h"
35
#include "png.h"
36
#include "pngdsp.h"
37
#include "thread.h"
38
39
#include <zlib.h>
40
41
enum PNGHeaderState {
42
    PNG_IHDR = 1 << 0,
43
    PNG_PLTE = 1 << 1,
44
};
45
46
enum PNGImageState {
47
    PNG_IDAT     = 1 << 0,
48
    PNG_ALLIMAGE = 1 << 1,
49
};
50
51
typedef struct PNGDecContext {
52
    PNGDSPContext dsp;
53
    AVCodecContext *avctx;
54
55
    GetByteContext gb;
56
    ThreadFrame previous_picture;
57
    ThreadFrame last_picture;
58
    ThreadFrame picture;
59
60
    enum PNGHeaderState hdr_state;
61
    enum PNGImageState pic_state;
62
    int width, height;
63
    int cur_w, cur_h;
64
    int last_w, last_h;
65
    int x_offset, y_offset;
66
    int last_x_offset, last_y_offset;
67
    uint8_t dispose_op, blend_op;
68
    uint8_t last_dispose_op;
69
    int bit_depth;
70
    int color_type;
71
    int compression_type;
72
    int interlace_type;
73
    int filter_type;
74
    int channels;
75
    int bits_per_pixel;
76
    int bpp;
77
    int has_trns;
78
    uint8_t transparent_color_be[6];
79
80
    uint8_t *image_buf;
81
    int image_linesize;
82
    uint32_t palette[256];
83
    uint8_t *crow_buf;
84
    uint8_t *last_row;
85
    unsigned int last_row_size;
86
    uint8_t *tmp_row;
87
    unsigned int tmp_row_size;
88
    uint8_t *buffer;
89
    int buffer_size;
90
    int pass;
91
    int crow_size; /* compressed row size (include filter type) */
92
    int row_size; /* decompressed row size */
93
    int pass_row_size; /* decompress row size of the current pass */
94
    int y;
95
    z_stream zstream;
96
} PNGDecContext;
97
98
/* Mask to determine which pixels are valid in a pass */
99
static const uint8_t png_pass_mask[NB_PASSES] = {
100
    0x01, 0x01, 0x11, 0x11, 0x55, 0x55, 0xff,
101
};
102
103
/* Mask to determine which y pixels can be written in a pass */
104
static const uint8_t png_pass_dsp_ymask[NB_PASSES] = {
105
    0xff, 0xff, 0x0f, 0xff, 0x33, 0xff, 0x55,
106
};
107
108
/* Mask to determine which pixels to overwrite while displaying */
109
static const uint8_t png_pass_dsp_mask[NB_PASSES] = {
110
    0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff
111
};
112
113
/* NOTE: we try to construct a good looking image at each pass. width
114
 * is the original image width. We also do pixel format conversion at
115
 * this stage */
116
1408
static void png_put_interlaced_row(uint8_t *dst, int width,
117
                                   int bits_per_pixel, int pass,
118
                                   int color_type, const uint8_t *src)
119
{
120
    int x, mask, dsp_mask, j, src_x, b, bpp;
121
    uint8_t *d;
122
    const uint8_t *s;
123
124
1408
    mask     = png_pass_mask[pass];
125
1408
    dsp_mask = png_pass_dsp_mask[pass];
126
127

1408
    switch (bits_per_pixel) {
128
    case 1:
129
        src_x = 0;
130
        for (x = 0; x < width; x++) {
131
            j = (x & 7);
132
            if ((dsp_mask << j) & 0x80) {
133
                b = (src[src_x >> 3] >> (7 - (src_x & 7))) & 1;
134
                dst[x >> 3] &= 0xFF7F>>j;
135
                dst[x >> 3] |= b << (7 - j);
136
            }
137
            if ((mask << j) & 0x80)
138
                src_x++;
139
        }
140
        break;
141
    case 2:
142
        src_x = 0;
143
        for (x = 0; x < width; x++) {
144
            int j2 = 2 * (x & 3);
145
            j = (x & 7);
146
            if ((dsp_mask << j) & 0x80) {
147
                b = (src[src_x >> 2] >> (6 - 2*(src_x & 3))) & 3;
148
                dst[x >> 2] &= 0xFF3F>>j2;
149
                dst[x >> 2] |= b << (6 - j2);
150
            }
151
            if ((mask << j) & 0x80)
152
                src_x++;
153
        }
154
        break;
155
    case 4:
156
        src_x = 0;
157
        for (x = 0; x < width; x++) {
158
            int j2 = 4*(x&1);
159
            j = (x & 7);
160
            if ((dsp_mask << j) & 0x80) {
161
                b = (src[src_x >> 1] >> (4 - 4*(src_x & 1))) & 15;
162
                dst[x >> 1] &= 0xFF0F>>j2;
163
                dst[x >> 1] |= b << (4 - j2);
164
            }
165
            if ((mask << j) & 0x80)
166
                src_x++;
167
        }
168
        break;
169
1408
    default:
170
1408
        bpp = bits_per_pixel >> 3;
171
1408
        d   = dst;
172
1408
        s   = src;
173
181632
            for (x = 0; x < width; x++) {
174
180224
                j = x & 7;
175
180224
                if ((dsp_mask << j) & 0x80) {
176
131072
                    memcpy(d, s, bpp);
177
                }
178
180224
                d += bpp;
179
180224
                if ((mask << j) & 0x80)
180
61440
                    s += bpp;
181
            }
182
1408
        break;
183
    }
184
1408
}
185
186
13000
void ff_add_png_paeth_prediction(uint8_t *dst, uint8_t *src, uint8_t *top,
187
                                 int w, int bpp)
188
{
189
    int i;
190
4820674
    for (i = 0; i < w; i++) {
191
        int a, b, c, p, pa, pb, pc;
192
193
4807674
        a = dst[i - bpp];
194
4807674
        b = top[i];
195
4807674
        c = top[i - bpp];
196
197
4807674
        p  = b - c;
198
4807674
        pc = a - c;
199
200
4807674
        pa = abs(p);
201
4807674
        pb = abs(pc);
202
4807674
        pc = abs(p + pc);
203
204

4807674
        if (pa <= pb && pa <= pc)
205
2726778
            p = a;
206
2080896
        else if (pb <= pc)
207
1790946
            p = b;
208
        else
209
289950
            p = c;
210
4807674
        dst[i] = p + src[i];
211
    }
212
13000
}
213
214
#define UNROLL1(bpp, op)                                                      \
215
    {                                                                         \
216
        r = dst[0];                                                           \
217
        if (bpp >= 2)                                                         \
218
            g = dst[1];                                                       \
219
        if (bpp >= 3)                                                         \
220
            b = dst[2];                                                       \
221
        if (bpp >= 4)                                                         \
222
            a = dst[3];                                                       \
223
        for (; i <= size - bpp; i += bpp) {                                   \
224
            dst[i + 0] = r = op(r, src[i + 0], last[i + 0]);                  \
225
            if (bpp == 1)                                                     \
226
                continue;                                                     \
227
            dst[i + 1] = g = op(g, src[i + 1], last[i + 1]);                  \
228
            if (bpp == 2)                                                     \
229
                continue;                                                     \
230
            dst[i + 2] = b = op(b, src[i + 2], last[i + 2]);                  \
231
            if (bpp == 3)                                                     \
232
                continue;                                                     \
233
            dst[i + 3] = a = op(a, src[i + 3], last[i + 3]);                  \
234
        }                                                                     \
235
    }
236
237
#define UNROLL_FILTER(op)                                                     \
238
    if (bpp == 1) {                                                           \
239
        UNROLL1(1, op)                                                        \
240
    } else if (bpp == 2) {                                                    \
241
        UNROLL1(2, op)                                                        \
242
    } else if (bpp == 3) {                                                    \
243
        UNROLL1(3, op)                                                        \
244
    } else if (bpp == 4) {                                                    \
245
        UNROLL1(4, op)                                                        \
246
    }                                                                         \
247
    for (; i < size; i++) {                                                   \
248
        dst[i] = op(dst[i - bpp], src[i], last[i]);                           \
249
    }
250
251
/* NOTE: 'dst' can be equal to 'last' */
252
94072
static void png_filter_row(PNGDSPContext *dsp, uint8_t *dst, int filter_type,
253
                           uint8_t *src, uint8_t *last, int size, int bpp)
254
{
255
    int i, p, r, g, b, a;
256
257

94072
    switch (filter_type) {
258
77546
    case PNG_FILTER_VALUE_NONE:
259
77546
        memcpy(dst, src, size);
260
77546
        break;
261
2304
    case PNG_FILTER_VALUE_SUB:
262
10819
        for (i = 0; i < bpp; i++)
263
8515
            dst[i] = src[i];
264
2304
        if (bpp == 4) {
265
1573
            p = *(int *)dst;
266
272180
            for (; i < size; i += bpp) {
267
270607
                unsigned s = *(int *)(src + i);
268
270607
                p = ((s & 0x7f7f7f7f) + (p & 0x7f7f7f7f)) ^ ((s ^ p) & 0x80808080);
269
270607
                *(int *)(dst + i) = p;
270
            }
271
        } else {
272
#define OP_SUB(x, s, l) ((x) + (s))
273




210220
            UNROLL_FILTER(OP_SUB);
274
        }
275
2304
        break;
276
6751
    case PNG_FILTER_VALUE_UP:
277
6751
        dsp->add_bytes_l2(dst, src, last, size);
278
6751
        break;
279
805
    case PNG_FILTER_VALUE_AVG:
280
3532
        for (i = 0; i < bpp; i++) {
281
2727
            p      = (last[i] >> 1);
282
2727
            dst[i] = p + src[i];
283
        }
284
#define OP_AVG(x, s, l) (((((x) + (l)) >> 1) + (s)) & 0xff)
285




161268
        UNROLL_FILTER(OP_AVG);
286
805
        break;
287
6666
    case PNG_FILTER_VALUE_PAETH:
288
28992
        for (i = 0; i < bpp; i++) {
289
22326
            p      = last[i];
290
22326
            dst[i] = p + src[i];
291
        }
292

6666
        if (bpp > 2 && size > 4) {
293
            /* would write off the end of the array if we let it process
294
             * the last pixel with bpp=3 */
295
6596
            int w = (bpp & 3) ? size - 3 : size;
296
297
6596
            if (w > i) {
298
6596
                dsp->add_paeth_prediction(dst + i, src + i, last + i, size - i, bpp);
299
6596
                i = w;
300
            }
301
        }
302
6666
        ff_add_png_paeth_prediction(dst + i, src + i, last + i, size - i, bpp);
303
6666
        break;
304
    }
305
94072
}
306
307
/* This used to be called "deloco" in FFmpeg
308
 * and is actually an inverse reversible colorspace transformation */
309
#define YUV2RGB(NAME, TYPE) \
310
static void deloco_ ## NAME(TYPE *dst, int size, int alpha) \
311
{ \
312
    int i; \
313
    for (i = 0; i < size; i += 3 + alpha) { \
314
        int g = dst [i + 1]; \
315
        dst[i + 0] += g; \
316
        dst[i + 2] += g; \
317
    } \
318
}
319
320
YUV2RGB(rgb8, uint8_t)
321
YUV2RGB(rgb16, uint16_t)
322
323
/* process exactly one decompressed row */
324
94072
static void png_handle_row(PNGDecContext *s)
325
{
326
    uint8_t *ptr, *last_row;
327
    int got_line;
328
329
94072
    if (!s->interlace_type) {
330
93592
        ptr = s->image_buf + s->image_linesize * (s->y + s->y_offset) + s->x_offset * s->bpp;
331
93592
        if (s->y == 0)
332
448
            last_row = s->last_row;
333
        else
334
93144
            last_row = ptr - s->image_linesize;
335
336
93592
        png_filter_row(&s->dsp, ptr, s->crow_buf[0], s->crow_buf + 1,
337
                       last_row, s->row_size, s->bpp);
338
        /* loco lags by 1 row so that it doesn't interfere with top prediction */
339

93592
        if (s->filter_type == PNG_FILTER_TYPE_LOCO && s->y > 0) {
340
            if (s->bit_depth == 16) {
341
                deloco_rgb16((uint16_t *)(ptr - s->image_linesize), s->row_size / 2,
342
                             s->color_type == PNG_COLOR_TYPE_RGB_ALPHA);
343
            } else {
344
                deloco_rgb8(ptr - s->image_linesize, s->row_size,
345
                            s->color_type == PNG_COLOR_TYPE_RGB_ALPHA);
346
            }
347
        }
348
93592
        s->y++;
349
93592
        if (s->y == s->cur_h) {
350
448
            s->pic_state |= PNG_ALLIMAGE;
351
448
            if (s->filter_type == PNG_FILTER_TYPE_LOCO) {
352
                if (s->bit_depth == 16) {
353
                    deloco_rgb16((uint16_t *)ptr, s->row_size / 2,
354
                                 s->color_type == PNG_COLOR_TYPE_RGB_ALPHA);
355
                } else {
356
                    deloco_rgb8(ptr, s->row_size,
357
                                s->color_type == PNG_COLOR_TYPE_RGB_ALPHA);
358
                }
359
            }
360
        }
361
    } else {
362
480
        got_line = 0;
363
        for (;;) {
364
2270
            ptr = s->image_buf + s->image_linesize * (s->y + s->y_offset) + s->x_offset * s->bpp;
365
2270
            if ((ff_png_pass_ymask[s->pass] << (s->y & 7)) & 0x80) {
366
                /* if we already read one row, it is time to stop to
367
                 * wait for the next one */
368
958
                if (got_line)
369
478
                    break;
370
480
                png_filter_row(&s->dsp, s->tmp_row, s->crow_buf[0], s->crow_buf + 1,
371
                               s->last_row, s->pass_row_size, s->bpp);
372
480
                FFSWAP(uint8_t *, s->last_row, s->tmp_row);
373
480
                FFSWAP(unsigned int, s->last_row_size, s->tmp_row_size);
374
480
                got_line = 1;
375
            }
376
1792
            if ((png_pass_dsp_ymask[s->pass] << (s->y & 7)) & 0x80) {
377
1408
                png_put_interlaced_row(ptr, s->cur_w, s->bits_per_pixel, s->pass,
378
1408
                                       s->color_type, s->last_row);
379
            }
380
1792
            s->y++;
381
1792
            if (s->y == s->cur_h) {
382
14
                memset(s->last_row, 0, s->row_size);
383
                for (;;) {
384
14
                    if (s->pass == NB_PASSES - 1) {
385
2
                        s->pic_state |= PNG_ALLIMAGE;
386
2
                        goto the_end;
387
                    } else {
388
12
                        s->pass++;
389
12
                        s->y = 0;
390
12
                        s->pass_row_size = ff_png_pass_row_size(s->pass,
391
                                                                s->bits_per_pixel,
392
                                                                s->cur_w);
393
12
                        s->crow_size = s->pass_row_size + 1;
394
12
                        if (s->pass_row_size != 0)
395
12
                            break;
396
                        /* skip pass if empty row */
397
                    }
398
                }
399
            }
400
        }
401
94072
the_end:;
402
    }
403
94072
}
404
405
15613
static int png_decode_idat(PNGDecContext *s, int length)
406
{
407
    int ret;
408
15613
    s->zstream.avail_in = FFMIN(length, bytestream2_get_bytes_left(&s->gb));
409
15613
    s->zstream.next_in  = (unsigned char *)s->gb.buffer;
410
15613
    bytestream2_skip(&s->gb, length);
411
412
    /* decode one line if possible */
413
124825
    while (s->zstream.avail_in > 0) {
414
109212
        ret = inflate(&s->zstream, Z_PARTIAL_FLUSH);
415

109212
        if (ret != Z_OK && ret != Z_STREAM_END) {
416
            av_log(s->avctx, AV_LOG_ERROR, "inflate returned error %d\n", ret);
417
            return AVERROR_EXTERNAL;
418
        }
419
109212
        if (s->zstream.avail_out == 0) {
420
94072
            if (!(s->pic_state & PNG_ALLIMAGE)) {
421
94072
                png_handle_row(s);
422
            }
423
94072
            s->zstream.avail_out = s->crow_size;
424
94072
            s->zstream.next_out  = s->crow_buf;
425
        }
426

109212
        if (ret == Z_STREAM_END && s->zstream.avail_in > 0) {
427
            av_log(s->avctx, AV_LOG_WARNING,
428
                   "%d undecompressed bytes left in buffer\n", s->zstream.avail_in);
429
            return 0;
430
        }
431
    }
432
15613
    return 0;
433
}
434
435
1
static int decode_zbuf(AVBPrint *bp, const uint8_t *data,
436
                       const uint8_t *data_end)
437
{
438
    z_stream zstream;
439
    unsigned char *buf;
440
    unsigned buf_size;
441
    int ret;
442
443
1
    zstream.zalloc = ff_png_zalloc;
444
1
    zstream.zfree  = ff_png_zfree;
445
1
    zstream.opaque = NULL;
446
1
    if (inflateInit(&zstream) != Z_OK)
447
        return AVERROR_EXTERNAL;
448
1
    zstream.next_in  = (unsigned char *)data;
449
1
    zstream.avail_in = data_end - data;
450
1
    av_bprint_init(bp, 0, AV_BPRINT_SIZE_UNLIMITED);
451
452
3
    while (zstream.avail_in > 0) {
453
3
        av_bprint_get_buffer(bp, 2, &buf, &buf_size);
454
3
        if (buf_size < 2) {
455
            ret = AVERROR(ENOMEM);
456
            goto fail;
457
        }
458
3
        zstream.next_out  = buf;
459
3
        zstream.avail_out = buf_size - 1;
460
3
        ret = inflate(&zstream, Z_PARTIAL_FLUSH);
461

3
        if (ret != Z_OK && ret != Z_STREAM_END) {
462
            ret = AVERROR_EXTERNAL;
463
            goto fail;
464
        }
465
3
        bp->len += zstream.next_out - buf;
466
3
        if (ret == Z_STREAM_END)
467
1
            break;
468
    }
469
1
    inflateEnd(&zstream);
470
1
    bp->str[bp->len] = 0;
471
1
    return 0;
472
473
fail:
474
    inflateEnd(&zstream);
475
    av_bprint_finalize(bp, NULL);
476
    return ret;
477
}
478
479
226
static uint8_t *iso88591_to_utf8(const uint8_t *in, size_t size_in)
480
{
481
226
    size_t extra = 0, i;
482
    uint8_t *out, *q;
483
484
3938
    for (i = 0; i < size_in; i++)
485
3712
        extra += in[i] >= 0x80;
486

226
    if (size_in == SIZE_MAX || extra > SIZE_MAX - size_in - 1)
487
        return NULL;
488
226
    q = out = av_malloc(size_in + extra + 1);
489
226
    if (!out)
490
        return NULL;
491
3938
    for (i = 0; i < size_in; i++) {
492
3712
        if (in[i] >= 0x80) {
493
            *(q++) = 0xC0 | (in[i] >> 6);
494
            *(q++) = 0x80 | (in[i] & 0x3F);
495
        } else {
496
3712
            *(q++) = in[i];
497
        }
498
    }
499
226
    *(q++) = 0;
500
226
    return out;
501
}
502
503
113
static int decode_text_chunk(PNGDecContext *s, uint32_t length, int compressed,
504
                             AVDictionary **dict)
505
{
506
    int ret, method;
507
113
    const uint8_t *data        = s->gb.buffer;
508
113
    const uint8_t *data_end    = data + length;
509
113
    const uint8_t *keyword     = data;
510
113
    const uint8_t *keyword_end = memchr(keyword, 0, data_end - keyword);
511
113
    uint8_t *kw_utf8 = NULL, *text, *txt_utf8 = NULL;
512
    unsigned text_len;
513
    AVBPrint bp;
514
515
113
    if (!keyword_end)
516
        return AVERROR_INVALIDDATA;
517
113
    data = keyword_end + 1;
518
519
113
    if (compressed) {
520
        if (data == data_end)
521
            return AVERROR_INVALIDDATA;
522
        method = *(data++);
523
        if (method)
524
            return AVERROR_INVALIDDATA;
525
        if ((ret = decode_zbuf(&bp, data, data_end)) < 0)
526
            return ret;
527
        text_len = bp.len;
528
        ret = av_bprint_finalize(&bp, (char **)&text);
529
        if (ret < 0)
530
            return ret;
531
    } else {
532
113
        text = (uint8_t *)data;
533
113
        text_len = data_end - text;
534
    }
535
536
113
    kw_utf8  = iso88591_to_utf8(keyword, keyword_end - keyword);
537
113
    txt_utf8 = iso88591_to_utf8(text, text_len);
538
113
    if (text != data)
539
        av_free(text);
540

113
    if (!(kw_utf8 && txt_utf8)) {
541
        av_free(kw_utf8);
542
        av_free(txt_utf8);
543
        return AVERROR(ENOMEM);
544
    }
545
546
113
    av_dict_set(dict, kw_utf8, txt_utf8,
547
                AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL);
548
113
    return 0;
549
}
550
551
359
static int decode_ihdr_chunk(AVCodecContext *avctx, PNGDecContext *s,
552
                             uint32_t length)
553
{
554
359
    if (length != 13)
555
        return AVERROR_INVALIDDATA;
556
557
359
    if (s->pic_state & PNG_IDAT) {
558
        av_log(avctx, AV_LOG_ERROR, "IHDR after IDAT\n");
559
        return AVERROR_INVALIDDATA;
560
    }
561
562
359
    if (s->hdr_state & PNG_IHDR) {
563
        av_log(avctx, AV_LOG_ERROR, "Multiple IHDR\n");
564
        return AVERROR_INVALIDDATA;
565
    }
566
567
359
    s->width  = s->cur_w = bytestream2_get_be32(&s->gb);
568
359
    s->height = s->cur_h = bytestream2_get_be32(&s->gb);
569
359
    if (av_image_check_size(s->width, s->height, 0, avctx)) {
570
        s->cur_w = s->cur_h = s->width = s->height = 0;
571
        av_log(avctx, AV_LOG_ERROR, "Invalid image size\n");
572
        return AVERROR_INVALIDDATA;
573
    }
574
359
    s->bit_depth        = bytestream2_get_byte(&s->gb);
575

359
    if (s->bit_depth != 1 && s->bit_depth != 2 && s->bit_depth != 4 &&
576

359
        s->bit_depth != 8 && s->bit_depth != 16) {
577
        av_log(avctx, AV_LOG_ERROR, "Invalid bit depth\n");
578
        goto error;
579
    }
580
359
    s->color_type       = bytestream2_get_byte(&s->gb);
581
359
    s->compression_type = bytestream2_get_byte(&s->gb);
582
359
    if (s->compression_type) {
583
        av_log(avctx, AV_LOG_ERROR, "Invalid compression method %d\n", s->compression_type);
584
        goto error;
585
    }
586
359
    s->filter_type      = bytestream2_get_byte(&s->gb);
587
359
    s->interlace_type   = bytestream2_get_byte(&s->gb);
588
359
    bytestream2_skip(&s->gb, 4); /* crc */
589
359
    s->hdr_state |= PNG_IHDR;
590
359
    if (avctx->debug & FF_DEBUG_PICT_INFO)
591
        av_log(avctx, AV_LOG_DEBUG, "width=%d height=%d depth=%d color_type=%d "
592
                "compression_type=%d filter_type=%d interlace_type=%d\n",
593
                s->width, s->height, s->bit_depth, s->color_type,
594
                s->compression_type, s->filter_type, s->interlace_type);
595
596
359
    return 0;
597
error:
598
    s->cur_w = s->cur_h = s->width = s->height = 0;
599
    s->bit_depth = 8;
600
    return AVERROR_INVALIDDATA;
601
}
602
603
333
static int decode_phys_chunk(AVCodecContext *avctx, PNGDecContext *s)
604
{
605
333
    if (s->pic_state & PNG_IDAT) {
606
        av_log(avctx, AV_LOG_ERROR, "pHYs after IDAT\n");
607
        return AVERROR_INVALIDDATA;
608
    }
609
333
    avctx->sample_aspect_ratio.num = bytestream2_get_be32(&s->gb);
610
333
    avctx->sample_aspect_ratio.den = bytestream2_get_be32(&s->gb);
611

333
    if (avctx->sample_aspect_ratio.num < 0 || avctx->sample_aspect_ratio.den < 0)
612
        avctx->sample_aspect_ratio = (AVRational){ 0, 1 };
613
333
    bytestream2_skip(&s->gb, 1); /* unit specifier */
614
333
    bytestream2_skip(&s->gb, 4); /* crc */
615
616
333
    return 0;
617
}
618
619
15613
static int decode_idat_chunk(AVCodecContext *avctx, PNGDecContext *s,
620
                             uint32_t length, AVFrame *p)
621
{
622
    int ret;
623
15613
    size_t byte_depth = s->bit_depth > 8 ? 2 : 1;
624
625
15613
    if (!(s->hdr_state & PNG_IHDR)) {
626
        av_log(avctx, AV_LOG_ERROR, "IDAT without IHDR\n");
627
        return AVERROR_INVALIDDATA;
628
    }
629
15613
    if (!(s->pic_state & PNG_IDAT)) {
630
        /* init image info */
631
450
        ret = ff_set_dimensions(avctx, s->width, s->height);
632
450
        if (ret < 0)
633
            return ret;
634
635
450
        s->channels       = ff_png_get_nb_channels(s->color_type);
636
450
        s->bits_per_pixel = s->bit_depth * s->channels;
637
450
        s->bpp            = (s->bits_per_pixel + 7) >> 3;
638
450
        s->row_size       = (s->cur_w * s->bits_per_pixel + 7) >> 3;
639
640

450
        if ((s->bit_depth == 2 || s->bit_depth == 4 || s->bit_depth == 8) &&
641
410
                s->color_type == PNG_COLOR_TYPE_RGB) {
642
309
            avctx->pix_fmt = AV_PIX_FMT_RGB24;
643

141
        } else if ((s->bit_depth == 2 || s->bit_depth == 4 || s->bit_depth == 8) &&
644
101
                s->color_type == PNG_COLOR_TYPE_RGB_ALPHA) {
645
54
            avctx->pix_fmt = AV_PIX_FMT_RGBA;
646

87
        } else if ((s->bit_depth == 2 || s->bit_depth == 4 || s->bit_depth == 8) &&
647
47
                s->color_type == PNG_COLOR_TYPE_GRAY) {
648
4
            avctx->pix_fmt = AV_PIX_FMT_GRAY8;
649
83
        } else if (s->bit_depth == 16 &&
650
40
                s->color_type == PNG_COLOR_TYPE_GRAY) {
651
16
            avctx->pix_fmt = AV_PIX_FMT_GRAY16BE;
652
67
        } else if (s->bit_depth == 16 &&
653
24
                s->color_type == PNG_COLOR_TYPE_RGB) {
654
18
            avctx->pix_fmt = AV_PIX_FMT_RGB48BE;
655
49
        } else if (s->bit_depth == 16 &&
656
6
                s->color_type == PNG_COLOR_TYPE_RGB_ALPHA) {
657
4
            avctx->pix_fmt = AV_PIX_FMT_RGBA64BE;
658


45
        } else if ((s->bits_per_pixel == 1 || s->bits_per_pixel == 2 || s->bits_per_pixel == 4 || s->bits_per_pixel == 8) &&
659
41
                s->color_type == PNG_COLOR_TYPE_PALETTE) {
660
41
            avctx->pix_fmt = AV_PIX_FMT_PAL8;
661

4
        } else if (s->bit_depth == 1 && s->bits_per_pixel == 1 && avctx->codec_id != AV_CODEC_ID_APNG) {
662
            avctx->pix_fmt = AV_PIX_FMT_MONOBLACK;
663
4
        } else if (s->bit_depth == 8 &&
664
2
                s->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
665
2
            avctx->pix_fmt = AV_PIX_FMT_YA8;
666
2
        } else if (s->bit_depth == 16 &&
667
2
                s->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
668
2
            avctx->pix_fmt = AV_PIX_FMT_YA16BE;
669
        } else {
670
            avpriv_report_missing_feature(avctx,
671
                                          "Bit depth %d color type %d",
672
                                          s->bit_depth, s->color_type);
673
            return AVERROR_PATCHWELCOME;
674
        }
675
676

450
        if (s->has_trns && s->color_type != PNG_COLOR_TYPE_PALETTE) {
677

2
            switch (avctx->pix_fmt) {
678
2
            case AV_PIX_FMT_RGB24:
679
2
                avctx->pix_fmt = AV_PIX_FMT_RGBA;
680
2
                break;
681
682
            case AV_PIX_FMT_RGB48BE:
683
                avctx->pix_fmt = AV_PIX_FMT_RGBA64BE;
684
                break;
685
686
            case AV_PIX_FMT_GRAY8:
687
                avctx->pix_fmt = AV_PIX_FMT_YA8;
688
                break;
689
690
            case AV_PIX_FMT_GRAY16BE:
691
                avctx->pix_fmt = AV_PIX_FMT_YA16BE;
692
                break;
693
694
            default:
695
                avpriv_request_sample(avctx, "bit depth %d "
696
                        "and color type %d with TRNS",
697
                        s->bit_depth, s->color_type);
698
                return AVERROR_INVALIDDATA;
699
            }
700
701
2
            s->bpp += byte_depth;
702
        }
703
704
450
        if ((ret = ff_thread_get_buffer(avctx, &s->picture, AV_GET_BUFFER_FLAG_REF)) < 0)
705
            return ret;
706

450
        if (avctx->codec_id == AV_CODEC_ID_APNG && s->last_dispose_op != APNG_DISPOSE_OP_PREVIOUS) {
707
101
            ff_thread_release_buffer(avctx, &s->previous_picture);
708
101
            if ((ret = ff_thread_get_buffer(avctx, &s->previous_picture, AV_GET_BUFFER_FLAG_REF)) < 0)
709
                return ret;
710
        }
711
450
        p->pict_type        = AV_PICTURE_TYPE_I;
712
450
        p->key_frame        = 1;
713
450
        p->interlaced_frame = !!s->interlace_type;
714
715
450
        ff_thread_finish_setup(avctx);
716
717
        /* compute the compressed row size */
718
450
        if (!s->interlace_type) {
719
448
            s->crow_size = s->row_size + 1;
720
        } else {
721
2
            s->pass          = 0;
722
2
            s->pass_row_size = ff_png_pass_row_size(s->pass,
723
                    s->bits_per_pixel,
724
                    s->cur_w);
725
2
            s->crow_size = s->pass_row_size + 1;
726
        }
727
        ff_dlog(avctx, "row_size=%d crow_size =%d\n",
728
                s->row_size, s->crow_size);
729
450
        s->image_buf      = p->data[0];
730
450
        s->image_linesize = p->linesize[0];
731
        /* copy the palette if needed */
732
450
        if (avctx->pix_fmt == AV_PIX_FMT_PAL8)
733
41
            memcpy(p->data[1], s->palette, 256 * sizeof(uint32_t));
734
        /* empty row is used if differencing to the first row */
735
450
        av_fast_padded_mallocz(&s->last_row, &s->last_row_size, s->row_size);
736
450
        if (!s->last_row)
737
            return AVERROR_INVALIDDATA;
738
450
        if (s->interlace_type ||
739
448
                s->color_type == PNG_COLOR_TYPE_RGB_ALPHA) {
740
60
            av_fast_padded_malloc(&s->tmp_row, &s->tmp_row_size, s->row_size);
741
60
            if (!s->tmp_row)
742
                return AVERROR_INVALIDDATA;
743
        }
744
        /* compressed row */
745
450
        av_fast_padded_malloc(&s->buffer, &s->buffer_size, s->row_size + 16);
746
450
        if (!s->buffer)
747
            return AVERROR(ENOMEM);
748
749
        /* we want crow_buf+1 to be 16-byte aligned */
750
450
        s->crow_buf          = s->buffer + 15;
751
450
        s->zstream.avail_out = s->crow_size;
752
450
        s->zstream.next_out  = s->crow_buf;
753
    }
754
755
15613
    s->pic_state |= PNG_IDAT;
756
757
    /* set image to non-transparent bpp while decompressing */
758

15613
    if (s->has_trns && s->color_type != PNG_COLOR_TYPE_PALETTE)
759
12
        s->bpp -= byte_depth;
760
761
15613
    ret = png_decode_idat(s, length);
762
763

15613
    if (s->has_trns && s->color_type != PNG_COLOR_TYPE_PALETTE)
764
12
        s->bpp += byte_depth;
765
766
15613
    if (ret < 0)
767
        return ret;
768
769
15613
    bytestream2_skip(&s->gb, 4); /* crc */
770
771
15613
    return 0;
772
}
773
774
2
static int decode_plte_chunk(AVCodecContext *avctx, PNGDecContext *s,
775
                             uint32_t length)
776
{
777
    int n, i, r, g, b;
778
779

2
    if ((length % 3) != 0 || length > 256 * 3)
780
        return AVERROR_INVALIDDATA;
781
    /* read the palette */
782
2
    n = length / 3;
783
474
    for (i = 0; i < n; i++) {
784
472
        r = bytestream2_get_byte(&s->gb);
785
472
        g = bytestream2_get_byte(&s->gb);
786
472
        b = bytestream2_get_byte(&s->gb);
787
472
        s->palette[i] = (0xFFU << 24) | (r << 16) | (g << 8) | b;
788
    }
789
42
    for (; i < 256; i++)
790
40
        s->palette[i] = (0xFFU << 24);
791
2
    s->hdr_state |= PNG_PLTE;
792
2
    bytestream2_skip(&s->gb, 4);     /* crc */
793
794
2
    return 0;
795
}
796
797
4
static int decode_trns_chunk(AVCodecContext *avctx, PNGDecContext *s,
798
                             uint32_t length)
799
{
800
    int v, i;
801
802
4
    if (!(s->hdr_state & PNG_IHDR)) {
803
        av_log(avctx, AV_LOG_ERROR, "trns before IHDR\n");
804
        return AVERROR_INVALIDDATA;
805
    }
806
807
4
    if (s->pic_state & PNG_IDAT) {
808
        av_log(avctx, AV_LOG_ERROR, "trns after IDAT\n");
809
        return AVERROR_INVALIDDATA;
810
    }
811
812
4
    if (s->color_type == PNG_COLOR_TYPE_PALETTE) {
813

2
        if (length > 256 || !(s->hdr_state & PNG_PLTE))
814
            return AVERROR_INVALIDDATA;
815
816
36
        for (i = 0; i < length; i++) {
817
34
            unsigned v = bytestream2_get_byte(&s->gb);
818
34
            s->palette[i] = (s->palette[i] & 0x00ffffff) | (v << 24);
819
        }
820

2
    } else if (s->color_type == PNG_COLOR_TYPE_GRAY || s->color_type == PNG_COLOR_TYPE_RGB) {
821

2
        if ((s->color_type == PNG_COLOR_TYPE_GRAY && length != 2) ||
822

2
            (s->color_type == PNG_COLOR_TYPE_RGB && length != 6) ||
823
2
            s->bit_depth == 1)
824
            return AVERROR_INVALIDDATA;
825
826
8
        for (i = 0; i < length / 2; i++) {
827
            /* only use the least significant bits */
828
6
            v = av_mod_uintp2(bytestream2_get_be16(&s->gb), s->bit_depth);
829
830
6
            if (s->bit_depth > 8)
831
                AV_WB16(&s->transparent_color_be[2 * i], v);
832
            else
833
6
                s->transparent_color_be[i] = v;
834
        }
835
    } else {
836
        return AVERROR_INVALIDDATA;
837
    }
838
839
4
    bytestream2_skip(&s->gb, 4); /* crc */
840
4
    s->has_trns = 1;
841
842
4
    return 0;
843
}
844
845
1
static int decode_iccp_chunk(PNGDecContext *s, int length, AVFrame *f)
846
{
847
1
    int ret, cnt = 0;
848
    uint8_t *data, profile_name[82];
849
    AVBPrint bp;
850
    AVFrameSideData *sd;
851
852

22
    while ((profile_name[cnt++] = bytestream2_get_byte(&s->gb)) && cnt < 81);
853
1
    if (cnt > 80) {
854
        av_log(s->avctx, AV_LOG_ERROR, "iCCP with invalid name!\n");
855
        return AVERROR_INVALIDDATA;
856
    }
857
858
1
    length = FFMAX(length - cnt, 0);
859
860
1
    if (bytestream2_get_byte(&s->gb) != 0) {
861
        av_log(s->avctx, AV_LOG_ERROR, "iCCP with invalid compression!\n");
862
        return AVERROR_INVALIDDATA;
863
    }
864
865
1
    length = FFMAX(length - 1, 0);
866
867
1
    if ((ret = decode_zbuf(&bp, s->gb.buffer, s->gb.buffer + length)) < 0)
868
        return ret;
869
870
1
    ret = av_bprint_finalize(&bp, (char **)&data);
871
1
    if (ret < 0)
872
        return ret;
873
874
1
    sd = av_frame_new_side_data(f, AV_FRAME_DATA_ICC_PROFILE, bp.len);
875
1
    if (!sd) {
876
        av_free(data);
877
        return AVERROR(ENOMEM);
878
    }
879
880
1
    av_dict_set(&sd->metadata, "name", profile_name, 0);
881
1
    memcpy(sd->data, data, bp.len);
882
1
    av_free(data);
883
884
    /* ICC compressed data and CRC */
885
1
    bytestream2_skip(&s->gb, length + 4);
886
887
1
    return 0;
888
}
889
890
static void handle_small_bpp(PNGDecContext *s, AVFrame *p)
891
{
892
    if (s->bits_per_pixel == 1 && s->color_type == PNG_COLOR_TYPE_PALETTE) {
893
        int i, j, k;
894
        uint8_t *pd = p->data[0];
895
        for (j = 0; j < s->height; j++) {
896
            i = s->width / 8;
897
            for (k = 7; k >= 1; k--)
898
                if ((s->width&7) >= k)
899
                    pd[8*i + k - 1] = (pd[i]>>8-k) & 1;
900
            for (i--; i >= 0; i--) {
901
                pd[8*i + 7]=  pd[i]     & 1;
902
                pd[8*i + 6]= (pd[i]>>1) & 1;
903
                pd[8*i + 5]= (pd[i]>>2) & 1;
904
                pd[8*i + 4]= (pd[i]>>3) & 1;
905
                pd[8*i + 3]= (pd[i]>>4) & 1;
906
                pd[8*i + 2]= (pd[i]>>5) & 1;
907
                pd[8*i + 1]= (pd[i]>>6) & 1;
908
                pd[8*i + 0]=  pd[i]>>7;
909
            }
910
            pd += s->image_linesize;
911
        }
912
    } else if (s->bits_per_pixel == 2) {
913
        int i, j;
914
        uint8_t *pd = p->data[0];
915
        for (j = 0; j < s->height; j++) {
916
            i = s->width / 4;
917
            if (s->color_type == PNG_COLOR_TYPE_PALETTE) {
918
                if ((s->width&3) >= 3) pd[4*i + 2]= (pd[i] >> 2) & 3;
919
                if ((s->width&3) >= 2) pd[4*i + 1]= (pd[i] >> 4) & 3;
920
                if ((s->width&3) >= 1) pd[4*i + 0]=  pd[i] >> 6;
921
                for (i--; i >= 0; i--) {
922
                    pd[4*i + 3]=  pd[i]     & 3;
923
                    pd[4*i + 2]= (pd[i]>>2) & 3;
924
                    pd[4*i + 1]= (pd[i]>>4) & 3;
925
                    pd[4*i + 0]=  pd[i]>>6;
926
                }
927
            } else {
928
                if ((s->width&3) >= 3) pd[4*i + 2]= ((pd[i]>>2) & 3)*0x55;
929
                if ((s->width&3) >= 2) pd[4*i + 1]= ((pd[i]>>4) & 3)*0x55;
930
                if ((s->width&3) >= 1) pd[4*i + 0]= ( pd[i]>>6     )*0x55;
931
                for (i--; i >= 0; i--) {
932
                    pd[4*i + 3]= ( pd[i]     & 3)*0x55;
933
                    pd[4*i + 2]= ((pd[i]>>2) & 3)*0x55;
934
                    pd[4*i + 1]= ((pd[i]>>4) & 3)*0x55;
935
                    pd[4*i + 0]= ( pd[i]>>6     )*0x55;
936
                }
937
            }
938
            pd += s->image_linesize;
939
        }
940
    } else if (s->bits_per_pixel == 4) {
941
        int i, j;
942
        uint8_t *pd = p->data[0];
943
        for (j = 0; j < s->height; j++) {
944
            i = s->width/2;
945
            if (s->color_type == PNG_COLOR_TYPE_PALETTE) {
946
                if (s->width&1) pd[2*i+0]= pd[i]>>4;
947
                for (i--; i >= 0; i--) {
948
                    pd[2*i + 1] = pd[i] & 15;
949
                    pd[2*i + 0] = pd[i] >> 4;
950
                }
951
            } else {
952
                if (s->width & 1) pd[2*i + 0]= (pd[i] >> 4) * 0x11;
953
                for (i--; i >= 0; i--) {
954
                    pd[2*i + 1] = (pd[i] & 15) * 0x11;
955
                    pd[2*i + 0] = (pd[i] >> 4) * 0x11;
956
                }
957
            }
958
            pd += s->image_linesize;
959
        }
960
    }
961
}
962
963
101
static int decode_fctl_chunk(AVCodecContext *avctx, PNGDecContext *s,
964
                             uint32_t length)
965
{
966
    uint32_t sequence_number;
967
    int cur_w, cur_h, x_offset, y_offset, dispose_op, blend_op;
968
969
101
    if (length != 26)
970
        return AVERROR_INVALIDDATA;
971
972
101
    if (!(s->hdr_state & PNG_IHDR)) {
973
        av_log(avctx, AV_LOG_ERROR, "fctl before IHDR\n");
974
        return AVERROR_INVALIDDATA;
975
    }
976
977
101
    s->last_w = s->cur_w;
978
101
    s->last_h = s->cur_h;
979
101
    s->last_x_offset = s->x_offset;
980
101
    s->last_y_offset = s->y_offset;
981
101
    s->last_dispose_op = s->dispose_op;
982
983
101
    sequence_number = bytestream2_get_be32(&s->gb);
984
101
    cur_w           = bytestream2_get_be32(&s->gb);
985
101
    cur_h           = bytestream2_get_be32(&s->gb);
986
101
    x_offset        = bytestream2_get_be32(&s->gb);
987
101
    y_offset        = bytestream2_get_be32(&s->gb);
988
101
    bytestream2_skip(&s->gb, 4); /* delay_num (2), delay_den (2) */
989
101
    dispose_op      = bytestream2_get_byte(&s->gb);
990
101
    blend_op        = bytestream2_get_byte(&s->gb);
991
101
    bytestream2_skip(&s->gb, 4); /* crc */
992
993
101
    if (sequence_number == 0 &&
994
9
        (cur_w != s->width ||
995

9
         cur_h != s->height ||
996
9
         x_offset != 0 ||
997
101
         y_offset != 0) ||
998

101
        cur_w <= 0 || cur_h <= 0 ||
999
101
        x_offset < 0 || y_offset < 0 ||
1000

101
        cur_w > s->width - x_offset|| cur_h > s->height - y_offset)
1001
            return AVERROR_INVALIDDATA;
1002
1003

101
    if (blend_op != APNG_BLEND_OP_OVER && blend_op != APNG_BLEND_OP_SOURCE) {
1004
        av_log(avctx, AV_LOG_ERROR, "Invalid blend_op %d\n", blend_op);
1005
        return AVERROR_INVALIDDATA;
1006
    }
1007
1008

101
    if ((sequence_number == 0 || !s->previous_picture.f->data[0]) &&
1009
        dispose_op == APNG_DISPOSE_OP_PREVIOUS) {
1010
        // No previous frame to revert to for the first frame
1011
        // Spec says to just treat it as a APNG_DISPOSE_OP_BACKGROUND
1012
        dispose_op = APNG_DISPOSE_OP_BACKGROUND;
1013
    }
1014
1015

101
    if (blend_op == APNG_BLEND_OP_OVER && !s->has_trns && (
1016
            avctx->pix_fmt == AV_PIX_FMT_RGB24 ||
1017
            avctx->pix_fmt == AV_PIX_FMT_RGB48BE ||
1018
            avctx->pix_fmt == AV_PIX_FMT_PAL8 ||
1019
            avctx->pix_fmt == AV_PIX_FMT_GRAY8 ||
1020
            avctx->pix_fmt == AV_PIX_FMT_GRAY16BE ||
1021
            avctx->pix_fmt == AV_PIX_FMT_MONOBLACK
1022
        )) {
1023
        // APNG_BLEND_OP_OVER is the same as APNG_BLEND_OP_SOURCE when there is no alpha channel
1024
        blend_op = APNG_BLEND_OP_SOURCE;
1025
    }
1026
1027
101
    s->cur_w      = cur_w;
1028
101
    s->cur_h      = cur_h;
1029
101
    s->x_offset   = x_offset;
1030
101
    s->y_offset   = y_offset;
1031
101
    s->dispose_op = dispose_op;
1032
101
    s->blend_op   = blend_op;
1033
1034
101
    return 0;
1035
}
1036
1037
static void handle_p_frame_png(PNGDecContext *s, AVFrame *p)
1038
{
1039
    int i, j;
1040
    uint8_t *pd      = p->data[0];
1041
    uint8_t *pd_last = s->last_picture.f->data[0];
1042
    int ls = FFMIN(av_image_get_linesize(p->format, s->width, 0), s->width * s->bpp);
1043
1044
    ff_thread_await_progress(&s->last_picture, INT_MAX, 0);
1045
    for (j = 0; j < s->height; j++) {
1046
        for (i = 0; i < ls; i++)
1047
            pd[i] += pd_last[i];
1048
        pd      += s->image_linesize;
1049
        pd_last += s->image_linesize;
1050
    }
1051
}
1052
1053
// divide by 255 and round to nearest
1054
// apply a fast variant: (X+127)/255 = ((X+127)*257+257)>>16 = ((X+128)*257)>>16
1055
#define FAST_DIV255(x) ((((x) + 128) * 257) >> 16)
1056
1057
39
static int handle_p_frame_apng(AVCodecContext *avctx, PNGDecContext *s,
1058
                               AVFrame *p)
1059
{
1060
    size_t x, y;
1061
    uint8_t *buffer;
1062
1063
39
    if (s->blend_op == APNG_BLEND_OP_OVER &&
1064
39
        avctx->pix_fmt != AV_PIX_FMT_RGBA &&
1065
39
        avctx->pix_fmt != AV_PIX_FMT_GRAY8A &&
1066
39
        avctx->pix_fmt != AV_PIX_FMT_PAL8) {
1067
        avpriv_request_sample(avctx, "Blending with pixel format %s",
1068
                              av_get_pix_fmt_name(avctx->pix_fmt));
1069
        return AVERROR_PATCHWELCOME;
1070
    }
1071
1072
39
    buffer = av_malloc_array(s->image_linesize, s->height);
1073
39
    if (!buffer)
1074
        return AVERROR(ENOMEM);
1075
1076
1077
    // Do the disposal operation specified by the last frame on the frame
1078
39
    if (s->last_dispose_op != APNG_DISPOSE_OP_PREVIOUS) {
1079
39
        ff_thread_await_progress(&s->last_picture, INT_MAX, 0);
1080
39
        memcpy(buffer, s->last_picture.f->data[0], s->image_linesize * s->height);
1081
1082
39
        if (s->last_dispose_op == APNG_DISPOSE_OP_BACKGROUND)
1083
            for (y = s->last_y_offset; y < s->last_y_offset + s->last_h; ++y)
1084
                memset(buffer + s->image_linesize * y + s->bpp * s->last_x_offset, 0, s->bpp * s->last_w);
1085
1086
39
        memcpy(s->previous_picture.f->data[0], buffer, s->image_linesize * s->height);
1087
39
        ff_thread_report_progress(&s->previous_picture, INT_MAX, 0);
1088
    } else {
1089
        ff_thread_await_progress(&s->previous_picture, INT_MAX, 0);
1090
        memcpy(buffer, s->previous_picture.f->data[0], s->image_linesize * s->height);
1091
    }
1092
1093
    // Perform blending
1094
39
    if (s->blend_op == APNG_BLEND_OP_SOURCE) {
1095
        for (y = s->y_offset; y < s->y_offset + s->cur_h; ++y) {
1096
            size_t row_start = s->image_linesize * y + s->bpp * s->x_offset;
1097
            memcpy(buffer + row_start, p->data[0] + row_start, s->bpp * s->cur_w);
1098
        }
1099
    } else { // APNG_BLEND_OP_OVER
1100
1918
        for (y = s->y_offset; y < s->y_offset + s->cur_h; ++y) {
1101
1879
            uint8_t *foreground = p->data[0] + s->image_linesize * y + s->bpp * s->x_offset;
1102
1879
            uint8_t *background = buffer + s->image_linesize * y + s->bpp * s->x_offset;
1103
143095
            for (x = s->x_offset; x < s->x_offset + s->cur_w; ++x, foreground += s->bpp, background += s->bpp) {
1104
                size_t b;
1105
                uint8_t foreground_alpha, background_alpha, output_alpha;
1106
                uint8_t output[10];
1107
1108
                // Since we might be blending alpha onto alpha, we use the following equations:
1109
                // output_alpha = foreground_alpha + (1 - foreground_alpha) * background_alpha
1110
                // output = (foreground_alpha * foreground + (1 - foreground_alpha) * background_alpha * background) / output_alpha
1111
1112

141216
                switch (avctx->pix_fmt) {
1113
                case AV_PIX_FMT_RGBA:
1114
                    foreground_alpha = foreground[3];
1115
                    background_alpha = background[3];
1116
                    break;
1117
1118
                case AV_PIX_FMT_GRAY8A:
1119
                    foreground_alpha = foreground[1];
1120
                    background_alpha = background[1];
1121
                    break;
1122
1123
141216
                case AV_PIX_FMT_PAL8:
1124
141216
                    foreground_alpha = s->palette[foreground[0]] >> 24;
1125
141216
                    background_alpha = s->palette[background[0]] >> 24;
1126
141216
                    break;
1127
                }
1128
1129
141216
                if (foreground_alpha == 0)
1130
141216
                    continue;
1131
1132
19634
                if (foreground_alpha == 255) {
1133
19634
                    memcpy(background, foreground, s->bpp);
1134
19634
                    continue;
1135
                }
1136
1137
                if (avctx->pix_fmt == AV_PIX_FMT_PAL8) {
1138
                    // TODO: Alpha blending with PAL8 will likely need the entire image converted over to RGBA first
1139
                    avpriv_request_sample(avctx, "Alpha blending palette samples");
1140
                    background[0] = foreground[0];
1141
                    continue;
1142
                }
1143
1144
                output_alpha = foreground_alpha + FAST_DIV255((255 - foreground_alpha) * background_alpha);
1145
1146
                av_assert0(s->bpp <= 10);
1147
1148
                for (b = 0; b < s->bpp - 1; ++b) {
1149
                    if (output_alpha == 0) {
1150
                        output[b] = 0;
1151
                    } else if (background_alpha == 255) {
1152
                        output[b] = FAST_DIV255(foreground_alpha * foreground[b] + (255 - foreground_alpha) * background[b]);
1153
                    } else {
1154
                        output[b] = (255 * foreground_alpha * foreground[b] + (255 - foreground_alpha) * background_alpha * background[b]) / (255 * output_alpha);
1155
                    }
1156
                }
1157
                output[b] = output_alpha;
1158
                memcpy(background, output, s->bpp);
1159
            }
1160
        }
1161
    }
1162
1163
    // Copy blended buffer into the frame and free
1164
39
    memcpy(p->data[0], buffer, s->image_linesize * s->height);
1165
39
    av_free(buffer);
1166
1167
39
    return 0;
1168
}
1169
1170
460
static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s,
1171
                               AVFrame *p, AVPacket *avpkt)
1172
{
1173
460
    AVDictionary **metadatap = NULL;
1174
    uint32_t tag, length;
1175
460
    int decode_next_dat = 0;
1176
    int i, ret;
1177
1178
    for (;;) {
1179
17171
        length = bytestream2_get_bytes_left(&s->gb);
1180
17171
        if (length <= 0) {
1181
1182
156
            if (avctx->codec_id == AV_CODEC_ID_PNG &&
1183
46
                avctx->skip_frame == AVDISCARD_ALL) {
1184
46
                return 0;
1185
            }
1186
1187

110
            if (CONFIG_APNG_DECODER && avctx->codec_id == AV_CODEC_ID_APNG && length == 0) {
1188
110
                if (!(s->pic_state & PNG_IDAT))
1189
9
                    return 0;
1190
                else
1191
101
                    goto exit_loop;
1192
            }
1193
            av_log(avctx, AV_LOG_ERROR, "%d bytes left\n", length);
1194
            if (   s->pic_state & PNG_ALLIMAGE
1195
                && avctx->strict_std_compliance <= FF_COMPLIANCE_NORMAL)
1196
                goto exit_loop;
1197
            ret = AVERROR_INVALIDDATA;
1198
            goto fail;
1199
        }
1200
1201
17015
        length = bytestream2_get_be32(&s->gb);
1202

17015
        if (length > 0x7fffffff || length > bytestream2_get_bytes_left(&s->gb)) {
1203
1
            av_log(avctx, AV_LOG_ERROR, "chunk too big\n");
1204
1
            ret = AVERROR_INVALIDDATA;
1205
1
            goto fail;
1206
        }
1207
17014
        tag = bytestream2_get_le32(&s->gb);
1208
17014
        if (avctx->debug & FF_DEBUG_STARTCODE)
1209
            av_log(avctx, AV_LOG_DEBUG, "png: tag=%s length=%u\n",
1210
                   av_fourcc2str(tag), length);
1211
1212
17014
        if (avctx->codec_id == AV_CODEC_ID_PNG &&
1213
13611
            avctx->skip_frame == AVDISCARD_ALL) {
1214
794
            switch(tag) {
1215
692
            case MKTAG('I', 'H', 'D', 'R'):
1216
            case MKTAG('p', 'H', 'Y', 's'):
1217
            case MKTAG('t', 'E', 'X', 't'):
1218
            case MKTAG('I', 'D', 'A', 'T'):
1219
            case MKTAG('t', 'R', 'N', 'S'):
1220
692
                break;
1221
102
            default:
1222
102
                goto skip_tag;
1223
            }
1224
16220
        }
1225
1226
16912
        metadatap = &p->metadata;
1227



16912
        switch (tag) {
1228
359
        case MKTAG('I', 'H', 'D', 'R'):
1229
359
            if ((ret = decode_ihdr_chunk(avctx, s, length)) < 0)
1230
                goto fail;
1231
359
            break;
1232
333
        case MKTAG('p', 'H', 'Y', 's'):
1233
333
            if ((ret = decode_phys_chunk(avctx, s)) < 0)
1234
                goto fail;
1235
333
            break;
1236
101
        case MKTAG('f', 'c', 'T', 'L'):
1237
101
            if (!CONFIG_APNG_DECODER || avctx->codec_id != AV_CODEC_ID_APNG)
1238
                goto skip_tag;
1239
101
            if ((ret = decode_fctl_chunk(avctx, s, length)) < 0)
1240
                goto fail;
1241
101
            decode_next_dat = 1;
1242
101
            break;
1243
2966
        case MKTAG('f', 'd', 'A', 'T'):
1244
2966
            if (!CONFIG_APNG_DECODER || avctx->codec_id != AV_CODEC_ID_APNG)
1245
                goto skip_tag;
1246
2966
            if (!decode_next_dat) {
1247
                ret = AVERROR_INVALIDDATA;
1248
                goto fail;
1249
            }
1250
2966
            bytestream2_get_be32(&s->gb);
1251
2966
            length -= 4;
1252
            /* fallthrough */
1253
15613
        case MKTAG('I', 'D', 'A', 'T'):
1254

15613
            if (CONFIG_APNG_DECODER && avctx->codec_id == AV_CODEC_ID_APNG && !decode_next_dat)
1255
                goto skip_tag;
1256
15613
            if ((ret = decode_idat_chunk(avctx, s, length, p)) < 0)
1257
                goto fail;
1258
15613
            break;
1259
2
        case MKTAG('P', 'L', 'T', 'E'):
1260
2
            if (decode_plte_chunk(avctx, s, length) < 0)
1261
                goto skip_tag;
1262
2
            break;
1263
4
        case MKTAG('t', 'R', 'N', 'S'):
1264
4
            if (decode_trns_chunk(avctx, s, length) < 0)
1265
                goto skip_tag;
1266
4
            break;
1267
113
        case MKTAG('t', 'E', 'X', 't'):
1268
113
            if (decode_text_chunk(s, length, 0, metadatap) < 0)
1269
                av_log(avctx, AV_LOG_WARNING, "Broken tEXt chunk\n");
1270
113
            bytestream2_skip(&s->gb, length + 4);
1271
113
            break;
1272
        case MKTAG('z', 'T', 'X', 't'):
1273
            if (decode_text_chunk(s, length, 1, metadatap) < 0)
1274
                av_log(avctx, AV_LOG_WARNING, "Broken zTXt chunk\n");
1275
            bytestream2_skip(&s->gb, length + 4);
1276
            break;
1277
        case MKTAG('s', 'T', 'E', 'R'): {
1278
            int mode = bytestream2_get_byte(&s->gb);
1279
            AVStereo3D *stereo3d = av_stereo3d_create_side_data(p);
1280
            if (!stereo3d)
1281
                goto fail;
1282
1283
            if (mode == 0 || mode == 1) {
1284
                stereo3d->type  = AV_STEREO3D_SIDEBYSIDE;
1285
                stereo3d->flags = mode ? 0 : AV_STEREO3D_FLAG_INVERT;
1286
            } else {
1287
                 av_log(avctx, AV_LOG_WARNING,
1288
                        "Unknown value in sTER chunk (%d)\n", mode);
1289
            }
1290
            bytestream2_skip(&s->gb, 4); /* crc */
1291
            break;
1292
        }
1293
1
        case MKTAG('i', 'C', 'C', 'P'): {
1294
1
            if (decode_iccp_chunk(s, length, p) < 0)
1295
                goto fail;
1296
1
            break;
1297
        }
1298
1
        case MKTAG('c', 'H', 'R', 'M'): {
1299
1
            AVMasteringDisplayMetadata *mdm = av_mastering_display_metadata_create_side_data(p);
1300
1
            if (!mdm) {
1301
                ret = AVERROR(ENOMEM);
1302
                goto fail;
1303
            }
1304
1305
1
            mdm->white_point[0] = av_make_q(bytestream2_get_be32(&s->gb), 100000);
1306
1
            mdm->white_point[1] = av_make_q(bytestream2_get_be32(&s->gb), 100000);
1307
1308
            /* RGB Primaries */
1309
4
            for (i = 0; i < 3; i++) {
1310
3
                mdm->display_primaries[i][0] = av_make_q(bytestream2_get_be32(&s->gb), 100000);
1311
3
                mdm->display_primaries[i][1] = av_make_q(bytestream2_get_be32(&s->gb), 100000);
1312
            }
1313
1314
1
            mdm->has_primaries = 1;
1315
1
            bytestream2_skip(&s->gb, 4); /* crc */
1316
1
            break;
1317
        }
1318
13
        case MKTAG('g', 'A', 'M', 'A'): {
1319
            AVBPrint bp;
1320
            char *gamma_str;
1321
13
            int num = bytestream2_get_be32(&s->gb);
1322
1323
13
            av_bprint_init(&bp, 0, AV_BPRINT_SIZE_UNLIMITED);
1324
13
            av_bprintf(&bp, "%i/%i", num, 100000);
1325
13
            ret = av_bprint_finalize(&bp, &gamma_str);
1326
13
            if (ret < 0)
1327
                return ret;
1328
1329
13
            av_dict_set(&p->metadata, "gamma", gamma_str, AV_DICT_DONT_STRDUP_VAL);
1330
1331
13
            bytestream2_skip(&s->gb, 4); /* crc */
1332
13
            break;
1333
        }
1334
303
        case MKTAG('I', 'E', 'N', 'D'):
1335
303
            if (!(s->pic_state & PNG_ALLIMAGE))
1336
                av_log(avctx, AV_LOG_ERROR, "IEND without all image\n");
1337
303
            if (!(s->pic_state & (PNG_ALLIMAGE|PNG_IDAT))) {
1338
                ret = AVERROR_INVALIDDATA;
1339
                goto fail;
1340
            }
1341
303
            bytestream2_skip(&s->gb, 4); /* crc */
1342
303
            goto exit_loop;
1343
        default:
1344
            /* skip tag */
1345
171
skip_tag:
1346
171
            bytestream2_skip(&s->gb, length + 4);
1347
171
            break;
1348
        }
1349
    }
1350
404
exit_loop:
1351
1352
404
    if (avctx->codec_id == AV_CODEC_ID_PNG &&
1353
303
        avctx->skip_frame == AVDISCARD_ALL) {
1354
        return 0;
1355
    }
1356
1357
404
    if (s->bits_per_pixel <= 4)
1358
        handle_small_bpp(s, p);
1359
1360
    /* apply transparency if needed */
1361

404
    if (s->has_trns && s->color_type != PNG_COLOR_TYPE_PALETTE) {
1362
1
        size_t byte_depth = s->bit_depth > 8 ? 2 : 1;
1363
1
        size_t raw_bpp = s->bpp - byte_depth;
1364
        unsigned x, y;
1365
1366
1
        av_assert0(s->bit_depth > 1);
1367
1368
331
        for (y = 0; y < s->height; ++y) {
1369
330
            uint8_t *row = &s->image_buf[s->image_linesize * y];
1370
1371

330
            if (s->bpp == 2 && byte_depth == 1) {
1372
                uint8_t *pixel = &row[2 * s->width - 1];
1373
                uint8_t *rowp  = &row[1 * s->width - 1];
1374
                int tcolor = s->transparent_color_be[0];
1375
                for (x = s->width; x > 0; --x) {
1376
                    *pixel-- = *rowp == tcolor ? 0 : 0xff;
1377
                    *pixel-- = *rowp--;
1378
                }
1379

660
            } else if (s->bpp == 4 && byte_depth == 1) {
1380
330
                uint8_t *pixel = &row[4 * s->width - 1];
1381
330
                uint8_t *rowp  = &row[3 * s->width - 1];
1382
330
                int tcolor = AV_RL24(s->transparent_color_be);
1383
109230
                for (x = s->width; x > 0; --x) {
1384
108900
                    *pixel-- = AV_RL24(rowp-2) == tcolor ? 0 : 0xff;
1385
108900
                    *pixel-- = *rowp--;
1386
108900
                    *pixel-- = *rowp--;
1387
108900
                    *pixel-- = *rowp--;
1388
                }
1389
            } else {
1390
                /* since we're updating in-place, we have to go from right to left */
1391
                for (x = s->width; x > 0; --x) {
1392
                    uint8_t *pixel = &row[s->bpp * (x - 1)];
1393
                    memmove(pixel, &row[raw_bpp * (x - 1)], raw_bpp);
1394
1395
                    if (!memcmp(pixel, s->transparent_color_be, raw_bpp)) {
1396
                        memset(&pixel[raw_bpp], 0, byte_depth);
1397
                    } else {
1398
                        memset(&pixel[raw_bpp], 0xff, byte_depth);
1399
                    }
1400
                }
1401
            }
1402
        }
1403
    }
1404
1405
    /* handle P-frames only if a predecessor frame is available */
1406
404
    if (s->last_picture.f->data[0]) {
1407

350
        if (   !(avpkt->flags & AV_PKT_FLAG_KEY) && avctx->codec_tag != AV_RL32("MPNG")
1408
39
            && s->last_picture.f->width == p->width
1409
39
            && s->last_picture.f->height== p->height
1410
39
            && s->last_picture.f->format== p->format
1411
         ) {
1412
39
            if (CONFIG_PNG_DECODER && avctx->codec_id != AV_CODEC_ID_APNG)
1413
                handle_p_frame_png(s, p);
1414
39
            else if (CONFIG_APNG_DECODER &&
1415
39
                     s->previous_picture.f->width == p->width  &&
1416
39
                     s->previous_picture.f->height== p->height &&
1417
39
                     s->previous_picture.f->format== p->format &&
1418

78
                     avctx->codec_id == AV_CODEC_ID_APNG &&
1419
39
                     (ret = handle_p_frame_apng(avctx, s, p)) < 0)
1420
                goto fail;
1421
        }
1422
    }
1423
404
    ff_thread_report_progress(&s->picture, INT_MAX, 0);
1424
404
    ff_thread_report_progress(&s->previous_picture, INT_MAX, 0);
1425
1426
404
    return 0;
1427
1428
1
fail:
1429
1
    ff_thread_report_progress(&s->picture, INT_MAX, 0);
1430
1
    ff_thread_report_progress(&s->previous_picture, INT_MAX, 0);
1431
1
    return ret;
1432
}
1433
1434
#if CONFIG_PNG_DECODER
1435
350
static int decode_frame_png(AVCodecContext *avctx,
1436
                        void *data, int *got_frame,
1437
                        AVPacket *avpkt)
1438
{
1439
350
    PNGDecContext *const s = avctx->priv_data;
1440
350
    const uint8_t *buf     = avpkt->data;
1441
350
    int buf_size           = avpkt->size;
1442
    AVFrame *p;
1443
    int64_t sig;
1444
    int ret;
1445
1446
350
    ff_thread_release_buffer(avctx, &s->last_picture);
1447
350
    FFSWAP(ThreadFrame, s->picture, s->last_picture);
1448
350
    p = s->picture.f;
1449
1450
350
    bytestream2_init(&s->gb, buf, buf_size);
1451
1452
    /* check signature */
1453
350
    sig = bytestream2_get_be64(&s->gb);
1454

350
    if (sig != PNGSIG &&
1455
        sig != MNGSIG) {
1456
        av_log(avctx, AV_LOG_ERROR, "Invalid PNG signature 0x%08"PRIX64".\n", sig);
1457
        return AVERROR_INVALIDDATA;
1458
    }
1459
1460
350
    s->y = s->has_trns = 0;
1461
350
    s->hdr_state = 0;
1462
350
    s->pic_state = 0;
1463
1464
    /* init the zlib */
1465
350
    s->zstream.zalloc = ff_png_zalloc;
1466
350
    s->zstream.zfree  = ff_png_zfree;
1467
350
    s->zstream.opaque = NULL;
1468
350
    ret = inflateInit(&s->zstream);
1469
350
    if (ret != Z_OK) {
1470
        av_log(avctx, AV_LOG_ERROR, "inflateInit returned error %d\n", ret);
1471
        return AVERROR_EXTERNAL;
1472
    }
1473
1474
350
    if ((ret = decode_frame_common(avctx, s, p, avpkt)) < 0)
1475
1
        goto the_end;
1476
1477
349
    if (avctx->skip_frame == AVDISCARD_ALL) {
1478
46
        *got_frame = 0;
1479
46
        ret = bytestream2_tell(&s->gb);
1480
46
        goto the_end;
1481
    }
1482
1483
303
    if ((ret = av_frame_ref(data, s->picture.f)) < 0)
1484
        goto the_end;
1485
1486
303
    *got_frame = 1;
1487
1488
303
    ret = bytestream2_tell(&s->gb);
1489
350
the_end:
1490
350
    inflateEnd(&s->zstream);
1491
350
    s->crow_buf = NULL;
1492
350
    return ret;
1493
}
1494
#endif
1495
1496
#if CONFIG_APNG_DECODER
1497
101
static int decode_frame_apng(AVCodecContext *avctx,
1498
                        void *data, int *got_frame,
1499
                        AVPacket *avpkt)
1500
{
1501
101
    PNGDecContext *const s = avctx->priv_data;
1502
    int ret;
1503
    AVFrame *p;
1504
1505
101
    ff_thread_release_buffer(avctx, &s->last_picture);
1506
101
    FFSWAP(ThreadFrame, s->picture, s->last_picture);
1507
101
    p = s->picture.f;
1508
1509
101
    if (!(s->hdr_state & PNG_IHDR)) {
1510
9
        if (!avctx->extradata_size)
1511
            return AVERROR_INVALIDDATA;
1512
1513
        /* only init fields, there is no zlib use in extradata */
1514
9
        s->zstream.zalloc = ff_png_zalloc;
1515
9
        s->zstream.zfree  = ff_png_zfree;
1516
1517
9
        bytestream2_init(&s->gb, avctx->extradata, avctx->extradata_size);
1518
9
        if ((ret = decode_frame_common(avctx, s, p, avpkt)) < 0)
1519
            goto end;
1520
    }
1521
1522
    /* reset state for a new frame */
1523
101
    if ((ret = inflateInit(&s->zstream)) != Z_OK) {
1524
        av_log(avctx, AV_LOG_ERROR, "inflateInit returned error %d\n", ret);
1525
        ret = AVERROR_EXTERNAL;
1526
        goto end;
1527
    }
1528
101
    s->y = 0;
1529
101
    s->pic_state = 0;
1530
101
    bytestream2_init(&s->gb, avpkt->data, avpkt->size);
1531
101
    if ((ret = decode_frame_common(avctx, s, p, avpkt)) < 0)
1532
        goto end;
1533
1534
101
    if (!(s->pic_state & PNG_ALLIMAGE))
1535
        av_log(avctx, AV_LOG_WARNING, "Frame did not contain a complete image\n");
1536
101
    if (!(s->pic_state & (PNG_ALLIMAGE|PNG_IDAT))) {
1537
        ret = AVERROR_INVALIDDATA;
1538
        goto end;
1539
    }
1540
101
    if ((ret = av_frame_ref(data, s->picture.f)) < 0)
1541
        goto end;
1542
1543
101
    *got_frame = 1;
1544
101
    ret = bytestream2_tell(&s->gb);
1545
1546
101
end:
1547
101
    inflateEnd(&s->zstream);
1548
101
    return ret;
1549
}
1550
#endif
1551
1552
#if CONFIG_LSCR_DECODER
1553
static int decode_frame_lscr(AVCodecContext *avctx,
1554
                             void *data, int *got_frame,
1555
                             AVPacket *avpkt)
1556
{
1557
    PNGDecContext *const s = avctx->priv_data;
1558
    GetByteContext *gb = &s->gb;
1559
    AVFrame *frame = data;
1560
    int ret, nb_blocks, offset = 0;
1561
1562
    if (avpkt->size < 2)
1563
        return AVERROR_INVALIDDATA;
1564
1565
    bytestream2_init(gb, avpkt->data, avpkt->size);
1566
1567
    if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
1568
        return ret;
1569
1570
    nb_blocks = bytestream2_get_le16(gb);
1571
    if (bytestream2_get_bytes_left(gb) < 2 + nb_blocks * (12 + 8))
1572
        return AVERROR_INVALIDDATA;
1573
1574
    if (s->last_picture.f->data[0]) {
1575
        ret = av_frame_copy(frame, s->last_picture.f);
1576
        if (ret < 0)
1577
            return ret;
1578
    }
1579
1580
    for (int b = 0; b < nb_blocks; b++) {
1581
        int x, y, x2, y2, w, h, left;
1582
        uint32_t csize, size;
1583
1584
        s->zstream.zalloc = ff_png_zalloc;
1585
        s->zstream.zfree  = ff_png_zfree;
1586
        s->zstream.opaque = NULL;
1587
1588
        if ((ret = inflateInit(&s->zstream)) != Z_OK) {
1589
            av_log(avctx, AV_LOG_ERROR, "inflateInit returned error %d\n", ret);
1590
            ret = AVERROR_EXTERNAL;
1591
            goto end;
1592
        }
1593
1594
        bytestream2_seek(gb, 2 + b * 12, SEEK_SET);
1595
1596
        x = bytestream2_get_le16(gb);
1597
        y = bytestream2_get_le16(gb);
1598
        x2 = bytestream2_get_le16(gb);
1599
        y2 = bytestream2_get_le16(gb);
1600
        s->width  = s->cur_w = w = x2-x;
1601
        s->height = s->cur_h = h = y2-y;
1602
1603
        if (w <= 0 || x < 0 || x >= avctx->width || w + x > avctx->width ||
1604
            h <= 0 || y < 0 || y >= avctx->height || h + y > avctx->height) {
1605
            ret = AVERROR_INVALIDDATA;
1606
            goto end;
1607
        }
1608
1609
        size = bytestream2_get_le32(gb);
1610
1611
        frame->key_frame = (nb_blocks == 1) &&
1612
                           (w == avctx->width) &&
1613
                           (h == avctx->height) &&
1614
                           (x == 0) && (y == 0);
1615
1616
        bytestream2_seek(gb, 2 + nb_blocks * 12 + offset, SEEK_SET);
1617
        csize = bytestream2_get_be32(gb);
1618
        if (bytestream2_get_le32(gb) != MKTAG('I', 'D', 'A', 'T')) {
1619
            ret = AVERROR_INVALIDDATA;
1620
            goto end;
1621
        }
1622
1623
        offset += size;
1624
        left = size;
1625
1626
        s->y                 = 0;
1627
        s->row_size          = w * 3;
1628
1629
        av_fast_padded_malloc(&s->buffer, &s->buffer_size, s->row_size + 16);
1630
        if (!s->buffer) {
1631
            ret = AVERROR(ENOMEM);
1632
            goto end;
1633
        }
1634
1635
        av_fast_padded_malloc(&s->last_row, &s->last_row_size, s->row_size);
1636
        if (!s->last_row) {
1637
            ret = AVERROR(ENOMEM);
1638
            goto end;
1639
        }
1640
1641
        s->crow_size         = w * 3 + 1;
1642
        s->crow_buf          = s->buffer + 15;
1643
        s->zstream.avail_out = s->crow_size;
1644
        s->zstream.next_out  = s->crow_buf;
1645
        s->image_buf         = frame->data[0] + (avctx->height - y - 1) * frame->linesize[0] + x * 3;
1646
        s->image_linesize    =-frame->linesize[0];
1647
        s->bpp               = 3;
1648
        s->pic_state         = 0;
1649
1650
        while (left > 16) {
1651
            ret = png_decode_idat(s, csize);
1652
            if (ret < 0)
1653
                goto end;
1654
            left -= csize + 16;
1655
            if (left > 16) {
1656
                bytestream2_skip(gb, 4);
1657
                csize = bytestream2_get_be32(gb);
1658
                if (bytestream2_get_le32(gb) != MKTAG('I', 'D', 'A', 'T')) {
1659
                    ret = AVERROR_INVALIDDATA;
1660
                    goto end;
1661
                }
1662
            }
1663
        }
1664
1665
        inflateEnd(&s->zstream);
1666
    }
1667
1668
    frame->pict_type = frame->key_frame ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P;
1669
1670
    av_frame_unref(s->last_picture.f);
1671
    if ((ret = av_frame_ref(s->last_picture.f, frame)) < 0)
1672
        return ret;
1673
1674
    *got_frame = 1;
1675
end:
1676
    inflateEnd(&s->zstream);
1677
1678
    if (ret < 0)
1679
        return ret;
1680
    return avpkt->size;
1681
}
1682
1683
static void decode_flush(AVCodecContext *avctx)
1684
{
1685
    PNGDecContext *s = avctx->priv_data;
1686
1687
    av_frame_unref(s->last_picture.f);
1688
}
1689
1690
#endif
1691
1692
#if HAVE_THREADS
1693
static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
1694
{
1695
    PNGDecContext *psrc = src->priv_data;
1696
    PNGDecContext *pdst = dst->priv_data;
1697
    int ret;
1698
1699
    if (dst == src)
1700
        return 0;
1701
1702
    ff_thread_release_buffer(dst, &pdst->picture);
1703
    if (psrc->picture.f->data[0] &&
1704
        (ret = ff_thread_ref_frame(&pdst->picture, &psrc->picture)) < 0)
1705
        return ret;
1706
    if (CONFIG_APNG_DECODER && dst->codec_id == AV_CODEC_ID_APNG) {
1707
        pdst->width             = psrc->width;
1708
        pdst->height            = psrc->height;
1709
        pdst->bit_depth         = psrc->bit_depth;
1710
        pdst->color_type        = psrc->color_type;
1711
        pdst->compression_type  = psrc->compression_type;
1712
        pdst->interlace_type    = psrc->interlace_type;
1713
        pdst->filter_type       = psrc->filter_type;
1714
        pdst->cur_w = psrc->cur_w;
1715
        pdst->cur_h = psrc->cur_h;
1716
        pdst->x_offset = psrc->x_offset;
1717
        pdst->y_offset = psrc->y_offset;
1718
        pdst->has_trns = psrc->has_trns;
1719
        memcpy(pdst->transparent_color_be, psrc->transparent_color_be, sizeof(pdst->transparent_color_be));
1720
1721
        pdst->dispose_op = psrc->dispose_op;
1722
1723
        memcpy(pdst->palette, psrc->palette, sizeof(pdst->palette));
1724
1725
        pdst->hdr_state |= psrc->hdr_state;
1726
1727
        ff_thread_release_buffer(dst, &pdst->last_picture);
1728
        if (psrc->last_picture.f->data[0] &&
1729
            (ret = ff_thread_ref_frame(&pdst->last_picture, &psrc->last_picture)) < 0)
1730
            return ret;
1731
1732
        ff_thread_release_buffer(dst, &pdst->previous_picture);
1733
        if (psrc->previous_picture.f->data[0] &&
1734
            (ret = ff_thread_ref_frame(&pdst->previous_picture, &psrc->previous_picture)) < 0)
1735
            return ret;
1736
    }
1737
1738
    return 0;
1739
}
1740
#endif
1741
1742
132
static av_cold int png_dec_init(AVCodecContext *avctx)
1743
{
1744
132
    PNGDecContext *s = avctx->priv_data;
1745
1746
132
    avctx->color_range = AVCOL_RANGE_JPEG;
1747
1748
132
    if (avctx->codec_id == AV_CODEC_ID_LSCR)
1749
        avctx->pix_fmt = AV_PIX_FMT_BGR24;
1750
1751
132
    s->avctx = avctx;
1752
132
    s->previous_picture.f = av_frame_alloc();
1753
132
    s->last_picture.f = av_frame_alloc();
1754
132
    s->picture.f = av_frame_alloc();
1755

132
    if (!s->previous_picture.f || !s->last_picture.f || !s->picture.f) {
1756
        av_frame_free(&s->previous_picture.f);
1757
        av_frame_free(&s->last_picture.f);
1758
        av_frame_free(&s->picture.f);
1759
        return AVERROR(ENOMEM);
1760
    }
1761
1762
132
    if (!avctx->internal->is_copy) {
1763
100
        avctx->internal->allocate_progress = 1;
1764
100
        ff_pngdsp_init(&s->dsp);
1765
    }
1766
1767
132
    return 0;
1768
}
1769
1770
132
static av_cold int png_dec_end(AVCodecContext *avctx)
1771
{
1772
132
    PNGDecContext *s = avctx->priv_data;
1773
1774
132
    ff_thread_release_buffer(avctx, &s->previous_picture);
1775
132
    av_frame_free(&s->previous_picture.f);
1776
132
    ff_thread_release_buffer(avctx, &s->last_picture);
1777
132
    av_frame_free(&s->last_picture.f);
1778
132
    ff_thread_release_buffer(avctx, &s->picture);
1779
132
    av_frame_free(&s->picture.f);
1780
132
    av_freep(&s->buffer);
1781
132
    s->buffer_size = 0;
1782
132
    av_freep(&s->last_row);
1783
132
    s->last_row_size = 0;
1784
132
    av_freep(&s->tmp_row);
1785
132
    s->tmp_row_size = 0;
1786
1787
132
    return 0;
1788
}
1789
1790
#if CONFIG_APNG_DECODER
1791
AVCodec ff_apng_decoder = {
1792
    .name           = "apng",
1793
    .long_name      = NULL_IF_CONFIG_SMALL("APNG (Animated Portable Network Graphics) image"),
1794
    .type           = AVMEDIA_TYPE_VIDEO,
1795
    .id             = AV_CODEC_ID_APNG,
1796
    .priv_data_size = sizeof(PNGDecContext),
1797
    .init           = png_dec_init,
1798
    .close          = png_dec_end,
1799
    .decode         = decode_frame_apng,
1800
    .init_thread_copy = ONLY_IF_THREADS_ENABLED(png_dec_init),
1801
    .update_thread_context = ONLY_IF_THREADS_ENABLED(update_thread_context),
1802
    .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS /*| AV_CODEC_CAP_DRAW_HORIZ_BAND*/,
1803
    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
1804
};
1805
#endif
1806
1807
#if CONFIG_PNG_DECODER
1808
AVCodec ff_png_decoder = {
1809
    .name           = "png",
1810
    .long_name      = NULL_IF_CONFIG_SMALL("PNG (Portable Network Graphics) image"),
1811
    .type           = AVMEDIA_TYPE_VIDEO,
1812
    .id             = AV_CODEC_ID_PNG,
1813
    .priv_data_size = sizeof(PNGDecContext),
1814
    .init           = png_dec_init,
1815
    .close          = png_dec_end,
1816
    .decode         = decode_frame_png,
1817
    .init_thread_copy = ONLY_IF_THREADS_ENABLED(png_dec_init),
1818
    .update_thread_context = ONLY_IF_THREADS_ENABLED(update_thread_context),
1819
    .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS /*| AV_CODEC_CAP_DRAW_HORIZ_BAND*/,
1820
    .caps_internal  = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM | FF_CODEC_CAP_INIT_THREADSAFE,
1821
};
1822
#endif
1823
1824
#if CONFIG_LSCR_DECODER
1825
AVCodec ff_lscr_decoder = {
1826
    .name           = "lscr",
1827
    .long_name      = NULL_IF_CONFIG_SMALL("LEAD Screen Capture"),
1828
    .type           = AVMEDIA_TYPE_VIDEO,
1829
    .id             = AV_CODEC_ID_LSCR,
1830
    .priv_data_size = sizeof(PNGDecContext),
1831
    .init           = png_dec_init,
1832
    .close          = png_dec_end,
1833
    .decode         = decode_frame_lscr,
1834
    .flush          = decode_flush,
1835
    .capabilities   = AV_CODEC_CAP_DR1 /*| AV_CODEC_CAP_DRAW_HORIZ_BAND*/,
1836
    .caps_internal  = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM | FF_CODEC_CAP_INIT_THREADSAFE,
1837
};
1838
#endif