source: 3DVCSoftware/branches/HTM-13.1-dev0/source/Lib/TAppCommon/TAppComCamPara.h @ 1314

Last change on this file since 1314 was 1175, checked in by tech, 10 years ago

Added direct dependency type for qtl.
Updated cfg files.
updated copy right headers.

File size: 14.9 KB
Line 
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-2015, ITU/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 __TAPPCOMCAMPARA__
37#define __TAPPCOMCAMPARA__
38
39// Include files
40#include "../../Lib/TLibCommon/CommonDef.h"
41#include <vector>
42
43
44#define LOG10_VIEW_NUM_PREC         5  // Precision of view numbering
45#define VIEW_NUM_PREC               pow( 10.0, (Int)LOG10_VIEW_NUM_PREC )
46
47// ====================================================================================================================
48// Class definition
49// ====================================================================================================================
50
51class TAppComCamPara
52{
53private:
54  // camera parameter data
55  std::vector< std::vector<Double> >  m_aadCameraParameters;  ///< buffer for double values from file
56
57  // miscellaneous variables
58  Double              m_dViewNumPrec;                         ///< factor for camera number to create integer representation
59  Int                 m_iLog2Precision;                       ///< shift precision in LUT
60  UInt                m_uiInputBitDepth;                      ///< bit depth of input depth maps
61  UInt                m_uiBitDepthForLUT;                     ///< bit depth used for table look-up
62  UInt                m_uiFirstFrameId;                       ///< first frame id
63  UInt                m_uiLastFrameId;                        ///< last frame id
64  UInt                m_iCurrentFrameId;                      ///< currently set frame id
65
66  Bool                m_bSetupFromCoded;                      ///< setup from coded parameter file
67  Bool                m_bCamParsCodedPrecSet;                 ///< Coded Cam Para precision set for current frame;
68 
69#if H_3D_REN_MAX_DEV_OUT
70  Double              m_dMaxShiftDeviation;                   ///< Maximum deviation of shifts with integer precision compare to double precision
71#endif
72  //SAIT_VSO_EST_A0033
73  Double              m_dDispCoeff;
74
75  // view lists
76  std::vector<Int>    m_aiViewsInCfgFile;                     ///< views for which parameters are specified in cfg file (from left to right)
77  std::vector<Int>    m_aiSynthViews;                         ///< View numbers of External ViewReferences
78  std::vector<Int>    m_aiRelSynthViewsNum;                   ///< Relative view numbers of External ViewReferences
79  std::vector<Int>    m_aiBaseViews;                          ///< View numbers of Base View References (in coding order)
80  std::vector<Int>    m_aiSortedBaseViews;                    ///< View numbers of Base View References (from left to right)
81  std::vector<Int>    m_aiBaseId2SortedId;                    ///< mapping from coding order to left-right order for base views
82  std::vector<Int>    m_aiBaseSortedId2Id;                    ///< mapping from left-right order to coding order for base views
83  Int                 m_iNumberOfBaseViews;                   ///< number of base views
84  Int                 m_iNumberOfSynthViews;                  ///< number of synthesized views
85
86  // SPS and slice header related variables
87#if !HHI_CAM_PARA_K0052
88  std::vector<Int>    m_aiViewOrderIndex;                     ///< list of view order indices
89#endif
90  UInt                m_uiCamParsCodedPrecision;              ///< precision for coding of camera parameters (x: max error in disparity is 2^(-x) luma samples)
91  Bool                m_bCamParsVaryOverTime;                 ///< flag specifying whether camera parameters vary for given frame numbers
92  Int**               m_aaiCodedScale;                        ///< array of coded scaling parameters [RefView][TargetView]
93  Int**               m_aaiCodedOffset;                       ///< array of coded offset  parameters [RefView][TargetView]
94  Int**               m_aaiScaleAndOffsetSet;                 ///< array indicating whether scale and offset have been set
95
96  // scale and offset parameters
97  Double***           m_adBaseViewShiftParameter;             ///< ShiftParameters between BaseViews e.g. [2][1][0] shift scale from view 2 to view 1; [2][1][1] shift offset from view 2 to view 1
98  Int64 ***           m_aiBaseViewShiftParameter;             ///< ShiftParameters between BaseViews e.g. [2][1][0] shift scale from view 2 to view 1; [2][1][1] shift offset from view 2 to view 1     /* do we need 64 bit? */
99  Double***           m_adSynthViewShiftParameter;            ///< ShiftParameters between BaseViews and ERViews e.g. [2][1][0] shift scale from base view 2 to er view 1;
100  Int64 ***           m_aiSynthViewShiftParameter;            ///< ShiftParameters between BaseViews and ERViews e.g. [2][1][0] shift scale from base view 2 to er view 1;    /* do we need 64 bit? */
101
102  // look-up tables
103  Double****          m_adBaseViewShiftLUT;                    ///< Disparity LUT
104  Int****             m_aiBaseViewShiftLUT;                    ///< Disparity LUT
105  Double****          m_adSynthViewShiftLUT;                   ///< Disparity LUT
106  Int****             m_aiSynthViewShiftLUT;                   ///< Disparity LUT
107
108protected:
109  // create and delete arrays
110  Void                    xCreateLUTs   ( UInt uiNumberSourceViews, UInt uiNumberTargetViews, Double****& radLUT, Int****& raiLUT, Double***& radShiftParams, Int64***& raiShiftParams );
111  Void                    xCreate2dArray( UInt uiNum1Ids, UInt uiNum2Ids, Int**& raaiArray );
112  Void                    xInit2dArray  ( UInt uiNum1Ids, UInt uiNum2Ids, Int**& raaiArray, Int iValue );
113  template<class T> Void  xDeleteArray  ( T*& rpt, UInt uiSize1, UInt uiSize2, UInt uiSize3 );
114  template<class T> Void  xDeleteArray  ( T*& rpt, UInt uiSize1, UInt uiSize2 );
115  template<class T> Void  xDeleteArray  ( T*& rpt, UInt uiSize );
116
117  // functions for reading, initialization, sorting, getting data, etc.
118  Void  xReadCameraParameterFile  ( Char* pchCfgFileName );
119  Bool  xGetCameraDataRow         ( Int iView, UInt uiFrame, UInt& ruiFoundLine );
120
121  Void  xGetSortedViewList        ( const std::vector<Int>& raiViews, std::vector<Int>& raiSortedViews, std::vector<Int>& raiId2SortedId, std::vector<Int>& raiSortedId2Id );
122  Void  xGetViewOrderIndices      ( const std::vector<Int>& raiId2SortedId, std::vector<Int>& raiVOIdx );
123  Bool  xGetCamParsChangeFlag     ();
124  Int   xGetBaseViewId            ( Int iBaseView );
125  Int   xGetViewId                 ( std::vector<Int> aiViewList, Int iBaseView );
126
127  Bool  xGetLeftRightView         ( Int iView, std::vector<Int> aiSortedViews, Int& riLeftView, Int& riRightView, Int& riLeftSortedViewIdx, Int& riRightSortedViewIdx );
128  Void  xGetPrevAndNextBaseView   ( Int iSourceViewNum, Int iTargetViewNum, Int& riPrevBaseViewNum, Int& riNextBaseViewNum );
129#if !KWU_RC_MADPRED_E0227
130  Void  xGetZNearZFar             ( Int iView, UInt uiFrame, Double& rdZNear, Double& rdZFar );
131  Void  xGetGeometryData          ( Int dView, UInt uiFrame, Double& rdFocalLength, Double& rdPosition, Double& rdCameraShift, Bool& rbInterpolated );
132#endif
133  Void  xSetupBaseViewsFromCoded  ();
134  Void  xSetupBaseViews           ( Char* pchBaseViewNumbers, UInt uiNumBaseViews );
135  Bool  xIsIn                     ( std::vector<Int>& rVec, Int iNumber);
136
137  // functions for getting and setting scales and offsets
138  Bool  xGetShiftParameterReal    ( UInt uiSourceView, UInt uiTargetView, UInt uiFrame, Bool bExternal, Bool bByIdx, Double& rdScale, Double& rdOffset );
139  Void  xGetShiftParameterCoded   ( UInt uiSourceView, UInt uiTargetView, UInt uiFrame,                 Bool bByIdx, Int&    riScale, Int&    riOffset );
140  Void  xGetShiftParameterInt     ( UInt uiSourceView, UInt uiTargetView, UInt uiFrame, Bool bExternal, Bool bByIdx, Int64&  riScale, Int64&  riOffset );
141  Void  xGetCodedCameraData       ( UInt uiSourceView, UInt uiTargetView, Bool bByIdx,  UInt uiFrame, Int& riScale, Int& riOffset, Int& riPrecision );
142
143  Void  xSetCodedScaleOffset      ( UInt uiFrame );
144  Void  xSetShiftParametersAndLUT ( UInt uiNumViewDim1, UInt uiNumViewDim2, UInt uiFrame, Bool bExternalReference, Double****& radLUT, Int****& raiLUT, Double***& radShiftParams, Int64***& raiShiftParams );
145  Void  xSetShiftParametersAndLUT ( UInt uiFrame );
146
147  // getting conversion parameters for disparity to virtual depth conversion
148  Void  xGetCameraShifts          ( UInt uiSourceView, UInt uiTargetView, UInt uiFrame, Double& rdCamPosShift, Double& rdPicPosShift );
149#if !HHI_CAM_PARA_K0052
150  Void  xSetPdmConversionParams   ();
151#endif
152
153public:
154  // constructor and destructor
155  TAppComCamPara();
156  ~TAppComCamPara();
157
158  // initialization, check, and and update
159  Void init   ( UInt    uiNumBaseViews,
160                UInt    uiInputBitDepth,
161                UInt    uiCodedCamParsPrecision,
162                UInt    uiStartFrameId,
163                UInt    uiNumFrames,
164                Char*   pchCfgFileName,
165                Char*   pchBaseViewNumbers,
166                Char*   pchSynthViewNumbers,
167                std::vector<Int>* paiSynthViewNumbers,
168                Int     iLog2Precision );
169
170  Void init   ( UInt    uiInputBitDepth,
171                UInt    uiStartFrameId,
172                UInt    uiNumFrames,
173                Char*   pchCfgFileName,
174                Char*   pchSynthViewNumbers,
175                std::vector<Int>* paiSynthViewNumbers,
176                Int     iLog2Precision
177              );
178
179
180
181  Void check  ( Bool    bCheckViewRange,
182                Bool    bCheckFrameRange );
183  Void update ( UInt    uiFrameId );
184
185  // miscellaneous functions
186
187  Int                 synthRelNum2Idx           ( Int iRelNum );
188  Bool                getLeftRightBaseView      ( Int iSynthViewIdx, Int &riLeftViewIdx, Int &riRightViewIdx, Int &riRelDistToLeft, Bool& rbIsBaseView );
189  Int                 getRelDistLeft            ( Int iSynthViewIdx, Int   iLeftViewIdx, Int iRightViewIdx );
190  UInt                getCurFrameId             ()  { return m_iCurrentFrameId;   }
191  static Void         convertNumberString       ( Char* pchViewNumberString, std::vector<Int>& raiViewNumbers, Double dViewNumPrec );
192#if H_3D_REN_MAX_DEV_OUT
193  Double              getMaxShiftDeviation      () { return m_dMaxShiftDeviation; }; 
194#endif
195
196#if H_3D_VSO
197  // SAIT_VSO_EST_A033
198  Void                setDispCoeff              ( UInt uiStartFrameId, Int iViewIdx );
199  Double              getDispCoeff              () { return m_dDispCoeff; }
200#endif
201
202  // function for getting parameters and parameter arrays
203  std::vector<Int>&   getBaseViewNumbers        ()  { return m_aiBaseViews;       }
204  std::vector<Int>&   getSortedBaseViewNumbers  ()  { return m_aiSortedBaseViews; }
205  std::vector<Int>&   getSynthViewNumbers       ()  { return m_aiSynthViews;      }
206  std::vector<Int>&   getRelSynthViewNumbers    ()  { return m_aiRelSynthViewsNum;}
207
208  std::vector<Int>&   getBaseId2SortedId        ()   { return m_aiBaseId2SortedId; }
209  std::vector<Int>&   getBaseSortedId2Id        ()   { return m_aiBaseSortedId2Id; }
210
211
212  Double***           getBaseViewShiftParameterD()  { return         m_adBaseViewShiftParameter;  }
213  Int***              getBaseViewShiftParameterI()  { return (Int***)m_aiBaseViewShiftParameter;  }
214
215  Double****          getSynthViewShiftLUTD     ()  { return m_adSynthViewShiftLUT;  }
216  Double****          getBaseViewShiftLUTD      ()  { return m_adBaseViewShiftLUT;   }
217  Int****             getSynthViewShiftLUTI     ()  { return m_aiSynthViewShiftLUT;  }
218  Int****             getBaseViewShiftLUTI      ()  { return m_aiBaseViewShiftLUT;   }
219
220  Bool                getVaryingCameraParameters()  { return m_bCamParsVaryOverTime;    }
221  UInt                getCamParsCodedPrecision  ()  { return m_uiCamParsCodedPrecision; }
222#if !HHI_CAM_PARA_K0052
223  std::vector<Int>&   getViewOrderIndex         ()  { return m_aiViewOrderIndex;        }
224#endif
225  Int**               getCodedScale             ()  { return m_aaiCodedScale;           }
226  Int**               getCodedOffset            ()  { return m_aaiCodedOffset;          }
227
228#if KWU_RC_MADPRED_E0227
229  Void  xGetZNearZFar             ( Int iView, UInt uiFrame, Double& rdZNear, Double& rdZFar );
230  Void  xGetGeometryData          ( Int dView, UInt uiFrame, Double& rdFocalLength, Double& rdPosition, Double& rdCameraShift, Bool& rbInterpolated );
231#endif
232};
233
234
235
236template <class T>
237Void TAppComCamPara::xDeleteArray( T*& rpt, UInt uiSize1, UInt uiSize2, UInt uiSize3 )
238{
239  if( rpt )
240  {
241    for( UInt uiK = 0; uiK < uiSize1; uiK++ )
242    {
243      for( UInt uiL = 0; uiL < uiSize2; uiL++ )
244      {
245        for( UInt uiM = 0; uiM < uiSize3; uiM++ )
246        {
247          delete[] rpt[ uiK ][ uiL ][ uiM ];
248        }
249        delete[] rpt[ uiK ][ uiL ];
250      }
251      delete[] rpt[ uiK ];
252    }
253    delete[] rpt;
254  }
255  rpt = NULL;
256};
257
258
259template <class T>
260Void TAppComCamPara::xDeleteArray( T*& rpt, UInt uiSize1, UInt uiSize2 )
261{
262  if( rpt )
263  {
264    for( UInt uiK = 0; uiK < uiSize1; uiK++ )
265    {
266      for( UInt uiL = 0; uiL < uiSize2; uiL++ )
267      {
268        delete[] rpt[ uiK ][ uiL ];
269      }
270      delete[] rpt[ uiK ];
271    }
272    delete[] rpt;
273  }
274  rpt = NULL;
275};
276
277
278template <class T>
279Void TAppComCamPara::xDeleteArray( T*& rpt, UInt uiSize )
280{
281  if( rpt )
282  {
283    for( UInt uiK = 0; uiK < uiSize; uiK++ )
284    {
285      delete[] rpt[ uiK ];
286    }
287    delete[] rpt;
288  }
289  rpt = NULL;
290};
291
292
293
294#endif // __TAPPCOMCAMPARA__
295
296
297
Note: See TracBrowser for help on using the repository browser.