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 Mbaff 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.         mov     (1)     f0.1:w          DualFieldMode:w                 // Check for dual field mode
  50.                
  51.         // Non dual field mode 
  52.  
  53.         // Get (alpha >> 2) + 2
  54.         shr (16) Mbaff_ALPHA2(0,0)<1>   r[ECM_AddrReg, bAlphaTop0_Y]<0;1,0>:ub          2:w                     // alpha >> 2
  55.  
  56.         mov (2) MaskA<1>:uw     r[ECM_AddrReg, wEdgeCntlMapA_ExtTopHorz0]<2;2,1>:uw
  57.  
  58.         // Ext Y
  59.         mov     (16) Mbaff_ALPHA(0,0)<1>        r[ECM_AddrReg, bAlphaTop0_Y]<0;1,0>:ub
  60.         mov     (16) Mbaff_BETA(0,0)<1>         r[ECM_AddrReg, bBetaTop0_Y]<0;1,0>:ub
  61.         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_h00_0_Y]<1;4,0>:ub
  62.  
  63.         add (16) Mbaff_ALPHA2(0,0)<1>           Mbaff_ALPHA2(0,0)<16;16,1>              2:w                                     // alpha2 = (alpha >> 2) + 2  
  64.  
  65.     (f0.0) jmpi H0_Y_DONE                               // Skip Ext Y deblocking
  66.         (f0.1) jmpi     DUAL_FIELD_Y
  67.        
  68.         mov (1) P_AddrReg:w             PREV_MB_Y_BASE:w                { NoDDClr }
  69.         mov (1) Q_AddrReg:w             SRC_MB_Y_BASE:w                 { NoDDChk }
  70.        
  71.         CALL(FILTER_Y_MBAFF, 1)                 // Non dual field deblocking
  72.                
  73.         jmpi    H0_Y_DONE
  74.  
  75. DUAL_FIELD_Y:
  76.         // Dual field mode, FieldModeCurrentMbFlag=0 && FieldModeAboveMbFlag=1
  77.  
  78.         mov (1) P_AddrReg:w             ABOVE_CUR_MB_BASE:w             { NoDDClr }
  79.         mov (1) Q_AddrReg:w             ABOVE_CUR_MB_BASE+64:{ NoDDChk }
  80.  
  81.         //  Must use PREV_MB_YW.  TOP_MB_YW is not big enough.
  82.         // Get top field rows
  83.         mov (16) ABOVE_CUR_MB_YW(0)<1>  PREV_MB_YW(0, 0)<16;8,1>        // Copy p3, p2
  84.         mov (16) ABOVE_CUR_MB_YW(1)<1>  PREV_MB_YW(2, 0)<16;8,1>        // Copy p1, p0
  85.         mov (16) ABOVE_CUR_MB_YW(2)<1>  SRC_YW(0, 0)<16;8,1>            // Copy q0, q1
  86.         mov (16) ABOVE_CUR_MB_YW(3)<1>  SRC_YW(2, 0)<16;8,1>            // Copy q2, q3
  87.  
  88.         CALL(FILTER_Y_MBAFF, 1)                         // Ext Y, top field
  89.  
  90.         // Save deblocked top field rows
  91.         mov (8) PREV_MB_YW(1, 0)<1>             ABOVE_CUR_MB_YW(0, 8)   // Copy p2
  92.         mov (8) PREV_MB_YW(2, 0)<1>             ABOVE_CUR_MB_YW(1, 0)   // Copy p1
  93.         mov (8) PREV_MB_YW(3, 0)<1>             ABOVE_CUR_MB_YW(1, 8)   // Copy p0
  94.         mov (8) SRC_YW(0, 0)<1>                 ABOVE_CUR_MB_YW(2, 0)   // Copy q0
  95.         mov (8) SRC_YW(1, 0)<1>                 ABOVE_CUR_MB_YW(2, 8)   // Copy q1
  96.         mov (8) SRC_YW(2, 0)<1>                 ABOVE_CUR_MB_YW(3, 0)   // Copy q2
  97.  
  98.         //==================================================================================
  99.         // Bottom field
  100.        
  101.         // Get (alpha >> 2) + 2
  102.         shr (16) Mbaff_ALPHA2(0,0)<1>   r[ECM_AddrReg, bAlphaTop1_Y]<0;1,0>:ub          2:w                     // alpha >> 2
  103.  
  104.         mov (1) P_AddrReg:w             ABOVE_CUR_MB_BASE:w             { NoDDClr }
  105.         mov (1) Q_AddrReg:w             ABOVE_CUR_MB_BASE+64:{ NoDDChk }
  106.        
  107.         // Get bot field rows
  108.         mov (16) ABOVE_CUR_MB_YW(0)<1>  PREV_MB_YW(0, 8)<16;8,1>        // Copy p3, p2
  109.         mov (16) ABOVE_CUR_MB_YW(1)<1>  PREV_MB_YW(2, 8)<16;8,1>        // Copy p1, p0
  110.         mov (16) ABOVE_CUR_MB_YW(2)<1>  SRC_YW(0, 8)<16;8,1>            // Copy q0, q1
  111.         mov (16) ABOVE_CUR_MB_YW(3)<1>  SRC_YW(2, 8)<16;8,1>            // Copy q2, q3
  112.  
  113.         mov (2) MaskA<1>:uw     r[ECM_AddrReg, wEdgeCntlMapA_ExtTopHorz1]<2;2,1>:uw
  114.  
  115.         mov     (16) Mbaff_ALPHA(0,0)<1>        r[ECM_AddrReg, bAlphaTop1_Y]<0;1,0>:ub
  116.         mov     (16) Mbaff_BETA(0,0)<1>         r[ECM_AddrReg, bBetaTop1_Y]<0;1,0>:ub
  117.         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_h00_1_Y]<1;4,0>:ub
  118.  
  119.         add (16) Mbaff_ALPHA2(0,0)<1>           Mbaff_ALPHA2(0,0)<16;16,1>              2:w                                     // alpha2 = (alpha >> 2) + 2  
  120.  
  121.         CALL(FILTER_Y_MBAFF, 1)                         // Ext Y, bot field
  122.  
  123.         // Save deblocked top field rows
  124.         mov (8) PREV_MB_YW(1, 8)<1>             ABOVE_CUR_MB_YW(0, 8)   // Copy p2
  125.         mov (8) PREV_MB_YW(2, 8)<1>             ABOVE_CUR_MB_YW(1, 0)   // Copy p1
  126.         mov (8) PREV_MB_YW(3, 8)<1>             ABOVE_CUR_MB_YW(1, 8)   // Copy p0
  127.         mov (8) SRC_YW(0, 8)<1>                 ABOVE_CUR_MB_YW(2, 0)   // Copy q0
  128.         mov (8) SRC_YW(1, 8)<1>                 ABOVE_CUR_MB_YW(2, 8)   // Copy q1
  129.         mov (8) SRC_YW(2, 8)<1>                 ABOVE_CUR_MB_YW(3, 0)   // Copy q2
  130.         //==================================================================================
  131.  
  132. H0_Y_DONE:
  133.  
  134. //BYPASS_H0_Y:
  135. //------------------------------------------------------------------
  136.         // Same alpha, alpha2, beta and MaskB for all internal edges
  137.  
  138.         // Get (alpha >> 2) + 2
  139.         shr (16) Mbaff_ALPHA2(0,0)<1>   r[ECM_AddrReg, bAlphaInternal_Y]<0;1,0>:ub              2:w                     // alpha >> 2
  140.  
  141.         // alpha = bAlphaInternal_Y
  142.         // beta = bBetaInternal_Y
  143.         mov     (16) Mbaff_ALPHA(0,0)<1>        r[ECM_AddrReg, bAlphaInternal_Y]<0;1,0>:ub
  144.         mov     (16) Mbaff_BETA(0,0)<1>         r[ECM_AddrReg, bBetaInternal_Y]<0;1,0>:ub
  145.  
  146.         mov (1) MaskB:uw        0:w                                             // Set MaskB = 0 for all 3 edges, so it always uses bS < 4 algorithm.
  147.  
  148.         add (16) Mbaff_ALPHA2(0,0)<1>           Mbaff_ALPHA2(0,0)<16;16,1>              2:w                                     // alpha2 = (alpha >> 2) + 2  
  149.  
  150. //---------- Deblock Y internal top edge (H1)  ----------
  151.  
  152.         // Bypass deblocking if FilterInternal4x4EdgesFlag = 0  
  153.         and.z.f0.0 (1) null:w   r[ECM_AddrReg, BitFlags]:ub             FilterInternal4x4EdgesFlag:w            // Check for FilterInternal4x4EdgesFlag
  154. //    (f0.0)    jmpi    BYPASS_H1_Y
  155.  
  156.         //      p3 = Cur MB Y row 0 = r[P_AddrReg, 0]<16;16,1>
  157.         //      p2 = Cur MB Y row 1 = r[P_AddrReg, 16]<16;16,1>
  158.         //      p1 = Cur MB Y row 2 = r[P_AddrReg, 32]<16;16,1>
  159.         //      p0 = Cur MB Y row 3 = r[P_AddrReg, 48]<16;16,1>
  160.         //      q0 = Cur MB Y row 4 = r[Q_AddrReg, 0]<16;16,1>
  161.         //      q1 = Cur MB Y row 5 = r[Q_AddrReg, 16]<16;16,1>
  162.         //      q2 = Cur MB Y row 6 = r[Q_AddrReg, 32]<16;16,1>
  163.         //      q3 = Cur MB Y row 7 = r[Q_AddrReg, 48]<16;16,1>
  164.         mov (1) P_AddrReg:w             SRC_MB_Y_BASE:w                                 { NoDDClr }
  165.         mov (1) Q_AddrReg:w             4*Y_ROW_WIDTH+SRC_MB_Y_BASE:w   { NoDDChk }
  166.  
  167.         mov (1) MaskA:uw        r[ECM_AddrReg, wEdgeCntlMap_IntTopHorz]:uw
  168.  
  169.         // tc0 has bTc0_h13_Y + bTc0_h12_Y + bTc0_h11_Y + bTc0_h10_Y           
  170.         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_h10_Y]<1;4,0>:ub
  171.  
  172. //      CALL(FILTER_Y_MBAFF, 1)
  173.         PRED_CALL(-f0.0, FILTER_Y_MBAFF, 1)
  174.  
  175. //BYPASS_H1_Y:
  176. //------------------------------------------------------------------
  177.  
  178.  
  179. //---------- Deblock Y internal mid horizontal edge (H2) ----------
  180.  
  181.         // Bypass deblocking if FilterInternal8x8EdgesFlag = 0  
  182.         and.z.f0.0 (1) null:w   r[ECM_AddrReg, BitFlags]:ub             FilterInternal8x8EdgesFlag:w            // Check for FilterInternal4x4EdgesFlag
  183. //    (f0.0)    jmpi    BYPASS_H2_Y
  184.  
  185.         //      p3 = Cur MB Y row 4  = r[P_AddrReg, 0]<16;16,1>
  186.         //      p2 = Cur MB Y row 5  = r[P_AddrReg, 16]<16;16,1>
  187.         //      p1 = Cur MB Y row 6  = r[P_AddrReg, 32]<16;16,1>
  188.         //      p0 = Cur MB Y row 7  = r[P_AddrReg, 48]<16;16,1>
  189.         //      q0 = Cur MB Y row 8  = r[Q_AddrReg, 0]<16;16,1>
  190.         //      q1 = Cur MB Y row 9  = r[Q_AddrReg, 16]<16;16,1>
  191.         //      q2 = Cur MB Y row 10 = r[Q_AddrReg, 32]<16;16,1>
  192.         //      q3 = Cur MB Y row 11 = r[Q_AddrReg, 48]<16;16,1>
  193.         mov (1) P_AddrReg:w             4*Y_ROW_WIDTH+SRC_MB_Y_BASE:w           { NoDDClr }
  194.         mov (1) Q_AddrReg:w             8*Y_ROW_WIDTH+SRC_MB_Y_BASE:w           { NoDDChk }
  195.  
  196.         mov (1) MaskA:uw        r[ECM_AddrReg, wEdgeCntlMap_IntMidHorz]:uw
  197.  
  198.         // tc0 has bTc0_h23_Y + bTc0_h22_Y + bTc0_h21_Y + bTc0_h20_Y           
  199.         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_h20_Y]<1;4,0>:ub
  200.  
  201. //      CALL(FILTER_Y_MBAFF, 1)
  202.         PRED_CALL(-f0.0, FILTER_Y_MBAFF, 1)
  203.  
  204. //BYPASS_H2_Y:
  205. //-----------------------------------------------
  206.  
  207.  
  208. //---------- Deblock Y internal bottom edge (H3) ----------      
  209.  
  210.         // Bypass deblocking if FilterInternal4x4EdgesFlag = 0  
  211.         and.z.f0.0 (1) null:w   r[ECM_AddrReg, BitFlags]:ub             FilterInternal4x4EdgesFlag:w            // Check for FilterInternal4x4EdgesFlag
  212. //    (f0.0)    jmpi    BYPASS_H3_Y
  213.  
  214.         //      p3 = Cur MB Y row 8  = r[P_AddrReg, 0]<16;16,1>
  215.         //      p2 = Cur MB Y row 9  = r[P_AddrReg, 16]<16;16,1>
  216.         //      p1 = Cur MB Y row 10 = r[P_AddrReg, 32]<16;16,1>
  217.         //      p0 = Cur MB Y row 11 = r[P_AddrReg, 48]<16;16,1>
  218.         //      q0 = Cur MB Y row 12 = r[Q_AddrReg, 0]<16;16,1>
  219.         //      q1 = Cur MB Y row 13 = r[Q_AddrReg, 16]<16;16,1>
  220.         //      q2 = Cur MB Y row 14 = r[Q_AddrReg, 32]<16;16,1>
  221.         //      q3 = Cur MB Y row 15 = r[Q_AddrReg, 48]<16;16,1>
  222.         mov (1) P_AddrReg:w             8*Y_ROW_WIDTH+SRC_MB_Y_BASE:w           { NoDDClr }
  223.         mov (1) Q_AddrReg:w             12*Y_ROW_WIDTH+SRC_MB_Y_BASE:w          { NoDDChk }
  224.        
  225.         mov (1) MaskA:uw        r[ECM_AddrReg, wEdgeCntlMap_IntBotHorz]:uw
  226.  
  227.         // tc0 has bTc0_h33_Y + bTc0_h32_Y + bTc0_h31_Y + bTc0_h30_Y
  228.         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_h30_Y]<1;4,0>:ub
  229.  
  230. //      CALL(FILTER_Y_MBAFF, 1)
  231.         PRED_CALL(-f0.0, FILTER_Y_MBAFF, 1)
  232.  
  233. //BYPASS_H3_Y:
  234. //-----------------------------------------------
  235.