source: 3DVCSoftware/branches/0.3-poznan-univ/source/Lib/TLibCommon/TComMP.cpp @ 28

Last change on this file since 28 was 28, checked in by poznan-univ, 12 years ago

Poznan Tools

  • Encoding only disoccluded CUs in depended views
  • Depth based motion prediction
  • Texture QP adjustment based on depth data
  • Nonlinear depth representation
File size: 37.5 KB
Line 
1
2
3#include "TComMP.h"
4//#include "../TLibSynth/TComMatrix.h"
5//#include "../TLibSynth/TSynthD2Z.h"
6//#include "../TLibSynth/TSynthZ2D.h"
7//#include "../TLibSynth/TSynthD2D.h"
8
9#if POZNAN_MP_USE_DEPTH_MAP_GENERATION
10#include "../TLibCommon/TComDepthMapGenerator.h"
11#else
12#include "../../App/TAppCommon/TAppComCamPara.h"
13#endif
14
15#if POZNAN_MP
16
17
18#if POZNAN_MP_USE_DEPTH_MAP_GENERATION
19TComMP::TComMP(UInt uiHeight, UInt uiWidth)
20#else
21//TComMP::TComMP(UInt uiHeight, UInt uiWidth, TAppComCamPara* pcCameraData)
22TComMP::TComMP(UInt uiHeight, UInt uiWidth, Int**** aiBaseViewShiftLUT)
23#endif
24{
25        m_ppiMvPtCorrX = NULL;
26        m_ppiMvPtCorrY = NULL;
27        m_ppiMvPtCorrZ = NULL;
28        m_ppiMvPtCorrRefViewIdx = NULL;
29        m_pppcRefCU = NULL;
30        m_ppuicRefPartAddr = NULL;
31
32        m_bInit = false;
33        m_bEnabled = false;
34        m_bDBMPEnabled = false;
35
36        m_uiHeight = 0;
37        m_uiWidth = 0;
38
39        m_pcRefPicsList = NULL;
40        m_pcDepthRefPicsList = NULL;
41#if POZNAN_MP_USE_DEPTH_MAP_GENERATION
42        m_pcDepthMapGenerator = NULL;
43#else
44        //m_pcCameraData = NULL;
45        m_aiBaseViewShiftLUT = NULL;
46#endif
47
48#if POZNAN_DBMP_CALC_PRED_DATA
49  m_piTempL0RefIdx = NULL;
50  m_piTempL0MvX = NULL;
51  m_piTempL0MvY = NULL;
52  m_piTempL1RefIdx = NULL;
53  m_piTempL1MvX = NULL;
54  m_piTempL1MvY = NULL;
55
56  m_piTempBuff = NULL;
57  m_piResBuff = NULL;
58#endif
59
60#if POZNAN_MP_USE_DEPTH_MAP_GENERATION
61        if(uiHeight>0 && uiWidth>0) init(uiHeight, uiWidth);
62#else
63        //if(uiHeight>0 && uiWidth>0) init(uiHeight, uiWidth, pcCameraData);
64        if(uiHeight>0 && uiWidth>0) init(uiHeight, uiWidth, aiBaseViewShiftLUT);
65#endif
66}
67
68TComMP::~TComMP()
69{
70        uninit();
71}
72
73#if POZNAN_MP_USE_DEPTH_MAP_GENERATION
74Void TComMP::init(UInt uiHeight, UInt uiWidth)
75#else
76//Void TComMP::init(UInt uiHeight, UInt uiWidth, TAppComCamPara* pcCameraData)
77Void TComMP::init(UInt uiHeight, UInt uiWidth, Int**** aiBaseViewShiftLUT)
78#endif
79{
80        if(m_bInit) uninit();
81
82        m_bInit = true;
83        m_bEnabled = false;
84        m_bDBMPEnabled = false;
85
86        m_uiHeight = uiHeight;
87        m_uiWidth = uiWidth;
88       
89        m_pcRefPicsList = NULL;
90        m_pcDepthRefPicsList = NULL;
91#if POZNAN_MP_USE_DEPTH_MAP_GENERATION
92        m_pcDepthMapGenerator = NULL;
93#else
94        //m_pcCameraData = pcCameraData;
95        m_aiBaseViewShiftLUT = aiBaseViewShiftLUT;
96#endif
97
98/*
99        m_ppiMvPtCorrX = new Short*[m_uiHeight];
100        m_ppiMvPtCorrY = new Short*[m_uiHeight];
101        m_ppiMvPtCorrZ = new Short*[m_uiHeight];
102        m_ppiMvPtCorrRefViewIdx = new Short*[m_uiHeight];
103        m_pppcRefCU = new TComDataCU**[m_uiHeight];
104        m_ppuicRefPartAddr = new UShort*[m_uiHeight];   
105        for(Int i=0;i<m_uiHeight;i++)
106        {
107                m_ppiMvPtCorrX[i] = new Short[m_uiWidth];
108                m_ppiMvPtCorrY[i] = new Short[m_uiWidth];
109                m_ppiMvPtCorrZ[i] = new Short[m_uiWidth];
110                m_ppiMvPtCorrRefViewIdx[i] = new Short[m_uiWidth];
111                m_pppcRefCU[i] = new TComDataCU*[m_uiWidth];
112                m_ppuicRefPartAddr[i]  = new UShort[m_uiWidth];
113        }
114//*/
115///*
116        Short* piPtr;
117        UShort* puiPtr;
118        TComDataCU** ppcPtr;
119
120        m_ppiMvPtCorrX = (Short**)malloc(sizeof(Short*)*m_uiHeight);
121        piPtr = (Short*)malloc(sizeof(Short)*m_uiHeight*m_uiWidth);
122        for(UInt i=0,addr=0;i<m_uiHeight;i++,addr+=m_uiWidth) m_ppiMvPtCorrX[i] = &(piPtr[addr]);
123
124        m_ppiMvPtCorrY = (Short**)malloc(sizeof(Short*)*m_uiHeight);
125        piPtr = (Short*)malloc(sizeof(Short)*m_uiHeight*m_uiWidth);
126        for(UInt i=0,addr=0;i<m_uiHeight;i++,addr+=m_uiWidth) m_ppiMvPtCorrY[i] = &(piPtr[addr]);
127
128        m_ppiMvPtCorrZ = (Short**)malloc(sizeof(Short*)*m_uiHeight);
129        piPtr = (Short*)malloc(sizeof(Short)*m_uiHeight*m_uiWidth);
130        for(UInt i=0,addr=0;i<m_uiHeight;i++,addr+=m_uiWidth) m_ppiMvPtCorrZ[i] = &(piPtr[addr]);
131
132        m_ppiMvPtCorrRefViewIdx = (Short**)malloc(sizeof(Short*)*m_uiHeight);
133        piPtr = (Short*)malloc(sizeof(Short)*m_uiHeight*m_uiWidth);
134        for(UInt i=0,addr=0;i<m_uiHeight;i++,addr+=m_uiWidth) m_ppiMvPtCorrRefViewIdx[i] = &(piPtr[addr]);
135
136        m_pppcRefCU = (TComDataCU***)malloc(sizeof(TComDataCU**)*m_uiHeight);
137        ppcPtr = (TComDataCU**)malloc(sizeof(TComDataCU*)*m_uiHeight*m_uiWidth);
138        for(UInt i=0,addr=0;i<m_uiHeight;i++,addr+=m_uiWidth) m_pppcRefCU[i] = &(ppcPtr[addr]);
139
140        m_ppuicRefPartAddr = (UShort**)malloc(sizeof(UShort*)*m_uiHeight);
141        puiPtr = (UShort*)malloc(sizeof(UShort)*m_uiHeight*m_uiWidth);
142        for(UInt i=0,addr=0;i<m_uiHeight;i++,addr+=m_uiWidth) m_ppuicRefPartAddr[i] = &(puiPtr[addr]);
143//*/
144#if POZNAN_DBMP & !POZNAN_DBMP_COMPRESS_ME_DATA
145        m_ppiL0RefPOC.clear();
146        m_ppiL0MvX.clear();
147        m_ppiL0MvY.clear();
148        m_ppiL1RefPOC.clear();
149        m_ppiL1MvX.clear();
150        m_ppiL1MvY.clear();
151#endif
152
153#if POZNAN_DBMP_CALC_PRED_DATA
154        UInt uiSize = g_uiMaxCUHeight*g_uiMaxCUWidth;
155        m_piTempL0RefIdx = new Int[uiSize]; 
156        m_piTempL0MvX = new Int[uiSize];
157        m_piTempL0MvY = new Int[uiSize];
158        m_piTempL1RefIdx = new Int[uiSize];
159        m_piTempL1MvX = new Int[uiSize];
160        m_piTempL1MvY = new Int[uiSize];
161        m_piTempBuff = new Int[uiSize];
162        m_piResBuff = new Int[uiSize];
163#endif 
164
165#if POZNAN_DBMP_CALC_PRED_DATA
166  apcDBMPPredMVField[0] = new TComCUMvField(); apcDBMPPredMVField[0]->create(uiSize);
167  apcDBMPPredMVField[1] = new TComCUMvField(); apcDBMPPredMVField[1]->create(uiSize);
168#endif
169
170}
171
172#if POZNAN_DBMP & !POZNAN_DBMP_COMPRESS_ME_DATA
173Void TComMP::initArrayMap(UInt uiViewId, Bool bIsDepth)
174{
175        if(bIsDepth) uiViewId += MAX_NUMBER_VIEWS;
176
177        if(m_ppiL0RefPOC.count(uiViewId)) return;
178
179        PUT_MP_ARRAY_TYPE** ppiTemp;
180        PUT_MP_ARRAY_TYPE* piTemp;
181
182/*     
183        ppiTemp = new PUT_MP_ARRAY_TYPE*[m_uiHeight]; for(Int i=0;i<m_uiHeight;i++) ppiTemp[i] = new PUT_MP_ARRAY_TYPE[m_uiWidth];
184        m_ppiL0RefPOC.insert(std::pair<UInt, PUT_MP_ARRAY_TYPE**>(uiViewId, ppiTemp));
185
186        ppiTemp = new PUT_MP_ARRAY_TYPE*[m_uiHeight]; for(Int i=0;i<m_uiHeight;i++) ppiTemp[i] = new PUT_MP_ARRAY_TYPE[m_uiWidth];
187        m_ppiL0MvX.insert(std::pair<UInt, PUT_MP_ARRAY_TYPE**>(uiViewId, ppiTemp));
188
189        ppiTemp = new PUT_MP_ARRAY_TYPE*[m_uiHeight]; for(Int i=0;i<m_uiHeight;i++) ppiTemp[i] = new PUT_MP_ARRAY_TYPE[m_uiWidth];
190        m_ppiL0MvY.insert(std::pair<UInt, PUT_MP_ARRAY_TYPE**>(uiViewId, ppiTemp));
191
192        ppiTemp = new PUT_MP_ARRAY_TYPE*[m_uiHeight]; for(Int i=0;i<m_uiHeight;i++) ppiTemp[i] = new PUT_MP_ARRAY_TYPE[m_uiWidth];
193        m_ppiL1RefPOC.insert(std::pair<UInt, PUT_MP_ARRAY_TYPE**>(uiViewId, ppiTemp));
194
195        ppiTemp = new PUT_MP_ARRAY_TYPE*[m_uiHeight]; for(Int i=0;i<m_uiHeight;i++) ppiTemp[i] = new PUT_MP_ARRAY_TYPE[m_uiWidth];
196        m_ppiL1MvX.insert(std::pair<UInt, PUT_MP_ARRAY_TYPE**>(uiViewId, ppiTemp));
197
198        ppiTemp = new PUT_MP_ARRAY_TYPE*[m_uiHeight]; for(Int i=0;i<m_uiHeight;i++) ppiTemp[i] = new PUT_MP_ARRAY_TYPE[m_uiWidth];
199        m_ppiL1MvY.insert(std::pair<UInt, PUT_MP_ARRAY_TYPE**>(uiViewId, ppiTemp));
200*/
201
202        ppiTemp = (PUT_MP_ARRAY_TYPE**)malloc(sizeof(PUT_MP_ARRAY_TYPE*)*m_uiHeight);
203        piTemp = (PUT_MP_ARRAY_TYPE*)malloc(sizeof(PUT_MP_ARRAY_TYPE)*m_uiHeight*m_uiWidth);
204        for(UInt i=0, addr=0;i<m_uiHeight;i++,addr+=m_uiWidth) ppiTemp[i] = &(piTemp[addr]);
205        m_ppiL0RefPOC.insert(std::pair<UInt, PUT_MP_ARRAY_TYPE**>(uiViewId, ppiTemp));
206
207        ppiTemp = (PUT_MP_ARRAY_TYPE**)malloc(sizeof(PUT_MP_ARRAY_TYPE*)*m_uiHeight);
208        piTemp = (PUT_MP_ARRAY_TYPE*)malloc(sizeof(PUT_MP_ARRAY_TYPE)*m_uiHeight*m_uiWidth);
209        for(UInt i=0, addr=0;i<m_uiHeight;i++,addr+=m_uiWidth) ppiTemp[i] = &(piTemp[addr]);
210        m_ppiL0MvX.insert(std::pair<UInt, PUT_MP_ARRAY_TYPE**>(uiViewId, ppiTemp));
211
212        ppiTemp = (PUT_MP_ARRAY_TYPE**)malloc(sizeof(PUT_MP_ARRAY_TYPE*)*m_uiHeight);
213        piTemp = (PUT_MP_ARRAY_TYPE*)malloc(sizeof(PUT_MP_ARRAY_TYPE)*m_uiHeight*m_uiWidth);
214        for(UInt i=0, addr=0;i<m_uiHeight;i++,addr+=m_uiWidth) ppiTemp[i] = &(piTemp[addr]);
215        m_ppiL0MvY.insert(std::pair<UInt, PUT_MP_ARRAY_TYPE**>(uiViewId, ppiTemp));
216
217        ppiTemp = (PUT_MP_ARRAY_TYPE**)malloc(sizeof(PUT_MP_ARRAY_TYPE*)*m_uiHeight);
218        piTemp = (PUT_MP_ARRAY_TYPE*)malloc(sizeof(PUT_MP_ARRAY_TYPE)*m_uiHeight*m_uiWidth);
219        for(UInt i=0, addr=0;i<m_uiHeight;i++,addr+=m_uiWidth) ppiTemp[i] = &(piTemp[addr]);
220        m_ppiL1RefPOC.insert(std::pair<UInt, PUT_MP_ARRAY_TYPE**>(uiViewId, ppiTemp));
221
222        ppiTemp = (PUT_MP_ARRAY_TYPE**)malloc(sizeof(PUT_MP_ARRAY_TYPE*)*m_uiHeight);
223        piTemp = (PUT_MP_ARRAY_TYPE*)malloc(sizeof(PUT_MP_ARRAY_TYPE)*m_uiHeight*m_uiWidth);
224        for(UInt i=0, addr=0;i<m_uiHeight;i++,addr+=m_uiWidth) ppiTemp[i] = &(piTemp[addr]);
225        m_ppiL1MvX.insert(std::pair<UInt, PUT_MP_ARRAY_TYPE**>(uiViewId, ppiTemp));
226
227        ppiTemp = (PUT_MP_ARRAY_TYPE**)malloc(sizeof(PUT_MP_ARRAY_TYPE*)*m_uiHeight);
228        piTemp = (PUT_MP_ARRAY_TYPE*)malloc(sizeof(PUT_MP_ARRAY_TYPE)*m_uiHeight*m_uiWidth);
229        for(UInt i=0, addr=0;i<m_uiHeight;i++,addr+=m_uiWidth) ppiTemp[i] = &(piTemp[addr]);
230        m_ppiL1MvY.insert(std::pair<UInt, PUT_MP_ARRAY_TYPE**>(uiViewId, ppiTemp));
231}
232#endif
233
234Void TComMP::uninit()
235{
236        if(!m_bInit) return;
237
238        m_bInit = false;
239        m_bEnabled = false;
240        m_bDBMPEnabled = false;
241       
242        m_pcRefPicsList = NULL;
243        m_pcDepthRefPicsList = NULL;
244#if POZNAN_MP_USE_DEPTH_MAP_GENERATION
245        m_pcDepthMapGenerator = NULL;
246#else
247        //m_pcCameraData = NULL;
248        m_aiBaseViewShiftLUT = NULL;
249#endif
250
251        if(m_ppiMvPtCorrX!=NULL)
252        {
253                //for(Int i=0;i<m_uiHeight;i++) delete [] m_ppiMvPtCorrX[i];
254                //delete [] m_ppiMvPtCorrX;
255                free(m_ppiMvPtCorrX[0]);
256                free(m_ppiMvPtCorrX);
257                m_ppiMvPtCorrX = NULL;
258        }
259
260        if(m_ppiMvPtCorrY!=NULL)
261        {
262                //for(Int i=0;i<m_uiHeight;i++) delete [] m_ppiMvPtCorrY[i];
263                //delete [] m_ppiMvPtCorrY;
264                free(m_ppiMvPtCorrY[0]);
265                free(m_ppiMvPtCorrY);
266                m_ppiMvPtCorrY = NULL;
267        }
268
269        if(m_ppiMvPtCorrZ!=NULL)
270        {
271                //for(Int i=0;i<m_uiHeight;i++) delete [] m_ppiMvPtCorrZ[i];
272                //delete [] m_ppiMvPtCorrZ;
273                free(m_ppiMvPtCorrZ[0]);
274                free(m_ppiMvPtCorrZ);
275                m_ppiMvPtCorrZ = NULL;
276        }
277
278        if(m_ppiMvPtCorrRefViewIdx!=NULL)
279        {
280                //for(Int i=0;i<m_uiHeight;i++) delete [] m_ppiMvPtCorrRefViewIdx[i];
281                //delete [] m_ppiMvPtCorrRefViewIdx;
282                free(m_ppiMvPtCorrRefViewIdx[0]);
283                free(m_ppiMvPtCorrRefViewIdx);
284                m_ppiMvPtCorrRefViewIdx = NULL;
285        }
286
287        if(m_pppcRefCU!=NULL)
288        {
289                //for(Int i=0;i<m_uiHeight;i++) delete [] m_pppcRefCU[i];
290                //delete [] m_pppcRefCU;
291                free(m_pppcRefCU[0]);
292                free(m_pppcRefCU);
293                m_pppcRefCU = NULL;
294        }
295
296        if(m_ppuicRefPartAddr!=NULL)
297        {
298                //for(Int i=0;i<m_uiHeight;i++) delete [] m_ppuicRefPartAddr[i];
299                //delete [] m_ppuicRefPartAddr;
300                free(m_ppuicRefPartAddr[0]);
301                free(m_ppuicRefPartAddr);
302                m_ppuicRefPartAddr = NULL;
303        }
304
305#if POZNAN_DBMP & !POZNAN_DBMP_COMPRESS_ME_DATA
306        PUT_MP_ARRAY_TYPE** ppiTemp;
307        TComMapppi::const_iterator cMapIter;
308
309    for (cMapIter = m_ppiL0RefPOC.begin(); cMapIter != m_ppiL0RefPOC.end(); cMapIter++)
310        {
311                ppiTemp = cMapIter->second;
312                if(ppiTemp!=NULL)
313                {
314                        //for(Int i=0;i<m_uiHeight;i++) delete [] ppiTemp[i];
315                        //delete [] ppiTemp;
316                        free(ppiTemp[0]);
317                        free(ppiTemp);
318                        ppiTemp = NULL;
319                }
320        }
321       
322        for (cMapIter = m_ppiL0MvX.begin(); cMapIter != m_ppiL0MvX.end(); cMapIter++)
323        {
324                ppiTemp = cMapIter->second;
325                if(ppiTemp!=NULL)
326                {
327                        //for(Int i=0;i<m_uiHeight;i++) delete [] ppiTemp[i];
328                        //delete [] ppiTemp;
329                        free(ppiTemp[0]);
330                        free(ppiTemp);
331                        ppiTemp = NULL;
332                }
333        }
334
335        for (cMapIter = m_ppiL0MvY.begin(); cMapIter != m_ppiL0MvY.end(); cMapIter++)
336        {
337                ppiTemp = cMapIter->second;
338                if(ppiTemp!=NULL)
339                {
340                        //for(Int i=0;i<m_uiHeight;i++) delete [] ppiTemp[i];
341                        //delete [] ppiTemp;
342                        free(ppiTemp[0]);
343                        free(ppiTemp);
344                        ppiTemp = NULL;
345                }
346        }
347
348        for (cMapIter = m_ppiL1RefPOC.begin(); cMapIter != m_ppiL1RefPOC.end(); cMapIter++)
349        {
350                ppiTemp = cMapIter->second;
351                if(ppiTemp!=NULL)
352                {
353                        //for(Int i=0;i<m_uiHeight;i++) delete [] ppiTemp[i];
354                        //delete [] ppiTemp;
355                        free(ppiTemp[0]);
356                        free(ppiTemp);
357                        ppiTemp = NULL;
358                }
359        }
360
361        for (cMapIter = m_ppiL1MvX.begin(); cMapIter != m_ppiL1MvX.end(); cMapIter++)
362        {
363                ppiTemp = cMapIter->second;
364                if(ppiTemp!=NULL)
365                {
366                        //for(Int i=0;i<m_uiHeight;i++) delete [] ppiTemp[i];
367                        //delete [] ppiTemp;
368                        free(ppiTemp[0]);
369                        free(ppiTemp);
370                        ppiTemp = NULL;
371                }
372        }
373
374        for (cMapIter = m_ppiL1MvY.begin(); cMapIter != m_ppiL1MvY.end(); cMapIter++)
375        {
376                ppiTemp = cMapIter->second;
377                if(ppiTemp!=NULL)
378                {
379                        //for(Int i=0;i<m_uiHeight;i++) delete [] ppiTemp[i];
380                        //delete [] ppiTemp;
381                        free(ppiTemp[0]);
382                        free(ppiTemp);
383                        ppiTemp = NULL;
384                }
385        }
386#endif
387
388#if POZNAN_DBMP_CALC_PRED_DATA
389        if(m_piTempL0RefIdx!=NULL)      { delete [] m_piTempL0RefIdx; m_piTempL0RefIdx = NULL; }
390        if(m_piTempL0MvX!=NULL)         { delete [] m_piTempL0MvX; m_piTempL0MvX = NULL; }
391        if(m_piTempL0MvY!=NULL)         { delete [] m_piTempL0MvY; m_piTempL0MvY = NULL; }
392        if(m_piTempL1RefIdx!=NULL)      { delete [] m_piTempL1RefIdx; m_piTempL1RefIdx = NULL; }
393        if(m_piTempL1MvX!=NULL)         { delete [] m_piTempL1MvX; m_piTempL1MvX = NULL; }
394        if(m_piTempL1MvY!=NULL)         { delete [] m_piTempL1MvY; m_piTempL1MvY = NULL; }
395        if(m_piTempBuff!=NULL)          { delete [] m_piTempBuff; m_piTempBuff = NULL; }
396        if(m_piResBuff!=NULL)           { delete [] m_piResBuff; m_piResBuff = NULL; }
397#endif 
398
399#if POZNAN_DBMP_CALC_PRED_DATA
400  apcDBMPPredMVField[0]->destroy(); delete apcDBMPPredMVField[0]; apcDBMPPredMVField[0] = NULL;
401  apcDBMPPredMVField[1]->destroy(); delete apcDBMPPredMVField[1]; apcDBMPPredMVField[1] = NULL;
402#endif
403
404        m_uiHeight = 0;
405        m_uiWidth = 0;
406}
407
408Void TComMP::clear()
409{
410        Int i,j;
411
412        m_bEnabled = false;
413        m_bDBMPEnabled = false;
414
415        for(i=0;i<m_uiHeight;i++)
416                for(j=0;j<m_uiWidth;j++)
417                {
418                        m_ppiMvPtCorrX[i][j] = TComMP::OCCLUSION;
419                        m_ppiMvPtCorrY[i][j] = TComMP::OCCLUSION;
420                        //m_ppiMvPtCorrZ[i][j] = 0x7FFF; //Depth
421                        m_ppiMvPtCorrZ[i][j] = TComMP::OCCLUSION; //Disparity
422                        m_ppiMvPtCorrRefViewIdx[i][j] = TComMP::OCCLUSION;
423
424                        m_pppcRefCU[i][j] = NULL;
425                        m_ppuicRefPartAddr[i][j] = 0;
426                }
427}
428
429Void TComMP::disable()
430{
431        m_bEnabled = false;
432        m_bDBMPEnabled = false;
433
434        m_pcRefPicsList = NULL;
435        m_pcDepthRefPicsList = NULL;
436#if POZNAN_MP_USE_DEPTH_MAP_GENERATION
437        m_pcDepthMapGenerator = NULL;
438#endif
439}
440
441Bool TComMP::isInit()
442{
443        return m_bInit;
444}
445
446Bool TComMP::isEnabled()
447{
448        return m_bEnabled;
449}
450
451Bool TComMP::isDBMPEnabled()
452{
453        return m_bDBMPEnabled;
454}
455
456Bool TComMP::pairMultiview(TComPic* pcPic)
457{
458        m_bEnabled = false;
459        m_bDBMPEnabled = false;
460
461        if(!isInit() || pcPic==NULL) return false;
462#if POZNAN_MP_USE_DEPTH_MAP_GENERATION
463        if(m_pcDepthMapGenerator==NULL) return false;
464#else
465        //if(m_pcCameraData==NULL) return false;
466        if(m_aiBaseViewShiftLUT==NULL) return false;
467#endif
468        //if(pcPic->getSlice(0)->isIntra()) return true; //no motion compenstation is used!!!
469
470        UInt uiViewId = pcPic->getSPS()->getViewId(); //pcPic->getViewIdx();//???
471        UInt uiPOC = pcPic->getPOC();
472        Bool bIsDepth = pcPic->getSPS()->isDepth();
473
474        if(uiViewId==0) return true; //no reference view available!!!
475       
476#if POZNAN_MP_USE_DEPTH_MAP_GENERATION
477        if(pcPic->getPredDepthMap()==NULL) return false; //no depth available!!!
478#else
479        if(m_pcDepthRefPicsList->empty()) return false; //no depth in reference views available!!!
480#endif
481
482        Int iRefX, iRefY;
483        Int iCurX, iCurY;
484        UInt uiRefViewId;       
485        TComPic* pcRefPic;
486        Int iDisparity; 
487        TComDataCU* pcRefCU;
488
489#if POZNAN_MP_USE_DEPTH_MAP_GENERATION
490        Int iShiftX;
491        Int iAddX;
492#else
493        Int iSynthViewIdx;
494        Int** ppiShiftLUTLeft;
495        TComPic* pcDepthPic;
496        Int iStride;
497        Pel* pDepth;
498        //Bool bIsLeft;
499        Int  iDepth;
500#endif 
501
502        Bool bIsRefNoISliceAvailable = false;
503        Bool bIsAnchorPicture = false;
504
505        clear();
506
507#if POZNAN_MP_USE_DEPTH_MAP_GENERATION
508        for( UInt uiIdx = 0; uiIdx < uiViewId; uiIdx++ )
509        //for( UInt uiIdx = uiViewId-1; uiIdx >= uiViewId; uiIdx-- )
510        {
511                uiRefViewId = m_pcDepthMapGenerator->getBaseViewId( uiIdx );
512
513                iShiftX = m_pcDepthMapGenerator->getSubSampExpX() + 2;
514                iAddX = ( 1 << iShiftX ) >> 1;
515     
516                pcRefPic = (*m_pcRefPicsList)[uiRefViewId];
517
518                if(!pcRefPic->getSlice(0)->isIntra()) bIsRefNoISliceAvailable = true;
519                else bIsAnchorPicture = true;
520
521                for(iCurY=0; iCurY<(Int)m_uiHeight; iCurY++)
522                        for(iCurX=0; iCurX<(Int)m_uiWidth; iCurX++)
523                        if((m_ppiMvPtCorrX[iCurY][iCurX]==TComMP::OCCLUSION || m_ppiMvPtCorrY[iCurY][iCurX]==TComMP::OCCLUSION))
524                        {
525                                iDisparity = m_pcDepthMapGenerator->getDisparity( pcPic, iCurX >> m_pcDepthMapGenerator->getSubSampExpX(), iCurY >> m_pcDepthMapGenerator->getSubSampExpY(), uiRefViewId );
526                                iRefX = iCurX + ( ( iDisparity + iAddX ) >> iShiftX );
527                                iRefY = iCurY;
528                               
529                                if(iRefX>=0 && iRefX<m_uiWidth && iRefY>=0 && iRefY<m_uiHeight)
530                                {
531                                        //m_ppiMvPtCorrRefViewIdx[iCurY][iCurX] = (Short)uiRefViewId;
532                                        m_ppiMvPtCorrX[iCurY][iCurX] = (Short)iRefX;
533                                        m_ppiMvPtCorrY[iCurY][iCurX] = (Short)iRefY;
534
535                                        Pel*   piPdmMap    = pcPic->getPredDepthMap()->getLumaAddr( 0 );
536                                        Int    iStride     = pcPic->getPredDepthMap()->getStride  ();
537                                        Int    iPrdDepth   = piPdmMap[ iCurX + iCurY * iStride ];
538                                        m_ppiMvPtCorrZ[iCurY][iCurX] = (Short)iPrdDepth;
539                                        //m_ppiMvPtCorrZ[iCurY][iCurX] = (Short)iDisparity;                                             
540
541                                        pcRefCU = pcRefPic->getCU((UInt)(iRefY/pcRefPic->getSlice(0)->getSPS()->getMaxCUHeight()*pcRefPic->getFrameWidthInCU() + iRefX/pcRefPic->getSlice(0)->getSPS()->getMaxCUWidth()));
542
543                                        m_pppcRefCU[iCurY][iCurX] = pcRefCU;
544                                        m_ppuicRefPartAddr[iCurY][iCurX] = (UShort)g_auiRasterToZscan[(iRefY-pcRefCU->getCUPelY())/pcRefPic->getMinCUHeight()*pcRefPic->getNumPartInWidth()+(iRefX-pcRefCU->getCUPelX())/pcRefPic->getMinCUWidth()];
545                                }                               
546                        }
547        }
548#else
549        iSynthViewIdx = uiViewId;
550
551        for( UInt uiIdx = 0; uiIdx < uiViewId; uiIdx++ )
552        //for( UInt uiIdx = uiViewId-1; uiIdx >= uiViewId; uiIdx-- )
553        {
554                uiRefViewId = uiIdx;
555
556                pcRefPic = GetPicFromList(m_pcRefPicsList, uiPOC, uiRefViewId);
557                assert(pcRefPic!=NULL);//test
558                if(pcRefPic==NULL) return false; //No ref pic with current POC and RefView found in ref list!!!
559
560                if(!pcRefPic->getSlice(0)->isIntra()) bIsRefNoISliceAvailable = true;
561                else bIsAnchorPicture = true;
562
563                //ppiShiftLUTLeft = m_pcCameraData->getBaseViewShiftLUTI()[uiRefViewId][iSynthViewIdx];
564                ppiShiftLUTLeft = m_aiBaseViewShiftLUT[uiRefViewId][iSynthViewIdx];
565
566                pcDepthPic = GetPicFromList(m_pcDepthRefPicsList, uiPOC, uiRefViewId);
567                assert(pcDepthPic!=NULL);//test
568                if(pcDepthPic==NULL) return false; //No depth with current POC and RefView found in ref list!!!
569
570                pDepth = pcDepthPic->getPicYuvRec()->getLumaAddr();
571                iStride = pcDepthPic->getPicYuvRec()->getStride();
572
573                //bIsLeft = m_pcCameraData->isLeftView(iSynthViewIdx, uiRefViewId);
574
575                for(iRefY=0; iRefY<(Int)m_uiHeight; iRefY++)
576                        for(iRefX=0; iRefX<(Int)m_uiWidth; iRefX++)
577                        {                               
578                                iDepth = pDepth[ iRefX + iRefY * iStride ];
579                                iDepth = RemoveBitIncrement(iDepth);
580                                assert( iDepth >= 0 && iDepth <= 256 );                                 
581                               
582                                //if(bIsLeft) iDisparity = ppiShiftLUTLeft[0][iDepth];
583                                //else iDisparity = -ppiShiftLUTLeft[0][iDepth];
584                                iDisparity = ppiShiftLUTLeft[0][iDepth]; //!!!
585
586                                iCurX = iRefX - ( ( iDisparity + 2 ) >> 2 );
587                                iCurY = iRefY;
588                               
589                                if(iCurX>=0 && iCurX<m_uiWidth && iCurY>=0 && iCurY<m_uiHeight
590                                        && ((m_ppiMvPtCorrX[iCurY][iCurX]==TComMP::OCCLUSION || m_ppiMvPtCorrY[iCurY][iCurX]==TComMP::OCCLUSION)
591                                                || ((m_ppiMvPtCorrRefViewIdx[iCurY][iCurX] == (Short)uiRefViewId) && (m_ppiMvPtCorrZ[iCurY][iCurX]<iDepth))))
592                                {
593                                        m_ppiMvPtCorrRefViewIdx[iCurY][iCurX] = (Short)uiRefViewId;
594                                        m_ppiMvPtCorrX[iCurY][iCurX] = (Short)iRefX;
595                                        m_ppiMvPtCorrY[iCurY][iCurX] = (Short)iRefY;
596
597                                        m_ppiMvPtCorrZ[iCurY][iCurX] = (Short)iDepth;
598                                        //m_ppiMvPtCorrZ[iCurY][iCurX] = (Short)iDisparity;                                             
599
600                                        pcRefCU = pcRefPic->getCU((UInt)(iRefY/pcRefPic->getSlice(0)->getSPS()->getMaxCUHeight()*pcRefPic->getFrameWidthInCU() + iRefX/pcRefPic->getSlice(0)->getSPS()->getMaxCUWidth()));
601
602                                        m_pppcRefCU[iCurY][iCurX] = pcRefCU;
603                                        m_ppuicRefPartAddr[iCurY][iCurX] = (UShort)g_auiRasterToZscan[(iRefY-pcRefCU->getCUPelY())/pcRefPic->getMinCUHeight()*pcRefPic->getNumPartInWidth()+(iRefX-pcRefCU->getCUPelX())/pcRefPic->getMinCUWidth()];
604                                }                               
605                        }
606        }
607#endif
608
609#if POZNAN_MP_FILL
610        fillMultiview(uiViewId);
611#endif
612
613#if POZNAN_DBMP & !POZNAN_DBMP_COMPRESS_ME_DATA
614        for( UInt uiIdx = 0; uiIdx <= uiViewId; uiIdx++ ) initArrayMap(uiIdx, bIsDepth);
615#endif
616       
617        m_uiView = uiViewId;
618        m_uiPOC = uiPOC;
619        m_bIsDepth = bIsDepth;
620        m_bEnabled = true;
621
622#if POZNAN_DBMP
623        m_bDBMPEnabled = (pcPic->getSPS()->getDBMP() > 0) & m_bEnabled & bIsRefNoISliceAvailable; //no reference view with motion data available
624#if POZNAN_DBMP_USE_IN_NONANCHOR_PIC_ONLY
625        m_bDBMPEnabled &= !bIsAnchorPicture; //is non-anchor picture
626#endif
627#if !POZNAN_DBMP_USE_FOR_TEXTURE
628        if(!m_bIsDepth) m_bDBMPEnabled = false;
629#endif
630#if !POZNAN_DBMP_USE_FOR_DEPTH
631        if(m_bIsDepth) m_bDBMPEnabled = false;
632#endif
633#else
634        m_bDBMPEnabled = false;
635#endif
636
637        return true;
638
639}
640
641#if POZNAN_MP_FILL
642Void TComMP::fillMultiview(UInt uiViewId)
643{
644        Int iPicXpos,iPicYpos;
645        Int iRefXpos,iRefYpos;
646        Int iRefXPos1,iRefYPos1,iRefXPos2,iRefYPos2;
647
648        for(iPicYpos=0; iPicYpos<(Int)m_uiHeight;iPicYpos++)
649                for(iPicXpos=0; iPicXpos<(Int)m_uiWidth;iPicXpos++)
650                        if(m_ppiMvPtCorrX[iPicYpos][iPicXpos] == TComMP::OCCLUSION)
651                        {
652                                //Check left-hand  neighbours:
653                                iRefXPos1=TComMP::OCCLUSION;
654                                iRefYPos1=TComMP::OCCLUSION;
655
656                                iRefYpos=iPicYpos;
657                                for(iRefXpos=iPicXpos-1;iRefXpos>=0;iRefXpos--) 
658                                        if(m_ppiMvPtCorrX[iRefYpos][iRefXpos]!=TComMP::OCCLUSION)//Counterpart pixel in reference view exists
659                                        {
660                                                iRefXPos1 = iRefXpos;
661                                                iRefYPos1 = iRefYpos;
662                                                break;
663                                        }
664
665                                //Check right-hand  neighbours:
666                                iRefXPos2=TComMP::OCCLUSION;
667                                iRefYPos2=TComMP::OCCLUSION;
668
669                                iRefYpos=iPicYpos;
670                                for(iRefXpos=iPicXpos+1;iRefXpos<m_uiWidth;iRefXpos++) 
671                                        if(m_ppiMvPtCorrX[iRefYpos][iRefXpos]!=TComMP::OCCLUSION)//Counterpart pixel in reference view exists
672                                        {
673                                                iRefXPos2 = iRefXpos;
674                                                iRefYPos2 = iRefYpos;
675                                                break;
676                                        }
677
678#if POZNAN_MP_FILL_TYPE==0
679
680                                //Choose point with smaller disparity:
681                                if(iRefXPos1!=TComMP::OCCLUSION && iRefYPos1!=TComMP::OCCLUSION)
682                                {
683                                        if(iRefXPos2!=TComMP::OCCLUSION && iRefYPos2!=TComMP::OCCLUSION && m_ppiMvPtCorrZ[iRefYPos1][iRefXPos1]>m_ppiMvPtCorrZ[iRefYPos2][iRefXPos2])
684                                        {
685                                                iRefXpos=iRefXPos2;
686                                                iRefYpos=iRefYPos2;
687                                        }
688                                        else
689                                        {
690                                                iRefXpos=iRefXPos1;
691                                                iRefYpos=iRefYPos1;
692                                        }
693                                }
694                                else
695                                {
696                                        iRefXpos=iRefXPos2;
697                                        iRefYpos=iRefYPos2;
698                                }
699                                if(iRefXpos==TComMP::OCCLUSION && iRefYpos==TComMP::OCCLUSION) continue;
700
701#elif POZNAN_MP_FILL_TYPE==1
702
703                                //Choose point with larger disparity:
704                                if(iRefXPos1!=TComMP::OCCLUSION && iRefYPos1!=TComMP::OCCLUSION)
705                                {
706                                        if(iRefXPos2!=TComMP::OCCLUSION && iRefYPos2!=TComMP::OCCLUSION && m_ppiMvPtCorrZ[iRefYPos1][iRefXPos1]<m_ppiMvPtCorrZ[iRefYPos2][iRefXPos2])
707                                        {
708                                                iRefXpos=iRefXPos2;
709                                                iRefYpos=iRefYPos2;
710                                        }
711                                        else
712                                        {
713                                                iRefXpos=iRefXPos1;
714                                                iRefYpos=iRefYPos1;
715                                        }
716                                }
717                                else
718                                {
719                                        iRefXpos=iRefXPos2;
720                                        iRefYpos=iRefYPos2;
721                                }
722                                if(iRefXpos==TComMP::OCCLUSION && iRefYpos==TComMP::OCCLUSION) continue;
723
724#else
725                                assert(0);
726#endif
727                               
728                                //m_ppiMvPtCorrRefViewIdx[iPicYpos][iPicXpos] = m_ppiMvPtCorrRefViewIdx[iRefYpos][iRefXpos];
729                                m_ppiMvPtCorrX[iPicYpos][iPicXpos] = m_ppiMvPtCorrX[iRefYpos][iRefXpos]; //m_ppiMvPtCorrX[iPicYpos][iPicXpos] = iRefXpos;
730                                m_ppiMvPtCorrY[iPicYpos][iPicXpos] = m_ppiMvPtCorrY[iRefYpos][iRefXpos]; //m_ppiMvPtCorrY[iPicYpos][iPicXpos] = iRefYpos;
731                               
732                                //m_ppiMvPtCorrZ[iPicYpos][iPicXpos] = m_ppiMvPtCorrZ[iRefYpos][iRefXpos];
733                                m_pppcRefCU[iPicYpos][iPicXpos] = m_pppcRefCU[iRefYpos][iRefXpos];
734                                m_ppuicRefPartAddr[iPicYpos][iPicXpos] = m_ppuicRefPartAddr[iRefYpos][iRefXpos];
735                        }
736
737        return;
738}
739#endif
740
741TComPic* TComMP::GetPicFromList(std::vector<TComPic*>* pcListPic,UInt uiPOC, UInt uiView) //Get Pic from list based on POC ad View
742{
743  //  find current position
744  std::vector<TComPic*>::iterator  iterPic;
745  TComPic*                      pcPic   = NULL;
746 
747  for(iterPic = pcListPic->begin(); iterPic != pcListPic->end(); iterPic++)
748  {
749        pcPic = *(iterPic);
750        if((pcPic->getPOC() == (Int)uiPOC) && (pcPic->getViewIdx() == (Int)uiView) && pcPic->getReconMark()) return pcPic;
751        //if((pcPic->getPOC() == (Int)uiPOC) && (pcPic->getViewIdx() == (Int)uiView) ) return pcPic;
752  }
753  assert (0);
754
755  return NULL;
756}
757
758Int TComMP::GetRepresentativeVal(UInt &uiCntMax, Int* piIn, UInt uiLen, Int* piTemp, Bool bUseRestrictedVal, Int iRestrictedVal)
759{
760        UInt i,j,cnt,idx;
761
762        uiCntMax = 0; idx = -1;
763        for(i=0;i<uiLen;i++) piTemp[i] = 0;
764        for(i=0;i<uiLen;i++)
765        {
766                if(piTemp[i] || (bUseRestrictedVal && piIn[i]==iRestrictedVal)) continue;
767                cnt = 0; for(j=0;j<uiLen;j++) if(piIn[j]==piIn[i]) {cnt++; piTemp[j] = 1;}
768                if(cnt>uiCntMax || (cnt==uiCntMax && abs(piIn[i])<abs(piIn[idx]))) {uiCntMax = cnt; idx = i;}           
769        }
770
771        if(idx==-1) return iRestrictedVal;
772        return piIn[idx];
773}
774
775#if POZNAN_DBMP
776inline Void TComMP::getDBMPPredData(TComDataCU* pcCU, Int x, Int y, 
777                                                                                        Int &ref_frame0, Int &ref_frame0_idx, TComMv &mv0, Int ref_frame0_idx_2nd, TComMv mv0_2nd,
778                                                                                        Int &ref_frame1, Int &ref_frame1_idx, TComMv &mv1, Int ref_frame1_idx_2nd, TComMv mv1_2nd)
779{
780        UInt uiViewId = pcCU->getSlice()->getSPS()->getViewId();
781        Bool bIsDepth = pcCU->getSlice()->getSPS()->isDepth();
782        Int iRefIdx;
783        TComPic* pcPic;
784        TComMP* pcMP = pcCU->getSlice()->getMP();
785
786        TComDataCU*pcRefCU = pcMP->getMPCRefCU()[y][x];
787        UInt uiRefPartAddr = pcMP->getMPCRefPartAddr()[y][x];
788
789        Int x_ref = pcMP->getMPCx()[y][x];
790        Int y_ref = pcMP->getMPCy()[y][x];
791
792        ref_frame0 = -1;
793        ref_frame1 = -1;                       
794
795        if(pcRefCU != NULL) //Point has its counterpart in the reference view           
796        {                       
797#if !POZNAN_DBMP_COMPRESS_ME_DATA
798                if(pcRefCU->getMergeIndex(uiRefPartAddr)==POZNAN_DBMP_MRG_CAND)
799                {
800                        UInt uiRefViewId = pcRefCU->getSlice()->getSPS()->getViewId();
801
802                        ref_frame0 = pcMP->getL0RefPOC(uiRefViewId, bIsDepth)[y_ref][x_ref];
803                        mv0.setHor(pcMP->getL0MvX(uiRefViewId, bIsDepth)[y_ref][x_ref]);
804                        mv0.setVer(pcMP->getL0MvY(uiRefViewId, bIsDepth)[y_ref][x_ref]);
805                       
806                        ref_frame1 = pcMP->getL1RefPOC(uiRefViewId, bIsDepth)[y_ref][x_ref];
807                        mv1.setHor(pcMP->getL1MvX(uiRefViewId, bIsDepth)[y_ref][x_ref]);
808                        mv1.setVer(pcMP->getL1MvY(uiRefViewId, bIsDepth)[y_ref][x_ref]);
809                }
810                else
811                {
812#endif
813                        if(pcRefCU->getCUMvField(REF_PIC_LIST_0)->getRefIdx(uiRefPartAddr)>=0)
814                        {
815                                ref_frame0 = pcRefCU->getSlice()->getRefPOC( REF_PIC_LIST_0, pcRefCU->getCUMvField(REF_PIC_LIST_0)->getRefIdx(uiRefPartAddr) );
816                                mv0 = pcRefCU->getCUMvField( REF_PIC_LIST_0 )->getMv( uiRefPartAddr );
817                        }
818
819                        if(pcRefCU->getCUMvField(REF_PIC_LIST_1)->getRefIdx(uiRefPartAddr)>=0)
820                        {
821                                ref_frame1 = pcRefCU->getSlice()->getRefPOC( REF_PIC_LIST_1, pcRefCU->getCUMvField(REF_PIC_LIST_1)->getRefIdx(uiRefPartAddr) );
822                                mv1 = pcRefCU->getCUMvField( REF_PIC_LIST_1 )->getMv( uiRefPartAddr );
823                        }
824#if !POZNAN_DBMP_COMPRESS_ME_DATA
825                }
826#endif
827        }
828
829        //Find ref_frame0 index on REF_PIC_LIST_0
830        ref_frame0_idx = -1;
831        if(ref_frame0 != -1)
832        {                               
833                for( iRefIdx = 0; iRefIdx < pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_0); iRefIdx++ )
834                {
835                        pcPic = pcCU->getSlice()->getRefPic( REF_PIC_LIST_0, iRefIdx );
836                        if(ref_frame0 == pcPic->getPOC() && uiViewId==pcPic->getSPS()->getViewId()){ ref_frame0_idx = iRefIdx; break;}
837                }
838                if(ref_frame0_idx == -1) ref_frame0 = -1;
839        }
840        //Find ref_frame1 index on REF_PIC_LIST_1
841        ref_frame1_idx = -1;
842        if(ref_frame1 != -1)
843        {                               
844                for( iRefIdx = 0; iRefIdx < pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_1); iRefIdx++ )
845                {
846                        pcPic = pcCU->getSlice()->getRefPic( REF_PIC_LIST_1, iRefIdx );
847                        if(ref_frame1 == pcPic->getPOC() && uiViewId==pcCU->getSlice()->getSPS()->getViewId()){ ref_frame1_idx = iRefIdx; break;}
848                }
849                if(ref_frame1_idx == -1) ref_frame1 = -1;
850        }
851
852        if(ref_frame0_idx < 0 && ref_frame1_idx < 0) //No counterpart pixel in reference view found or no motion data was found
853        {
854                ref_frame0_idx = ref_frame0_idx_2nd;
855                mv0 = mv0_2nd;
856                if(ref_frame0_idx_2nd == -1) ref_frame0 = -1;
857                else ref_frame0 = pcCU->getSlice()->getRefPic( REF_PIC_LIST_0, ref_frame0_idx_2nd )->getPOC();
858
859                ref_frame1_idx = ref_frame1_idx_2nd;
860                mv1 = mv1_2nd;
861                if(ref_frame1_idx_2nd == -1) ref_frame1 = -1;
862                else ref_frame1 = pcCU->getSlice()->getRefPic( REF_PIC_LIST_1, ref_frame1_idx_2nd )->getPOC();
863        }
864        else //Counterpart point with motion data was found
865        {
866                if(ref_frame0_idx < 0) 
867                {
868                        ref_frame0_idx = -1;
869                        mv0.setZero();
870                }
871                else
872                {
873                        //use mv0 and RefIdx obtained by the DBMP algorithm
874                }
875
876                if(ref_frame1_idx < 0) 
877                {
878                        ref_frame1_idx = -1;
879                        mv1.setZero();
880                }
881                else
882                {
883                        //use mv0 and RefIdx obtained by the DBMP algorithm
884                }
885        }
886}
887
888#if !POZNAN_DBMP_COMPRESS_ME_DATA
889Void TComMP::saveDBMPData(TComDataCU* pcCU)
890{       
891        if(!isDBMPEnabled()) return;
892
893        Int               px,py,x,y,iCUBaseX,iCUBaseY;
894
895        Int               ref_frame0, ref_frame1;
896        Int               ref_frame0_idx, ref_frame1_idx;
897        TComMv    mv0,mv1;
898
899        Int               ref_frame0_idx_2nd, ref_frame1_idx_2nd;
900    TComMv        mv0_2nd,mv1_2nd;
901
902        UInt      uiViewId = pcCU->getSlice()->getSPS()->getViewId();
903        Bool      bIsDepth = pcCU->getSlice()->getSPS()->isDepth();
904        Int               iWidth = g_uiMaxCUWidth>>g_uiMaxCUDepth;
905        Int               iHeight = g_uiMaxCUHeight>>g_uiMaxCUDepth;
906
907        for (UInt uiPartAddr = 0; uiPartAddr < pcCU->getTotalNumPart(); uiPartAddr++ )
908        {
909                if(pcCU->getMergeIndex(uiPartAddr)==POZNAN_DBMP_MRG_CAND)
910                {                       
911#if POZNAN_DBMP_CALC_PRED_DATA
912                        ref_frame0_idx_2nd = pcCU->getCUMvField2nd(REF_PIC_LIST_0)->getRefIdx(uiPartAddr);
913                        mv0_2nd = pcCU->getCUMvField2nd( REF_PIC_LIST_0 )->getMv( uiPartAddr );
914
915                        ref_frame1_idx_2nd = pcCU->getCUMvField2nd(REF_PIC_LIST_1)->getRefIdx(uiPartAddr);
916                        mv1_2nd = pcCU->getCUMvField2nd( REF_PIC_LIST_1 )->getMv( uiPartAddr );
917#else
918                        ref_frame0_idx_2nd = pcCU->getCUMvField(REF_PIC_LIST_0)->getRefIdx(uiPartAddr);
919                        mv0_2nd = pcCU->getCUMvField( REF_PIC_LIST_0 )->getMv( uiPartAddr );
920
921                        ref_frame1_idx_2nd = pcCU->getCUMvField(REF_PIC_LIST_1)->getRefIdx(uiPartAddr);
922                        mv1_2nd = pcCU->getCUMvField( REF_PIC_LIST_1 )->getMv( uiPartAddr );
923#endif
924                        iCUBaseX = pcCU->getCUPelX()+g_auiRasterToPelX[ g_auiZscanToRaster[uiPartAddr] ];
925                        iCUBaseY = pcCU->getCUPelY()+g_auiRasterToPelY[ g_auiZscanToRaster[uiPartAddr] ];
926                        for( py = 0; py < iHeight; py++)
927                        {
928                                y = iCUBaseY+py;
929                                for( px = 0; px < iWidth; px++)
930                                {
931                                        x = iCUBaseX+px;
932
933                                        getDBMPPredData(pcCU, x, y, ref_frame0, ref_frame0_idx, mv0, ref_frame0_idx_2nd, mv0_2nd, 
934                                                                                ref_frame1, ref_frame1_idx, mv1, ref_frame1_idx_2nd, mv1_2nd);
935
936                                        setL0RefPOC(uiViewId,bIsDepth,x,y,ref_frame0);
937                                        setL0MvX(uiViewId,bIsDepth,x,y,mv0.getHor());
938                                        setL0MvY(uiViewId,bIsDepth,x,y,mv0.getVer());
939
940                                        setL1RefPOC(uiViewId,bIsDepth,x,y,ref_frame1);
941                                        setL1MvX(uiViewId,bIsDepth,x,y,mv1.getHor());
942                                        setL1MvY(uiViewId,bIsDepth,x,y,mv1.getVer());
943                                }
944                        }
945                }
946        }
947}
948#endif
949#endif
950
951#if POZNAN_DBMP_CALC_PRED_DATA
952Void TComMP::calcDBMPPredData(TComDataCU* pcCU, UInt uiAbsPartIdx, Int &ref_frame0_idx,  TComMv &mv0, Int &ref_frame1_idx,  TComMv &mv1)
953{       
954        if(!isDBMPEnabled() || pcCU->getMergeIndex(uiAbsPartIdx)!=POZNAN_DBMP_MRG_CAND) return;
955
956        Int iWidth,iHeight;
957        Int x,y,iCUBaseX,iCUBaseY;
958
959        switch(pcCU->getPartitionSize( uiAbsPartIdx ))
960        {
961                case SIZE_2Nx2N:
962                        iWidth = pcCU->getWidth(uiAbsPartIdx);
963                        iHeight = pcCU->getHeight(uiAbsPartIdx);                       
964                        break;
965                case SIZE_2NxN:
966                        iWidth = pcCU->getWidth(uiAbsPartIdx);
967                        iHeight = pcCU->getHeight(uiAbsPartIdx) >> 1;
968                        break;
969                case SIZE_Nx2N:
970                        iWidth = pcCU->getWidth(uiAbsPartIdx) >> 1;
971                        iHeight = pcCU->getHeight(uiAbsPartIdx);
972                        break;
973                case SIZE_NxN:
974                        iWidth = pcCU->getWidth(uiAbsPartIdx) >> 1;
975                        iHeight = pcCU->getHeight(uiAbsPartIdx) >> 1;
976                        break;
977                default: assert(0);
978        }       
979
980        Int     ref_frame0, ref_frame1;
981               
982        Int ref_frame0_idx_2nd = pcCU->getCUMvField2nd(REF_PIC_LIST_0)->getRefIdx(uiAbsPartIdx);
983        TComMv mv0_2nd = pcCU->getCUMvField2nd( REF_PIC_LIST_0 )->getMv( uiAbsPartIdx );
984
985        Int ref_frame1_idx_2nd = pcCU->getCUMvField2nd(REF_PIC_LIST_1)->getRefIdx(uiAbsPartIdx);
986        TComMv mv1_2nd = pcCU->getCUMvField2nd( REF_PIC_LIST_1 )->getMv( uiAbsPartIdx );
987
988        iCUBaseX = pcCU->getCUPelX()+g_auiRasterToPelX[ g_auiZscanToRaster[uiAbsPartIdx] ];
989        iCUBaseY = pcCU->getCUPelY()+g_auiRasterToPelY[ g_auiZscanToRaster[uiAbsPartIdx] ];
990
991        UInt      uiPointCnt = 0;
992                       
993        for( y = iCUBaseY; y < iCUBaseY+iHeight; y++)
994                for( x = iCUBaseX; x < iCUBaseX+iWidth; x++)
995                {
996                        getDBMPPredData(pcCU, x, y, ref_frame0, ref_frame0_idx, mv0, ref_frame0_idx_2nd, mv0_2nd, 
997                                                                ref_frame1, ref_frame1_idx, mv1, ref_frame1_idx_2nd, mv1_2nd);
998
999                        m_piTempL0RefIdx[uiPointCnt] = ref_frame0_idx;
1000                        m_piTempL0MvX[uiPointCnt] = mv0.getHor();
1001                        m_piTempL0MvY[uiPointCnt] = mv0.getVer();
1002
1003                        m_piTempL1RefIdx[uiPointCnt] = ref_frame1_idx;
1004                        m_piTempL1MvX[uiPointCnt] = mv1.getHor();
1005                        m_piTempL1MvY[uiPointCnt] = mv1.getVer();                       
1006       
1007                        uiPointCnt++;
1008                }
1009
1010        xCalcDBMPPredData(uiPointCnt, ref_frame0_idx, mv0, ref_frame1_idx, mv1);
1011}
1012
1013Void TComMP::setDBMPPredMVField(RefPicList eRefListIdx, TComDataCU* pcCU)
1014{
1015        apcDBMPPredMVField[eRefListIdx]->copyFrom(pcCU->getCUMvField(eRefListIdx), pcCU->getTotalNumPart(), 0);
1016}
1017
1018Void TComMP::setDBMPPredMVField(RefPicList eRefListIdx, TComDataCU* pcCU, Int iNumPartSrc, Int iPartAddrDst)
1019{
1020        apcDBMPPredMVField[eRefListIdx]->copyFrom(pcCU->getCUMvField(eRefListIdx), iNumPartSrc, iPartAddrDst);
1021}
1022#endif
1023
1024#if POZNAN_DBMP_CALC_PRED_DATA
1025inline Void TComMP::xCalcDBMPPredData(UInt uiCnt, Int &ref_frame0_idx, TComMv &mv0, Int &ref_frame1_idx, TComMv &mv1)
1026{       
1027        if(uiCnt==0) return;
1028
1029        Int iVal;
1030        UInt i,uiCntMax,uiCntTemp;
1031
1032        //for(i=0;i<uiCnt;i++) m_piResBuff[i] = (Int)m_piTempL0RefIdx[i]; iVal = GetRepresentativeVal(uiCntMax, m_piResBuff, uiCnt, m_piTempBuff);      ref_frame0_idx = iVal;
1033        //for(i=0;i<uiCnt;i++) m_piResBuff[i] = (Int)m_piTempL0MvX[i];    iVal = GetRepresentativeVal(uiCntMax, m_piResBuff, uiCnt, m_piTempBuff);      mv0.setHor(iVal);
1034        //for(i=0;i<uiCnt;i++) m_piResBuff[i] = (Int)m_piTempL0MvY[i];    iVal = GetRepresentativeVal(uiCntMax, m_piResBuff, uiCnt, m_piTempBuff);      mv0.setVer(iVal);
1035        //for(i=0;i<uiCnt;i++) m_piResBuff[i] = (Int)m_piTempL1RefIdx[i]; iVal = GetRepresentativeVal(uiCntMax, m_piResBuff, uiCnt, m_piTempBuff);      ref_frame1_idx = iVal;
1036        //for(i=0;i<uiCnt;i++) m_piResBuff[i] = (Int)m_piTempL1MvX[i];    iVal = GetRepresentativeVal(uiCntMax, m_piResBuff, uiCnt, m_piTempBuff);      mv1.setHor(iVal);
1037        //for(i=0;i<uiCnt;i++) m_piResBuff[i] = (Int)m_piTempL1MvY[i];    iVal = GetRepresentativeVal(uiCntMax, m_piResBuff, uiCnt, m_piTempBuff);      mv1.setVer(iVal);
1038       
1039        //iVal = GetRepresentativeVal(uiCntMax, m_piTempL0RefIdx, uiCnt, m_piTempBuff); ref_frame0_idx = iVal;
1040        //iVal = GetRepresentativeVal(uiCntMax, m_piTempL0MvX, uiCnt, m_piTempBuff);            mv0.setHor(iVal);
1041        //iVal = GetRepresentativeVal(uiCntMax, m_piTempL0MvY, uiCnt, m_piTempBuff);            mv0.setVer(iVal);
1042        //iVal = GetRepresentativeVal(uiCntMax, m_piTempL1RefIdx, uiCnt, m_piTempBuff); ref_frame1_idx = iVal;
1043        //iVal = GetRepresentativeVal(uiCntMax, m_piTempL1MvX, uiCnt, m_piTempBuff);            mv1.setHor(iVal);
1044        //iVal = GetRepresentativeVal(uiCntMax, m_piTempL1MvY, uiCnt, m_piTempBuff);            mv1.setVer(iVal);
1045
1046        iVal = GetRepresentativeVal(uiCntMax, m_piTempL0RefIdx, uiCnt, m_piTempBuff);   ref_frame0_idx = iVal;
1047        //if(ref_frame0_idx==-1 && (uiCntMax<<1)==uiCnt)
1048        //{
1049        //      iVal = GetRepresentativeVal(uiCntMax, m_piTempL0RefIdx, uiCnt, m_piTempBuff, true, -1);
1050        //      if((uiCntMax<<1)==uiCnt) ref_frame0_idx = iVal;
1051        //}
1052        //if((uiCntMax<<1)==uiCnt)
1053        //{
1054        //      iVal = GetRepresentativeVal(uiCntMax, m_piTempL0RefIdx, uiCnt, m_piTempBuff, true, ref_frame0_idx);     
1055        //      if((uiCntMax<<1)==uiCnt && (ref_frame0_idx==-1 || (iVal!=-1 && iVal<ref_frame0_idx))) ref_frame0_idx = iVal;
1056        //}
1057        if((uiCntMax<<1)<=uiCnt)
1058        {
1059                iVal = GetRepresentativeVal(uiCntTemp, m_piTempL0RefIdx, uiCnt, m_piTempBuff, true, ref_frame0_idx);
1060                if(uiCntTemp==uiCntMax && (ref_frame0_idx==-1 || (iVal!=-1 && iVal<ref_frame0_idx))) ref_frame0_idx = iVal;
1061        }
1062
1063        iVal = GetRepresentativeVal(uiCntMax, m_piTempL1RefIdx, uiCnt, m_piTempBuff);   ref_frame1_idx = iVal;
1064        //if(ref_frame1_idx==-1 && (uiCntMax<<1)==uiCnt)
1065        //{
1066        //      iVal = GetRepresentativeVal(uiCntMax, m_piTempL1RefIdx, uiCnt, m_piTempBuff, true, -1);
1067        //      if((uiCntMax<<1)==uiCnt) ref_frame1_idx = iVal;
1068        //}
1069        //if((uiCntMax<<1)==uiCnt)
1070        //{
1071        //      iVal = GetRepresentativeVal(uiCntMax, m_piTempL1RefIdx, uiCnt, m_piTempBuff, true, ref_frame1_idx);     
1072        //      if((uiCntMax<<1)==uiCnt && (ref_frame1_idx==-1 || (iVal!=-1 && iVal<ref_frame1_idx))) ref_frame1_idx = iVal;
1073        //}
1074        if((uiCntMax<<1)<=uiCnt)
1075        {
1076                iVal = GetRepresentativeVal(uiCntTemp, m_piTempL1RefIdx, uiCnt, m_piTempBuff, true, ref_frame1_idx);
1077                if(uiCntTemp==uiCntMax && (ref_frame1_idx==-1 || (iVal!=-1 && iVal<ref_frame1_idx))) ref_frame1_idx = iVal;
1078        }
1079
1080        if(ref_frame0_idx==-1 && ref_frame1_idx==-1)
1081        {
1082                iVal = GetRepresentativeVal(uiCntMax, m_piTempL0RefIdx, uiCnt, m_piTempBuff, true, -1); ref_frame0_idx = iVal;
1083                iVal = GetRepresentativeVal(uiCntMax, m_piTempL1RefIdx, uiCnt, m_piTempBuff, true, -1); ref_frame1_idx = iVal;
1084        }
1085
1086        if(ref_frame0_idx==-1) 
1087        {
1088                mv0.setHor(0);
1089                mv0.setVer(0);
1090        }
1091        else
1092        {
1093                uiCntTemp=0; for(i=0;i<uiCnt;i++) if(m_piTempL0RefIdx[i]==ref_frame0_idx) m_piResBuff[uiCntTemp++] = (Int)m_piTempL0MvX[i]; 
1094                iVal = GetRepresentativeVal(uiCntMax, m_piResBuff, uiCntTemp, m_piTempBuff);    mv0.setHor(iVal);
1095
1096                uiCntTemp=0; for(i=0;i<uiCnt;i++) if(m_piTempL0RefIdx[i]==ref_frame0_idx) m_piResBuff[uiCntTemp++] = (Int)m_piTempL0MvY[i];
1097                iVal = GetRepresentativeVal(uiCntMax, m_piResBuff, uiCntTemp, m_piTempBuff);    mv0.setVer(iVal);
1098        }       
1099       
1100        if(ref_frame1_idx==-1) 
1101        {
1102                mv1.setHor(0);
1103                mv1.setVer(0);
1104        }
1105        else
1106        {
1107                uiCntTemp=0; for(i=0;i<uiCnt;i++) if(m_piTempL1RefIdx[i]==ref_frame1_idx) m_piResBuff[uiCntTemp++] = (Int)m_piTempL1MvX[i];     
1108                iVal = GetRepresentativeVal(uiCntMax, m_piResBuff, uiCntTemp, m_piTempBuff);    mv1.setHor(iVal);
1109
1110                uiCntTemp=0; for(i=0;i<uiCnt;i++) if(m_piTempL1RefIdx[i]==ref_frame1_idx) m_piResBuff[uiCntTemp++] = (Int)m_piTempL1MvY[i];     
1111                iVal = GetRepresentativeVal(uiCntMax, m_piResBuff, uiCntTemp, m_piTempBuff);    mv1.setVer(iVal);
1112        }
1113}
1114#endif
1115
1116
1117
1118
1119#endif  // POZNAN_MP
Note: See TracBrowser for help on using the repository browser.