1 | /* The copyright in this software is being made available under the BSD |
---|
2 | * License, included below. This software may be subject to other third party |
---|
3 | * and contributor rights, including patent rights, and no such rights are |
---|
4 | * granted under this license. |
---|
5 | * |
---|
6 | * Copyright (c) 2010-2011, ISO/IEC |
---|
7 | * All rights reserved. |
---|
8 | * |
---|
9 | * Redistribution and use in source and binary forms, with or without |
---|
10 | * modification, are permitted provided that the following conditions are met: |
---|
11 | * |
---|
12 | * * Redistributions of source code must retain the above copyright notice, |
---|
13 | * this list of conditions and the following disclaimer. |
---|
14 | * * Redistributions in binary form must reproduce the above copyright notice, |
---|
15 | * this list of conditions and the following disclaimer in the documentation |
---|
16 | * and/or other materials provided with the distribution. |
---|
17 | * * Neither the name of the ISO/IEC nor the names of its contributors may |
---|
18 | * be used to endorse or promote products derived from this software without |
---|
19 | * specific prior written permission. |
---|
20 | * |
---|
21 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
---|
22 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
---|
23 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
---|
24 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS |
---|
25 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
---|
26 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
---|
27 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
---|
28 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
---|
29 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
---|
30 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
---|
31 | * THE POSSIBILITY OF SUCH DAMAGE. |
---|
32 | */ |
---|
33 | |
---|
34 | |
---|
35 | |
---|
36 | #ifndef __TRENFILTER__ |
---|
37 | #define __TRENFILTER__ |
---|
38 | |
---|
39 | #include "TLibCommon/CommonDef.h" |
---|
40 | #include "TRenImage.h" |
---|
41 | #include "TRenInterpFilter.h" |
---|
42 | |
---|
43 | typedef Int (TRenInterpFilter::*FpChromaIntFilt) ( Pel*, Int ); |
---|
44 | |
---|
45 | class TRenFilter |
---|
46 | { |
---|
47 | public: |
---|
48 | |
---|
49 | /////////// Helpers //////// |
---|
50 | static Void setSubPelShiftLUT ( Int iLutPrec, Int** piSubPelShiftLUT, Int iShift ); |
---|
51 | static Void setupZLUT ( Bool bBlendUseDistWeight, Int iBlendZThresPerc, Int iRelDistToLeft, Int** ppiBaseShiftLUTLeft, Int** ppiBaseShiftLUTRight, Int& riBlendZThres, Int& riBlendDistWeight, Int* piInvZLUTLeft, Int* piInvZLUTRight ); |
---|
52 | static Void filledToUsedPelMap( PelImage* pcFilledImage, PelImage* pcUsedPelsImage, Int iUsedPelMapMarExt ); |
---|
53 | |
---|
54 | /////////// Copy /////////// |
---|
55 | static Void copy( Pel* pcInputPlaneData, Int iInputStride, Int iWidth, Int iHeight, Pel* pcOutputPlaneData, Int iOutputStride); |
---|
56 | |
---|
57 | /////////// Horizontal Mirroring /////////// |
---|
58 | template <typename T> static Void mirrorHor( TRenImage<T> *pcInputImage ); |
---|
59 | //Plane |
---|
60 | template <typename T> static Void mirrorHor( TRenImagePlane<T> *pcImagePlane ); |
---|
61 | |
---|
62 | /////////// Comparison /////////// |
---|
63 | |
---|
64 | static Int64 SSE ( PelImagePlane* pcInputPlane1, PelImagePlane* pcInputPlane2 ); |
---|
65 | static Int64 SSE ( Pel* piSrc1, Int iSrcStride1, Int iWidth, Int iHeight, Pel* piSrc2, Int iSrcStride2 ); |
---|
66 | |
---|
67 | template <typename T> static Bool compare (TRenImage<T> *pcInputImage1 , TRenImage<T> *pcInputImage2); |
---|
68 | //Plane |
---|
69 | template <typename T> static Bool compare (TRenImagePlane<T>* pcInputPlane1, TRenImagePlane<T>* pcInputPlane2 ); |
---|
70 | |
---|
71 | /////////// other Filters /////////// |
---|
72 | static Void binominal ( PelImage* pcInputImage, PelImage* pcOutputPlane, UInt uiSize); |
---|
73 | static Void binominal ( PelImagePlane* pcInputPlane, PelImagePlane* pcOutputPlane, UInt uiSize ); |
---|
74 | |
---|
75 | static Void lineMedian3( PelImage* pcImage ); |
---|
76 | static Void convRect ( PelImage* pcImage, UInt uiSize); |
---|
77 | static Void laplace ( DoubleImage* pcInputImage, DoubleImage* pcOutputImage); |
---|
78 | static Void diffHorSym ( PelImage* pcInputImage, IntImage* pcOutputImage); |
---|
79 | |
---|
80 | //Plane |
---|
81 | static Void diffHorSym (PelImagePlane* pcInputPlane, IntImagePlane* pcOutputPlane); |
---|
82 | |
---|
83 | /////////// Convolution /////////// |
---|
84 | static Void conv (PelImage* pcImage, DoubleImage* pcKernel); |
---|
85 | |
---|
86 | /////////// InterPolation /////////// |
---|
87 | static Pel interpCHSpline(Double dX, Double dS0, Double dS1, Int iQ0, Int iQ1, Int iQ2, Int iQ3); |
---|
88 | |
---|
89 | |
---|
90 | /////////// HEVC/ binomial Up and Down sampling /////////// |
---|
91 | //// Down sampling (binomial) |
---|
92 | // Horizontally |
---|
93 | static Void sampleHorDown (Int iLog2HorSampFac, Pel* pcInputPlaneData, Int iInputStride, Int iInputWidth, Int iHeight , Pel* pcOutputPlaneData, Int iOutputStride ); |
---|
94 | static Void sampleCHorDown (Int iLog2HorSampFac, Pel* pcInputPlaneData, Int iInputStride, Int iInputWidth, Int iInputHeight, Pel* pcOutputPlaneData, Int iOutputStride ); |
---|
95 | // 444->420 and horizontally |
---|
96 | static Void sampleCDownHorDown(Int iLog2HorSampFac, Pel* pcInputPlaneData, Int iInputStride, Int iInputWidth, Int iInputHeight, Pel* pcOutputPlaneData, Int iOutputStride ); |
---|
97 | |
---|
98 | //// Up sampling (HEVC 8/4 tap) |
---|
99 | // Horizontally |
---|
100 | static Void sampleHorUp (Int iLog2HorSampFac, Pel* pcInputPlaneData, Int iInputStride, Int iInputWidth, Int iHeight, Pel* pcOutputPlaneData, Int iOutputStride ); |
---|
101 | static Void sampleCHorUp (Int iLog2HorSampFac, Pel* pcInputPlaneData, Int iInputStride, Int iInputWidth, Int iHeight, Pel* pcOutputPlaneData, Int iOutputStride ); |
---|
102 | // 420->444 and horizontally |
---|
103 | static Void sampleCUpHorUp (Int iLog2HorSampFac, Pel* pcInputPlaneData, Int iInputStride, Int iInputWidth, Int iHeight, Pel* pcOutputPlaneData, Int iOutputStride ); |
---|
104 | |
---|
105 | //// Down sampling (13 tap) |
---|
106 | |
---|
107 | static Void sampleDown2Tap13 ( Pel* pcInputPlaneData, Int iInputStride, Int iWidth, Int iHeight, Pel* pcOutputPlaneData, Int iOutputStride ); |
---|
108 | // Plane |
---|
109 | static Void sampleHorDown2Tap13(PelImagePlane* pcInputPlane, PelImagePlane* pcOutputPlane, Int uiPad); |
---|
110 | static Void sampleVerDown2Tap13(PelImagePlane* pcInputPlane, PelImagePlane* pcOutputPlane, Int uiPad); |
---|
111 | static Void sampleDown2Tap13 (PelImagePlane* pcInputPlane, PelImagePlane* pcOutputPlane); |
---|
112 | // Image |
---|
113 | static Void sampleDown2Tap13 (PelImage* pcInputImage, PelImage* pcOutputImage); |
---|
114 | static Void sampleUp2Tap13 (PelImage* pcInputImage, PelImage* pcOutImage ); |
---|
115 | private: |
---|
116 | |
---|
117 | // Helper Functions |
---|
118 | static inline Pel xMedian3 (Pel* pcData); |
---|
119 | static Void xDilate (Pel* piSrc, Int iSrcStride, Int iWidth, Int iHeight, Pel* piDst, Int iDstStride, Int iSize, Bool bVerticalDir, Bool bToTopOrLeft ); |
---|
120 | |
---|
121 | // Down sampling (binomial) |
---|
122 | static Void xSampleDownHor2 (Pel* piSrc, Int iSrcStride, Int iSrcWidth, Int iHeight, Pel* piDst, Int iDstStride ); |
---|
123 | static Void xSampleDownHor4 (Pel* piSrc, Int iSrcStride, Int iSrcWidth, Int iHeight, Pel* piDst, Int iDstStride ); |
---|
124 | static Void xSampleDownHor8 (Pel* piSrc, Int iSrcStride, Int iSrcWidth, Int iHeight, Pel* piDst, Int iDstStride ); |
---|
125 | |
---|
126 | static Void xSampleDownVer2 (Pel* piSrc, Int iSrcStride, Int iSrcWidth, Int iSrcHeight, Pel* piDst, Int iDstStride ); |
---|
127 | |
---|
128 | // Up sampling (8/4-Tap HEVC) |
---|
129 | static Void xInterpVerChroma(Pel* piSrc, Int iSrcStride, Int iSrcStepX, Int iSrcStepY, Int iWidth, Int iHeight, Pel* piDst, Int iDstStride, Int iDstStepX, Int iDstStepY, FpChromaIntFilt fpFilter); |
---|
130 | static Void xInterpHorChroma(Pel* piSrc, Int iSrcStride, Int iSrcStepX, Int iSrcStepY, Int iWidth, Int iHeight, Pel* piDst, Int iDstStride, Int iDstStepX, Int iDstStepY, FpChromaIntFilt fpFilter); |
---|
131 | static Void xDistributeArray(Pel* pcSrc, Int iSrcStride, Int iSrcStepX, Int iSrcStepY, Int iWidth, Int iHeight, Pel* pcDst, Int iDstStride, Int iDstStepX, Int iDstStepY ); |
---|
132 | |
---|
133 | // Binominal Filtering |
---|
134 | static Pel xFiltBinom3 (Pel* pcInputData, Int iStride ); |
---|
135 | static Pel xFiltBinom5 (Pel* pcInputData, Int iStride ); |
---|
136 | static Pel xFiltBinom7 (Pel* pcInputData, Int iStride ); |
---|
137 | static Pel xFiltBinom9 (Pel* pcInputData, Int iStride ); |
---|
138 | }; |
---|
139 | |
---|
140 | |
---|
141 | #endif //__TRENFILTER__ |
---|