jmac698
11th July 2011, 19:26
I need to understand exactly how alpha is calculated, but I can't quite get it right. Here's my script:
l=255
v=64
lv=70
blankclip(width=64,height=64,color=l*65536+l*256+l)#test
mask(blankclip,last)
layer(blankclip(color=v*65536+v*256+v),last,"subtract",level=lv,use_chroma=false)
subtitle(string((l*lv+(257-lv)*v)/256.0))
My estimate shows 116.4, but the actual result is 115. Did I find some inaccuracy in avisynth, or is my model wrong somehow?
This is based on 2.58. If you get different results in 2.6, let me know.
The code is the asm at layer.cpp, line 2104. I can't read it.
if (!lstrcmpi(Op, "Subtract"))
{
if (chroma)
{
__asm {
push ebx // stupid compiler forgets to save ebx!!
mov edi, src1p
mov esi, src2p
mov ebx, myy
movd mm1, mylevel
pxor mm0, mm0
pcmpeqd mm3, mm3
pcmpeqb mm4, mm4
psrlq mm3, 63 ;00000000|00000001
punpcklbw mm4, mm0 ;0x00ff00ff00ff00ff
sub32loop:
mov edx, myx
xor ecx, ecx
align 16
sub32xloop:
movd mm6, [esi + ecx*4] ;src2
movd mm7, [edi + ecx*4] ;src1/dest
movq mm2, mm6
punpcklbw mm6, mm0 ;mm6= 00aa|00rr|00gg|00bb [src2]
//----- extract alpha into four channels
psrld mm2, 24 ;mm2= 0000|0000|0000|00aa
pandn mm6, mm4 ;mm6 =~mm6
pmullw mm2, mm1 ;mm2= pixel alpha * script alpha
punpcklbw mm7, mm0 ;mm7= 00aa|00rr|00gg|00bb [src1]
paddd mm2, mm3 ;mm2+=1
psrld mm2, 8 ;mm2= 0000|0000|0000|00aa*
punpcklwd mm2, mm2 ;mm2= 0000|0000|00aa*|00aa*
punpckldq mm2, mm2 ;mm2=00aa*|00aa*|00aa*|00aa*
//----- begin the fun stuff
psubsw mm6, mm7
pmullw mm6, mm2 ;mm6=scaled difference*255
psrlw mm6, 8 ;scale result
mov eax, ecx
paddb mm6, mm7 ;add src1
//----- end the fun stuff...
l=255
v=64
lv=70
blankclip(width=64,height=64,color=l*65536+l*256+l)#test
mask(blankclip,last)
layer(blankclip(color=v*65536+v*256+v),last,"subtract",level=lv,use_chroma=false)
subtitle(string((l*lv+(257-lv)*v)/256.0))
My estimate shows 116.4, but the actual result is 115. Did I find some inaccuracy in avisynth, or is my model wrong somehow?
This is based on 2.58. If you get different results in 2.6, let me know.
The code is the asm at layer.cpp, line 2104. I can't read it.
if (!lstrcmpi(Op, "Subtract"))
{
if (chroma)
{
__asm {
push ebx // stupid compiler forgets to save ebx!!
mov edi, src1p
mov esi, src2p
mov ebx, myy
movd mm1, mylevel
pxor mm0, mm0
pcmpeqd mm3, mm3
pcmpeqb mm4, mm4
psrlq mm3, 63 ;00000000|00000001
punpcklbw mm4, mm0 ;0x00ff00ff00ff00ff
sub32loop:
mov edx, myx
xor ecx, ecx
align 16
sub32xloop:
movd mm6, [esi + ecx*4] ;src2
movd mm7, [edi + ecx*4] ;src1/dest
movq mm2, mm6
punpcklbw mm6, mm0 ;mm6= 00aa|00rr|00gg|00bb [src2]
//----- extract alpha into four channels
psrld mm2, 24 ;mm2= 0000|0000|0000|00aa
pandn mm6, mm4 ;mm6 =~mm6
pmullw mm2, mm1 ;mm2= pixel alpha * script alpha
punpcklbw mm7, mm0 ;mm7= 00aa|00rr|00gg|00bb [src1]
paddd mm2, mm3 ;mm2+=1
psrld mm2, 8 ;mm2= 0000|0000|0000|00aa*
punpcklwd mm2, mm2 ;mm2= 0000|0000|00aa*|00aa*
punpckldq mm2, mm2 ;mm2=00aa*|00aa*|00aa*|00aa*
//----- begin the fun stuff
psubsw mm6, mm7
pmullw mm6, mm2 ;mm6=scaled difference*255
psrlw mm6, 8 ;scale result
mov eax, ecx
paddb mm6, mm7 ;add src1
//----- end the fun stuff...