Revert "avcodec/aarch64/neon.S: Update neon.s for transpose_4x4H"
[ffmpeg.git] / libavcodec / screenpresso.c
index d25d0eb..2c4bb19 100644 (file)
@@ -2,20 +2,20 @@
  * Screenpresso decoder
  * Copyright (C) 2015 Vittorio Giovara <vittorio.giovara@gmail.com>
  *
- * This file is part of Libav.
+ * This file is part of FFmpeg.
  *
- * Libav is free software; you can redistribute it and/or
+ * FFmpeg is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  *
- * Libav is distributed in the hope that it will be useful,
+ * FFmpeg is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with Libav; if not, write to the Free Software
+ * License along with FFmpeg; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
@@ -39,6 +39,7 @@
 
 #include "libavutil/imgutils.h"
 #include "libavutil/internal.h"
+#include "libavutil/mem.h"
 
 #include "avcodec.h"
 #include "internal.h"
@@ -80,6 +81,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 +107,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 +125,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] +