source: SHVCSoftware/branches/SHM-dev/source/Lib/TLibEncoder/TEnc3DAsymLUT.h @ 873

Last change on this file since 873 was 855, checked in by qualcomm, 10 years ago

Added missing macros R0151_CGS_3D_ASYMLUT_IMPROVE for encoder only parts in JCTVC-R0151

File size: 6.9 KB
Line 
1
2#ifndef __TENC3DASYMLUT__
3#define __TENC3DASYMLUT__
4
5#include "../TLibCommon/TCom3DAsymLUT.h"
6#include "../TLibCommon/TComSlice.h"
7#include "../TLibCommon/CommonDef.h"
8#include "../TLibCommon/TComPic.h"
9#include "TEncCfg.h"
10
11#if Q0048_CGS_3D_ASYMLUT
12
13typedef struct _ColorInfo
14{
15  Double YY , UU , VV;
16  Double Ys , Us , Vs;  // sum of enhancement
17  Double ys , us , vs;  // sum of base
18  Double Yy , Yu , Yv;  // product of enhancement and base
19  Double Uy , Uu , Uv;
20  Double Vy , Vu , Vv;
21  Double yy , yu , yv , uu , uv , vv; // product of base
22  Double N; // number of pixel
23
24public:
25  _ColorInfo & operator += ( const _ColorInfo & rColorInfo )
26  {
27    YY += rColorInfo.YY;
28    UU += rColorInfo.UU;
29    VV += rColorInfo.VV;
30    Ys += rColorInfo.Ys;
31    Us += rColorInfo.Us;
32    Vs += rColorInfo.Vs;
33    ys += rColorInfo.ys;
34    us += rColorInfo.us;
35    vs += rColorInfo.vs;
36    Yy += rColorInfo.Yy;
37    Yu += rColorInfo.Yu;
38    Yv += rColorInfo.Yv;
39    Uy += rColorInfo.Uy;
40    Uu += rColorInfo.Uu;
41    Uv += rColorInfo.Uv;
42    Vy += rColorInfo.Vy;
43    Vu += rColorInfo.Vu;
44    Vv += rColorInfo.Vv;
45    yy += rColorInfo.yy;
46    yu += rColorInfo.yu;
47    yv += rColorInfo.yv;
48    uu += rColorInfo.uu;
49    uv += rColorInfo.uv;
50    vv += rColorInfo.vv;
51    N  += rColorInfo.N; 
52    return *this;
53  }
54
55}SColorInfo;
56
57
58class TEnc3DAsymLUT : public TCom3DAsymLUT
59{
60public:
61  TEnc3DAsymLUT();
62  virtual ~TEnc3DAsymLUT();
63
64  virtual Void  create( Int nMaxOctantDepth , Int nInputBitDepth , Int nInputBitDepthC , Int nOutputBitDepth , Int nOutputBitDepthC , Int nMaxYPartNumLog2 );
65  virtual Void  destroy();
66  Double derive3DAsymLUT( TComSlice * pSlice , TComPic * pCurPic , UInt refLayerIdc , TEncCfg * pCfg , Bool bSignalPPS , Bool bElRapSliceTypeB );
67  Double estimateDistWithCur3DAsymLUT( TComPic * pCurPic , UInt refLayerIdc );
68
69  Void  updatePicCGSBits( TComSlice * pcSlice , Int nPPSBit );
70  Void  setPPSBit(Int n)  { m_nPPSBit = n;  }
71  Int   getPPSBit()       { return m_nPPSBit;}
72  Void  setDsOrigPic(TComPicYuv *pPicYuv) { m_pDsOrigPic = pPicYuv; };
73
74protected:
75  SColorInfo *** m_pColorInfo;
76  SColorInfo *** m_pColorInfoC;
77  TComPicYuv* m_pDsOrigPic;
78  SCuboid *** m_pEncCuboid;
79  SCuboid *** m_pBestEncCuboid;
80#if R0151_CGS_3D_ASYMLUT_IMPROVE
81  Int   m_nAccuFrameBit;                  // base + enhancement layer
82  Int   m_nAccuFrameCGSBit;
83  Int   m_nPrevFrameCGSPartNumLog2;
84#else
85  Int   m_nPrevFrameBit[3][MAX_TLAYER];                  // base + enhancement layer
86  Int   m_nPrevFrameCGSBit[3][MAX_TLAYER];
87  Int   m_nPrevFrameCGSPartNumLog2[3][MAX_TLAYER];
88  Int   m_nPrevFrameOverWritePPS[3][MAX_TLAYER];
89#endif
90  Double m_dTotalFrameBit;
91  Int   m_nTotalCGSBit;
92  Int   m_nPPSBit;
93  Int   m_nLUTBitDepth;
94#if R0151_CGS_3D_ASYMLUT_IMPROVE
95  Double m_dSumU;
96  Double m_dSumV;
97  Int    m_nNChroma;
98#endif
99
100private:
101#if R0151_CGS_3D_ASYMLUT_IMPROVE
102  Double  xxDeriveVertexPerColor( Double N , Double Ys , Double Yy , Double Yu , Double Yv , Double ys , Double us , Double vs , Double yy , Double yu , Double yv , Double uu , Double uv , Double vv , Double YY ,
103    Pel & rP0 , Pel & rP1 , Pel & rP3 , Pel & rP7 , Int nResQuantBit );
104#else
105  Double  xxDeriveVertexPerColor( Double N , Double Ys , Double Yy , Double Yu , Double Yv , Double ys , Double us , Double vs , Double yy , Double yu , Double yv , Double uu , Double uv , Double vv , Double YY ,
106    Int y0 , Int u0 , Int v0 , Int nLengthY , Int nLengthUV ,
107    Pel & rP0 , Pel & rP1 , Pel & rP3 , Pel & rP7 , Int nResQuantBit );
108#endif
109  Void    xxDerivePartNumLog2( TComSlice * pSlice , TEncCfg * pcCfg , Int & rOctantDepth , Int & rYPartNumLog2 , Bool bSignalPPS , Bool bElRapSliceTypeB );
110  Void    xxMapPartNum2DepthYPart( Int nPartNumLog2 , Int & rOctantDepth , Int & rYPartNumLog2 );
111  Int     xxCoeff2Vertex( Double a , Double b , Double c , Double d , Int y , Int u , Int v ) { return ( ( Int )( a * y + b * u + c * v + d + 0.5 ) ); }
112  Void    xxCollectData( TComPic * pCurPic , UInt refLayerIdc );
113  Double  xxDeriveVertexes( Int nResQuantBit , SCuboid *** pCurCuboid );
114  inline Double  xxCalEstDist( Double N , Double Ys , Double Yy , Double Yu , Double Yv , Double ys , Double us , Double vs , Double yy , Double yu , Double yv , Double uu , Double uv , Double vv , Double YY ,
115    Int y0 , Int u0 , Int v0 , Int nLengthY , Int nLengthUV , Pel nP0 , Pel nP1 , Pel nP3 , Pel nP7 );
116  inline Double  xxCalEstDist( Double N , Double Ys , Double Yy , Double Yu , Double Yv , Double ys , Double us , Double vs , Double yy , Double yu , Double yv , Double uu , Double uv , Double vv , Double YY ,
117    Double a , Double b , Double c , Double d );
118#if R0151_CGS_3D_ASYMLUT_IMPROVE
119  inline Double  xxCalEstDist( Double N , Double Ys , Double Yy , Double Yu , Double Yv , Double ys , Double us , Double vs , Double yy , Double yu , Double yv , Double uu , Double uv , Double vv , Double YY ,
120    Pel nP0 , Pel nP1 , Pel nP3 , Pel nP7 );
121#endif
122};
123
124Double TEnc3DAsymLUT::xxCalEstDist( Double N , Double Ys , Double Yy , Double Yu , Double Yv , Double ys , Double us , Double vs , Double yy , Double yu , Double yv , Double uu , Double uv , Double vv , Double YY ,
125  Int y0 , Int u0 , Int v0 , Int nLengthY , Int nLengthUV , Pel nP0 , Pel nP1 , Pel nP3 , Pel nP7 )
126{
127  Double a = 1.0 * ( nP7 - nP3 ) / nLengthY;
128  Double b = 1.0 * ( nP1 - nP0 ) / nLengthUV;
129  Double c = 1.0 * ( nP3 - nP1 ) / nLengthUV;
130  Double d = ( ( nP0 * nLengthUV + u0 * nP0 + ( v0 - u0 ) * nP1 - v0 * nP3 ) * nLengthY + y0 * nLengthUV * ( nP3 - nP7 ) ) / nLengthUV / nLengthY;
131  return( xxCalEstDist( N , Ys , Yy , Yu , Yv , ys , us , vs , yy , yu , yv , uu , uv , vv , YY , a , b , c , d ) );
132}
133
134Double TEnc3DAsymLUT::xxCalEstDist( Double N , Double Ys , Double Yy , Double Yu , Double Yv , Double ys , Double us , Double vs , Double yy , Double yu , Double yv , Double uu , Double uv , Double vv , Double YY ,
135  Double a , Double b , Double c , Double d )
136{
137  Double dError = N * d * d + 2 * b * c * uv + 2 * a * c * yv + 2 * a * b * yu - 2 * c * Yv - 2 * b * Yu - 2 * a * Yy + 2 * c * d * vs + 2 * b * d * us + 2 * a * d * ys + a * a * yy + c * c * vv + b * b * uu - 2 * d * Ys + YY;
138  return( dError );
139};
140
141#if R0151_CGS_3D_ASYMLUT_IMPROVE
142Double TEnc3DAsymLUT::xxCalEstDist( Double N , Double Ys , Double Yy , Double Yu , Double Yv , Double ys , Double us , Double vs , Double yy , Double yu , Double yv , Double uu , Double uv , Double vv , Double YY ,
143  Pel nP0 , Pel nP1 , Pel nP3 , Pel nP7 )
144{
145  const Int nOne = xGetNormCoeffOne();
146  Double a = 1.0 * nP0 / nOne;
147  Double b = 1.0 * nP1 / nOne;
148  Double c = 1.0 * nP3 / nOne;
149  Double d = nP7;
150  Double dError = N * d * d + 2 * b * c * uv + 2 * a * c * yv + 2 * a * b * yu - 2 * c * Yv - 2 * b * Yu - 2 * a * Yy + 2 * c * d * vs + 2 * b * d * us + 2 * a * d * ys + a * a * yy + c * c * vv + b * b * uu - 2 * d * Ys + YY;
151  return( dError );
152};
153#endif
154
155#endif
156
157#endif
Note: See TracBrowser for help on using the repository browser.