frame_doubler_mmx.asm
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:5k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. ;
  2. ; The contents of this file are subject to the Mozilla Public
  3. ; License Version 1.1 (the "License"); you may not use this file
  4. ; except in compliance with the License. You may obtain a copy of
  5. ; the License at http://www.mozilla.org/MPL/
  6. ; Software distributed under the License is distributed on an "AS
  7. ; IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  8. ; implied. See the License for the specific language governing
  9. ; rights and limitations under the License.
  10. ; The Original Code is MPEG4IP.
  11. ; The Initial Developer of the Original Code is Cisco Systems Inc.
  12. ; Portions created by Cisco Systems Inc. are
  13. ; Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
  14. ; Contributor(s): 
  15. ; Dave Mackie dmackie@cisco.com
  16. ;
  17. ; MMX version of frame doubler
  18. ; the function arguments
  19. %define PSRC ebp+8
  20. %define PDST ebp+12
  21. %define WIDTH  ebp+16
  22. %define HEIGHT ebp+20
  23. ; our register variables
  24. ; eax reserved for temporary calculations
  25. %define RWIDTH ebx
  26. %define ROWNUM ecx
  27. %define COLNUM edx
  28. %define PSRCROW esi
  29. %define PDSTROW edi
  30. BITS 32
  31. GLOBAL FrameDoublerMmx
  32. SECTION .data
  33. ALIGN 8
  34. lastColByte
  35. dd 0xFF000000
  36. dd 0x00000000
  37. SECTION .text
  38. FrameDoublerMmx:
  39. push ebp;
  40. mov ebp, esp;
  41. push eax;
  42. push ebx;
  43. push ecx;
  44. push edx;
  45. push esi;
  46. push edi;
  47. mov PSRCROW, [PSRC];
  48. mov PDSTROW, [PDST];
  49. mov RWIDTH, [WIDTH];
  50. mov COLNUM, 0;
  51. colLoop:
  52. ; compute first row
  53. movq mm0, [PSRCROW]; mm0 = row[i][j] = p7 p6 p5 p4 p3 p2 p1 p0
  54. movq mm1, mm0; mm1 = mm0
  55. punpcklbw mm1, mm0; mm1 = p3 p3 p2 p2 p1 p1 p0 p0
  56. movq mm2, mm0; mm2 = mm0
  57. psrlq mm2, 8; mm2 = 00 p7 p6 p5 p4 p3 p2 p1
  58. punpcklbw mm0, mm2; mm2 = p4 p3 p3 p2 p2 p1 p1 p0
  59. pavgb mm1, mm0; mm1 = p0 (p0+p1+1)>>1 p1 (p1+p2+1)>>1 ...
  60. movq [PDSTROW], mm1; store result
  61. add PSRCROW, RWIDTH; increment src pointer by width
  62. add PDSTROW, RWIDTH; increment dst pointer by 2 * width
  63. add PDSTROW, RWIDTH;
  64. mov ROWNUM, [HEIGHT];
  65. sub ROWNUM, 1;
  66. rowLoop:
  67. ; mm1 contains previous row, row[i-1][j]
  68. movq mm0, [PSRCROW]; mm0 = row[i][j] = p7 p6 p5 p4 p3 p2 p1 p0
  69. movq mm3, mm0; mm3 = mm0
  70. punpcklbw mm3, mm0; mm3 = p3 p3 p2 p2 p1 p1 p0 p0
  71. movq mm2, mm0; mm2 = mm0
  72. psrlq mm2, 8; mm2 = 00 p7 p6 p5 p4 p3 p2 p1
  73. punpcklbw mm0, mm2; mm2 = p4 p3 p3 p2 p2 p1 p1 p0
  74. ; compute expanded row, average of mm0 and mm3
  75. pavgb mm3, mm0; mm3 = (p4+p3+1)>>1 p3 (p3+p2+1)>>1 p2 ...
  76. ; compute interpolated row, average of mm1 and mm3
  77. pavgb mm1, mm3;
  78. movq [PDSTROW], mm1; store interpolated row
  79. add PSRCROW, RWIDTH; increment src pointer by width
  80. add PDSTROW, RWIDTH; increment dst pointer by 2 * width
  81. add PDSTROW, RWIDTH;
  82. movq [PDSTROW], mm3;  store expanded row
  83. add PDSTROW, RWIDTH; increment dst pointer by 2 * width
  84. add PDSTROW, RWIDTH;
  85. movq mm1, mm3; current row now becomes previous row
  86. sub ROWNUM, 1;
  87. jnz rowLoop;
  88. movq [PDSTROW], mm3; store last dst row
  89. ; compute ptrs for next column
  90. mov PSRCROW, [PSRC];
  91. mov PDSTROW, [PDST];
  92. add COLNUM, 4;
  93. add PSRCROW, COLNUM;
  94. add PDSTROW, COLNUM;
  95. add PDSTROW, COLNUM;
  96. mov eax, RWIDTH;
  97. sub eax, 4;
  98. cmp COLNUM, eax;
  99. jnz near colLoop;
  100. ; last column needs special handling
  101. lastCol:
  102. ; compute first row
  103. movd mm0, [PSRCROW]; mm0 = row[0][j] = 00 00 00 00 p3 p2 p1 p0 
  104. movq mm1, mm0; mm1 = mm0
  105. punpcklbw mm1, mm0; mm1 = p3 p3 p2 p2 p1 p1 p0 p0
  106. movq mm2, mm0; mm2 = mm0
  107. psrlq mm2, 8; mm2 = 00 00 00 00 00 p3 p2 p1
  108. movq mm4, mm0; mm4 = mm0
  109. pand mm4, [lastColByte]; mm4 = 00 00 00 00 p3 00 00 00
  110. por mm2, mm4; mm2 = 00 00 00 00 p3 p3 p2 p1
  111. punpcklbw mm0, mm2; mm0 = p3 p3 p3 p2 p2 p1 p1 p0
  112. pavgb mm1, mm0; mm1 = p3 p3 (p3+p2+1)>>1 p2 (p2+p1+1)>>1 p1 ...
  113. movq [PDSTROW], mm1; store result
  114. add PSRCROW, RWIDTH; increment src pointer by width
  115. add PDSTROW, RWIDTH; increment dst pointer by 2 * width
  116. add PDSTROW, RWIDTH;
  117. mov ROWNUM, [HEIGHT];
  118. sub ROWNUM, 1;
  119. lastColRowLoop:
  120. ; mm1 contains previous row, row[i-1][j]
  121. movd mm0, [PSRCROW]; mm0 = row[0][j] = 00 00 00 00 p3 p2 p1 p0 
  122. movq mm3, mm0; mm3 = mm0
  123. punpcklbw mm3, mm0; mm1 = p3 p3 p2 p2 p1 p1 p0 p0
  124. movq mm2, mm0; mm2 = mm0
  125. psrlq mm2, 8; mm2 = 00 00 00 00 00 p3 p2 p1
  126. movq mm4, mm0; mm4 = mm0
  127. pand mm4, [lastColByte]; mm4 = 00 00 00 00 p3 00 00 00
  128. por mm2, mm4; mm2 = 00 00 00 00 p3 p3 p2 p1
  129. punpcklbw mm0, mm2; mm0 = p3 p3 p3 p2 p2 p1 p1 p0
  130. ; compute expanded row, average of mm0 and mm3
  131. pavgb mm3, mm0; mm1 = p3 p3 (p3+p2+1)>>1 p2 (p2+p1+1)>>1 p1 ...
  132. ; compute interpolated row, average of mm1 and mm3
  133. pavgb mm1, mm3;
  134. movq [PDSTROW], mm1; store interpolated row
  135. add PSRCROW, RWIDTH; increment src pointer by width
  136. add PDSTROW, RWIDTH; increment dst pointer by 2 * width
  137. add PDSTROW, RWIDTH;
  138. movq [PDSTROW], mm3;  store expanded row
  139. add PDSTROW, RWIDTH; increment dst pointer by 2 * width
  140. add PDSTROW, RWIDTH;
  141. movq mm1, mm3; current row now becomes previous row
  142. sub ROWNUM, 1;
  143. jnz lastColRowLoop;
  144. movq [PDSTROW], mm3; store last dst row
  145. done:
  146. pop edi;
  147. pop esi;
  148. pop edx;
  149. pop ecx;
  150. pop ebx;
  151. pop eax;
  152. emms;
  153. pop ebp;
  154. ret;