ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinha...@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.rheinha...@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: _______________________________________________ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog To unsubscribe, visit link above, or email ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".