Commit f1ffa01d authored by Michael Niedermayer's avatar Michael Niedermayer

avcodec/pngdec: Copy IHDR & plte state from last thread

Previously these chunks where parsed again for each frame with threads
but not without leading to a different path and the potential for
inconsistencies

This also removes a related special case from decode_ihdr_chunk()
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent a1736926
...@@ -547,18 +547,13 @@ static int decode_ihdr_chunk(AVCodecContext *avctx, PNGDecContext *s, ...@@ -547,18 +547,13 @@ static int decode_ihdr_chunk(AVCodecContext *avctx, PNGDecContext *s,
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
s->width = bytestream2_get_be32(&s->gb); s->width = s->cur_w = bytestream2_get_be32(&s->gb);
s->height = bytestream2_get_be32(&s->gb); s->height = s->cur_h = bytestream2_get_be32(&s->gb);
if (av_image_check_size(s->width, s->height, 0, avctx)) { if (av_image_check_size(s->width, s->height, 0, avctx)) {
s->width = s->height = 0; s->cur_w = s->cur_h = s->width = s->height = 0;
av_log(avctx, AV_LOG_ERROR, "Invalid image size\n"); av_log(avctx, AV_LOG_ERROR, "Invalid image size\n");
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
if (s->cur_w == 0 && s->cur_h == 0) {
// Only set cur_w/h if update_thread_context() has not set it
s->cur_w = s->width;
s->cur_h = s->height;
}
s->bit_depth = bytestream2_get_byte(&s->gb); s->bit_depth = bytestream2_get_byte(&s->gb);
s->color_type = bytestream2_get_byte(&s->gb); s->color_type = bytestream2_get_byte(&s->gb);
s->compression_type = bytestream2_get_byte(&s->gb); s->compression_type = bytestream2_get_byte(&s->gb);
...@@ -1269,12 +1264,24 @@ static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src) ...@@ -1269,12 +1264,24 @@ static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
(ret = ff_thread_ref_frame(&pdst->picture, &psrc->picture)) < 0) (ret = ff_thread_ref_frame(&pdst->picture, &psrc->picture)) < 0)
return ret; return ret;
if (CONFIG_APNG_DECODER && dst->codec_id == AV_CODEC_ID_APNG) { if (CONFIG_APNG_DECODER && dst->codec_id == AV_CODEC_ID_APNG) {
pdst->width = psrc->width;
pdst->height = psrc->height;
pdst->bit_depth = psrc->bit_depth;
pdst->color_type = psrc->color_type;
pdst->compression_type = psrc->compression_type;
pdst->interlace_type = psrc->interlace_type;
pdst->filter_type = psrc->filter_type;
pdst->cur_w = psrc->cur_w; pdst->cur_w = psrc->cur_w;
pdst->cur_h = psrc->cur_h; pdst->cur_h = psrc->cur_h;
pdst->x_offset = psrc->x_offset; pdst->x_offset = psrc->x_offset;
pdst->y_offset = psrc->y_offset; pdst->y_offset = psrc->y_offset;
pdst->dispose_op = psrc->dispose_op; pdst->dispose_op = psrc->dispose_op;
memcpy(pdst->palette, psrc->palette, sizeof(pdst->palette));
pdst->state |= psrc->state & (PNG_IHDR | PNG_PLTE);
ff_thread_release_buffer(dst, &pdst->last_picture); ff_thread_release_buffer(dst, &pdst->last_picture);
if (psrc->last_picture.f->data[0]) if (psrc->last_picture.f->data[0])
return ff_thread_ref_frame(&pdst->last_picture, &psrc->last_picture); return ff_thread_ref_frame(&pdst->last_picture, &psrc->last_picture);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment