[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