[FFmpeg-devel] [PATCH 38/61] avcodec/mpeg4videodec: Avoid superfluous VLC structures
Andreas Rheinhardt
andreas.rheinhardt at outlook.com
Wed Sep 27 01:17:09 EEST 2023
For all VLCs here, the number of bits of the VLC is
write-only, because it is hardcoded at the call site.
Therefore one can replace these VLC structures with
the only thing that is actually used: The pointer
to the VLCElem table. And in some cases one can even
avoid this.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
---
libavcodec/mpeg4videodec.c | 93 ++++++++++++++++++--------------------
1 file changed, 45 insertions(+), 48 deletions(-)
diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c
index 51a2c7fe35..347e5f7809 100644
--- a/libavcodec/mpeg4videodec.c
+++ b/libavcodec/mpeg4videodec.c
@@ -57,12 +57,12 @@
#define MB_TYPE_B_VLC_BITS 4
#define STUDIO_INTRA_BITS 9
-static VLC dc_lum, dc_chrom;
-static VLC sprite_trajectory;
-static VLC mb_type_b_vlc;
-static VLC studio_intra_tab[12];
-static VLC studio_luma_dc;
-static VLC studio_chroma_dc;
+static VLCElem dc_lum[512], dc_chrom[512];
+static VLCElem sprite_trajectory[128];
+static VLCElem mb_type_b_vlc[16];
+static const VLCElem *studio_intra_tab[12];
+static VLCElem studio_luma_dc[528];
+static VLCElem studio_chroma_dc[528];
static const uint8_t mpeg4_block_count[4] = { 0, 6, 8, 12 };
@@ -448,14 +448,14 @@ static int mpeg4_decode_sprite_trajectory(Mpeg4DecContext *ctx, GetBitContext *g
int length;
int x = 0, y = 0;
- length = get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 2);
+ length = get_vlc2(gb, sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 2);
if (length > 0)
x = get_xbits(gb, length);
if (!(ctx->divx_version == 500 && ctx->divx_build == 413))
check_marker(s->avctx, gb, "before sprite_trajectory");
- length = get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 2);
+ length = get_vlc2(gb, sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 2);
if (length > 0)
y = get_xbits(gb, length);
@@ -890,9 +890,9 @@ static inline int mpeg4_decode_dc(MpegEncContext *s, int n, int *dir_ptr)
int level, code;
if (n < 4)
- code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
+ code = get_vlc2(&s->gb, dc_lum, DC_VLC_BITS, 1);
else
- code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
+ code = get_vlc2(&s->gb, dc_chrom, DC_VLC_BITS, 1);
if (code < 0 || code > 9 /* && s->nbit < 9 */) {
av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
@@ -1839,7 +1839,7 @@ static int mpeg4_decode_mb(MpegEncContext *s, int16_t block[6][64])
cbp = 0;
} else {
modb2 = get_bits1(&s->gb);
- mb_type = get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
+ mb_type = get_vlc2(&s->gb, mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 1);
if (mb_type < 0) {
av_log(s->avctx, AV_LOG_ERROR, "illegal MB_type\n");
return AVERROR_INVALIDDATA;
@@ -2071,7 +2071,7 @@ static int mpeg4_decode_studio_block(MpegEncContext *s, int32_t block[64], int n
int cc, dct_dc_size, dct_diff, code, j, idx = 1, group = 0, run = 0,
additional_code_len, sign, mismatch;
- const VLC *cur_vlc = &studio_intra_tab[0];
+ const VLCElem *cur_vlc = studio_intra_tab[0];
uint8_t *const scantable = s->intra_scantable.permutated;
const uint16_t *quant_matrix;
uint32_t flc;
@@ -2085,14 +2085,14 @@ static int mpeg4_decode_studio_block(MpegEncContext *s, int32_t block[64], int n
if (n < 4) {
cc = 0;
- dct_dc_size = get_vlc2(&s->gb, studio_luma_dc.table, STUDIO_INTRA_BITS, 2);
+ dct_dc_size = get_vlc2(&s->gb, studio_luma_dc, STUDIO_INTRA_BITS, 2);
quant_matrix = s->intra_matrix;
} else {
cc = (n & 1) + 1;
if (ctx->rgb)
- dct_dc_size = get_vlc2(&s->gb, studio_luma_dc.table, STUDIO_INTRA_BITS, 2);
+ dct_dc_size = get_vlc2(&s->gb, studio_luma_dc, STUDIO_INTRA_BITS, 2);
else
- dct_dc_size = get_vlc2(&s->gb, studio_chroma_dc.table, STUDIO_INTRA_BITS, 2);
+ dct_dc_size = get_vlc2(&s->gb, studio_chroma_dc, STUDIO_INTRA_BITS, 2);
quant_matrix = s->chroma_intra_matrix;
}
@@ -2121,7 +2121,7 @@ static int mpeg4_decode_studio_block(MpegEncContext *s, int32_t block[64], int n
/* AC Coefficients */
while (1) {
- group = get_vlc2(&s->gb, cur_vlc->table, STUDIO_INTRA_BITS, 2);
+ group = get_vlc2(&s->gb, cur_vlc, STUDIO_INTRA_BITS, 2);
if (group < 0) {
av_log(s->avctx, AV_LOG_ERROR, "illegal ac coefficient group vlc\n");
@@ -2129,7 +2129,7 @@ static int mpeg4_decode_studio_block(MpegEncContext *s, int32_t block[64], int n
}
additional_code_len = ac_state_tab[group][0];
- cur_vlc = &studio_intra_tab[ac_state_tab[group][1]];
+ cur_vlc = studio_intra_tab[ac_state_tab[group][1]];
if (group == 0) {
/* End of Block */
@@ -3760,28 +3760,25 @@ static int mpeg4_update_thread_context_for_user(AVCodecContext *dst,
static av_cold void mpeg4_init_static(void)
{
static uint8_t mpeg4_rvlc_rl_tables[2][2][2 * MAX_RUN + MAX_LEVEL + 3];
+ static VLCElem vlc_buf[6498];
+ VLCInitState state = VLC_INIT_STATE(vlc_buf);
- VLC_INIT_STATIC_FROM_LENGTHS(&studio_luma_dc, STUDIO_INTRA_BITS, 19,
- &ff_mpeg4_studio_dc_luma[0][1], 2,
- &ff_mpeg4_studio_dc_luma[0][0], 2, 1,
- 0, 0, 528);
+ VLC_INIT_STATIC_TABLE_FROM_LENGTHS(studio_luma_dc, STUDIO_INTRA_BITS, 19,
+ &ff_mpeg4_studio_dc_luma[0][1], 2,
+ &ff_mpeg4_studio_dc_luma[0][0], 2, 1,
+ 0, 0);
- VLC_INIT_STATIC_FROM_LENGTHS(&studio_chroma_dc, STUDIO_INTRA_BITS, 19,
- &ff_mpeg4_studio_dc_chroma[0][1], 2,
- &ff_mpeg4_studio_dc_chroma[0][0], 2, 1,
- 0, 0, 528);
+ VLC_INIT_STATIC_TABLE_FROM_LENGTHS(studio_chroma_dc, STUDIO_INTRA_BITS, 19,
+ &ff_mpeg4_studio_dc_chroma[0][1], 2,
+ &ff_mpeg4_studio_dc_chroma[0][0], 2, 1,
+ 0, 0);
- for (unsigned i = 0, offset = 0; i < 12; i++) {
- static VLCElem vlc_buf[6498];
-
- studio_intra_tab[i].table = &vlc_buf[offset];
- studio_intra_tab[i].table_allocated = FF_ARRAY_ELEMS(vlc_buf) - offset;
- ff_vlc_init_from_lengths(&studio_intra_tab[i],
- STUDIO_INTRA_BITS, 24,
- &ff_mpeg4_studio_intra[i][0][1], 2,
- &ff_mpeg4_studio_intra[i][0][0], 2, 1,
- 0, VLC_INIT_STATIC_OVERLONG, NULL);
- offset += studio_intra_tab[i].table_size;
+ for (unsigned i = 0; i < 12; i++) {
+ studio_intra_tab[i] =
+ ff_vlc_init_tables_from_lengths(&state, STUDIO_INTRA_BITS, 24,
+ &ff_mpeg4_studio_intra[i][0][1], 2,
+ &ff_mpeg4_studio_intra[i][0][0], 2, 1,
+ 0, 0);
}
ff_mpeg4_init_rl_intra();
@@ -3790,18 +3787,18 @@ static av_cold void mpeg4_init_static(void)
INIT_FIRST_VLC_RL(ff_mpeg4_rl_intra, 554);
VLC_INIT_RL(ff_rvlc_rl_inter, 1072);
INIT_FIRST_VLC_RL(ff_rvlc_rl_intra, 1072);
- VLC_INIT_STATIC(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
- &ff_mpeg4_DCtab_lum[0][1], 2, 1,
- &ff_mpeg4_DCtab_lum[0][0], 2, 1, 512);
- VLC_INIT_STATIC(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
- &ff_mpeg4_DCtab_chrom[0][1], 2, 1,
- &ff_mpeg4_DCtab_chrom[0][0], 2, 1, 512);
- VLC_INIT_STATIC_FROM_LENGTHS(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
- ff_sprite_trajectory_lens, 1,
- NULL, 0, 0, 0, 0, 128);
- VLC_INIT_STATIC(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
- &ff_mb_type_b_tab[0][1], 2, 1,
- &ff_mb_type_b_tab[0][0], 2, 1, 16);
+ VLC_INIT_STATIC_TABLE(dc_lum, DC_VLC_BITS, 10 /* 13 */,
+ &ff_mpeg4_DCtab_lum[0][1], 2, 1,
+ &ff_mpeg4_DCtab_lum[0][0], 2, 1, 0);
+ VLC_INIT_STATIC_TABLE(dc_chrom, DC_VLC_BITS, 10 /* 13 */,
+ &ff_mpeg4_DCtab_chrom[0][1], 2, 1,
+ &ff_mpeg4_DCtab_chrom[0][0], 2, 1, 0);
+ VLC_INIT_STATIC_TABLE_FROM_LENGTHS(sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
+ ff_sprite_trajectory_lens, 1,
+ NULL, 0, 0, 0, 0);
+ VLC_INIT_STATIC_TABLE(mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
+ &ff_mb_type_b_tab[0][1], 2, 1,
+ &ff_mb_type_b_tab[0][0], 2, 1, 0);
}
static av_cold int decode_init(AVCodecContext *avctx)
--
2.34.1
More information about the ffmpeg-devel
mailing list