From patchwork Tue Apr 14 10:25:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Gisquet X-Patchwork-Id: 18948 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 3914444B934 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 22BE068B6F3; 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-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4ED5868B5EE for ; Tue, 14 Apr 2020 13:25:13 +0300 (EEST) Received: by mail-wr1-f65.google.com with SMTP id j2so13679278wrs.9 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=YzbkHM6ecuVXmZ5FvggpUL4h05XGfnli2Vubmqfr+is=; b=XFz33lZJz/5E365DtRldhcE5VjR5tw2XUo8iq3j08M/ob6J8VN8CiT552karmsA1gv y1slf13odVaZBAjkcH/Gw2xeyPg8p2xJRTtRJc1I9sq4cegt+JkF8D2yMrfYaInep/dI 4MsjtDASXHOMcnDtM32wbOgbkP+TTg2sp3T5z4lm9NzGlQWzYEoAaegHkENK+pzto3Qd kbI5E4iXn+7zz03+Nt4Cped3OML3yKUjg2gn+/dANbYiftNZtW13fpbNA5Zi2O6+buzI 3ljW5WYeWuee67X44NVUflviX+gOuuL96UP3B31EU+sBkfT1eIfHYWV0H9EBhrFFjguv +ILQ== 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=YzbkHM6ecuVXmZ5FvggpUL4h05XGfnli2Vubmqfr+is=; b=rHFB6iSlgiKELHudtGq4nNZzHWqbDOZhvOPN8W18ihdlgPHytjdcxrKf8OvDZIIW7r z8WWKra8mMtnNyrqVHz03zt9Q168ILEjAMVFPmg7zefXytmlv90uLEhK+wB1ZSP7l3Dj USjHAdPjoDDFVkl+vZOJPBUEzb/2pJqTVL8Cp8ez0pcY9ROnovccVT5rJcZMtOSbJCsv MWrJ/80xicqIMsN0Cj1ank+eNm/yGS0B/AtQTx4tF5+KLJoFuBjBuuoZ65IRMqxn+RuZ G66SOv9eS0Wcmf6//REVjzQmF/2LcmXL9211ge7y9cvoZbKTPZHv4ltmhU8o+xwYx9sU 7Bog== X-Gm-Message-State: AGi0PuaeazGqeY+AB3RLUb4wLZMosdNld+rEi2oUafejsMgFy75269MU aJ9bb4evkhfVIOfD62FdVTu2ONk= X-Google-Smtp-Source: APiQypKk09FFPR1rJoYFC3Zs1oTDgsmZI3dKsnDerk/15lxLzXa6ARCm1/jthTb23YaPFFqncFyEJA== X-Received: by 2002:a5d:6647:: with SMTP id f7mr21785584wrw.41.1586859912466; Tue, 14 Apr 2020 03:25:12 -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.11 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Apr 2020 03:25:11 -0700 (PDT) From: Christophe Gisquet To: ffmpeg-devel@ffmpeg.org Date: Tue, 14 Apr 2020 10:25:00 +0000 Message-Id: <20200414102503.7858-5-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 4/7] get_bits: replace index by an incremented pointer 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 main effect is actually code size reduction, due to the smaller refill code (or difference in inlining decision), e.g. on Win32 of {magicyuv,huffyuvdec,utvideodec}.o as follows: 19068/41460/16512 -> 18892/40760/16448 It should also be a small speedup (because it simplifies the address computation), but no change was measured. --- libavcodec/get_bits.h | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/libavcodec/get_bits.h b/libavcodec/get_bits.h index 59bfbdd88b..4f75f9dd84 100644 --- a/libavcodec/get_bits.h +++ b/libavcodec/get_bits.h @@ -91,10 +91,12 @@ typedef uint32_t cache_type; typedef struct GetBitContext { const uint8_t *buffer, *buffer_end; #if CACHED_BITSTREAM_READER + const uint8_t *ptr; cache_type cache; unsigned bits_left; +#else + int index; // Cached version advances ptr instead #endif - int index; int size_in_bits; int size_in_bits_plus8; } GetBitContext; @@ -253,7 +255,7 @@ static inline unsigned int show_bits(GetBitContext *s, int n); static inline int get_bits_count(const GetBitContext *s) { #if CACHED_BITSTREAM_READER - return s->index - s->bits_left; + return 8*(s->ptr - s->buffer) - s->bits_left; #else return s->index; #endif @@ -263,42 +265,42 @@ static inline int get_bits_count(const GetBitContext *s) static inline void refill_half(GetBitContext *s, int is_le) { #if !UNCHECKED_BITSTREAM_READER - if (s->index >> 3 >= s->buffer_end - s->buffer) + if (s->ptr >= s->buffer_end) return; #endif #if BITSTREAM_BITS == 32 if (s->bits_left > 16) { if (is_le) - s->cache |= (uint32_t)s->buffer[s->index >> 3] << s->bits_left; + s->cache |= (uint32_t)s->ptr[0] << s->bits_left; else - s->cache |= (uint32_t)s->buffer[s->index >> 3] << (32 - s->bits_left); - s->index += 8; + s->cache |= (uint32_t)s->ptr[0] << (32 - s->bits_left); + s->ptr++; s->bits_left += 8; return; } #endif if (is_le) - s->cache |= (cache_type)AV_RL_HALF(s->buffer + (s->index >> 3)) << s->bits_left; + s->cache |= (cache_type)AV_RL_HALF(s->ptr) << s->bits_left; else - s->cache |= (cache_type)AV_RB_HALF(s->buffer + (s->index >> 3)) << (BITSTREAM_HBITS - s->bits_left); - s->index += BITSTREAM_HBITS; + s->cache |= (cache_type)AV_RB_HALF(s->ptr) << (BITSTREAM_HBITS - s->bits_left); + s->ptr += sizeof(s->cache)/2; s->bits_left += BITSTREAM_HBITS; } static inline void refill_all(GetBitContext *s, int is_le) { #if !UNCHECKED_BITSTREAM_READER - if (s->index >> 3 >= s->buffer_end - s->buffer) + if (s->ptr >= s->buffer_end) return; #endif if (is_le) - s->cache = AV_RL_ALL(s->buffer + (s->index >> 3)); + s->cache = AV_RL_ALL(s->ptr); else - s->cache = AV_RB_ALL(s->buffer + (s->index >> 3)); - s->index += BITSTREAM_BITS; + s->cache = AV_RB_ALL(s->ptr); + s->ptr += sizeof(s->cache); s->bits_left = BITSTREAM_BITS; } @@ -534,13 +536,12 @@ static inline void skip_bits(GetBitContext *s, int n) else { n -= s->bits_left; s->cache = 0; - s->bits_left = 0; if (n >= BITSTREAM_BITS) { - unsigned skip = (n / 8) * 8; + unsigned skip = n / 8; - n -= skip; - s->index += skip; + n -= 8*skip; + s->ptr += skip; } #ifdef BITSTREAM_READER_LE refill_all(s, 1); @@ -699,12 +700,14 @@ static inline int init_get_bits_xe(GetBitContext *s, const uint8_t *buffer, s->size_in_bits = bit_size; s->size_in_bits_plus8 = bit_size + 8; s->buffer_end = buffer + buffer_size; - s->index = 0; #if CACHED_BITSTREAM_READER + s->ptr = buffer; s->cache = 0; s->bits_left = 0; refill_all(s, is_le); +#else + s->index = 0; #endif return ret; @@ -757,7 +760,11 @@ static inline const uint8_t *align_get_bits(GetBitContext *s) int n = -get_bits_count(s) & 7; if (n) skip_bits(s, n); +#if CACHED_BITSTREAM_READER + return s->ptr; +#else return s->buffer + (s->index >> 3); +#endif } /**