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]; }