From 3c5cf2a31b4b29a8e4282cbe6a3f0617c14698b8 Mon Sep 17 00:00:00 2001 From: Vittorio Giovara Date: Mon, 19 Oct 2015 14:34:09 +0200 Subject: [PATCH] screenpresso: Drop parameter change check Size can never change, allowing us to use ff_reget_buffer, and to simplify the code a little. --- libavcodec/screenpresso.c | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/libavcodec/screenpresso.c b/libavcodec/screenpresso.c index d25d0ebb9d..6c434de827 100644 --- a/libavcodec/screenpresso.c +++ b/libavcodec/screenpresso.c @@ -80,6 +80,12 @@ static av_cold int screenpresso_init(AVCodecContext *avctx) avctx->pix_fmt = AV_PIX_FMT_BGR24; + /* Allocate maximum size possible, a full frame */ + ctx->inflated_size = avctx->width * avctx->height * 3; + ctx->inflated_buf = av_malloc(ctx->inflated_size); + if (!ctx->inflated_buf) + return AVERROR(ENOMEM); + return 0; } @@ -100,6 +106,7 @@ static int screenpresso_decode_frame(AVCodecContext *avctx, void *data, { ScreenpressoContext *ctx = avctx->priv_data; AVFrame *frame = data; + uLongf length = ctx->inflated_size; int keyframe; int ret; @@ -117,30 +124,18 @@ static int screenpresso_decode_frame(AVCodecContext *avctx, void *data, } keyframe = (avpkt->data[0] == 0x73); - /* Resize deflate buffer and frame on resolution change */ - if (ctx->inflated_size != avctx->width * avctx->height * 3) { - av_frame_unref(ctx->current); - ret = ff_get_buffer(avctx, ctx->current, AV_GET_BUFFER_FLAG_REF); - if (ret < 0) - return ret; - - /* If malloc fails, reset len to avoid preserving an invalid value */ - ctx->inflated_size = avctx->width * avctx->height * 3; - ret = av_reallocp(&ctx->inflated_buf, ctx->inflated_size); - if (ret < 0) { - ctx->inflated_size = 0; - return ret; - } - } - /* Inflate the frame after the 2 byte header */ - ret = uncompress(ctx->inflated_buf, &ctx->inflated_size, + ret = uncompress(ctx->inflated_buf, &length, avpkt->data + 2, avpkt->size - 2); if (ret) { av_log(avctx, AV_LOG_ERROR, "Deflate error %d.\n", ret); return AVERROR_UNKNOWN; } + ret = ff_reget_buffer(avctx, ctx->current); + if (ret < 0) + return ret; + /* When a keyframe is found, copy it (flipped) */ if (keyframe) av_image_copy_plane(ctx->current->data[0] +