avcodec/cllc: Improve creating VLCs

One can offload the computation of the codes to
ff_init_vlc_from_lengths(); this also improves performance: The number
of decicycles for one call to read_code_table() decreased from 198343
to 148338 with the sample sample-cllc-rgb.avi from the FATE suite; it
has been looped 100 times and the test repeated ten times to test it
sufficiently often.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
Andreas Rheinhardt 2020-10-25 00:56:42 +02:00
parent 4df5144102
commit 09062eece2
1 changed files with 3 additions and 11 deletions

View File

@ -46,11 +46,9 @@ static int read_code_table(CLLCContext *ctx, GetBitContext *gb, VLC *vlc)
{ {
uint8_t symbols[256]; uint8_t symbols[256];
uint8_t bits[256]; uint8_t bits[256];
uint16_t codes[256]; int num_lens, num_codes, num_codes_sum;
int num_lens, num_codes, num_codes_sum, prefix;
int i, j, count; int i, j, count;
prefix = 0;
count = 0; count = 0;
num_codes_sum = 0; num_codes_sum = 0;
@ -74,19 +72,13 @@ static int read_code_table(CLLCContext *ctx, GetBitContext *gb, VLC *vlc)
for (j = 0; j < num_codes; j++) { for (j = 0; j < num_codes; j++) {
symbols[count] = get_bits(gb, 8); symbols[count] = get_bits(gb, 8);
bits[count] = i + 1; bits[count] = i + 1;
codes[count] = prefix++;
count++; count++;
} }
if (prefix > (65535 - 256)/2) {
return AVERROR_INVALIDDATA;
}
prefix <<= 1;
} }
return ff_init_vlc_sparse(vlc, VLC_BITS, count, bits, 1, 1, return ff_init_vlc_from_lengths(vlc, VLC_BITS, count, bits, 1,
codes, 2, 2, symbols, 1, 1, 0); symbols, 1, 1, 0, 0, ctx->avctx);
} }
/* /*