y2touy.asm
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:6k
源码类别:

Symbian

开发平台:

C/C++

  1. ;
  2. ; ***** BEGIN LICENSE BLOCK ***** 
  3. ; Version: RCSL 1.0/RPSL 1.0 
  4. ;  
  5. ; Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  6. ;      
  7. ; The contents of this file, and the files included with this file, are 
  8. ; subject to the current version of the RealNetworks Public Source License 
  9. ; Version 1.0 (the "RPSL") available at 
  10. ; http://www.helixcommunity.org/content/rpsl unless you have licensed 
  11. ; the file under the RealNetworks Community Source License Version 1.0 
  12. ; (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  13. ; in which case the RCSL will apply. You may also obtain the license terms 
  14. ; directly from RealNetworks.  You may not use this file except in 
  15. ; compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  16. ; applicable to this file, the RCSL.  Please see the applicable RPSL or 
  17. ; RCSL for the rights, obligations and limitations governing use of the 
  18. ; contents of the file.  
  19. ;  
  20. ; This file is part of the Helix DNA Technology. RealNetworks is the 
  21. ; developer of the Original Code and owns the copyrights in the portions 
  22. ; it created. 
  23. ;  
  24. ; This file, and the files included with this file, is distributed and made 
  25. ; available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  26. ; EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  27. ; INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  28. ; FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  29. ; Technology Compatibility Kit Test Suite(s) Location: 
  30. ;    http://www.helixcommunity.org/content/tck 
  31. ; Contributor(s): 
  32. ;  
  33. ; ***** END LICENSE BLOCK *****
  34. ;
  35. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  36. ;;
  37. ;;  YUY2 to UYVY MMX converter.
  38. ;;
  39. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  40. %ifdef   COFF
  41.         %define YUY2ToUYVY_MMX _YUY2ToUYVY_MMX
  42. %elifdef WIN32
  43.         %define YUY2ToUYVY_MMX _YUY2ToUYVY_MMX
  44. %elifdef ELF
  45.         %define YUY2ToUYVY_MMX YUY2ToUYVY_MMX
  46. %elifdef AOUTB
  47.         %define YUY2ToUYVY_MMX YUY2ToUYVY_MMX
  48. %else
  49.         %error linking format currently not supported by alphbablend.asm
  50. %endif
  51.         ;; Export the functions implemented here.
  52.         global YUY2ToUYVY_MMX
  53. ;========================= DATA SEGMENT ============================
  54. section .data
  55. align 8        
  56. ;============================= CODE SEGMENT =======================                        
  57. section .text
  58. ;;
  59. ;; This is our stack params definition. It is used for both
  60. ;; YUY2 and UYVY routines as they both take the same parms.
  61. ;;                                        
  62. %assign numtemps 4
  63. %define var(a) [esp+a]       
  64.                 
  65. struc parms
  66.         ;Temps on stack
  67.         .tmp1       resd 1  ;General DWORD temp.
  68.         .tmp2       resd 1  ;General DWORD temp.
  69.         .tmp3       resd 1  ;General DWORD temp.
  70.         .tmp4       resd 1  ;General DWORD temp.
  71.         
  72.         ; Space for reg pushes and return address.
  73.         .registers  resd 6  ;pushed registers
  74.         .return     resd 1  ;return address
  75.         ; input params
  76.         .src:       resd 1  ;unsigned char*,      
  77.         .dest:      resd 1  ;unsigned char*,      
  78.         .dx:        resd 1  ;ULONG32,      
  79. endstruc
  80. YUY2ToUYVY_MMX:
  81.         ;; Save some stuff...
  82.         push ebx
  83.         push edi
  84.         push esi
  85.         push ebp
  86.         push ecx
  87.         push edx
  88.         ; Make room for temps on stack
  89.         sub esp, numtemps*4;
  90.         ;; Grab source and dest pointers...
  91.         mov esi, var(parms.src)
  92.         mov edi, var(parms.dest)
  93.         ;; Preload our address add constant
  94.         mov edx, 8
  95.      
  96.         mov ecx, var(parms.dx)
  97.         shr ecx, 3              ; we do 4 macro pixels at a time.
  98.         jnc loop1               ; Do we have a width that is a multiple of 8?
  99.         ;; We have 2 macro pixels left over. Do them here
  100.         
  101.         movq  mm0, [esi]        ; grab 2 macro pixels from source
  102.         movq  mm1, mm0          ; mm1=mm0= VVYYUUYY VVYYUUYY 
  103.         psllw mm1, 8            ; mm1 = YY00YY00 YY00YY00
  104.         psrlw mm0, 8            ; mm0 = 00VV00UU 00VV00UU
  105.         por   mm0, mm1          ; mm0 = YYVVYYUU YYVVYYUU
  106.         movq  [edi], mm0        ; store it.
  107.         add   esi, edx
  108.         add   edi, edx
  109.         ;; This loops does 16 bytes at a time (4 macro pixels).
  110. loop1:   
  111.         movq  mm0, [esi]        ; grab 2 macro pixels from source
  112.         add esi, edx
  113.         movq  mm1, mm0          ; mm1=mm0= VVYYUUYY VVYYUUYY 
  114.         psllw mm1, 8            ; mm1 = YY00YY00 YY00YY00
  115.         psrlw mm0, 8            ; mm0 = 00VV00UU 00VV00UU
  116.         movq  mm2, [esi]        ; grab 2 macro pixels from source
  117.         por   mm0, mm1          ; mm0 = YYVVYYUU YYVVYYUU
  118.         movq  mm3, mm2          ; mm1=mm0= VVYYUUYY VVYYUUYY 
  119.         
  120.         movq  [edi], mm0        ; store it.
  121.         add edi, edx
  122.         psllw mm3, 8            ; mm1 = YY00YY00 YY00YY00
  123.         psrlw mm2, 8            ; mm0 = 00VV00UU 00VV00UU
  124.         por   mm2, mm3          ; mm0 = YYVVYYUU YYVVYYUU
  125.         add esi, edx
  126.         
  127.         movq  [edi], mm2        ; store it.
  128.                 
  129.         ;; Now do the loop calcs....
  130.         add edi, edx
  131.         dec ecx
  132.         jnz loop1
  133.         
  134. end: 
  135.         ;; Free up stack temp var.
  136.         add esp, numtemps*4
  137.         
  138.         ;; Pop off the stack....
  139.         pop edx
  140.         pop ecx
  141.         pop ebp
  142.         pop esi
  143.         pop edi
  144.         pop ebx
  145.         ;; This emms is expensive. If we don't do it we wipe out the
  146.         ;; floating ponts registers but that should be ok.
  147. ;         emms 
  148.         
  149.         ;; success
  150.         xor eax, eax
  151.         ret
  152. ;;; leave a trace
  153. version: db '$(gfw) Copyright 2001 RealNetworks Inc. Revision:1.0 $',0