Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * All Video Processing kernels
  3.  * Copyright © <2010>, Intel Corporation.
  4.  *
  5.  * This program is licensed under the terms and conditions of the
  6.  * Eclipse Public License (EPL), version 1.0.  The full text of the EPL is at
  7.  * http://www.opensource.org/licenses/eclipse-1.0.php.
  8.  *
  9.  * Authors:
  10.  *    Halley Zhao <halley.zhao@intel.com>
  11.  */
  12.  
  13. // Module name: YUVX_Save_RGBX_Fix.asm
  14. //----------------------------------------------------------------
  15.  
  16. #include "RGBX_Load_16x8.inc"
  17.  
  18. #if (0)
  19.     #define nTEMP0          34        // transformation coefficient
  20.     #define nTEMP1          35        // one row of R (first half register is used)
  21.     #define nTEMP2          36        // one row of G (first half register is used)
  22.     #define nTEMP3          37        // one row of B (first half register is used)
  23.     #define nTEMP4          38        // mul and add
  24.     #define nTEMP5          39        // mul and add
  25.     #define nTEMP6          40        // mul and add
  26.     #define nTEMP7          41        // mul and add
  27.     #define nTEMP8          42        // sum of mul
  28.     #define nTEMP10         44        
  29.     #define nTEMP10         44        // split ub pixel to word width 1st quarter
  30.     #define nTEMP12         46        // split ub pixel to word width 2nd quarter
  31.     #define nTEMP14         48        // split ub pixel to word width 3rd quarter
  32.     #define nTEMP16         50        // split ub pixel to word width 4th quarter
  33.     #define nTEMP17         51
  34.     #define nTEMP18         52
  35.    
  36.     #define nTEMP24         58        // temp using for repeat U/V in NV12_Load_8x4.asm
  37. #endif
  38.  
  39. #define ONE_ROW_DEBUG                      0
  40.  
  41. #if (ONE_ROW_DEBUG)
  42.     #define ROW_NUM                        0
  43.     #define DBG_ROWNUM_BASE                1
  44.     CHANNEL_2                              2
  45. #else
  46.     #define ROW_NUM                        %1
  47.     $for(0; <nY_NUM_OF_ROWS; 1) {
  48. #endif    
  49.     // C = Y' - 16          D = U - 128         E = V - 128
  50.    add (16)     REG2(r,nTEMP10,0)<1>:w           ubDEST_RGBX(0,ROW_NUM*64   )<0;16,1>           bYUV_OFF<0;4,1>:b
  51.    add (16)     REG2(r,nTEMP12,0)<1>:w           ubDEST_RGBX(0,ROW_NUM*64+16)<0;16,1>           bYUV_OFF<0;4,1>:b
  52.    add (16)     REG2(r,nTEMP14,0)<1>:w           ubDEST_RGBX(0,ROW_NUM*64+32)<0;16,1>           bYUV_OFF<0;4,1>:b
  53.    add (16)     REG2(r,nTEMP16,0)<1>:w           ubDEST_RGBX(0,ROW_NUM*64+48)<0;16,1>           bYUV_OFF<0;4,1>:b
  54.  
  55. #if (ONE_ROW_DEBUG)
  56.    mov (16) ubDEST_RGBX(0,(DBG_ROWNUM_BASE)*64   )<1>  REG2(r,nTEMP10, 0)<0;16,2>:ub
  57.    mov (16) ubDEST_RGBX(0,(DBG_ROWNUM_BASE)*64+16)<1>  REG2(r,nTEMP12, 0)<0;16,2>:ub
  58.    mov (16) ubDEST_RGBX(0,(DBG_ROWNUM_BASE)*64+32)<1>  REG2(r,nTEMP14, 0)<0;16,2>:ub
  59.    mov (16) ubDEST_RGBX(0,(DBG_ROWNUM_BASE)*64+48)<1>  REG2(r,nTEMP16, 0)<0;16,2>:ub
  60. #endif
  61.    
  62.    // |Y|U|V|X|==>|R|G|B|X|  
  63.    // ###### do one row for R
  64.    // #### mul and add
  65.    mul.sat (16)  REG2(r, nTEMP4, 0)<1>:w      REG2(r,nTEMP10,0)<0;16,1>:w        wYUV_to_RGB_CH2_Coef_Fix<0;4,1>:w
  66.    mul.sat (16)  REG2(r, nTEMP5, 0)<1>:w      REG2(r,nTEMP12,0)<0;16,1>:w        wYUV_to_RGB_CH2_Coef_Fix<0;4,1>:w
  67.    mul.sat (16)  REG2(r, nTEMP6, 0)<1>:w      REG2(r,nTEMP14,0)<0;16,1>:w        wYUV_to_RGB_CH2_Coef_Fix<0;4,1>:w
  68.    mul.sat (16)  REG2(r, nTEMP7, 0)<1>:w      REG2(r,nTEMP16,0)<0;16,1>:w        wYUV_to_RGB_CH2_Coef_Fix<0;4,1>:w
  69.  
  70.  #if (ONE_ROW_DEBUG)
  71.    mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+1)*64+CHANNEL_2   )<4>  bYUV_to_RGB_CH2_Coef_Fix<0;8,1>:ub
  72.    mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+1)*64+CHANNEL_2+32)<4>  bYUV_to_RGB_CH2_Coef_Fix<0;8,1>:ub
  73.  
  74.    mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+2)*64+CHANNEL_2   )<4>  REG2(r,nTEMP4, 0)<0;8,1>:ub
  75.    mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+2)*64+CHANNEL_2+32)<4>  REG2(r,nTEMP4, 8)<0;8,1>:ub
  76.  #endif
  77.  
  78.    add.sat (4)   REG2(r, nTEMP4, 0)<4>:uw      REG2(r, nTEMP4, 0)<0;4,4>:w      REG2(r, nTEMP4, 1)<0;4,4>:w      
  79.    add.sat (4)   REG2(r, nTEMP5, 0)<4>:uw      REG2(r, nTEMP5, 0)<0;4,4>:w      REG2(r, nTEMP5, 1)<0;4,4>:w      
  80.    add.sat (4)   REG2(r, nTEMP6, 0)<4>:uw      REG2(r, nTEMP6, 0)<0;4,4>:w      REG2(r, nTEMP6, 1)<0;4,4>:w      
  81.    add.sat (4)   REG2(r, nTEMP7, 0)<4>:uw      REG2(r, nTEMP7, 0)<0;4,4>:w      REG2(r, nTEMP7, 1)<0;4,4>:w      
  82.    add.sat (4)   REG2(r, nTEMP4, 0)<4>:uw      REG2(r, nTEMP4, 0)<0;4,4>:uw      REG2(r, nTEMP4, 2)<0;4,4>:w      
  83.    add.sat (4)   REG2(r, nTEMP5, 0)<4>:uw      REG2(r, nTEMP5, 0)<0;4,4>:uw      REG2(r, nTEMP5, 2)<0;4,4>:w      
  84.    add.sat (4)   REG2(r, nTEMP6, 0)<4>:uw      REG2(r, nTEMP6, 0)<0;4,4>:uw      REG2(r, nTEMP6, 2)<0;4,4>:w      
  85.    add.sat (4)   REG2(r, nTEMP7, 0)<4>:uw      REG2(r, nTEMP7, 0)<0;4,4>:uw      REG2(r, nTEMP7, 2)<0;4,4>:w      
  86.  
  87.    // ####  write one row of R to rnTEMP1
  88.    mov (4)  REG2(r, nTEMP8,  0)<1>:uw    REG2(r, nTEMP4, 0)<0; 4, 4>:uw
  89.    mov (4)  REG2(r, nTEMP8,  4)<1>:uw    REG2(r, nTEMP5, 0)<0; 4, 4>:uw
  90.    mov (4)  REG2(r, nTEMP8,  8)<1>:uw    REG2(r, nTEMP6, 0)<0; 4, 4>:uw
  91.    mov (4)  REG2(r, nTEMP8, 12)<1>:uw    REG2(r, nTEMP7, 0)<0; 4, 4>:uw
  92.  
  93.  #if (ONE_ROW_DEBUG)
  94.    mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+3)*64+CHANNEL_2   )<4>  REG2(r,nTEMP8, 0)<0;8,1>:ub
  95.    mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+3)*64+CHANNEL_2+32)<4>  REG2(r,nTEMP8, 8)<0;8,1>:ub
  96.  #endif    
  97.  
  98.    add.sat (16) REG2(r, nTEMP8,  0)<1>:uw    REG2(r, nTEMP8, 0)<0; 16, 1>:uw    0x80:uw
  99.    shl.sat (16) REG2(r, nTEMP8,  0)<1>:uw    REG2(r, nTEMP8, 0)<0; 16, 1>:uw    1:w
  100.    mov (16) REG2(r, nTEMP1,  0)<1>:ub   REG2(r, nTEMP8, 1)<0; 16, 2>:ub
  101.    
  102.  #if (ONE_ROW_DEBUG)
  103.    mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+4)*64+CHANNEL_2   )<4>  REG2(r,nTEMP8, 0)<0;8,1>:ub
  104.    mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+4)*64+CHANNEL_2+32)<4>  REG2(r,nTEMP8, 8)<0;8,1>:ub
  105.  #endif    
  106.    // ###### do one row for G
  107.    // #### mul and add
  108.    mul.sat (16)  REG2(r, nTEMP4, 0)<1>:w      REG2(r,nTEMP10,0)<0;16,1>:w        wYUV_to_RGB_CH1_Coef_Fix<0;4,1>:w
  109.    mul.sat (16)  REG2(r, nTEMP5, 0)<1>:w      REG2(r,nTEMP12,0)<0;16,1>:w        wYUV_to_RGB_CH1_Coef_Fix<0;4,1>:w
  110.    mul.sat (16)  REG2(r, nTEMP6, 0)<1>:w      REG2(r,nTEMP14,0)<0;16,1>:w        wYUV_to_RGB_CH1_Coef_Fix<0;4,1>:w
  111.    mul.sat (16)  REG2(r, nTEMP7, 0)<1>:w      REG2(r,nTEMP16,0)<0;16,1>:w        wYUV_to_RGB_CH1_Coef_Fix<0;4,1>:w
  112.  
  113.    add.sat (4)   REG2(r, nTEMP4, 0)<4>:uw      REG2(r, nTEMP4, 0)<0;4,4>:w      REG2(r, nTEMP4, 1)<0;4,4>:w      
  114.    add.sat (4)   REG2(r, nTEMP5, 0)<4>:uw      REG2(r, nTEMP5, 0)<0;4,4>:w      REG2(r, nTEMP5, 1)<0;4,4>:w      
  115.    add.sat (4)   REG2(r, nTEMP6, 0)<4>:uw      REG2(r, nTEMP6, 0)<0;4,4>:w      REG2(r, nTEMP6, 1)<0;4,4>:w      
  116.    add.sat (4)   REG2(r, nTEMP7, 0)<4>:uw      REG2(r, nTEMP7, 0)<0;4,4>:w      REG2(r, nTEMP7, 1)<0;4,4>:w      
  117.    add.sat (4)   REG2(r, nTEMP4, 0)<4>:uw      REG2(r, nTEMP4, 0)<0;4,4>:uw      REG2(r, nTEMP4, 2)<0;4,4>:w      
  118.    add.sat (4)   REG2(r, nTEMP5, 0)<4>:uw      REG2(r, nTEMP5, 0)<0;4,4>:uw      REG2(r, nTEMP5, 2)<0;4,4>:w      
  119.    add.sat (4)   REG2(r, nTEMP6, 0)<4>:uw      REG2(r, nTEMP6, 0)<0;4,4>:uw      REG2(r, nTEMP6, 2)<0;4,4>:w      
  120.    add.sat (4)   REG2(r, nTEMP7, 0)<4>:uw      REG2(r, nTEMP7, 0)<0;4,4>:uw      REG2(r, nTEMP7, 2)<0;4,4>:w      
  121.  
  122.    // ####  write one row of G to rnTEMP2
  123.    mov (4)  REG2(r, nTEMP8,  0)<1>:uw    REG2(r, nTEMP4, 0)<0; 4, 4>:uw
  124.    mov (4)  REG2(r, nTEMP8,  4)<1>:uw    REG2(r, nTEMP5, 0)<0; 4, 4>:uw
  125.    mov (4)  REG2(r, nTEMP8,  8)<1>:uw    REG2(r, nTEMP6, 0)<0; 4, 4>:uw
  126.    mov (4)  REG2(r, nTEMP8, 12)<1>:uw    REG2(r, nTEMP7, 0)<0; 4, 4>:uw
  127.    
  128.    add (16) REG2(r, nTEMP8,  0)<1>:uw    REG2(r, nTEMP8, 0)<0; 16, 1>:uw    0x80:uw // saturation
  129.    shl.sat (16) REG2(r, nTEMP8,  0)<1>:uw    REG2(r, nTEMP8, 0)<0; 16, 1>:uw    1:w
  130.    mov (16) REG2(r, nTEMP2,  0)<1>:ub   REG2(r, nTEMP8, 1)<0; 16, 2>:ub
  131.  
  132.    // ###### do one row for B
  133.    // #### mul and add
  134.    mul.sat (16)  REG2(r, nTEMP4, 0)<1>:w      REG2(r,nTEMP10,0)<0;16,1>:w        wYUV_to_RGB_CH0_Coef_Fix<0;4,1>:w
  135.    mul.sat (16)  REG2(r, nTEMP5, 0)<1>:w      REG2(r,nTEMP12,0)<0;16,1>:w        wYUV_to_RGB_CH0_Coef_Fix<0;4,1>:w
  136.    mul.sat (16)  REG2(r, nTEMP6, 0)<1>:w      REG2(r,nTEMP14,0)<0;16,1>:w        wYUV_to_RGB_CH0_Coef_Fix<0;4,1>:w
  137.    mul.sat (16)  REG2(r, nTEMP7, 0)<1>:w      REG2(r,nTEMP16,0)<0;16,1>:w        wYUV_to_RGB_CH0_Coef_Fix<0;4,1>:w
  138.  
  139.    // I had reduced the following add because U coef is zero for B; but in order to support BGR/RGB at the same time, I have to add it back.
  140.    add.sat (4)   REG2(r, nTEMP4, 0)<4>:uw      REG2(r, nTEMP4, 0)<0;4,4>:w      REG2(r, nTEMP4, 1)<0;4,4>:w      
  141.    add.sat (4)   REG2(r, nTEMP5, 0)<4>:uw      REG2(r, nTEMP5, 0)<0;4,4>:w      REG2(r, nTEMP5, 1)<0;4,4>:w      
  142.    add.sat (4)   REG2(r, nTEMP6, 0)<4>:uw      REG2(r, nTEMP6, 0)<0;4,4>:w      REG2(r, nTEMP6, 1)<0;4,4>:w      
  143.    add.sat (4)   REG2(r, nTEMP7, 0)<4>:uw      REG2(r, nTEMP7, 0)<0;4,4>:w      REG2(r, nTEMP7, 1)<0;4,4>:w      
  144.    add.sat (4)   REG2(r, nTEMP4, 0)<4>:uw      REG2(r, nTEMP4, 0)<0;4,4>:uw      REG2(r, nTEMP4, 2)<0;4,4>:w      
  145.    add.sat (4)   REG2(r, nTEMP5, 0)<4>:uw      REG2(r, nTEMP5, 0)<0;4,4>:uw      REG2(r, nTEMP5, 2)<0;4,4>:w      
  146.    add.sat (4)   REG2(r, nTEMP6, 0)<4>:uw      REG2(r, nTEMP6, 0)<0;4,4>:uw      REG2(r, nTEMP6, 2)<0;4,4>:w      
  147.    add.sat (4)   REG2(r, nTEMP7, 0)<4>:uw      REG2(r, nTEMP7, 0)<0;4,4>:uw      REG2(r, nTEMP7, 2)<0;4,4>:w      
  148.  
  149.    // ####  write one row of B to rnTEMP3
  150.    mov (4)  REG2(r, nTEMP8,  0)<1>:uw    REG2(r, nTEMP4, 0)<0; 4, 4>:uw
  151.    mov (4)  REG2(r, nTEMP8,  4)<1>:uw    REG2(r, nTEMP5, 0)<0; 4, 4>:uw
  152.    mov (4)  REG2(r, nTEMP8,  8)<1>:uw    REG2(r, nTEMP6, 0)<0; 4, 4>:uw
  153.    mov (4)  REG2(r, nTEMP8, 12)<1>:uw    REG2(r, nTEMP7, 0)<0; 4, 4>:uw
  154.  
  155.    add.sat (16) REG2(r, nTEMP8,  0)<1>:uw    REG2(r, nTEMP8, 0)<0; 16, 1>:uw    0x80:uw // saturation
  156.    shl.sat (16) REG2(r, nTEMP8,  0)<1>:uw    REG2(r, nTEMP8, 0)<0; 16, 1>:uw    1:w
  157.    mov (16) REG2(r, nTEMP3,  0)<1>:ub   REG2(r, nTEMP8, 1)<0; 16, 2>:ub
  158.  
  159.    // B
  160.    mov (8) ubDEST_RGBX(0,ROW_NUM*64   )<4>  REG2(r,nTEMP3, 0)<0;8,1>:ub
  161.    mov (8) ubDEST_RGBX(0,ROW_NUM*64+32)<4>  REG2(r,nTEMP3, 8)<0;8,1>:ub
  162.    // G
  163.    mov (8) ubDEST_RGBX(0,ROW_NUM*64+1   )<4>  REG2(r,nTEMP2, 0)<0;8,1>:ub
  164.    mov (8) ubDEST_RGBX(0,ROW_NUM*64+1+32)<4>  REG2(r,nTEMP2, 8)<0;8,1>:ub
  165.    // R
  166.    mov (8) ubDEST_RGBX(0,ROW_NUM*64+2   )<4>  REG2(r,nTEMP1, 0)<0;8,1>:ub
  167.    mov (8) ubDEST_RGBX(0,ROW_NUM*64+2+32)<4>  REG2(r,nTEMP1, 8)<0;8,1>:ub
  168. #if (!ONE_ROW_DEBUG)    
  169.    }
  170. #endif
  171.