Commit f4aecf59 authored by melanson's avatar melanson

Small refactoring: Instead of 4 loops for decoding AC coefficients based

on their grouping, create one loop that indexes into a table of AC VLC 
tables.

There is also a small optimization here: Do not call unpack_vlcs()
if there are no fragments in the list with outstanding coefficients. 
My profiling indicates that this can save upwards of 1 million 
dezicycles per frame throughout the course of unpack_dct_coeffs().


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@20699 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 8cd0f3b9
......@@ -1163,6 +1163,8 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
int ac_y_table;
int ac_c_table;
int residual_eob_run = 0;
VLC *y_tables[64];
VLC *c_tables[64];
/* fetch the DC table indexes */
dc_y_table = get_bits(gb, 4);
......@@ -1192,40 +1194,33 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
ac_y_table = get_bits(gb, 4);
ac_c_table = get_bits(gb, 4);
/* unpack the group 1 AC coefficients (coeffs 1-5) */
/* build tables of AC VLC tables */
for (i = 1; i <= 5; i++) {
residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_1[ac_y_table], i,
1, residual_eob_run);
residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_1[ac_c_table], i,
0, residual_eob_run);
y_tables[i] = &s->ac_vlc_1[ac_y_table];
c_tables[i] = &s->ac_vlc_1[ac_c_table];
}
/* unpack the group 2 AC coefficients (coeffs 6-14) */
for (i = 6; i <= 14; i++) {
residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_2[ac_y_table], i,
1, residual_eob_run);
residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_2[ac_c_table], i,
0, residual_eob_run);
y_tables[i] = &s->ac_vlc_2[ac_y_table];
c_tables[i] = &s->ac_vlc_2[ac_c_table];
}
/* unpack the group 3 AC coefficients (coeffs 15-27) */
for (i = 15; i <= 27; i++) {
residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_3[ac_y_table], i,
1, residual_eob_run);
residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_3[ac_c_table], i,
0, residual_eob_run);
y_tables[i] = &s->ac_vlc_3[ac_y_table];
c_tables[i] = &s->ac_vlc_3[ac_c_table];
}
/* unpack the group 4 AC coefficients (coeffs 28-63) */
for (i = 28; i <= 63; i++) {
residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_4[ac_y_table], i,
1, residual_eob_run);
y_tables[i] = &s->ac_vlc_4[ac_y_table];
c_tables[i] = &s->ac_vlc_4[ac_c_table];
}
/* decode all AC coefficents */
for (i = 1; i <= 63; i++) {
if (s->fragment_list_y_head != -1)
residual_eob_run = unpack_vlcs(s, gb, y_tables[i], i,
1, residual_eob_run);
residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_4[ac_c_table], i,
0, residual_eob_run);
if (s->fragment_list_c_head != -1)
residual_eob_run = unpack_vlcs(s, gb, c_tables[i], i,
0, residual_eob_run);
}
return 0;
......
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