p2pyuv.asm
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:20k
源码类别:

Symbian

开发平台:

Visual C++

  1. ;
  2. ; ***** BEGIN LICENSE BLOCK *****
  3. ; Source last modified: $Id: p2pyuv.asm,v 1.1.1.1.50.1 2004/07/09 02:00:18 hubbe Exp $
  4. ; Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5. ; The contents of this file, and the files included with this file,
  6. ; are subject to the current version of the RealNetworks Public
  7. ; Source License (the "RPSL") available at
  8. ; http://www.helixcommunity.org/content/rpsl unless you have licensed
  9. ; the file under the current version of the RealNetworks Community
  10. ; Source License (the "RCSL") available at
  11. ; http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  12. ; will apply. You may also obtain the license terms directly from
  13. ; RealNetworks.  You may not use this file except in compliance with
  14. ; the RPSL or, if you have a valid RCSL with RealNetworks applicable
  15. ; to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  16. ; the rights, obligations and limitations governing use of the
  17. ; contents of the file.
  18. ; Alternatively, the contents of this file may be used under the
  19. ; terms of the GNU General Public License Version 2 or later (the
  20. ; "GPL") in which case the provisions of the GPL are applicable
  21. ; instead of those above. If you wish to allow use of your version of
  22. ; this file only under the terms of the GPL, and not to allow others
  23. ; to use your version of this file under the terms of either the RPSL
  24. ; or RCSL, indicate your decision by deleting the provisions above
  25. ; and replace them with the notice and other provisions required by
  26. ; the GPL. If you do not delete the provisions above, a recipient may
  27. ; use your version of this file under the terms of any one of the
  28. ; RPSL, the RCSL or the GPL.
  29. ; This file is part of the Helix DNA Technology. RealNetworks is the
  30. ; developer of the Original Code and owns the copyrights in the
  31. ; portions it created.
  32. ; This file, and the files included with this file, is distributed
  33. ; and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  34. ; KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  35. ; ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  36. ; OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  37. ; ENJOYMENT OR NON-INFRINGEMENT.
  38. ; Technology Compatibility Kit Test Suite(s) Location:
  39. ;    http://www.helixcommunity.org/content/tck
  40. ; Contributor(s):
  41. ; ***** END LICENSE BLOCK *****
  42. ;
  43. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  44. ;;
  45. ;;  Packed YUV To PlanarYUV MMX converters.
  46. ;;
  47. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  48. ;;; YUY2ToPlanarYUV_MMX
  49. %ifdef   COFF
  50.         %define YUY2ToPlanarYUV_MMX _YUY2ToPlanarYUV_MMX
  51.         %define UYVYToPlanarYUV_MMX _UYVYToPlanarYUV_MMX
  52. %elifdef WIN32
  53.         %define YUY2ToPlanarYUV_MMX _YUY2ToPlanarYUV_MMX
  54.         %define UYVYToPlanarYUV_MMX _UYVYToPlanarYUV_MMX
  55. %elifdef ELF
  56.         %define YUY2ToPlanarYUV_MMX YUY2ToPlanarYUV_MMX
  57.         %define UYVYToPlanarYUV_MMX UYVYToPlanarYUV_MMX
  58. %elifdef AOUTB
  59.         %define YUY2ToPlanarYUV_MMX YUY2ToPlanarYUV_MMX
  60.         %define UYVYToPlanarYUV_MMX UYVYToPlanarYUV_MMX
  61. %else
  62.         %error linking format currently not supported by alphbablend.asm
  63. %endif
  64.         ;; Export the functions implemented here.
  65.         global YUY2ToPlanarYUV_MMX
  66.         global UYVYToPlanarYUV_MMX
  67. ;========================= DATA SEGMENT ============================
  68. section .data
  69. align 8        
  70. MaskChroma
  71.     dd  0xFF00FF00, 0xFF00FF00
  72.         
  73. MaskLuma
  74.     dd  0x00FF00FF, 0x00FF00FF
  75.         
  76. ;============================= CODE SEGMENT =======================                        
  77. section .text
  78. ;;
  79. ;; This is our stack params definition. It is used for both
  80. ;; YUY2 and UYVY routines as they both take the same parms.
  81. ;;                                        
  82. %assign numtemps 4
  83. %define var(a) [esp+a]       
  84.                 
  85. struc parms
  86.         ;Temps on stack
  87.         .tmp1       resd 1  ;General DWORD temp.
  88.         .tmp2       resd 1  ;General DWORD temp.
  89.         .tmp3       resd 1  ;General DWORD temp.
  90.         .tmp4       resd 1  ;General DWORD temp.
  91.         
  92.         ; Space for reg pushes and return address.
  93.         .registers  resd 6  ;pushed registers
  94.         .return     resd 1  ;return address
  95.         ; input params
  96.         .d1:        resd 1  ;unsigned char* d1,      
  97.         .d2:        resd 1  ;unsigned char* d2,      
  98.         .du:        resd 1  ;unsigned char* du,      
  99.         .dv:        resd 1  ;unsigned char* dv,      
  100.         .dyPitch:   resd 1  ;INT32          dyPitch, 
  101.         .duPitch:   resd 1  ;INT32          duPitch, 
  102.         .dvPitch:   resd 1  ;INT32          dvPitch, 
  103.         .dest_dx:   resd 1  ;INT32          dest_dx, 
  104.         .dest_dy:   resd 1  ;INT32          dest_dy, 
  105.         .s1:        resd 1  ;unsigned char* s1,      
  106.         .s2:        resd 1  ;unsigned char* s2,      
  107.         .src_pitch: resd 1  ;INT32          src_pitch
  108. endstruc
  109. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  110. ;;
  111. ;; Our UYVY to Planar YUV MMX
  112. ;;                        
  113. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  114. UYVYToPlanarYUV_MMX:
  115.         ;; Save some stuff...
  116.         push ebx
  117.         push edi
  118.         push esi
  119.         push ebp
  120.         push ecx
  121.         push edx
  122.         ; Make room for temps on stack
  123.         sub esp, numtemps*4;
  124.         ;; Load our dest chroma pointers.
  125.         movd  mm4, var(parms.du)      ; mm4 = du
  126.         movd  mm5, var(parms.dv)      ; mm5 = dv
  127.                 
  128.         ;; Set up the loops
  129.         mov eax, var(parms.dest_dy)
  130.         mov ecx, var(parms.dest_dx)
  131.         shr eax, 1                    ; eax = dest_dy/2
  132.         
  133.         shr ecx, 2                    ; ecx = dest_dx/4
  134.         jnc even1                      ; Was dest_dx divisible by 4?
  135. odd1:            
  136.         ; We have 1 macro pixel left over
  137.         mov DWORD var(parms.tmp3), 1  ; Store the fact that we got odd marco pixels.
  138.         jmp cont1
  139. even1:   
  140.         mov DWORD var(parms.tmp3), 0  ; We have even pixels...        
  141. cont1:           
  142.         mov var(parms.tmp1), ecx      ; save dx loop count
  143.         mov var(parms.tmp2), eax      ; save dx loop count
  144.         
  145.         xor ecx, ecx
  146.         mov edi, var(parms.s1)        ;s1
  147.         mov esi, var(parms.s2)        ;s2
  148.         mov ebx, var(parms.d1)        ;d1
  149.         mov ebp, var(parms.d2)        ;d2
  150.         pxor  mm7, mm7                ; mm7 = 00000000 00000000
  151.         movq  mm6, [MaskLuma]         ; mm6 = Mask out Luma value.
  152.         xor eax, eax
  153. DYLOOP1: 
  154. DXLOOP1:
  155.         ;; Process 2 macro pixels at a time, 2 lines at a time.
  156.         movq mm0, [edi+ecx*8]      ; mm0= y4v2y3u2 y2v1y1u1
  157.         movq mm1, [esi+ecx*8]      ; mm1= y4v2y3u2 y2v1y1u1
  158.         ;; These two lines are the only difference between the two
  159.         ;; YUY2 and UYVY conversion routines. I really should make
  160.         ;; time to combine the 2 routines to save a little download
  161.         ;; space.
  162.         ;; Byte swap the 2 MMX registers.
  163.         ;; s1
  164.         movq     mm2, mm0
  165.         movq     mm3, mm0
  166.         psrlq    mm2, 8            ; mm2 = 00y4v2y3 u2y2v1y1
  167.         psllq    mm3, 8            ; mm3 = v2y3u2y2 v1y1u100
  168.         pand     mm3, [MaskChroma] ; mm3 = v200u200 v100u100
  169.         pand     mm2, mm6          ; mm2 = 00y400y3 00y200y1
  170.         por      mm2, mm3          ; mm2 = v2y4u2y3 v1y2u1y1
  171.         movq     mm0, mm2
  172.         ;; s2
  173.         movq     mm2, mm1
  174.         movq     mm3, mm1
  175.         psrlq    mm2, 8            ; mm2 = 00y4v2y3 u2y2v1y1
  176.         psllq    mm3, 8            ; mm3 = v2y3u2y2 v1y1u100
  177.         pand     mm3, [MaskChroma] ; mm3 = v200u200 v100u100
  178.         pand     mm2, mm6          ; mm2 = 00y400y3 00y200y1
  179.         por      mm2, mm3          ; mm2 = v2y4u2y3 v1y2u1y1
  180.         movq     mm1, mm2
  181.         
  182.         ;; Store luma values in planar YUV space
  183.         movq     mm2, mm0
  184.         movq     mm3, mm1
  185.         pand     mm2, mm6          ; mm2 = 00Y400Y3 00Y200Y1 of s1
  186.         pand     mm3, mm6          ; mm3 = 00Y400Y3 00Y200Y1 of s1
  187.         packuswb mm2, mm7          ; mm2 = 00000000 Y4Y3Y2Y1 of s1
  188.         packuswb mm3, mm7          ; mm3 = 00000000 Y4Y3Y2Y1 of s2
  189.         movd     [ebx+ecx*4], mm2  ; d1=s1
  190.         psrlw    mm0, 8            ; mm0 = 00v200u2 00v100u1 of S1
  191.         movd     [ebp+ecx*4], mm3  ; d2=s2
  192.         ;;Compute averaged chroma values
  193.         psrlw      mm1, 8            ; mm1 = 00v200u2 00v100u1 of S2
  194.         paddw      mm0, mm1          ; mm0 = v2v2u2u2 v1v1u1u1 s1+s2
  195.         psrlw      mm0, 1            ; mm0 = 00v200u2 00v100u1 (s1+s2)/2
  196.         ;;
  197.         ;;Store chromas in du and dv.
  198.         ;;
  199.         movd mm3, esi ;save esi
  200.         ;; unpack and pack
  201.         packuswb   mm0, mm0          ; mm0 = 00000000 v2u2v2u1
  202.         punpcklbw  mm0, mm0          ; mm0 = v2v2u2u2 v1v1u1u1
  203.         movd       esi, mm4          ; esi = dU
  204.         movq       mm1, mm0
  205.         psrlq      mm1, 32           ; mm1 = 0000000 v2v2u2u2
  206.         punpcklbw  mm0, mm1          ; mm0 = v2v1v2v1 u2u1u2u1
  207.         ;; Store the U data
  208.         movd edx, mm0                ; edx = u1u2u1u2
  209.         psrlq mm0, 32                ; mm0 = 00000000 v1v2v1v2
  210.         mov  WORD [esi+ecx*2], dx    ; store 2 bytes of U data.
  211.         ;; Store the V data
  212.         movd  esi, mm5                ; esi = dV
  213.         movd  edx, mm0                ; ecx = v1v2v1v2
  214.         mov   WORD [esi+ecx*2], dx    ; store 2 bytes of V data.
  215.         movd esi, mm3
  216.         
  217.         ;; inc DX counter and loop
  218.         inc  ecx
  219.         cmp  ecx, var(parms.tmp1)
  220.         jne  NEAR DXLOOP1
  221.         
  222.         ;; Now we have to check for any pixels left over if dest_dx
  223.         ;; is not divisible by 4. Since dest_dx must be at least even
  224.         ;; we can only have 0 or two(1 macro pixel).
  225.         mov ecx, var(parms.tmp3)
  226.         jz  nextline1
  227.         ;;
  228.         ;; Do odd marco pixel here. ===========
  229.         ;;
  230.         movd mm0, [edi+ecx*8]      ; mm0= 00000000 v1y2u1y1
  231.         movd mm1, [esi+ecx*8]      ; mm1= 00000000 v1y2u1y1
  232.         ;; Store luma values in planar YUV space
  233.         movq     mm2, mm0
  234.         movq     mm3, mm1
  235.         pand     mm2, mm6          ; mm2 = 00000000 00Y100Y2 of s1
  236.         pand     mm3, mm6          ; mm3 = 00000000 00Y100Y2 of s1
  237.         packuswb mm2, mm7          ; mm2 = 00000000 0000Y2Y1 of s1
  238.         packuswb mm3, mm7          ; mm3 = 00000000 0000Y2Y1 of s2
  239.         movd     edx, mm2              ; grab lower 32 bits of mm2
  240.         mov      WORD [ebx+ecx*4], dx  ; Just store 16 bits of ecx
  241.         movd     edx, mm3              ; grab lower 32 bits of mm3
  242.         mov      WORD [ebp+ecx*4], dx  ; just store 16 bits of ecx
  243.         ;;Compute averaged chroma values
  244.         psrlw      mm0, 8            ; mm0 = 00000000 00v100u1 of S1
  245.         psrlw      mm1, 8            ; mm1 = 00000000 00v100u1 of S2
  246.         paddw      mm0, mm1          ; mm0 = 00000000 v1v1u1u1 s1+s2
  247.         psrlw      mm0, 1            ; mm0 = 00000000 00v100u1 (s1+s2)/2
  248.         ;;
  249.         ;;Store chromas in du and dv.
  250.         ;;
  251.         movd mm3, esi ;save esi
  252.         movd esi, mm4                ; esi = dU
  253.         ;; unpack and pack
  254.         movd edx, mm0    ; edx = 00v100u1
  255.         
  256.         ;; Store the U data
  257.         mov  [esi+ecx*2], dl         ; store 1 byte of U data.
  258.         movd  esi, mm5                ; esi = dV
  259.         ;; Store the V data
  260.         shr   edx, 16                 ; edx = 000000v1
  261.         mov   [esi+ecx*2], dl         ; store 1 byte of V data.
  262.         movd  esi, mm3
  263.         
  264. nextline1:               
  265.         ;; Add pitches for next line
  266.         mov ecx, var(parms.src_pitch)
  267.         shl ecx, 1                     ; ecx = src_pitch*2
  268.         add edi, ecx                   ; s1 = s1 + src_pitch*2
  269.         add esi, ecx                   ; s2 = s2 + src_pitch*2
  270.         mov ecx, var(parms.dyPitch)
  271.         shl ecx, 1                     ; ecx = dyPitch*2
  272.         add ebx, ecx                   ; d1 = d1+ dyPitch*2
  273.         add ebp, ecx                   ; d2 = d2+ dyPitch*2
  274.         mov   ecx, var(parms.dvPitch)  ; ecx = dvPitch
  275.         movd  mm3, ecx
  276.         paddd mm4, mm3                  ; dv = dv+ dvPitch
  277.         mov   ecx, var(parms.duPitch)    ; ecx = 
  278.         movd  mm3, ecx
  279.         xor   ecx, ecx
  280.         paddd mm5, mm3                  ; du = du+ duPitch
  281.         
  282.         ;; inc DY counter and loop
  283.         inc eax
  284.         cmp eax, var(parms.tmp2)
  285.         jne NEAR DYLOOP1
  286.         
  287. end1: 
  288.         ;; Free up stack temp var.
  289.         add esp, numtemps*4
  290.         
  291.         ;; Pop off the stack....
  292.         pop edx
  293.         pop ecx
  294.         pop ebp
  295.         pop esi
  296.         pop edi
  297.         pop ebx
  298.         emms
  299.         
  300.         ;; success
  301.         xor eax, eax
  302.         ret
  303.         
  304. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  305. ;;
  306. ;; Our YUY2 to Planar YUV MMX
  307. ;;                        
  308. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  309. YUY2ToPlanarYUV_MMX:
  310.         ;; Save some stuff...
  311.         push ebx
  312.         push edi
  313.         push esi
  314.         push ebp
  315.         push ecx
  316.         push edx
  317.         ; Make room for temps on stack
  318.         sub esp, numtemps*4;
  319.         ;; Load our chroma pointers.
  320.         movd  mm4, var(parms.du)      ; mm4 = du
  321.         movd  mm5, var(parms.dv)      ; mm5 = dv
  322.         ;; Set up the loops
  323.         mov eax, var(parms.dest_dy)
  324.         mov ecx, var(parms.dest_dx)
  325.         shr eax, 1                    ; eax = dest_dy/2
  326.         
  327.         shr ecx, 2                    ; ecx = dest_dx/4
  328.         jnc even                      ; Was dest_dx divisible by 4?
  329. odd:            
  330.         ; We have 1 macro pixel left over
  331.         mov DWORD var(parms.tmp3), 1  ; Store the fact that we got odd marco pixels.
  332.         jmp cont
  333. even:   
  334.         mov DWORD var(parms.tmp3), 0  ; We have even pixels...        
  335. cont:           
  336.         mov var(parms.tmp1), ecx      ; save dx loop count
  337.         mov var(parms.tmp2), eax      ; save dx loop count
  338.         
  339.         xor ecx, ecx
  340.         mov edi, var(parms.s1)        ;s1
  341.         mov esi, var(parms.s2)        ;s2
  342.         mov ebx, var(parms.d1)        ;d1
  343.         mov ebp, var(parms.d2)        ;d2
  344.         pxor  mm7, mm7                ; mm7 = 00000000 00000000
  345.         movq  mm6, [MaskLuma]         ; mm6 = Mask out Luma value.
  346.         xor eax, eax
  347. DYLOOP: 
  348. DXLOOP:
  349.         ;; Process 2 macro pixels at a time, 2 lines at a time.
  350.         movq mm0, [edi+ecx*8]      ; mm0= v2y4u2y3 v1y2u1y1
  351.         movq mm1, [esi+ecx*8]      ; mm1= v2y4u2y3 v1y2u1y1
  352.         
  353.         ;; Store luma values in planar YUV space
  354.         movq     mm2, mm0
  355.         movq     mm3, mm1
  356.         pand     mm2, mm6          ; mm2 = 00Y400Y3 00Y200Y1 of s1
  357.         pand     mm3, mm6          ; mm3 = 00Y400Y3 00Y200Y1 of s1
  358.         packuswb mm2, mm7          ; mm2 = 00000000 Y4Y3Y2Y1 of s1
  359.         packuswb mm3, mm7          ; mm3 = 00000000 Y4Y3Y2Y1 of s2
  360.         movd     [ebx+ecx*4], mm2  ; d1=s1
  361.         psrlw      mm0, 8            ; mm0 = 00v200u2 00v100u1 of S1
  362.         movd     [ebp+ecx*4], mm3  ; d2=s2
  363.         ;;Compute averaged chroma values
  364.         psrlw      mm1, 8            ; mm1 = 00v200u2 00v100u1 of S2
  365.         paddw      mm0, mm1          ; mm0 = v2v2u2u2 v1v1u1u1 s1+s2
  366.         psrlw      mm0, 1            ; mm0 = 00v200u2 00v100u1 (s1+s2)/2
  367.         ;;
  368.         ;;Store chromas in du and dv.
  369.         ;;
  370.         movd mm3, esi ;save esi
  371.         ;; unpack and pack
  372.         packuswb   mm0, mm0          ; mm0 = 00000000 v2u2v2u1
  373.         punpcklbw  mm0, mm0          ; mm0 = v2v2u2u2 v1v1u1u1
  374.         movd       esi, mm4          ; esi = dU
  375.         movq       mm1, mm0
  376.         psrlq      mm1, 32           ; mm1 = 0000000 v2v2u2u2
  377.         punpcklbw  mm0, mm1          ; mm0 = v2v1v2v1 u2u1u2u1
  378.         ;; Store the U data
  379.         movd edx, mm0                ; edx = u1u2u1u2
  380.         psrlq mm0, 32                ; mm0 = 00000000 v1v2v1v2
  381.         mov  WORD [esi+ecx*2], dx    ; store 2 bytes of U data.
  382.         ;; Store the V data
  383.         movd  esi, mm5                ; esi = dV
  384.         movd  edx, mm0                ; ecx = v1v2v1v2
  385.         mov   WORD [esi+ecx*2], dx    ; store 2 bytes of V data.
  386.         movd esi, mm3
  387.         
  388.         ;; inc DX counter and loop
  389.         inc  ecx
  390.         cmp  ecx, var(parms.tmp1)
  391.         jne  DXLOOP
  392.         
  393.         ;; Now we have to check for any pixels left over if dest_dx
  394.         ;; is not divisible by 4. Since dest_dx must be at least even
  395.         ;; we can only have 0 or two(1 macro pixel).
  396.         mov ecx, var(parms.tmp3)
  397.         jz  nextline
  398.         ;;
  399.         ;; Do odd marco pixel here. ===========
  400.         ;;
  401.         movd mm0, [edi+ecx*8]      ; mm0= 00000000 v1y2u1y1
  402.         movd mm1, [esi+ecx*8]      ; mm1= 00000000 v1y2u1y1
  403.         ;; Store luma values in planar YUV space
  404.         movq     mm2, mm0
  405.         movq     mm3, mm1
  406.         pand     mm2, mm6          ; mm2 = 00000000 00Y100Y2 of s1
  407.         pand     mm3, mm6          ; mm3 = 00000000 00Y100Y2 of s1
  408.         packuswb mm2, mm7          ; mm2 = 00000000 0000Y2Y1 of s1
  409.         packuswb mm3, mm7          ; mm3 = 00000000 0000Y2Y1 of s2
  410.         movd     edx, mm2              ; grab lower 32 bits of mm2
  411.         mov      WORD [ebx+ecx*4], dx  ; Just store 16 bits of ecx
  412.         movd     edx, mm3              ; grab lower 32 bits of mm3
  413.         mov      WORD [ebp+ecx*4], dx  ; just store 16 bits of ecx
  414.         ;;Compute averaged chroma values
  415.         psrlw      mm0, 8            ; mm0 = 00000000 00v100u1 of S1
  416.         psrlw      mm1, 8            ; mm1 = 00000000 00v100u1 of S2
  417.         paddw      mm0, mm1          ; mm0 = 00000000 v1v1u1u1 s1+s2
  418.         psrlw      mm0, 1            ; mm0 = 00000000 00v100u1 (s1+s2)/2
  419.         ;;
  420.         ;;Store chromas in du and dv.
  421.         ;;
  422.         movd mm3, esi ;save esi
  423.         movd esi, mm4                ; esi = dU
  424.         ;; unpack and pack
  425.         movd edx, mm0    ; edx = 00v100u1
  426.         
  427.         ;; Store the U data
  428.         mov  [esi+ecx*2], dl         ; store 1 byte of U data.
  429.         movd  esi, mm5                ; esi = dV
  430.         ;; Store the V data
  431.         shr   edx, 16                 ; edx = 000000v1
  432.         mov   [esi+ecx*2], dl         ; store 1 byte of V data.
  433.         movd  esi, mm3
  434.         
  435. nextline:               
  436.         ;; Add pitches for next line
  437.         mov ecx, var(parms.src_pitch)
  438.         shl ecx, 1                     ; ecx = src_pitch*2
  439.         add edi, ecx                   ; s1 = s1 + src_pitch*2
  440.         add esi, ecx                   ; s2 = s2 + src_pitch*2
  441.         mov ecx, var(parms.dyPitch)
  442.         shl ecx, 1                     ; ecx = dyPitch*2
  443.         add ebx, ecx                   ; d1 = d1+ dyPitch*2
  444.         add ebp, ecx                   ; d2 = d2+ dyPitch*2
  445.         mov   ecx, var(parms.dvPitch)  ; ecx = dvPitch
  446.         movd  mm3, ecx
  447.         paddd mm4, mm3                  ; dv = dv+ dvPitch
  448.         mov   ecx, var(parms.duPitch)    ; ecx = 
  449.         movd  mm3, ecx
  450.         xor   ecx, ecx
  451.         paddd mm5, mm3                  ; du = du+ duPitch
  452.         
  453.         ;; inc DY counter and loop
  454.         inc eax
  455.         cmp eax, var(parms.tmp2)
  456.         jne NEAR DYLOOP
  457.         
  458. end: 
  459.         ;; Free up stack temp var.
  460.         add esp, numtemps*4
  461.         
  462.         ;; Pop off the stack....
  463.         pop edx
  464.         pop ecx
  465.         pop ebp
  466.         pop esi
  467.         pop edi
  468.         pop ebx
  469.         emms
  470.         
  471.         ;; success
  472.         xor eax, eax
  473.         ret
  474. ;;; leave a trace
  475. version: db '$(gfw) Copyright 2001 RealNetworks Inc. Revision:1.0 $',0