From 10448faa75c648e7be7a910c210121e2609da6c9 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt Date: Thu, 22 May 2025 19:38:24 +0200 Subject: [PATCH 2/3] 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 --- 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++) { -- 2.45.2