[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