Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright © <2010>, Intel Corporation.
  3.  *
  4.  * This program is licensed under the terms and conditions of the
  5.  * Eclipse Public License (EPL), version 1.0.  The full text of the EPL is at
  6.  * http://www.opensource.org/licenses/eclipse-1.0.php.
  7.  *
  8.  */
  9. ////////// AVC ILDB filter horizontal Y ///////////////////////////////////////////////////////
  10. //
  11. //      This filter code prepares the src data and control data for ILDB filtering on all horizontal edges of Y.
  12. //
  13. //      It sssumes the data for horizontal de-blocking is already transposed.  
  14. //
  15. //              Luma:
  16. //
  17. //              +-------+-------+-------+-------+               H0  Edge
  18. //              |               |               |               |               |
  19. //              |               |               |               |               |
  20. //              |               |               |               |               |
  21. //              +-------+-------+-------+-------+               H1 Edge
  22. //              |               |               |               |               |
  23. //              |               |               |               |               |
  24. //              |               |               |               |               |
  25. //              +-------+-------+-------+-------+               H2      Edge
  26. //              |               |               |               |               |
  27. //              |               |               |               |               |
  28. //              |               |               |               |               |
  29. //              +-------+-------+-------+-------+               H3 Edge
  30. //              |               |               |               |               |
  31. //              |               |               |               |               |
  32. //              |               |               |               |               |
  33. //              +-------+-------+-------+-------+
  34. //
  35. /////////////////////////////////////////////////////////////////////////////
  36.  
  37. #if defined(_DEBUG)
  38.         mov             (1)             EntrySignatureC:w                       0xBBBB:w
  39. #endif 
  40.        
  41.  
  42. //========== Luma deblocking ==========
  43.  
  44.  
  45. //---------- Deblock Y external top edge (H0)  ----------      
  46.  
  47.         // Bypass deblocking if it is the top edge of the picture.  
  48.         and.z.f0.0  (1) null:w          r[ECM_AddrReg, BitFlags]:ub             FilterTopMbEdgeFlag:w           // Check for FilterTopMbEdgeFlag
  49.  
  50. //      and.z.f0.1 (1)  null:uw         r[ECM_AddrReg, wEdgeCntlMapA_ExtTopHorz0]:uw            0xFFFF:uw       // MaskA = 0?
  51.  
  52.         // Get (alpha >> 2) + 2
  53.         shr (1) alpha2:w                r[ECM_AddrReg, bAlphaTop0_Y]:ub         2:w                     // alpha >> 2
  54.  
  55.         //      p3 = Prev MB Y row 0 = r[P_AddrReg, 0]<16;16,1>
  56.         //      p2 = Prev MB Y row 1 = r[P_AddrReg, 16]<16;16,1>
  57.         //      p1 = Prev MB Y row 2 = r[P_AddrReg, 32]<16;16,1>
  58.         //      p0 = Prev MB Y row 3 = r[P_AddrReg, 48]<16;16,1>
  59.         //      q0 = Cur MB Y row 0  = r[Q_AddrReg, 0]<16;16,1>
  60.         //      q1 = Cur MB Y row 1  = r[Q_AddrReg, 16]<16;16,1>
  61.         //      q2 = Cur MB Y row 2  = r[Q_AddrReg, 32]<16;16,1>
  62.         //      q3 = Cur MB Y row 3  = r[Q_AddrReg, 48]<16;16,1>
  63. //      mov (1) P_AddrReg:w             PREV_MB_Y_BASE:w                { NoDDClr }
  64.         mov (1) P_AddrReg:w             TOP_MB_Y_BASE:w         { NoDDClr }
  65.         mov (1) Q_AddrReg:w             SRC_MB_Y_BASE:w         { NoDDChk }
  66.        
  67.         // Get horizontal border edge control data
  68.         // alpha = bAlphaTop0_Y
  69.         // beta = bBetaTop0_Y
  70.         mov     (2)     alpha<1>:w      r[ECM_AddrReg, bAlphaTop0_Y]<2;2,1>:ub                  { NoDDClr }             // 2 channels for alpha and beta
  71.        
  72.         mov (2) MaskA<1>:uw     r[ECM_AddrReg, wEdgeCntlMapA_ExtTopHorz0]<2;2,1>:uw             { NoDDClr, NoDDChk }
  73.  
  74.         // tc0 has bTc0_h03_0_Y | bTc0_h02_0_Y | bTc0_h01_0_Y | bTc0_h00_0_Y
  75.         mov (4) tc0<1>:ub       r[ECM_AddrReg, bTc0_h00_0_Y]<4;4,1>:ub                  { NoDDChk }
  76.  
  77. //    (f0.0)    jmpi    BYPASS_EXT_TOP_EDGE_Y  
  78. //      (f0.0.anyv)      jmpi   BYPASS_EXT_TOP_EDGE_Y
  79.        
  80.         add (1) alpha2:w                alpha2:w                2:w                                                             // alpha2 = (alpha >> 2) + 2  
  81.                
  82. //      CALL(FILTER_Y, 1)
  83.         PRED_CALL(-f0.0, FILTER_Y, 1)
  84.  
  85. //BYPASS_EXT_TOP_EDGE_Y:
  86. //------------------------------------------------------------------
  87.         // Same alpha, alpha2, beta and MaskB for all internal edges
  88.  
  89.         // Get (alpha >> 2) + 2
  90.         shr (1) alpha2:w                r[ECM_AddrReg, bAlphaInternal_Y]:ub             2:w                     // alpha >> 2
  91.  
  92.         // alpha = bAlphaInternal_Y
  93.         // beta = bBetaInternal_Y
  94.         mov     (2)     alpha<1>:w      r[ECM_AddrReg, bAlphaInternal_Y]<2;2,1>:ub              { NoDDClr }
  95.  
  96.         // Set MaskB = 0 for all 3 int edges, so it always uses bS < 4 algorithm.
  97.         mov (1) MaskB:uw        0:w                                                                     { NoDDChk }
  98.  
  99.         add (1) alpha2:w                alpha2:w                2:w                                                             // alpha2 = (alpha >> 2) + 2  
  100.                
  101.  
  102. //---------- Deblock Y internal top edge (H1)  ----------
  103.  
  104.         // Bypass deblocking if FilterInternal4x4EdgesFlag = 0  
  105.         and.z.f0.0 (1) null:w   r[ECM_AddrReg, BitFlags]:ub             FilterInternal4x4EdgesFlag:w            // Check for FilterInternal4x4EdgesFlag
  106.  
  107.         //      p3 = Cur MB Y row 0 = r[P_AddrReg, 0]<16;16,1>
  108.         //      p2 = Cur MB Y row 1 = r[P_AddrReg, 16]<16;16,1>
  109.         //      p1 = Cur MB Y row 2 = r[P_AddrReg, 32]<16;16,1>
  110.         //      p0 = Cur MB Y row 3 = r[P_AddrReg, 48]<16;16,1>
  111.         //      q0 = Cur MB Y row 4 = r[Q_AddrReg, 0]<16;16,1>
  112.         //      q1 = Cur MB Y row 5 = r[Q_AddrReg, 16]<16;16,1>
  113.         //      q2 = Cur MB Y row 6 = r[Q_AddrReg, 32]<16;16,1>
  114.         //      q3 = Cur MB Y row 7 = r[Q_AddrReg, 48]<16;16,1>
  115.         mov (1) P_AddrReg:w             SRC_MB_Y_BASE:w                                 { NoDDClr }
  116.         mov (1) Q_AddrReg:w             4*Y_ROW_WIDTH+SRC_MB_Y_BASE:w   { NoDDChk }
  117.  
  118.         mov (1) MaskA:uw        r[ECM_AddrReg, wEdgeCntlMap_IntTopHorz]:uw              { NoDDClr }
  119.        
  120.         // tc0 has bTc0_h13_Y + bTc0_h12_Y + bTc0_h11_Y + bTc0_h10_Y           
  121.         mov (4) tc0<1>:ub       r[ECM_AddrReg, bTc0_h10_Y]<4;4,1>:ub                    { NoDDChk }
  122.  
  123. //    (f0.0)    jmpi    BYPASS_4x4_DEBLOCK_H
  124. //      (f0.0.anyv)      jmpi   BYPASS_4x4_DEBLOCK_H
  125.  
  126. //      CALL(FILTER_Y, 1)
  127.         PRED_CALL(-f0.0, FILTER_Y, 1)
  128.  
  129. //BYPASS_4x4_DEBLOCK_H:
  130. //------------------------------------------------------------------
  131.  
  132.  
  133. //---------- Deblock Y internal mid horizontal edge (H2) ----------
  134.  
  135.         // Bypass deblocking if FilterInternal8x8EdgesFlag = 0  
  136.         and.z.f0.0 (1) null:w   r[ECM_AddrReg, BitFlags]:ub             FilterInternal8x8EdgesFlag:w            // Check for FilterInternal4x4EdgesFlag
  137.  
  138. //      and.z.f0.1 (1)  null:uw         r[ECM_AddrReg, wEdgeCntlMap_IntMidHorz]:uw              0xFFFF:uw       // MaskA = 0?
  139.  
  140.         //      p3 = Cur MB Y row 4  = r[P_AddrReg, 0]<16;16,1>
  141.         //      p2 = Cur MB Y row 5  = r[P_AddrReg, 16]<16;16,1>
  142.         //      p1 = Cur MB Y row 6  = r[P_AddrReg, 32]<16;16,1>
  143.         //      p0 = Cur MB Y row 7  = r[P_AddrReg, 48]<16;16,1>
  144.         //      q0 = Cur MB Y row 8  = r[Q_AddrReg, 0]<16;16,1>
  145.         //      q1 = Cur MB Y row 9  = r[Q_AddrReg, 16]<16;16,1>
  146.         //      q2 = Cur MB Y row 10 = r[Q_AddrReg, 32]<16;16,1>
  147.         //      q3 = Cur MB Y row 11 = r[Q_AddrReg, 48]<16;16,1>
  148.         mov (1) P_AddrReg:w             4*Y_ROW_WIDTH+SRC_MB_Y_BASE:w      { NoDDClr }
  149.         mov (1) Q_AddrReg:w             8*Y_ROW_WIDTH+SRC_MB_Y_BASE:w      { NoDDChk }
  150.  
  151.         mov (1) MaskA:uw        r[ECM_AddrReg, wEdgeCntlMap_IntMidHorz]:uw      { NoDDClr }
  152. //      mov (1) MaskB:uw        0:w                                             // Set MaskB = 0, so it always uses bS < 4 algorithm.
  153.  
  154.         // tc0 has bTc0_h23_Y + bTc0_h22_Y + bTc0_h21_Y + bTc0_h20_Y           
  155.         mov (4) tc0<1>:ub       r[ECM_AddrReg, bTc0_h20_Y]<4;4,1>:ub                    { NoDDChk }
  156.  
  157. //    (f0.0)    jmpi    BYPASS_8x8_DEBLOCK_H
  158. //      (f0.0.anyv)      jmpi   BYPASS_8x8_DEBLOCK_H
  159.    
  160. //      CALL(FILTER_Y, 1)
  161.         PRED_CALL(-f0.0, FILTER_Y, 1)
  162.  
  163. //BYPASS_8x8_DEBLOCK_H:
  164. //-----------------------------------------------
  165.  
  166.  
  167. //---------- Deblock Y internal bottom edge (H3) ----------      
  168.  
  169.         // Bypass deblocking if FilterInternal4x4EdgesFlag = 0  
  170.         and.z.f0.0 (1) null:w   r[ECM_AddrReg, BitFlags]:ub             FilterInternal4x4EdgesFlag:w            // Check for FilterInternal4x4EdgesFlag
  171.  
  172. //      and.z.f0.1 (1)  null:uw         r[ECM_AddrReg, wEdgeCntlMap_IntBotHorz]:uw              0xFFFF:uw       // MaskA = 0?
  173.  
  174.         //      p3 = Cur MB Y row 8  = r[P_AddrReg, 0]<16;16,1>
  175.         //      p2 = Cur MB Y row 9  = r[P_AddrReg, 16]<16;16,1>
  176.         //      p1 = Cur MB Y row 10 = r[P_AddrReg, 32]<16;16,1>
  177.         //      p0 = Cur MB Y row 11 = r[P_AddrReg, 48]<16;16,1>
  178.         //      q0 = Cur MB Y row 12 = r[Q_AddrReg, 0]<16;16,1>
  179.         //      q1 = Cur MB Y row 13 = r[Q_AddrReg, 16]<16;16,1>
  180.         //      q2 = Cur MB Y row 14 = r[Q_AddrReg, 32]<16;16,1>
  181.         //      q3 = Cur MB Y row 15 = r[Q_AddrReg, 48]<16;16,1>
  182.         mov (1) P_AddrReg:w             8*Y_ROW_WIDTH+SRC_MB_Y_BASE:w           { NoDDClr }
  183.         mov (1) Q_AddrReg:w             12*Y_ROW_WIDTH+SRC_MB_Y_BASE:w      { NoDDChk }
  184.  
  185.        
  186.         mov (1) MaskA:uw        r[ECM_AddrReg, wEdgeCntlMap_IntBotHorz]:uw      { NoDDClr }
  187. //      mov (1) MaskB:uw        0:w                                             // Set MaskB = 0, so it always uses bS < 4 algorithm.
  188.  
  189.         // tc0 has bTc0_h33_Y + bTc0_h32_Y + bTc0_h31_Y + bTc0_h30_Y        
  190.         mov (4) tc0<1>:ub       r[ECM_AddrReg, bTc0_h30_Y]<4;4,1>:ub                    { NoDDChk }
  191.  
  192. //    (f0.0)    jmpi    BYPASS_4x4_DEBLOCK_H2
  193. //      (f0.0.anyv)      jmpi   BYPASS_4x4_DEBLOCK_H2
  194.    
  195. //      CALL(FILTER_Y, 1)
  196.         PRED_CALL(-f0.0, FILTER_Y, 1)
  197.  
  198. //BYPASS_4x4_DEBLOCK_H2:
  199. //-----------------------------------------------
  200.