From patchwork Fri Jul 31 11:22:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21402 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 9DDC244A7CB for ; Fri, 31 Jul 2020 14:22:58 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7B51D68B815; Fri, 31 Jul 2020 14:22:58 +0300 (EEST) 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 3B5A568B7CB for ; Fri, 31 Jul 2020 14:22:52 +0300 (EEST) Received: by mail-ej1-f67.google.com with SMTP id o18so31044057eje.7 for ; Fri, 31 Jul 2020 04:22:52 -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:mime-version :content-transfer-encoding; bh=QuWfJP6R4unTFgHcPjlwx7uG6wAoVdH8Qimyc/guKxg=; b=ZhyA50ROVw+dC7lHA3O+DFWvV7acEbn6pvL9JQanY6lomrvkq4J1WyGxS5CIRTpkH+ TgyiJjYAACAg51CjWM6jqWWSQT751IfZSBNpKoEi5beEv1ilZxv219jmbOQTyjGe0wHR luEfRRqm7I6HzRr+sInohERJbe8iymc4v1Hl1j4BSqhT5ccYO4DTVR50u7xHDWcG/EWu MJnVz3J0vQIWMlQMzPZF0F3JvXzkqQOwJhm7Qc8TpKvqCn3hz8SHA3M1OypPmjyx1fQf zJzWYDh0nz77aLx2wRmLHa1TSZRmn8QKDR4pEIsnisW84hAumw7T4h+ovp7B/+Va93+0 JWtA== 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:mime-version :content-transfer-encoding; bh=QuWfJP6R4unTFgHcPjlwx7uG6wAoVdH8Qimyc/guKxg=; b=syVvCaA7/Xi8H2kvKleX5azQjJn9uYkAhO2EBXa0vP91nz1WHTNJrVG+rqkSKvMV2D E0A6XBAcUGAEi4vDyxv6KHEMZiSKDw9pt5bK9ATCYh12cjG6rVbpq3H3Pph7jZYBCMDC zv+A/ayx9GHcOPNsUEOcCe/AJoo/BDecUmnWLfQwNiCpe1PLvD2MUYxDWOun+KFxVgOf ob9BJ0uHUKV6MnhwlwIRfEHuvFMnQBzvITxNh9XCWhF7yGA0+a9BYfhLUqxA7N/aXz7/ wOuPY2/k6NNT4w5WWi3ejE4L78ODSG3OzkRIUZYAGFdiwxA/CWMhCV0j2AhEGlvrYFvi tL0w== X-Gm-Message-State: AOAM5311O+X9xpQ0hWfuaME+EyErHLJjLIbGKZTSapPKtmcEBV05NWll FJPO1WyknNHCZ586lzk67Ax6zXpq X-Google-Smtp-Source: ABdhPJxHVvBwDZgQa8pbqqzFk0Mv2nIKnq5CM+r8qaq0Rwa9cQQEMnFofmh/AsvetL0h8kur2eIiWg== X-Received: by 2002:a17:906:25c4:: with SMTP id n4mr3496153ejb.3.1596194571126; Fri, 31 Jul 2020 04:22:51 -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.22.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2020 04:22:50 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 31 Jul 2020 13:22:34 +0200 Message-Id: <20200731112241.8948-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/8] avcodec/smacker: Remove write-only and unused variables 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 | 8 -------- 1 file changed, 8 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index 9f054f071d..e53183318e 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -59,7 +59,6 @@ typedef struct SmackVContext { */ typedef struct HuffContext { int length; - int maxlength; int current; uint32_t *bits; int *lengths; @@ -72,7 +71,6 @@ typedef struct DBCtx { int *recode1, *recode2; int escapes[3]; int *last; - int lcur; } DBCtx; /* possible runs of blocks */ @@ -116,8 +114,6 @@ static int smacker_decode_tree(GetBitContext *gb, HuffContext *hc, uint32_t pref } hc->values[hc->current] = get_bits(gb, 8); hc->current++; - if(hc->maxlength < length) - hc->maxlength = length; return 0; } else { //Node int r; @@ -200,14 +196,12 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int } tmp1.length = 256; - tmp1.maxlength = 0; 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.maxlength = 0; tmp2.current = 0; tmp2.bits = av_mallocz(256 * 4); tmp2.lengths = av_mallocz(256 * sizeof(int)); @@ -277,7 +271,6 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int ctx.last = last; huff.length = ((size + 3) >> 2) + 4; - huff.maxlength = 0; huff.current = 0; huff.values = av_mallocz_array(huff.length, sizeof(int)); if (!huff.values) { @@ -690,7 +683,6 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, // Initialize for(i = 0; i < (1 << (bits + stereo)); i++) { h[i].length = 256; - h[i].maxlength = 0; h[i].current = 0; h[i].bits = av_mallocz(256 * 4); h[i].lengths = av_mallocz(256 * sizeof(int)); From patchwork Fri Jul 31 11:22:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21403 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 A5B9244998B for ; Fri, 31 Jul 2020 14:23:34 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8EB8F68B82F; Fri, 31 Jul 2020 14:23:34 +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 3CDFF68B81D for ; Fri, 31 Jul 2020 14:23:28 +0300 (EEST) Received: by mail-ej1-f66.google.com with SMTP id a21so31051916ejj.10 for ; Fri, 31 Jul 2020 04:23:28 -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=1mPHKC4AMB3xvAnq24IXgXrU30wq5+j+Nah3pvALOOE=; b=sJGBjEtAiXdTPxsnO60n01H9tNuRrz12LrFuY8xAEFkm2E0aigs5erq2L06EpCoDEi xj8sWpMHlJanWSKtkiuXtdGF/70W+M3OIxgzx/CIOJd70cH5QFxTgcRA5xcj5ok1GxgQ jXf9RRkPq3feGBo3QlBcokyCX4srCLOa8DTub5Fx+ESP8yVWOStoXCkLi/dgEi+C9YYV upQ3zgd8ZiC3qqiQWbupnORnFOI85Aq9eztkpZz2Vcd5wVK/co9vXGj7azgvWgvDXKxV MZRqZ+cKl6aG2rxGtGySSwqNtk94htjyiU5YIZ5J1fJs9lNKIh1vQ2gd8H3eBytxkv22 1Yjw== 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=1mPHKC4AMB3xvAnq24IXgXrU30wq5+j+Nah3pvALOOE=; b=fMkpuJe7oneuebk264B5y8fMyUonc3tnRF5bSZXus+A8b3QHgHqLcFzWm7VXL3J40H eSk4xiiG11Zb6Im7ZumZO8YpvCb8KlJd+pauSkx1RONmytTzNKF9LElADf5T8OjMf78S TYKmF0IdGDI3unxNjpWnkan8sFG1K9Rp8ef6kk05lOvYGoL7yLGawYb3s/3xeaZaB9jt 7QKkNv9huB332rtvjBSRua4I3iKgtnVA8lrKhAUkJw9CN8+XErPDBDLBLJ3aTGsVkVKw oflgur+IwqTf1je4567HCYpdvhNYNLtagwaSMEgOdxm6lWekVeAsvkkbtxX9z21vPa0/ fX8A== X-Gm-Message-State: AOAM531gTn+oEnR3rkfzL4QABeVNdEk9OCgqq36seYLUO+2OVuUUpN14 5S03x/+bIBADGCDXC4JdE53w9xJ+ X-Google-Smtp-Source: ABdhPJwXyJ7MR1FqmFuuSIp4ZJjcmaRBRzsUVs/ONbiLB4c3e5DhRpPUmcH6wlLMmwmsDoplfI4WqA== X-Received: by 2002:a17:906:5246:: with SMTP id y6mr3484496ejm.316.1596194607315; Fri, 31 Jul 2020 04:23:27 -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.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2020 04:23:26 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 31 Jul 2020 13:22:35 +0200 Message-Id: <20200731112241.8948-2-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 2/8] avcodec/smacker: Don't warn for Huffmann tables with one element 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" The Huffmann tables used by Smacker can consist of exactly one leaf only in which case the length of the corresponding code is zero; there is then exactly one value encoded. Our VLC can't handle this and therefore this case needs to be treated separately; it has been implemented in commit 48cbdaea157671d456750e00fde37c6d7595fad6. Yet said commit also made the decoder emit an error message (despite not erroring out) in this case, although it seems that this is rather a limitation of our VLC API. Signed-off-by: Andreas Rheinhardt --- libavcodec/smacker.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index e53183318e..3c9f118fb7 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -229,8 +229,7 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int goto error; } } - } - if (!vlc[0].table) { + } else { av_log(smk->avctx, AV_LOG_ERROR, "Skipping low bytes tree\n"); } if(get_bits1(gb)){ @@ -250,8 +249,7 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int goto error; } } - } - if (!vlc[1].table) { + } else { av_log(smk->avctx, AV_LOG_ERROR, "Skipping high bytes tree\n"); } From patchwork Fri Jul 31 11:22:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21404 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 AB46144998B for ; Fri, 31 Jul 2020 14:23:36 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9487368B852; Fri, 31 Jul 2020 14:23:36 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f65.google.com (mail-ej1-f65.google.com [209.85.218.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 15E9768B813 for ; Fri, 31 Jul 2020 14:23:29 +0300 (EEST) Received: by mail-ej1-f65.google.com with SMTP id f24so10575898ejx.6 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=87MGbHXAUAFItAcBL5AV1PISw4Kbx/D/I60f7fEmvXg=; b=JRrGJim+Kys/lfmu9e7MSfU/JvEdYP3Z9pR1TRaghfjLk97FyYoVUzLfFEYoPGhwGM 0e1EBUyiH/NP5GtMEsyo6nH2Fih2GbWzwq5iJwb3pY6qXgKLbZmxdCJy9TW/RSy2r0Xf lrB7IKzNYHTYE/H64WaIMgl34/ECpCXj4XRpIqwQJQ/k6H6WEhcJrDAvEYljNsZn2DWE +bxVIaO8j9eHzLAGwW4/ZZkZBWLF4ZsdMlJfufaB1XPsvt8fXeNJsiyk9agJhM9NHcXN 0NuKcq0f4zVeeqWzEwr2XvQunj13I2d06EEURSJO1cWroJtFLqQTDm4CR4pxC5i3nuh2 DvFQ== 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=87MGbHXAUAFItAcBL5AV1PISw4Kbx/D/I60f7fEmvXg=; b=G4qih7m7HP5QXdAE8r+Cv4hshNs4awTxVtn9+QtdwY9dQwsJNj7FKYPvZcwyJ8b1Qq NOJY0QsFCDcUWV1HBSn5ZQxai9icMRwLQNTvh9Ullh8L9yhWX8Q4tx5tiRmsdNJ1wXpA tJTYvpCWBjvHCKYfu+Q7BBB/yL4wbZqPwow1QQqr3NoE9x4k7AenHyB0p/To5h3cDaqs Llx3kv2bO6sAgnJWxriwWrDJ7wsCD73x6iD9zZuWiLu9/wQSPv6uHtn8sBoIBavulomJ d2JyWUGDixIm1b+6cRGjQene8HGzgWk/ob2OX9EsIulL5R00ZChLuYgsixO2n/wW+8tx 7gyw== X-Gm-Message-State: AOAM5312BK2qGzYfPfskOfx8tm9FJarEybHFTISOpPAUW2O54V1mljmv yStBL0SCPbTRyLtmRty1VokKiEat X-Google-Smtp-Source: ABdhPJycsUR0s0kpbh1VNphoTDRij4tAOIC9qXhMBX1bHH49uT685hIjgnv+tzIa9t+aLw72HsOhcg== X-Received: by 2002:a17:906:a252:: with SMTP id bi18mr3451223ejb.151.1596194608233; Fri, 31 Jul 2020 04:23:28 -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.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2020 04:23:27 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 31 Jul 2020 13:22:36 +0200 Message-Id: <20200731112241.8948-3-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 3/8] avcodec/vlc: Add macro for ff_init_vlc_sparse() 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_sparse() supports arrays of uint8_t, uint16_t and uint32_t as input (and it also supports padding/other elements in between the elements). This makes the typical case in which the input is a simple array more cumbersome. E.g. for an array of uint8_t one would either need to call the function with arguments like "array, sizeof(array[0]), sizeof(array[0])" or with "array, 1, 1". The former is nicer, but longer, so that the latter is mostly used. Therefore this commit adds a macro that expands to the sizeof() construct. Signed-off-by: Andreas Rheinhardt --- libavcodec/vlc.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libavcodec/vlc.h b/libavcodec/vlc.h index 42ccddf3fc..7cb323b62c 100644 --- a/libavcodec/vlc.h +++ b/libavcodec/vlc.h @@ -35,7 +35,12 @@ typedef struct RL_VLC_ELEM { uint8_t run; } RL_VLC_ELEM; -#define init_vlc(vlc, nb_bits, nb_codes, \ +#define INIT_VLC_DEFAULT_SIZES(ptr) \ + (ptr), sizeof((ptr)[0]), sizeof((ptr)[0]) + +#define init_vlc(...) init_vlc2(__VA_ARGS__) + +#define init_vlc2(vlc, nb_bits, nb_codes, \ bits, bits_wrap, bits_size, \ codes, codes_wrap, codes_size, \ flags) \ 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; } From patchwork Fri Jul 31 11:22:38 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21406 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 860B344998B for ; Fri, 31 Jul 2020 14:23:40 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 71E4A68B87C; Fri, 31 Jul 2020 14:23:40 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f68.google.com (mail-ej1-f68.google.com [209.85.218.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1C11168B831 for ; Fri, 31 Jul 2020 14:23:31 +0300 (EEST) Received: by mail-ej1-f68.google.com with SMTP id o23so3606593ejr.1 for ; Fri, 31 Jul 2020 04:23:31 -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=UkSj3OwTnkL5d6tEvCghAetkKZB6nUNLNOKxdCXpeSc=; b=iUzZ9vhDCRHSJZ9VTlFLpEb8sAOCtRzQSzr5RqPFNdUrqZuVG7tyek82SZO46/mnJT fUmEw1yxxaDcQDfGDBQEeXMQE3h5g95zheAQpM3vVHn66IzN0jObguT7CMDq2rfbFvB3 nQugNRnSCOV/OW68cAc3EI15Rz/Wwvx9ybH2y1CdCzIpZ3Tp+zIyp8HdjzYQVHALucPh 7zGsj8RcJosTxURSuHhn2VbevGbUazaIJnP/UqwQtjDZPjHDzfNlZpsi4BPBftMGt63+ /jkEWeL4+FBQwZ+4Okp+x/vEWgZFJ8RgmKvCRj47ni/WZ692KufK4s7VXTxfd4QiaC3j XxGg== 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=UkSj3OwTnkL5d6tEvCghAetkKZB6nUNLNOKxdCXpeSc=; b=cqsP20VecEVt4WhUeD7IbCDRoShhinE7fP3RdHIyisxCRNTfZpp5/Lk5oKq3DJUZNK G8KOXpi9x4cYF/uFoTzH44C5JAUK5ExxsEp/qsv7ndR+a4OMPLWWmYsfBiBWpokcjFMU yjql6Al5LqxAIoJTE5bsxj5RvUO6xwcnky7keqin1Mi6cZm+JAdOegneXYFrsldB8lWN CRCc7sFcEYGyyKrHpjzGqiVkr4edRx9V8t3QDX06mmH8kK7wz2vGi/JrcuXQpZAFoe4+ 4DTIskR4pXH26Aw7eYYfHI89MJz5vjI2kyRfSGuGwnjHH0j8SxKNJGtdcZfCptjdSWLJ qRWw== X-Gm-Message-State: AOAM531xhyZT9ucHXMf2ng8ocdBgHdJntgJjeaOooyw8k68TihwE2u93 jZHYWDXJJU2UepALJXhlAzsNaNnz X-Google-Smtp-Source: ABdhPJyXm0h+wiusGvx/oD5CYYci4MsXEaizNNUMRIZyMWXv6Ui6tp6nOPT8szDUEOFSXa9i5ENMDw== X-Received: by 2002:a17:906:5f8a:: with SMTP id a10mr3678941eju.379.1596194610022; Fri, 31 Jul 2020 04:23:30 -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.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2020 04:23:29 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 31 Jul 2020 13:22:38 +0200 Message-Id: <20200731112241.8948-5-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 5/8] avcodec/smacker: Improve header table error checks 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" The extradata for Smacker video contains Huffman trees as well as a field containing the size (in bytes) of said Huffman tree when stored as a table. Due to three special values the decoder allocates more than the size field indicates; yet when it parses the table it only errors out if the number of elements exceeds the number of allocated elements and not the number of elements as indicated by the size field. As a consequence, there might be less than three elements available at the end, so that another check for this is necessary. This commit changes this: It is always made sure that the three elements reserved to (potentially) use them to store the special values are not used to store ordinary tree entries. This allows to remove the extra check at the end. Signed-off-by: Andreas Rheinhardt --- libavcodec/smacker.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index b6245a0ce1..8a4d88cfed 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -137,7 +137,7 @@ static int smacker_decode_bigtree(GetBitContext *gb, HuffContext *hc, return AVERROR_INVALIDDATA; } - if (hc->current + 1 >= hc->length) { + if (hc->current >= hc->length) { av_log(NULL, AV_LOG_ERROR, "Tree size exceeded!\n"); return AVERROR_INVALIDDATA; } @@ -244,9 +244,9 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int ctx.recode2 = h[1].values; ctx.last = last; - huff.length = ((size + 3) >> 2) + 4; + huff.length = (size + 3) >> 2; huff.current = 0; - huff.values = av_mallocz_array(huff.length, sizeof(int)); + huff.values = av_mallocz_array(huff.length + 3, sizeof(huff.values[0])); if (!huff.values) { err = AVERROR(ENOMEM); goto error; @@ -259,12 +259,6 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int 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] >= huff.length || - ctx.last[1] >= huff.length || - ctx.last[2] >= huff.length) { - av_log(smk->avctx, AV_LOG_ERROR, "Huffman codes out of range\n"); - err = AVERROR_INVALIDDATA; - } *recodes = huff.values; From patchwork Fri Jul 31 11:22:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21407 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 431C544998B for ; Fri, 31 Jul 2020 14:23:41 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2F5B468B8A2; Fri, 31 Jul 2020 14:23:41 +0300 (EEST) 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 D24BC68B85E for ; Fri, 31 Jul 2020 14:23:31 +0300 (EEST) Received: by mail-ej1-f67.google.com with SMTP id kq25so18114850ejb.3 for ; Fri, 31 Jul 2020 04:23:31 -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=DHOwTqCDJ1/TKKER/rGMBF8mJoQIXaRtlJeR8gRqN1I=; b=WvnC2ckVNrKutYfb2cc5WwICdfTR5fJxuxJpP18kZ4Tp3gXCYzmp2vvOfuJj5NpRXZ u7I/QI3lXKRTuCKv/rcflHsLfP5b0Z3jlgYBZFILox6pZKKrOF3dqVkQdS205LGqbxaR PRdbJUX4ODWXy7pXrg4VaQSyIpuwyIex1+sDXGInVQEKp21Hcey7S7Qd9NRZ+llZ0xfs 1UzUb+O2J2MHs5tl1bhXyZ7cTeu0pJeerVdYqJudCrFYaZmb5gjAduhFPoeAMKHq9j/y kd499P8U1fqqfaPrkZd6kkHcLiOjRbM4OY8wrxvHhRSjNJ4yfDHy7FSXs+kZYOvHVoDT VrnQ== 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=DHOwTqCDJ1/TKKER/rGMBF8mJoQIXaRtlJeR8gRqN1I=; b=qYInG9VXAxyksJBQF+LMEu112+PvS+m0mIV7PzC1fuyzUQjcDO5zUawFf5YPDG6rqL SXIqXgWwv+KNMGSshIhRs0Emgy8r9Q0FYg+pmDI0oBcYnE4QVapuYoErGsfJb9jFMIuU gYcG+1pdftCxP1JwNsVfVE8Pw139UkPAoPNMxib3op4XvGPesmcfh8eEp5nuucOumnGR lNF/2BT9QjJTxT3DuhGvkpwCCsD/zsFEQMp/dDxzQj/Z81tJR2mqIaSAmn+smNwXb0Se 2k68JOKYiiHk5hNTVGKmSU4YGdpNsxKLkPUrsX/DDTyDTxlxhuB8SU0zRW79USLXkrA2 i7yw== X-Gm-Message-State: AOAM532BPJLdbxlWfY6XNJ7EMiKH6c+KPEW58n83QkjAptZTdNI0GZhm OL+1qGddvzVuO1nHTmL/BnVZN8h9 X-Google-Smtp-Source: ABdhPJwQnkLAtiOtEg5uJaNXm8kZwOrRlzNv1vyFD15MDuGWmKHb6td5rv7FUSZBbc/t/vMXGPMUGw== X-Received: by 2002:a17:906:c406:: with SMTP id u6mr3696487ejz.47.1596194610916; Fri, 31 Jul 2020 04:23:30 -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.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2020 04:23:30 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 31 Jul 2020 13:22:39 +0200 Message-Id: <20200731112241.8948-6-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 6/8] avcodec/smacker: Directly goto error in case of error 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 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index 8a4d88cfed..4b1f0f1b7c 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -251,17 +251,18 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int err = AVERROR(ENOMEM); goto error; } + *recodes = huff.values; res = smacker_decode_bigtree(gb, &huff, &ctx, 0); - if (res < 0) + if (res < 0) { err = res; + 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++; - *recodes = huff.values; - error: for (int i = 0; i < 2; i++) { if (vlc[i].table) From patchwork Fri Jul 31 11:22:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21408 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 1317644998B for ; Fri, 31 Jul 2020 14:23:42 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F127368B8AC; Fri, 31 Jul 2020 14:23:41 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f65.google.com (mail-ej1-f65.google.com [209.85.218.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id ADAF968B868 for ; Fri, 31 Jul 2020 14:23:32 +0300 (EEST) Received: by mail-ej1-f65.google.com with SMTP id a21so31052083ejj.10 for ; Fri, 31 Jul 2020 04:23:32 -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=xmggQywGfX3hSZ3hIlVVsBjLbDyZNCzu/QTzfgaylss=; b=HgxDNU8yKf8CKXxn3QOb9x3N0x2Py7CSTx9yCYshDJasOfodk3yYSGHyrLTk325Rli orOGdZwF8chcl68MZY+uGThlbAWrPTjXzvqF4b401iG6U9kEOm3e4cpNOwWy2Zw17Sww fthsh3ZjgxhzEURaaeY/ZwF3G80jvYwRDNhYztj9H0QNzSgpCejws8dYeaeZgxsv/07L 6SxATZUeSmkIHnFj6x6BR8qxP6LYeneI3dj5qjpeE/OsD4PE2bNFubqxEJ7CfaTfA66i NHjetjp9Bx1O36vxqS6eAIa/aXHNPG+heX4KDgLBKYn1FTFBuSD1fEvnYZ3bO5MMwfnA bE5Q== 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=xmggQywGfX3hSZ3hIlVVsBjLbDyZNCzu/QTzfgaylss=; b=GdJxR1ZkGhoxr3E54k7MYuV5V59J2xIgPlPipFu1zdb+Oev4lNeNq4SNPPTQ8Ufw4k atQk27p0h0WlPHkggbhVrTY67MdqwCliAVoUgc+BaGkXR8m/9ZmOWKqYGVPnxsvDFopB VHY9f3COz85ZnkwellWtwIHKIZXAp7qOEBtXTXrqkgKCIAGsWvo+YN9KvtqnWGC+zAU4 uA4JHq5oiMBBF6xWOrhD8QAh4DP155KXz0+H662XyBwHqPaPhSAmx+3r6fY6TVC09kzc N6pKE62DyGDyRYbEE+yDbEyuFc7XoW/DG9a+5/08+FZ7tMBg/P27tx29kXTAgHqO//Yk Biig== X-Gm-Message-State: AOAM532OoSgIgJgpy+zgwd5EgGWjegWqoUivBo81xirqPx9+kgQ6pVYS 8OaokXP3s0sfAVVtkUlpgQc9zTF4 X-Google-Smtp-Source: ABdhPJwehbGNTlLRLFjcL0IhORvGyCHxtb6fjpYPbtJb7HoFWfm67edzO5b3G9O+l2kQvfnw1MvuZQ== X-Received: by 2002:a17:906:3cc:: with SMTP id c12mr3411180eja.222.1596194611826; Fri, 31 Jul 2020 04:23:31 -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.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2020 04:23:31 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 31 Jul 2020 13:22:40 +0200 Message-Id: <20200731112241.8948-7-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 7/8] avcodec/smacker: Use same variable for return values and errors 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_decode_header_tree() uses different variables for return values (res) and for errors (err) leading to code like res = foo(bar); if (res < 0) { err = res; goto error; } Given that no positive return value is ever used at all one can simplify the above by removing the intermediate res. Signed-off-by: Andreas Rheinhardt --- libavcodec/smacker.c | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index 4b1f0f1b7c..07fa8887d8 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -182,13 +182,12 @@ 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) { - int res; HuffContext huff; HuffContext h[2] = { 0 }; VLC vlc[2] = { { 0 } }; int escapes[3]; DBCtx ctx; - int err = 0; + int err; if(size >= UINT_MAX>>4){ // (((size + 3) >> 2) + 3) << 2 must not overflow av_log(smk->avctx, AV_LOG_ERROR, "size too large\n"); @@ -210,20 +209,17 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int i ? "high" : "low"); continue; } - res = smacker_decode_tree(gb, &h[i], 0, 0); - if (res < 0) { - err = res; + err = smacker_decode_tree(gb, &h[i], 0, 0); + if (err < 0) goto error; - } skip_bits1(gb); if (h[i].current > 1) { - res = init_vlc(&vlc[i], SMKTREE_BITS, h[i].length, + err = 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) { + if (err < 0) { av_log(smk->avctx, AV_LOG_ERROR, "Cannot build VLC table\n"); - err = res; goto error; } } @@ -253,16 +249,15 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int } *recodes = huff.values; - res = smacker_decode_bigtree(gb, &huff, &ctx, 0); - if (res < 0) { - err = res; + err = smacker_decode_bigtree(gb, &huff, &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++; + err = 0; error: for (int i = 0; i < 2; i++) { if (vlc[i].table) From patchwork Fri Jul 31 11:22:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21409 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 D9DE244998B for ; Fri, 31 Jul 2020 14:23:42 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C903568B890; Fri, 31 Jul 2020 14:23:42 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f68.google.com (mail-ed1-f68.google.com [209.85.208.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5938468B737 for ; Fri, 31 Jul 2020 14:23:34 +0300 (EEST) Received: by mail-ed1-f68.google.com with SMTP id df16so5777995edb.9 for ; Fri, 31 Jul 2020 04:23:34 -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=UgfSZKwI/LtvP9ohsRq2NZXpGlmHK1zXQ0YwhTCD7u4=; b=SMtDGUq1J8u4QL1RI/WbwiTX3RWHrTnF5fvQTl9hYnvTz47jyyqcERcmuVK0yGSayV 9Uo5Oj0RcUtCderd0uVF8ci5AWtTrAejiL4Ib0z5nzmFbPwDrTZXKO/E2XjpPoe2NF26 f+EjKV3FZEGruRI57I631e4SHFjlkV6yl4yrWpm3Yrjby80tMlzai858W2WWdZnu3Cme 7vPSPwa/6PCsHLhrPuqeV4rsss7yN6tJrPQT6O9D2dFJWNkD3PoDcpGeU8iSv/icEZN1 kWCHqUxOPBKlmB0THVTJV0AbDS1ssx3quMRCjLUa+MNf58GF69WsMQz4j1aNWo+QyqKy vIeA== 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=UgfSZKwI/LtvP9ohsRq2NZXpGlmHK1zXQ0YwhTCD7u4=; b=mfBsNPEHGm7A6MYCkMYzEzFm5JvJSvdOOjjDlSpOeQFcHT9QKhpJ6jtT0/mIX3+XgO al6EfQqh6AK+oalhqqEpXOUKr3Q8aanR8AUJVe17rcF9ofaaI8KUg+0uLdXuwf8gSTmT LG/of3AnP3XirPKbFex5G0lXacEzWDU+VBiVEy2d4WoR2DIbtKgnuDkfBQs1Ybk2Ze3d VN+icRhyrg+U0/qVdvyDacLpEMR0JuBHAEhMZljTX+OCnx4zgcIgasmyHWb3QNl7hdku UHMDzo5lYqo7uwt0ukfWDv8OEvxgOF6SrteSNbri34hLFh93Z4hhDvXZzzfZOIKtcno5 yxzA== X-Gm-Message-State: AOAM531EXAAH0yDARXkTeivrStKkuWyzQS7KMewpuKocPG7Df4G/Nkty 4PZH7KvNQTwHFLnXzWjbJVKfW3YX X-Google-Smtp-Source: ABdhPJx8weTMy3b3304QFO+VeU6vu5HtkL48sT23atMD89uykxzP5NOU755pIoKOwrMfc+ugJCEcww== X-Received: by 2002:aa7:dc4f:: with SMTP id g15mr3385034edu.335.1596194612656; Fri, 31 Jul 2020 04:23:32 -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.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2020 04:23:32 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 31 Jul 2020 13:22:41 +0200 Message-Id: <20200731112241.8948-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 8/8] avcodec/smacker: Forward error codes 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 | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index 07fa8887d8..9ba70af6f7 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -653,18 +653,15 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, goto error; } skip_bits1(&gb); - if (smacker_decode_tree(&gb, &h[i], 0, 0) < 0) { - ret = AVERROR_INVALIDDATA; + if ((ret = smacker_decode_tree(&gb, &h[i], 0, 0)) < 0) goto error; - } skip_bits1(&gb); if(h[i].current > 1) { - res = init_vlc(&vlc[i], SMKTREE_BITS, h[i].length, + ret = init_vlc(&vlc[i], SMKTREE_BITS, h[i].length, h[i].lengths, sizeof(int), sizeof(int), h[i].bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE); - if(res < 0) { + if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "Cannot build VLC table\n"); - ret = AVERROR_INVALIDDATA; goto error; } } From patchwork Sat Aug 1 13:46:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21426 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 7C0CA44B9AE for ; Sat, 1 Aug 2020 16:47:26 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5372A68BA3C; Sat, 1 Aug 2020 16:47:26 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f68.google.com (mail-ed1-f68.google.com [209.85.208.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8D04D68B4B2 for ; Sat, 1 Aug 2020 16:47:20 +0300 (EEST) Received: by mail-ed1-f68.google.com with SMTP id o18so9800436eds.10 for ; Sat, 01 Aug 2020 06:47:20 -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=4iDtA+Ls9PIRAmst45DGipxATzL3bxkm8hgPrGyMMEY=; b=oiik+bOgPmwGDe4a7qCulWOvNZPLXCeMM5MkJ+BVr1XC1JxPuUi0Lt6969UsSr/OQT VqYccYTQQoHbkO5oDBryG/qRbBVfkZTPry6Pf+pTyI7kBXBGYxgxR/YU9oGhQpoP0qqH Ohjwe1nCLiCvJ4Sx/BXeVI7hh5UBvPcw/+4O95E+znuRdtO3xYKKLLoo1bs3+XCl1FEc 4m8/p9l8CjS9Cg6zHwCUkp5PH0vzNYARqgoivkKPO+gHmE9RhWU9YF65Hzyvy74ZGUZN Si0njWr+sux+kE163L3AYSOwnNmqMDi5KvrUSaFKJ6peV1BbtI8dDdale5cc/zlR7Aws sWng== 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=4iDtA+Ls9PIRAmst45DGipxATzL3bxkm8hgPrGyMMEY=; b=X+xeyxko2Gy9IAw0wfRRhMGou3BSZHLIVXH67GsQ5RNElhG3HL1oVeL7wmA1Tr+SpF eOs7BVWkYhpST+udl8P8Bhq1hnXnH9gxJE2rA0JX1EKUOIE880Xvgx8m9jyqanX6f2zz 2p7vfBJfSYKqOa5H6HndObz3nuIqj70+W0V2Xe6OrB38zL5FYO3uIGWSYVWNIERGDUGN mMaHIsFS8XAO1TLwtwzHvxRoocq3mYkPh3ViI8v7qE8XUzFYPonHeATXPOvgoVG8UWNu RunhFcszk5vmOJ4ywHG9pAKnyOWuVJO9VGoLw7kJWireVVF2CjT0yLx8+IZE36n7uYIe xm1g== X-Gm-Message-State: AOAM531omiqBVRKwfadYQ9Vc2KQnBFeywpYV3m4fWFU92ATy262BpF/G iw7P1cO6Vd844ACUX2H0EtlEPXXK X-Google-Smtp-Source: ABdhPJztDWjE4/QnVX6lgD1RXAKMwSW1gS0h58Bl8YnZcwAtboS/s+xFH/VKpQxlWfEvzTbsjUrOdw== X-Received: by 2002:aa7:da0e:: with SMTP id r14mr8466690eds.236.1596289639562; Sat, 01 Aug 2020 06:47:19 -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.47.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Aug 2020 06:47:18 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 1 Aug 2020 15:46:52 +0200 Message-Id: <20200801134704.3647-1-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 09/21] avcodec/smacker: Use unsigned for shift 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" Given that the code currently accepts only 27 bits long Huffman codes, the shift 1 << (length - 1) with length in 1..28 that is performed when parsing the tree is safe. Yet if this limit were ever expanded to the full 32 bits, this shift would be potentially undefined. So simply use unsigned. Signed-off-by: Andreas Rheinhardt --- libavcodec/smacker.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index 9ba70af6f7..e6b163722a 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -121,7 +121,7 @@ static int smacker_decode_tree(GetBitContext *gb, HuffContext *hc, uint32_t pref r = smacker_decode_tree(gb, hc, prefix, length); if(r) return r; - return smacker_decode_tree(gb, hc, prefix | (1 << (length - 1)), length); + return smacker_decode_tree(gb, hc, prefix | (1U << (length - 1)), length); } } From patchwork Sat Aug 1 13:46:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21427 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 DDDAC44AA8D for ; Sat, 1 Aug 2020 16:49:37 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B365068BA3C; Sat, 1 Aug 2020 16:49:37 +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 1AFA668B96A for ; Sat, 1 Aug 2020 16:49:31 +0300 (EEST) Received: by mail-ed1-f65.google.com with SMTP id df16so7874489edb.9 for ; Sat, 01 Aug 2020 06:49:31 -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=fpDC9NNmBqpZryhDcxWRYUb8OWbSUtSOnIz3EKfPTmk=; b=WqxWiCmxbKgizU36BYaJjVw/3kGHTgsXATbQpAL5/VJXShMUStWjhk9/eGU3Kkv0td ccmEovfl4p5/5/TDWMG3zoSh1aiBXngjD+byDalRjNrVLQ0H3YRAXMOBKuEe4KP7dbwu vtYpcZFT9RQo2Jbiej5aQ+xV6E1SGr0RpmFZnyah60AzihO5dWnZKLlnERznwa4iYwvJ r4SPI0IzpgdnCPpQ1FeMNcydFDxGGDmt7XVYWeW480xcxJDO1qJSwnAKxWtr8fOxq0zh kc/iWS79S52f0IFGbhrA1FsI6SBeP9qEv6wFBJQwyOrGwzNmHCZI3ko8Rd4gHg/23I5e k/VA== 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=fpDC9NNmBqpZryhDcxWRYUb8OWbSUtSOnIz3EKfPTmk=; b=Jti2lFQ6NHm3CEJFlKQt6cEstcTigJtcRRA8GxFNF3qA8NYhsIyc99EjxxCEgkGdCM e4h1+jWDAbNioLZ+Bb02uPRNpN54J8zmSOxB5wg5+3hIesNZxYKGg9W26LmSuEuVkPSV rVMO75etHelxrf6J1T/TevzzxPANA+vyRD9uOykPq1284aT2H6vwBflLbDnKnfgLGqlT WvuBNgKcHBKgcjmLSP5Kxjrr1svEi4g7jeN5Nk+4o4O8A7BFLrDDvsyLzK7u3cZctAwg rTuQJbQG9TH2VuDbDwFW+/dR69EyCp4Eqgy4y6/Q3biQ0fTGveYfhcpGAzu8ciCrV8g5 jDNg== X-Gm-Message-State: AOAM533umVONtUAVSMfQA5X54cRyJyDYVxsOGHM1Mz84OujAZUnMJB0C r9sjQqdYNYakuCyyrH4Vb2K8qjpm X-Google-Smtp-Source: ABdhPJyFhdY9abEfiJ8Cp1N758fEKE3nIDVpZGbdcBwcdD5wVYbKOesC1Rj9xRcDQ/K7RAkrhHPGsg== X-Received: by 2002:aa7:dc44:: with SMTP id g4mr8379107edu.273.1596289770296; Sat, 01 Aug 2020 06:49:30 -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.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Aug 2020 06:49:29 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 1 Aug 2020 15:46:53 +0200 Message-Id: <20200801134704.3647-2-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 10/21] avcodec/smacker: Use better nb_codes estimate when initializing VLC 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" Using the real number of read codes allows to leave a loop in ff_init_vlc_sparse earlier; notice that all codes not explicitly set by reading data have been set to zero earlier (i.e. they are zero-length codes) and such codes are ignored by ff_init_vlc_sparse. This improves performance: When compiled with GCC 9, the time spent on one call to smka_decode_frame() for the sample from ticket #2425 decreased from 2195367 decicycles to 2068389 decicycles. For Clang 9, it improved from 1602075 to 1534188 decicycles. These tests have been performed 20 times and each times the input file has been looped 32 times to get a sufficient number of frames. Signed-off-by: Andreas Rheinhardt --- libavcodec/smacker.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index e6b163722a..27de30f0e1 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -214,7 +214,7 @@ 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].length, + err = init_vlc(&vlc[i], SMKTREE_BITS, h[i].current, INIT_VLC_DEFAULT_SIZES(h[i].lengths), INIT_VLC_DEFAULT_SIZES(h[i].bits), INIT_VLC_LE); @@ -657,7 +657,7 @@ 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].length, + ret = init_vlc(&vlc[i], SMKTREE_BITS, h[i].current, h[i].lengths, sizeof(int), sizeof(int), h[i].bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE); if (ret < 0) { From patchwork Sat Aug 1 13:46:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21428 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 003A344AA8D for ; Sat, 1 Aug 2020 16:49:38 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D76B568BA76; Sat, 1 Aug 2020 16:49:38 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f66.google.com (mail-ed1-f66.google.com [209.85.208.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 293BC68BA2D for ; Sat, 1 Aug 2020 16:49:32 +0300 (EEST) Received: by mail-ed1-f66.google.com with SMTP id l23so10512842edv.11 for ; Sat, 01 Aug 2020 06:49:32 -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=6ZEvKYR4A6T+njBBSZkC0hQ8ZeIEX6tiy/UsLL0FuCE=; b=Up9Yn0CC3hFEVipv9QjbuWKe5pH4hp1aW/XQhBuDSWHSmcfUuv/LxULBMvGCewg+Gc HJGLDbuahmvEHRFNF931tXtDRWp+ATbYF7M1965HcNO/LsFCJB3yQOxQiY5FnMTIc/mD Jtu1knq5zz7SOYcCZrUPxEYCGM74nBQZ6inQfBd1FsnF/ittQJ+pJxlwR8KcUB5/yurM HvzLv2eM7kB5G9MOUDNX1WDv1AvIpVeOkXJZ2T1y8+7NiE7AQj6qUjJ9NmM/pTavduZn 556VCN0O05XvxAhev9efPPHlGAYIuFjopCJlQR93v5x9y6b2/Wc5RNdp2eUPzEpOKdxE uMgw== 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=6ZEvKYR4A6T+njBBSZkC0hQ8ZeIEX6tiy/UsLL0FuCE=; b=I3QggzgonxSXF8WP7gfC2BDunTooKd3c4AvCRy2PjbnO9HWQEPu8M/Ajts49ChBTVB RWtsB8QT3Kyn+9MwiC8sXvYBoi5LOccaBSTn3RAlO0L/l75Fzdwkx7OsPU2qos2gZwGg yqUzTl+O9VQSUc4ETkUOS9eWYfl8R0S8isYThGxs4YhOnvl18ujZWJvzae8NvQC/dpW+ o/jWktEnmt51reYFL76ofuhDC8z5leLI6IoIjWi/9X/1iTZHtSwvH1prUr5JsZmdlJPV sg5aiJQiLNwim6nn0afqseWVIYptL6W1U1ngrTHqFk5Eynz2zfDAy79ogeBUtcsBvk1M kaPA== X-Gm-Message-State: AOAM5334MD0tBvBJBo0+ULUquPljepuXaYjUQLKhz0rWH/h+VSbQOl2J 6cshvfh7WR+tBmSgzNlOIz84fdN7 X-Google-Smtp-Source: ABdhPJwLTMqJJ+5ek6mpCO4IqK1ukNnmB68dXuEZThJSHyFAiAqHdCbADzo2OQ/hbNz7eFeOQ1HTHg== X-Received: by 2002:aa7:da0e:: with SMTP id r14mr8472059eds.236.1596289771104; Sat, 01 Aug 2020 06:49:31 -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.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Aug 2020 06:49:30 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 1 Aug 2020 15:46:54 +0200 Message-Id: <20200801134704.3647-3-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 11/21] avcodec/smacker: Don't zero-initialize unnecessarily 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" With the possible exception of the "last" values when decoding video, only the part that is actually initialized with values derived from the bitstream is used afterwards, so it is unnecessary to zero everything at the beginning. This is also no problem for the "last" values at all, because they are reset for every frame anyway. While at it, use sizeof(variable) instead of sizeof(type). Performance increased slightly: For GCC, from 2068389 decicycles per call to smka_decode_frame() when decoding the sample from ticket #2425 to 2053758 decicycles; for Clang, from 1534188 to 1523153 decicycles. Signed-off-by: Andreas Rheinhardt --- libavcodec/smacker.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index 27de30f0e1..c249ce7514 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -197,14 +197,15 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int 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])); + h[i].bits = av_malloc(256 * sizeof(h[i].bits[0])); + h[i].lengths = av_malloc(256 * sizeof(h[i].lengths[0])); + h[i].values = av_malloc(256 * sizeof(h[i].values[0])); if (!h[i].bits || !h[i].lengths || !h[i].values) { err = AVERROR(ENOMEM); goto error; } if (!get_bits1(gb)) { + h[i].values[0] = 0; av_log(smk->avctx, AV_LOG_ERROR, "Skipping %s bytes tree\n", i ? "high" : "low"); continue; @@ -242,7 +243,7 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int huff.length = (size + 3) >> 2; huff.current = 0; - huff.values = av_mallocz_array(huff.length + 3, sizeof(huff.values[0])); + huff.values = av_malloc_array(huff.length + 3, sizeof(huff.values[0])); if (!huff.values) { err = AVERROR(ENOMEM); goto error; @@ -645,9 +646,9 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, for(i = 0; i < (1 << (bits + stereo)); i++) { h[i].length = 256; h[i].current = 0; - h[i].bits = av_mallocz(256 * 4); - h[i].lengths = av_mallocz(256 * sizeof(int)); - h[i].values = av_mallocz(256 * sizeof(int)); + h[i].bits = av_malloc(256 * sizeof(h[i].bits)); + h[i].lengths = av_malloc(256 * sizeof(h[i].lengths)); + h[i].values = av_malloc(256 * sizeof(h[i].values)); if (!h[i].bits || !h[i].lengths || !h[i].values) { ret = AVERROR(ENOMEM); goto error; From patchwork Sat Aug 1 13:46:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21429 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 CAD9B44AA8D for ; Sat, 1 Aug 2020 16:49:39 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B4FAA68BA7C; Sat, 1 Aug 2020 16:49:39 +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 E99C968BA56 for ; Sat, 1 Aug 2020 16:49:32 +0300 (EEST) Received: by mail-ed1-f65.google.com with SMTP id bs17so5461597edb.1 for ; Sat, 01 Aug 2020 06:49:32 -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=93cN6ncx64Ir0bWhNfPydK+xFidjiQQQCYy6z7ZOAeI=; b=B5a017h7YVVIhLZ2Nj1VOGTjJ1mpLDhDsxauA9YKLPMv/Im8XuuikK66VPkLPx2fUW SfJCvtFY41W4sB+QW3PZITEGQL6SPhLY0PJX1AEDHGCcozHGCTxz7LLQLp++aS58dUj6 wfr8HmhQd3Pe1HdsozWv7g710LwiiXuGxyIjrhZRZHa85guTdZGLMy/oWAL5ye+Psahy keREsQwdVL4eIyH1Cw3h8HzSq6mLYqQKd3PXoCJ/Jkqn+vuVyPHbR/M05Nl5xGCQ650/ R2eyGadYknSVkn201pfnmYSyVUQsbOrq91s3o5GwjcEQOsaITKRz3NFimy42PwkUG09R u0Iw== 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=93cN6ncx64Ir0bWhNfPydK+xFidjiQQQCYy6z7ZOAeI=; b=AoTTCIJEodjUHS0BHqIUBwpW7bRD6iG14JOdZmOFx7oufmsdKjgXZxWcTn1mL0KMYC sBukEBGTBnAiw0flAE+Cl+22dZY6PYaqJGGfaAA3qyLYXfIw7xLIEPxY1/8c1jNuEnkc YI4Q3stlV/KPvnNTtF815vE5aFn+H8WVETayxxRf22fV65KCU3sj5nMZXp2gtHwRWhMP srVf4InQL5XM3dIStv+whUDQgQhrtsmkW+k6Gi4cnOSgyCIPR6TpYnRvQ4pY9c7SQXsb R0075dmppO4AVJCPOD5TS8+ragCKgsYeDqC5vip0KR97dbMY/ECxyVKt0ZwAt7okyH8L Nblg== X-Gm-Message-State: AOAM530gd9wmPuH50nE61+JSjHvBZNLHmGqEJuoqzbnnxaK5RiglZarV WqvxCoNAN8WsQFXSF+J5vwCXhGMc X-Google-Smtp-Source: ABdhPJzLZ5+qumWhCmIG/px+M6F9RWTYGQgrlIy6zbeT87qLu9XFTHmf/ebQqovK5BKji4JzNUlWGw== X-Received: by 2002:a50:fc02:: with SMTP id i2mr8455405edr.121.1596289772068; Sat, 01 Aug 2020 06:49:32 -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.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Aug 2020 06:49:31 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 1 Aug 2020 15:46:55 +0200 Message-Id: <20200801134704.3647-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 12/21] avcodec/smacker: Remove redundant check 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" When length is zero for a leaf node (which happens iff the Huffman tree consists of one leaf node only), prefix is also automatically zero. Performance impact is negligible: For GCC 9 and the sample from #2425, the time for one call to smka_decode_frame() decreased from 2053758 to 2053671 decicycles; for Clang 9 it went from 1523153 to 1521288. Signed-off-by: Andreas Rheinhardt --- libavcodec/smacker.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index c249ce7514..991622eb0e 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -105,13 +105,8 @@ static int smacker_decode_tree(GetBitContext *gb, HuffContext *hc, uint32_t pref av_log(NULL, AV_LOG_ERROR, "Tree size exceeded!\n"); return AVERROR_INVALIDDATA; } - if(length){ - hc->bits[hc->current] = prefix; - hc->lengths[hc->current] = length; - } else { - hc->bits[hc->current] = 0; - hc->lengths[hc->current] = 0; - } + hc->bits[hc->current] = prefix; + hc->lengths[hc->current] = length; hc->values[hc->current] = get_bits(gb, 8); hc->current++; return 0; From patchwork Sat Aug 1 13:46:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21430 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 B562344AA8D for ; Sat, 1 Aug 2020 16:49:40 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9790168BA87; Sat, 1 Aug 2020 16:49:40 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f47.google.com (mail-ej1-f47.google.com [209.85.218.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0126468BA78 for ; Sat, 1 Aug 2020 16:49:33 +0300 (EEST) Received: by mail-ej1-f47.google.com with SMTP id bo3so11523998ejb.11 for ; Sat, 01 Aug 2020 06:49:33 -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=NTSOo5uxUaNOzsSZMyIoxfdw217qpLH4S4uAlKSidYM=; b=RyWLcPPb3a/8Fgl1vaQmzcUrJxDx36Roh4gBvQ+J5MquCxDSnTl+claBG/eY26Vexh TMz9DJPhFx/lBrEocnM8xLlP0gPFDl13XzmdDRchwk6PhwXLyEgtZxDUMZF8o7rlUo/I oQ38Qcr63hlkOrmm0TWkiay99Rmk9kxyvu2YDFCyLSZf1EWYhvqokBkAJTTf0fnbVh/V oKnzun8yzGBh++vNGAJWXZf96K8mB0QHbbGG192W7ldZcnxXyIdKCAVFa5CkF5Bnzx0g kcddwNO6u0kzHDWjj1QFU1qNAVwjzQL3ZjIg4/+0lmoWeVkTbZ7L8X5XSXctewS6f7W4 5Txg== 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=NTSOo5uxUaNOzsSZMyIoxfdw217qpLH4S4uAlKSidYM=; b=d1UvkCIBzO8usDxEaJudvYxAYuUJgWXkEgNNt510lvBT5jLNg3aG0egBl0jbCsPsdb HXjuzcOEjX6RM8eeQfeybNBFta0yTgOo1wZGsDz1aGR4h/K779sUhqWq6tzmqRvxqTFr 1Mp+EdTaEixnLU/Jp0oEMUjxdfWZlKuBXDfSNTz3ZXGg7iA0sCJ9a9YjC4sNWpBSJn2s D7/ACGrdeRrFvMMZ82VWl9rjO7XC5HWRvapT1f3JLhks69f6mdWwqiqErZ6YpQJxlk0O BaNeCSzI+Br6ozxR7GXpXNRAZ1VfbwhHOiNQa7alDJMpKhRD4/aIKDKx1W8M5JU0QkCA vE4g== X-Gm-Message-State: AOAM532KMWuvhKd47J6592vdxdvmoiQoqQIJEdgFbzeXEtbqH8eYbg0P LI99KOen4V/n4fkAZ+L3x5g1TsH1 X-Google-Smtp-Source: ABdhPJx/tW5VM++GTe6D8ObvGgbrngvDsaZ5eMah5kquTsZwDpC/20cXShj27i9BvsGhNkVe+GXkqw== X-Received: by 2002:a17:906:7787:: with SMTP id s7mr9133501ejm.533.1596289772946; Sat, 01 Aug 2020 06:49:32 -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.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Aug 2020 06:49:32 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 1 Aug 2020 15:46:56 +0200 Message-Id: <20200801134704.3647-5-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 13/21] avcodec/smacker: Remove redundant checks when reading VLC codes 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" The VLC codes in question originate from a Huffmann tree and so every sequence of bits that is longer than the longest code contains an initial sequence that is a valid code. Given that it has been checked during reading said tree (and once again in ff_init_vlc_sparse()) that the length of each code is <= 3 * the number of bits read at once when reading codes, get_vlc2() will always find a matching entry. These checks have been added in 71d3c25a7ef442ac2dd7b6fbf7c489ebc0b58e9b at a time when the length of the codes had not been checked when parsing the tree. For GCC 9 and the sample from ticket #2425 this led to a slight performance regression: The time for one call to smka_decode_frame() increased from 2053671 to 2064529 decicycles; for Clang 9, performance improved from 1521288 to 1508459 decicycles. Signed-off-by: Andreas Rheinhardt --- libavcodec/smacker.c | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index 991622eb0e..5e1b8c59ff 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -140,8 +140,6 @@ static int smacker_decode_bigtree(GetBitContext *gb, HuffContext *hc, 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; - if (i1 < 0 || i2 < 0) - return AVERROR_INVALIDDATA; val = ctx->recode1[i1] | (ctx->recode2[i2] << 8); if(val == ctx->escapes[0]) { ctx->last[0] = hc->current; @@ -678,21 +676,11 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, res = get_vlc2(&gb, vlc[2].table, SMKTREE_BITS, 3); else res = 0; - if (res < 0) { - av_log(avctx, AV_LOG_ERROR, "invalid vlc\n"); - ret = AVERROR_INVALIDDATA; - goto error; - } val = h[2].values[res]; if(vlc[3].table) res = get_vlc2(&gb, vlc[3].table, SMKTREE_BITS, 3); else res = 0; - if (res < 0) { - av_log(avctx, AV_LOG_ERROR, "invalid vlc\n"); - ret = AVERROR_INVALIDDATA; - goto error; - } val |= h[3].values[res] << 8; pred[1] += (unsigned)sign_extend(val, 16); *samples++ = pred[1]; @@ -701,21 +689,11 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3); else res = 0; - if (res < 0) { - av_log(avctx, AV_LOG_ERROR, "invalid vlc\n"); - ret = AVERROR_INVALIDDATA; - goto error; - } val = h[0].values[res]; if(vlc[1].table) res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3); else res = 0; - if (res < 0) { - av_log(avctx, AV_LOG_ERROR, "invalid vlc\n"); - ret = AVERROR_INVALIDDATA; - goto error; - } val |= h[1].values[res] << 8; pred[0] += (unsigned)sign_extend(val, 16); *samples++ = pred[0]; @@ -736,11 +714,6 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3); else res = 0; - if (res < 0) { - av_log(avctx, AV_LOG_ERROR, "invalid vlc\n"); - ret = AVERROR_INVALIDDATA; - goto error; - } pred[1] += sign_extend(h[1].values[res], 8); *samples8++ = pred[1]; } else { @@ -748,11 +721,6 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3); else res = 0; - if (res < 0) { - av_log(avctx, AV_LOG_ERROR, "invalid vlc\n"); - ret = AVERROR_INVALIDDATA; - goto error; - } pred[0] += sign_extend(h[0].values[res], 8); *samples8++ = pred[0]; } From patchwork Sat Aug 1 13:46:57 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21431 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 A700E44AA8D for ; Sat, 1 Aug 2020 16:49:41 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 974CE68BA83; Sat, 1 Aug 2020 16:49:41 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f68.google.com (mail-ed1-f68.google.com [209.85.208.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B1F3E68BA72 for ; Sat, 1 Aug 2020 16:49:34 +0300 (EEST) Received: by mail-ed1-f68.google.com with SMTP id i26so20896221edv.4 for ; Sat, 01 Aug 2020 06:49:34 -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=8g3KqRB/s03tXhH4bNprT5Kd4dqWXPAK4DT4E9DU7uA=; b=C2DiMyo3nUgKQRSKiaP0soeSVM9g8l7xohKUTNV7PimYqZiseef4YhNLrlB6YIIkYg OlK7vN/EbYzPV6ILLa6cZaGfEi7tAjW6iHQr4CuBTzbv7AzFBiPXlpQJCGSnn8wIQdx2 kKRNM3y2SosQJQh+UEoT1/cjJ/lFe1QDVy/B3UC+fhmrBMDh0edRQuHi8U6aVxQDGDkc OfeU2jXOBC+ls5U8pDfCmuVXByoMQdYjmy7+7tQRh8HNhakZR2A3GP8u/MLTdcpjehNv AyZnWX6uuLaOD5Up1mVj9Z3RnCwHm4/CGOIq0z9fruSWceIbrVCZrY14gzZJiu/bKBuz EcEQ== 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=8g3KqRB/s03tXhH4bNprT5Kd4dqWXPAK4DT4E9DU7uA=; b=nweQKtDtsJ1DrZRQHfeOtUB8st3Ygs2cxfn4b9aJdBv2h3pKke36WbxllajiuZSeN3 JlVyK70tSqWkGB+3hPHPbBaM2ooTWQg3NQQPhA/HzS4C/bKTHoOTsHQ7+pV1Ljld/rJl eD4Ja/IbUfD38Y1n63DwcMHTjsV6jctXpg6jr3V/xzEqJABlF2m6gkPGn1kvb9G/Bzfj 7gve4rgdhNHokCL+8Zug4oOlzbJ8Al9zfCg+21iD8hUHTrHv1X3d2si4DZGx2SnxVuXa Gs/xSLEBybRii8jE18urEMSnjtdJMyLC48s/j85zIBvFpPj3NcTEoqIb8Xrd3xRbBW/O MS9g== X-Gm-Message-State: AOAM532Gbog6zbfP/mouGliRL6NOsy3W/VARsATnECwkF3cQMMG/HlpC 5aPxiw3ZDfVd/8so1nH+9JfG5Zu3 X-Google-Smtp-Source: ABdhPJwNeNctf4QjgXa/iYXamPEM6G0tcxtc8kDYPTCCGc43gtfCZKagsXCtX1f7YhL/Yz+pCkdrYA== X-Received: by 2002:a05:6402:16c2:: with SMTP id r2mr8103605edx.127.1596289773907; Sat, 01 Aug 2020 06:49:33 -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.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Aug 2020 06:49:33 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 1 Aug 2020 15:46:57 +0200 Message-Id: <20200801134704.3647-6-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 14/21] avcodec/smacker: Remove redundant checks for NULL before freeing 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 | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index 5e1b8c59ff..5e88e18aec 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -254,8 +254,7 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int err = 0; error: for (int i = 0; i < 2; i++) { - if (vlc[i].table) - ff_free_vlc(&vlc[i]); + ff_free_vlc(&vlc[i]); av_free(h[i].bits); av_free(h[i].lengths); av_free(h[i].values); @@ -732,8 +731,7 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, error: for(i = 0; i < 4; i++) { - if(vlc[i].table) - ff_free_vlc(&vlc[i]); + ff_free_vlc(&vlc[i]); av_free(h[i].bits); av_free(h[i].lengths); av_free(h[i].values); From patchwork Sat Aug 1 13:46:58 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21433 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 B7C7C44AA8D for ; Sat, 1 Aug 2020 16:49:43 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9983B68BAAD; Sat, 1 Aug 2020 16:49:43 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f67.google.com (mail-ed1-f67.google.com [209.85.208.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 231FD68BA7B for ; Sat, 1 Aug 2020 16:49:36 +0300 (EEST) Received: by mail-ed1-f67.google.com with SMTP id df16so7874555edb.9 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=d43Gj1GzHz+XRGEgOBM2RVq2/1j6py63NkvCTPWBHOY=; b=AOu5BevFCInhiBHBK5fX1s6sSOUAARbEoIEFiU3DQZ2K3O2nCFrSD6EWcwqIr2dJuH nhuJyMIkQkPvIj4nDbbMg6K3MydjM2Sl8Oyqv9fdFbJKbqJIkM4HaGHzcRf1ENiZr8uQ mgPfpvyb0VYFJPtRAXyocNTSsTtvA7/B2GaHc930NxZ8kt9xBluuQuKZI35XwJjEpYjH XCZAmxuMoDzTzO3yfm6APrBOpHTOE9unigEyBd5PFi1HApP3RpZIrhhzA1k6GoId36Aj vrWqZcjxdILOUd7aP2nvIT7o/4DAT8WlZP3X31551EP6UkIsyql2F0iAc8z/d+AmHMKd 2PyQ== 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=d43Gj1GzHz+XRGEgOBM2RVq2/1j6py63NkvCTPWBHOY=; b=f0XDirnvgVX0wPRtaLyE7aRJ90JNmHZps4yIyUwSVBkT3KEkYZKvWw1Pc6TtGpR4BZ BLeRZLo9XDgJlSmR68+f/EPtLt/WskrvQIcT6FNtO+Bu+xCSTSCoTZHIUCLW3hxvxEAc 27PW/Ax2xYtJAGXcBknTilt0JA1GuQ3Bqp3R3GGZ0LdKxksa/SeihMCLNKIB9xvvgQam MT6RGSU6zSc2hYE1TJyk31YnOhjS1NNPXbArIF0QmIVUI8TMTIadErmFDvqB+KP9zeSf mZ4m/UoaoZYFH2QrLbnvskPvcxFeAqdWHkgfKJ9lg9tfHs/pnohBnZQyOiYkJe1sT3jI ZwDg== X-Gm-Message-State: AOAM531TuC+dxLspMfMZbJdNS3DK6njBzFcoQs0D22IDUO7SkB1rjMmg kE6YSljGJ97QLRQrVo60lTmlgrZO X-Google-Smtp-Source: ABdhPJwWTJO2wRJCAV9NSjAu39365f1Pr4Gd7OsURO9iFcQltSnijE+pAjytxDZA3BJbEwx1mr3wEA== X-Received: by 2002:aa7:d387:: with SMTP id x7mr8231330edq.219.1596289775061; Sat, 01 Aug 2020 06:49:35 -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.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Aug 2020 06:49:34 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 1 Aug 2020 15:46:58 +0200 Message-Id: <20200801134704.3647-7-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 15/21] avcodec/smacker: Replace implicit checks for overread by explicit ones 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" Using explicit checks has the advantage that one can combine several checks into one and does not have to check every time. E.g. reading a 16bit PCM sample involves two calls to get_vlc2(), each of which may read up to three times up to SMKTREE_BITS (= 9) bits. But given that the padding that the input packet is supposed to have is large enough, it is no problem to only check once for each sample. This turned out to be beneficial for performance: For GCC 9, the time for one call of smka_decode_frame() for the sample from ticket #2425 went down from 2055905 to 1804751 decicycles; for Clang 9 it went down from 1510538 to 1479680 decicycles. Signed-off-by: Andreas Rheinhardt --- libavcodec/smacker.c | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index 5e88e18aec..72e007077d 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -33,19 +33,27 @@ #include "libavutil/channel_layout.h" -#define BITSTREAM_READER_LE #include "avcodec.h" -#include "bytestream.h" -#include "get_bits.h" -#include "internal.h" -#include "mathops.h" #define SMKTREE_BITS 9 #define SMK_NODE 0x80000000 -#define SMKTREE_DECODE_MAX_RECURSION 32 +#define SMKTREE_DECODE_MAX_RECURSION FFMIN(32, 3 * SMKTREE_BITS) #define SMKTREE_DECODE_BIG_MAX_RECURSION 500 +/* The maximum possible unchecked overread happens in decode_header_trees: + * Decoding the MMAP tree can overread by 6 * SMKTREE_BITS + 1, followed by + * three get_bits1, followed by at most 2 + 3 * 16 read bits when reading + * the TYPE tree before the next check. 64 is because of 64 bit reads. */ +#if (6 * SMKTREE_BITS + 1 + 3 + (2 + 3 * 16) + 64) <= 8 * AV_INPUT_BUFFER_PADDING_SIZE +#define UNCHECKED_BITSTREAM_READER 1 +#endif +#define BITSTREAM_READER_LE +#include "bytestream.h" +#include "get_bits.h" +#include "internal.h" +#include "mathops.h" + typedef struct SmackVContext { AVCodecContext *avctx; AVFrame *pic; @@ -92,6 +100,9 @@ enum SmkBlockTypes { /** * Decode local frame tree + * + * Can read SMKTREE_DECODE_MAX_RECURSION before the first check; + * does not overread gb on success. */ static int smacker_decode_tree(GetBitContext *gb, HuffContext *hc, uint32_t prefix, int length) { @@ -105,6 +116,8 @@ static int smacker_decode_tree(GetBitContext *gb, HuffContext *hc, uint32_t pref av_log(NULL, AV_LOG_ERROR, "Tree size exceeded!\n"); return AVERROR_INVALIDDATA; } + if (get_bits_left(gb) < 8) + return AVERROR_INVALIDDATA; hc->bits[hc->current] = prefix; hc->lengths[hc->current] = length; hc->values[hc->current] = get_bits(gb, 8); @@ -122,6 +135,8 @@ static int smacker_decode_tree(GetBitContext *gb, HuffContext *hc, uint32_t pref /** * Decode header tree + * + * 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) @@ -136,6 +151,8 @@ static int smacker_decode_bigtree(GetBitContext *gb, HuffContext *hc, av_log(NULL, AV_LOG_ERROR, "Tree size exceeded!\n"); return AVERROR_INVALIDDATA; } + if (get_bits_left(gb) <= 0) + 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; @@ -172,6 +189,9 @@ static int smacker_decode_bigtree(GetBitContext *gb, HuffContext *hc, /** * Store large tree as FFmpeg's vlc codes + * + * Can read FFMAX(1 + SMKTREE_DECODE_MAX_RECURSION, 2 + 3 * 16) bits + * before the first check; can overread by 6 * SMKTREE_BITS + 1 on success. */ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int **recodes, int *last, int size) { @@ -329,7 +349,7 @@ static int decode_header_trees(SmackVContext *smk) { if (ret < 0) return ret; } - if (skip == 4) + if (skip == 4 || get_bits_left(&gb) < 0) return AVERROR_INVALIDDATA; return 0; @@ -339,7 +359,8 @@ static av_always_inline void last_reset(int *recode, int *last) { recode[last[0]] = recode[last[1]] = recode[last[2]] = 0; } -/* get code and update history */ +/* Get code and update history. + * Checks before reading, does not overread. */ static av_always_inline int smk_get_code(GetBitContext *gb, int *recode, int *last) { register int *table = recode; int v; @@ -545,7 +566,7 @@ static av_cold int decode_init(AVCodecContext *avctx) return AVERROR(ENOMEM); /* decode huffman trees from extradata */ - if(avctx->extradata_size < 16){ + if (avctx->extradata_size <= 16){ av_log(avctx, AV_LOG_ERROR, "Extradata missing!\n"); return AVERROR(EINVAL); } 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: From patchwork Sat Aug 1 13:47:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21436 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 996EC44AA8D for ; Sat, 1 Aug 2020 16:49:46 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 88AFF68BAE1; Sat, 1 Aug 2020 16:49:46 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f67.google.com (mail-ed1-f67.google.com [209.85.208.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C77BF68BA97 for ; Sat, 1 Aug 2020 16:49:37 +0300 (EEST) Received: by mail-ed1-f67.google.com with SMTP id v22so13435971edy.0 for ; Sat, 01 Aug 2020 06:49:37 -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=WH+ViCCeNj/5zkdwVrJjTwPuephVaMdfhGad3Bga/hY=; b=YfHEiemsQvzPZcRuou/P1EDKl2GAOVzOvjjohUzer+LA5B4U6sBlg4wP7ZfaXLuyMH m3Fj2N0qJQsrKEVjHj5A7+a0e8RuGVrN5wXYzGu9MPBeEI/3oUjpGrWC8/plRs+LuPAs 49tSHLRTrHeJGC277FcUXNvjKja4CawCBMp5w10LhNUQ26Ql8YeqYIZ0kg1x76K0+Azs L2EQWrHSbgbvbKypUj7MAnM7MwQX6MEh5rbjVJw/amSi/fsWwVnh0Tpk4USYMGMMdyvx 0M7Y2knFSEtyjTR2jyF+XeEkZDsoIyO4BIE/RYbUDngKAv9UM5jEt+Nz0LCac6xHTJbe 54pA== 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=WH+ViCCeNj/5zkdwVrJjTwPuephVaMdfhGad3Bga/hY=; b=Eti13vI1ifa9z5k1iz4EUCZMOZhyvF8E2qYKUcP88ayYZ/ox7V/wPWNAztfOpy1lku 9HH8UDwb3NBCv6lk2P1vfQqbbrP5T26JxicXdFYkOFxQLcxoQF8sKfpAmA9r20mYi/vX D/eZ+5OKidfSZRIGFucVLLYb9Qak/gd+CS8vuLEWp/nNRoYBmmFmWBLvIdPCzrW1GjwS C0FFJhzs75GEavopBjUVwZNzgrSc9ETw1Ap7mkD59ENcnN7o6OQCVQpdCgTUx+6XUNdT XxV3AQfybCdjiHm7ze4WUXuH8tADC8Qk6vZAIW2Dz6V+hx97WdBk+Ot516JjimBVghGK DI6g== X-Gm-Message-State: AOAM532mPAjBumC3l8rrkasi88QOgLZpC0xlVEr4CgYqwDipGdevSkOd Ymk7qOLjPjoSdkqp3IiiqY/rYPdh X-Google-Smtp-Source: ABdhPJwGGcRlNXSaVdbiMEy/y0lcEsjK8MFKeULs6EP0AaXeVeBbO1yOjYEDoZ8zb+0Yq/zBXxcqCQ== X-Received: by 2002:aa7:cf1a:: with SMTP id a26mr8280638edy.51.1596289776977; 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.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Aug 2020 06:49:36 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 1 Aug 2020 15:47:00 +0200 Message-Id: <20200801134704.3647-9-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 17/21] avcodec/smacker: Use smaller types 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" This will mean that we will need less stack space lateron when these arrays are no longer heap-allocated. No discernible speed impact. Signed-off-by: Andreas Rheinhardt --- libavcodec/smacker.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index f5193e1278..c1928e3908 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -69,8 +69,8 @@ typedef struct HuffContext { int length; int current; uint32_t *bits; - int *lengths; - int *values; + uint8_t *lengths; + uint8_t *values; } HuffContext; /* common parameters used for decode_bigtree */ @@ -78,7 +78,7 @@ typedef struct DBCtx { int current, length; int *values; VLC *v1, *v2; - int *recode1, *recode2; + const uint8_t *recode1, *recode2; int escapes[3]; int *last; } DBCtx; @@ -671,7 +671,7 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, skip_bits1(&gb); if(h[i].current > 1) { ret = init_vlc(&vlc[i], SMKTREE_BITS, h[i].current, - h[i].lengths, sizeof(int), sizeof(int), + INIT_VLC_DEFAULT_SIZES(h[i].lengths), h[i].bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE); if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "Cannot build VLC table\n"); 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]; } } From patchwork Sat Aug 1 13:47:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21438 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 4A09C44AA8D for ; Sat, 1 Aug 2020 16:49:48 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3AF3268BAEF; Sat, 1 Aug 2020 16:49:48 +0300 (EEST) 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 AC2D068BAB4 for ; Sat, 1 Aug 2020 16:49:39 +0300 (EEST) Received: by mail-ej1-f67.google.com with SMTP id a21so34138080ejj.10 for ; Sat, 01 Aug 2020 06:49:39 -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=9/gV7IW8aX+9ziQ56Lmuq++L+Qc7y3UO0pdTjO5H0Pk=; b=ozE5ZZp66NsKUSKR2imhR1gnYfdwiFYGB4OaYw1u2onC4HrYc09lnzw8ExPmkuDq1q N6KmDyft9uj8E19JNHYtlYBIE3wM0/04S6oQ4myvLAMa+r9I0nZpPoPRyiec5ZctaifD i8qkfKPJy0Kl3S5yd9QbP+m9v92PRrynAECnVFhAOaq9YWfRBcbMunzRCssyj1fdUtQS 3bT2hnJXJ/vUaOvmVF5UFwD3oMjoiAs5/QaqtzPXFfpGNSKJCdIyNWy7NgBQFHm7lnQY B+MFpsYPV/dBt6LBVI3V3FtXK4aLoHjonP8ZWxx5ChC8WUP+xlwsb/CRW2Z/VO/LMbWJ gEKw== 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=9/gV7IW8aX+9ziQ56Lmuq++L+Qc7y3UO0pdTjO5H0Pk=; b=ARYNpDDwY3GyEMbym/iTfLtjXBIjCxHnEzIlPhe7vkO6O6dyntPfZgMpXRgrqJT8go q8N/F2//aIw1uGOgud9fCeUhTJGdohwoCgiP/J444kkaX/F5QugQF62mbXPoQyU24UQi K4CN7UpUNKREfoHRVBcttcleTzbsI8s4rTIUmsJsOzXJlKAnwMyqBRc7UsXiT51wRbdl 0JcygcWS+8xdYBsh5tw1mT0KZPwa/gj7I7QEB2J8n8AQdnPnFOe81bhT3/hY76btffn0 KjzTWo8COqT6fa2NRxNtvcUirWa7/40fOHu+tGFGzjALyonq2ehVTbKSqHm4QTTL0FZT VqlQ== X-Gm-Message-State: AOAM530dPtEFJF++PHREESGhMJnPnFkwKkZkNbftQIuak7NoGMW5Sznf HINeiKvnZ+LO55sbhlknx+U4YBCY X-Google-Smtp-Source: ABdhPJwk5y2JzrqfQZbdCYFs0QXh2aBhFBrX4JAW9zdK4vkX8z187lqRoZ6gS+7sykW6EEFPd0CI2w== X-Received: by 2002:a17:906:841:: with SMTP id f1mr8908955ejd.158.1596289778794; Sat, 01 Aug 2020 06:49:38 -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:38 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 1 Aug 2020 15:47:02 +0200 Message-Id: <20200801134704.3647-11-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 19/21] avcodec/smacker: Avoid allocations for decoding Smacker 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" by using buffers on the stack instead. The fact that the effective lifetime of most of the allocated buffers doesn't overlap enables one to limit the stack space used to a fairly modest size (about 1.5 KiB). That all the buffers used in HuffContexts have always the same number of elements (namely 256) makes it possible to include the buffers directly in the HuffContext. Doing so also makes the length field redundant; it has therefore been removed. This is beneficial for performance: For GCC 9 the time for one call to smka_decode_frame() for the sample in ticket #2425 went down from 1794494 to 1709043 decicyles; for Clang 9 it decreased from 1449420 to 1355273 decicycles. Signed-off-by: Andreas Rheinhardt --- libavcodec/smacker.c | 69 +++++++++++++++----------------------------- 1 file changed, 23 insertions(+), 46 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index 15c8856e69..e588b03820 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -66,11 +66,10 @@ typedef struct SmackVContext { * Context used for code reconstructing */ typedef struct HuffContext { - int length; int current; - uint32_t *bits; - uint8_t *lengths; - uint8_t *values; + uint32_t bits[256]; + uint8_t lengths[256]; + uint8_t values[256]; } HuffContext; /* common parameters used for decode_bigtree */ @@ -114,7 +113,7 @@ static int smacker_decode_tree(GetBitContext *gb, HuffContext *hc, uint32_t pref } if(!get_bits1(gb)){ //Leaf - if(hc->current >= hc->length){ + if (hc->current >= 256) { av_log(NULL, AV_LOG_ERROR, "Tree size exceeded!\n"); return AVERROR_INVALIDDATA; } @@ -198,7 +197,6 @@ static int smacker_decode_bigtree(GetBitContext *gb, DBCtx *ctx, int length) */ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int **recodes, int *last, int size) { - HuffContext h[2] = { 0 }; VLC vlc[2] = { { 0 } }; int escapes[3]; DBCtx ctx; @@ -210,37 +208,30 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int } for (int i = 0; i < 2; i++) { - h[i].length = 256; - h[i].current = 0; - h[i].bits = av_malloc(256 * sizeof(h[i].bits[0])); - h[i].lengths = av_malloc(256 * sizeof(h[i].lengths[0])); - h[i].values = av_malloc(256 * sizeof(h[i].values[0])); - if (!h[i].bits || !h[i].lengths || !h[i].values) { - err = AVERROR(ENOMEM); - goto error; - } + HuffContext h; + h.current = 0; if (!get_bits1(gb)) { ctx.vals[i] = 0; av_log(smk->avctx, AV_LOG_ERROR, "Skipping %s bytes tree\n", i ? "high" : "low"); continue; } - err = smacker_decode_tree(gb, &h[i], 0, 0); + err = smacker_decode_tree(gb, &h, 0, 0); if (err < 0) goto error; skip_bits1(gb); - if (h[i].current > 1) { - 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 (h.current > 1) { + err = ff_init_vlc_sparse(&vlc[i], SMKTREE_BITS, h.current, + INIT_VLC_DEFAULT_SIZES(h.lengths), + INIT_VLC_DEFAULT_SIZES(h.bits), + INIT_VLC_DEFAULT_SIZES(h.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]; + ctx.vals[i] = h.values[0]; } escapes[0] = get_bits(gb, 16); @@ -276,9 +267,6 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int error: for (int i = 0; i < 2; i++) { ff_free_vlc(&vlc[i]); - av_free(h[i].bits); - av_free(h[i].lengths); - av_free(h[i].values); } return err; @@ -603,7 +591,6 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; GetBitContext gb; - HuffContext h[4] = { { 0 } }; VLC vlc[4] = { { 0 } }; int16_t *samples; uint8_t *samples8; @@ -659,31 +646,24 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, // Initialize for(i = 0; i < (1 << (bits + stereo)); i++) { - h[i].length = 256; - h[i].current = 0; - h[i].bits = av_malloc(256 * sizeof(h[i].bits)); - h[i].lengths = av_malloc(256 * sizeof(h[i].lengths)); - h[i].values = av_malloc(256 * sizeof(h[i].values)); - if (!h[i].bits || !h[i].lengths || !h[i].values) { - ret = AVERROR(ENOMEM); - goto error; - } + HuffContext h; + h.current = 0; skip_bits1(&gb); - if ((ret = smacker_decode_tree(&gb, &h[i], 0, 0)) < 0) + if ((ret = smacker_decode_tree(&gb, &h, 0, 0)) < 0) goto error; skip_bits1(&gb); - if(h[i].current > 1) { - ret = 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), + if (h.current > 1) { + ret = ff_init_vlc_sparse(&vlc[i], SMKTREE_BITS, h.current, + INIT_VLC_DEFAULT_SIZES(h.lengths), + INIT_VLC_DEFAULT_SIZES(h.bits), + INIT_VLC_DEFAULT_SIZES(h.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]; + values[i] = h.values[0]; } /* this codec relies on wraparound instead of clipping audio */ if(bits) { //decode 16-bit data @@ -758,9 +738,6 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, error: for(i = 0; i < 4; i++) { ff_free_vlc(&vlc[i]); - av_free(h[i].bits); - av_free(h[i].lengths); - av_free(h[i].values); } return ret; From patchwork Sat Aug 1 13:47:03 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21432 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 CF63C44AA8D for ; Sat, 1 Aug 2020 16:49:42 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B70EA68BA7B; Sat, 1 Aug 2020 16:49:42 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f68.google.com (mail-ej1-f68.google.com [209.85.218.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EF6AD68BA8F for ; Sat, 1 Aug 2020 16:49:40 +0300 (EEST) Received: by mail-ej1-f68.google.com with SMTP id kq25so21199002ejb.3 for ; Sat, 01 Aug 2020 06:49:40 -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=eTk0csESgyIumtWV7QBbHvenJ/uaAO0zbsdS1uqiO5A=; b=LCmuEWvorLNdkc0ERh8dQDvshdFQkkdBqfdnPhhmG9phRTqFdK96u6jdQbHJbqVsWT e3O4qm1TwPNdFko0fyxJ8ADCgG9UzGVnWQEG3gb6m0Py0l8kTZhBzYEvR0drIeTLE9Ez TxXZy08B+Eu4GtFT5G4WL8XC8iqpv0yNI7pTPZNzN+eTVtVtnvGUL+5hXeMuUWW4fgID w+H2VbTgTPolziWAbcOfpLEdzZlApw3X14ouP9gLNHuc+GtTF0eqCD4Hlo8VSSlURlgI ERcKnT2AWHFhTPT27d+CAaP0bOjsW9OI+le4DlC6PytX3hUK3lYrVbztERpP63HEw6PC KnIg== 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=eTk0csESgyIumtWV7QBbHvenJ/uaAO0zbsdS1uqiO5A=; b=ujAD2tQTOaQQmmZSrZh1VYSNsuNlXghRZEBqTS/c/CDKChH2tp0MyAokejwRWzYpbl L9eEPA0MasqFF3RVB3nPWXlv4MOTFKlBYv8E8kr3DfWLFmd5gTZeuOH80LqT4WjBJAwo v9vFlqOgTocYbAh3zXsJphMKpF7HIIXXA5rYEeQvAO+Gn/qI9FOXT3PmDk4/IvpsW66Z QahxeH/a/Ff8O+sHl6D//bDryqvfFdJx/JO+xlv5EmSTFeGEWnRPLR8IBN0aGSbhp36K gxMFlZx4XQWdoBfITVKsNnyN5i85wMu4HhYj5GOGiniHiiDyZ69R+XyrCqyA/USyixqR azDA== X-Gm-Message-State: AOAM532SBfX3JbQcf4IK21kzXqVzfLSzsQxn8cT4wcOH5Gw/Mp0rf4OU XnzoZzwaykRqgoFqjtryV/5RlMSy X-Google-Smtp-Source: ABdhPJw7J2EZfKBBtFaJbbZv1YWzc8iYHqZ0DQWxGqGE1Wdbs1PSIF8lglLnUn6NAAih6HM8ckPn+g== X-Received: by 2002:a17:906:68da:: with SMTP id y26mr8525789ejr.250.1596289779777; Sat, 01 Aug 2020 06:49:39 -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.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Aug 2020 06:49:39 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 1 Aug 2020 15:47:03 +0200 Message-Id: <20200801134704.3647-12-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 20/21] avcodec/smacker: Use unsigned for prediction values 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 Smacker decoder has pretended that the prediction values are signed in code like 'pred[0] += (unsigned)sign_extend(val, 16)' (the cast has been added to this code later to fix undefined behaviour). This has been even done in case the PCM format is u8. Yet in case of 8/16 bit samples, only the lower 8/16 bit of the predicition values are ever used, so one can just as well just use unsigned and remove the sign extensions. This is what this commit does. For GCC 9 the time for one call to smka_decode_frame() for the sample from ticket #2425 decreased from 1709043 to 1693619 decicycles; for Clang 9 it went up from 1355273 to 1369089 decicycles. Signed-off-by: Andreas Rheinhardt --- libavcodec/smacker.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index e588b03820..d2b1c68162 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -595,11 +595,10 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, int16_t *samples; uint8_t *samples8; uint8_t values[4]; - int val; int i, res, ret; int unp_size; int bits, stereo; - int pred[2] = {0, 0}; + unsigned pred[2], val; if (buf_size <= 4) { av_log(avctx, AV_LOG_ERROR, "packet is too small\n"); @@ -668,7 +667,7 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, /* this codec relies on wraparound instead of clipping audio */ if(bits) { //decode 16-bit data for(i = stereo; i >= 0; i--) - pred[i] = sign_extend(av_bswap16(get_bits(&gb, 16)), 16); + pred[i] = av_bswap16(get_bits(&gb, 16)); for(i = 0; i <= stereo; i++) *samples++ = pred[i]; for(; i < unp_size / 2; i++) { @@ -687,7 +686,7 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, else res = values[3]; val |= res << 8; - pred[1] += (unsigned)sign_extend(val, 16); + pred[1] += val; *samples++ = pred[1]; } else { if(vlc[0].table) @@ -700,7 +699,7 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, else res = values[1]; val |= res << 8; - pred[0] += (unsigned)sign_extend(val, 16); + pred[0] += val; *samples++ = pred[0]; } } @@ -719,14 +718,14 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3); else res = values[1]; - pred[1] += sign_extend(res, 8); + pred[1] += res; *samples8++ = pred[1]; } else { if(vlc[0].table) res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3); else res = values[0]; - pred[0] += sign_extend(res, 8); + pred[0] += res; *samples8++ = pred[0]; } } From patchwork Sat Aug 1 13:47:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21434 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 B2E4E44AA8D for ; Sat, 1 Aug 2020 16:49:44 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9BCD868BAB2; Sat, 1 Aug 2020 16:49:44 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f45.google.com (mail-ed1-f45.google.com [209.85.208.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BCD8A68BA9A for ; Sat, 1 Aug 2020 16:49:41 +0300 (EEST) Received: by mail-ed1-f45.google.com with SMTP id c15so14551917edj.3 for ; Sat, 01 Aug 2020 06:49:41 -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=UIh9WCxwtu1ND6rdAM17z7VQ4MpwD4AlUR8QVAQG+Ic=; b=mrGuMOnZVG7DBIWed2bOB7EcnLYmx04wQvSuq+6RR4L1NcYrBuXikRQRjmrK1msXBE zeKAaHWCrXSBW//yWncEchT8pRAd5pyQe8kHr3HXqtYBMjbIUgZPD3ljv0RUaDcyMoVT KR83U3t2jsovBqAb1XI8jtxnGKM9h1Znzm832Gp3mWG3KU5SwJ1dXGCjcTCzWxCuZ6QM VcQpC9+pwbYtLFCPSP3Vcg54QBo/aQlT8RBgaTvha0EBUQfDXUayp0kBTtF+mlPkTj8D qrvNkUFiU7SGdBX8plJ9pP+3sEj1GU2vVX6mARDcEefP65yNoy7l3EzisQsZuqZ67F0w XdcQ== 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=UIh9WCxwtu1ND6rdAM17z7VQ4MpwD4AlUR8QVAQG+Ic=; b=Sr9roZ1AKFL6qSCIFRlPjFTt6fdNVpzGKkzvT4wLnV6J9SvIAvKz/mY2my/bLbTUVM X/nG76/vpCd83m3ivGOGaeOI8ZFnMYKqRG2wlfYFMbZ4xjDiFPaQggwX2m09uYdXbthP n/Hk5egZakTeDDbdirpNkW7TQvu+HUnjGFkOhHa87aDDrdcKY7oKnNmV2WbK06J1SCC9 t11YBkmvLN1GMeVQaRVppQVxncZ912FfWex3qKpaUB2P325wEn/e39Hve6fSiEKErX0m 0relFJn4hsxCLT7zMOLA2+1XPMcnAgmEY8E5k9tvxNyzU/iXZq8rKlJID8LR9+Jzlgb4 iSsw== X-Gm-Message-State: AOAM533tS3y7+Qp0bhR/PkGc+h2Dqka4+9xZDmWnlcZFP8JDZD/q2qNf msJRM/hhIuz0mEcx+ydZ3HgwwIRd X-Google-Smtp-Source: ABdhPJxlTJuuFYX6B5nLPVAiw3bvch5zm8/t809SwpyNLjejQr/wb+NUu7JjiAalpt5AJNdpo42QkQ== X-Received: by 2002:a05:6402:308e:: with SMTP id de14mr8118972edb.344.1596289780652; Sat, 01 Aug 2020 06:49:40 -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.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Aug 2020 06:49:40 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 1 Aug 2020 15:47:04 +0200 Message-Id: <20200801134704.3647-13-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 21/21] avcodec/smacker: Avoid code duplication 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" Besides the obvious advantage of less code this also has a performance impact: For GCC 9 the time spent on one call to smka_decode_frame() for the sample from ticket #2425 decreased from 1693619 to 1498127 decicycles. For Clang 9, it decreased from 1369089 to 1366465 decicycles. Signed-off-by: Andreas Rheinhardt --- The numbers for GCC surprised me (as did the fact that GCC was so much worse than Clang). libavcodec/smacker.c | 62 ++++++++++++++------------------------------ 1 file changed, 20 insertions(+), 42 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index d2b1c68162..ffd24c11e7 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -671,37 +671,23 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, for(i = 0; i <= stereo; i++) *samples++ = pred[i]; for(; i < unp_size / 2; i++) { + unsigned idx = 2 * (i & stereo); if (get_bits_left(&gb) < 0) { ret = AVERROR_INVALIDDATA; goto error; } - if(i & stereo) { - if(vlc[2].table) - res = get_vlc2(&gb, vlc[2].table, SMKTREE_BITS, 3); - else - res = values[2]; - val = res; - if(vlc[3].table) - res = get_vlc2(&gb, vlc[3].table, SMKTREE_BITS, 3); - else - res = values[3]; - val |= res << 8; - pred[1] += val; - *samples++ = pred[1]; - } else { - if(vlc[0].table) - res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3); - else - res = values[0]; - val = res; - if(vlc[1].table) - res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3); - else - res = values[1]; - val |= res << 8; - pred[0] += val; - *samples++ = pred[0]; - } + if (vlc[idx].table) + res = get_vlc2(&gb, vlc[idx].table, SMKTREE_BITS, 3); + else + res = values[idx]; + val = res; + if (vlc[++idx].table) + res = get_vlc2(&gb, vlc[idx].table, SMKTREE_BITS, 3); + else + res = values[idx]; + val |= res << 8; + pred[idx / 2] += val; + *samples++ = pred[idx / 2]; } } else { //8-bit data for(i = stereo; i >= 0; i--) @@ -709,25 +695,17 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, for(i = 0; i <= stereo; i++) *samples8++ = pred[i]; for(; i < unp_size; i++) { + unsigned idx = i & stereo; if (get_bits_left(&gb) < 0) { ret = AVERROR_INVALIDDATA; goto error; } - if(i & stereo){ - if(vlc[1].table) - res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3); - else - res = values[1]; - pred[1] += res; - *samples8++ = pred[1]; - } else { - if(vlc[0].table) - res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3); - else - res = values[0]; - pred[0] += res; - *samples8++ = pred[0]; - } + if (vlc[idx].table) + val = get_vlc2(&gb, vlc[idx].table, SMKTREE_BITS, 3); + else + val = values[idx]; + pred[idx] += val; + *samples8++ = pred[idx]; } }