From patchwork Wed Oct 16 13:26:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Niedermayer X-Patchwork-Id: 52360 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:d072:0:b0:48e:c0f8:d0de with SMTP id bj18csp890652vqb; Wed, 16 Oct 2024 06:27:24 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVwxkTZaAHoMZvowTlo2WLItTy32ZsJKbnZc0wBeIe8EGBDugpkHOfi0UzTEHGGlfxX1yiubqmy9keTugj2Bfj1@gmail.com X-Google-Smtp-Source: AGHT+IF0ybIhRIH1diMF9gx+pjlJj5A4mulbGTSB8SOKx6t+rRyyjHOeXkYLVXeofe6yEXa+Nh7w X-Received: by 2002:ac2:4e03:0:b0:536:553f:3ef9 with SMTP id 2adb3069b0e04-539da4e0b9bmr9195844e87.27.1729085243990; Wed, 16 Oct 2024 06:27:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1729085243; cv=none; d=google.com; s=arc-20240605; b=FjiESpHZOi1X6EqjL8TXfcM2mNk+nymHblT4bHL+IyUNxZUDmK3pTZOL1SmNOk63z+ dfaIzQF889X89pX0m9pyPJlZMyfLuOZNBctwzirHA9qJUSVx89o+ZMqCjgqYnUIOVz49 1vGQe5KnGVUaWjeZ7RGj9386J+Xr76G1RIgSa6g8t/GIP/zhHkfgioLbTvvpYSe4mlNK A0Y/qljnkHNxGv6yu5ZaWNk483t3zysXuEG776kwpjZ47JwLHUf9UVcwfBh8cewoo+sk ASSAmITJ/yZyFV9oXASdSrImMd2xRzCHWQm/blPgaqzSpJUIXHWyyIV6eiLJBkoNFrVc B9AA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=GcHkH07a4L3197m8VpW5RFW4p6uvSieqeItbd9jtTzM=; fh=e5zN9xSzcxLA6bGo3lF+CqTbY/oLwzApV03EO/RBfgQ=; b=Smx9fQZAfco5pBhqs+sT5DvkGx4LEj/YeL1D0JNlsFh4gw29XZlzu5XGxZkFlfRy5R BROKFbC1erKNCp51lg6ZAupf0BG/KbC8OlU0nblyzAsDlJcjHHVySK+ULfCPiB/bVszj ifpG478Fbrk1JH5noxVYP5bq2h8zmOZhdVd6rEHRESqDUQQfXh5fryrETR6AMdnsGHll rVuy49IUt2xVVFwPy1kZHWeE8nf7iK6aarWDAFGlYzVKYYLpj497qTgUiDAcKCOPM2/M Tl2OssRMsRtk8tJc992CsFx/Tw24glb33mSI5KPeSZ8vBHrFX8AkidMkcV4PALB/R8Yw 7SHw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@niedermayer.cc header.s=gm1 header.b=aBWdX3Wp; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 2adb3069b0e04-539fffcffc9si1422721e87.126.2024.10.16.06.27.23; Wed, 16 Oct 2024 06:27:23 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@niedermayer.cc header.s=gm1 header.b=aBWdX3Wp; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4ED2168E326; Wed, 16 Oct 2024 16:26:52 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net [217.70.183.197]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1773268E31A for ; Wed, 16 Oct 2024 16:26:45 +0300 (EEST) Received: by mail.gandi.net (Postfix) with ESMTPSA id 4947F1C0008 for ; Wed, 16 Oct 2024 13:26:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=niedermayer.cc; s=gm1; t=1729085204; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KuUTkqzD3aq19kllOMFNhS1w51EwPKgDZZbgApKbTPo=; b=aBWdX3WpitwrVLGziG4WStg3WzHnFATdDKgGixZARrk/Wa87OQZ7wWVyAKu4LGvFMbAbFd PclIGMjB8HNDI8VfX1drXdlkWr17RUw8V6hEQhdAB/LlhxhPoAl+q2txz2+1l701mE1QxF HHCx09F4jFngqMTX59gFxxB3d1AVcC2B5TWdkW4tEAiBVUTtTwBq/7VjLBPkbFMC2kNgbd GMP/EQijZSyOrZt1t5MjtQJbQGhYzQ1C795BEaGU0S6dsTJR4IfkW4ow2fB2b6zMahGJdH IRxk2RmmF2+t9zsqSRY2mkgH3SAE99Ig0Vyt9iK7/uXu4yMHnMbw4wR3pPQHog== From: Michael Niedermayer To: FFmpeg development discussions and patches Date: Wed, 16 Oct 2024 15:26:38 +0200 Message-ID: <20241016132639.1958007-4-michael@niedermayer.cc> X-Mailer: git-send-email 2.47.0 In-Reply-To: <20241016132639.1958007-1-michael@niedermayer.cc> References: <20241016132639.1958007-1-michael@niedermayer.cc> MIME-Version: 1.0 X-GND-Sasl: michael@niedermayer.cc Subject: [FFmpeg-devel] [PATCH 4/5] avcodec/rangecoder: Implement reading and writing upto 8 bits raw X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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" X-TUID: DPGoHMGmIR+o This is much faster than doing 1 bit and updating a state Signed-off-by: Michael Niedermayer --- libavcodec/rangecoder.h | 53 +++++++++++++++++++++++++++++++++++ libavcodec/tests/rangecoder.c | 13 +++++++++ 2 files changed, 66 insertions(+) diff --git a/libavcodec/rangecoder.h b/libavcodec/rangecoder.h index da13c453edd..4cfdd2fdbe9 100644 --- a/libavcodec/rangecoder.h +++ b/libavcodec/rangecoder.h @@ -82,6 +82,28 @@ static inline void renorm_encoder(RangeCoder *c) c->range <<= 8; } +static inline void renorm_encoder_raw(RangeCoder *c, int extra) +{ + if (c->outstanding_byte < 0) { + c->outstanding_byte = c->low >> 8 + extra; + } else if (c->low <= 0xFF00 << extra) { + *c->bytestream++ = c->outstanding_byte; + for (; c->outstanding_count; c->outstanding_count--) + *c->bytestream++ = 0xFF; + c->outstanding_byte = c->low >> 8 + extra; + } else if (c->low >= 0x10000 << extra) { + *c->bytestream++ = c->outstanding_byte + 1; + for (; c->outstanding_count; c->outstanding_count--) + *c->bytestream++ = 0x00; + c->outstanding_byte = (c->low >> 8 + extra) & 0xFF; + } else { + c->outstanding_count++; + } + + c->low = (c->low & ((1 << 8 + extra) - 1)) << 8 - extra; + c->range <<= 8 - extra; +} + static inline int get_rac_count(RangeCoder *c) { int x = c->bytestream - c->bytestream_start + c->outstanding_count; @@ -110,6 +132,21 @@ static inline void put_rac(RangeCoder *c, uint8_t *const state, int bit) renorm_encoder(c); } +static inline void put_rac_raw(RangeCoder *c, int bits, int len) +{ + int r = c->range >> len; + av_assert2(len <= 8); + av_assert2(bits >> len == 0); + + if (r < 0x100) { + c->low = (c->low << len) + c->range * bits; + renorm_encoder_raw(c, len); + } else { + c->low += r * bits; + c->range = r; + } +} + static inline void refill(RangeCoder *c) { c->range <<= 8; @@ -141,4 +178,20 @@ static inline int get_rac(RangeCoder *c, uint8_t *const state) } } +static inline int get_rac_raw(RangeCoder *c, int len) +{ + int bits; + int r = c->range >> len; + av_assert2(len <= 8); + + if (r < 0x100) { + refill(c); + r = c->range >> len; + } + bits = c->low / r; + c->low -= r * bits; + c->range = r; + return bits; +} + #endif /* AVCODEC_RANGECODER_H */ diff --git a/libavcodec/tests/rangecoder.c b/libavcodec/tests/rangecoder.c index fd858535a5b..7634953585d 100644 --- a/libavcodec/tests/rangecoder.c +++ b/libavcodec/tests/rangecoder.c @@ -76,6 +76,11 @@ int main(void) for (i = 0; i < SIZE; i++) put_rac(&c, state, r[i] & 1); + for (i = 0; i < SIZE; i++) { + int len = r[i++] % 7 + 1; + put_rac_raw(&c, r[i]&((1<