[FFmpeg-cvslog] avcodec/webp: Combine allocations
Andreas Rheinhardt
git at videolan.org
Sat Apr 26 01:15:13 EEST 2025
ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Sun Apr 20 20:51:59 2025 +0200| [e0a05456cd62e4127aaf2117833e371d103d5f4c] | committer: Andreas Rheinhardt
avcodec/webp: Combine allocations
Or avoid them altogether for the small stage-one VLC.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e0a05456cd62e4127aaf2117833e371d103d5f4c
---
libavcodec/webp.c | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
diff --git a/libavcodec/webp.c b/libavcodec/webp.c
index 2843b953bd..e26bf01c6a 100644
--- a/libavcodec/webp.c
+++ b/libavcodec/webp.c
@@ -254,10 +254,9 @@ static int huff_reader_get_symbol(HuffReader *r, GetBitContext *gb)
static int huff_reader_build_canonical(HuffReader *r, const uint8_t *code_lengths,
uint16_t len_counts[MAX_HUFFMAN_CODE_LENGTH + 1],
+ uint8_t lens[], uint16_t syms[],
int alphabet_size, void *logctx)
{
- uint16_t *syms;
- uint8_t *lens;
unsigned nb_codes = 0;
int ret;
@@ -285,11 +284,6 @@ static int huff_reader_build_canonical(HuffReader *r, const uint8_t *code_length
return AVERROR_INVALIDDATA;
}
- syms = av_malloc_array(nb_codes, sizeof(*syms) + sizeof(*lens));
- if (!syms)
- return AVERROR(ENOMEM);
- lens = (uint8_t*)(syms + nb_codes);
-
for (int sym = 0; sym < alphabet_size; ++sym) {
if (code_lengths[sym]) {
unsigned idx = len_counts[code_lengths[sym]]++;
@@ -300,7 +294,6 @@ static int huff_reader_build_canonical(HuffReader *r, const uint8_t *code_length
ret = ff_vlc_init_from_lengths(&r->vlc, 8, nb_codes, lens, 1,
syms, 2, 2, 0, VLC_INIT_OUTPUT_LE, logctx);
- av_free(syms);
if (ret < 0)
return ret;
r->simple = 0;
@@ -329,6 +322,8 @@ static int read_huffman_code_normal(WebPContext *s, HuffReader *hc,
HuffReader code_len_hc = { { 0 }, 0, 0, { 0 } };
uint8_t *code_lengths;
uint8_t code_length_code_lengths[NUM_CODE_LENGTH_CODES] = { 0 };
+ uint8_t reordered_code_length_code_lengths[NUM_CODE_LENGTH_CODES];
+ uint16_t reordered_code_length_syms[NUM_CODE_LENGTH_CODES];
uint16_t len_counts[MAX_HUFFMAN_CODE_LENGTH + 1] = { 0 };
int symbol, max_symbol, prev_code_len, ret;
int num_codes = 4 + get_bits(&s->gb, 4);
@@ -354,11 +349,13 @@ static int read_huffman_code_normal(WebPContext *s, HuffReader *hc,
}
ret = huff_reader_build_canonical(&code_len_hc, code_length_code_lengths, len_counts,
+ reordered_code_length_code_lengths,
+ reordered_code_length_syms,
NUM_CODE_LENGTH_CODES, s->avctx);
if (ret < 0)
return ret;
- code_lengths = av_malloc(alphabet_size);
+ code_lengths = av_malloc_array(alphabet_size, 2 * sizeof(uint8_t) + sizeof(uint16_t));
if (!code_lengths) {
ret = AVERROR(ENOMEM);
goto finish;
@@ -417,6 +414,8 @@ static int read_huffman_code_normal(WebPContext *s, HuffReader *hc,
}
ret = huff_reader_build_canonical(hc, code_lengths, len_counts,
+ code_lengths + symbol,
+ (uint16_t*)(code_lengths + 2 * symbol),
symbol, s->avctx);
finish:
More information about the ffmpeg-cvslog
mailing list