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 |
---|
19 | TComMP::TComMP(UInt uiHeight, UInt uiWidth) |
---|
20 | #else |
---|
21 | //TComMP::TComMP(UInt uiHeight, UInt uiWidth, TAppComCamPara* pcCameraData) |
---|
22 | TComMP::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 | |
---|
68 | TComMP::~TComMP() |
---|
69 | { |
---|
70 | uninit(); |
---|
71 | } |
---|
72 | |
---|
73 | #if POZNAN_MP_USE_DEPTH_MAP_GENERATION |
---|
74 | Void TComMP::init(UInt uiHeight, UInt uiWidth) |
---|
75 | #else |
---|
76 | //Void TComMP::init(UInt uiHeight, UInt uiWidth, TAppComCamPara* pcCameraData) |
---|
77 | Void 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 |
---|
173 | Void 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 | |
---|
234 | Void 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 | |
---|
408 | Void 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 | |
---|
429 | Void 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 | |
---|
441 | Bool TComMP::isInit() |
---|
442 | { |
---|
443 | return m_bInit; |
---|
444 | } |
---|
445 | |
---|
446 | Bool TComMP::isEnabled() |
---|
447 | { |
---|
448 | return m_bEnabled; |
---|
449 | } |
---|
450 | |
---|
451 | Bool TComMP::isDBMPEnabled() |
---|
452 | { |
---|
453 | return m_bDBMPEnabled; |
---|
454 | } |
---|
455 | |
---|
456 | Bool 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 |
---|
642 | Void 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 | |
---|
741 | TComPic* 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 | |
---|
758 | Int 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 |
---|
776 | inline 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 |
---|
889 | Void 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 |
---|
952 | Void 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 | |
---|
1013 | Void TComMP::setDBMPPredMVField(RefPicList eRefListIdx, TComDataCU* pcCU) |
---|
1014 | { |
---|
1015 | apcDBMPPredMVField[eRefListIdx]->copyFrom(pcCU->getCUMvField(eRefListIdx), pcCU->getTotalNumPart(), 0); |
---|
1016 | } |
---|
1017 | |
---|
1018 | Void 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 |
---|
1025 | inline 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 |
---|