[5] | 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 | */ |
---|
[2] | 33 | |
---|
| 34 | |
---|
| 35 | |
---|
| 36 | #ifndef __TRENFILTER__ |
---|
| 37 | #define __TRENFILTER__ |
---|
| 38 | |
---|
[56] | 39 | #include "TLibCommon/CommonDef.h" |
---|
[2] | 40 | #include "TRenImage.h" |
---|
[56] | 41 | #include "TRenInterpFilter.h" |
---|
[2] | 42 | |
---|
[56] | 43 | typedef Int (TRenInterpFilter::*FpChromaIntFilt) ( Pel*, Int ); |
---|
[2] | 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__ |
---|