From 8f04988e463f17d58ba5a52f09cf49231037bb6c Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt Date: Tue, 8 Dec 2020 22:38:05 +0100 Subject: [PATCH] avcodec/rl: Allow to create only a few VLC tables It is not uncommon that only the first one is used; this is similar to ff_init_2d_vlc_rl(). Signed-off-by: Andreas Rheinhardt --- libavcodec/rl.c | 3 +++ libavcodec/rl.h | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/libavcodec/rl.c b/libavcodec/rl.c index c532b5bf56..93153ff723 100644 --- a/libavcodec/rl.c +++ b/libavcodec/rl.c @@ -80,6 +80,9 @@ av_cold void ff_rl_init_vlc(RLTable *rl, unsigned static_size) int qmul = q * 2; int qadd = (q - 1) | 1; + if (!rl->rl_vlc[q]) + return; + if (q == 0) { qmul = 1; qadd = 0; diff --git a/libavcodec/rl.h b/libavcodec/rl.h index a83debccf7..26e0b32a90 100644 --- a/libavcodec/rl.h +++ b/libavcodec/rl.h @@ -68,6 +68,14 @@ void ff_rl_init_vlc(RLTable *rl, unsigned static_size); }\ } +#define INIT_FIRST_VLC_RL(rl, static_size) \ +do { \ + static RL_VLC_ELEM rl_vlc_table[static_size]; \ + \ + rl.rl_vlc[0] = rl_vlc_table; \ + ff_rl_init_vlc(&rl, static_size); \ +} while (0) + static inline int get_rl_index(const RLTable *rl, int last, int run, int level) { int index;