[MPlayer-dev-eng] Segfault caused by the "expand" filter

Reimar Döffinger Reimar.Doeffinger at gmx.de
Sun Mar 20 14:31:50 CET 2011


On 20 Mar 2011, at 13:27, Zuxy Meng <zuxy.meng at gmail.com> wrote:
> 2011/3/19 Reimar Döffinger <Reimar.Doeffinger at gmx.de>:
>> On Sat, Mar 19, 2011 at 10:30:14PM +0800, Zuxy Meng wrote:
>>> 2011/3/17 Reimar Döffinger <Reimar.Doeffinger at gmx.de>:
>>>> On Wed, Mar 16, 2011 at 06:19:04PM +0800, Zuxy Meng wrote:
>>>>> 2011/3/16 Reimar Döffinger <Reimar.Doeffinger at gmx.de>:
>>>>>> On 15 Mar 2011, at 03:57, Zuxy Meng <zuxy.meng at gmail.com> wrote:
>>>>>>> Hope here's still atmosphere for technical discussions:
>>>>>>> 
>>>>>>> I met segfaults triggered by unaligned accesses of SSE instructions.
>>>>>>> The root cause is within the get_image() function of the "expand"
>>>>>>> filter, in lines like:
>>>>>>> 
>>>>>>>    if(mpi->flags&MP_IMGFLAG_PLANAR){
>>>>>>>        mpi->planes[0]=vf->dmpi->planes[0]+
>>>>>>>        vf->priv->exp_y*vf->dmpi->stride[0]+vf->priv->exp_x;
>>>>>>> 
>>>>>>> Here vf->dmpi->planes[0] is 16-byte aligned, but mpi->planes[0] may not be.
>>>>>>> 
>>>>>>> I'm not sure what's the correct fix here. Would a simple forced align
>>>>>>> before the assignment work (e.g. ((vf->dmpi->planes[0] + ...)&~15))?
>>>>>> 
>>>>>> To solve it properly you have to allocate a new image and memcpy instead of using EXPORT image type (or is this the DR path? Disable DR in that case).
>>>>> 
>>>>> Yes I guess it's the DR path.
>>>>> 
>>>>>> Alternatively filters requiring the alignment could do the memcpy, but I think that's more effort for little gain.
>>>>> 
>>>>> The problem happens when expand isn't the last filter, e.g. vf=expand...,pp=ac
>>>> 
>>>> That doesn't make sense, the line you quoted only causes the filters (and decoder)
>>>> _before_ to get unaligned pointers.
>>> 
>>> I'm puzzled too. But in my case vf=pp=ac,expand=::::1:8/5 works and
>>> vf=expand=::::1:8/5,pp=ac crashes.
>> 
>> That doesn't say anything at all about where and why the crash happens.
>> Probably the pp filter allocates a new frame to pass to the decoder whereas
>> it itself doesn't need the pointers to be aligned
> 
> This is the log and traceback, from which you can see the problematic
> address 0x181c705 was allocated by the expand filter.

I don't see that. I see pp allocating an image and expand modifying it, and then the decoder crashing because it isn't aligned.
Which is not an error in expand, since vd_ffmpeg does _not_ ask for something aligned.
So could you please try the change for vd_ffmpeg I suggested?


More information about the MPlayer-dev-eng mailing list