[FFmpeg-cvslog] avcodec/bitstream: Avoid allocation when creating VLC tables
Andreas Rheinhardt
git at videolan.org
Sun Jun 28 00:43:33 EEST 2020
ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at gmail.com> | Thu Jun 25 13:20:19 2020 +0200| [d7ad70e33b6f3ced421d2be67a067d0940682bb0] | committer: Andreas Rheinhardt
avcodec/bitstream: Avoid allocation when creating VLC tables
Reviewed-by: Michael Niedermayer <michael at niedermayer.cc>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d7ad70e33b6f3ced421d2be67a067d0940682bb0
---
libavcodec/bitstream.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/libavcodec/bitstream.c b/libavcodec/bitstream.c
index 53a2db7451..d379dbc0e8 100644
--- a/libavcodec/bitstream.c
+++ b/libavcodec/bitstream.c
@@ -285,7 +285,6 @@ int ff_init_vlc_sparse(VLC *vlc_arg, int nb_bits, int nb_codes,
vlc->bits = nb_bits;
if (flags & INIT_VLC_USE_NEW_STATIC) {
av_assert0(nb_codes + 1 <= FF_ARRAY_ELEMS(localbuf));
- buf = localbuf;
localvlc = *vlc_arg;
vlc = &localvlc;
vlc->table_size = 0;
@@ -293,11 +292,13 @@ int ff_init_vlc_sparse(VLC *vlc_arg, int nb_bits, int nb_codes,
vlc->table = NULL;
vlc->table_allocated = 0;
vlc->table_size = 0;
-
+ }
+ if (nb_codes + 1 > FF_ARRAY_ELEMS(localbuf)) {
buf = av_malloc_array((nb_codes + 1), sizeof(VLCcode));
if (!buf)
return AVERROR(ENOMEM);
- }
+ } else
+ buf = localbuf;
av_assert0(symbols_size <= 2 || !symbols);
@@ -309,7 +310,7 @@ int ff_init_vlc_sparse(VLC *vlc_arg, int nb_bits, int nb_codes,
continue; \
if (buf[j].bits > 3*nb_bits || buf[j].bits>32) { \
av_log(NULL, AV_LOG_ERROR, "Too long VLC (%d) in init_vlc\n", buf[j].bits);\
- if (!(flags & INIT_VLC_USE_NEW_STATIC)) \
+ if (buf != localbuf) \
av_free(buf); \
return AVERROR(EINVAL); \
} \
@@ -317,7 +318,7 @@ int ff_init_vlc_sparse(VLC *vlc_arg, int nb_bits, int nb_codes,
if (buf[j].code >= (1LL<<buf[j].bits)) { \
av_log(NULL, AV_LOG_ERROR, "Invalid code %"PRIx32" for %d in " \
"init_vlc\n", buf[j].code, i); \
- if (!(flags & INIT_VLC_USE_NEW_STATIC)) \
+ if (buf != localbuf) \
av_free(buf); \
return AVERROR(EINVAL); \
} \
@@ -346,7 +347,8 @@ int ff_init_vlc_sparse(VLC *vlc_arg, int nb_bits, int nb_codes,
av_assert0(ret >= 0);
*vlc_arg = *vlc;
} else {
- av_free(buf);
+ if (buf != localbuf)
+ av_free(buf);
if (ret < 0) {
av_freep(&vlc->table);
return ret;
More information about the ffmpeg-cvslog
mailing list