yuv12-rgb16.s
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:19k
源码类别:

DVD

开发平台:

Unix_Linux

  1. ;-------------------------------------------------------------------------
  2. ; cxm12161 -- This function performs YUV12-to-RGB16 color conversion for H26x.
  3. ;             It handles any format in which there are three fields, the low
  4. ;             order field being B and fully contained in the low order byte, the
  5. ;             second field being G and being somewhere in bits 4 through 11,
  6. ;             and the high order field being R and fully contained in the high
  7. ;             order byte.
  8. ;
  9. ;             The YUV12 input is planar, 8 bits per pel.  The Y plane may have
  10. ;             a pitch of up to 768.  It may have a width less than or equal
  11. ;             to the pitch.  It must be DWORD aligned, and preferably QWORD
  12. ;             aligned.  Pitch and Width must be a multiple of four.  For best
  13. ;             performance, Pitch should not be 4 more than a multiple of 32.
  14. ;             Height may be any amount, but must be a multiple of two.  The U
  15. ;             and V planes may have a different pitch than the Y plane, subject
  16. ;             to the same limitations.
  17. ;
  18. ;include iammx.inc
  19. ;include locals.inc
  20. RGB_formats:
  21.     dd  RGB565
  22.     dd  RGB555
  23.     dd  RGB664
  24.     dd  RGB655
  25. Minusg:             dd   00800080h, 00800080h
  26. Yadd:               dd   10101010h, 10101010h
  27. VtR:                dd   00660066h, 00660066h ;01990199h,01990199h
  28. VtG:                dd   00340034h, 00340034h ;00d000d0h,00d000d0h
  29. UtG:                dd   00190019h, 00190019h ;00640064h,00640064h
  30. UtB:                dd   00810081h, 00810081h ;02050205h,02050205h
  31. Ymul:               dd   004a004ah, 004a004ah ;012a012ah,012a012ah
  32. UVtG:               dd   00340019h, 00340019h ;00d00064h,00d00064h
  33. VtRUtB:             dd   01990205h, 01990205h
  34. fourbitu:           dd  0f0f0f0f0h, 0f0f0f0f0h
  35. fivebitu:           dd  0e0e0e0e0h, 0e0e0e0e0h
  36. sixbitu:            dd  0c0c0c0c0h, 0c0c0c0c0h
  37. %assign LocalFrameSize  156
  38. %assign RegisterStorageSize  16
  39. ; Arguments:
  40. %assign YPlane                    LocalFrameSize + RegisterStorageSize +  4
  41. %assign UPlane                    LocalFrameSize + RegisterStorageSize +  8
  42. %assign VPlane                    LocalFrameSize + RegisterStorageSize + 12
  43. %assign FrameWidth                LocalFrameSize + RegisterStorageSize + 16
  44. %assign FrameHeight               LocalFrameSize + RegisterStorageSize + 20
  45. %assign YPitch                    LocalFrameSize + RegisterStorageSize + 24
  46. %assign ChromaPitch               LocalFrameSize + RegisterStorageSize + 28
  47. %assign AspectAdjustmentCount     LocalFrameSize + RegisterStorageSize + 32
  48. %assign ColorConvertedFrame       LocalFrameSize + RegisterStorageSize + 36
  49. %assign DCIOffset                 LocalFrameSize + RegisterStorageSize + 40
  50. %assign CCOffsetToLine0           LocalFrameSize + RegisterStorageSize + 44
  51. %assign CCOPitch                  LocalFrameSize + RegisterStorageSize + 48
  52. %assign CCType                    LocalFrameSize + RegisterStorageSize + 52
  53. %assign EndOfArgList              LocalFrameSize + RegisterStorageSize + 56
  54. ; Locals (on local stack frame)
  55. %assign CCOCursor                   0
  56. %assign CCOSkipDistance             4
  57. %assign ChromaLineLen               8
  58. %assign YCursor                    12
  59. %assign DistanceFromVToU           16
  60. %assign EndOfChromaLine            20
  61. %assign AspectCount                24
  62. %assign AspectBaseCount            28
  63. %assign tmpYCursorEven             32
  64. %assign tmpYCursorOdd              36
  65. %assign tmpCCOPitch                40
  66. %assign temp_mmx                   44  ; note it is 48 bytes
  67. %assign RLeftShift                 92
  68. %assign GLeftShift                100
  69. %assign RRightShift               108
  70. %assign GRightShift               116
  71. %assign BRightShift               124
  72. %assign RUpperLimit               132
  73. %assign GUpperLimit               140
  74. %assign BUpperLimit               148
  75. ; extern void C MMX_YUV12ToRGB16 (
  76. ;                                     U8* YPlane,
  77. ;                                     U8* UPlane,
  78. ;                                     U8* VPlane,
  79. ;                                     UN  FrameWidth,
  80. ;                                     UN  FrameHeight,
  81. ;                                     UN  YPitch,
  82. ;                                     UN  VPitch,
  83. ;                                     UN  AspectAdjustmentCount,
  84. ;                                     U8* ColorConvertedFrame,
  85. ;                                     U32 DCIOffset,
  86. ;                                     U32 CCOffsetToLine0,
  87. ;                                     IN  CCOPitch,
  88. ;                                     IN  CCType)
  89. ;
  90. ;  The local variables are on the stack,
  91. ;  The tables are in the one and only data segment.
  92. ;
  93. ;  CCOffsetToLine0 is relative to ColorConvertedFrame.
  94. ;  CCType  used by RGB color convertors to determine the exact conversion type.
  95. ;    RGB565 = 0 
  96. ;    RGB555 = 1
  97. ;    RGB664 = 2
  98. ;    RGB655 = 3
  99. global yuv_2_rgb
  100. yuv_2_rgb:
  101.   push       esi
  102.   push       edi
  103.   push       ebp
  104.   push       ebx
  105.   sub        esp, LocalFrameSize
  106.   mov        eax, [esp+CCType]
  107.   cmp        eax,4
  108.   jae        near finish
  109.   jmp        [RGB_formats+eax*4]
  110. RGB555:
  111.   xor        eax, eax
  112.   mov        ebx, 2   ; 10-8 for byte shift
  113.   mov        [esp+RLeftShift], ebx
  114.   mov        [esp+RLeftShift+4], eax
  115.   mov        ebx, 5
  116.   mov        [esp+GLeftShift], ebx
  117.   mov        [esp+GLeftShift+4], eax
  118.   mov        ebx, 9
  119.   mov        [esp+RRightShift], ebx
  120.   mov        [esp+RRightShift+4], eax
  121.   mov        [esp+GRightShift], ebx
  122.   mov        [esp+GRightShift+4], eax
  123.   mov        [esp+BRightShift], ebx
  124.   mov        [esp+BRightShift+4], eax
  125.   movq       mm0, [fivebitu]
  126.   movq       [esp+RUpperLimit], mm0
  127.   movq       [esp+GUpperLimit], mm0
  128.   movq       [esp+BUpperLimit], mm0
  129.   jmp        RGBEND
  130. RGB664:
  131.   xor        eax, eax
  132.   mov        ebx, 2   ; 8-6
  133.   mov        [esp+RLeftShift], ebx
  134.   mov        [esp+RLeftShift+4], eax
  135.   mov        ebx, 4
  136.   mov        [esp+GLeftShift], ebx
  137.   mov        [esp+GLeftShift+4], eax
  138.   mov        ebx, 8
  139.   mov        [esp+RRightShift], ebx
  140.   mov        [esp+RRightShift+4], eax
  141.   mov        [esp+GRightShift], ebx
  142.   mov        [esp+GRightShift+4], eax
  143.   mov        ebx, 10
  144.   mov        [esp+BRightShift], ebx
  145.   mov        [esp+BRightShift+4], eax
  146.   movq       mm0, [sixbitu]
  147.   movq       [esp+RUpperLimit], mm0
  148.   movq       [esp+GUpperLimit], mm0
  149.   movq       mm0, [fourbitu]
  150.   movq       [esp+BUpperLimit], mm0
  151.   jmp        RGBEND
  152. RGB655:
  153.   xor        eax, eax
  154.   mov        ebx, 2   ; 8-6
  155.   mov        [esp+RLeftShift], ebx
  156.   mov        [esp+RLeftShift+4], eax
  157.   mov        ebx, 5
  158.   mov        [esp+GLeftShift], ebx
  159.   mov        [esp+GLeftShift+4], eax
  160.   mov        ebx, 8
  161.   mov        [esp+RRightShift], ebx
  162.   mov        [esp+RRightShift+4], eax
  163.   mov        ebx, 9
  164.   mov        [esp+GRightShift], ebx
  165.   mov        [esp+GRightShift+4], eax
  166.   mov        [esp+BRightShift], ebx
  167.   mov        [esp+BRightShift+4], eax
  168.   movq       mm0, [sixbitu]
  169.   movq       [esp+RUpperLimit], mm0
  170.   movq       mm0, [fivebitu]
  171.   movq       [esp+GUpperLimit], mm0
  172.   movq       [esp+BUpperLimit], mm0
  173.   jmp        RGBEND
  174. RGB565:
  175.   xor        eax, eax
  176.   mov        ebx, 3   ; 8-5
  177.   mov        [esp+RLeftShift], ebx
  178.   mov        [esp+RLeftShift+4], eax
  179.   mov        ebx, 5
  180.   mov        [esp+GLeftShift], ebx
  181.   mov        [esp+GLeftShift+4], eax
  182.   mov        ebx, 9
  183.   mov        [esp+RRightShift], ebx
  184.   mov        [esp+RRightShift+4], eax
  185.   mov        [esp+BRightShift], ebx
  186.   mov        [esp+BRightShift+4], eax
  187.   mov        ebx, 8
  188.   mov        [esp+GRightShift], ebx
  189.   mov        [esp+GRightShift+4], eax
  190.   movq       mm0, [fivebitu]
  191.   movq       [esp+RUpperLimit], mm0
  192.   movq       [esp+BUpperLimit], mm0
  193.   movq       mm0, [sixbitu]
  194.   movq       [esp+GUpperLimit], mm0
  195. ;  jmp        RGBEND
  196. RGBEND:
  197.   mov        ebx, [esp+VPlane]
  198.   mov        ecx, [esp+UPlane]
  199.   sub        ecx, ebx
  200.   mov        [esp+DistanceFromVToU], ecx
  201.   mov        eax, [esp+ColorConvertedFrame]
  202.   add        eax, [esp+DCIOffset]
  203.   add        eax, [esp+CCOffsetToLine0]
  204.   mov        [esp+CCOCursor], eax
  205.   mov ecx,[esp+YPitch]
  206.   mov ebx,[esp+FrameWidth]
  207.   mov eax,[esp+CCOPitch]
  208.   sub        eax, ebx         ; CCOPitch-FrameWidth
  209.   sub        eax, ebx         ; CCOPitch-2*FrameWidth
  210.   sar        ebx, 1           ; FrameWidth/2
  211.   mov esi,[esp+YPlane]           ; Fetch cursor over luma plane.
  212.   mov [esp+ChromaLineLen],ebx    ; FrameWidth/2
  213.   mov [esp+ CCOSkipDistance],eax  ; CCOPitch-3*FrameWidth
  214.   mov [esp+YCursor],esi
  215.   mov edx,[esp+AspectAdjustmentCount]
  216.   mov esi,[esp+VPlane]
  217.   cmp   edx,1
  218.   je    near finish
  219.   mov [esp+AspectCount],edx
  220.   mov [esp+AspectBaseCount],edx
  221.   xor        eax, eax
  222.   mov edi,[esp+ChromaLineLen]
  223.   mov [esp+EndOfChromaLine],edi
  224.   mov edi,[esp+CCOCursor]
  225.   mov edx,[esp+DistanceFromVToU]
  226.   mov ebp,[esp+YCursor]                       ; Fetch Y Pitch.
  227.   mov ebx,[esp+FrameWidth]
  228.   add        ebp, ebx
  229.   mov [esp+tmpYCursorEven],ebp
  230.   mov eax,[esp+YPitch]
  231.   add        ebp, eax
  232.   mov [esp+tmpYCursorOdd],ebp
  233.   sar        ebx, 1
  234.   add        esi, ebx
  235.   add        edx, esi
  236.   neg        ebx
  237.   mov [esp+FrameWidth],ebx
  238. ;  Register Usage:
  239. ;
  240. ;------------------------------------------------------------------------------
  241. PrepareChromaLine:
  242.   mov ebp,[esp+AspectCount]
  243.   mov ebx,[esp+FrameWidth]
  244.   sub    ebp,2
  245.   mov  eax,[esp+CCOPitch]
  246.   mov [esp+tmpCCOPitch],eax
  247.    ja     continue
  248.   xor    eax,eax
  249.   add ebp,[esp+AspectAdjustmentCount]
  250.   mov [esp+tmpCCOPitch],eax
  251. continue:
  252.   mov [esp+AspectCount],ebp
  253. do_next_8x2_block:
  254.   mov ebp,[esp+tmpYCursorEven]
  255. ; here is even line
  256.   movd      mm1, [edx+ebx]         ; 4 u values
  257.   pxor       mm0, mm0               ; mm0=0
  258.   movd      mm2, [esi+ebx]         ; 4 v values
  259.   punpcklbw  mm1, mm0               ; get 4 unsign u
  260.   psubw      mm1, [Minusg]            ; get 4 unsign u-128
  261.   punpcklbw  mm2, mm0               ; get unsign v
  262.   psubw      mm2, [Minusg]            ; get unsign v-128
  263.   movq       mm3, mm1               ; save the u-128 unsign
  264.   movq       mm5, mm1               ; save u-128 unsign
  265.   punpcklwd  mm1, mm2               ; get 2 low u, v unsign pairs
  266.   pmaddwd    mm1, [UVtG]
  267.    punpckhwd  mm3, mm2               ; create high 2 unsign uv pairs
  268.   pmaddwd    mm3, [UVtG]
  269.   movq       [temp_mmx+esp], mm2     ; save v-128
  270.   movq       mm6, [ebp+2*ebx]       ; mm6 has 8 y pixels
  271.   psubusb    mm6, [Yadd]              ; mm6 has 8 y-16 pixels
  272.    packssdw   mm1, mm3               ; packed the results to signed words
  273.   movq       mm7, mm6               ; save the 8 y-16 pixels
  274.    punpcklbw  mm6, mm0               ; mm6 has 4 low y-16 unsign
  275.   pmullw     mm6, [Ymul]
  276.    punpckhbw  mm7, mm0               ; mm7 has 4 high y-16 unsign
  277.   pmullw     mm7, [Ymul]
  278.    movq       mm4, mm1
  279.   movq       [temp_mmx+esp+8], mm1   ; save 4 chroma G values
  280.    punpcklwd  mm1, mm1               ; chroma G replicate low 2
  281.   movq       mm0, mm6               ; low  y
  282.    punpckhwd  mm4, mm4               ; chroma G replicate high 2
  283.   movq       mm3, mm7               ; high y
  284.    psubw      mm6, mm1               ;  4 low G
  285.   psraw      mm6, [esp+GRightShift]
  286.    psubw      mm7, mm4               ; 4 high G values in signed 16 bit
  287.   movq       mm2, mm5
  288.    punpcklwd  mm5, mm5               ; replicate the 2 low u pixels
  289.   pmullw     mm5, [UtB]
  290.    punpckhwd  mm2, mm2
  291.   psraw      mm7, [esp+GRightShift]
  292.    pmullw     mm2, [UtB]
  293.   packuswb   mm6, mm7               ; mm6: G7 G6 G5 G4 G3 G2 G1 G0
  294.   movq       [temp_mmx+esp+16], mm5  ; low chroma B
  295.    paddw      mm5, mm0               ; 4 low B values in signed 16 bit
  296.   movq       [temp_mmx+esp+40], mm2  ; high chroma B
  297.    paddw      mm2, mm3               ; 4 high B values in signed 16 bit
  298.   psraw      mm5, [esp+BRightShift] ; low B scaled down by 6+(8-5)
  299.   psraw      mm2, [esp+BRightShift] ; high B scaled down by 6+(8-5)
  300.   packuswb   mm5, mm2               ; mm5: B7 B6 B5 B4 B3 B2 B1 B0
  301.   movq       mm2, [temp_mmx+esp]     ; 4 v values
  302.    movq       mm1, mm5               ; save B
  303.   movq       mm7, mm2
  304.    punpcklwd  mm2, mm2               ; replicate the 2 low v pixels
  305.   pmullw     mm2, [VtR]
  306.    punpckhwd  mm7, mm7
  307.   pmullw     mm7, [VtR]
  308.   paddusb    mm1, [esp+BUpperLimit] ; mm1: saturate B+0FF-15
  309.   movq       [temp_mmx+esp+24], mm2  ; low chroma R
  310.   paddw      mm2, mm0               ; 4 low R values in signed 16 bit
  311.   psraw      mm2, [esp+RRightShift] ; low R scaled down by 6+(8-5)
  312.    pxor       mm4, mm4               ; mm4=0 for 8->16 conversion
  313.   movq       [temp_mmx+esp+32], mm7  ; high chroma R
  314.    paddw      mm7, mm3               ; 4 high R values in signed 16 bit
  315.   psraw      mm7, [esp+RRightShift] ; high R scaled down by 6+(8-5)
  316.   psubusb    mm1, [esp+BUpperLimit]
  317.    packuswb   mm2, mm7               ; mm2: R7 R6 R5 R4 R3 R2 R1 R0
  318.   paddusb    mm6, [esp+GUpperLimit] ; G fast patch ih
  319.   psubusb    mm6, [esp+GUpperLimit] ; fast patch ih
  320.   paddusb    mm2, [esp+RUpperLimit] ; R
  321.   psubusb    mm2, [esp+RUpperLimit]
  322. ; here we are packing from RGB24 to RGB16
  323. ; input:
  324.        ; mm6: G7 G6 G5 G4 G3 G2 G1 G0
  325.        ; mm1: B7 B6 B5 B4 B3 B2 B1 B0
  326.        ; mm2: R7 R6 R5 R4 R3 R2 R1 R0
  327. ; assuming 8 original pixels in 0-H representation on mm6, mm5, mm2
  328. ; when  H=2**xBITS-1 (x is for R G B)
  329. ; output:
  330. ;        mm1- result: 4 low RGB16
  331. ;        mm7- result: 4 high RGB16
  332. ; using: mm0- zero register
  333. ;        mm3- temporary results
  334. ; algorithm:
  335. ;   for (i=0; i<8; i++) {
  336. ;     RGB[i]=256*(R[i]<<(8-5))+(G[i]<<5)+B[i];
  337. ;   }
  338.   psllq      mm2, [esp+RLeftShift]  ; position R in the most significant part of the byte
  339.    movq       mm7, mm1               ; mm1: Save B
  340. ; note: no need for shift to place B on the least significant part of the byte
  341. ;   R in left position, B in the right position so they can be combined
  342.   punpcklbw  mm1, mm2               ; mm1: 4 low 16 bit RB
  343.    pxor       mm0, mm0               ; mm0: 0
  344.   punpckhbw  mm7, mm2               ; mm5: 4 high 16 bit RB
  345.    movq       mm3, mm6               ; mm3: G
  346.   punpcklbw  mm6, mm0               ; mm6: low 4 G 16 bit
  347.   psllw      mm6, [esp+GLeftShift]  ; shift low G 5 positions
  348.   punpckhbw  mm3, mm0               ; mm3: high 4 G 16 bit
  349.    por        mm1, mm6               ; mm1: low RBG16
  350.   psllw      mm3, [esp+GLeftShift]  ; shift high G 5 positions
  351.   por        mm7, mm3               ; mm5: high RBG16
  352.   mov ebp,[esp+tmpYCursorOdd]          ; moved to here to save cycles before odd line
  353.   movq       [edi], mm1             ; !! aligned
  354. ;- start odd line
  355.   movq       mm1, [ebp+2*ebx]       ; mm1 has 8 y pixels
  356.    pxor       mm2, mm2
  357.   psubusb    mm1, [Yadd]              ; mm1 has 8 pixels y-16
  358.   movq       mm5, mm1
  359.    punpcklbw  mm1, mm2               ; get 4 low y-16 unsign pixels word
  360.   pmullw     mm1, [Ymul]              ; low 4 luminance contribution
  361.    punpckhbw  mm5, mm2               ; 4 high y-16
  362.   pmullw     mm5,  [Ymul]              ; high 4 luminance contribution
  363.   movq       [edi+8], mm7           ; !! aligned
  364.    movq       mm0, mm1
  365.   paddw      mm0, [temp_mmx+esp+24]  ; low 4 R
  366.    movq       mm6, mm5
  367.   psraw      mm0, [esp+RRightShift] ; low R scaled down by 6+(8-5)
  368.   paddw      mm5, [temp_mmx+esp+32]  ; high 4 R
  369.    movq       mm2, mm1
  370.   psraw      mm5, [esp+RRightShift] ; high R scaled down by 6+(8-5)
  371.   paddw      mm2, [temp_mmx+esp+16]  ; low 4 B
  372.    packuswb   mm0, mm5               ; mm0: R7 R6 R5 R4 R3 R2 R1 R0
  373.   psraw      mm2, [esp+BRightShift] ; low B scaled down by 6+(8-5)
  374.    movq       mm5, mm6
  375.   paddw      mm6, [temp_mmx+esp+40]  ; high 4 B
  376.   psraw      mm6, [esp+BRightShift] ; high B scaled down by 6+(8-5)
  377.   movq       mm3, [temp_mmx+esp+8]   ; chroma G  low 4
  378.   packuswb   mm2, mm6               ; mm2: B7 B6 B5 B4 B3 B2 B1 B0
  379.    movq       mm4, mm3
  380.   punpcklwd  mm3, mm3               ; replicate low 2
  381.   punpckhwd  mm4, mm4               ; replicate high 2
  382.    psubw      mm1, mm3               ;  4 low G
  383.   psraw      mm1, [esp+GRightShift] ; low G scaled down by 6+(8-5)
  384.    psubw      mm5, mm4               ;  4 high G values in signed 16 bit
  385.   psraw      mm5, [esp+GRightShift] ; high G scaled down by 6+(8-5)
  386.   paddusb    mm2, [esp+BUpperLimit] ; mm1: saturate B+0FF-15
  387.    packuswb   mm1, mm5               ; mm1: G7 G6 G5 G4 G3 G2 G1 G0
  388.   psubusb    mm2, [esp+BUpperLimit]
  389.   paddusb    mm1, [esp+GUpperLimit] ; G
  390.   psubusb    mm1, [esp+GUpperLimit]
  391.   paddusb    mm0, [esp+RUpperLimit] ; R
  392.   mov eax,[esp+tmpCCOPitch]
  393.   psubusb    mm0, [esp+RUpperLimit]
  394. ; here we are packing from RGB24 to RGB16
  395.        ; mm1: G7 G6 G5 G4 G3 G2 G1 G0
  396.        ; mm2: B7 B6 B5 B4 B3 B2 B1 B0
  397.        ; mm0: R7 R6 R5 R4 R3 R2 R1 R0
  398. ; output:
  399. ;        mm2- result: 4 low RGB16
  400. ;        mm7- result: 4 high RGB16
  401. ; using: mm4- zero register
  402. ;        mm3- temporary results
  403.   psllq       mm0, [esp+RLeftShift] ; position R in the most significant part of the byte
  404.    movq        mm7, mm2              ; mm7: Save B
  405. ; note: no need for shift to place B on the least significant part of the byte
  406. ;   R in left position, B in the right position so they can be combined
  407.   punpcklbw  mm2, mm0               ; mm1: 4 low 16 bit RB
  408.    pxor       mm4, mm4               ; mm4: 0
  409.   movq       mm3, mm1               ; mm3: G
  410.    punpckhbw  mm7, mm0               ; mm7: 4 high 16 bit RB
  411.   punpcklbw  mm1, mm4               ; mm1: low 4 G 16 bit
  412.   punpckhbw  mm3, mm4               ; mm3: high 4 G 16 bit
  413.   psllw      mm1, [esp+GLeftShift]  ; shift low G 5 positions
  414.    por        mm2, mm1               ; mm2: low RBG16
  415.   psllw      mm3, [esp+GLeftShift]  ; shift high G 5 positions
  416.   por        mm7, mm3               ; mm7: high RBG16
  417.   movq       [edi+eax], mm2
  418.   movq       [edi+eax+8], mm7       ; aligned
  419.   add        edi, 16                ; ih take 16 bytes (8 pixels-16 bit)
  420.    add        ebx, 4                 ; ? to take 4 pixels together instead of 2
  421.   jl         near do_next_8x2_block      ; ? update the loop for 8 y pixels at once
  422.   add edi,[esp+CCOSkipDistance]        ; go to begin of next line
  423.   add  edi,[esp+tmpCCOPitch]           ; skip odd line (if it is needed)
  424. ; Leax       AspectCount
  425. ; Lebp       CCOPitch               ; skip odd line
  426. ; sub        eax, 2
  427. ; jg         @f
  428. ; Addeax     AspectBaseCount
  429. ; xor        ebp, ebp
  430. ;@@:
  431. ;  Seax       AspectCount
  432. ;  add        edi, ebp
  433.   mov eax,[esp+YPitch]
  434.   mov ebp,[esp+tmpYCursorOdd]
  435.   add        ebp, eax       ; skip one line
  436. ;  lea        ebp, [ebp+2*eax]       ; skip two lines
  437.   mov [esp+tmpYCursorEven],ebp
  438. ;  Sebp       tmpYCursorOdd
  439.   add        ebp, eax       ; skip one line
  440.   mov [esp+tmpYCursorOdd],ebp
  441. ;  Lebp       tmpYCursorEven
  442. ;  lea        ebp, [ebp+2*eax]
  443. ;  Sebp       tmpYCursorEven
  444.   add esi,[esp+ChromaPitch]
  445.   add edx,[esp+ChromaPitch]
  446. ;  Leax       YLimit                  ; Done with last line?
  447. ;  cmp        ebp, eax
  448. ;  jbe        PrepareChromaLine
  449.    sub      word [esp+FrameHeight],2
  450.    ja       near PrepareChromaLine
  451. ;------------------------------------------------------------------------------
  452. finish:
  453.   emms
  454.   add        esp, LocalFrameSize
  455.   pop        ebx
  456.   pop        ebp
  457.   pop        edi
  458.   pop        esi
  459.   ret