diff --git a/libavcodec/bitstream_template.h b/libavcodec/bitstream_template.h index 4f3d07275f..c8e4a5131e 100644 --- a/libavcodec/bitstream_template.h +++ b/libavcodec/bitstream_template.h @@ -536,7 +536,8 @@ static inline int BS_FUNC(read_vlc)(BSCTX *bc, const VLCElem *table, static inline int BS_FUNC(read_vlc_multi)(BSCTX *bc, uint8_t dst[8], const VLC_MULTI_ELEM *const Jtable, const VLCElem *const table, - const int bits, const int max_depth) + const int bits, const int max_depth, + const int symbols_size) { unsigned idx = BS_FUNC(peek)(bc, bits); int ret, nb_bits, code, n = Jtable[idx].len; @@ -554,7 +555,10 @@ static inline int BS_FUNC(read_vlc_multi)(BSCTX *bc, uint8_t dst[8], code = BS_FUNC(priv_set_idx)(bc, code, &n, &nb_bits, table); } } - AV_WN16(dst, code); + if (symbols_size == 1) + *dst = code; + else + AV_WN16(dst, code); ret = n > 0; } BS_FUNC(priv_skip_remaining)(bc, n); diff --git a/libavcodec/get_bits.h b/libavcodec/get_bits.h index cfcf97c021..fe2f6378b4 100644 --- a/libavcodec/get_bits.h +++ b/libavcodec/get_bits.h @@ -667,7 +667,8 @@ static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, static inline int get_vlc_multi(GetBitContext *s, uint8_t *dst, const VLC_MULTI_ELEM *const Jtable, const VLCElem *const table, - const int bits, const int max_depth) + const int bits, const int max_depth, + const int symbols_size) { dst[0] = get_vlc2(s, table, bits, max_depth); return 1; diff --git a/libavcodec/magicyuv.c b/libavcodec/magicyuv.c index d2897019bd..06fad8f3f7 100644 --- a/libavcodec/magicyuv.c +++ b/libavcodec/magicyuv.c @@ -125,7 +125,7 @@ static void magicyuv_median_pred16(uint16_t *dst, const uint16_t *src1, x = 0; \ for (; CACHED_BITSTREAM_READER && x < width-c && get_bits_left(&gb) > 0;) {\ ret = get_vlc_multi(&gb, (uint8_t *)dst + x * b, multi, \ - vlc, vlc_bits, 3); \ + vlc, vlc_bits, 3, b); \ if (ret <= 0) \ return AVERROR_INVALIDDATA; \ x += ret; \ diff --git a/libavcodec/utvideodec.c b/libavcodec/utvideodec.c index 49e34cc90a..5377926fa6 100644 --- a/libavcodec/utvideodec.c +++ b/libavcodec/utvideodec.c @@ -121,7 +121,7 @@ static int build_huff(UtvideoContext *c, const uint8_t *src, VLC *vlc, i = 0; \ for (; CACHED_BITSTREAM_READER && i < width-end && get_bits_left(&gb) > 0;) {\ ret = get_vlc_multi(&gb, (uint8_t *)buf + i * b, multi.table, \ - vlc.table, VLC_BITS, 3); \ + vlc.table, VLC_BITS, 3, b); \ if (ret > 0) \ i += ret; \ if (ret <= 0) \ diff --git a/libavcodec/vlc.c b/libavcodec/vlc.c index 78510e30d6..e01cc41689 100644 --- a/libavcodec/vlc.c +++ b/libavcodec/vlc.c @@ -499,7 +499,10 @@ static int vlc_multi_gen(VLC_MULTI_ELEM *table, const VLC *single, for (int j = 0; j < 1<table[j].len; table[j].num = single->table[j].len > 0 ? 1 : 0; - AV_WN16(table[j].val, single->table[j].sym); + if (is16bit) + AV_WN16(table[j].val, single->table[j].sym); + else + table[j].val[0] = single->table[j].sym; } add_level(table, is16bit, nb_codes, numbits, buf,