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 LDB filter vertical Mbaff UV ///////////////////////////////////////////////////////
  10. //
  11. //      This filter code prepares the src data and control data for ILDB filtering on all vertical edges of UV.
  12. //
  13. //      It sssumes the data for vertical de-blocking is already transposed.  
  14. //
  15. //              Chroma:
  16. //
  17. //              +-------+-------+
  18. //              |               |               |
  19. //              |               |               |
  20. //              |               |               |
  21. //              +-------+-------+
  22. //              |               |               |
  23. //              |               |               |
  24. //              |               |               |
  25. //              +-------+-------+
  26. //
  27. //              V0              V1             
  28. //              Edge    Edge   
  29. //
  30. /////////////////////////////////////////////////////////////////////////////
  31.  
  32. #if defined(_DEBUG)
  33.         mov             (1)             EntrySignatureC:w                       0xBBBC:w
  34. #endif 
  35.  
  36. //=============== Chroma deblocking ================
  37.  
  38. //---------- Deblock U external left edge ----------
  39.  
  40.         and.z.f0.0  (1) null:w          r[ECM_AddrReg, BitFlags]:ub             FilterLeftMbEdgeFlag:w          // Check for FilterLeftMbEdgeFlag
  41.  
  42.         cmp.z.f0.1      (1)     null:w  VertEdgePattern:uw              LEFT_FIELD_CUR_FRAME:w
  43.  
  44.         // Get Luma maskA and maskB    
  45.         shr (16)        TempRow0(0)<1>          r[ECM_AddrReg, wEdgeCntlMapA_ExtLeftVert0]<0;1,0>:uw            RRampW(0)
  46.         shr (16)        TempRow1(0)<1>          r[ECM_AddrReg, wEdgeCntlMapB_ExtLeftVert0]<0;1,0>:uw            RRampW(0)
  47.        
  48.     (f0.0)      jmpi    BYPASS_V0_UV    // Do not deblock Left ext edge
  49.  
  50.         cmp.z.f0.0      (1)     null:w  VertEdgePattern:uw              LEFT_FRAME_CUR_FIELD:w
  51.  
  52.         (-f0.1) jmpi V0_U_NEXT1 // Jump if not LEFT_FIELD_CUR_FRAME
  53.  
  54.         //----- For LEFT_FIELD_CUR_FRAME
  55.        
  56.         // Extract UV MaskA and MaskB from every other 2 bits of Y masks
  57.         and.nz.f0.0 (8) null:w                  TempRow0(0)<4;2,1>              1:w
  58.         and.nz.f0.1 (8) null:w                  TempRow1(0)<4;2,1>              1:w
  59.  
  60.         // For FieldModeLeftMbFlag=1 && FieldModeCurrentMbFlag=0
  61.         mov     (4)     Mbaff_ALPHA(0,0)<2>             r[ECM_AddrReg, bAlphaLeft0_Cb]<0;1,0>:ub        { NoDDClr }
  62.         mov     (4)     Mbaff_ALPHA(0,1)<2>             r[ECM_AddrReg, bAlphaLeft1_Cb]<0;1,0>:ub        { NoDDChk }
  63.         mov     (4)     Mbaff_BETA(0,0)<2>              r[ECM_AddrReg, bBetaLeft0_Cb]<0;1,0>:ub         { NoDDClr }
  64.         mov     (4)     Mbaff_BETA(0,1)<2>              r[ECM_AddrReg, bBetaLeft1_Cb]<0;1,0>:ub         { NoDDChk }
  65.         mov (4) Mbaff_TC0(0,0)<2>               r[ECM_AddrReg, bTc0_v00_0_Cb]<4;4,1>:ub         { NoDDClr }
  66.         mov (4) Mbaff_TC0(0,1)<2>               r[ECM_AddrReg, bTc0_v00_1_Cb]<4;4,1>:ub         { NoDDChk }
  67.  
  68.         jmpi    V0_U_NEXT3
  69.  
  70. V0_U_NEXT1:
  71.        
  72.         (-f0.0) jmpi V0_U_NEXT2                 // Jump if not LEFT_FRAME_CUR_FIELD
  73.        
  74.         //----- For LEFT_FRAME_CUR_FIELD
  75.                
  76.         // Extract UV MaskA and MaskB from every other bit of Y masks
  77.         and.nz.f0.0 (8) null:w                  TempRow0(0)<16;8,2>             1:w
  78.         and.nz.f0.1 (8) null:w                  TempRow1(0)<16;8,2>             1:w
  79.  
  80.         // For FieldModeLeftMbFlag=0 && FieldModeCurrentMbFlag=1
  81.         mov     (4)     Mbaff_ALPHA(0,0)<1>             r[ECM_AddrReg, bAlphaLeft0_Cb]<0;1,0>:ub        { NoDDClr }
  82.         mov     (4)     Mbaff_ALPHA(0,4)<1>             r[ECM_AddrReg, bAlphaLeft1_Cb]<0;1,0>:ub        { NoDDChk }
  83.         mov     (4)     Mbaff_BETA(0,0)<1>              r[ECM_AddrReg, bBetaLeft0_Cb]<0;1,0>:ub         { NoDDClr }
  84.         mov     (4)     Mbaff_BETA(0,4)<1>              r[ECM_AddrReg, bBetaLeft1_Cb]<0;1,0>:ub         { NoDDChk }
  85.         mov (4) Mbaff_TC0(0,0)<1>               r[ECM_AddrReg, bTc0_v00_0_Cb]<4;4,1>:ub         { NoDDClr }
  86.         mov (4) Mbaff_TC0(0,4)<1>               r[ECM_AddrReg, bTc0_v00_1_Cb]<4;4,1>:ub         { NoDDChk }
  87.  
  88.         jmpi    V0_U_NEXT3
  89.        
  90. V0_U_NEXT2:
  91.  
  92.         // Extract UV MaskA and MaskB from every other bit of Y masks
  93.         and.nz.f0.0 (8) null:w                  TempRow0(0)<16;8,2>             1:w
  94.         and.nz.f0.1 (8) null:w                  TempRow1(0)<16;8,2>             1:w
  95.        
  96.         // Both are frames or fields
  97.         mov     (8) Mbaff_ALPHA(0,0)<1>         r[ECM_AddrReg, bAlphaLeft0_Cb]<0;1,0>:ub
  98.         mov     (8) Mbaff_BETA(0,0)<1>          r[ECM_AddrReg, bBetaLeft0_Cb]<0;1,0>:ub
  99.         mov (8) Mbaff_TC0(0,0)<1>               r[ECM_AddrReg, bTc0_v00_0_Cb]<1;2,0>:ub
  100.  
  101. V0_U_NEXT3:    
  102.  
  103.         //      p1 = Prev MB U row 0
  104.         //      p0 = Prev MB U row 1
  105.         //      q0 = Cur MB U row 0
  106.         //      q1 = Cur MB U row 1
  107.         mov (1) P_AddrReg:w             PREV_MB_U_BASE:w        { NoDDClr }
  108.         mov (1) Q_AddrReg:w             SRC_MB_U_BASE:w         { NoDDChk }
  109.  
  110.         // Store UV MaskA and MaskB
  111.         mov (2)         MaskA<1>:uw                     f0.0<2;2,1>:uw
  112.  
  113.         CALL(FILTER_UV_MBAFF, 1)       
  114. //-----------------------------------------------
  115.  
  116. //---------- Deblock V external left edge ----------
  117.  
  118.         // No change to MaskA and MaskB
  119.  
  120.         cmp.z.f0.0      (4)     null:w  VertEdgePattern:uw              LEFT_FIELD_CUR_FRAME:w
  121.         cmp.z.f0.1      (4)     null:w  VertEdgePattern:uw              LEFT_FRAME_CUR_FIELD:w
  122.  
  123.         // both are frame or field
  124.         mov     (8) Mbaff_ALPHA(0,0)<1>         r[ECM_AddrReg, bAlphaLeft0_Cr]<0;1,0>:ub
  125.         mov     (8) Mbaff_BETA(0,0)<1>          r[ECM_AddrReg, bBetaLeft0_Cr]<0;1,0>:ub
  126.         mov (8) Mbaff_TC0(0,0)<1>               r[ECM_AddrReg, bTc0_v00_0_Cr]<1;2,0>:ub
  127.                                
  128.         //      p1 = Prev MB V row 0
  129.         //      p0 = Prev MB V row 1
  130.         //      q0 = Cur MB V row 0
  131.         //      q1 = Cur MB V row 1
  132.         mov (1) P_AddrReg:w             PREV_MB_V_BASE:w        { NoDDClr }
  133.         mov (1) Q_AddrReg:w             SRC_MB_V_BASE:w         { NoDDChk }
  134.                                
  135.         // For FieldModeLeftMbFlag=1 && FieldModeCurrentMbFlag=0
  136.         (f0.0) mov (4)  Mbaff_ALPHA(0,0)<2>             r[ECM_AddrReg, bAlphaLeft0_Cr]<0;1,0>:ub        { NoDDClr }
  137.         (f0.0) mov (4)  Mbaff_ALPHA(0,1)<2>             r[ECM_AddrReg, bAlphaLeft1_Cr]<0;1,0>:ub        { NoDDChk }    
  138.         (f0.0) mov (4)  Mbaff_BETA(0,0)<2>              r[ECM_AddrReg, bBetaLeft0_Cr]<0;1,0>:ub         { NoDDClr }
  139.         (f0.0) mov (4)  Mbaff_BETA(0,1)<2>              r[ECM_AddrReg, bBetaLeft1_Cr]<0;1,0>:ub         { NoDDChk }
  140.         (f0.0) mov (4)  Mbaff_TC0(0,0)<2>               r[ECM_AddrReg, bTc0_v00_0_Cr]<4;4,1>:ub         { NoDDClr }
  141.         (f0.0) mov (4)  Mbaff_TC0(0,1)<2>               r[ECM_AddrReg, bTc0_v00_1_Cr]<4;4,1>:ub         { NoDDChk }
  142.  
  143.         // For FieldModeLeftMbFlag=0 && FieldModeCurrentMbFlag=1
  144.         (f0.1) mov (4)  Mbaff_ALPHA(0,0)<1>             r[ECM_AddrReg, bAlphaLeft0_Cr]<0;1,0>:ub        { NoDDClr }
  145.         (f0.1) mov (4)  Mbaff_ALPHA(0,4)<1>             r[ECM_AddrReg, bAlphaLeft1_Cr]<0;1,0>:ub        { NoDDChk }
  146.         (f0.1) mov (4)  Mbaff_BETA(0,0)<1>              r[ECM_AddrReg, bBetaLeft0_Cr]<0;1,0>:ub         { NoDDClr }
  147.         (f0.1) mov (4)  Mbaff_BETA(0,4)<1>              r[ECM_AddrReg, bBetaLeft1_Cr]<0;1,0>:ub         { NoDDChk }
  148.         (f0.1) mov (4)  Mbaff_TC0(0,0)<1>               r[ECM_AddrReg, bTc0_v00_0_Cr]<4;4,1>:ub         { NoDDClr }
  149.         (f0.1) mov (4)  Mbaff_TC0(0,4)<1>               r[ECM_AddrReg, bTc0_v00_1_Cr]<4;4,1>:ub         { NoDDChk }
  150.  
  151.         // Set UV MaskA and MaskB
  152.         mov (2)         f0.0<1>:uw              MaskA<2;2,1>:uw
  153.  
  154.         CALL(FILTER_UV_MBAFF, 1)       
  155. //-----------------------------------------------
  156.  
  157. BYPASS_V0_UV:
  158.         // Set EdgeCntlMap2 = 0, so it always uses bS < 4 algorithm.
  159.         // Same alpha and beta for all internal vert and horiz edges
  160.  
  161. //---------- Deblock U internal vert middle edge ----------
  162.  
  163.         //***** Need to take every other bit to form U or V maskA
  164.         shr (16) TempRow0(0)<1>                 r[ECM_AddrReg, wEdgeCntlMap_IntMidVert]<0;1,0>:uw               RRampW(0)
  165.  
  166.         //      p1 = Cur MB U row 2
  167.         //      p0 = Cur MB U row 3
  168.         //      q0 = Cur MB U row 4
  169.         //      q1 = Cur MB U row 5
  170.         mov (1) P_AddrReg:w             4*UV_ROW_WIDTH+SRC_MB_U_BASE:w          { NoDDClr }             // Skip 2 U rows and 2 V rows
  171.         mov (1) Q_AddrReg:w             8*UV_ROW_WIDTH+SRC_MB_U_BASE:w          { NoDDChk }
  172.  
  173.         mov     (8) Mbaff_ALPHA(0,0)<1>         r[ECM_AddrReg, bAlphaInternal_Cb]<0;1,0>:ub
  174.         mov     (8) Mbaff_BETA(0,0)<1>          r[ECM_AddrReg, bBetaInternal_Cb]<0;1,0>:ub
  175.         mov (8) Mbaff_TC0(0,0)<1>               r[ECM_AddrReg, bTc0_v02_Cb]<1;2,0>:ub
  176.  
  177.         and.nz.f0.0 (8) null:w                  TempRow0(0)<16;8,2>             1:w
  178.  
  179.         // Store MaskA and MaskB
  180.         mov (1) f0.1:uw         0:w                    
  181.         mov (1) MaskB:uw        0:w                     { NoDDClr }
  182.         mov (1) MaskA:uw        f0.0:uw         { NoDDChk }
  183.  
  184.         CALL(FILTER_UV_MBAFF, 1)       
  185.        
  186. //-----------------------------------------------
  187.  
  188.  
  189. //---------- Deblock V internal vert middle edge ----------
  190.  
  191.         //      P1 = Cur MB V row 2
  192.         //      P0 = Cur MB V row 3
  193.         //      Q0 = Cur MB V row 4
  194.         //      Q1 = Cur MB V row 5
  195.         mov (1) P_AddrReg:w             4*UV_ROW_WIDTH+SRC_MB_V_BASE:w          { NoDDClr }             // Skip 2 U rows and 2 V rows
  196.         mov (1) Q_AddrReg:w             8*UV_ROW_WIDTH+SRC_MB_V_BASE:w          { NoDDChk }
  197.  
  198.         // Put MaskA into f0.0
  199.         // Put MaskB into f0.1
  200.         mov (2) f0.0<1>:uw              MaskA<2;2,1>:uw
  201.  
  202.         mov     (8) Mbaff_ALPHA(0,0)<1>         r[ECM_AddrReg, bAlphaInternal_Cr]<0;1,0>:ub
  203.         mov     (8) Mbaff_BETA(0,0)<1>          r[ECM_AddrReg, bBetaInternal_Cr]<0;1,0>:ub
  204.         mov (8) Mbaff_TC0(0,0)<1>               r[ECM_AddrReg, bTc0_v02_Cr]<1;2,0>:ub
  205.  
  206.         CALL(FILTER_UV_MBAFF, 1)       
  207.  
  208. //-----------------------------------------------
  209.  
  210.