From c4dc6c4c86a052b7ba53fa7ae0c1b0643ad70d0b Mon Sep 17 00:00:00 2001 From: Carl Eugen Hoyos Date: Wed, 20 Feb 2013 22:54:21 +0100 Subject: [PATCH] Fix bits_per_coded_sample when encoding png with frame-level multithreading. Fixes ticket #2290. --- libavcodec/pngenc.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/libavcodec/pngenc.c b/libavcodec/pngenc.c index 7ba14b2d0d..a401c78f77 100644 --- a/libavcodec/pngenc.c +++ b/libavcodec/pngenc.c @@ -244,12 +244,10 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, color_type = PNG_COLOR_TYPE_RGB; break; case AV_PIX_FMT_RGBA: - avctx->bits_per_coded_sample = 32; bit_depth = 8; color_type = PNG_COLOR_TYPE_RGB_ALPHA; break; case AV_PIX_FMT_RGB24: - avctx->bits_per_coded_sample = 24; bit_depth = 8; color_type = PNG_COLOR_TYPE_RGB; break; @@ -258,7 +256,6 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, color_type = PNG_COLOR_TYPE_GRAY; break; case AV_PIX_FMT_GRAY8: - avctx->bits_per_coded_sample = 0x28; bit_depth = 8; color_type = PNG_COLOR_TYPE_GRAY; break; @@ -267,12 +264,10 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, color_type = PNG_COLOR_TYPE_GRAY_ALPHA; break; case AV_PIX_FMT_MONOBLACK: - avctx->bits_per_coded_sample = bit_depth = 1; color_type = PNG_COLOR_TYPE_GRAY; break; case AV_PIX_FMT_PAL8: - avctx->bits_per_coded_sample = bit_depth = 8; color_type = PNG_COLOR_TYPE_PALETTE; break; @@ -437,6 +432,23 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, static av_cold int png_enc_init(AVCodecContext *avctx){ PNGEncContext *s = avctx->priv_data; + switch(avctx->pix_fmt) { + case AV_PIX_FMT_RGBA: + avctx->bits_per_coded_sample = 32; + break; + case AV_PIX_FMT_RGB24: + avctx->bits_per_coded_sample = 24; + break; + case AV_PIX_FMT_GRAY8: + avctx->bits_per_coded_sample = 0x28; + break; + case AV_PIX_FMT_MONOBLACK: + avctx->bits_per_coded_sample = 1; + break; + case AV_PIX_FMT_PAL8: + avctx->bits_per_coded_sample = 8; + } + avcodec_get_frame_defaults(&s->picture); avctx->coded_frame= &s->picture; ff_dsputil_init(&s->dsp, avctx);