changeset 9568:976a7ad342af libavcodec

Revert changing VLC initialization type for RV3/4 decoder. While using large static table is not good (especially for embedded devices and CPUs with small cache), other alternatives are not very good either.
author kostya
date Mon, 27 Apr 2009 05:30:22 +0000
parents d98ad4678fb0
children 99b812cc77a9
files rv34.c
diffstat 1 files changed, 42 insertions(+), 52 deletions(-) [+]
line wrap: on
line diff
--- a/rv34.c	Sun Apr 26 20:37:40 2009 +0000
+++ b/rv34.c	Mon Apr 27 05:30:22 2009 +0000
@@ -61,6 +61,29 @@
  * @{
  */
 
+static const int table_offs[] = {
+      0,   1818,   3622,   4144,   4698,   5234,   5804,   5868,   5900,   5932,
+   5996,   6252,   6316,   6348,   6380,   7674,   8944,  10274,  11668,  12250,
+  14060,  15846,  16372,  16962,  17512,  18148,  18180,  18212,  18244,  18308,
+  18564,  18628,  18660,  18692,  20036,  21314,  22648,  23968,  24614,  26384,
+  28190,  28736,  29366,  29938,  30608,  30640,  30672,  30704,  30768,  31024,
+  31088,  31120,  31184,  32570,  33898,  35236,  36644,  37286,  39020,  40802,
+  41368,  42052,  42692,  43348,  43380,  43412,  43444,  43476,  43604,  43668,
+  43700,  43732,  45100,  46430,  47778,  49160,  49802,  51550,  53340,  53972,
+  54648,  55348,  55994,  56122,  56154,  56186,  56218,  56346,  56410,  56442,
+  56474,  57878,  59290,  60636,  62036,  62682,  64460,  64524,  64588,  64716,
+  64844,  66076,  67466,  67978,  68542,  69064,  69648,  70296,  72010,  72074,
+  72138,  72202,  72330,  73572,  74936,  75454,  76030,  76566,  77176,  77822,
+  79582,  79646,  79678,  79742,  79870,  81180,  82536,  83064,  83672,  84242,
+  84934,  85576,  87384,  87448,  87480,  87544,  87672,  88982,  90340,  90902,
+  91598,  92182,  92846,  93488,  95246,  95278,  95310,  95374,  95502,  96878,
+  98266,  98848,  99542, 100234, 100884, 101524, 103320, 103352, 103384, 103416,
+ 103480, 104874, 106222, 106910, 107584, 108258, 108902, 109544, 111366, 111398,
+ 111430, 111462, 111494, 112878, 114320, 114988, 115660, 116310, 116950, 117592
+};
+
+static VLC_TYPE table_data[117592][2];
+
 /**
  * Generate VLC from codeword lengths.
  * @param bits   codeword lengths (zeroes are accepted)
@@ -69,7 +92,8 @@
  * @param insyms symbols for input codes (NULL for default ones)
  * @param num    VLC table number (for static initialization)
  */
-static void rv34_gen_vlc(const uint8_t *bits, int size, VLC *vlc, const uint8_t *insyms)
+static void rv34_gen_vlc(const uint8_t *bits, int size, VLC *vlc, const uint8_t *insyms,
+                         const int num)
 {
     int i;
     int counts[17] = {0}, codes[17];
@@ -93,10 +117,12 @@
     for(i = 0; i < realsize; i++)
         cw[i] = codes[bits2[i]]++;
 
+    vlc->table = &table_data[table_offs[num]];
+    vlc->table_allocated = table_offs[num + 1] - table_offs[num];
     init_vlc_sparse(vlc, FFMIN(maxbits, 9), realsize,
                     bits2, 1, 1,
                     cw,    2, 2,
-                    syms,  2, 2, 0);
+                    syms,  2, 2, INIT_VLC_USE_NEW_STATIC);
 }
 
 /**
@@ -108,66 +134,30 @@
 
     for(i = 0; i < NUM_INTRA_TABLES; i++){
         for(j = 0; j < 2; j++){
-            rv34_gen_vlc(rv34_table_intra_cbppat   [i][j], CBPPAT_VLC_SIZE,   &intra_vlcs[i].cbppattern[j],     NULL);
-            rv34_gen_vlc(rv34_table_intra_secondpat[i][j], OTHERBLK_VLC_SIZE, &intra_vlcs[i].second_pattern[j], NULL);
-            rv34_gen_vlc(rv34_table_intra_thirdpat [i][j], OTHERBLK_VLC_SIZE, &intra_vlcs[i].third_pattern[j],  NULL);
+            rv34_gen_vlc(rv34_table_intra_cbppat   [i][j], CBPPAT_VLC_SIZE,   &intra_vlcs[i].cbppattern[j],     NULL, 19*i + 0 + j);
+            rv34_gen_vlc(rv34_table_intra_secondpat[i][j], OTHERBLK_VLC_SIZE, &intra_vlcs[i].second_pattern[j], NULL, 19*i + 2 + j);
+            rv34_gen_vlc(rv34_table_intra_thirdpat [i][j], OTHERBLK_VLC_SIZE, &intra_vlcs[i].third_pattern[j],  NULL, 19*i + 4 + j);
             for(k = 0; k < 4; k++){
-                rv34_gen_vlc(rv34_table_intra_cbp[i][j+k*2],  CBP_VLC_SIZE,   &intra_vlcs[i].cbp[j][k],         rv34_cbp_code);
+                rv34_gen_vlc(rv34_table_intra_cbp[i][j+k*2],  CBP_VLC_SIZE,   &intra_vlcs[i].cbp[j][k],         rv34_cbp_code, 19*i + 6 + j*4 + k);
             }
         }
         for(j = 0; j < 4; j++){
-            rv34_gen_vlc(rv34_table_intra_firstpat[i][j], FIRSTBLK_VLC_SIZE, &intra_vlcs[i].first_pattern[j], NULL);
+            rv34_gen_vlc(rv34_table_intra_firstpat[i][j], FIRSTBLK_VLC_SIZE, &intra_vlcs[i].first_pattern[j], NULL, 19*i + 14 + j);
         }
-        rv34_gen_vlc(rv34_intra_coeff[i], COEFF_VLC_SIZE, &intra_vlcs[i].coefficient, NULL);
+        rv34_gen_vlc(rv34_intra_coeff[i], COEFF_VLC_SIZE, &intra_vlcs[i].coefficient, NULL, 19*i + 18);
     }
 
     for(i = 0; i < NUM_INTER_TABLES; i++){
-        rv34_gen_vlc(rv34_inter_cbppat[i], CBPPAT_VLC_SIZE, &inter_vlcs[i].cbppattern[0], NULL);
+        rv34_gen_vlc(rv34_inter_cbppat[i], CBPPAT_VLC_SIZE, &inter_vlcs[i].cbppattern[0], NULL, i*12 + 95);
         for(j = 0; j < 4; j++){
-            rv34_gen_vlc(rv34_inter_cbp[i][j], CBP_VLC_SIZE, &inter_vlcs[i].cbp[0][j], rv34_cbp_code);
+            rv34_gen_vlc(rv34_inter_cbp[i][j], CBP_VLC_SIZE, &inter_vlcs[i].cbp[0][j], rv34_cbp_code, i*12 + 96 + j);
         }
         for(j = 0; j < 2; j++){
-            rv34_gen_vlc(rv34_table_inter_firstpat [i][j], FIRSTBLK_VLC_SIZE, &inter_vlcs[i].first_pattern[j],  NULL);
-            rv34_gen_vlc(rv34_table_inter_secondpat[i][j], OTHERBLK_VLC_SIZE, &inter_vlcs[i].second_pattern[j], NULL);
-            rv34_gen_vlc(rv34_table_inter_thirdpat [i][j], OTHERBLK_VLC_SIZE, &inter_vlcs[i].third_pattern[j],  NULL);
+            rv34_gen_vlc(rv34_table_inter_firstpat [i][j], FIRSTBLK_VLC_SIZE, &inter_vlcs[i].first_pattern[j],  NULL, i*12 + 100 + j);
+            rv34_gen_vlc(rv34_table_inter_secondpat[i][j], OTHERBLK_VLC_SIZE, &inter_vlcs[i].second_pattern[j], NULL, i*12 + 102 + j);
+            rv34_gen_vlc(rv34_table_inter_thirdpat [i][j], OTHERBLK_VLC_SIZE, &inter_vlcs[i].third_pattern[j],  NULL, i*12 + 104 + j);
         }
-        rv34_gen_vlc(rv34_inter_coeff[i], COEFF_VLC_SIZE, &inter_vlcs[i].coefficient, NULL);
-    }
-}
-
-/**
- * Initialize all tables.
- */
-static av_cold void rv34_free_tables(void)
-{
-    int i, j, k;
-
-    for(i = 0; i < NUM_INTRA_TABLES; i++){
-        for(j = 0; j < 2; j++){
-            free_vlc(&intra_vlcs[i].cbppattern[j]);
-            free_vlc(&intra_vlcs[i].second_pattern[j]);
-            free_vlc(&intra_vlcs[i].third_pattern[j]);
-            for(k = 0; k < 4; k++){
-                free_vlc(&intra_vlcs[i].cbp[j][k]);
-            }
-        }
-        for(j = 0; j < 4; j++){
-            free_vlc(&intra_vlcs[i].first_pattern[j]);
-        }
-        free_vlc(&intra_vlcs[i].coefficient);
-    }
-
-    for(i = 0; i < NUM_INTER_TABLES; i++){
-        free_vlc(&inter_vlcs[i].cbppattern[0]);
-        for(j = 0; j < 4; j++){
-            free_vlc(&inter_vlcs[i].cbp[0][j]);
-        }
-        for(j = 0; j < 2; j++){
-            free_vlc(&inter_vlcs[i].first_pattern[j]);
-            free_vlc(&inter_vlcs[i].second_pattern[j]);
-            free_vlc(&inter_vlcs[i].third_pattern[j]);
-        }
-        free_vlc(&inter_vlcs[i].coefficient);
+        rv34_gen_vlc(rv34_inter_coeff[i], COEFF_VLC_SIZE, &inter_vlcs[i].coefficient, NULL, i*12 + 106);
     }
 }
 
@@ -1396,7 +1386,8 @@
     r->cbp_chroma = av_malloc(r->s.mb_stride * r->s.mb_height * sizeof(*r->cbp_chroma));
     r->deblock_coefs = av_malloc(r->s.mb_stride * r->s.mb_height * sizeof(*r->deblock_coefs));
 
-    rv34_init_tables();
+    if(!intra_vlcs[0].cbppattern[0].bits)
+        rv34_init_tables();
 
     return 0;
 }
@@ -1518,7 +1509,6 @@
     RV34DecContext *r = avctx->priv_data;
 
     MPV_common_end(&r->s);
-    rv34_free_tables();
 
     av_freep(&r->intra_types_hist);
     r->intra_types = NULL;