[FFmpeg-cvslog] avcodec/asvenc: Combine writing bits
Andreas Rheinhardt
git at videolan.org
Mon May 26 04:52:55 EEST 2025
ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Thu May 22 19:38:24 2025 +0200| [05a5e2b5761f4678dba2fdb77620855366e4fb09] | committer: Andreas Rheinhardt
avcodec/asvenc: Combine writing bits
Removes implicit checks for "do I need to output the buffer now?".
Codesize with Clang 19 with -O3 decreased from 7136B to 6108B
(although asv2_put_level() is now inlined).
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=05a5e2b5761f4678dba2fdb77620855366e4fb09
---
libavcodec/asvenc.c | 39 ++++++++++++++++++++++-----------------
1 file changed, 22 insertions(+), 17 deletions(-)
diff --git a/libavcodec/asvenc.c b/libavcodec/asvenc.c
index a53dc7c670..2f81d6c74b 100644
--- a/libavcodec/asvenc.c
+++ b/libavcodec/asvenc.c
@@ -62,40 +62,43 @@ enum {
static inline void asv1_put_level(PutBitContext *pb, int level)
{
unsigned int index = level + 3;
+ unsigned n, code;
if (index <= 6) {
- put_bits(pb, ff_asv_level_tab[index][1], ff_asv_level_tab[index][0]);
+ n = ff_asv_level_tab[index][1];
+ code = ff_asv_level_tab[index][0];
} else {
- put_bits(pb, 3, 0); /* Escape code */
- put_sbits(pb, 8, level);
+ n = 3 + 8;
+ code = (0 /* Escape code */ << 8) | (level & 0xFF);
}
+ put_bits(pb, n, code);
}
static inline void asv2_put_level(ASVEncContext *a, PutBitContext *pb, int level)
{
unsigned int index = level + 31;
+ unsigned n, code;
if (index <= 62) {
- put_bits_le(pb, ff_asv2_level_tab[index][1], ff_asv2_level_tab[index][0]);
+ n = ff_asv2_level_tab[index][1];
+ code = ff_asv2_level_tab[index][0];
} else {
- put_bits_le(pb, 5, 0); /* Escape code */
if (level < -128 || level > 127) {
av_log(a->c.avctx, AV_LOG_WARNING, "Clipping level %d, increase qscale\n", level);
level = av_clip_int8(level);
}
- put_bits_le(pb, 8, level & 0xFF);
+ n = 5 + 8;
+ code = (level & 0xFF) << 5 | /* Escape code */ 0;
}
+ put_bits_le(pb, n, code);
}
static inline void asv1_encode_block(ASVEncContext *a, int16_t block[64])
{
- int i;
- int nc_count = 0;
-
put_bits(&a->pb, 8, (block[0] + 32) >> 6);
block[0] = 0;
- for (i = 0; i < 10; i++) {
+ for (unsigned i = 0, nc_bits = 0, nc_val = 0; i < 10; i++) {
const int index = ff_asv_scantab[4 * i];
int ccp = 0;
@@ -113,10 +116,11 @@ static inline void asv1_encode_block(ASVEncContext *a, int16_t block[64])
ccp |= 1;
if (ccp) {
- for (; nc_count; nc_count--)
- put_bits(&a->pb, 2, 2); /* Skip */
-
- put_bits(&a->pb, ff_asv_ccp_tab[ccp][1], ff_asv_ccp_tab[ccp][0]);
+ put_bits(&a->pb, nc_bits + ff_asv_ccp_tab[ccp][1],
+ nc_val << ff_asv_ccp_tab[ccp][1] /* Skip */ |
+ ff_asv_ccp_tab[ccp][0]);
+ nc_bits = 0;
+ nc_val = 0;
if (ccp & 8)
asv1_put_level(&a->pb, block[index + 0]);
@@ -127,7 +131,8 @@ static inline void asv1_encode_block(ASVEncContext *a, int16_t block[64])
if (ccp & 1)
asv1_put_level(&a->pb, block[index + 9]);
} else {
- nc_count++;
+ nc_bits += 2;
+ nc_val = (nc_val << 2) | 2;
}
}
put_bits(&a->pb, 5, 0xF); /* End of block */
@@ -146,8 +151,8 @@ static inline void asv2_encode_block(ASVEncContext *a, int16_t block[64])
count >>= 2;
- put_bits_le(&a->pb, 4, count);
- put_bits_le(&a->pb, 8, (block[0] + 32) >> 6);
+ put_bits_le(&a->pb, 4 + 8, count /* 4 bits */ |
+ (/* DC */(block[0] + 32) >> 6) << 4);
block[0] = 0;
for (i = 0; i <= count; i++) {
More information about the ffmpeg-cvslog
mailing list