History

Initial Commit

Ethan Hugg committed 12 years ago

Commit 70e5e621 parent bd509b2308 files · +97095 −-5Browse files

Showing the changes to codec/decoder/core/src/rec_mb.cpp (1 of 308 files). Show all

Unified · Split

codec/decoder/core/src/rec_mb.cpp+589−0
@@ -0,0 +1,589 @@
1/*!
2 * \copy
3 * Copyright (c) 2009-2013, Cisco Systems
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 *
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
16 * distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 *
31 *
32 * \file rec_mb.c
33 *
34 * \brief implementation for all macroblock decoding process after mb syntax parsing and residual decoding with cavlc.
35 *
36 * \date 3/18/2009 Created
37 *
38 *************************************************************************************
39 */
40#include <memory.h>
41
42#include "macros.h"
43
44#include "rec_mb.h"
45#include "parse_mb_syn_cavlc.h"
46#include "get_intra_predictor.h"
47#include "decode_mb_aux.h"
48#include "decode_slice.h"
49
50namespace WelsDec {
51
52void_t WelsFillRecNeededMbInfo(PWelsDecoderContext pCtx, bool_t bOutput, PDqLayer pCurLayer)
53{
54 PPicture pCurPic = pCtx->pDec;
55 int32_t iLumaStride = pCurPic->iLinesize[0];
56 int32_t iChromaStride = pCurPic->iLinesize[1];
57 int32_t iMbX = pCurLayer->iMbX;
58 int32_t iMbY = pCurLayer->iMbY;
59
60 pCurLayer->iLumaStride= iLumaStride;
61 pCurLayer->iChromaStride= iChromaStride;
62
63 if(bOutput)
64 {
65 pCurLayer->pPred[0] = pCurPic->pData[0] + ((iMbY * iLumaStride + iMbX)<<4);
66 pCurLayer->pPred[1] = pCurPic->pData[1] + ((iMbY * iChromaStride + iMbX)<<3);
67 pCurLayer->pPred[2] = pCurPic->pData[2] + ((iMbY * iChromaStride + iMbX)<<3);
68 }
69}
70
71int32_t RecI4x4Mb(int32_t iMBXY, PWelsDecoderContext pCtx, int16_t *pScoeffLevel, PDqLayer pDqLayer)
72{
73 RecI4x4Luma(iMBXY, pCtx, pScoeffLevel, pDqLayer);
74 RecI4x4Chroma( iMBXY, pCtx, pScoeffLevel, pDqLayer);
75 return ERR_NONE;
76}
77
78int32_t RecI4x4Luma(int32_t iMBXY, PWelsDecoderContext pCtx, int16_t *pScoeffLevel, PDqLayer pDqLayer)
79{
80 /*****get local variable from outer variable********/
81 /*prediction info*/
82 uint8_t *pPred = pDqLayer->pPred[0];
83
84 int32_t iLumaStride = pDqLayer->iLumaStride;
85 int32_t *pBlockOffset = pCtx->iDecBlockOffsetArray;
86 PGetIntraPredFunc *pGetI4x4LumaPredFunc = pCtx->pGetI4x4LumaPredFunc;
87
88 int8_t *pIntra4x4PredMode = pDqLayer->pIntra4x4FinalMode[iMBXY];
89 int16_t *pRS = pScoeffLevel;
90 /*itransform info*/
91 PIdctResAddPredFunc pIdctResAddPredFunc = pCtx->pIdctResAddPredFunc;
92
93
94 /*************local variable********************/
95 uint8_t i = 0;
96
97 /*************real process*********************/
98 for(i=0; i<16; i++)
99 {
100
101 uint8_t *pPredI4x4 = pPred + pBlockOffset[i];
102 uint8_t uiMode= pIntra4x4PredMode[g_kuiScan4[i]];
103
104 pGetI4x4LumaPredFunc[uiMode](pPredI4x4, iLumaStride);
105
106 if ( pDqLayer->pNzc[iMBXY][g_kuiMbNonZeroCountIdx[i]] )
107 {
108 int16_t *pRSI4x4 = &pRS[i<<4];
109 pIdctResAddPredFunc(pPredI4x4, iLumaStride, pRSI4x4);
110 }
111 }
112
113 return ERR_NONE;
114}
115
116
117int32_t RecI4x4Chroma(int32_t iMBXY, PWelsDecoderContext pCtx, int16_t *pScoeffLevel, PDqLayer pDqLayer)
118{
119 int32_t iChromaStride = pCtx->pCurDqLayer->iCsStride[1];
120
121 int8_t iChromaPredMode = pDqLayer->pChromaPredMode[iMBXY];
122
123 PGetIntraPredFunc *pGetIChromaPredFunc = pCtx->pGetIChromaPredFunc;
124
125 uint8_t *pPred = pDqLayer->pPred[1];
126
127 pGetIChromaPredFunc[iChromaPredMode](pPred, iChromaStride);
128 pPred = pDqLayer->pPred[2];
129 pGetIChromaPredFunc[iChromaPredMode](pPred, iChromaStride);
130
131 RecChroma(iMBXY, pCtx, pScoeffLevel, pDqLayer);
132
133 return ERR_NONE;
134}
135
136
137int32_t RecI16x16Mb(int32_t iMBXY, PWelsDecoderContext pCtx, int16_t *pScoeffLevel, PDqLayer pDqLayer)
138{
139 /*decoder use, encoder no use*/
140 int8_t iI16x16PredMode = pDqLayer->pIntraPredMode[iMBXY][7];
141 int8_t iChromaPredMode = pDqLayer->pChromaPredMode[iMBXY];
142 PGetIntraPredFunc *pGetIChromaPredFunc = pCtx->pGetIChromaPredFunc;
143 PGetIntraPredFunc *pGetI16x16LumaPredFunc = pCtx->pGetI16x16LumaPredFunc;
144 int32_t iUVStride = pCtx->pCurDqLayer->iCsStride[1];
145
146 /*common use by decoder&encoder*/
147 int32_t iYStride = pDqLayer->iLumaStride;
148 int32_t *pBlockOffset = pCtx->iDecBlockOffsetArray;
149 int16_t *pRS = pScoeffLevel;
150
151 uint8_t *pPred = pDqLayer->pPred[0];
152
153 PIdctResAddPredFunc pIdctResAddPredFunc = pCtx->pIdctResAddPredFunc;
154
155 uint8_t i = 0;
156
157 /*decode i16x16 y*/
158 pGetI16x16LumaPredFunc[iI16x16PredMode](pPred, iYStride);
159
160 /*1 mb is divided 16 4x4_block to idct*/
161 for(i=0; i<16; i++)
162 {
163 int16_t *pRSI4x4 = pRS + (i<<4);
164 uint8_t *pPredI4x4 = pPred + pBlockOffset[i];
165
166 if ( pDqLayer->pNzc[iMBXY][g_kuiMbNonZeroCountIdx[i]] || pRSI4x4[0] )
167 {
168 pIdctResAddPredFunc(pPredI4x4, iYStride, pRSI4x4);
169 }
170 }
171
172 /*decode intra mb cb&cr*/
173 pPred = pDqLayer->pPred[1];
174 pGetIChromaPredFunc[iChromaPredMode](pPred, iUVStride);
175 pPred = pDqLayer->pPred[2];
176 pGetIChromaPredFunc[iChromaPredMode](pPred, iUVStride);
177 RecChroma(iMBXY, pCtx, pScoeffLevel,pDqLayer);
178
179 return ERR_NONE;
180}
181
182typedef struct TagMCRefMember {
183 uint8_t* pDstY;
184 uint8_t* pDstU;
185 uint8_t* pDstV;
186
187 uint8_t* pSrcY;
188 uint8_t* pSrcU;
189 uint8_t* pSrcV;
190
191 int32_t iSrcLineLuma;
192 int32_t iSrcLineChroma;
193
194 int32_t iDstLineLuma;
195 int32_t iDstLineChroma;
196
197 int32_t iPicWidth;
198 int32_t iPicHeight;
199}sMCRefMember;
200//according to current 8*8 block ref_index to gain reference picture
201static inline void_t GetRefPic(sMCRefMember* pMCRefMem, PWelsDecoderContext pCtx, int8_t* pRefIdxList, int32_t iIndex)
202{
203 PPicture pRefPic;
204
205 int8_t iRefIdx = pRefIdxList[iIndex];
206 pRefPic = pCtx->sRefPic.pRefList[LIST_0][iRefIdx];
207
208 pMCRefMem->iSrcLineLuma = pRefPic->iLinesize[0];
209 pMCRefMem->iSrcLineChroma = pRefPic->iLinesize[1];
210
211 pMCRefMem->pSrcY = pRefPic->pData[0];
212 pMCRefMem->pSrcU = pRefPic->pData[1];
213 pMCRefMem->pSrcV = pRefPic->pData[2];
214}
215
216
217#ifndef MC_FLOW_SIMPLE_JUDGE
218#define MC_FLOW_SIMPLE_JUDGE 1
219#endif //MC_FLOW_SIMPLE_JUDGE
220static inline void_t BaseMC(sMCRefMember* pMCRefMem, int32_t iXOffset, int32_t iYOffset, SMcFunc* pMCFunc,
221 int32_t iBlkWidth, int32_t iBlkHeight, int16_t iMVs[2])
222{
223 int32_t iExpandWidth = PADDING_LENGTH;
224 int32_t iExpandHeight = PADDING_LENGTH;
225
226
227 int16_t iMVX = iMVs[0] >> 2;
228 int16_t iMVY = iMVs[1] >> 2;
229 int32_t iMVOffsetLuma = iMVX + iMVY * pMCRefMem->iSrcLineLuma;
230 int32_t iMVOffsetChroma = (iMVX>>1) + (iMVY>>1) * pMCRefMem->iSrcLineChroma;
231
232 int32_t iFullMVx = (iXOffset << 2) + iMVs[0]; //quarter pixel
233 int32_t iFullMVy = (iYOffset << 2) + iMVs[1];
234 int32_t iIntMVx = iFullMVx >> 2;//integer pixel
235 int32_t iIntMVy = iFullMVy >> 2;
236
237 int32_t iSrcPixOffsetLuma = iXOffset + iYOffset * pMCRefMem->iSrcLineLuma;
238 int32_t iSrcPixOffsetChroma = (iXOffset>>1) + (iYOffset>>1) * pMCRefMem->iSrcLineChroma;
239
240 int32_t iBlkWidthChroma = iBlkWidth >> 1;
241 int32_t iBlkHeightChroma = iBlkHeight >> 1;
242 int32_t iPicWidthChroma = pMCRefMem->iPicWidth >> 1;
243 int32_t iPicHeightChroma = pMCRefMem->iPicHeight >> 1;
244
245 //the offset only for luma padding if MV violation as there was 5-tap (-2, -1, 0, 1, 2) filter for luma (horizon and vertical)
246 int32_t iPadOffset = 2 + (pMCRefMem->iSrcLineLuma << 1); //(-2, -2) pixel location as the starting point
247
248 uint8_t* pSrcY = pMCRefMem->pSrcY + iSrcPixOffsetLuma;
249 uint8_t* pSrcU = pMCRefMem->pSrcU + iSrcPixOffsetChroma;
250 uint8_t* pSrcV = pMCRefMem->pSrcV + iSrcPixOffsetChroma;
251 uint8_t* pDstY = pMCRefMem->pDstY;
252 uint8_t* pDstU = pMCRefMem->pDstU;
253 uint8_t* pDstV = pMCRefMem->pDstV;
254 bool_t bExpand = false;
255
256 FORCE_STACK_ALIGN_1D( uint8_t, uiExpandBuf, (PADDING_LENGTH+6)*(PADDING_LENGTH+6), 16 );
257
258 if (iFullMVx & 0x07)
259 {
260 iExpandWidth -= 3;
261 }
262 if (iFullMVy & 0x07)
263 {
264 iExpandHeight -= 3;
265 }
266
267#ifdef MC_FLOW_SIMPLE_JUDGE
268 if (iIntMVx < -iExpandWidth ||
269 iIntMVy < -iExpandHeight ||
270 iIntMVx + iBlkWidth > pMCRefMem->iPicWidth - 1 + iExpandWidth ||
271 iIntMVy + iBlkHeight > pMCRefMem->iPicHeight - 1 + iExpandHeight)
272#else
273 if (iIntMVx < -iExpandWidth ||
274 iIntMVy < -iExpandHeight ||
275 iIntMVx + PADDING_LENGTH > pMCRefMem->iPicWidth + iExpandWidth ||
276 iIntMVy + PADDING_LENGTH > pMCRefMem->iPicHeight + iExpandHeight)
277#endif
278 {
279 FillBufForMc(uiExpandBuf, 21, pSrcY, pMCRefMem->iSrcLineLuma, iMVOffsetLuma-iPadOffset,
280 iBlkWidth+5, iBlkHeight+5, iIntMVx-2, iIntMVy-2, pMCRefMem->iPicWidth, pMCRefMem->iPicHeight);
281 pMCFunc->pMcLumaFunc(uiExpandBuf+44, 21, pDstY, pMCRefMem->iDstLineLuma, iFullMVx, iFullMVy, iBlkWidth, iBlkHeight);//44=2+2*21
282 bExpand = true;
283 }
284 else
285 {
286 pSrcY += iMVOffsetLuma;
287 pMCFunc->pMcLumaFunc(pSrcY, pMCRefMem->iSrcLineLuma, pDstY, pMCRefMem->iDstLineLuma, iFullMVx, iFullMVy, iBlkWidth, iBlkHeight);
288 }
289
290 if (bExpand)
291 {
292 FillBufForMc(uiExpandBuf, 21, pSrcU, pMCRefMem->iSrcLineChroma, iMVOffsetChroma, iBlkWidthChroma+1, iBlkHeightChroma+1, iFullMVx>>3, iFullMVy>>3, iPicWidthChroma, iPicHeightChroma);
293 pMCFunc->pMcChromaFunc(uiExpandBuf, 21, pDstU, pMCRefMem->iDstLineChroma, iFullMVx, iFullMVy, iBlkWidthChroma, iBlkHeightChroma);
294
295 FillBufForMc(uiExpandBuf, 21, pSrcV, pMCRefMem->iSrcLineChroma, iMVOffsetChroma, iBlkWidthChroma+1, iBlkHeightChroma+1, iFullMVx>>3, iFullMVy>>3, iPicWidthChroma, iPicHeightChroma);
296 pMCFunc->pMcChromaFunc(uiExpandBuf, 21, pDstV, pMCRefMem->iDstLineChroma, iFullMVx, iFullMVy, iBlkWidthChroma, iBlkHeightChroma);
297 }
298 else
299 {
300 pSrcU += iMVOffsetChroma;
301 pSrcV += iMVOffsetChroma;
302 pMCFunc->pMcChromaFunc(pSrcU, pMCRefMem->iSrcLineChroma, pDstU, pMCRefMem->iDstLineChroma, iFullMVx, iFullMVy, iBlkWidthChroma, iBlkHeightChroma);
303 pMCFunc->pMcChromaFunc(pSrcV, pMCRefMem->iSrcLineChroma, pDstV, pMCRefMem->iDstLineChroma, iFullMVx, iFullMVy, iBlkWidthChroma, iBlkHeightChroma);
304 }
305}
306
307void_t GetInterPred(uint8_t *pPredY, uint8_t *pPredCb, uint8_t *pPredCr, PWelsDecoderContext pCtx)
308{
309 sMCRefMember pMCRefMem;
310 PDqLayer pCurDqLayer = pCtx->pCurDqLayer;
311 SMcFunc* pMCFunc = &pCtx->sMcFunc;
312
313 int32_t iMBXY = pCurDqLayer->iMbXyIndex;
314
315 int16_t iMVs[2] = {0};
316
317 int32_t iMBType = pCurDqLayer->pMbType[iMBXY];
318
319 int32_t iMBOffsetX = pCurDqLayer->iMbX << 4;
320 int32_t iMBOffsetY = pCurDqLayer->iMbY << 4;
321
322 int32_t iDstLineLuma = pCtx->pDec->iLinesize[0];
323 int32_t iDstLineChroma = pCtx->pDec->iLinesize[1];
324
325 int32_t iBlk8X, iBlk8Y, iBlk4X, iBlk4Y, i, j, iIIdx, iJIdx;
326
327 pMCRefMem.iPicWidth = (pCurDqLayer->sLayerInfo.sSliceInLayer.sSliceHeaderExt.sSliceHeader.iMbWidth<<4);
328 pMCRefMem.iPicHeight = (pCurDqLayer->sLayerInfo.sSliceInLayer.sSliceHeaderExt.sSliceHeader.iMbHeight<<4);
329
330 pMCRefMem.pDstY = pPredY;
331 pMCRefMem.pDstU = pPredCb;
332 pMCRefMem.pDstV = pPredCr;
333
334 pMCRefMem.iDstLineLuma = iDstLineLuma;
335 pMCRefMem.iDstLineChroma = iDstLineChroma;
336 switch(iMBType)
337 {
338 case MB_TYPE_SKIP:
339 case MB_TYPE_16x16:
340 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][0][0];
341 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][0][1];
342 GetRefPic( &pMCRefMem, pCtx, pCurDqLayer->pRefIndex[0][iMBXY], 0 );
343 BaseMC(&pMCRefMem, iMBOffsetX, iMBOffsetY, pMCFunc, 16, 16, iMVs);
344 break;
345 case MB_TYPE_16x8:
346 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][0][0];
347 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][0][1];
348 GetRefPic( &pMCRefMem, pCtx, pCurDqLayer->pRefIndex[0][iMBXY], 0 );
349 BaseMC(&pMCRefMem, iMBOffsetX, iMBOffsetY, pMCFunc, 16, 8, iMVs);
350
351 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][8][0];
352 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][8][1];
353 GetRefPic( &pMCRefMem, pCtx, pCurDqLayer->pRefIndex[0][iMBXY], 8 );
354 pMCRefMem.pDstY = pPredY + (iDstLineLuma << 3);
355 pMCRefMem.pDstU = pPredCb + (iDstLineChroma << 2);
356 pMCRefMem.pDstV = pPredCr + (iDstLineChroma << 2);
357 BaseMC(&pMCRefMem, iMBOffsetX, iMBOffsetY+8, pMCFunc, 16, 8, iMVs);
358 break;
359 case MB_TYPE_8x16:
360 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][0][0];
361 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][0][1];
362 GetRefPic( &pMCRefMem, pCtx, pCurDqLayer->pRefIndex[0][iMBXY], 0 );
363 BaseMC(&pMCRefMem, iMBOffsetX, iMBOffsetY, pMCFunc, 8, 16, iMVs);
364
365 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][2][0];
366 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][2][1];
367 GetRefPic( &pMCRefMem, pCtx, pCurDqLayer->pRefIndex[0][iMBXY], 2 );
368 pMCRefMem.pDstY = pPredY + 8;
369 pMCRefMem.pDstU = pPredCb + 4;
370 pMCRefMem.pDstV = pPredCr + 4;
371 BaseMC(&pMCRefMem, iMBOffsetX+8, iMBOffsetY, pMCFunc, 8, 16, iMVs);
372 break;
373 case MB_TYPE_8x8:
374 case MB_TYPE_8x8_REF0:
375 {
376 uint32_t iSubMBType;
377 int32_t iXOffset, iYOffset;
378 uint8_t *pDstY, *pDstU, *pDstV;
379 for (i = 0; i < 4; i++)
380 {
381 iSubMBType = pCurDqLayer->pSubMbType[iMBXY][i];
382 iBlk8X = (i&1) << 3;
383 iBlk8Y = (i>>1) << 3;
384 iXOffset = iMBOffsetX + iBlk8X;
385 iYOffset = iMBOffsetY + iBlk8Y;
386
387 iIIdx = ((i>>1)<<3) +((i&1)<<1);
388 GetRefPic( &pMCRefMem, pCtx, pCurDqLayer->pRefIndex[0][iMBXY], iIIdx );
389
390 pDstY = pPredY + iBlk8X + iBlk8Y * iDstLineLuma;
391 pDstU = pPredCb + (iBlk8X >> 1) + (iBlk8Y >> 1) * iDstLineChroma;
392 pDstV = pPredCr + (iBlk8X >> 1) + (iBlk8Y >> 1) * iDstLineChroma;
393 pMCRefMem.pDstY = pDstY;
394 pMCRefMem.pDstU = pDstU;
395 pMCRefMem.pDstV = pDstV;
396 switch(iSubMBType)
397 {
398 case SUB_MB_TYPE_8x8:
399 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][iIIdx][0];
400 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][iIIdx][1];
401 BaseMC( &pMCRefMem, iXOffset, iYOffset, pMCFunc, 8, 8, iMVs );
402 break;
403 case SUB_MB_TYPE_8x4:
404 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][iIIdx][0];
405 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][iIIdx][1];
406 BaseMC(&pMCRefMem, iXOffset, iYOffset, pMCFunc, 8, 4, iMVs);
407
408 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][iIIdx+4][0];
409 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][iIIdx+4][1];
410 pMCRefMem.pDstY += (iDstLineLuma << 2);
411 pMCRefMem.pDstU += (iDstLineChroma << 1);
412 pMCRefMem.pDstV += (iDstLineChroma << 1);
413 BaseMC(&pMCRefMem, iXOffset, iYOffset+4, pMCFunc, 8, 4, iMVs);
414 break;
415 case SUB_MB_TYPE_4x8:
416 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][iIIdx][0];
417 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][iIIdx][1];
418 BaseMC(&pMCRefMem, iXOffset, iYOffset, pMCFunc, 4, 8, iMVs);
419
420 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][iIIdx+1][0];
421 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][iIIdx+1][1];
422 pMCRefMem.pDstY += 4;
423 pMCRefMem.pDstU += 2;
424 pMCRefMem.pDstV += 2;
425 BaseMC(&pMCRefMem, iXOffset+4, iYOffset, pMCFunc, 4, 8, iMVs);
426 break;
427 case SUB_MB_TYPE_4x4:
428 {
429 for (j = 0; j < 4; j++)
430 {
431 int32_t iUVLineStride;
432 iJIdx = ((j>>1)<<2) + (j&1);
433
434 iBlk4X = (j&1) << 2;
435 iBlk4Y = (j>>1) << 2;
436
437 iUVLineStride = (iBlk4X >> 1) + (iBlk4Y >> 1) * iDstLineChroma;
438 pMCRefMem.pDstY = pDstY + iBlk4X + iBlk4Y * iDstLineLuma;
439 pMCRefMem.pDstU = pDstU + iUVLineStride;
440 pMCRefMem.pDstV = pDstV + iUVLineStride;
441
442 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][iIIdx+iJIdx][0];
443 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][iIIdx+iJIdx][1];
444 BaseMC(&pMCRefMem, iXOffset+iBlk4X, iYOffset+iBlk4Y, pMCFunc, 4, 4, iMVs);
445 }
446 }
447 break;
448 default:
449 break;
450 }
451 }
452 }
453 break;
454 default:
455 break;
456 }
457}
458
459int32_t RecChroma(int32_t iMBXY, PWelsDecoderContext pCtx, int16_t *pScoeffLevel, PDqLayer pDqLayer)
460{
461 int32_t iChromaStride = pCtx->pCurDqLayer->iCsStride[1];
462 PIdctResAddPredFunc pIdctResAddPredFunc = pCtx->pIdctResAddPredFunc;
463
464 uint8_t i=0, j=0;
465 uint8_t uiCbpC = pDqLayer->pCbp[iMBXY] >> 4;
466
467 if ( 1 == uiCbpC || 2 == uiCbpC )
468 {
469 WelsChromaDcIdct( pScoeffLevel + 256 ); // 256 = 16*16
470 WelsChromaDcIdct( pScoeffLevel + 320 ); // 256 = 16*16
471 for(i=0; i<2; i++)
472 {
473 int16_t *pRS = pScoeffLevel + 256 + (i << 6);
474 uint8_t *pPred = pDqLayer->pPred[i+1];
475 int32_t *pBlockOffset = i==0 ? &pCtx->iDecBlockOffsetArray[16] : &pCtx->iDecBlockOffsetArray[20];
476
477 /*1 chroma is divided 4 4x4_block to idct*/
478 for(j=0; j<4; j++)
479 {
480 int16_t *pRSI4x4 = &pRS[j<<4];
481 uint8_t *pPredI4x4 = pPred + pBlockOffset[j];
482
483 if ( pDqLayer->pNzc[iMBXY][g_kuiMbNonZeroCountIdx[16+(i<<2)+j]] || pRSI4x4[0] )
484 {
485 pIdctResAddPredFunc(pPredI4x4, iChromaStride, pRSI4x4);
486 }
487 }
488 }
489 }
490
491 return ERR_NONE;
492}
493
494void_t FillBufForMc(uint8_t *pBuf, int32_t iBufStride, uint8_t *pSrc, int32_t iSrcStride, int32_t iSrcOffset,
495 int32_t iBlockWidth, int32_t iBlockHeight, int32_t iSrcX, int32_t iSrcY, int32_t iPicWidth, int32_t iPicHeight)
496{
497 int32_t iY;
498 int32_t iStartY, iStartX, iEndY, iEndX;
499 int32_t iOffsetAdj = 0;
500 int32_t iAddrSrc, iAddrBuf;
501 int32_t iNum, iNum1;
502 uint8_t *pBufSrc, *pBufDst;
503 uint8_t *pBufSrc1, *pBufDst1;
504
505 if( iSrcY >= iPicHeight )
506 {
507 iOffsetAdj += ( iPicHeight - 1 - iSrcY ) * iSrcStride;
508 iSrcY = iPicHeight - 1;
509 }
510 else if( iSrcY <= -iBlockHeight )
511 {
512 iOffsetAdj += ( 1 - iBlockHeight - iSrcY ) * iSrcStride;
513 iSrcY = 1 - iBlockHeight;
514 }
515 if( iSrcX >= iPicWidth )
516 {
517 iOffsetAdj += ( iPicWidth - 1 - iSrcX );
518 iSrcX = iPicWidth - 1;
519 }
520 else if( iSrcX <= -iBlockWidth )
521 {
522 iOffsetAdj += ( 1 - iBlockWidth - iSrcX );
523 iSrcX = 1 - iBlockWidth;
524 }
525
526 iOffsetAdj += iSrcOffset;
527
528#define MAX(a,b) ((a) > (b) ? (a) : (b))
529#define MIN(a,b) ((a) > (b) ? (b) : (a))
530
531 iStartY = MAX(0, -iSrcY);
532 iStartX = MAX(0, -iSrcX);
533 iEndY = MIN(iBlockHeight, iPicHeight - iSrcY);
534 iEndX = MIN(iBlockWidth, iPicWidth - iSrcX);
535
536 // copy existing part
537 iAddrSrc = iStartX + iStartY * iSrcStride;
538 iAddrBuf = iStartX + iStartY * iBufStride;
539 iNum = iEndX - iStartX;
540 for( iY = iStartY; iY < iEndY; iY++ )
541 {
542 memcpy( pBuf + iAddrBuf, pSrc + iOffsetAdj + iAddrSrc, iNum );
543 iAddrSrc += iSrcStride;
544 iAddrBuf += iBufStride;
545 }
546
547 //top
548 pBufSrc = pBuf + iStartX + iStartY * iBufStride;
549 pBufDst = pBuf + iStartX;
550 iNum = iEndX - iStartX;
551 for( iY = 0; iY < iStartY; iY++ )
552 {
553 memcpy( pBufDst, pBufSrc, iNum );
554 pBufDst += iBufStride;
555 }
556
557 //bottom
558 pBufSrc = pBuf + iStartX + ( iEndY - 1 ) * iBufStride;
559 pBufDst = pBuf + iStartX + iEndY * iBufStride;
560 iNum = iEndX - iStartX;
561 for( iY = iEndY; iY < iBlockHeight; iY++ )
562 {
563 memcpy( pBufDst, pBufSrc, iNum );
564 pBufDst += iBufStride;
565 }
566
567
568 pBufSrc = pBuf + iStartX;
569 pBufDst = pBuf;
570 iNum = iStartX;
571
572 pBufSrc1 = pBuf + iEndX - 1;
573 pBufDst1 = pBuf + iEndX;
574 iNum1 = iBlockWidth - iEndX;
575 for( iY=0; iY<iBlockHeight; iY++ )
576 {
577 //left
578 memset( pBufDst, pBufSrc[0], iNum );
579 pBufDst += iBufStride;
580 pBufSrc += iBufStride;
581
582 //right
583 memset( pBufDst1, pBufSrc1[0], iNum1 );
584 pBufDst1 += iBufStride;
585 pBufSrc1 += iBufStride;
586 }
587}
588
589} // namespace WelsDec

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t