aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-12-01 17:33:10 +0100
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2021-05-02 05:14:42 +0200
commit56df06dd8346687d6d9b7321f2af41e4fd614ee3 (patch)
tree125938394d2534b5312eae28f78417f3290e4bd0
parentbd473d325d6065bf05502afcd663c312702a2ba7 (diff)
downloadffmpeg-56df06dd8346687d6d9b7321f2af41e4fd614ee3.tar.gz
avcodec/bink: Don't waste space for VLC table
The Bink video decoder uses VLCs; the longest codes of these VLCs have different lengths, yet they are all so small that each VLC is read in one go, so that the number of elements in the VLC table actually used by each table is 1 << nb_bits, where nb_bits is the length of the longest code. Yet when determining the size of the VLC table nb_bits has been overestimated as the number of bits of the longest code in all VLCs, making said table unnecessary big (2048 vs 976 elements). Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
-rw-r--r--libavcodec/bink.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/libavcodec/bink.c b/libavcodec/bink.c
index 3eb767b83e..45dd8d156d 100644
--- a/libavcodec/bink.c
+++ b/libavcodec/bink.c
@@ -1312,11 +1312,12 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac
static av_cold void bink_init_vlcs(void)
{
- for (int i = 0; i < 16; i++) {
- static VLC_TYPE table[16 * 128][2];
+ for (int i = 0, offset = 0; i < 16; i++) {
+ static VLC_TYPE table[976][2];
const int maxbits = bink_tree_lens[i][15];
- bink_trees[i].table = table + i*128;
+ bink_trees[i].table = table + offset;
bink_trees[i].table_allocated = 1 << maxbits;
+ offset += bink_trees[i].table_allocated;
init_vlc(&bink_trees[i], maxbits, 16,
bink_tree_lens[i], 1, 1,
bink_tree_bits[i], 1, 1, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);