aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/proresenc.c
diff options
context:
space:
mode:
authorChristophe Gisquet <christophe.gisquet@gmail.com>2014-08-18 14:15:24 +0000
committerLuca Barbato <lu_zero@gentoo.org>2014-08-18 18:58:01 +0200
commit41e1354c101004ccd46dc08d3dd6e956e83a6b51 (patch)
treea5ca85bddb18baf38c2d352571e869db641ad00d /libavcodec/proresenc.c
parent45ce880a9b3e50cfa088f111dffaf8685bd7bc6b (diff)
downloadffmpeg-41e1354c101004ccd46dc08d3dd6e956e83a6b51.tar.gz
proresenc: Properly account for alpha plane
The packet buffer allocation considers the alpha channel as DCT-coded, while it is actually run-coded and thus requires a larger buffer. CC: libav-stable@libav.org Signed-off-by: Diego Biurrun <diego@biurrun.de> Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Diffstat (limited to 'libavcodec/proresenc.c')
-rw-r--r--libavcodec/proresenc.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/libavcodec/proresenc.c b/libavcodec/proresenc.c
index 262f0badc4..3a82c2c893 100644
--- a/libavcodec/proresenc.c
+++ b/libavcodec/proresenc.c
@@ -1246,8 +1246,6 @@ static av_cold int encode_init(AVCodecContext *avctx)
ctx->bits_per_mb = ls * 8;
if (ctx->chroma_factor == CFACTOR_Y444)
ctx->bits_per_mb += ls * 4;
- if (ctx->num_planes == 4)
- ctx->bits_per_mb += ls * 4;
}
ctx->frame_size_upper_bound = ctx->pictures_per_frame *
@@ -1256,6 +1254,14 @@ static av_cold int encode_init(AVCodecContext *avctx)
(mps * ctx->bits_per_mb) / 8)
+ 200;
+ if (ctx->alpha_bits) {
+ // The alpha plane is run-coded and might exceed the bit budget.
+ ctx->frame_size_upper_bound += ctx->pictures_per_frame *
+ ctx->slices_per_picture *
+ /* num pixels per slice */ (ctx->mbs_per_slice * 256 *
+ /* bits per pixel */ (1 + ctx->alpha_bits + 1) + 7 >> 3);
+ }
+
avctx->codec_tag = ctx->profile_info->tag;
av_log(avctx, AV_LOG_DEBUG,