[FFmpeg-devel] [PATCH 217/217] avcodec/snow: Hardcode table to save space

Andreas Rheinhardt andreas.rheinhardt at gmail.com
Wed Dec 2 06:22:44 EET 2020


The size of ff_qexp is only 32 bytes, but the code to generate it at
runtime takes 47 bytes (GCC 9.3, x64, -O3 in an av_cold function); so
just hardcode it.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
---
 libavcodec/snow.c     | 10 ----------
 libavcodec/snow.h     |  2 +-
 libavcodec/snowdata.h | 10 ++++++++--
 3 files changed, 9 insertions(+), 13 deletions(-)

diff --git a/libavcodec/snow.c b/libavcodec/snow.c
index bb65a6f43f..a037e36873 100644
--- a/libavcodec/snow.c
+++ b/libavcodec/snow.c
@@ -123,15 +123,6 @@ int ff_snow_alloc_blocks(SnowContext *s){
     return 0;
 }
 
-static av_cold void init_qexp(void){
-    int i;
-    double v=128;
-
-    for(i=0; i<QROOT; i++){
-        ff_qexp[i]= lrintf(v);
-        v *= pow(2, 1.0 / QROOT);
-    }
-}
 static void mc_block(Plane *p, uint8_t *dst, const uint8_t *src, int stride, int b_w, int b_h, int dx, int dy){
     static const uint8_t weight[64]={
     8,7,6,5,4,3,2,1,
@@ -433,7 +424,6 @@ static av_cold void snow_static_init(void)
     for (int i = 0; i < MAX_REF_FRAMES; i++)
         for (int j = 0; j < MAX_REF_FRAMES; j++)
             ff_scale_mv_ref[i][j] = 256 * (i + 1) / (j + 1);
-    init_qexp();
 }
 
 av_cold int ff_snow_common_init(AVCodecContext *avctx){
diff --git a/libavcodec/snow.h b/libavcodec/snow.h
index 41a3bef4de..c0d2599859 100644
--- a/libavcodec/snow.h
+++ b/libavcodec/snow.h
@@ -194,7 +194,7 @@ typedef struct SnowContext{
 
 /* Tables */
 extern const uint8_t * const ff_obmc_tab[4];
-extern uint8_t ff_qexp[QROOT];
+extern const uint8_t ff_qexp[QROOT];
 extern int ff_scale_mv_ref[MAX_REF_FRAMES][MAX_REF_FRAMES];
 
 /* C bits used by mmx/sse2/altivec */
diff --git a/libavcodec/snowdata.h b/libavcodec/snowdata.h
index 490fdf8bd6..ca0c1e3f7a 100644
--- a/libavcodec/snowdata.h
+++ b/libavcodec/snowdata.h
@@ -124,8 +124,14 @@ const uint8_t * const ff_obmc_tab[4]= {
     obmc32, obmc16, obmc8, obmc4
 };
 
-/* runtime generated tables */
-uint8_t ff_qexp[QROOT];
+/* ff_qexp[i] = lrintf(128 * 2^(i / QROOT)) with QROOT = 32 */
+const uint8_t ff_qexp[QROOT] = {
+    128, 131, 134, 137, 140, 143, 146, 149, 152, 156, 159,
+    162, 166, 170, 173, 177, 181, 185, 189, 193, 197, 202,
+    206, 211, 215, 220, 225, 230, 235, 240, 245, 251,
+};
+
+/* table generated at runtime */
 int ff_scale_mv_ref[MAX_REF_FRAMES][MAX_REF_FRAMES];
 
 
-- 
2.25.1



More information about the ffmpeg-devel mailing list