convert_a.asm
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:7k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. ; Avisynth v2.5.  Copyright 2002 Ben Rudiak-Gould et al.
  2. ; http://www.avisynth.org
  3. ;
  4. ; This program is free software; you can redistribute it and/or modify
  5. ; it under the terms of the GNU General Public License as published by
  6. ; the Free Software Foundation; either version 2 of the License, or
  7. ; (at your option) any later version.
  8. ;
  9. ; This program is distributed in the hope that it will be useful,
  10. ; but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ; GNU General Public License for more details.
  13. ;
  14. ; You should have received a copy of the GNU General Public License
  15. ; along with this program; if not, write to the Free Software
  16. ; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit
  17. ; http://www.gnu.org/copyleft/gpl.html .
  18. ;
  19. ; Linking Avisynth statically or dynamically with other modules is making a
  20. ; combined work based on Avisynth.  Thus, the terms and conditions of the GNU
  21. ; General Public License cover the whole combination.
  22. ;
  23. ; As a special exception, the copyright holders of Avisynth give you
  24. ; permission to link Avisynth with independent modules that communicate with
  25. ; Avisynth solely through the interfaces defined in avisynth.h, regardless of the license
  26. ; terms of these independent modules, and to copy and distribute the
  27. ; resulting combined work under terms of your choice, provided that
  28. ; every copy of the combined work is accompanied by a complete copy of
  29. ; the source code of Avisynth (the version of Avisynth used to produce the
  30. ; combined work), being distributed under the terms of the GNU General
  31. ; Public License plus this exception.  An independent module is a module
  32. ; which is not derived from or based on Avisynth, such as 3rd-party filters,
  33. ; import and export plugins, or graphical user interfaces.
  34. .586
  35. .mmx
  36. .model flat
  37. ; alignment has to be 'page' so that I can use 'align 32' below
  38. _TEXT64 segment page public use32 'CODE'
  39. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  40. align 8
  41. yuv2rgb_constants:
  42. x0000_0000_0010_0010 dq 00000000000100010h
  43. x0080_0080_0080_0080 dq 00080008000800080h
  44. x00FF_00FF_00FF_00FF dq 000FF00FF00FF00FFh
  45. x00002000_00002000 dq 00000200000002000h
  46. xFF000000_FF000000 dq 0FF000000FF000000h
  47. cy dq 000004A8500004A85h
  48. crv dq 03313000033130000h
  49. cgu_cgv dq 0E5FCF377E5FCF377h
  50. cbu dq 00000408D0000408Dh
  51. yuv2rgb_constants_rec709:
  52. dq 00000000000100010h
  53. dq 00080008000800080h
  54. dq 000FF00FF00FF00FFh
  55. dq 00000200000002000h
  56. dq 0FF000000FF000000h
  57. dq 000004A8500004A85h
  58. dq 03960000039600000h
  59. dq 0EEF5F930EEF5F930h
  60. dq 00000439B0000439Bh
  61. ofs_x0000_0000_0010_0010 = 0
  62. ofs_x0080_0080_0080_0080 = 8
  63. ofs_x00FF_00FF_00FF_00FF = 16
  64. ofs_x00002000_00002000 = 24
  65. ofs_xFF000000_FF000000 = 32
  66. ofs_cy = 40
  67. ofs_crv = 48
  68. ofs_cgu_cgv = 56
  69. ofs_cbu = 64
  70. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  71. GET_Y MACRO mma,uyvy
  72. IF &uyvy
  73. psrlw mma,8
  74. ELSE
  75. pand mma,[edx+ofs_x00FF_00FF_00FF_00FF]
  76. ENDIF
  77. ENDM
  78. GET_UV MACRO mma,uyvy
  79. GET_Y mma,1-uyvy
  80. ENDM
  81. YUV2RGB_INNER_LOOP MACRO uyvy,rgb32,no_next_pixel
  82. ;; This YUV422->RGB conversion code uses only four MMX registers per
  83. ;; source dword, so I convert two dwords in parallel.  Lines corresponding
  84. ;; to the "second pipe" are indented an extra space.  There's almost no
  85. ;; overlap, except at the end and in the three lines marked ***.
  86. ;; revised 4july,2002 to properly set alpha in rgb32 to default "on" & other small memory optimizations
  87. movd mm0, dword ptr [esi]
  88.  movd  mm5, dword ptr [esi+4]
  89. movq mm1,mm0
  90. GET_Y mm0,&uyvy ; mm0 = __________Y1__Y0
  91.  movq  mm4,mm5
  92. GET_UV mm1,&uyvy ; mm1 = __________V0__U0
  93.  GET_Y  mm4,&uyvy
  94. movq mm2,mm5 ; *** avoid reload from [esi+4]
  95.  GET_UV  mm5,&uyvy
  96. psubw mm0, qword ptr [edx+ofs_x0000_0000_0010_0010]
  97.  movd  mm6, dword ptr [esi+8-4*(no_next_pixel)]
  98. GET_UV mm2,&uyvy ; mm2 = __________V2__U2
  99.  psubw  mm4, qword ptr [edx+ofs_x0000_0000_0010_0010]
  100. paddw mm2,mm1
  101.  GET_UV  mm6,&uyvy
  102. psubw mm1, qword ptr [edx+ofs_x0080_0080_0080_0080]
  103.  paddw  mm6,mm5
  104. psllq mm2,32
  105.  psubw  mm5, qword ptr [edx+ofs_x0080_0080_0080_0080]
  106. punpcklwd mm0,mm2 ; mm0 = ______Y1______Y0
  107.  psllq  mm6,32
  108. pmaddwd mm0, qword ptr [edx+ofs_cy]
  109.  punpcklwd  mm4,mm6
  110. paddw mm1,mm1
  111.  pmaddwd  mm4, qword ptr [edx+ofs_cy]
  112.  paddw  mm5,mm5
  113. paddw mm1,mm2 ; mm1 = __V1__U1__V0__U0 * 2
  114. paddd mm0,[edx+ofs_x00002000_00002000]
  115.  paddw  mm5,mm6
  116. movq mm2,mm1
  117.  paddd  mm4,[edx+ofs_x00002000_00002000]
  118. movq mm3,mm1
  119.  movq  mm6,mm5
  120. pmaddwd mm1,[edx+ofs_crv]
  121.  movq  mm7,mm5
  122. paddd mm1,mm0
  123.  pmaddwd  mm5,[edx+ofs_crv]
  124. psrad mm1,14 ; mm1 = RRRRRRRRrrrrrrrr
  125.  paddd  mm5,mm4
  126. pmaddwd mm2,[edx+ofs_cgu_cgv]
  127.  psrad  mm5,14
  128. paddd mm2,mm0
  129.  pmaddwd  mm6,[edx+ofs_cgu_cgv]
  130. psrad mm2,14 ; mm2 = GGGGGGGGgggggggg
  131.  paddd  mm6,mm4
  132. pmaddwd mm3,[edx+ofs_cbu]
  133.  psrad  mm6,14
  134. paddd mm3,mm0
  135.  pmaddwd  mm7,[edx+ofs_cbu]
  136.        add        esi,8
  137.        add        edi,12+4*rgb32
  138. IFE &no_next_pixel
  139.        cmp        esi,ecx
  140. ENDIF
  141. psrad mm3,14 ; mm3 = BBBBBBBBbbbbbbbb
  142.  paddd  mm7,mm4
  143. pxor mm0,mm0
  144.  psrad  mm7,14
  145. packssdw mm3,mm2 ; mm3 = GGGGggggBBBBbbbb
  146.  packssdw  mm7,mm6
  147. packssdw mm1,mm0 ; mm1 = ________RRRRrrrr
  148.  packssdw  mm5,mm0 ; *** avoid pxor mm4,mm4
  149. movq mm2,mm3
  150.  movq  mm6,mm7
  151. punpcklwd mm2,mm1 ; mm2 = RRRRBBBBrrrrbbbb
  152.  punpcklwd  mm6,mm5
  153. punpckhwd mm3,mm1 ; mm3 = ____GGGG____gggg
  154.  punpckhwd  mm7,mm5
  155. movq mm0,mm2
  156.  movq  mm4,mm6
  157. punpcklwd mm0,mm3 ; mm0 = ____rrrrggggbbbb
  158.  punpcklwd  mm4,mm7
  159. IFE &rgb32
  160. psllq mm0,16
  161.  psllq  mm4,16
  162. ENDIF
  163. punpckhwd mm2,mm3 ; mm2 = ____RRRRGGGGBBBB
  164.  punpckhwd  mm6,mm7
  165. packuswb mm0,mm2 ; mm0 = __RRGGBB__rrggbb <- ta dah!
  166.  packuswb  mm4,mm6
  167. IF &rgb32
  168. por mm0, [edx+ofs_xFF000000_FF000000]  ; set alpha channels "on"
  169.  por mm4, [edx+ofs_xFF000000_FF000000]
  170. movq [edi-16],mm0 ; store the quadwords independently
  171.  movq  [edi-8],mm4
  172. ELSE
  173. psrlq mm0,8 ; pack the two quadwords into 12 bytes
  174. psllq mm4,8 ; (note: the two shifts above leave
  175. movd dword ptr [edi-12],mm0 ; mm0,4 = __RRGGBBrrggbb__)
  176. psrlq mm0,32
  177. por mm4,mm0
  178. movd dword ptr [edi-8],mm4
  179. psrlq mm4,32
  180. movd dword ptr [edi-4],mm4
  181. ENDIF
  182. ENDM
  183. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  184. YUV2RGB_PROC MACRO procname,uyvy,rgb32
  185. PUBLIC C _&procname
  186. ;;void __cdecl procname(
  187. ;; [esp+ 4] const BYTE* src,
  188. ;; [esp+ 8] BYTE* dst,
  189. ;; [esp+12] const BYTE* src_end,
  190. ;; [esp+16] int src_pitch,
  191. ;; [esp+20] int row_size,
  192. ;; [esp+24] bool rec709);
  193. _&procname PROC
  194. push esi
  195. push edi
  196. push ebx
  197. mov eax,[esp+16+12]
  198. mov esi,[esp+12+12] ; read source bottom-up
  199. mov edi,[esp+8+12]
  200. mov ebx,[esp+20+12]
  201. mov edx,offset yuv2rgb_constants
  202. test byte ptr [esp+24+12],1
  203. jz loop0
  204. mov edx,offset yuv2rgb_constants_rec709
  205. loop0:
  206. sub esi,eax
  207. lea ecx,[esi+ebx-8]
  208. align 32
  209. loop1:
  210. YUV2RGB_INNER_LOOP uyvy,rgb32,0
  211. jb loop1
  212. YUV2RGB_INNER_LOOP uyvy,rgb32,1
  213. sub esi,ebx
  214. cmp esi,[esp+4+12]
  215. ja loop0
  216. emms
  217. pop ebx
  218. pop edi
  219. pop esi
  220. retn
  221. _&procname ENDP
  222. ENDM
  223. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  224. YUV2RGB_PROC mmx_YUY2toRGB24,0,0
  225. YUV2RGB_PROC mmx_YUY2toRGB32,0,1
  226. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  227. END