From patchwork Sat Aug 1 13:47:01 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21437 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 92BD044AA8D for ; Sat, 1 Aug 2020 16:49:47 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7B2CB68BAE8; Sat, 1 Aug 2020 16:49:47 +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 C1A1668BAA4 for ; Sat, 1 Aug 2020 16:49:38 +0300 (EEST) Received: by mail-ed1-f65.google.com with SMTP id bs17so5461704edb.1 for ; Sat, 01 Aug 2020 06:49:38 -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=FnMeHaePvGxKs6svELM5Hvv6MQUajQ+qjNryDBZpryg=; b=aAQF8Ww4rBJUF7wk6beAnou7NtdG4u+4XEf7aVavnzAeY9CMZfHtltspE1u5EwjeNQ TOytL8gPQrDQvmksAmAzS0lYAyWcBv0t2JpyZCq2ucqpIkBiCcrvASVitMLrKZflCuNC LcSYMN7tzUid1Vubk9gibmBHkeYngnbpHYwdbL9BCmDHW3lJtUIySfUDw7kh0DG+zGpj YtkkYk61BTAhvuBBYUUp1YOKPqQR92dzSn3v3kJijb09WBk+18pm7A7WKPIPJmbO8hwx LXdDLweHlusjQmSPvxH5xpnaS2MSXVXoj+tnk5fi4y5u1dlLZ1MD38d3b/9b9WWClB7k wl0A== 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=FnMeHaePvGxKs6svELM5Hvv6MQUajQ+qjNryDBZpryg=; b=EDaJ+eTo09vx2JbLWNirxzS/EiaieDCb0Pv9kjzMID3nwnyvH9rbeaZy0HaPWb07ai 26NnIWmOW5EwIo7x1Zmf9m7ItmT0zVhg9uPEojNBTW4MyqaCbKQWCeV482yflR/vudnN n1muISdaXINMfu7dalI0xZTPDVJ8nhryO0Olb0SoBJ1m/rZYr1mHgeMLwc/1qrm5qxfA yai7BUIFycxBDXRaBnmcJrVlAvuVRDL5bqEtEpurkNZ5B42OfBhIDUaqGz6iQOaW/04V IgitTbNn47x5BscSqdQi3BwY1EOskRgsK8eQZxADr33bHIzDBHL97FTMUueO9P1xtI7U DoGg== X-Gm-Message-State: AOAM5327MkO1n7PpsqsujoHdEYg5qdTHx4uiI2ESU9gqex8dEowrxkW9 vO3ea6UPs9VlcphMlUD4N+xwKrmo X-Google-Smtp-Source: ABdhPJy40ry3wVjWPKm4zAXA7rBZk/0sSQXbMnVU4LBhAa9iPRSuQP5CB8TPvd4LFNxjJDjqr+h//w== X-Received: by 2002:aa7:c2d7:: with SMTP id m23mr8329241edp.216.1596289777812; Sat, 01 Aug 2020 06:49:37 -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.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Aug 2020 06:49:37 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 1 Aug 2020 15:47:01 +0200 Message-Id: <20200801134704.3647-10-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 18/21] avcodec/smacker: Use symbols table 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" Up until now, the return value of get_vlc2() has been used as an index in an array that contained the value one is really interested in. Yet since b613bacca9c256f1483c46847f713e47a0e9a5f6 this is no longer necessary, as one can store the value that is right now stored in the array in the VLC internal table. This also means that all the information from the eight bit Huffman trees are now stored in the corresponding VLC table; this will enable us to remove several allocations lateron. This improved performance: For GCC 9 the time for one call of smka_decode_frame() for the sample from ticket #2425 decreased from 1811706 to 1794494 decicycles; for Clang 9 the number went from 1471663 to 1449420 decicycles. Signed-off-by: Andreas Rheinhardt --- libavcodec/smacker.c | 54 ++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index c1928e3908..15c8856e69 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -78,7 +78,7 @@ typedef struct DBCtx { int current, length; int *values; VLC *v1, *v2; - const uint8_t *recode1, *recode2; + uint8_t vals[2]; int escapes[3]; int *last; } DBCtx; @@ -156,9 +156,11 @@ static int smacker_decode_bigtree(GetBitContext *gb, DBCtx *ctx, int length) return AVERROR_INVALIDDATA; if(!get_bits1(gb)){ //Leaf int val, i1, i2; - i1 = ctx->v1->table ? get_vlc2(gb, ctx->v1->table, SMKTREE_BITS, 3) : 0; - i2 = ctx->v2->table ? get_vlc2(gb, ctx->v2->table, SMKTREE_BITS, 3) : 0; - val = ctx->recode1[i1] | (ctx->recode2[i2] << 8); + i1 = ctx->v1->table ? get_vlc2(gb, ctx->v1->table, SMKTREE_BITS, 3) + : ctx->vals[0]; + i2 = ctx->v2->table ? get_vlc2(gb, ctx->v2->table, SMKTREE_BITS, 3) + : ctx->vals[1]; + val = i1 | (i2 << 8); if(val == ctx->escapes[0]) { ctx->last[0] = ctx->current; val = 0; @@ -218,7 +220,7 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int goto error; } if (!get_bits1(gb)) { - h[i].values[0] = 0; + ctx.vals[i] = 0; av_log(smk->avctx, AV_LOG_ERROR, "Skipping %s bytes tree\n", i ? "high" : "low"); continue; @@ -228,15 +230,17 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int goto error; skip_bits1(gb); if (h[i].current > 1) { - err = init_vlc(&vlc[i], SMKTREE_BITS, h[i].current, + err = ff_init_vlc_sparse(&vlc[i], SMKTREE_BITS, h[i].current, INIT_VLC_DEFAULT_SIZES(h[i].lengths), INIT_VLC_DEFAULT_SIZES(h[i].bits), + INIT_VLC_DEFAULT_SIZES(h[i].values), INIT_VLC_LE); if (err < 0) { av_log(smk->avctx, AV_LOG_ERROR, "Cannot build VLC table\n"); goto error; } - } + } else + ctx.vals[i] = h[i].values[0]; } escapes[0] = get_bits(gb, 16); @@ -250,8 +254,6 @@ 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 = h[0].values; - ctx.recode2 = h[1].values; ctx.last = last; ctx.length = (size + 3) >> 2; ctx.current = 0; @@ -605,6 +607,7 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, VLC vlc[4] = { { 0 } }; int16_t *samples; uint8_t *samples8; + uint8_t values[4]; int val; int i, res, ret; int unp_size; @@ -670,14 +673,17 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, goto error; skip_bits1(&gb); if(h[i].current > 1) { - ret = init_vlc(&vlc[i], SMKTREE_BITS, h[i].current, + ret = ff_init_vlc_sparse(&vlc[i], SMKTREE_BITS, h[i].current, INIT_VLC_DEFAULT_SIZES(h[i].lengths), - h[i].bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE); + INIT_VLC_DEFAULT_SIZES(h[i].bits), + INIT_VLC_DEFAULT_SIZES(h[i].values), + INIT_VLC_LE); if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "Cannot build VLC table\n"); goto error; } - } + } else + values[i] = h[i].values[0]; } /* this codec relies on wraparound instead of clipping audio */ if(bits) { //decode 16-bit data @@ -694,26 +700,26 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, if(vlc[2].table) res = get_vlc2(&gb, vlc[2].table, SMKTREE_BITS, 3); else - res = 0; - val = h[2].values[res]; + res = values[2]; + val = res; if(vlc[3].table) res = get_vlc2(&gb, vlc[3].table, SMKTREE_BITS, 3); else - res = 0; - val |= h[3].values[res] << 8; + res = values[3]; + val |= res << 8; pred[1] += (unsigned)sign_extend(val, 16); *samples++ = pred[1]; } else { if(vlc[0].table) res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3); else - res = 0; - val = h[0].values[res]; + res = values[0]; + val = res; if(vlc[1].table) res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3); else - res = 0; - val |= h[1].values[res] << 8; + res = values[1]; + val |= res << 8; pred[0] += (unsigned)sign_extend(val, 16); *samples++ = pred[0]; } @@ -732,15 +738,15 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, if(vlc[1].table) res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3); else - res = 0; - pred[1] += sign_extend(h[1].values[res], 8); + res = values[1]; + pred[1] += sign_extend(res, 8); *samples8++ = pred[1]; } else { if(vlc[0].table) res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3); else - res = 0; - pred[0] += sign_extend(h[0].values[res], 8); + res = values[0]; + pred[0] += sign_extend(res, 8); *samples8++ = pred[0]; } }