From patchwork Fri Jul 31 11:22:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21405 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id A161D44998B for ; Fri, 31 Jul 2020 14:23:37 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9045E68B863; Fri, 31 Jul 2020 14:23:37 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f66.google.com (mail-ej1-f66.google.com [209.85.218.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 085C768B844 for ; Fri, 31 Jul 2020 14:23:30 +0300 (EEST) Received: by mail-ej1-f66.google.com with SMTP id g19so17254751ejc.9 for ; Fri, 31 Jul 2020 04:23:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=+yRWS8F++ulHz+ZZmQv+AZlZ9afPVVWAQAfgSqbAOqg=; b=sbMa1iSxSDXmtqLFfM1/5uzLwC00mhxtqqk2KtYYaf7Yb9gg9zyvzud9ByMXPvjRC8 iBM43hgdXmB5r0kmwq5U+GxIOeQp88uvcsfOw307EXflIcTuRZWwWWIwIi1vhV1lxw2C gdNqTm4DllpBNc/DIh6/OemoWf82UdqLYQHLFIBm+Eajl06NRwg0UcFq/j0xaQqAYNIW 4FdFm+rTQxpL9WNHblH1tYpyDLy6P4d8YPL+Wqxu1dfJde6bsY7bAoULAbI9YBuw3bTY D4m+GaXMo44Z8Ms8gx3gz1Ao26dYTfTgl6+JxQ78VZ/N3aRjO+chYHfewi9fCrtZ2ty/ SrBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=+yRWS8F++ulHz+ZZmQv+AZlZ9afPVVWAQAfgSqbAOqg=; b=Kff/nCN/P6hHuJboTPSolNNo6Dlp6Ig/+5oB1eOVE24tNSO1VhgzVPR7HFZ8UpL4Xk nJrP/e2vRRrh5GPRqTQmG3CZ9U4eGSJG+z2CdFCft26wdRmfOkLJpRQyYHETMsFtAqRN i9DLajztnaHTr+NSQp9bqM+6l/Oj/4Hzu3ukTvuVBLipUQUWKZ3aFEVmIw7CQGOaUcuH 43dP0F5fP3zitcMyOLetOI0Z9mBP7iu0OdCcIcgd/uFXpjsprnVlHsXAT4Yci9Tq9RyI y+ULVbh6M/aBSqj5JbqIZjSNnNOZ44ERdRj/y1ImHcm2dWjwBWYqvoQoTLiDHX91Vt9n xgww== X-Gm-Message-State: AOAM530OMAnS6Y6wpq+QYQ4uimnWafIKwpdK66R3R7T9gl8iB06HBPiB Q4pRCiFfTGFNc626Spxc00/LtPJf X-Google-Smtp-Source: ABdhPJwlKZWnGVShrImrcwzD9JFbCtZugwPWOGwhwRAlrNsAKCxRigce6BbPA4IKDE3uv3uEIVW+XQ== X-Received: by 2002:a17:907:aaa:: with SMTP id bz10mr3473837ejc.304.1596194609051; Fri, 31 Jul 2020 04:23:29 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id v22sm9284279edq.35.2020.07.31.04.23.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2020 04:23:28 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 31 Jul 2020 13:22:37 +0200 Message-Id: <20200731112241.8948-4-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200731112241.8948-1-andreas.rheinhardt@gmail.com> References: <20200731112241.8948-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/8] avcodec/smacker: Remove code duplication when decoding header trees 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Andreas Rheinhardt --- libavcodec/smacker.c | 83 +++++++++++++++----------------------------- 1 file changed, 28 insertions(+), 55 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index 3c9f118fb7..b6245a0ce1 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -184,7 +184,7 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int { int res; HuffContext huff; - HuffContext tmp1, tmp2; + HuffContext h[2] = { 0 }; VLC vlc[2] = { { 0 } }; int escapes[3]; DBCtx ctx; @@ -195,62 +195,38 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int return AVERROR_INVALIDDATA; } - tmp1.length = 256; - tmp1.current = 0; - tmp1.bits = av_mallocz(256 * 4); - tmp1.lengths = av_mallocz(256 * sizeof(int)); - tmp1.values = av_mallocz(256 * sizeof(int)); - - tmp2.length = 256; - tmp2.current = 0; - tmp2.bits = av_mallocz(256 * 4); - tmp2.lengths = av_mallocz(256 * sizeof(int)); - tmp2.values = av_mallocz(256 * sizeof(int)); - if (!tmp1.bits || !tmp1.lengths || !tmp1.values || - !tmp2.bits || !tmp2.lengths || !tmp2.values) { - err = AVERROR(ENOMEM); - goto error; - } - - if(get_bits1(gb)) { - res = smacker_decode_tree(gb, &tmp1, 0, 0); - if (res < 0) { - err = res; + for (int i = 0; i < 2; i++) { + h[i].length = 256; + h[i].current = 0; + h[i].bits = av_mallocz(256 * sizeof(h[i].bits[0])); + h[i].lengths = av_mallocz(256 * sizeof(h[i].lengths[0])); + h[i].values = av_mallocz(256 * sizeof(h[i].values[0])); + if (!h[i].bits || !h[i].lengths || !h[i].values) { + err = AVERROR(ENOMEM); goto error; } - skip_bits1(gb); - if(tmp1.current > 1) { - res = init_vlc(&vlc[0], SMKTREE_BITS, tmp1.length, - tmp1.lengths, sizeof(int), sizeof(int), - tmp1.bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE); - if(res < 0) { - av_log(smk->avctx, AV_LOG_ERROR, "Cannot build VLC table\n"); - err = res; - goto error; - } + if (!get_bits1(gb)) { + av_log(smk->avctx, AV_LOG_ERROR, "Skipping %s bytes tree\n", + i ? "high" : "low"); + continue; } - } else { - av_log(smk->avctx, AV_LOG_ERROR, "Skipping low bytes tree\n"); - } - if(get_bits1(gb)){ - res = smacker_decode_tree(gb, &tmp2, 0, 0); + res = smacker_decode_tree(gb, &h[i], 0, 0); if (res < 0) { err = res; goto error; } skip_bits1(gb); - if(tmp2.current > 1) { - res = init_vlc(&vlc[1], SMKTREE_BITS, tmp2.length, - tmp2.lengths, sizeof(int), sizeof(int), - tmp2.bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE); + if (h[i].current > 1) { + res = init_vlc(&vlc[i], SMKTREE_BITS, h[i].length, + INIT_VLC_DEFAULT_SIZES(h[i].lengths), + INIT_VLC_DEFAULT_SIZES(h[i].bits), + INIT_VLC_LE); if(res < 0) { av_log(smk->avctx, AV_LOG_ERROR, "Cannot build VLC table\n"); err = res; goto error; } } - } else { - av_log(smk->avctx, AV_LOG_ERROR, "Skipping high bytes tree\n"); } escapes[0] = get_bits(gb, 16); @@ -264,8 +240,8 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int ctx.escapes[2] = escapes[2]; ctx.v1 = &vlc[0]; ctx.v2 = &vlc[1]; - ctx.recode1 = tmp1.values; - ctx.recode2 = tmp2.values; + ctx.recode1 = h[0].values; + ctx.recode2 = h[1].values; ctx.last = last; huff.length = ((size + 3) >> 2) + 4; @@ -293,16 +269,13 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int *recodes = huff.values; error: - if(vlc[0].table) - ff_free_vlc(&vlc[0]); - if(vlc[1].table) - ff_free_vlc(&vlc[1]); - av_free(tmp1.bits); - av_free(tmp1.lengths); - av_free(tmp1.values); - av_free(tmp2.bits); - av_free(tmp2.lengths); - av_free(tmp2.values); + for (int i = 0; i < 2; i++) { + if (vlc[i].table) + ff_free_vlc(&vlc[i]); + av_free(h[i].bits); + av_free(h[i].lengths); + av_free(h[i].values); + } return err; }