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 vertical Y ///////////////////////////////////////////////////////
  10. //
  11. //      This filter code prepares the src data and control data for ILDB filtering on all vertical edges of Y.
  12. //
  13. //      It sssumes the data for vertical de-blocking is already transposed.  
  14. //
  15. //              Luma:
  16. //
  17. //              +-------+-------+-------+-------+
  18. //              |               |               |               |               |
  19. //              |               |               |               |               |
  20. //              |               |               |               |               |
  21. //              +-------+-------+-------+-------+
  22. //              |               |               |               |               |
  23. //              |               |               |               |               |
  24. //              |               |               |               |               |
  25. //              +-------+-------+-------+-------+
  26. //              |               |               |               |               |
  27. //              |               |               |               |               |
  28. //              |               |               |               |               |
  29. //              +-------+-------+-------+-------+
  30. //              |               |               |               |               |
  31. //              |               |               |               |               |
  32. //              |               |               |               |               |
  33. //              +-------+-------+-------+-------+
  34. //
  35. //              V0              V1              V2              V3
  36. //              Edge    Edge    Edge    Edge
  37. //
  38. /////////////////////////////////////////////////////////////////////////////
  39.  
  40. #if defined(_DEBUG)
  41.         mov             (1)             EntrySignatureC:w                       0xBBBB:w
  42. #endif 
  43.        
  44.  
  45. //========== Luma deblocking ==========
  46.  
  47.  
  48. //---------- Deblock Y external left edge (V0) ----------      
  49.  
  50.         // Bypass deblocking if it is left edge of the picture.  
  51.         and.z.f0.0  (1) null:w          r[ECM_AddrReg, BitFlags]:ub             FilterLeftMbEdgeFlag:w          // Check for FilterLeftMbEdgeFlag
  52.  
  53. //      and.z.f0.1 (1)  null:uw         r[ECM_AddrReg, wEdgeCntlMapA_ExtLeftVert0]:uw           0xFFFF:uw       // MaskA = 0?
  54.  
  55.         // Get (alpha >> 2) + 2
  56.         shr (1) alpha2:w                r[ECM_AddrReg, bAlphaLeft0_Y]:ub                2:w                     // alpha >> 2
  57.  
  58.         //      p3 = Prev MB Y row 0 = r[P_AddrReg, 0]<16;16,1>
  59.         //      p2 = Prev MB Y row 1 = r[P_AddrReg, 16]<16;16,1>
  60.         //      p1 = Prev MB Y row 2 = r[P_AddrReg, 32]<16;16,1>
  61.         //      p0 = Prev MB Y row 3 = r[P_AddrReg, 48]<16;16,1>
  62.         //      q0 = Cur MB Y row 0  = r[Q_AddrReg, 0]<16;16,1>
  63.         //      q1 = Cur MB Y row 1  = r[Q_AddrReg, 16]<16;16,1>
  64.         //      q2 = Cur MB Y row 2  = r[Q_AddrReg, 32]<16;16,1>
  65.         //      q3 = Cur MB Y row 3  = r[Q_AddrReg, 48]<16;16,1>
  66.         mov (1) P_AddrReg:w             PREV_MB_Y_BASE:w                { NoDDClr }
  67.         mov (1) Q_AddrReg:w             SRC_MB_Y_BASE:w                 { NoDDChk }
  68.        
  69.         // Get vertical border edge control data  
  70.         // alpha = bAlphaLeft0_Y
  71.         // beta = bBetaLeft0_Y
  72.         mov     (2)     alpha<1>:w      r[ECM_AddrReg, bAlphaLeft0_Y]<2;2,1>:ub                 { NoDDClr }             // 2 channels for alpha and beta
  73.  
  74.         mov (2) MaskA<1>:uw     r[ECM_AddrReg, wEdgeCntlMapA_ExtLeftVert0]<2;2,1>:uw    { NoDDClr, NoDDChk }
  75.        
  76.         // tc0 has bTc0_v30_0_Y | bTc0_v20_0_Y | bTc0_v10_0_Y | bTc0_v00_0_Y
  77.         mov (4) tc0<1>:ub       r[ECM_AddrReg, bTc0_v00_0_Y]<4;4,1>:ub                  { NoDDChk }
  78.  
  79. //      (f0.0)  jmpi    BYPASS_EXT_LEFT_EDGE_Y 
  80. //      (f0.0.anyv)      jmpi   BYPASS_EXT_LEFT_EDGE_Y
  81.                
  82.         add (1) alpha2:w                alpha2:w                2:w                                                             // alpha2 = (alpha >> 2) + 2  
  83.                
  84. //      CALL(FILTER_Y, 1)
  85.         PRED_CALL(-f0.0, FILTER_Y, 1)
  86.  
  87.  
  88. //BYPASS_EXT_LEFT_EDGE_Y:
  89. //------------------------------------------------------------------
  90.         // Same alpha, alpha2, beta and MaskB for all internal edges
  91.  
  92.         // Get (alpha >> 2) + 2
  93.         shr (1) alpha2:w                r[ECM_AddrReg, bAlphaInternal_Y]:ub             2:w                     // alpha >> 2
  94.  
  95.         // alpha = bAlphaInternal_Y
  96.         // beta = bBetaInternal_Y
  97.         mov     (2)     alpha<1>:w      r[ECM_AddrReg, bAlphaInternal_Y]<2;2,1>:ub              { NoDDClr }
  98.  
  99.         // Set MaskB = 0 for all 3 int edges, so it always uses bS < 4 algorithm.
  100.         mov (1) MaskB:uw        0:w                                                                                             { NoDDChk }
  101.  
  102.         add (1) alpha2:w                alpha2:w                2:w                                                             // alpha2 = (alpha >> 2) + 2  
  103.  
  104.  
  105. //---------- Deblock Y internal left edge (V1) ----------
  106.  
  107.         // Bypass deblocking if FilterInternal4x4EdgesFlag = 0  
  108.         and.z.f0.0  (1) null:w          r[ECM_AddrReg, BitFlags]:ub             FilterInternal4x4EdgesFlag:w            // Check for FilterInternal4x4EdgesFlag
  109.  
  110. //      and.z.f0.1 (1)  null:uw         r[ECM_AddrReg, wEdgeCntlMap_IntLeftVert]:uw             0xFFFF:uw       // MaskA = 0?
  111.  
  112.         //      p3 = Cur MB Y row 0 = r[P_AddrReg, 0]<16;16,1>  
  113.         //      p2 = Cur MB Y row 1 = r[P_AddrReg, 16]<16;16,1>
  114.         //      p1 = Cur MB Y row 2 = r[P_AddrReg, 32]<16;16,1>
  115.         //      p0 = Cur MB Y row 3 = r[P_AddrReg, 48]<16;16,1>
  116.         //      q0 = Cur MB Y row 4 = r[Q_AddrReg, 0]<16;16,1>
  117.         //      q1 = Cur MB Y row 5 = r[Q_AddrReg, 16]<16;16,1>
  118.         //      q2 = Cur MB Y row 6 = r[Q_AddrReg, 32]<16;16,1>
  119.         //      q3 = Cur MB Y row 7 = r[Q_AddrReg, 48]<16;16,1>
  120.         mov (1) P_AddrReg:w             SRC_MB_Y_BASE:w                                 { NoDDClr }
  121.         mov (1) Q_AddrReg:w             4*Y_ROW_WIDTH+SRC_MB_Y_BASE:w   { NoDDChk }
  122.        
  123.         mov (1) MaskA:uw        r[ECM_AddrReg, wEdgeCntlMap_IntLeftVert]:uw             { NoDDClr }
  124.  
  125.         // tc0 has bTc0_v31_Y + bTc0_v21_Y + bTc0_v11_Y + bTc0_v01_Y   
  126.         mov (4) tc0<1>:ub       r[ECM_AddrReg, bTc0_v01_Y]<4;4,1>:ub                    { NoDDChk }
  127.  
  128. //    (f0.0)    jmpi    BYPASS_4x4_DEBLOCK_V
  129. //      (f0.0.anyv)      jmpi   BYPASS_4x4_DEBLOCK_V
  130.  
  131. //      CALL(FILTER_Y, 1)
  132.         PRED_CALL(-f0.0, FILTER_Y, 1)
  133.  
  134. //BYPASS_4x4_DEBLOCK_V:
  135. //------------------------------------------------------------------
  136.  
  137.  
  138. //---------- Deblock Y internal mid vert edge (V2) ----------
  139.  
  140.         // Bypass deblocking if FilterInternal8x8EdgesFlag = 0  
  141.         and.z.f0.0      (1)     null:w  r[ECM_AddrReg, BitFlags]:ub             FilterInternal8x8EdgesFlag:w            // Check for FilterInternal4x4EdgesFlag
  142.  
  143. //      and.z.f0.1 (1)  null:uw         r[ECM_AddrReg, wEdgeCntlMap_IntMidVert]:uw              0xFFFF:uw       // MaskA = 0?
  144.  
  145.         //      p3 = Cur MB Y row 4  = r[P_AddrReg, 0]<16;16,1>  
  146.         //      p2 = Cur MB Y row 5  = r[P_AddrReg, 16]<16;16,1>
  147.         //      p1 = Cur MB Y row 6  = r[P_AddrReg, 32]<16;16,1>
  148.         //      p0 = Cur MB Y row 7  = r[P_AddrReg, 48]<16;16,1>
  149.         //      q0 = Cur MB Y row 8  = r[Q_AddrReg, 0]<16;16,1>  
  150.         //      q1 = Cur MB Y row 9  = r[Q_AddrReg, 16]<16;16,1>
  151.         //      q2 = Cur MB Y row 10 = r[Q_AddrReg, 32]<16;16,1>
  152.         //      q3 = Cur MB Y row 11 = r[Q_AddrReg, 48]<16;16,1>
  153.         mov (1) P_AddrReg:w             4*Y_ROW_WIDTH+SRC_MB_Y_BASE:w   { NoDDClr }
  154.         mov (1) Q_AddrReg:w             8*Y_ROW_WIDTH+SRC_MB_Y_BASE:w   { NoDDChk }
  155.  
  156.         mov (1) MaskA:uw        r[ECM_AddrReg, wEdgeCntlMap_IntMidVert]:uw              { NoDDClr }
  157. //      mov (1) MaskB:uw        0:w                                             // Set MaskB = 0, so it always uses bS < 4 algorithm.
  158.  
  159.         // tc0 has bTc0_v32_Y + bTc0_v22_Y + bTc0_v12_Y + bTc0_v02_Y   
  160.         mov (4) tc0<1>:ub       r[ECM_AddrReg, bTc0_v02_Y]<4;4,1>:ub                    { NoDDChk }
  161.  
  162. //    (f0.0)    jmpi    BYPASS_8x8_DEBLOCK_V
  163. //      (f0.0.anyv)      jmpi   BYPASS_8x8_DEBLOCK_V
  164.    
  165. //      CALL(FILTER_Y, 1)
  166.         PRED_CALL(-f0.0, FILTER_Y, 1)
  167.  
  168. //BYPASS_8x8_DEBLOCK_V:
  169. //-----------------------------------------------
  170.  
  171.  
  172. //---------- Deblock Y interal right edge (V3) ----------        
  173.  
  174.         // Bypass deblocking if FilterInternal4x4EdgesFlag = 0  
  175.         and.z.f0.0      (1)     null:w  r[ECM_AddrReg, BitFlags]:ub             FilterInternal4x4EdgesFlag:w            // Check for FilterInternal4x4EdgesFlag
  176.  
  177. //      and.z.f0.1 (1)  null:uw         r[ECM_AddrReg, wEdgeCntlMap_IntRightVert]:uw            0xFFFF:uw       // MaskA = 0?
  178.  
  179.         //      p3 = Cur MB Y row 8  = r[P_AddrReg, 0]<16;16,1>
  180.         //      p2 = Cur MB Y row 9  = r[P_AddrReg, 16]<16;16,1>
  181.         //      p1 = Cur MB Y row 10 = r[P_AddrReg, 32]<16;16,1>
  182.         //      p0 = Cur MB Y row 11 = r[P_AddrReg, 48]<16;16,1>
  183.         //      q0 = Cur MB Y row 12 = r[Q_AddrReg, 0]<16;16,1>
  184.         //      q1 = Cur MB Y row 13 = r[Q_AddrReg, 16]<16;16,1>
  185.         //      q2 = Cur MB Y row 14 = r[Q_AddrReg, 32]<16;16,1>
  186.         //      q3 = Cur MB Y row 15 = r[Q_AddrReg, 48]<16;16,1>
  187.         mov (1) P_AddrReg:w             8*Y_ROW_WIDTH+SRC_MB_Y_BASE:w           { NoDDClr }
  188.         mov (1) Q_AddrReg:w             12*Y_ROW_WIDTH+SRC_MB_Y_BASE:w      { NoDDChk }
  189.  
  190.         mov (1) MaskA:uw        r[ECM_AddrReg, wEdgeCntlMap_IntRightVert]:uw    { NoDDClr }
  191. //      mov (1) MaskB:uw        0:w                                             // Set MaskB = 0, so it always uses bS < 4 algorithm.
  192.  
  193.         // tc0 has bTc0_v33_Y + bTc0_v23_Y + bTc0_v13_Y + bTc0_v03_Y
  194.         mov (4) tc0<1>:ub       r[ECM_AddrReg, bTc0_v03_Y]<4;4,1>:ub                    { NoDDChk }
  195.  
  196. //    (f0.0)    jmpi    BYPASS_4x4_DEBLOCK_V2
  197. //      (f0.0.anyv)      jmpi   BYPASS_4x4_DEBLOCK_V2
  198.    
  199. //      CALL(FILTER_Y, 1)
  200.         PRED_CALL(-f0.0, FILTER_Y, 1)
  201.  
  202. //BYPASS_4x4_DEBLOCK_V2:
  203. //-----------------------------------------------
  204.