summaryrefslogtreecommitdiff
path: root/libavcodec/screenpresso.c
diff options
context:
space:
mode:
authorVittorio Giovara <vittorio.giovara@gmail.com>2015-10-19 14:34:09 +0200
committerVittorio Giovara <vittorio.giovara@gmail.com>2015-10-25 22:44:21 +0100
commit3c5cf2a31b4b29a8e4282cbe6a3f0617c14698b8 (patch)
tree896d87b205a68af5b6fe7d4a58a95a7e086fb5be /libavcodec/screenpresso.c
parent447b5b278c689b21bbb7b5747c8773145cbd9448 (diff)
screenpresso: Drop parameter change check
Size can never change, allowing us to use ff_reget_buffer, and to simplify the code a little.
Diffstat (limited to 'libavcodec/screenpresso.c')
-rw-r--r--libavcodec/screenpresso.c29
1 files 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] +