From patchwork Tue Apr 14 10:25:01 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Gisquet X-Patchwork-Id: 18949 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 EA25944B934 for ; Tue, 14 Apr 2020 13:25:22 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D4D0168B71C; Tue, 14 Apr 2020 13:25:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CA51D68B611 for ; Tue, 14 Apr 2020 13:25:13 +0300 (EEST) Received: by mail-wr1-f66.google.com with SMTP id d27so4467551wra.1 for ; Tue, 14 Apr 2020 03:25:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=cSedmOrP2Iv9HNy++Gqk5O7GUYDF3+jlqIcy3Bim+po=; b=i6KLY4ANhTlMye1DdkSXmD40YXPVwccQAXYrTmu3wa5WUpHIZBfknlM6+Gl1b/H9DC T0Cx/RvQHNGRC4vnLf25I3MWhhiq6AlLmVPDYl7936lGBmoBNosfnJGV/HUMiN5u/ycS wpxPLnYZgVo8PwvcRw2/erYsahKnytLu5KZHItOZbT/LurRf0yOgyb6Q6s6P+7Blm7vn 6cNJYnyL36TbLf6k1EeXaoHyO/XkC4Uw6Q4o8BnfwZ1PfUIkhakz8rxxfeRmc7w3sU5M Gb0+YluiEEHNCXGzPyyLdKzXZBA2mvTTZ1USCM2zJ9GGCfNCnL/hO87iesbTGvGk0y+B 1aOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=cSedmOrP2Iv9HNy++Gqk5O7GUYDF3+jlqIcy3Bim+po=; b=R8BMtUHuddulBC8WiRlC1XErdNwXLRdn13VLhAzQp5ALAxawDSwONJ6F7l1aew/QHt BiI8zDjDbkKjEMPcUz4DRycvxaQ546PmiSTVbbW4b1TqwYi6iDaqfHwOgRc6Aw+ZRnN3 HW/OKcR5yBUm6/wJ+ABua8sasMPfz8dRuPct6qlweylWZpeh5kOpIxXlBDiISOFmPcXR PLj5GC+tvg4GXGBDqGK5p8KiBTJRSwXdWWn26EuskqH458L4aU7YmZj8lWQ1s2o6KCnF QoWCojkvy6IJ64L8tPk9LB+kdepA39qeyeEYjWP2p2SLwta8CDEWbgm17yMlwf52yZGF Acrw== X-Gm-Message-State: AGi0PuYze05hFjt+nvayrEiDUbbv5j4id9r39cvKdjGzVS6etWk6y/pb nigzDrUOYkbjUOw5QIdpKDvDyc0= X-Google-Smtp-Source: APiQypJg077jvW6Hber2gMJ4DWdAYb5msUVT/0F7dkbpwSrrB8FUldsEv1qtEohptHimTNrsQ+S3ew== X-Received: by 2002:adf:ab17:: with SMTP id q23mr22599885wrc.248.1586859913058; Tue, 14 Apr 2020 03:25:13 -0700 (PDT) Received: from localhost.localdomain (2a01cb0881b29e00157b082460d14b2a.ipv6.abo.wanadoo.fr. [2a01:cb08:81b2:9e00:157b:824:60d1:4b2a]) by smtp.gmail.com with ESMTPSA id i17sm8574487wru.39.2020.04.14.03.25.12 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Apr 2020 03:25:12 -0700 (PDT) From: Christophe Gisquet To: ffmpeg-devel@ffmpeg.org Date: Tue, 14 Apr 2020 10:25:01 +0000 Message-Id: <20200414102503.7858-6-christophe.gisquet@gmail.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200414102503.7858-1-christophe.gisquet@gmail.com> References: <20200414102503.7858-1-christophe.gisquet@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 5/7] get_bits: improve and fix get_bits_long for 32b 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" The new code is guaranteed to read at least 32bits, which is likely ok with the usual case that get_bits without cache can read up to 25. --- libavcodec/get_bits.h | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/libavcodec/get_bits.h b/libavcodec/get_bits.h index 4f75f9dd84..da054ebfcb 100644 --- a/libavcodec/get_bits.h +++ b/libavcodec/get_bits.h @@ -608,21 +608,44 @@ static inline void skip_bits1(GetBitContext *s) */ static inline unsigned int get_bits_long(GetBitContext *s, int n) { + unsigned ret = 0; av_assert2(n>=0 && n<=32); if (!n) { return 0; #if CACHED_BITSTREAM_READER } - return get_bits(s, n); + +# ifdef BITSTREAM_READER_LE + unsigned left = 0; +# endif + if (n > s->bits_left) { + n -= s->bits_left; +# ifdef BITSTREAM_READER_LE + left = s->bits_left; + ret = get_val(s, s->bits_left, 1); + refill_all(s, 1); +# else + ret = get_val(s, s->bits_left, 0); + refill_all(s, 0); +# endif + } + +#ifdef BITSTREAM_READER_LE + ret = get_val(s, n, 1) << left | ret; +#else + ret = get_val(s, n, 0) | ret << n; +#endif + + return ret; #else } else if (n <= MIN_CACHE_BITS) { return get_bits(s, n); } else { #ifdef BITSTREAM_READER_LE - unsigned ret = get_bits(s, 16); + ret = get_bits(s, 16); return ret | (get_bits(s, n - 16) << 16); #else - unsigned ret = get_bits(s, 16) << (n - 16); + ret = get_bits(s, 16) << (n - 16); return ret | get_bits(s, n - 16); #endif }