[FFmpeg-devel] [PATCH] BGR24 Huffyuv and drive-by bug fixes

Alexander Strange astrange
Sat Oct 17 09:09:50 CEST 2009


On Oct 15, 2009, at 5:53 PM, Michael Niedermayer wrote:

> On Thu, Oct 15, 2009 at 03:51:11PM -0400, Alexander Strange wrote:
>> The Huffyuv decoder currently decodes all RGB files as RGB32 with  
>> the alpha
>> channel left uninitialized - there are rows of 0x80 (the default)  
>> and a few
>> of 0x00 (probably because of plane prediction).
>> This has just recently caused some rendering problems in Perian,  
>> although
>> I'm not sure why it worked before.
>>
>> Attached patches decode 24-bit huffyuv as BGR24 to avoid this, and  
>> fix some
>> other problems I found along the way.
>>
>> 1- fixes a valgrind warning in get_vlc2, caused by the input  
>> padding in
>> bitstream_buffer being uninitialized.
>> 2- fixes temp[0] and temp[1] being allocated when only temp[0] is  
>> used for
>> RGB.
>> 3- adds 'const' to the DSP functions' src pointers (didn't run  
>> patcheck?)
>> and removes a meaningless 'inline'.
>> 4- adds BGR24 decoding for 24-bit files. Decoding speed is about  
>> the same.
>> It requires a bit of copied code; PIX_FMT_RGB32 is endian-dependent  
>> and
>> BGR24 isn't, so merging the two cases turned out very ugly.
>> I used AV_WL32 to do a 24-bit write, since it's faster than AV_WL24  
>> on most
>> platforms.
>> 5- reindents.
>>
>> The last patch is meant to add correct alpha decoding for actual RGBA
>> files, but without a sample I can't test it.
>>
>
>> huffyuv.c |    1 +
>> 1 file changed, 1 insertion(+)
>> b2c3eb9de71f07334e526a66c7020f95bb250fab  0001-Huffyuv-Fix-a- 
>> valgrind-warning-in-get_vlc2.patch
>> From f1e20a1a2db0e19627a60923bbf157e7e0125c0f Mon Sep 17 00:00:00  
>> 2001
>> From: Alexander Strange <astrange at ithinksw.com>
>> Date: Wed, 14 Oct 2009 22:16:28 -0400
>> Subject: [PATCH 1/6] Huffyuv: Fix a valgrind warning in get_vlc2().
>
> ok

Applied.

> [...]
>> huffyuv.c |    4 +---
>> 1 file changed, 1 insertion(+), 3 deletions(-)
>> 0b81e6982f54659034d214368885b7018113e112  0002-Huffyuv-Remove- 
>> unnecessary-allocation-in-alloc_temp.patch
>> From 09cebd6409e9bb3f6b9ad47e99466c908aeac1c5 Mon Sep 17 00:00:00  
>> 2001
>> From: Alexander Strange <astrange at ithinksw.com>
>> Date: Wed, 14 Oct 2009 22:17:15 -0400
>> Subject: [PATCH 2/6] Huffyuv: Remove unnecessary allocation in  
>> alloc_temp().
>>
>> RGB only needs one temp array.
>> ---
>> libavcodec/huffyuv.c |    4 +---
>> 1 files changed, 1 insertions(+), 3 deletions(-)
>>
>> diff --git a/libavcodec/huffyuv.c b/libavcodec/huffyuv.c
>> index 7fd03d8..b8e59ed 100644
>> --- a/libavcodec/huffyuv.c
>> +++ b/libavcodec/huffyuv.c
>> @@ -406,9 +406,7 @@ static av_cold void alloc_temp(HYuvContext *s){
>>             s->temp[i]= av_malloc(s->width + 16);
>>         }
>>     }else{
>> -        for(i=0; i<2; i++){
>> -            s->temp[i]= av_malloc(4*s->width + 16);
>> -        }
>> +            s->temp[0]= av_malloc(4*s->width + 16);
>
> indent is wrong, except that ok

Applied.

>> dsputil.c |    8 ++++----
>> dsputil.h |    8 ++++----
>> 2 files changed, 8 insertions(+), 8 deletions(-)
>> 7234f90d352a3569fd62170e0850a3b1194ae11b  0003-Add-missing-const- 
>> for-src-pointers-in-Huffyuv-dsp-fu.patch
>> From 0cba382264e9717c3461086b1090c0558b440e35 Mon Sep 17 00:00:00  
>> 2001
>> From: Alexander Strange <astrange at ithinksw.com>
>> Date: Thu, 15 Oct 2009 00:26:56 -0400
>> Subject: [PATCH 3/6] Add missing const for src pointers in Huffyuv  
>> dsp functions.
>>
>> Also remove a useless 'inline'.
>
> ok though maybe that should be 2 commits, i see no relation between  
> adding
> const and removing inline

Applied.

>> dsputil.c |   23 +++++++++++++++++++++++
>> dsputil.h |    1 +
>> huffyuv.c |   62 ++++++++++++++++++++++++++++++++++++++ 
>> +-----------------------
>> 3 files changed, 63 insertions(+), 23 deletions(-)
>> b5040e16dc7f1c8edd5b85a99a11f4e32f3ee521  0004-Huffyuv-Decode-RGB24- 
>> as-PIX_FMT_BGR24.patch
>> From 268f8db45761bbf65140c88b6c82d0c2db57225f Mon Sep 17 00:00:00  
>> 2001
>> From: Alexander Strange <astrange at ithinksw.com>
>> Date: Wed, 14 Oct 2009 22:15:28 -0400
>> Subject: [PATCH 4/6] Huffyuv: Decode RGB24 as PIX_FMT_BGR24.
>>
>> Currently it decodes as RGB32 with junk in the alpha channel.
>> ---
>> libavcodec/dsputil.c |   23 ++++++++++++++++++
>> libavcodec/dsputil.h |    1 +
>> libavcodec/huffyuv.c |   62 ++++++++++++++++++++++++++++++ 
>> +------------------
>> 3 files changed, 63 insertions(+), 23 deletions(-)
>
> it might be as fast to handle 3 byte groups in C but its not clear  
> how SIMD
> would behave with that

I don't think it applies here.

The decoder profile looks like:

	73.5%	73.5%	ffmpeg_g	decode_bgr_bitstream
	8.1%	8.1%	ffmpeg_g	add_hfyu_left_prediction_bgr24_c
	1.1%	1.1%	ffmpeg_g	bswap_buf
	1.1%	1.1%	ffmpeg_g	add_bytes_mmx

so it's entirely VLC-lookup bound (on angels_480-huffyuvcompress.avi/ 
x86-64).
The first two functions already can't be easily SIMDed, and the second  
two work just as well in either case.

>> dsputil.c |   11 +++++++++--
>> dsputil.h |    2 +-
>> huffyuv.c |   12 +++++++-----
>> 3 files changed, 17 insertions(+), 8 deletions(-)
>> af61a77328bc033b2a9f9a74535322e51504c1d4  0006-Huffyuv-Decode-the- 
>> alpha-channel-in-RGB32-files.patch
>> From b492be90bf4a0f512daec72b20e53aafbbde7356 Mon Sep 17 00:00:00  
>> 2001
>> From: Alexander Strange <astrange at ithinksw.com>
>> Date: Wed, 14 Oct 2009 22:27:47 -0400
>> Subject: [PATCH 6/6] Huffyuv: Decode the alpha channel in RGB32  
>> files.
>>
>> Untested.
>
> untested is not good ...


I managed to generate a sample with the official encoder  
(camera2_hfyu32.avi and camera2_png.avi in incoming). It works.




More information about the ffmpeg-devel mailing list