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