source: 3DVCSoftware/branches/HTM-5.1-dev2-Qualcomm/source/Lib/TLibCommon/TComDepthMapGenerator.h @ 237

Last change on this file since 237 was 237, checked in by qualcomm, 11 years ago

QC_C0047&51

  • Property svn:eol-style set to native
File size: 12.4 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-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/** \file     TComDepthMapGenerator.h
37    \brief    depth map generator class (header)
38*/
39
40
41#ifndef __TCOM_DEPTH_MAP_GENERATOR__
42#define __TCOM_DEPTH_MAP_GENERATOR__
43
44
45#include "CommonDef.h"
46#include "TComPic.h"
47#include "TComPrediction.h"
48#include "TComSlice.h"
49
50
51#if DEPTH_MAP_GENERATION
52#if VIDYO_VPS_INTEGRATION
53class TComVPSAccess // would be better to have a real VPS buffer
54{
55public:
56  TComVPSAccess ()  { clear(); }
57  ~TComVPSAccess()  {}
58
59  Void      clear   ()                                { ::memset( m_aacVPS, 0x00, sizeof( m_aacVPS ) ); m_uiActiceVPSId = 0;}
60  Void      addVPS  ( TComVPS* pcVPS )                { m_aacVPS[ pcVPS->getVPSId() ] = pcVPS; }
61  TComVPS*  getVPS  ( UInt uiVPSId )                  { return m_aacVPS[ uiVPSId ]; }
62  TComVPS*  getActiveVPS  ( )                         { return m_aacVPS[ m_uiActiceVPSId ]; }
63  Void      setActiveVPSId  ( UInt activeVPSId )      { m_uiActiceVPSId = activeVPSId; }
64private:
65  TComVPS*  m_aacVPS[ MAX_NUM_VPS ];
66  UInt      m_uiActiceVPSId;
67};
68#endif
69
70class TComSPSAccess // would be better to have a real SPS buffer
71{
72public:
73  TComSPSAccess ()  { clear(); }
74  ~TComSPSAccess()  {}
75
76  Void      clear   ()                            { ::memset( m_aacActiveSPS, 0x00, sizeof( m_aacActiveSPS ) ); }
77  Void      addSPS  ( TComSPS* pcSPS    )         { m_aacActiveSPS[ pcSPS->isDepth() ? 1 : 0 ][ pcSPS->getViewId() ] = pcSPS; }
78  TComSPS*  getSPS  ( UInt     uiViewId, 
79                      Bool     bIsDepth = false ) { return m_aacActiveSPS[ bIsDepth ? 1 : 0 ][ uiViewId ]; }
80
81  UInt      getPdm  ()                            { if( m_aacActiveSPS[0][1] ) { return m_aacActiveSPS[0][1]->getPredDepthMapGeneration(); } return 0; }
82#if HHI_INTER_VIEW_RESIDUAL_PRED
83  UInt      getResPrd ()                          { if( m_aacActiveSPS[0][1] ) { return m_aacActiveSPS[0][1]->getMultiviewResPredMode  (); } return 0; }
84#endif
85
86private:
87  TComSPS*  m_aacActiveSPS[ 2 ][ MAX_VIEW_NUM ];
88};
89
90
91
92class TComAUPicAccess // would be better to have a real decoded picture buffer
93{
94public:
95  TComAUPicAccess () : m_iLastPoc( 0 ), m_uiMaxViewId( 0 ) { clear(); }
96  ~TComAUPicAccess()                   {}
97
98  Void      clear   ()                            { ::memset( m_aacCurrAUPics, 0x00, sizeof( m_aacCurrAUPics ) ); }
99  Void      addPic    ( TComPic* pcPic    )         { if( m_iLastPoc != pcPic->getPOC() ) 
100                                                      { 
101                                                        clear(); 
102                                                        m_iLastPoc = pcPic->getPOC(); 
103                                                      } 
104                                                      m_aacCurrAUPics[ pcPic->getSPS()->isDepth() ? 1 : 0 ][ pcPic->getSPS()->getViewId() ] = pcPic; 
105                                                      if( pcPic->getSPS()->getViewId() > m_uiMaxViewId )
106                                                      {
107                                                        m_uiMaxViewId = pcPic->getSPS()->getViewId();
108                                                      }
109                                                    }
110  TComPic*  getPic  ( UInt     uiViewId,
111                      Bool     bIsDepth = false ) { return m_aacCurrAUPics[ bIsDepth ? 1 : 0 ][ uiViewId ]; }
112  UInt      getMaxVId ()                            { return m_uiMaxViewId; }
113
114private:
115  Int       m_iLastPoc;
116  UInt      m_uiMaxViewId;
117  TComPic*  m_aacCurrAUPics[ 2 ][ MAX_VIEW_NUM ];
118};
119
120
121
122class TComDepthMapGenerator
123{
124public:
125  TComDepthMapGenerator ();
126  ~TComDepthMapGenerator();
127
128  Void  create                ( Bool bDecoder, UInt uiPicWidth, UInt uiPicHeight, UInt uiMaxCUDepth, UInt uiMaxCUWidth, UInt uiMaxCUHeight, UInt uiOrgBitDepth, UInt uiSubSampExpX, UInt uiSubSampExpY );
129  Void  destroy               ();
130
131#if VIDYO_VPS_INTEGRATION
132  Void  init( TComPrediction* pcPrediction, TComVPSAccess* pcVPSAccess, TComSPSAccess* pcSPSAccess, TComAUPicAccess* pcAUPicAccess );
133#endif
134  Void  init                  ( TComPrediction* pcPrediction, TComSPSAccess* pcSPSAccess, TComAUPicAccess* pcAUPicAccess );
135  Void  uninit                ();
136
137  Void  initViewComponent     ( TComPic*      pcPic );
138#if !QC_MULTI_DIS_CAN_A0097
139  Bool  predictDepthMap       ( TComPic*      pcPic );
140  Void  updateDepthMap        ( TComPic*      pcPic );
141  Void  dumpDepthMap          ( TComPic*      pcPic, char* pFilenameBase );
142#endif
143
144#if HHI_INTER_VIEW_MOTION_PRED
145  Void  covertOrgDepthMap     ( TComPic*      pcPic );
146#endif
147
148  UInt  getBaseViewId         ( UInt          uiIdx ) { AOF( uiIdx < m_auiBaseIdList.size() );  return m_auiBaseIdList[uiIdx]; }
149  UInt  getSubSampExpX        ()                      { return m_uiSubSampExpX; }
150  UInt  getSubSampExpY        ()                      { return m_uiSubSampExpY; }
151  Int   getDisparity          ( TComPic*      pcPic, Int iPosX, Int iPosY, UInt uiRefViewId );
152#if HHI_INTER_VIEW_MOTION_PRED
153#if QC_MULTI_DIS_CAN_A0097
154#if QC_AMVP_MRG_UNIFY_IVCAN_C0051
155  Bool getPdmCandidate ( TComDataCU* pcCU, UInt uiPartIdx, RefPicList eRefPicList, Int iRefIdx, Int* paiPdmRefIdx, TComMv* pacPdmMv, DisInfo* pDInfo, Int* iPdm, Bool bMerge );
156#else
157  Int   getPdmMergeCandidate ( TComDataCU*   pcCU, UInt uiPartIdx, Int* paiPdmRefIdx, TComMv* pacPdmMv, DisInfo* pDInfo
158#if QC_MRG_CANS_B0048
159    , Int* iPdm
160#endif
161    );
162
163  Bool  getPdmMvPredDisCan    ( TComDataCU*   pcCU, UInt uiPartIdx, RefPicList eRefPicList, Int iRefIdx, TComMv& rcMv, DisInfo* pDInfo, Bool bMerge );
164  Bool  getDisCanPdmMvPred    ( TComDataCU*   pcCU, UInt uiPartIdx, RefPicList eRefPicList, Int iRefIdx, TComMv& rcMv, DisInfo* pDInfo, Bool bMerge );
165#endif
166#else
167  Int   getPdmMergeCandidate  ( TComDataCU*   pcCU, UInt uiPartIdx, Int* paiPdmRefIdx, TComMv* pacPdmMv );
168  Bool  getPdmMvPred          ( TComDataCU*   pcCU, UInt uiPartIdx, RefPicList eRefPicList, Int iRefIdx, TComMv& rcMv, Bool bMerge );
169#endif
170  Bool  getIViewOrgDepthMvPred( TComDataCU*   pcCU, UInt uiPartIdx, RefPicList eRefPicList, Int iRefIdx, TComMv& rcMv );
171#endif
172
173  TComPrediction*   getPrediction ()  { return m_pcPrediction;  }
174#if VIDYO_VPS_INTEGRATION
175  TComVPSAccess*    getVPSAccess  ()  { return m_pcVPSAccess;   }
176#endif
177  TComSPSAccess*    getSPSAccess  ()  { return m_pcSPSAccess;   }
178  TComAUPicAccess*  getAUPicAccess()  { return m_pcAUPicAccess; }
179
180private:
181  // picture operations
182#if !QC_MULTI_DIS_CAN_A0097
183  Bool  xConvertDepthMapCurr2Ref  ( TComPic*    pcRef, TComPic* pcCur );
184  Bool  xConvertDepthMapRef2Curr  ( TComPic*    pcCur, TComPic* pcRef );
185  Bool  xPredictDepthMap          ( TComPic*    pcPic );
186  Bool  xFillDepthMapHoles        ( TComPic*    pcPic );
187  Void  xClearDepthMap            ( TComPic*    pcPic, Int      iVal  = PDM_UNDEFINED_DEPTH
188#if PDM_REMOVE_DEPENDENCE
189  ,
190  Int forFirstNonBaseView = 0
191#endif
192  );
193  Void  xSetChroma                ( TComPicYuv* pcPic, Int      iVal  );
194
195  // CU operations 
196  Void  xPredictCUDepthMap        ( TComDataCU* pcCU, UInt uiDepth, UInt uiAbsPartIdx );                            // CU depth map prediction
197  Void  xIntraPredictCUDepthMap   ( TComDataCU* pcCU, TComYuv* pcCUDepthMap );                                      // CU intra prediction
198  Void  xInterPredictCUDepthMap   ( TComDataCU* pcCU, TComYuv* pcCUDepthMap );                                      // CU inter prediction
199 
200  // PU and block operations 
201  Void  xIntraPredictBlkDepthMap  ( TComDataCU* pcCU, TComYuv* pcCUDepthMap, UInt uiAbsPartIdx, UInt uiTrDepth );   // block intra prediction
202  Void  xInterPredictPUDepthMap   ( TComDataCU* pcCU, TComYuv* pcCUDepthMap, UInt uiPartIdx );                      // PU inter prediction/update
203  Void  xIViewPUDepthMapUpdate    ( TComDataCU* pcCU, TComYuv* pcCUDepthMap, UInt uiPartIdx );                      // PU interview update
204  Void  xInterPUDepthMapUpdate    ( TComDataCU* pcCU, TComYuv* pcCUDepthMap, UInt uiPartIdx );                      // PU inter update
205  Void  xInterPUDepthMapPrediction( TComDataCU* pcCU, TComYuv* pcCUDepthMap, UInt uiPartIdx );                      // PU inter prediction
206  Bool  xGetPredDepth             ( TComDataCU* pcCU, UInt uiPartIdx, Int& riPrdDepth, Int* piPosX = 0, Int* piPosY = 0 );
207#endif
208  // conversion functions
209  Int   xGetVirtDepthFromDisparity( UInt uiBaseId, Int iDisparity )
210  {
211    AOF( uiBaseId < m_uiCurrViewId );
212    Int*   pPar = m_aaiConvParsDisparity2VirtDepth[ uiBaseId ];
213    Int    iRes = ( pPar[ 0 ] * iDisparity + pPar[ 1 ] ) >> pPar[ 2 ];
214    return iRes;
215  }
216  Int   xGetDisparityFromVirtDepth( UInt uiBaseId, Int iVirtDepth )
217  {
218    AOF( uiBaseId < m_uiCurrViewId );
219    Int*   pPar = m_aaiConvParsVirtDepth2Disparity[ uiBaseId ];
220    Int    iRes = ( pPar[ 0 ] * iVirtDepth + pPar[ 1 ] ) >> pPar[ 2 ];
221    return iRes;
222  }
223  Int   xGetVirtDepthFromOrigDepth( UInt uiViewId, Int iOrigDepth )
224  {
225    AOF( uiViewId <= m_uiCurrViewId );
226    Int*   pPar = m_aaiConvParsOrigDepth2VirtDepth[ uiViewId ];
227    Int    iRes = ( pPar[ 0 ] * iOrigDepth + pPar[ 1 ] ) >> pPar[ 2 ];
228    return iRes;
229  }
230  Int   xGetOrigDepthFromVirtDepth( UInt uiViewId, Int iVirtDepth )
231  {
232    AOF( uiViewId <= m_uiCurrViewId );
233    Int*   pPar = m_aaiConvParsVirtDepth2OrigDepth[ uiViewId ];
234    Int    iRes = ( pPar[ 0 ] * iVirtDepth + pPar[ 1 ] ) >> pPar[ 2 ];
235    return iRes;
236  }
237
238
239private:
240  // general parameters
241  Bool              m_bCreated;
242  Bool              m_bInit;
243  Bool              m_bDecoder;
244  TComPrediction*   m_pcPrediction;
245#if VIDYO_VPS_INTEGRATION|QC_MVHEVC_B0046
246  TComVPSAccess*    m_pcVPSAccess;
247#endif
248  TComSPSAccess*    m_pcSPSAccess;
249  TComAUPicAccess*  m_pcAUPicAccess;
250  UInt              m_uiMaxDepth;
251  UInt              m_uiOrgDepthBitDepth;
252  UInt              m_uiSubSampExpX;
253  UInt              m_uiSubSampExpY;
254  TComYuv**         m_ppcYuv;
255  TComDataCU**      m_ppcCU;
256  TComPicYuv        m_cTmpPic;
257
258  // conversion parameters
259  UInt              m_uiCurrViewId;
260  Bool              m_bPDMAvailable;
261  std::vector<UInt> m_auiBaseIdList;
262  Int               m_aaiConvParsDisparity2VirtDepth[ MAX_VIEW_NUM ][ 3 ];  // disparity      ==> virtual  depth   (0:scale, 1:add, 2:shift)
263  Int               m_aaiConvParsVirtDepth2Disparity[ MAX_VIEW_NUM ][ 3 ];  // virtual  depth ==> disparity        (0:scale, 1:add, 2:shift)
264  Int               m_aaiConvParsOrigDepth2VirtDepth[ MAX_VIEW_NUM ][ 3 ];  // original depth ==> virtual  depth   (0:scale, 1:add, 2:shift)
265  Int               m_aaiConvParsVirtDepth2OrigDepth[ MAX_VIEW_NUM ][ 3 ];  // virtual  depth ==> original depth   (0:scale, 1:add, 2:shift)
266
267  // temporary arrays
268  Bool              m_aabDepthSet[ MAX_CU_SIZE >> 2 ][ MAX_CU_SIZE >> 2 ];
269  Int               m_aai4x4Depth[ MAX_CU_SIZE >> 2 ][ MAX_CU_SIZE >> 2 ];
270};
271
272
273#endif // DEPTH_MAP_GENERATION
274
275#endif // __TCOM_DEPTH_MAP_GENERATOR__
276
277
278
279
Note: See TracBrowser for help on using the repository browser.