summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2023-09-20 22:41:18 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2023-10-31 20:47:00 +0100
commit4c7e8b969e01de222d0c793e772c37e2bf53cb9a (patch)
tree10c775586f3e7f3f5fc27c57972260b1dfd043db
parentc95e123e8c7664598be10b0306d2a4d60ad2cf12 (diff)
avcodec/clearvideo: Avoid superfluous VLC structures
Of all these VLCs here, only VLC.table was really used after init, so use the ff_vlc_init_tables API to get rid of them. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
-rw-r--r--libavcodec/clearvideo.c74
1 files changed, 36 insertions, 38 deletions
diff --git a/libavcodec/clearvideo.c b/libavcodec/clearvideo.c
index 7f2c1c5f55..0b59d44cd6 100644
--- a/libavcodec/clearvideo.c
+++ b/libavcodec/clearvideo.c
@@ -39,9 +39,9 @@
#define CLV_VLC_BITS 9
typedef struct LevelCodes {
- VLC flags_cb;
- VLC mv_cb;
- VLC bias_cb;
+ const VLCElem *flags_cb;
+ const VLCElem *mv_cb;
+ const VLCElem *bias_cb;
} LevelCodes;
typedef struct MV {
@@ -75,9 +75,8 @@ typedef struct CLVContext {
int top_dc[3], left_dc[4];
} CLVContext;
-static VLC dc_vlc, ac_vlc;
+static VLCElem dc_vlc[1104], ac_vlc[554];
static LevelCodes lev[4 + 3 + 3]; // 0..3: Y, 4..6: U, 7..9: V
-static VLCElem vlc_buf[16716];
static inline int decode_block(CLVContext *ctx, int16_t *blk, int has_ac,
int ac_quant)
@@ -86,13 +85,13 @@ static inline int decode_block(CLVContext *ctx, int16_t *blk, int has_ac,
int idx = 1, last = 0, val, skip;
memset(blk, 0, sizeof(*blk) * 64);
- blk[0] = get_vlc2(gb, dc_vlc.table, CLV_VLC_BITS, 3);
+ blk[0] = get_vlc2(gb, dc_vlc, CLV_VLC_BITS, 3);
if (!has_ac)
return 0;
while (idx < 64 && !last) {
- val = get_vlc2(gb, ac_vlc.table, CLV_VLC_BITS, 2);
+ val = get_vlc2(gb, ac_vlc, CLV_VLC_BITS, 2);
if (val < 0)
return AVERROR_INVALIDDATA;
if (val != 0x1BFF) {
@@ -387,11 +386,11 @@ static int decode_tile(AVCodecContext *avctx, GetBitContext *gb,
MV mv = { 0 };
int err;
- if (lc->flags_cb.table)
- flags = get_vlc2(gb, lc->flags_cb.table, CLV_VLC_BITS, 2);
+ if (lc->flags_cb)
+ flags = get_vlc2(gb, lc->flags_cb, CLV_VLC_BITS, 2);
- if (lc->mv_cb.table) {
- uint16_t mv_code = get_vlc2(gb, lc->mv_cb.table, CLV_VLC_BITS, 2);
+ if (lc->mv_cb) {
+ uint16_t mv_code = get_vlc2(gb, lc->mv_cb, CLV_VLC_BITS, 2);
if (mv_code != MV_ESC) {
mv.x = (int8_t)(mv_code & 0xff);
@@ -406,8 +405,8 @@ static int decode_tile(AVCodecContext *avctx, GetBitContext *gb,
mv.x += root_mv.x;
mv.y += root_mv.y;
- if (lc->bias_cb.table) {
- uint16_t bias_val = get_vlc2(gb, lc->bias_cb.table, CLV_VLC_BITS, 2);
+ if (lc->bias_cb) {
+ uint16_t bias_val = get_vlc2(gb, lc->bias_cb, CLV_VLC_BITS, 2);
if (bias_val != BIAS_ESC) {
bias = (int16_t)(bias_val);
@@ -622,10 +621,12 @@ static int clv_decode_frame(AVCodecContext *avctx, AVFrame *rframe,
return mb_ret < 0 ? mb_ret : buf_size;
}
-static av_cold void build_vlc(VLC *vlc, const uint8_t counts[16],
- const uint16_t **syms, unsigned *offset)
+static av_cold const VLCElem *build_vlc(VLCInitState *state,
+ const uint8_t counts[16],
+ const uint16_t **syms)
{
uint8_t lens[MAX_VLC_ENTRIES];
+ const uint16_t *symbols = *syms;
unsigned num = 0;
for (int i = 0; i < 16; i++) {
@@ -635,42 +636,39 @@ static av_cold void build_vlc(VLC *vlc, const uint8_t counts[16],
for (count += num; num < count; num++)
lens[num] = i + 1;
}
- vlc->table = &vlc_buf[*offset];
- vlc->table_allocated = FF_ARRAY_ELEMS(vlc_buf) - *offset;
- ff_vlc_init_from_lengths(vlc, CLV_VLC_BITS, num, lens, 1,
- *syms, 2, 2, 0, VLC_INIT_STATIC_OVERLONG, NULL);
*syms += num;
- *offset += vlc->table_size;
+ return ff_vlc_init_tables_from_lengths(state, CLV_VLC_BITS, num, lens, 1,
+ symbols, 2, 2, 0, 0);
}
static av_cold void clv_init_static(void)
{
+ static VLCElem vlc_buf[16716];
+ VLCInitState state = VLC_INIT_STATE(vlc_buf);
const uint16_t *mv_syms = clv_mv_syms, *bias_syms = clv_bias_syms;
- VLC_INIT_STATIC_FROM_LENGTHS(&dc_vlc, CLV_VLC_BITS, NUM_DC_CODES,
- clv_dc_lens, 1,
- clv_dc_syms, 1, 1, -63, 0, 1104);
- VLC_INIT_STATIC_FROM_LENGTHS(&ac_vlc, CLV_VLC_BITS, NUM_AC_CODES,
- clv_ac_bits, 1,
- clv_ac_syms, 2, 2, 0, 0, 554);
- for (unsigned i = 0, j = 0, k = 0, offset = 0;; i++) {
+ VLC_INIT_STATIC_TABLE_FROM_LENGTHS(dc_vlc, CLV_VLC_BITS, NUM_DC_CODES,
+ clv_dc_lens, 1,
+ clv_dc_syms, 1, 1, -63, 0);
+ VLC_INIT_STATIC_TABLE_FROM_LENGTHS(ac_vlc, CLV_VLC_BITS, NUM_AC_CODES,
+ clv_ac_bits, 1,
+ clv_ac_syms, 2, 2, 0, 0);
+ for (unsigned i = 0, j = 0, k = 0;; i++) {
if (0x36F & (1 << i)) {
- build_vlc(&lev[i].mv_cb, clv_mv_len_counts[k], &mv_syms, &offset);
+ lev[i].mv_cb = build_vlc(&state, clv_mv_len_counts[k], &mv_syms);
k++;
}
if (i == FF_ARRAY_ELEMS(lev) - 1)
break;
if (0x1B7 & (1 << i)) {
- lev[i].flags_cb.table = &vlc_buf[offset];
- lev[i].flags_cb.table_allocated = FF_ARRAY_ELEMS(vlc_buf) - offset;
- ff_vlc_init_from_lengths(&lev[i].flags_cb, CLV_VLC_BITS, 16,
- clv_flags_bits[j], 1,
- clv_flags_syms[j], 1, 1,
- 0, VLC_INIT_STATIC_OVERLONG, NULL);
- offset += lev[i].flags_cb.table_size;
-
- build_vlc(&lev[i + 1].bias_cb, clv_bias_len_counts[j],
- &bias_syms, &offset);
+ lev[i].flags_cb =
+ ff_vlc_init_tables_from_lengths(&state, CLV_VLC_BITS, 16,
+ clv_flags_bits[j], 1,
+ clv_flags_syms[j], 1, 1,
+ 0, 0);
+
+ lev[i + 1].bias_cb = build_vlc(&state, clv_bias_len_counts[j],
+ &bias_syms);
j++;
}
}