[FFmpeg-devel] [PATCH] vf_overlay: add support to RGBA packed input and output
Mark Himsley
mark at mdsh.com
Sun Oct 30 12:45:07 CET 2011
On 30/10/2011 00:29, Stefano Sabatini wrote:
> On date Saturday 2011-10-29 17:27:16 +0100, Mark Himsley encoded:
>> On 29/10/2011 16:26, Michael Niedermayer wrote:
>>> On Sat, Oct 29, 2011 at 04:47:41PM +0200, Stefano Sabatini wrote:
>>
>>>> Regarding the second patch, I kept Mark's code but after some time
>>>> spent tinkering on it I couldn't figure out the meaning of the
>>>> equation:
>>>
>>>> d[da] = ( (d[da]<< 8) + (256 - d[da]) * s[sa] )>> 8;
>>>
>>> correcter:
>>> d += ((255 - d) * s + 128) / 255;
>>>
>>> and /255 can be done by multiplication and shift
>>
>> Sure, Michael is right.
>
> What I was asking, was an explanation of the formula, I would naively
> expect something like:
> main_alpha = (1-alpha) * main_alpha + alpha * overlay_alpha
>
> like for the other components.
>
> Now the equation I see is something along the lines of an obfuscated
> version of:
> main_alpha += (1-main_alpha) * overlay_alpha
>
> Can you give explanation of it?
Sorry for my misunderstanding.
Yes, in this form of overlay, the calculation of alpha is:
output_alpha = main_alpha + (1-main_alpha) * overlay_alpha
which, with the reuse of buffers in ffmpeg filter chains turns into:
main_alpha += (1-main_alpha) * overlay_alpha
The reason for this calculation is that in this form of overlay, alpha
combination is proportionality additive. For every pixel you can never
output less alpha than you put in on either the main or the overlay
inputs. So:
main overlay output
0.5 0 0.5
0 0.5 0.5
0.5 0.5 0.75
http://en.wikipedia.org/wiki/Alpha_compositing agrees with this equation
for output alpha.
--
Mark
More information about the ffmpeg-devel
mailing list