From patchwork Sat Aug 1 13:46:59 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21435 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 9329744AA8D for ; Sat, 1 Aug 2020 16:49:45 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7DED268BAC1; Sat, 1 Aug 2020 16:49:45 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f65.google.com (mail-ed1-f65.google.com [209.85.208.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E7D4F68BA9C for ; Sat, 1 Aug 2020 16:49:36 +0300 (EEST) Received: by mail-ed1-f65.google.com with SMTP id o10so14533787edh.6 for ; Sat, 01 Aug 2020 06:49:36 -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=ohshCoJp29ZUUd8gVmJ52dGVfFtT0qgpoUvz6pYmjaI=; b=MThZ/HBfBwO/1HRmxfP1y404QQhosZNLFm75V8VuINuQ+dtpSr4C682EZ/Rfq5UlyJ YARK+3IoGBnXmGapBiylMtJ07pPwF0UYKvjfpKtN+vUI5r8S/07xSssNC9oI4hIo+iG+ opUnFhRcDdHvEfoYaM6cI3RLoqaleW0JK41u/r7b3O4SGrKlf99pJ1ln2Hb19xgHrBeA d+svugr79N26GtaiEbcSOSpDCNrtcrH3qarKPv7d1XLjNgdP3MJDBnZNRyvSdIEZrxNP kZp1DjsNzSXHDCcN+4YeXG+/koasx6YQhzdQttmbxjK3Gwwh/6cnliSZ5KuGQkGiFeRn 5H6w== 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=ohshCoJp29ZUUd8gVmJ52dGVfFtT0qgpoUvz6pYmjaI=; b=Ejo8RrPVdWc6Yhqvegfzw6wW5QwYxjtMz8zyLgVfQQgHjYw9AbdA9dKXN/iy5eL841 wxfybGa6ZRVr1n+/bb/0Q8wgAnFkOli+klv6mPfK5hsUezOkltHY6wY7MR3iImObPHlw isLcu0rV350hzDcZ4tuQoSemNmkbYd+10AWrWnXnCGWjD9xvtmWwWipoWVrV8UrSNBTV 7h2OPhSBzGz/FWIC0VlECJe156YBOcnaMjkxthHg/C5RgI48ztns4Nv6wHH5x6VZT5+M EEHqaxEEQoBSyY7KTpizvPtftgycFUiQYOaOZFy8rJYpRPRHQX/RvgQZ4xZ9tJvBVrBD psxw== X-Gm-Message-State: AOAM532J3bmSGYsowh9R2pipYMUudPFOGaEMlAcbH2OEDSgb85UUQAMp dc0GJFSNSxk1Q/d1h5E3UtdBE9dq X-Google-Smtp-Source: ABdhPJy8MtMgWOspWbpIEkIUV+iwvIriTHBpESySfiVMr22aqFVQ1GTL0xJpWcJ8pjml3BMj9JErng== X-Received: by 2002:aa7:c2c6:: with SMTP id m6mr8474006edp.118.1596289776067; Sat, 01 Aug 2020 06:49:36 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id b24sm12178501edn.33.2020.08.01.06.49.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Aug 2020 06:49:35 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 1 Aug 2020 15:46:59 +0200 Message-Id: <20200801134704.3647-8-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 16/21] avcodec/smacker: Disentangle two contexts 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" Smacker uses two types of Huffman trees: Those for eight bit values and those for 16 bit values. Given that both return their values via arrays and that both need to check not to overrun their array, the context for parsing eight bit values (HuffContext) will necessarily exhibit certain similarities with the context used for parsing 16 bit values (DBCtx). These similarities led to using a HuffContext in addition a DBCtx for parsing 16 bit trees. This stands in the way of further developments for the HuffContext struct (when parsing eight bit trees, the length of the arrays are always 256, so that one can inline said value and move the currently heap-allocated tables directly in the structure). Signed-off-by: Andreas Rheinhardt --- libavcodec/smacker.c | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index 72e007077d..f5193e1278 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -75,6 +75,8 @@ typedef struct HuffContext { /* common parameters used for decode_bigtree */ typedef struct DBCtx { + int current, length; + int *values; VLC *v1, *v2; int *recode1, *recode2; int escapes[3]; @@ -138,8 +140,7 @@ static int smacker_decode_tree(GetBitContext *gb, HuffContext *hc, uint32_t pref * * Checks before the first read, can overread by 6 * SMKTREE_BITS on success. */ -static int smacker_decode_bigtree(GetBitContext *gb, HuffContext *hc, - DBCtx *ctx, int length) +static int smacker_decode_bigtree(GetBitContext *gb, DBCtx *ctx, int length) { // Larger length can cause segmentation faults due to too deep recursion. if (length > SMKTREE_DECODE_BIG_MAX_RECURSION) { @@ -147,7 +148,7 @@ static int smacker_decode_bigtree(GetBitContext *gb, HuffContext *hc, return AVERROR_INVALIDDATA; } - if (hc->current >= hc->length) { + if (ctx->current >= ctx->length) { av_log(NULL, AV_LOG_ERROR, "Tree size exceeded!\n"); return AVERROR_INVALIDDATA; } @@ -159,28 +160,28 @@ static int smacker_decode_bigtree(GetBitContext *gb, HuffContext *hc, i2 = ctx->v2->table ? get_vlc2(gb, ctx->v2->table, SMKTREE_BITS, 3) : 0; val = ctx->recode1[i1] | (ctx->recode2[i2] << 8); if(val == ctx->escapes[0]) { - ctx->last[0] = hc->current; + ctx->last[0] = ctx->current; val = 0; } else if(val == ctx->escapes[1]) { - ctx->last[1] = hc->current; + ctx->last[1] = ctx->current; val = 0; } else if(val == ctx->escapes[2]) { - ctx->last[2] = hc->current; + ctx->last[2] = ctx->current; val = 0; } - hc->values[hc->current++] = val; + ctx->values[ctx->current++] = val; return 1; } else { //Node int r = 0, r_new, t; - t = hc->current++; - r = smacker_decode_bigtree(gb, hc, ctx, length + 1); + t = ctx->current++; + r = smacker_decode_bigtree(gb, ctx, length + 1); if(r < 0) return r; - hc->values[t] = SMK_NODE | r; + ctx->values[t] = SMK_NODE | r; r++; - r_new = smacker_decode_bigtree(gb, hc, ctx, length + 1); + r_new = smacker_decode_bigtree(gb, ctx, length + 1); if (r_new < 0) return r_new; return r + r_new; @@ -195,7 +196,6 @@ static int smacker_decode_bigtree(GetBitContext *gb, HuffContext *hc, */ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int **recodes, int *last, int size) { - HuffContext huff; HuffContext h[2] = { 0 }; VLC vlc[2] = { { 0 } }; int escapes[3]; @@ -253,23 +253,22 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int ctx.recode1 = h[0].values; ctx.recode2 = h[1].values; ctx.last = last; - - huff.length = (size + 3) >> 2; - huff.current = 0; - huff.values = av_malloc_array(huff.length + 3, sizeof(huff.values[0])); - if (!huff.values) { + ctx.length = (size + 3) >> 2; + ctx.current = 0; + ctx.values = av_malloc_array(ctx.length + 3, sizeof(ctx.values[0])); + if (!ctx.values) { err = AVERROR(ENOMEM); goto error; } - *recodes = huff.values; + *recodes = ctx.values; - err = smacker_decode_bigtree(gb, &huff, &ctx, 0); + err = smacker_decode_bigtree(gb, &ctx, 0); if (err < 0) goto error; skip_bits1(gb); - if(ctx.last[0] == -1) ctx.last[0] = huff.current++; - if(ctx.last[1] == -1) ctx.last[1] = huff.current++; - if(ctx.last[2] == -1) ctx.last[2] = huff.current++; + if (ctx.last[0] == -1) ctx.last[0] = ctx.current++; + if (ctx.last[1] == -1) ctx.last[1] = ctx.current++; + if (ctx.last[2] == -1) ctx.last[2] = ctx.current++; err = 0; error: