[FFmpeg-devel] [PATCH 12/25] avcodec/magicyuv: Don't waste stack space

Paul B Mahol onemda at gmail.com
Sat Sep 26 13:58:44 EEST 2020


On Sat, Sep 26, 2020 at 12:27:51PM +0200, Andreas Rheinhardt wrote:
> Now that the HuffEntries are no longer sorted by the MagicYUV decoder,
> their symbols are trivial: The symbol of the element with index i is i.
> They can therefore be removed. Furthermore, despite the length of the
> codes being in the range 1..32 bits, the actual value of the codes is
> <= 4096 (for 12 bit content). The reason for this is that the longer
> codes are on the left side of the tree, so that the higher bits of
> these codes are simply zero. By using an uint16_t for the codes and
> removing the symbols entry, the size of each HuffEntry is decreased from
> eight to four, saving 16KB of stack space.

lgtm

> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> ---
>  libavcodec/magicyuv.c | 14 +++++---------
>  1 file changed, 5 insertions(+), 9 deletions(-)
> 
> diff --git a/libavcodec/magicyuv.c b/libavcodec/magicyuv.c
> index 7dded9b457..ea1f727e5c 100644
> --- a/libavcodec/magicyuv.c
> +++ b/libavcodec/magicyuv.c
> @@ -46,9 +46,8 @@ typedef enum Prediction {
>  } Prediction;
>  
>  typedef struct HuffEntry {
> -    uint16_t sym;
>      uint8_t  len;
> -    uint32_t code;
> +    uint16_t code;
>  } HuffEntry;
>  
>  typedef struct MagicYUVContext {
> @@ -90,10 +89,9 @@ static int huff_build(HuffEntry he[], uint16_t codes_count[33],
>          he[i].code = codes_count[he[i].len];
>          codes_count[he[i].len]++;
>      }
> -    return ff_init_vlc_sparse(vlc, FFMIN(max, 12), nb_elems,
> -                              &he[0].len,  sizeof(he[0]), sizeof(he[0].len),
> -                              &he[0].code, sizeof(he[0]), sizeof(he[0].code),
> -                              &he[0].sym,  sizeof(he[0]), sizeof(he[0].sym),  0);
> +    return init_vlc(vlc, FFMIN(max, 12), nb_elems,
> +                    &he[0].len,  sizeof(he[0]), sizeof(he[0].len),
> +                    &he[0].code, sizeof(he[0]), sizeof(he[0].code), 0);
>  }
>  
>  static void magicyuv_median_pred16(uint16_t *dst, const uint16_t *src1,
> @@ -408,10 +406,8 @@ static int build_huffman(AVCodecContext *avctx, const uint8_t *table,
>          }
>  
>          length_count[x] += l;
> -        for (; j < k; j++) {
> -            he[j].sym = j;
> +        for (; j < k; j++)
>              he[j].len = x;
> -        }
>  
>          if (j == max) {
>              j = 0;
> -- 
> 2.25.1
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".


More information about the ffmpeg-devel mailing list