Commit 9c4b5eb8 authored by Kostya Shishkov's avatar Kostya Shishkov
Browse files

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.

Originally committed as revision 18696 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 77b12f80
......@@ -61,6 +61,29 @@ static RV34VLC intra_vlcs[NUM_INTRA_TABLES], inter_vlcs[NUM_INTER_TABLES];
* @{
*/
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 @@ static RV34VLC intra_vlcs[NUM_INTRA_TABLES], inter_vlcs[NUM_INTER_TABLES];
* @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 @@ static void rv34_gen_vlc(const uint8_t *bits, int size, VLC *vlc, const uint8_t
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 @@ static av_cold void rv34_init_tables(void)
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);
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);
}
}
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_intra_coeff[i], COEFF_VLC_SIZE, &intra_vlcs[i].coefficient, NULL);
}
for(i = 0; i < NUM_INTER_TABLES; i++){
rv34_gen_vlc(rv34_inter_cbppat[i], CBPPAT_VLC_SIZE, &inter_vlcs[i].cbppattern[0], NULL);
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);
}
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_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]);
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++){
free_vlc(&intra_vlcs[i].cbp[j][k]);
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++){
free_vlc(&intra_vlcs[i].first_pattern[j]);
rv34_gen_vlc(rv34_table_intra_firstpat[i][j], FIRSTBLK_VLC_SIZE, &intra_vlcs[i].first_pattern[j], NULL, 19*i + 14 + j);
}
free_vlc(&intra_vlcs[i].coefficient);
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++){
free_vlc(&inter_vlcs[i].cbppattern[0]);
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++){
free_vlc(&inter_vlcs[i].cbp[0][j]);
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++){
free_vlc(&inter_vlcs[i].first_pattern[j]);
free_vlc(&inter_vlcs[i].second_pattern[j]);
free_vlc(&inter_vlcs[i].third_pattern[j]);
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);
}
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 @@ av_cold int ff_rv34_decode_init(AVCodecContext *avctx)
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 @@ av_cold int ff_rv34_decode_end(AVCodecContext *avctx)
RV34DecContext *r = avctx->priv_data;
MPV_common_end(&r->s);
rv34_free_tables();
av_freep(&r->intra_types_hist);
r->intra_types = NULL;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment