From patchwork Sun Mar 12 11:40:40 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 2900 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.50.79 with SMTP id y76csp777318vsy; Sun, 12 Mar 2017 04:41:05 -0700 (PDT) X-Received: by 10.28.69.202 with SMTP id l71mr6567441wmi.68.1489318865120; Sun, 12 Mar 2017 04:41:05 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a60si20433314wrc.277.2017.03.12.04.41.04; Sun, 12 Mar 2017 04:41:05 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 26184689B24; Sun, 12 Mar 2017 13:40:46 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C28DB6882D1 for ; Sun, 12 Mar 2017 13:40:39 +0200 (EET) Received: by mail-wm0-f65.google.com with SMTP id v190so5636558wme.3 for ; Sun, 12 Mar 2017 04:40:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=DE/arChI32QqHrFswfnSt2x1mO8tuQTlELox4LfCTmk=; b=OMPx7xPlz+73K7SAuIm9Lm4F/6YEj4qh6HIEtbckh8zm8h6o+rfOo3fYNncJDoFdqY JUymMnWnmPqhtDbET05I9urhnb1I7gLLJJX6hKduZhpEZbSoJT3R+i58b87r6MkzdCV4 NAId9sVqLBmTJK/2U2n2U+sIGj3sSQ497m9cORZfPiSGrvCsj2IkpdM5Ql+FcXXwjLPe EskFzUtnj8DAVk42IMf2roVqqCyRAIGtgn9EbQGalOyEpZCfh2FPwqjtL2PndCmDrzsD AkfriZHwaYzNBonnFvmzReVaqAnoPa7gOnNRLMHh4aUC9hp8zK9Is24hAs9CPmOXC1Z8 +UCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=DE/arChI32QqHrFswfnSt2x1mO8tuQTlELox4LfCTmk=; b=QwGgqm3jbWzbMQP2CS4T36GjNoShAHChsEQUutZHCCo/6rvklJ675wkrIVpDsDtNw/ i0Yo0MHXsP2oTf2pO64Yzu7aUMl5+gdYj1YxgSAWc7E/ebVUmqp/zLhS1xy0PlQstWfa eGXaSct/gHt5EsAoHfwDyflGdIj6l7KFGdWHjaX+KhS/j6ODJiMEO4hwX44B/ts884/b FiIx6zrdZR+y9nHnV5LY0UHDJhSGmrwWrXZXmKLyaEVntM8Sd33fP0AIaTCOVDTW/ZAH lfN4KiCQBzeU0wK81oyN08Jwl5yyAoW8lPma2Fk/WKleyTtN3W2LoZ+qk1H8pgmPiDrY NfrQ== X-Gm-Message-State: AFeK/H0tjhyUaaGAEU5O0vsbbJREZF4e8SyxCGJSTUT8+Jm1t/Dn0gAdoJUVr07yxdkeKA== X-Received: by 10.28.44.66 with SMTP id s63mr5618658wms.77.1489318854292; Sun, 12 Mar 2017 04:40:54 -0700 (PDT) Received: from localhost.localdomain ([94.250.174.60]) by smtp.gmail.com with ESMTPSA id j26sm20824254wrb.69.2017.03.12.04.40.52 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 12 Mar 2017 04:40:52 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Sun, 12 Mar 2017 12:40:40 +0100 Message-Id: <20170312114040.25287-2-onemda@gmail.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170312114040.25287-1-onemda@gmail.com> References: <20170312114040.25287-1-onemda@gmail.com> Subject: [FFmpeg-devel] [PATCH 2/2] avcodec/scpr: rework frame handling X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- libavcodec/scpr.c | 49 +++++++++++++++++++------------------------------ 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/libavcodec/scpr.c b/libavcodec/scpr.c index a37e99a..2d190db 100644 --- a/libavcodec/scpr.c +++ b/libavcodec/scpr.c @@ -45,7 +45,6 @@ typedef struct PixelModel { typedef struct SCPRContext { AVFrame *last_frame; - AVFrame *current_frame; GetByteContext gb; RangeCoder rc; PixelModel pixel_model[3][4096]; @@ -751,12 +750,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVFrame *frame = data; int ret, type; - if (avctx->bits_per_coded_sample == 16) { - if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) - return ret; - } - - if ((ret = ff_reget_buffer(avctx, s->current_frame)) < 0) + if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) return ret; bytestream2_init(gb, avpkt->data, avpkt->size); @@ -767,16 +761,16 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, s->get_freq = get_freq0; s->decode = decode0; frame->key_frame = 1; - ret = decompress_i(avctx, (uint32_t *)s->current_frame->data[0], - s->current_frame->linesize[0] / 4); + ret = decompress_i(avctx, (uint32_t *)frame->data[0], + frame->linesize[0] / 4); } else if (type == 18) { s->get_freq = get_freq; s->decode = decode; frame->key_frame = 1; - ret = decompress_i(avctx, (uint32_t *)s->current_frame->data[0], - s->current_frame->linesize[0] / 4); + ret = decompress_i(avctx, (uint32_t *)frame->data[0], + frame->linesize[0] / 4); } else if (type == 17) { - uint32_t clr, *dst = (uint32_t *)s->current_frame->data[0]; + uint32_t clr, *dst = (uint32_t *)frame->data[0]; int x, y; frame->key_frame = 1; @@ -796,17 +790,18 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, for (x = 0; x < avctx->width; x++) { dst[x] = clr; } - dst += s->current_frame->linesize[0] / 4; + dst += frame->linesize[0] / 4; } } else if (type == 0 || type == 1) { frame->key_frame = 0; - ret = av_frame_copy(s->current_frame, s->last_frame); + ret = av_frame_copy(frame, s->last_frame); if (ret < 0) return ret; + av_frame_make_writable(frame); - ret = decompress_p(avctx, (uint32_t *)s->current_frame->data[0], - s->current_frame->linesize[0] / 4, + ret = decompress_p(avctx, (uint32_t *)frame->data[0], + frame->linesize[0] / 4, (uint32_t *)s->last_frame->data[0], s->last_frame->linesize[0] / 4); } else { @@ -816,18 +811,16 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, if (ret < 0) return ret; - if (avctx->bits_per_coded_sample != 16) { - ret = av_frame_ref(data, s->current_frame); - if (ret < 0) - return ret; - } else { + av_frame_unref(s->last_frame); + s->last_frame = av_frame_clone(frame); + if (!s->last_frame) + return AVERROR(ENOMEM); + + if (avctx->bits_per_coded_sample == 16) { uint8_t *dst = frame->data[0]; int x, y; - ret = av_frame_copy(frame, s->current_frame); - if (ret < 0) - return ret; - + av_frame_make_writable(s->last_frame); for (y = 0; y < avctx->height; y++) { for (x = 0; x < avctx->width * 4; x++) { dst[x] = dst[x] << 3; @@ -838,8 +831,6 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, frame->pict_type = frame->key_frame ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P; - FFSWAP(AVFrame *, s->current_frame, s->last_frame); - *got_frame = 1; return avpkt->size; @@ -871,8 +862,7 @@ static av_cold int decode_init(AVCodecContext *avctx) return AVERROR(ENOMEM); s->last_frame = av_frame_alloc(); - s->current_frame = av_frame_alloc(); - if (!s->last_frame || !s->current_frame) + if (!s->last_frame) return AVERROR(ENOMEM); return 0; @@ -884,7 +874,6 @@ static av_cold int decode_close(AVCodecContext *avctx) av_freep(&s->blocks); av_frame_free(&s->last_frame); - av_frame_free(&s->current_frame); return 0; }