From patchwork Fri Nov 20 07:20: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: 23841 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 75F0C448F87 for ; Fri, 20 Nov 2020 09:40:30 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 207D468BC39; Fri, 20 Nov 2020 09:25:59 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f67.google.com (mail-ej1-f67.google.com [209.85.218.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1090D68BB9D for ; Fri, 20 Nov 2020 09:25:39 +0200 (EET) Received: by mail-ej1-f67.google.com with SMTP id gj5so11500952ejb.8 for ; Thu, 19 Nov 2020 23:25:38 -0800 (PST) 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:reply-to :mime-version:content-transfer-encoding; bh=ziELYeJ7lLzU/HoMxep2WKuGk80o1WqqPy6pdcW9c1k=; b=TJQU37x0+UVuGE/7qK4uWaOboP3D2Dy35dx9yFUsq4aMUKi1uIHRRuTWfr8sVTJrb+ sg8k7m/usnmgzepk/7gAQh7VSEjbTDfc0REcOOQXFF5M5VJvg6LLLOMQkcViBJFrG7/n 17apZiWT7nzdXE9NA4aoT0tv05M9aFTt3R6YtK7fFz8H4UrAJTuVOK/2Rz/IYt9bCdXj JLUSuzDK+QtBGriXvgH7fuURv4FsgZ0lxFLr+5s8uK/lSmUsJEqSFFBWP3ubVz1hIK6e DeQl+EbkS9SgYytzsNTVK3vr4PXFrBkNK5DQJkyjL7Rfps/4ClBy7rZR6t1WnSHnmajN RHnA== 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:reply-to:mime-version:content-transfer-encoding; bh=ziELYeJ7lLzU/HoMxep2WKuGk80o1WqqPy6pdcW9c1k=; b=ZPhPX3MNHL/TRjxnKi8ba/Q97j5fA5RF7dmOZQzplqauOfwdgc9/aw/NqX3kyFwmul buRnw6vYG66fYKPXOHgPBv3weqkFffilameYhsb+Xv4uXFIRuxFneqwzqqmY8FNfhZBB rr0/llJB9oeIEesc+qdhUH/5tlbf2aRkX+9oeaxp1UfnCVDqDVbnOV2hcfthPOVt1Ez9 fj+5ez7HvhNOw2aB+0/Ydu1nMBtRwPRYS13q8675p2uim36S2MHKm4SS0A0CQXX5N3ZC oaq3bNed9cMkIKr/O7ClvTLBCghBPlPyUlPUX8Sa/96cUIjzB/2o26Htv+wzsO6elEFW Pq6A== X-Gm-Message-State: AOAM532CpWOO4wGNOIf1Eg6IGyFb2wb6ls60MnFdHbhnvw0q8VL6eOPf 9GQvCIPrJc59eizbyMNEZNJUE8TZhSvbig== X-Google-Smtp-Source: ABdhPJwSLpyCPQij4xa8tFpCh2uPL8YCRN+YYu94fpqDKuvkkwf8ic3j1AadH7vTqydMGnBcXIeHyQ== X-Received: by 2002:a17:907:1008:: with SMTP id ox8mr30990224ejb.189.1605857138131; Thu, 19 Nov 2020 23:25:38 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc1aa4b.dynamic.kabel-deutschland.de. [188.193.170.75]) by smtp.gmail.com with ESMTPSA id lz27sm779419ejb.39.2020.11.19.23.25.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Nov 2020 23:25:37 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 20 Nov 2020 08:20:01 +0100 Message-Id: <20201120072116.818090-89-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201120072116.818090-1-andreas.rheinhardt@gmail.com> References: <20201120072116.818090-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 088/162] avcodec/truemotion2: Simplify creating VLC 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" ff_init_vlc_from_lengths() can be used to offload the computation of the codes; it also allows to omit the check whether the codes are already properly ordered (they are). In this case, this also allows to avoid the allocation of the buffer for the codes. This improves performance: The amount of decicycles for one call to tm2_build_huff_tables() when decoding tm20.avi from the FATE-suite decreased from 46239 to 40035. This test consisted of looping 50 times over the file and iterating the test ten times. Signed-off-by: Andreas Rheinhardt --- libavcodec/truemotion2.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/libavcodec/truemotion2.c b/libavcodec/truemotion2.c index 0f4f345a6c..d6375ad489 100644 --- a/libavcodec/truemotion2.c +++ b/libavcodec/truemotion2.c @@ -108,15 +108,14 @@ typedef struct TM2Huff { int num; ///< current number filled int max_num; ///< total number of codes int *nums; ///< literals - uint32_t *bits; ///< codes - int *lens; ///< codelengths + uint8_t *lens; ///< codelengths } TM2Huff; /** * * @returns the length of the longest code or an AVERROR code */ -static int tm2_read_tree(TM2Context *ctx, uint32_t prefix, int length, TM2Huff *huff) +static int tm2_read_tree(TM2Context *ctx, int length, TM2Huff *huff) { int ret, ret2; if (length > huff->max_bits) { @@ -134,14 +133,13 @@ static int tm2_read_tree(TM2Context *ctx, uint32_t prefix, int length, TM2Huff * return AVERROR_INVALIDDATA; } huff->nums[huff->num] = get_bits_long(&ctx->gb, huff->val_bits); - huff->bits[huff->num] = prefix; huff->lens[huff->num] = length; huff->num++; return length; } else { /* non-terminal node */ - if ((ret2 = tm2_read_tree(ctx, prefix << 1, length + 1, huff)) < 0) + if ((ret2 = tm2_read_tree(ctx, length + 1, huff)) < 0) return ret2; - if ((ret = tm2_read_tree(ctx, (prefix << 1) | 1, length + 1, huff)) < 0) + if ((ret = tm2_read_tree(ctx, length + 1, huff)) < 0) return ret; } return FFMAX(ret, ret2); @@ -177,15 +175,14 @@ static int tm2_build_huff_table(TM2Context *ctx, TM2Codes *code) /* allocate space for codes - it is exactly ceil(nodes / 2) entries */ huff.max_num = (huff.nodes + 1) >> 1; huff.nums = av_calloc(huff.max_num, sizeof(int)); - huff.bits = av_calloc(huff.max_num, sizeof(uint32_t)); - huff.lens = av_calloc(huff.max_num, sizeof(int)); + huff.lens = av_mallocz(huff.max_num); - if (!huff.nums || !huff.bits || !huff.lens) { + if (!huff.nums || !huff.lens) { res = AVERROR(ENOMEM); goto out; } - res = tm2_read_tree(ctx, 0, 0, &huff); + res = tm2_read_tree(ctx, 0, &huff); if (res >= 0 && res != huff.max_bits) { av_log(ctx->avctx, AV_LOG_ERROR, "Got less bits than expected: %i of %i\n", @@ -200,9 +197,9 @@ static int tm2_build_huff_table(TM2Context *ctx, TM2Codes *code) /* convert codes to vlc_table */ if (res >= 0) { - res = init_vlc(&code->vlc, huff.max_bits, huff.max_num, - huff.lens, sizeof(int), sizeof(int), - huff.bits, sizeof(uint32_t), sizeof(uint32_t), 0); + res = ff_init_vlc_from_lengths(&code->vlc, huff.max_bits, huff.max_num, + huff.lens, sizeof(huff.lens[0]), + NULL, 0, 0, 0, 0, ctx->avctx); if (res < 0) av_log(ctx->avctx, AV_LOG_ERROR, "Cannot build VLC table\n"); else { @@ -216,7 +213,6 @@ static int tm2_build_huff_table(TM2Context *ctx, TM2Codes *code) out: /* free allocated memory */ av_free(huff.nums); - av_free(huff.bits); av_free(huff.lens); return res;