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 Mbaff 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.         cmp.z.f0.0      (8)     null:w  VertEdgePattern:uw              LEFT_FIELD_CUR_FRAME:w
  51.         cmp.z.f0.1      (8)     null:w  VertEdgePattern:uw              LEFT_FRAME_CUR_FIELD:w
  52.  
  53.         // Intial set for both are frame or field
  54.         mov     (16) Mbaff_ALPHA(0,0)<1>        r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub
  55.         mov     (16) Mbaff_BETA(0,0)<1>         r[ECM_AddrReg, bBetaLeft0_Y]<0;1,0>:ub
  56.         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_v00_0_Y]<1;4,0>:ub
  57.                
  58.         // For FieldModeCurrentMbFlag=1 && FieldModeLeftMbFlag=0
  59.         (f0.0) mov (8)  Mbaff_ALPHA(0,0)<2>             r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub         { NoDDClr }
  60.         (f0.0) mov (8)  Mbaff_ALPHA(0,1)<2>             r[ECM_AddrReg, bAlphaLeft1_Y]<0;1,0>:ub         { NoDDChk }
  61.         (f0.0) mov (8)  Mbaff_BETA(0,0)<2>              r[ECM_AddrReg, bBetaLeft0_Y]<0;1,0>:ub          { NoDDClr }
  62.         (f0.0) mov (8)  Mbaff_BETA(0,1)<2>              r[ECM_AddrReg, bBetaLeft1_Y]<0;1,0>:ub          { NoDDChk }
  63.         (f0.0) mov (8)  Mbaff_TC0(0,0)<2>               r[ECM_AddrReg, bTc0_v00_0_Y]<1;2,0>:ub          { NoDDClr }
  64.         (f0.0) mov (8)  Mbaff_TC0(0,1)<2>               r[ECM_AddrReg, bTc0_v00_1_Y]<1;2,0>:ub          { NoDDChk }
  65.  
  66.         and.z.f0.0  (1) null:w          r[ECM_AddrReg, BitFlags]:ub             FilterLeftMbEdgeFlag:w          // Check for FilterLeftMbEdgeFlag
  67.  
  68.         // For FieldModeCurrentMbFlag=0 && FieldModeLeftMbFlag=1
  69.         (f0.1) mov (8)  Mbaff_ALPHA(0,0)<1>             r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub         { NoDDClr }
  70.         (f0.1) mov (8)  Mbaff_ALPHA(0,8)<1>             r[ECM_AddrReg, bAlphaLeft1_Y]<0;1,0>:ub         { NoDDChk }
  71.         (f0.1) mov (8)  Mbaff_BETA(0,0)<1>              r[ECM_AddrReg, bBetaLeft0_Y]<0;1,0>:ub          { NoDDClr }
  72.         (f0.1) mov (8)  Mbaff_BETA(0,8)<1>              r[ECM_AddrReg, bBetaLeft1_Y]<0;1,0>:ub          { NoDDChk }
  73.         (f0.1) mov (8)  Mbaff_TC0(0,0)<1>               r[ECM_AddrReg, bTc0_v00_0_Y]<1;2,0>:ub          { NoDDClr }
  74.         (f0.1) mov (8)  Mbaff_TC0(0,8)<1>               r[ECM_AddrReg, bTc0_v00_1_Y]<1;2,0>:ub          { NoDDChk }
  75.  
  76.         // Get (alpha >> 2) + 2
  77.         shr (16) Mbaff_ALPHA2(0,0)<1>   Mbaff_ALPHA(0)          2:w                     // alpha >> 2
  78.  
  79.         //      p3 = Prev MB Y row 0 = r[P_AddrReg, 0]<16;16,1>
  80.         //      p2 = Prev MB Y row 1 = r[P_AddrReg, 16]<16;16,1>
  81.         //      p1 = Prev MB Y row 2 = r[P_AddrReg, 32]<16;16,1>
  82.         //      p0 = Prev MB Y row 3 = r[P_AddrReg, 48]<16;16,1>
  83.         //      q0 = Cur MB Y row 0  = r[Q_AddrReg, 0]<16;16,1>
  84.         //      q1 = Cur MB Y row 1  = r[Q_AddrReg, 16]<16;16,1>
  85.         //      q2 = Cur MB Y row 2  = r[Q_AddrReg, 32]<16;16,1>
  86.         //      q3 = Cur MB Y row 3  = r[Q_AddrReg, 48]<16;16,1>
  87.         mov (1) P_AddrReg:w             PREV_MB_Y_BASE:w        { NoDDClr }
  88.         mov (1) Q_AddrReg:w             SRC_MB_Y_BASE:w         { NoDDChk }
  89.  
  90.         // Set MaskA and MaskB 
  91.         mov (2) MaskA<1>:uw             r[ECM_AddrReg, wEdgeCntlMapA_ExtLeftVert0]<2;2,1>:uw
  92.  
  93.         add (16) Mbaff_ALPHA2(0,0)<1>           Mbaff_ALPHA2(0,0)<16;16,1>              2:w                                     // alpha2 = (alpha >> 2) + 2  
  94.  
  95. //      CALL(FILTER_Y_MBAFF, 1)
  96.         PRED_CALL(-f0.0, FILTER_Y_MBAFF, 1)
  97.        
  98. //BYPASS_V0_Y:
  99. //------------------------------------------------------------------
  100.  
  101.  
  102. /*
  103. //---------- Deblock Y external left edge (V0) ----------      
  104.  
  105.         and.z.f0.0  (1) null:w          r[ECM_AddrReg, BitFlags]:ub             FilterLeftMbEdgeFlag:w          // Check for FilterLeftMbEdgeFlag
  106.     (f0.0)      jmpi    ILDB_LABEL(BYPASS_EXT_LEFT_EDGE_Y)     
  107.  
  108.         // Get vertical border edge control data  
  109.  
  110. //      mov     (1)     f0.0            0:w
  111.         and     (1)     CTemp1_W:uw             r[ECM_AddrReg, BitFlags]:ub             FieldModeLeftMbFlag+FieldModeCurrentMbFlag:uw
  112.         cmp.z.f0.0      (1)     null:w  CTemp1_W:uw             LEFT_FIELD_CUR_FRAME:w
  113.         (-f0.0) jmpi LEFT_EDGE_Y_NEXT1
  114.  
  115.         // For FieldModeCurrentMbFlag=1 && FieldModeLeftMbFlag=0
  116.         mov     (8)     Mbaff_ALPHA(0,0)<2>             r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub         { NoDDClr }
  117.         mov     (8)     Mbaff_ALPHA(0,1)<2>             r[ECM_AddrReg, bAlphaLeft1_Y]<0;1,0>:ub         { NoDDChk }
  118.         mov     (8)     Mbaff_BETA(0,0)<2>              r[ECM_AddrReg, bBetaLeft0_Y]<0;1,0>:ub          { NoDDClr }
  119.         mov     (8)     Mbaff_BETA(0,1)<2>              r[ECM_AddrReg, bBetaLeft1_Y]<0;1,0>:ub          { NoDDChk }
  120.         mov (8) Mbaff_TC0(0,0)<2>               r[ECM_AddrReg, bTc0_v00_0_Y]<1;2,0>:ub          { NoDDClr }
  121.         mov (8) Mbaff_TC0(0,1)<2>               r[ECM_AddrReg, bTc0_v00_1_Y]<1;2,0>:ub          { NoDDChk }
  122.  
  123.         jmpi    LEFT_EDGE_Y_ALPHA_BETA_TC0_SELECTED
  124.  
  125. LEFT_EDGE_Y_NEXT1:
  126.         cmp.z.f0.0      (1)     null:w  CTemp1_W:uw             LEFT_FRAME_CUR_FIELD:w
  127.         (-f0.0) jmpi LEFT_EDGE_Y_NEXT2
  128.  
  129.  
  130.         // For FieldModeCurrentMbFlag=0 && FieldModeLeftMbFlag=1
  131.         mov     (8)     Mbaff_ALPHA(0,0)<1>             r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub         { NoDDClr }
  132.         mov     (8)     Mbaff_ALPHA(0,8)<1>             r[ECM_AddrReg, bAlphaLeft1_Y]<0;1,0>:ub         { NoDDChk }
  133.         mov     (8)     Mbaff_BETA(0,0)<1>              r[ECM_AddrReg, bBetaLeft0_Y]<0;1,0>:ub          { NoDDClr }
  134.         mov     (8)     Mbaff_BETA(0,8)<1>              r[ECM_AddrReg, bBetaLeft1_Y]<0;1,0>:ub          { NoDDChk }
  135.         mov (8) Mbaff_TC0(0,0)<1>               r[ECM_AddrReg, bTc0_v00_0_Y]<1;2,0>:ub          { NoDDClr }
  136.         mov (8) Mbaff_TC0(0,8)<1>               r[ECM_AddrReg, bTc0_v00_1_Y]<1;2,0>:ub          { NoDDChk }
  137.  
  138.         jmpi    LEFT_EDGE_Y_ALPHA_BETA_TC0_SELECTED
  139.        
  140. LEFT_EDGE_Y_NEXT2:
  141.         // both are frame or field
  142.         mov     (16) Mbaff_ALPHA(0,0)<1>        r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub
  143.         mov     (16) Mbaff_BETA(0,0)<1>         r[ECM_AddrReg, bBetaLeft0_Y]<0;1,0>:ub
  144.         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_v00_0_Y]<1;4,0>:ub
  145.  
  146. LEFT_EDGE_Y_ALPHA_BETA_TC0_SELECTED:
  147.  
  148.         mov (2) MaskA<1>:uw             r[ECM_AddrReg, wEdgeCntlMapA_ExtLeftVert0]<2;2,1>:uw
  149.  
  150.         //      p3 = Prev MB Y row 0 = r[P_AddrReg, 0]<16;16,1>
  151.         //      p2 = Prev MB Y row 1 = r[P_AddrReg, 16]<16;16,1>
  152.         //      p1 = Prev MB Y row 2 = r[P_AddrReg, 32]<16;16,1>
  153.         //      p0 = Prev MB Y row 3 = r[P_AddrReg, 48]<16;16,1>
  154.         //      q0 = Cur MB Y row 0  = r[Q_AddrReg, 0]<16;16,1>
  155.         //      q1 = Cur MB Y row 1  = r[Q_AddrReg, 16]<16;16,1>
  156.         //      q2 = Cur MB Y row 2  = r[Q_AddrReg, 32]<16;16,1>
  157.         //      q3 = Cur MB Y row 3  = r[Q_AddrReg, 48]<16;16,1>
  158.         mov (1) P_AddrReg:w             PREV_MB_Y_BASE:w        { NoDDClr }
  159.         mov (1) Q_AddrReg:w             SRC_MB_Y_BASE:w         { NoDDChk }
  160.        
  161.         // Get (alpha >> 2) + 2
  162.         shr (16) Mbaff_ALPHA2(0,0)<1>   r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub         2:w                     // alpha >> 2
  163.         add (16) Mbaff_ALPHA2(0,0)<1>           Mbaff_ALPHA2(0,0)<16;16,1>              2:w                                     // alpha2 = (alpha >> 2) + 2  
  164.        
  165.         CALL(FILTER_Y_MBAFF, 1)
  166.  
  167. ILDB_LABEL(BYPASS_EXT_LEFT_EDGE_Y):
  168. //------------------------------------------------------------------
  169. */
  170.  
  171.         // Same alpha, alpha2, beta and MaskB for all internal edges
  172.        
  173.         // Get (alpha >> 2) + 2
  174.         shr (16) Mbaff_ALPHA2(0,0)<1>   r[ECM_AddrReg, bAlphaInternal_Y]<0;1,0>:ub              2:w                     // alpha >> 2
  175.        
  176.         // alpha = bAlphaInternal_Y
  177.         // beta = bBetaInternal_Y
  178.         mov     (16) Mbaff_ALPHA(0,0)<1>        r[ECM_AddrReg, bAlphaInternal_Y]<0;1,0>:ub
  179.         mov     (16) Mbaff_BETA(0,0)<1>         r[ECM_AddrReg, bBetaInternal_Y]<0;1,0>:ub
  180.  
  181.         mov (1) MaskB:uw        0:w                                             // Set MaskB = 0 for all 3 edges, so it always uses bS < 4 algorithm.
  182.  
  183.         add (16) Mbaff_ALPHA2(0,0)<1>           Mbaff_ALPHA2(0,0)<16;16,1>              2:w                                             // alpha2 = (alpha >> 2) + 2  
  184.  
  185. //---------- Deblock Y internal left edge (V1) ----------
  186.  
  187.         // Bypass deblocking if FilterInternal4x4EdgesFlag = 0  
  188.         and.z.f0.0  (1) null:w          r[ECM_AddrReg, BitFlags]:ub             FilterInternal4x4EdgesFlag:w            // Check for FilterInternal4x4EdgesFlag
  189. //    (f0.0)    jmpi    BYPASS_V1_Y
  190.  
  191.         //      p3 = Cur MB Y row 0 = r[P_AddrReg, 0]<16;16,1>  
  192.         //      p2 = Cur MB Y row 1 = r[P_AddrReg, 16]<16;16,1>
  193.         //      p1 = Cur MB Y row 2 = r[P_AddrReg, 32]<16;16,1>
  194.         //      p0 = Cur MB Y row 3 = r[P_AddrReg, 48]<16;16,1>
  195.         //      q0 = Cur MB Y row 4 = r[Q_AddrReg, 0]<16;16,1>
  196.         //      q1 = Cur MB Y row 5 = r[Q_AddrReg, 16]<16;16,1>
  197.         //      q2 = Cur MB Y row 6 = r[Q_AddrReg, 32]<16;16,1>
  198.         //      q3 = Cur MB Y row 7 = r[Q_AddrReg, 48]<16;16,1>
  199.         mov (1) P_AddrReg:w             SRC_MB_Y_BASE:w                                         { NoDDClr }
  200.         mov (1) Q_AddrReg:w             4*Y_ROW_WIDTH+SRC_MB_Y_BASE:w           { NoDDChk }
  201.  
  202.         mov (1) MaskA:uw        r[ECM_AddrReg, wEdgeCntlMap_IntLeftVert]:uw
  203.  
  204.         // tc0 has bTc0_v31_Y + bTc0_v21_Y + bTc0_v11_Y + bTc0_v01_Y   
  205.         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_v01_Y]<1;4,0>:ub
  206.  
  207. //      CALL(FILTER_Y_MBAFF, 1)
  208.         PRED_CALL(-f0.0, FILTER_Y_MBAFF, 1)
  209.  
  210. BYPASS_V1_Y:
  211. //------------------------------------------------------------------
  212.  
  213.  
  214. //---------- Deblock Y internal mid vert edge (V2) ----------
  215.  
  216.         // Bypass deblocking if FilterInternal8x8EdgesFlag = 0  
  217.         and.z.f0.0      (1)     null:w  r[ECM_AddrReg, BitFlags]:ub             FilterInternal8x8EdgesFlag:w            // Check for FilterInternal4x4EdgesFlag
  218. //    (f0.0)    jmpi    BYPASS_V2_Y
  219.  
  220.         //      p3 = Cur MB Y row 4  = r[P_AddrReg, 0]<16;16,1>  
  221.         //      p2 = Cur MB Y row 5  = r[P_AddrReg, 16]<16;16,1>
  222.         //      p1 = Cur MB Y row 6  = r[P_AddrReg, 32]<16;16,1>
  223.         //      p0 = Cur MB Y row 7  = r[P_AddrReg, 48]<16;16,1>
  224.         //      q0 = Cur MB Y row 8  = r[Q_AddrReg, 0]<16;16,1>  
  225.         //      q1 = Cur MB Y row 9  = r[Q_AddrReg, 16]<16;16,1>
  226.         //      q2 = Cur MB Y row 10 = r[Q_AddrReg, 32]<16;16,1>
  227.         //      q3 = Cur MB Y row 11 = r[Q_AddrReg, 48]<16;16,1>
  228.         mov (1) P_AddrReg:w             4*Y_ROW_WIDTH+SRC_MB_Y_BASE:w           { NoDDClr }
  229.         mov (1) Q_AddrReg:w             8*Y_ROW_WIDTH+SRC_MB_Y_BASE:w           { NoDDChk }
  230.  
  231.         mov (1) MaskA:uw        r[ECM_AddrReg, wEdgeCntlMap_IntMidVert]:uw
  232.  
  233.         // tc0 has bTc0_v32_Y + bTc0_v22_Y + bTc0_v12_Y + bTc0_v02_Y   
  234.         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_v02_Y]<1;4,0>:ub
  235.  
  236. //      CALL(FILTER_Y_MBAFF, 1)
  237.         PRED_CALL(-f0.0, FILTER_Y_MBAFF, 1)
  238.  
  239. BYPASS_V2_Y:
  240. //-----------------------------------------------
  241.  
  242.  
  243. //---------- Deblock Y interal right edge (V3) ----------        
  244.  
  245.         // Bypass deblocking if FilterInternal4x4EdgesFlag = 0  
  246.         and.z.f0.0      (1)     null:w  r[ECM_AddrReg, BitFlags]:ub             FilterInternal4x4EdgesFlag:w            // Check for FilterInternal4x4EdgesFlag
  247. //    (f0.0)    jmpi    BYPASS_V3_Y
  248.  
  249.         //      p3 = Cur MB Y row 8  = r[P_AddrReg, 0]<16;16,1>
  250.         //      p2 = Cur MB Y row 9  = r[P_AddrReg, 16]<16;16,1>
  251.         //      p1 = Cur MB Y row 10 = r[P_AddrReg, 32]<16;16,1>
  252.         //      p0 = Cur MB Y row 11 = r[P_AddrReg, 48]<16;16,1>
  253.         //      q0 = Cur MB Y row 12 = r[Q_AddrReg, 0]<16;16,1>
  254.         //      q1 = Cur MB Y row 13 = r[Q_AddrReg, 16]<16;16,1>
  255.         //      q2 = Cur MB Y row 14 = r[Q_AddrReg, 32]<16;16,1>
  256.         //      q3 = Cur MB Y row 15 = r[Q_AddrReg, 48]<16;16,1>
  257.         mov (1) P_AddrReg:w             8*Y_ROW_WIDTH+SRC_MB_Y_BASE:w           { NoDDClr }
  258.         mov (1) Q_AddrReg:w             12*Y_ROW_WIDTH+SRC_MB_Y_BASE:w          { NoDDChk }
  259.        
  260.         mov (1) MaskA:uw        r[ECM_AddrReg, wEdgeCntlMap_IntRightVert]:uw
  261.  
  262.         // tc0 has bTc0_v33_Y + bTc0_v23_Y + bTc0_v13_Y + bTc0_v03_Y
  263.         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_v03_Y]<1;4,0>:ub
  264.  
  265. //      CALL(FILTER_Y_MBAFF, 1)
  266.         PRED_CALL(-f0.0, FILTER_Y_MBAFF, 1)
  267.  
  268. BYPASS_V3_Y:
  269. //-----------------------------------------------
  270.