From 2db38ae7349c4d5f311723ea45cb03bc1745d26d Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt Date: Thu, 25 Jun 2020 16:50:24 +0200 Subject: [PATCH] avcodec/smacker: Use better nb_codes estimate when initializing VLC Using the real number of read codes allows to leave a loop in ff_init_vlc_sparse earlier; notice that all codes not explicitly set by reading data have been set to zero earlier (i.e. they are zero-length codes) and such codes are ignored by ff_init_vlc_sparse. This improves performance: When compiled with GCC 9, the time spent on one call to smka_decode_frame() for the sample from ticket #2425 decreased from 2195367 decicycles to 2068389 decicycles. For Clang 9, it improved from 1602075 to 1534188 decicycles. These tests have been performed 20 times and each times the input file has been looped 32 times to get a sufficient number of frames. Reviewed-by: Paul B Mahol Signed-off-by: Andreas Rheinhardt --- libavcodec/smacker.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c index e6b163722a..27de30f0e1 100644 --- a/libavcodec/smacker.c +++ b/libavcodec/smacker.c @@ -214,7 +214,7 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int goto error; skip_bits1(gb); if (h[i].current > 1) { - err = init_vlc(&vlc[i], SMKTREE_BITS, h[i].length, + err = init_vlc(&vlc[i], SMKTREE_BITS, h[i].current, INIT_VLC_DEFAULT_SIZES(h[i].lengths), INIT_VLC_DEFAULT_SIZES(h[i].bits), INIT_VLC_LE); @@ -657,7 +657,7 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, goto error; skip_bits1(&gb); if(h[i].current > 1) { - ret = init_vlc(&vlc[i], SMKTREE_BITS, h[i].length, + ret = init_vlc(&vlc[i], SMKTREE_BITS, h[i].current, h[i].lengths, sizeof(int), sizeof(int), h[i].bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE); if (ret < 0) {