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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. ;
  2. ; x86 format converters for HERMES
  3. ; Copyright (c) 1998 Glenn Fielder (gaffer@gaffer.org)
  4. ; This source code is licensed under the GNU LGPL
  5. ; Please refer to the file COPYING.LIB contained in the distribution for
  6. ; licensing conditions
  7. ; Routines adjusted for Hermes by Christian Nentwich (brn@eleet.mcb.at)
  8. ; Used with permission.
  9. BITS 32
  10. GLOBAL _ConvertX86p16_32RGB888
  11. GLOBAL _ConvertX86p16_32BGR888
  12. GLOBAL _ConvertX86p16_32RGBA888
  13. GLOBAL _ConvertX86p16_32BGRA888
  14. GLOBAL _ConvertX86p16_24RGB888
  15. GLOBAL _ConvertX86p16_24BGR888
  16. GLOBAL _ConvertX86p16_16BGR565
  17. GLOBAL _ConvertX86p16_16RGB555
  18. GLOBAL _ConvertX86p16_16BGR555
  19. GLOBAL _ConvertX86p16_8RGB332
  20. EXTERN _ConvertX86
  21. EXTERN _x86return
  22. SECTION .text
  23. _ConvertX86p16_16BGR565:
  24.     ; check short
  25.     cmp ecx,BYTE 16
  26.     ja .L3
  27. .L1 ; short loop
  28.     mov al,[esi]
  29.     mov ah,[esi+1]
  30.     mov ebx,eax
  31.     mov edx,eax
  32.     shr eax,11
  33.     and eax,BYTE 11111b
  34.     and ebx,11111100000b
  35.     shl edx,11
  36.     add eax,ebx
  37.     add eax,edx
  38.     mov [edi],al
  39.     mov [edi+1],ah
  40.     add esi,BYTE 2
  41.     add edi,BYTE 2
  42.     dec ecx
  43.     jnz .L1
  44. .L2
  45.     jmp _x86return
  46. .L3 ; head
  47.     mov eax,edi
  48.     and eax,BYTE 11b
  49.     jz .L4
  50.     mov al,[esi]
  51.     mov ah,[esi+1]
  52.     mov ebx,eax
  53.     mov edx,eax
  54.     shr eax,11
  55.     and eax,BYTE 11111b
  56.     and ebx,11111100000b
  57.     shl edx,11
  58.     add eax,ebx
  59.     add eax,edx
  60.     mov [edi],al
  61.     mov [edi+1],ah
  62.     add esi,BYTE 2
  63.     add edi,BYTE 2
  64.     dec ecx
  65. .L4 ; save count
  66.     push ecx
  67.     ; unroll twice
  68.     shr ecx,1
  69.     
  70.     ; point arrays to end
  71.     lea esi,[esi+ecx*4]
  72.     lea edi,[edi+ecx*4]
  73.     ; negative counter 
  74.     neg ecx
  75.     jmp SHORT .L6
  76.                               
  77. .L5     mov [edi+ecx*4-4],eax
  78. .L6     mov eax,[esi+ecx*4]
  79.         mov ebx,[esi+ecx*4]
  80.         and eax,07E007E0h         
  81.         mov edx,[esi+ecx*4]
  82.         and ebx,0F800F800h
  83.         shr ebx,11
  84.         and edx,001F001Fh
  85.         shl edx,11
  86.         add eax,ebx
  87.         add eax,edx                 
  88.         inc ecx
  89.         jnz .L5                 
  90.          
  91.     mov [edi+ecx*4-4],eax
  92.     ; tail
  93.     pop ecx
  94.     and ecx,BYTE 1
  95.     jz .L7
  96.     mov al,[esi]
  97.     mov ah,[esi+1]
  98.     mov ebx,eax
  99.     mov edx,eax
  100.     shr eax,11
  101.     and eax,BYTE 11111b
  102.     and ebx,11111100000b
  103.     shl edx,11
  104.     add eax,ebx
  105.     add eax,edx
  106.     mov [edi],al
  107.     mov [edi+1],ah
  108.     add esi,BYTE 2
  109.     add edi,BYTE 2
  110. .L7
  111.     jmp _x86return
  112. _ConvertX86p16_16RGB555:
  113.     ; check short
  114.     cmp ecx,BYTE 32
  115.     ja .L3
  116. .L1 ; short loop
  117.     mov al,[esi]
  118.     mov ah,[esi+1]
  119.     mov ebx,eax
  120.     shr ebx,1
  121.     and ebx,     0111111111100000b
  122.     and eax,BYTE 0000000000011111b
  123.     add eax,ebx
  124.     mov [edi],al
  125.     mov [edi+1],ah
  126.     add esi,BYTE 2
  127.     add edi,BYTE 2
  128.     dec ecx
  129.     jnz .L1
  130. .L2
  131.     jmp _x86return
  132. .L3 ; head
  133.     mov eax,edi
  134.     and eax,BYTE 11b
  135.     jz .L4
  136.     mov al,[esi]
  137.     mov ah,[esi+1]
  138.     mov ebx,eax
  139.     shr ebx,1
  140.     and ebx,     0111111111100000b
  141.     and eax,BYTE 0000000000011111b
  142.     add eax,ebx
  143.     mov [edi],al
  144.     mov [edi+1],ah
  145.     add esi,BYTE 2
  146.     add edi,BYTE 2
  147.     dec ecx
  148. .L4 ; save ebp
  149.     push ebp
  150.     ; save count
  151.     push ecx
  152.     ; unroll four times
  153.     shr ecx,2
  154.     
  155.     ; point arrays to end
  156.     lea esi,[esi+ecx*8]
  157.     lea edi,[edi+ecx*8]
  158.     ; negative counter 
  159.     xor ebp,ebp
  160.     sub ebp,ecx
  161. .L5     mov eax,[esi+ebp*8]        ; agi?
  162.         mov ecx,[esi+ebp*8+4]
  163.        
  164.         mov ebx,eax
  165.         mov edx,ecx
  166.         and eax,0FFC0FFC0h
  167.         and ecx,0FFC0FFC0h
  168.         shr eax,1
  169.         and ebx,001F001Fh
  170.         shr ecx,1
  171.         and edx,001F001Fh
  172.         add eax,ebx
  173.         add ecx,edx
  174.         mov [edi+ebp*8],eax
  175.         mov [edi+ebp*8+4],ecx
  176.         inc ebp
  177.         jnz .L5                 
  178.     ; tail
  179.     pop ecx
  180. .L6 and ecx,BYTE 11b
  181.     jz .L7
  182.     mov al,[esi]
  183.     mov ah,[esi+1]
  184.     mov ebx,eax
  185.     shr ebx,1
  186.     and ebx,     0111111111100000b
  187.     and eax,BYTE 0000000000011111b
  188.     add eax,ebx
  189.     mov [edi],al
  190.     mov [edi+1],ah
  191.     add esi,BYTE 2
  192.     add edi,BYTE 2
  193.     dec ecx
  194.     jmp SHORT .L6
  195. .L7 pop ebp
  196.     jmp _x86return
  197. _ConvertX86p16_16BGR555:
  198.     ; check short
  199.     cmp ecx,BYTE 16
  200.     ja .L3
  201. .L1 ; short loop
  202.     mov al,[esi]
  203.     mov ah,[esi+1]
  204.     mov ebx,eax
  205.     mov edx,eax
  206.     shr eax,11
  207.     and eax,BYTE 11111b
  208.     shr ebx,1
  209.     and ebx,1111100000b
  210.     shl edx,10
  211.     and edx,0111110000000000b
  212.     add eax,ebx
  213.     add eax,edx
  214.     mov [edi],al
  215.     mov [edi+1],ah
  216.     add esi,BYTE 2
  217.     add edi,BYTE 2
  218.     dec ecx
  219.     jnz .L1
  220. .L2
  221.     jmp _x86return
  222. .L3 ; head
  223.     mov eax,edi
  224.     and eax,BYTE 11b
  225.     jz .L4
  226.     mov al,[esi]
  227.     mov ah,[esi+1]
  228.     mov ebx,eax
  229.     mov edx,eax
  230.     shr eax,11
  231.     and eax,BYTE 11111b
  232.     shr ebx,1
  233.     and ebx,1111100000b
  234.     shl edx,10
  235.     and edx,0111110000000000b
  236.     add eax,ebx
  237.     add eax,edx
  238.     mov [edi],al
  239.     mov [edi+1],ah
  240.     add esi,BYTE 2
  241.     add edi,BYTE 2
  242.     dec ecx
  243. .L4 ; save count
  244.     push ecx
  245.     ; unroll twice
  246.     shr ecx,1
  247.     
  248.     ; point arrays to end
  249.     lea esi,[esi+ecx*4]
  250.     lea edi,[edi+ecx*4]
  251.     ; negative counter 
  252.     neg ecx
  253.     jmp SHORT .L6
  254.                               
  255. .L5     mov [edi+ecx*4-4],eax
  256. .L6     mov eax,[esi+ecx*4]
  257.         shr eax,1
  258.         mov ebx,[esi+ecx*4]
  259.         
  260.         and eax,03E003E0h         
  261.         mov edx,[esi+ecx*4]
  262.         and ebx,0F800F800h
  263.         shr ebx,11
  264.         and edx,001F001Fh
  265.         shl edx,10
  266.         add eax,ebx
  267.         add eax,edx                 
  268.         inc ecx
  269.         jnz .L5                 
  270.          
  271.     mov [edi+ecx*4-4],eax
  272.     ; tail
  273.     pop ecx
  274.     and ecx,BYTE 1
  275.     jz .L7
  276.     mov al,[esi]
  277.     mov ah,[esi+1]
  278.     mov ebx,eax
  279.     mov edx,eax
  280.     shr eax,11
  281.     and eax,BYTE 11111b
  282.     shr ebx,1
  283.     and ebx,1111100000b
  284.     shl edx,10
  285.     and edx,0111110000000000b
  286.     add eax,ebx
  287.     add eax,edx
  288.     mov [edi],al
  289.     mov [edi+1],ah
  290.     add esi,BYTE 2
  291.     add edi,BYTE 2
  292. .L7
  293.     jmp _x86return
  294. _ConvertX86p16_8RGB332:
  295.     ; check short
  296.     cmp ecx,BYTE 16
  297.     ja .L3
  298. .L1 ; short loop
  299.     mov al,[esi+0]
  300.     mov ah,[esi+1]
  301.     mov ebx,eax
  302.     mov edx,eax
  303.     and eax,BYTE 11000b         ; blue
  304.     shr eax,3
  305.     and ebx,11100000000b        ; green
  306.     shr ebx,6
  307.     and edx,1110000000000000b   ; red
  308.     shr edx,8
  309.     add eax,ebx
  310.     add eax,edx
  311.     mov [edi],al
  312.     add esi,BYTE 2
  313.     inc edi
  314.     dec ecx
  315.     jnz .L1
  316. .L2
  317.     jmp _x86return
  318. .L3 mov eax,edi
  319.     and eax,BYTE 11b
  320.     jz .L4
  321.     mov al,[esi+0]
  322.     mov ah,[esi+1]
  323.     mov ebx,eax
  324.     mov edx,eax
  325.     and eax,BYTE 11000b         ; blue
  326.     shr eax,3
  327.     and ebx,11100000000b        ; green
  328.     shr ebx,6
  329.     and edx,1110000000000000b   ; red
  330.     shr edx,8
  331.     add eax,ebx
  332.     add eax,edx
  333.     mov [edi],al
  334.     add esi,BYTE 2
  335.     inc edi
  336.     dec ecx
  337.     jmp SHORT .L3
  338. .L4 ; save ebp
  339.     push ebp
  340.     ; save count
  341.     push ecx
  342.     ; unroll 4 times
  343.     shr ecx,2
  344.     ; prestep
  345.     mov dl,[esi+0]
  346.     mov bl,[esi+1]
  347.     mov dh,[esi+2]
  348.         
  349. .L5     shl edx,16
  350.         mov bh,[esi+3]
  351.         
  352.         shl ebx,16
  353.         mov dl,[esi+4]
  354.         mov dh,[esi+6]
  355.         mov bl,[esi+5]
  356.         and edx,00011000000110000001100000011000b
  357.         mov bh,[esi+7]
  358.         ror edx,16+3
  359.         mov eax,ebx                                     ; setup eax for reds
  360.         and ebx,00000111000001110000011100000111b
  361.         and eax,11100000111000001110000011100000b       ; reds
  362.         ror ebx,16-2
  363.         add esi,BYTE 8
  364.         ror eax,16
  365.         add edi,BYTE 4
  366.         add eax,ebx
  367.         mov bl,[esi+1]                                  ; greens
  368.         add eax,edx
  369.         mov dl,[esi+0]                                  ; blues
  370.         mov [edi-4],eax
  371.         mov dh,[esi+2]
  372.         dec ecx
  373.         jnz .L5                 
  374.     
  375.     ; check tail
  376.     pop ecx
  377.     and ecx,BYTE 11b
  378.     jz .L7
  379. .L6 ; tail
  380.     mov al,[esi+0]
  381.     mov ah,[esi+1]
  382.     mov ebx,eax
  383.     mov edx,eax
  384.     and eax,BYTE 11000b         ; blue
  385.     shr eax,3
  386.     and ebx,11100000000b        ; green
  387.     shr ebx,6
  388.     and edx,1110000000000000b   ; red
  389.     shr edx,8
  390.     add eax,ebx
  391.     add eax,edx
  392.     mov [edi],al
  393.     add esi,BYTE 2
  394.     inc edi
  395.     dec ecx
  396.     jnz .L6
  397. .L7 pop ebp
  398.     jmp _x86return