On 09/01/17 00:11, Mark Thompson wrote:
> Also adds some extra fields to the main context structure that may
> be needed by a hwaccel decoder.
> 
> (cherry picked from commit 4e528206bc4d968706401206cf54471739250ec7)
> ---
> On 08/01/17 23:37, Michael Niedermayer wrote:
>> On Mon, Jan 09, 2017 at 12:32:30AM +0100, Michael Niedermayer wrote:
>>> On Sun, Jan 08, 2017 at 06:14:45PM +0000, Mark Thompson wrote:
>>>> Also adds some extra fields to the main context structure that may
>>>> be needed by a hwaccel decoder.
>>>>
>>>> (cherry picked from commit 4e528206bc4d968706401206cf54471739250ec7)
>>>> ---
>>>>  libavcodec/vp8.c | 193 
>>>> +++++++++++++++++++++++++++++++++++++------------------
>>>>  libavcodec/vp8.h |  32 +++++++++
>>>>  2 files changed, 161 insertions(+), 64 deletions(-)
>>>
>>> This breaks
>>>
>>> make fate-webp-rgba-lossy-q80
>>>
>>> TEST    webp-rgba-lossy-q80
>>> --- ./tests/ref/fate/webp-rgba-lossy-q80        2017-01-08 
>>> 23:01:44.560754747 +0100
>>> +++ tests/data/fate/webp-rgba-lossy-q80 2017-01-09 00:32:50.896869909 +0100
>>> @@ -1,6 +0,0 @@
>>> -#tb 0: 1/25
>>> -#media_type 0: video
>>> -#codec_id 0: rawvideo
>>> -#dimensions 0: 12x8
>>> -#sar 0: 0/1
>>> -0,          0,          0,        1,      240, 0xc56c96c3
>>> Test webp-rgba-lossy-q80 failed. Look at 
>>> tests/data/fate/webp-rgba-lossy-q80.err for details.
>>> make: *** [fate-webp-rgba-lossy-q80] Error 139
>>
>> ==5840== Invalid write of size 1
>> ==5840==    at 0xC3FCB5: vp8_lossy_decode_alpha (webp.c:1304)
>> ==5840==    by 0xC3FE51: vp8_lossy_decode_frame (webp.c:1346)
>> ==5840==    by 0xC40146: webp_decode_frame (webp.c:1404)
>> ==5840==    by 0xB41EB8: avcodec_decode_video2 (utils.c:2258)
>> ==5840==    by 0xB43E6D: do_decode (utils.c:2789)
>> ==5840==    by 0xB44268: avcodec_send_packet (utils.c:2878)
>> ==5840==    by 0x756D6A: try_decode_frame (utils.c:2983)
>> ==5840==    by 0x759BCD: avformat_find_stream_info (utils.c:3684)
>> ==5840==    by 0x41BA22: open_input_file (ffmpeg_opt.c:1021)
>> ==5840==    by 0x425205: open_files (ffmpeg_opt.c:3222)
>> ==5840==    by 0x425388: ffmpeg_parse_options (ffmpeg_opt.c:3262)
>> ==5840==    by 0x43AE28: main (ffmpeg.c:4553)
>> ==5840==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
> 
> Hmm, thanks for noticing that.
> 
> The webp decoder for an image with an alpha plane is abusing the vp8 decoder 
> by overwriting the pix_fmt and then assuming that it won't be set again via 
> ff_get_format().  The crash comes because the webp decoder has set pix_fmt to 
> YUVA420P and assumed that the vp8 decoder will allocate its frames as that, 
> but the vp8 decoder has found a YUV420P stream (as it always does, since that 
> is the only format VP8 can be) and therefore allocated YUV420P frames.  When 
> the webp decoder then tries to copy into the alpha plane it dies because 
> there is no alpha plane.
> 
> I can hack around it with something like following?  (Whole patch including 
> it surrounding.)
> 
> -    if (!is_vp7 && s->pix_fmt == AV_PIX_FMT_NONE) {
> +    if (!is_vp7 && avctx->pix_fmt == AV_PIX_FMT_YUVA420P) {
> +        // Hack: this is actually the webp decoder, don't call 
> ff_get_format().
> +        s->pix_fmt = AV_PIX_FMT_YUV420P;
> +    } else if (!is_vp7 && s->pix_fmt == AV_PIX_FMT_NONE) {
> 
> Alternatively, we could add something explicit to signal to the vp8 decoder 
> that the intended format is fixed and ff_get_format() shouldn't be called?

(Patches 1-13 applied.)

Ping for any opinion what to do with the webp use of the vp8 decoder.

Thanks,

- Mark
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to