[FFmpeg-devel] [PATCH 13/25] avcodec/utvideodec/enc: Fix building Huffman table

Paul B Mahol onemda at gmail.com
Sat Sep 26 13:33:24 EEST 2020


On Sat, Sep 26, 2020 at 12:27:52PM +0200, Andreas Rheinhardt wrote:
> The Ut Video format stores Huffman tables in its bitstream by coding
> the length of a given symbol; it does not code the actual code directly,
> instead this is to be inferred by the rule that a symbol is to the left
> of every shorter symbol in the Huffman tree and that for symbols of the
> same length the symbol is descending from left to right. With one
> exception, this is also what our de- and encoder did.
> 
> The exception only matters when there are codes of length 32, because
> in this case the first symbol of this length did not get the code 0,
> but 1; this is tantamount to pretending that there is a (nonexistent)
> leaf of length 32. This is simply false. The reference software agrees
> with this [1].
> 
> [1]: https://github.com/umezawatakeshi/utvideo/blob/2700a471a78402e5c340150b38e8a793ef3676f1/utv_core/HuffmanCode.cpp#L280
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> ---
>  libavcodec/utvideodec.c | 4 ++--
>  libavcodec/utvideoenc.c | 2 +-
>  2 files changed, 3 insertions(+), 3 deletions(-)

LGTM

> 
> diff --git a/libavcodec/utvideodec.c b/libavcodec/utvideodec.c
> index c07636d435..b3c4c3519b 100644
> --- a/libavcodec/utvideodec.c
> +++ b/libavcodec/utvideodec.c
> @@ -70,7 +70,7 @@ static int build_huff10(const uint8_t *src, VLC *vlc, int *fsym)
>          return -1;
>      }
>  
> -    code = 1;
> +    code = 0;
>      for (i = last; i >= 0; i--) {
>          codes[i] = code >> (32 - he[i].len);
>          bits[i]  = he[i].len;
> @@ -113,7 +113,7 @@ static int build_huff(const uint8_t *src, VLC *vlc, int *fsym)
>      if (he[last].len > 32)
>          return -1;
>  
> -    code = 1;
> +    code = 0;
>      for (i = last; i >= 0; i--) {
>          codes[i] = code >> (32 - he[i].len);
>          bits[i]  = he[i].len;
> diff --git a/libavcodec/utvideoenc.c b/libavcodec/utvideoenc.c
> index f1b9d11c96..05a9614036 100644
> --- a/libavcodec/utvideoenc.c
> +++ b/libavcodec/utvideoenc.c
> @@ -346,7 +346,7 @@ static void calculate_codes(HuffEntry *he)
>      while (he[last].len == 255 && last)
>          last--;
>  
> -    code = 1;
> +    code = 0;
>      for (i = last; i >= 0; i--) {
>          he[i].code  = code >> (32 - he[i].len);
>          code       += 0x80000000u >> (he[i].len - 1);
> -- 
> 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