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
This commit is contained in:
Kostya Shishkov 2009-04-27 05:30:22 +00:00
parent 77b12f809b
commit 9c4b5eb8ce
1 changed files with 42 additions and 52 deletions

View File

@ -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);
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 @@ 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;