Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright © <2010>, Intel Corporation.
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the
  6.  * "Software"), to deal in the Software without restriction, including
  7.  * without limitation the rights to use, copy, modify, merge, publish,
  8.  * distribute, sub license, and/or sell copies of the Software, and to
  9.  * permit persons to whom the Software is furnished to do so, subject to
  10.  * the following conditions:
  11.  *
  12.  * The above copyright notice and this permission notice (including the
  13.  * next paragraph) shall be included in all copies or substantial portions
  14.  * of the Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  17.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  18.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  19.  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
  20.  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  21.  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  22.  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  23.  *
  24.  * This file was originally licensed under the following license
  25.  *
  26.  *  Licensed under the Apache License, Version 2.0 (the "License");
  27.  *  you may not use this file except in compliance with the License.
  28.  *  You may obtain a copy of the License at
  29.  *
  30.  *      http://www.apache.org/licenses/LICENSE-2.0
  31.  *
  32.  *  Unless required by applicable law or agreed to in writing, software
  33.  *  distributed under the License is distributed on an "AS IS" BASIS,
  34.  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  35.  *  See the License for the specific language governing permissions and
  36.  *  limitations under the License.
  37.  *
  38.  */
  39. ////////// AVC ILDB filter vertical Mbaff Y ///////////////////////////////////////////////////////
  40. //
  41. //      This filter code prepares the src data and control data for ILDB filtering on all vertical edges of Y.
  42. //
  43. //      It sssumes the data for vertical de-blocking is already transposed.  
  44. //
  45. //              Luma:
  46. //
  47. //              +-------+-------+-------+-------+
  48. //              |               |               |               |               |
  49. //              |               |               |               |               |
  50. //              |               |               |               |               |
  51. //              +-------+-------+-------+-------+
  52. //              |               |               |               |               |
  53. //              |               |               |               |               |
  54. //              |               |               |               |               |
  55. //              +-------+-------+-------+-------+
  56. //              |               |               |               |               |
  57. //              |               |               |               |               |
  58. //              |               |               |               |               |
  59. //              +-------+-------+-------+-------+
  60. //              |               |               |               |               |
  61. //              |               |               |               |               |
  62. //              |               |               |               |               |
  63. //              +-------+-------+-------+-------+
  64. //
  65. //              V0              V1              V2              V3
  66. //              Edge    Edge    Edge    Edge
  67. //
  68. /////////////////////////////////////////////////////////////////////////////
  69.  
  70. #if defined(_DEBUG)
  71.         mov             (1)             EntrySignatureC:w                       0xBBBB:w
  72. #endif 
  73.        
  74.  
  75. //========== Luma deblocking ==========
  76.  
  77.  
  78. //---------- Deblock Y external left edge (V0) ----------      
  79.  
  80.         cmp.z.f0.0      (8)     null:w  VertEdgePattern:uw              LEFT_FIELD_CUR_FRAME:w
  81.         cmp.z.f0.1      (8)     null:w  VertEdgePattern:uw              LEFT_FRAME_CUR_FIELD:w
  82.  
  83.         // Intial set for both are frame or field
  84.         mov     (16) Mbaff_ALPHA(0,0)<1>        r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub
  85.         mov     (16) Mbaff_BETA(0,0)<1>         r[ECM_AddrReg, bBetaLeft0_Y]<0;1,0>:ub
  86.         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_v00_0_Y]<1;4,0>:ub
  87.                
  88.         // For FieldModeCurrentMbFlag=1 && FieldModeLeftMbFlag=0
  89.         (f0.0) mov (8)  Mbaff_ALPHA(0,0)<2>             r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub         { NoDDClr }
  90.         (f0.0) mov (8)  Mbaff_ALPHA(0,1)<2>             r[ECM_AddrReg, bAlphaLeft1_Y]<0;1,0>:ub         { NoDDChk }
  91.         (f0.0) mov (8)  Mbaff_BETA(0,0)<2>              r[ECM_AddrReg, bBetaLeft0_Y]<0;1,0>:ub          { NoDDClr }
  92.         (f0.0) mov (8)  Mbaff_BETA(0,1)<2>              r[ECM_AddrReg, bBetaLeft1_Y]<0;1,0>:ub          { NoDDChk }
  93.         (f0.0) mov (8)  Mbaff_TC0(0,0)<2>               r[ECM_AddrReg, bTc0_v00_0_Y]<1;2,0>:ub          { NoDDClr }
  94.         (f0.0) mov (8)  Mbaff_TC0(0,1)<2>               r[ECM_AddrReg, bTc0_v00_1_Y]<1;2,0>:ub          { NoDDChk }
  95.  
  96.         and.z.f0.0  (1) null:w          r[ECM_AddrReg, BitFlags]:ub             FilterLeftMbEdgeFlag:w          // Check for FilterLeftMbEdgeFlag
  97.  
  98.         // For FieldModeCurrentMbFlag=0 && FieldModeLeftMbFlag=1
  99.         (f0.1) mov (8)  Mbaff_ALPHA(0,0)<1>             r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub         { NoDDClr }
  100.         (f0.1) mov (8)  Mbaff_ALPHA(0,8)<1>             r[ECM_AddrReg, bAlphaLeft1_Y]<0;1,0>:ub         { NoDDChk }
  101.         (f0.1) mov (8)  Mbaff_BETA(0,0)<1>              r[ECM_AddrReg, bBetaLeft0_Y]<0;1,0>:ub          { NoDDClr }
  102.         (f0.1) mov (8)  Mbaff_BETA(0,8)<1>              r[ECM_AddrReg, bBetaLeft1_Y]<0;1,0>:ub          { NoDDChk }
  103.         (f0.1) mov (8)  Mbaff_TC0(0,0)<1>               r[ECM_AddrReg, bTc0_v00_0_Y]<1;2,0>:ub          { NoDDClr }
  104.         (f0.1) mov (8)  Mbaff_TC0(0,8)<1>               r[ECM_AddrReg, bTc0_v00_1_Y]<1;2,0>:ub          { NoDDChk }
  105.  
  106.         // Get (alpha >> 2) + 2
  107.         shr (16) Mbaff_ALPHA2(0,0)<1>   Mbaff_ALPHA(0)          2:w                     // alpha >> 2
  108.  
  109.         //      p3 = Prev MB Y row 0 = r[P_AddrReg, 0]<16;16,1>
  110.         //      p2 = Prev MB Y row 1 = r[P_AddrReg, 16]<16;16,1>
  111.         //      p1 = Prev MB Y row 2 = r[P_AddrReg, 32]<16;16,1>
  112.         //      p0 = Prev MB Y row 3 = r[P_AddrReg, 48]<16;16,1>
  113.         //      q0 = Cur MB Y row 0  = r[Q_AddrReg, 0]<16;16,1>
  114.         //      q1 = Cur MB Y row 1  = r[Q_AddrReg, 16]<16;16,1>
  115.         //      q2 = Cur MB Y row 2  = r[Q_AddrReg, 32]<16;16,1>
  116.         //      q3 = Cur MB Y row 3  = r[Q_AddrReg, 48]<16;16,1>
  117.         mov (1) P_AddrReg:w             PREV_MB_Y_BASE:w        { NoDDClr }
  118.         mov (1) Q_AddrReg:w             SRC_MB_Y_BASE:w         { NoDDChk }
  119.  
  120.         // Set MaskA and MaskB 
  121.         mov (2) MaskA<1>:uw             r[ECM_AddrReg, wEdgeCntlMapA_ExtLeftVert0]<2;2,1>:uw
  122.  
  123.         add (16) Mbaff_ALPHA2(0,0)<1>           Mbaff_ALPHA2(0,0)<16;16,1>              2:w                                     // alpha2 = (alpha >> 2) + 2  
  124.  
  125. //      CALL(FILTER_Y_MBAFF, 1)
  126.         PRED_CALL(-f0.0, FILTER_Y_MBAFF, 1)
  127.        
  128. //BYPASS_V0_Y:
  129. //------------------------------------------------------------------
  130.  
  131.  
  132. /*
  133. //---------- Deblock Y external left edge (V0) ----------      
  134.  
  135.         and.z.f0.0  (1) null:w          r[ECM_AddrReg, BitFlags]:ub             FilterLeftMbEdgeFlag:w          // Check for FilterLeftMbEdgeFlag
  136.     (f0.0)      jmpi    ILDB_LABEL(BYPASS_EXT_LEFT_EDGE_Y)     
  137.  
  138.         // Get vertical border edge control data  
  139.  
  140. //      mov     (1)     f0.0            0:w
  141.         and     (1)     CTemp1_W:uw             r[ECM_AddrReg, BitFlags]:ub             FieldModeLeftMbFlag+FieldModeCurrentMbFlag:uw
  142.         cmp.z.f0.0      (1)     null:w  CTemp1_W:uw             LEFT_FIELD_CUR_FRAME:w
  143.         (-f0.0) jmpi LEFT_EDGE_Y_NEXT1
  144.  
  145.         // For FieldModeCurrentMbFlag=1 && FieldModeLeftMbFlag=0
  146.         mov     (8)     Mbaff_ALPHA(0,0)<2>             r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub         { NoDDClr }
  147.         mov     (8)     Mbaff_ALPHA(0,1)<2>             r[ECM_AddrReg, bAlphaLeft1_Y]<0;1,0>:ub         { NoDDChk }
  148.         mov     (8)     Mbaff_BETA(0,0)<2>              r[ECM_AddrReg, bBetaLeft0_Y]<0;1,0>:ub          { NoDDClr }
  149.         mov     (8)     Mbaff_BETA(0,1)<2>              r[ECM_AddrReg, bBetaLeft1_Y]<0;1,0>:ub          { NoDDChk }
  150.         mov (8) Mbaff_TC0(0,0)<2>               r[ECM_AddrReg, bTc0_v00_0_Y]<1;2,0>:ub          { NoDDClr }
  151.         mov (8) Mbaff_TC0(0,1)<2>               r[ECM_AddrReg, bTc0_v00_1_Y]<1;2,0>:ub          { NoDDChk }
  152.  
  153.         jmpi    LEFT_EDGE_Y_ALPHA_BETA_TC0_SELECTED
  154.  
  155. LEFT_EDGE_Y_NEXT1:
  156.         cmp.z.f0.0      (1)     null:w  CTemp1_W:uw             LEFT_FRAME_CUR_FIELD:w
  157.         (-f0.0) jmpi LEFT_EDGE_Y_NEXT2
  158.  
  159.  
  160.         // For FieldModeCurrentMbFlag=0 && FieldModeLeftMbFlag=1
  161.         mov     (8)     Mbaff_ALPHA(0,0)<1>             r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub         { NoDDClr }
  162.         mov     (8)     Mbaff_ALPHA(0,8)<1>             r[ECM_AddrReg, bAlphaLeft1_Y]<0;1,0>:ub         { NoDDChk }
  163.         mov     (8)     Mbaff_BETA(0,0)<1>              r[ECM_AddrReg, bBetaLeft0_Y]<0;1,0>:ub          { NoDDClr }
  164.         mov     (8)     Mbaff_BETA(0,8)<1>              r[ECM_AddrReg, bBetaLeft1_Y]<0;1,0>:ub          { NoDDChk }
  165.         mov (8) Mbaff_TC0(0,0)<1>               r[ECM_AddrReg, bTc0_v00_0_Y]<1;2,0>:ub          { NoDDClr }
  166.         mov (8) Mbaff_TC0(0,8)<1>               r[ECM_AddrReg, bTc0_v00_1_Y]<1;2,0>:ub          { NoDDChk }
  167.  
  168.         jmpi    LEFT_EDGE_Y_ALPHA_BETA_TC0_SELECTED
  169.        
  170. LEFT_EDGE_Y_NEXT2:
  171.         // both are frame or field
  172.         mov     (16) Mbaff_ALPHA(0,0)<1>        r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub
  173.         mov     (16) Mbaff_BETA(0,0)<1>         r[ECM_AddrReg, bBetaLeft0_Y]<0;1,0>:ub
  174.         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_v00_0_Y]<1;4,0>:ub
  175.  
  176. LEFT_EDGE_Y_ALPHA_BETA_TC0_SELECTED:
  177.  
  178.         mov (2) MaskA<1>:uw             r[ECM_AddrReg, wEdgeCntlMapA_ExtLeftVert0]<2;2,1>:uw
  179.  
  180.         //      p3 = Prev MB Y row 0 = r[P_AddrReg, 0]<16;16,1>
  181.         //      p2 = Prev MB Y row 1 = r[P_AddrReg, 16]<16;16,1>
  182.         //      p1 = Prev MB Y row 2 = r[P_AddrReg, 32]<16;16,1>
  183.         //      p0 = Prev MB Y row 3 = r[P_AddrReg, 48]<16;16,1>
  184.         //      q0 = Cur MB Y row 0  = r[Q_AddrReg, 0]<16;16,1>
  185.         //      q1 = Cur MB Y row 1  = r[Q_AddrReg, 16]<16;16,1>
  186.         //      q2 = Cur MB Y row 2  = r[Q_AddrReg, 32]<16;16,1>
  187.         //      q3 = Cur MB Y row 3  = r[Q_AddrReg, 48]<16;16,1>
  188.         mov (1) P_AddrReg:w             PREV_MB_Y_BASE:w        { NoDDClr }
  189.         mov (1) Q_AddrReg:w             SRC_MB_Y_BASE:w         { NoDDChk }
  190.        
  191.         // Get (alpha >> 2) + 2
  192.         shr (16) Mbaff_ALPHA2(0,0)<1>   r[ECM_AddrReg, bAlphaLeft0_Y]<0;1,0>:ub         2:w                     // alpha >> 2
  193.         add (16) Mbaff_ALPHA2(0,0)<1>           Mbaff_ALPHA2(0,0)<16;16,1>              2:w                                     // alpha2 = (alpha >> 2) + 2  
  194.        
  195.         CALL(FILTER_Y_MBAFF, 1)
  196.  
  197. ILDB_LABEL(BYPASS_EXT_LEFT_EDGE_Y):
  198. //------------------------------------------------------------------
  199. */
  200.  
  201.         // Same alpha, alpha2, beta and MaskB for all internal edges
  202.        
  203.         // Get (alpha >> 2) + 2
  204.         shr (16) Mbaff_ALPHA2(0,0)<1>   r[ECM_AddrReg, bAlphaInternal_Y]<0;1,0>:ub              2:w                     // alpha >> 2
  205.        
  206.         // alpha = bAlphaInternal_Y
  207.         // beta = bBetaInternal_Y
  208.         mov     (16) Mbaff_ALPHA(0,0)<1>        r[ECM_AddrReg, bAlphaInternal_Y]<0;1,0>:ub
  209.         mov     (16) Mbaff_BETA(0,0)<1>         r[ECM_AddrReg, bBetaInternal_Y]<0;1,0>:ub
  210.  
  211.         mov (1) MaskB:uw        0:w                                             // Set MaskB = 0 for all 3 edges, so it always uses bS < 4 algorithm.
  212.  
  213.         add (16) Mbaff_ALPHA2(0,0)<1>           Mbaff_ALPHA2(0,0)<16;16,1>              2:w                                             // alpha2 = (alpha >> 2) + 2  
  214.  
  215. //---------- Deblock Y internal left edge (V1) ----------
  216.  
  217.         // Bypass deblocking if FilterInternal4x4EdgesFlag = 0  
  218.         and.z.f0.0  (1) null:w          r[ECM_AddrReg, BitFlags]:ub             FilterInternal4x4EdgesFlag:w            // Check for FilterInternal4x4EdgesFlag
  219. //    (f0.0)    jmpi    BYPASS_V1_Y
  220.  
  221.         //      p3 = Cur MB Y row 0 = r[P_AddrReg, 0]<16;16,1>  
  222.         //      p2 = Cur MB Y row 1 = r[P_AddrReg, 16]<16;16,1>
  223.         //      p1 = Cur MB Y row 2 = r[P_AddrReg, 32]<16;16,1>
  224.         //      p0 = Cur MB Y row 3 = r[P_AddrReg, 48]<16;16,1>
  225.         //      q0 = Cur MB Y row 4 = r[Q_AddrReg, 0]<16;16,1>
  226.         //      q1 = Cur MB Y row 5 = r[Q_AddrReg, 16]<16;16,1>
  227.         //      q2 = Cur MB Y row 6 = r[Q_AddrReg, 32]<16;16,1>
  228.         //      q3 = Cur MB Y row 7 = r[Q_AddrReg, 48]<16;16,1>
  229.         mov (1) P_AddrReg:w             SRC_MB_Y_BASE:w                                         { NoDDClr }
  230.         mov (1) Q_AddrReg:w             4*Y_ROW_WIDTH+SRC_MB_Y_BASE:w           { NoDDChk }
  231.  
  232.         mov (1) MaskA:uw        r[ECM_AddrReg, wEdgeCntlMap_IntLeftVert]:uw
  233.  
  234.         // tc0 has bTc0_v31_Y + bTc0_v21_Y + bTc0_v11_Y + bTc0_v01_Y   
  235.         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_v01_Y]<1;4,0>:ub
  236.  
  237. //      CALL(FILTER_Y_MBAFF, 1)
  238.         PRED_CALL(-f0.0, FILTER_Y_MBAFF, 1)
  239.  
  240. BYPASS_V1_Y:
  241. //------------------------------------------------------------------
  242.  
  243.  
  244. //---------- Deblock Y internal mid vert edge (V2) ----------
  245.  
  246.         // Bypass deblocking if FilterInternal8x8EdgesFlag = 0  
  247.         and.z.f0.0      (1)     null:w  r[ECM_AddrReg, BitFlags]:ub             FilterInternal8x8EdgesFlag:w            // Check for FilterInternal4x4EdgesFlag
  248. //    (f0.0)    jmpi    BYPASS_V2_Y
  249.  
  250.         //      p3 = Cur MB Y row 4  = r[P_AddrReg, 0]<16;16,1>  
  251.         //      p2 = Cur MB Y row 5  = r[P_AddrReg, 16]<16;16,1>
  252.         //      p1 = Cur MB Y row 6  = r[P_AddrReg, 32]<16;16,1>
  253.         //      p0 = Cur MB Y row 7  = r[P_AddrReg, 48]<16;16,1>
  254.         //      q0 = Cur MB Y row 8  = r[Q_AddrReg, 0]<16;16,1>  
  255.         //      q1 = Cur MB Y row 9  = r[Q_AddrReg, 16]<16;16,1>
  256.         //      q2 = Cur MB Y row 10 = r[Q_AddrReg, 32]<16;16,1>
  257.         //      q3 = Cur MB Y row 11 = r[Q_AddrReg, 48]<16;16,1>
  258.         mov (1) P_AddrReg:w             4*Y_ROW_WIDTH+SRC_MB_Y_BASE:w           { NoDDClr }
  259.         mov (1) Q_AddrReg:w             8*Y_ROW_WIDTH+SRC_MB_Y_BASE:w           { NoDDChk }
  260.  
  261.         mov (1) MaskA:uw        r[ECM_AddrReg, wEdgeCntlMap_IntMidVert]:uw
  262.  
  263.         // tc0 has bTc0_v32_Y + bTc0_v22_Y + bTc0_v12_Y + bTc0_v02_Y   
  264.         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_v02_Y]<1;4,0>:ub
  265.  
  266. //      CALL(FILTER_Y_MBAFF, 1)
  267.         PRED_CALL(-f0.0, FILTER_Y_MBAFF, 1)
  268.  
  269. BYPASS_V2_Y:
  270. //-----------------------------------------------
  271.  
  272.  
  273. //---------- Deblock Y interal right edge (V3) ----------        
  274.  
  275.         // Bypass deblocking if FilterInternal4x4EdgesFlag = 0  
  276.         and.z.f0.0      (1)     null:w  r[ECM_AddrReg, BitFlags]:ub             FilterInternal4x4EdgesFlag:w            // Check for FilterInternal4x4EdgesFlag
  277. //    (f0.0)    jmpi    BYPASS_V3_Y
  278.  
  279.         //      p3 = Cur MB Y row 8  = r[P_AddrReg, 0]<16;16,1>
  280.         //      p2 = Cur MB Y row 9  = r[P_AddrReg, 16]<16;16,1>
  281.         //      p1 = Cur MB Y row 10 = r[P_AddrReg, 32]<16;16,1>
  282.         //      p0 = Cur MB Y row 11 = r[P_AddrReg, 48]<16;16,1>
  283.         //      q0 = Cur MB Y row 12 = r[Q_AddrReg, 0]<16;16,1>
  284.         //      q1 = Cur MB Y row 13 = r[Q_AddrReg, 16]<16;16,1>
  285.         //      q2 = Cur MB Y row 14 = r[Q_AddrReg, 32]<16;16,1>
  286.         //      q3 = Cur MB Y row 15 = r[Q_AddrReg, 48]<16;16,1>
  287.         mov (1) P_AddrReg:w             8*Y_ROW_WIDTH+SRC_MB_Y_BASE:w           { NoDDClr }
  288.         mov (1) Q_AddrReg:w             12*Y_ROW_WIDTH+SRC_MB_Y_BASE:w          { NoDDChk }
  289.        
  290.         mov (1) MaskA:uw        r[ECM_AddrReg, wEdgeCntlMap_IntRightVert]:uw
  291.  
  292.         // tc0 has bTc0_v33_Y + bTc0_v23_Y + bTc0_v13_Y + bTc0_v03_Y
  293.         mov (16) Mbaff_TC0(0,0)<1>              r[ECM_AddrReg, bTc0_v03_Y]<1;4,0>:ub
  294.  
  295. //      CALL(FILTER_Y_MBAFF, 1)
  296.         PRED_CALL(-f0.0, FILTER_Y_MBAFF, 1)
  297.  
  298. BYPASS_V3_Y:
  299. //-----------------------------------------------
  300.