History

re-structure SWelsDecoderContext and others and prepare for the support of multi-threading support.

xiaotiansf committed 7 years ago

Commit 2f5ecec1 parent 9ed97c729 files · +2285 −1568Browse files

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

Unified · Split

codec/decoder/core/src/decode_slice.cpp+623−623
@@ -79,14 +79,14 @@ static bool CheckRefPics (const PWelsDecoderContext& pCtx) { · 78 unmodified lines
7979 }
8080
8181 int32_t WelsTargetSliceConstruction (PWelsDecoderContext pCtx) {
82− PDqLayer pCurLayer = pCtx->pCurDqLayer;
83− PSlice pCurSlice = &pCurLayer->sLayerInfo.sSliceInLayer;
82+ PDqLayer pCurDqLayer = pCtx->pCurDqLayer;
83+ PSlice pCurSlice = &pCurDqLayer->sLayerInfo.sSliceInLayer;
8484 PSliceHeader pSliceHeader = &pCurSlice->sSliceHeaderExt.sSliceHeader;
8585
8686 int32_t iTotalMbTargetLayer = pSliceHeader->pSps->uiTotalMbCount;
8787
88− int32_t iCurLayerWidth = pCurLayer->iMbWidth << 4;
89− int32_t iCurLayerHeight = pCurLayer->iMbHeight << 4;
88+ int32_t iCurLayerWidth = pCurDqLayer->iMbWidth << 4;
89+ int32_t iCurLayerHeight = pCurDqLayer->iMbHeight << 4;
9090
9191 int32_t iNextMbXyIndex = 0;
9292 PFmo pFmo = pCtx->pFmo;
@@ -95,20 +95,20 @@ int32_t WelsTargetSliceConstruction (PWelsDecoderContext pCtx) { · 2 unmodified lines
9595 int32_t iCountNumMb = 0;
9696 PDeblockingFilterMbFunc pDeblockMb;
9797
98− if (!pCtx->bAvcBasedFlag && iCurLayerWidth != pCtx->iCurSeqIntervalMaxPicWidth) {
98+ if (!pCtx->sSpsPpsCtx.bAvcBasedFlag && iCurLayerWidth != pCtx->iCurSeqIntervalMaxPicWidth) {
9999 return ERR_INFO_WIDTH_MISMATCH;
100100 }
101101
102102 iNextMbXyIndex = pSliceHeader->iFirstMbInSlice;
103− pCurLayer->iMbX = iNextMbXyIndex % pCurLayer->iMbWidth;
104− pCurLayer->iMbY = iNextMbXyIndex / pCurLayer->iMbWidth;
105− pCurLayer->iMbXyIndex = iNextMbXyIndex;
103+ pCurDqLayer->iMbX = iNextMbXyIndex % pCurDqLayer->iMbWidth;
104+ pCurDqLayer->iMbY = iNextMbXyIndex / pCurDqLayer->iMbWidth;
105+ pCurDqLayer->iMbXyIndex = iNextMbXyIndex;
106106
107107 if (0 == iNextMbXyIndex) {
108− pCurLayer->pDec->iSpsId = pCtx->pSps->iSpsId;
109− pCurLayer->pDec->iPpsId = pCtx->pPps->iPpsId;
108+ pCurDqLayer->pDec->iSpsId = pCtx->pSps->iSpsId;
109+ pCurDqLayer->pDec->iPpsId = pCtx->pPps->iPpsId;
110110
111− pCurLayer->pDec->uiQualityId = pCurLayer->sLayerInfo.sNalHeaderExt.uiQualityId;
111+ pCurDqLayer->pDec->uiQualityId = pCurDqLayer->sLayerInfo.sNalHeaderExt.uiQualityId;
112112 }
113113
114114 do {
@@ -120,16 +120,16 @@ int32_t WelsTargetSliceConstruction (PWelsDecoderContext pCtx) { · 5 unmodified lines
120120 if (WelsTargetMbConstruction (pCtx)) {
121121 WelsLog (& (pCtx->sLogCtx), WELS_LOG_WARNING,
122122 "WelsTargetSliceConstruction():::MB(%d, %d) construction error. pCurSlice_type:%d",
123− pCurLayer->iMbX, pCurLayer->iMbY, pCurSlice->eSliceType);
123+ pCurDqLayer->iMbX, pCurDqLayer->iMbY, pCurSlice->eSliceType);
124124
125125 return ERR_INFO_MB_RECON_FAIL;
126126 }
127127 }
128128
129129 ++iCountNumMb;
130− if (!pCurLayer->pMbCorrectlyDecodedFlag[iNextMbXyIndex]) { //already con-ed, overwrite
131− pCurLayer->pMbCorrectlyDecodedFlag[iNextMbXyIndex] = true;
132− pCtx->pDec->iMbEcedPropNum += (pCurLayer->pMbRefConcealedFlag[iNextMbXyIndex] ? 1 : 0);
130+ if (!pCurDqLayer->pMbCorrectlyDecodedFlag[iNextMbXyIndex]) { //already con-ed, overwrite
131+ pCurDqLayer->pMbCorrectlyDecodedFlag[iNextMbXyIndex] = true;
132+ pCtx->pDec->iMbEcedPropNum += (pCurDqLayer->pMbRefConcealedFlag[iNextMbXyIndex] ? 1 : 0);
133133 ++pCtx->iTotalNumMbRec;
134134 }
135135
@@ -149,9 +149,9 @@ int32_t WelsTargetSliceConstruction (PWelsDecoderContext pCtx) { · 13 unmodified lines
149149 if (-1 == iNextMbXyIndex || iNextMbXyIndex >= iTotalMbTargetLayer) { // slice group boundary or end of a frame
150150 break;
151151 }
152− pCurLayer->iMbX = iNextMbXyIndex % pCurLayer->iMbWidth;
153− pCurLayer->iMbY = iNextMbXyIndex / pCurLayer->iMbWidth;
154− pCurLayer->iMbXyIndex = iNextMbXyIndex;
152+ pCurDqLayer->iMbX = iNextMbXyIndex % pCurDqLayer->iMbWidth;
153+ pCurDqLayer->iMbY = iNextMbXyIndex / pCurDqLayer->iMbWidth;
154+ pCurDqLayer->iMbXyIndex = iNextMbXyIndex;
155155 } while (1);
156156
157157 pCtx->pDec->iWidthInPixel = iCurLayerWidth;
@@ -176,32 +176,32 @@ int32_t WelsTargetSliceConstruction (PWelsDecoderContext pCtx) { · 18 unmodified lines
176176 return ERR_NONE;
177177 }
178178
179−int32_t WelsMbInterSampleConstruction (PWelsDecoderContext pCtx, PDqLayer pCurLayer,
179+int32_t WelsMbInterSampleConstruction (PWelsDecoderContext pCtx, PDqLayer pCurDqLayer,
180180 uint8_t* pDstY, uint8_t* pDstU, uint8_t* pDstV, int32_t iStrideL, int32_t iStrideC) {
181− int32_t iMbXy = pCurLayer->iMbXyIndex;
181+ int32_t iMbXy = pCurDqLayer->iMbXyIndex;
182182 int32_t i, iIndex, iOffset;
183183
184− if (pCurLayer->pTransformSize8x8Flag[iMbXy]) {
184+ if (pCurDqLayer->pTransformSize8x8Flag[iMbXy]) {
185185 for (i = 0; i < 4; i++) {
186186 iIndex = g_kuiMbCountScan4Idx[i << 2];
187− if (pCurLayer->pNzc[iMbXy][iIndex] || pCurLayer->pNzc[iMbXy][iIndex + 1] || pCurLayer->pNzc[iMbXy][iIndex + 4]
188− || pCurLayer->pNzc[iMbXy][iIndex + 5]) {
187+ if (pCurDqLayer->pNzc[iMbXy][iIndex] || pCurDqLayer->pNzc[iMbXy][iIndex + 1] || pCurDqLayer->pNzc[iMbXy][iIndex + 4]
188+ || pCurDqLayer->pNzc[iMbXy][iIndex + 5]) {
189189 iOffset = ((iIndex >> 2) << 2) * iStrideL + ((iIndex % 4) << 2);
190− pCtx->pIdctResAddPredFunc8x8 (pDstY + iOffset, iStrideL, pCurLayer->pScaledTCoeff[iMbXy] + (i << 6));
190+ pCtx->pIdctResAddPredFunc8x8 (pDstY + iOffset, iStrideL, pCurDqLayer->pScaledTCoeff[iMbXy] + (i << 6));
191191 }
192192 }
193193 } else {
194194 // luma.
195− const int8_t* pNzc = pCurLayer->pNzc[iMbXy];
196− int16_t* pScaledTCoeff = pCurLayer->pScaledTCoeff[iMbXy];
195+ const int8_t* pNzc = pCurDqLayer->pNzc[iMbXy];
196+ int16_t* pScaledTCoeff = pCurDqLayer->pScaledTCoeff[iMbXy];
197197 pCtx->pIdctFourResAddPredFunc (pDstY + 0 * iStrideL + 0, iStrideL, pScaledTCoeff + 0 * 64, pNzc + 0);
198198 pCtx->pIdctFourResAddPredFunc (pDstY + 0 * iStrideL + 8, iStrideL, pScaledTCoeff + 1 * 64, pNzc + 2);
199199 pCtx->pIdctFourResAddPredFunc (pDstY + 8 * iStrideL + 0, iStrideL, pScaledTCoeff + 2 * 64, pNzc + 8);
200200 pCtx->pIdctFourResAddPredFunc (pDstY + 8 * iStrideL + 8, iStrideL, pScaledTCoeff + 3 * 64, pNzc + 10);
201201 }
202202
203− const int8_t* pNzc = pCurLayer->pNzc[iMbXy];
204− int16_t* pScaledTCoeff = pCurLayer->pScaledTCoeff[iMbXy];
203+ const int8_t* pNzc = pCurDqLayer->pNzc[iMbXy];
204+ int16_t* pScaledTCoeff = pCurDqLayer->pScaledTCoeff[iMbXy];
205205 // Cb.
206206 pCtx->pIdctFourResAddPredFunc (pDstU, iStrideC, pScaledTCoeff + 4 * 64, pNzc + 16);
207207 // Cr.
@@ -209,17 +209,17 @@ int32_t WelsMbInterSampleConstruction (PWelsDecoderContext pCtx, PDqLayer pCurLa · 1 unmodified line
209209
210210 return ERR_NONE;
211211 }
212−int32_t WelsMbInterConstruction (PWelsDecoderContext pCtx, PDqLayer pCurLayer) {
213− int32_t iMbX = pCurLayer->iMbX;
214− int32_t iMbY = pCurLayer->iMbY;
212+int32_t WelsMbInterConstruction (PWelsDecoderContext pCtx, PDqLayer pCurDqLayer) {
213+ int32_t iMbX = pCurDqLayer->iMbX;
214+ int32_t iMbY = pCurDqLayer->iMbY;
215215 uint8_t* pDstY, *pDstCb, *pDstCr;
216216
217217 int32_t iLumaStride = pCtx->pDec->iLinesize[0];
218218 int32_t iChromaStride = pCtx->pDec->iLinesize[1];
219219
220− pDstY = pCurLayer->pDec->pData[0] + ((iMbY * iLumaStride + iMbX) << 4);
221− pDstCb = pCurLayer->pDec->pData[1] + ((iMbY * iChromaStride + iMbX) << 3);
222− pDstCr = pCurLayer->pDec->pData[2] + ((iMbY * iChromaStride + iMbX) << 3);
220+ pDstY = pCurDqLayer->pDec->pData[0] + ((iMbY * iLumaStride + iMbX) << 4);
221+ pDstCb = pCurDqLayer->pDec->pData[1] + ((iMbY * iChromaStride + iMbX) << 3);
222+ pDstCr = pCurDqLayer->pDec->pData[2] + ((iMbY * iChromaStride + iMbX) << 3);
223223
224224 if (pCtx->eSliceType == P_SLICE) {
225225 WELS_B_MB_REC_VERIFY (GetInterPred (pDstY, pDstCb, pDstCr, pCtx));
@@ -236,10 +236,10 @@ int32_t WelsMbInterConstruction (PWelsDecoderContext pCtx, PDqLayer pCurLayer) { · 10 unmodified lines
236236 pDstYCbCr[2] = pDstCr;
237237 WELS_B_MB_REC_VERIFY (GetInterBPred (pDstYCbCr, pTempDstYCbCr, pCtx));
238238 }
239− WelsMbInterSampleConstruction (pCtx, pCurLayer, pDstY, pDstCb, pDstCr, iLumaStride, iChromaStride);
239+ WelsMbInterSampleConstruction (pCtx, pCurDqLayer, pDstY, pDstCb, pDstCr, iLumaStride, iChromaStride);
240240
241241 pCtx->sBlockFunc.pWelsSetNonZeroCountFunc (
242− pCurLayer->pNzc[pCurLayer->iMbXyIndex]); // set all none-zero nzc to 1; dbk can be opti!
242+ pCurDqLayer->pNzc[pCurDqLayer->iMbXyIndex]); // set all none-zero nzc to 1; dbk can be opti!
243243 return ERR_NONE;
244244 }
245245
@@ -285,33 +285,33 @@ void WelsLumaDcDequantIdct (int16_t* pBlock, int32_t iQp, PWelsDecoderContext pC · 39 unmodified lines
285285 #undef STRIDE
286286 }
287287
288−int32_t WelsMbIntraPredictionConstruction (PWelsDecoderContext pCtx, PDqLayer pCurLayer, bool bOutput) {
288+int32_t WelsMbIntraPredictionConstruction (PWelsDecoderContext pCtx, PDqLayer pCurDqLayer, bool bOutput) {
289289 //seems IPCM should not enter this path
290− int32_t iMbXy = pCurLayer->iMbXyIndex;
290+ int32_t iMbXy = pCurDqLayer->iMbXyIndex;
291291
292− WelsFillRecNeededMbInfo (pCtx, bOutput, pCurLayer);
292+ WelsFillRecNeededMbInfo (pCtx, bOutput, pCurDqLayer);
293293
294− if (IS_INTRA16x16 (pCurLayer->pMbType[iMbXy])) {
295− RecI16x16Mb (iMbXy, pCtx, pCurLayer->pScaledTCoeff[iMbXy], pCurLayer);
296− } else if (IS_INTRA8x8 (pCurLayer->pMbType[iMbXy])) {
297− RecI8x8Mb (iMbXy, pCtx, pCurLayer->pScaledTCoeff[iMbXy], pCurLayer);
298− } else if (IS_INTRA4x4 (pCurLayer->pMbType[iMbXy])) {
299− RecI4x4Mb (iMbXy, pCtx, pCurLayer->pScaledTCoeff[iMbXy], pCurLayer);
294+ if (IS_INTRA16x16 (pCurDqLayer->pDec->pMbType[iMbXy])) {
295+ RecI16x16Mb (iMbXy, pCtx, pCurDqLayer->pScaledTCoeff[iMbXy], pCurDqLayer);
296+ } else if (IS_INTRA8x8 (pCurDqLayer->pDec->pMbType[iMbXy])) {
297+ RecI8x8Mb (iMbXy, pCtx, pCurDqLayer->pScaledTCoeff[iMbXy], pCurDqLayer);
298+ } else if (IS_INTRA4x4 (pCurDqLayer->pDec->pMbType[iMbXy])) {
299+ RecI4x4Mb (iMbXy, pCtx, pCurDqLayer->pScaledTCoeff[iMbXy], pCurDqLayer);
300300 }
301301 return ERR_NONE;
302302 }
303303
304−int32_t WelsMbInterPrediction (PWelsDecoderContext pCtx, PDqLayer pCurLayer) {
305− int32_t iMbX = pCurLayer->iMbX;
306− int32_t iMbY = pCurLayer->iMbY;
304+int32_t WelsMbInterPrediction (PWelsDecoderContext pCtx, PDqLayer pCurDqLayer) {
305+ int32_t iMbX = pCurDqLayer->iMbX;
306+ int32_t iMbY = pCurDqLayer->iMbY;
307307 uint8_t* pDstY, *pDstCb, *pDstCr;
308308
309309 int32_t iLumaStride = pCtx->pDec->iLinesize[0];
310310 int32_t iChromaStride = pCtx->pDec->iLinesize[1];
311311
312− pDstY = pCurLayer->pDec->pData[0] + ((iMbY * iLumaStride + iMbX) << 4);
313− pDstCb = pCurLayer->pDec->pData[1] + ((iMbY * iChromaStride + iMbX) << 3);
314− pDstCr = pCurLayer->pDec->pData[2] + ((iMbY * iChromaStride + iMbX) << 3);
312+ pDstY = pCurDqLayer->pDec->pData[0] + ((iMbY * iLumaStride + iMbX) << 4);
313+ pDstCb = pCurDqLayer->pDec->pData[1] + ((iMbY * iChromaStride + iMbX) << 3);
314+ pDstCr = pCurDqLayer->pDec->pData[2] + ((iMbY * iChromaStride + iMbX) << 3);
315315
316316 if (pCtx->eSliceType == P_SLICE) {
317317 WELS_B_MB_REC_VERIFY (GetInterPred (pDstY, pDstCb, pDstCr, pCtx));
@@ -332,24 +332,24 @@ int32_t WelsMbInterPrediction (PWelsDecoderContext pCtx, PDqLayer pCurLayer) { · 14 unmodified lines
332332 }
333333
334334 int32_t WelsTargetMbConstruction (PWelsDecoderContext pCtx) {
335− PDqLayer pCurLayer = pCtx->pCurDqLayer;
336− if (MB_TYPE_INTRA_PCM == pCurLayer->pMbType[pCurLayer->iMbXyIndex]) {
335+ PDqLayer pCurDqLayer = pCtx->pCurDqLayer;
336+ if (MB_TYPE_INTRA_PCM == pCurDqLayer->pDec->pMbType[pCurDqLayer->iMbXyIndex]) {
337337 //already decoded and reconstructed when parsing
338338 return ERR_NONE;
339− } else if (IS_INTRA (pCurLayer->pMbType[pCurLayer->iMbXyIndex])) {
340− WelsMbIntraPredictionConstruction (pCtx, pCurLayer, 1);
341− } else if (IS_INTER (pCurLayer->pMbType[pCurLayer->iMbXyIndex])) { //InterMB
342− if (0 == pCurLayer->pCbp[pCurLayer->iMbXyIndex]) { //uiCbp==0 include SKIP
339+ } else if (IS_INTRA (pCurDqLayer->pDec->pMbType[pCurDqLayer->iMbXyIndex])) {
340+ WelsMbIntraPredictionConstruction (pCtx, pCurDqLayer, 1);
341+ } else if (IS_INTER (pCurDqLayer->pDec->pMbType[pCurDqLayer->iMbXyIndex])) { //InterMB
342+ if (0 == pCurDqLayer->pCbp[pCurDqLayer->iMbXyIndex]) { //uiCbp==0 include SKIP
343343 if (!CheckRefPics (pCtx)) {
344344 return ERR_INFO_MB_RECON_FAIL;
345345 }
346− return WelsMbInterPrediction (pCtx, pCurLayer);
346+ return WelsMbInterPrediction (pCtx, pCurDqLayer);
347347 } else {
348− WelsMbInterConstruction (pCtx, pCurLayer);
348+ WelsMbInterConstruction (pCtx, pCurDqLayer);
349349 }
350350 } else {
351351 WelsLog (& (pCtx->sLogCtx), WELS_LOG_WARNING, "WelsTargetMbConstruction():::::Unknown MB type: %d",
352− pCurLayer->pMbType[pCurLayer->iMbXyIndex]);
352+ pCurDqLayer->pDec->pMbType[pCurDqLayer->iMbXyIndex]);
353353 return ERR_INFO_MB_RECON_FAIL;
354354 }
355355
@@ -644,25 +644,25 @@ int32_t ParseIntra16x16Mode (PWelsDecoderContext pCtx, PWelsNeighAvail pNeighAva · 288 unmodified lines
644644 }
645645
646646 int32_t WelsDecodeMbCabacISliceBaseMode0 (PWelsDecoderContext pCtx, uint32_t& uiEosFlag) {
647− PDqLayer pCurLayer = pCtx->pCurDqLayer;
648− PBitStringAux pBsAux = pCurLayer->pBitStringAux;
649− PSlice pSlice = &pCurLayer->sLayerInfo.sSliceInLayer;
647+ PDqLayer pCurDqLayer = pCtx->pCurDqLayer;
648+ PBitStringAux pBsAux = pCurDqLayer->pBitStringAux;
649+ PSlice pSlice = &pCurDqLayer->sLayerInfo.sSliceInLayer;
650650 PSliceHeader pSliceHeader = &pSlice->sSliceHeaderExt.sSliceHeader;
651651 SWelsNeighAvail sNeighAvail;
652652 int32_t iScanIdxStart = pSlice->sSliceHeaderExt.uiScanIdxStart;
653653 int32_t iScanIdxEnd = pSlice->sSliceHeaderExt.uiScanIdxEnd;
654− int32_t iMbXy = pCurLayer->iMbXyIndex;
654+ int32_t iMbXy = pCurDqLayer->iMbXyIndex;
655655 int32_t i;
656656 uint32_t uiMbType = 0, uiCbp = 0, uiCbpLuma = 0, uiCbpChroma = 0;
657657
658658 ENFORCE_STACK_ALIGN_1D (uint8_t, pNonZeroCount, 48, 16);
659659
660− pCurLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
661− pCurLayer->pTransformSize8x8Flag[iMbXy] = false;
660+ pCurDqLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
661+ pCurDqLayer->pTransformSize8x8Flag[iMbXy] = false;
662662
663− pCurLayer->pInterPredictionDoneFlag[iMbXy] = 0;
664− pCurLayer->pResidualPredFlag[iMbXy] = pSlice->sSliceHeaderExt.bDefaultResidualPredFlag;
665− GetNeighborAvailMbType (&sNeighAvail, pCurLayer);
663+ pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0;
664+ pCurDqLayer->pResidualPredFlag[iMbXy] = pSlice->sSliceHeaderExt.bDefaultResidualPredFlag;
665+ GetNeighborAvailMbType (&sNeighAvail, pCurDqLayer);
666666 WELS_READ_VERIFY (ParseMBTypeISliceCabac (pCtx, &sNeighAvail, uiMbType));
667667 if (uiMbType > 25) {
668668 return GENERATE_ERROR_NO (ERR_LEVEL_MB_DATA, ERR_INFO_INVALID_MB_TYPE);
@@ -680,104 +680,104 @@ int32_t WelsDecodeMbCabacISliceBaseMode0 (PWelsDecoderContext pCtx, uint32_t& ui · 11 unmodified lines
680680 return ERR_NONE;
681681 } else if (0 == uiMbType) { //I4x4
682682 ENFORCE_STACK_ALIGN_1D (int8_t, pIntraPredMode, 48, 16);
683− pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA4x4;
683+ pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA4x4;
684684 if (pCtx->pPps->bTransform8x8ModeFlag) {
685685 // Transform 8x8 cabac will be added soon
686686 WELS_READ_VERIFY (ParseTransformSize8x8FlagCabac (pCtx, &sNeighAvail, pCtx->pCurDqLayer->pTransformSize8x8Flag[iMbXy]));
687687 }
688688 if (pCtx->pCurDqLayer->pTransformSize8x8Flag[iMbXy]) {
689− uiMbType = pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA8x8;
690− pCtx->pFillInfoCacheIntraNxNFunc (&sNeighAvail, pNonZeroCount, pIntraPredMode, pCurLayer);
691− WELS_READ_VERIFY (ParseIntra8x8Mode (pCtx, &sNeighAvail, pIntraPredMode, pBsAux, pCurLayer));
689+ uiMbType = pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA8x8;
690+ pCtx->pFillInfoCacheIntraNxNFunc (&sNeighAvail, pNonZeroCount, pIntraPredMode, pCurDqLayer);
691+ WELS_READ_VERIFY (ParseIntra8x8Mode (pCtx, &sNeighAvail, pIntraPredMode, pBsAux, pCurDqLayer));
692692 } else {
693− pCtx->pFillInfoCacheIntraNxNFunc (&sNeighAvail, pNonZeroCount, pIntraPredMode, pCurLayer);
694− WELS_READ_VERIFY (ParseIntra4x4Mode (pCtx, &sNeighAvail, pIntraPredMode, pBsAux, pCurLayer));
693+ pCtx->pFillInfoCacheIntraNxNFunc (&sNeighAvail, pNonZeroCount, pIntraPredMode, pCurDqLayer);
694+ WELS_READ_VERIFY (ParseIntra4x4Mode (pCtx, &sNeighAvail, pIntraPredMode, pBsAux, pCurDqLayer));
695695 }
696696 //get uiCbp for I4x4
697697 WELS_READ_VERIFY (ParseCbpInfoCabac (pCtx, &sNeighAvail, uiCbp));
698− pCurLayer->pCbp[iMbXy] = uiCbp;
698+ pCurDqLayer->pCbp[iMbXy] = uiCbp;
699699 pSlice->iLastDeltaQp = uiCbp == 0 ? 0 : pSlice->iLastDeltaQp;
700700 uiCbpChroma = pCtx->pSps->uiChromaFormatIdc ? uiCbp >> 4 : 0;
701701 uiCbpLuma = uiCbp & 15;
702702 } else { //I16x16;
703− pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA16x16;
704− pCurLayer->pTransformSize8x8Flag[iMbXy] = false;
705− pCurLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
706− pCurLayer->pIntraPredMode[iMbXy][7] = (uiMbType - 1) & 3;
707− pCurLayer->pCbp[iMbXy] = g_kuiI16CbpTable[ (uiMbType - 1) >> 2];
708− uiCbpChroma = pCtx->pSps->uiChromaFormatIdc ? pCurLayer->pCbp[iMbXy] >> 4 : 0 ;
709− uiCbpLuma = pCurLayer->pCbp[iMbXy] & 15;
710− WelsFillCacheNonZeroCount (&sNeighAvail, pNonZeroCount, pCurLayer);
711− WELS_READ_VERIFY (ParseIntra16x16Mode (pCtx, &sNeighAvail, pBsAux, pCurLayer));
712− }
713−
714− ST32 (&pCurLayer->pNzc[iMbXy][0], 0);
715− ST32 (&pCurLayer->pNzc[iMbXy][4], 0);
716− ST32 (&pCurLayer->pNzc[iMbXy][8], 0);
717− ST32 (&pCurLayer->pNzc[iMbXy][12], 0);
718− ST32 (&pCurLayer->pNzc[iMbXy][16], 0);
719− ST32 (&pCurLayer->pNzc[iMbXy][20], 0);
720− pCurLayer->pCbfDc[iMbXy] = 0;
721−
722− if (pCurLayer->pCbp[iMbXy] == 0 && IS_INTRANxN (pCurLayer->pMbType[iMbXy])) {
723− pCurLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp;
703+ pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA16x16;
704+ pCurDqLayer->pTransformSize8x8Flag[iMbXy] = false;
705+ pCurDqLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
706+ pCurDqLayer->pIntraPredMode[iMbXy][7] = (uiMbType - 1) & 3;
707+ pCurDqLayer->pCbp[iMbXy] = g_kuiI16CbpTable[ (uiMbType - 1) >> 2];
708+ uiCbpChroma = pCtx->pSps->uiChromaFormatIdc ? pCurDqLayer->pCbp[iMbXy] >> 4 : 0 ;
709+ uiCbpLuma = pCurDqLayer->pCbp[iMbXy] & 15;
710+ WelsFillCacheNonZeroCount (&sNeighAvail, pNonZeroCount, pCurDqLayer);
711+ WELS_READ_VERIFY (ParseIntra16x16Mode (pCtx, &sNeighAvail, pBsAux, pCurDqLayer));
712+ }
713+
714+ ST32 (&pCurDqLayer->pNzc[iMbXy][0], 0);
715+ ST32 (&pCurDqLayer->pNzc[iMbXy][4], 0);
716+ ST32 (&pCurDqLayer->pNzc[iMbXy][8], 0);
717+ ST32 (&pCurDqLayer->pNzc[iMbXy][12], 0);
718+ ST32 (&pCurDqLayer->pNzc[iMbXy][16], 0);
719+ ST32 (&pCurDqLayer->pNzc[iMbXy][20], 0);
720+ pCurDqLayer->pCbfDc[iMbXy] = 0;
721+
722+ if (pCurDqLayer->pCbp[iMbXy] == 0 && IS_INTRANxN (pCurDqLayer->pDec->pMbType[iMbXy])) {
723+ pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp;
724724 for (i = 0; i < 2; i++) {
725− pCurLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 ((pCurLayer->pLumaQp[iMbXy] +
725+ pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 ((pCurDqLayer->pLumaQp[iMbXy] +
726726 pSliceHeader->pPps->iChromaQpIndexOffset[i]), 0, 51)];
727727 }
728728 }
729729
730− if (pCurLayer->pCbp[iMbXy] || MB_TYPE_INTRA16x16 == pCurLayer->pMbType[iMbXy]) {
731− memset (pCurLayer->pScaledTCoeff[iMbXy], 0, 384 * sizeof (pCurLayer->pScaledTCoeff[iMbXy][0]));
730+ if (pCurDqLayer->pCbp[iMbXy] || MB_TYPE_INTRA16x16 == pCurDqLayer->pDec->pMbType[iMbXy]) {
731+ memset (pCurDqLayer->pScaledTCoeff[iMbXy], 0, 384 * sizeof (pCurDqLayer->pScaledTCoeff[iMbXy][0]));
732732 int32_t iQpDelta, iId8x8, iId4x4;
733733 WELS_READ_VERIFY (ParseDeltaQpCabac (pCtx, iQpDelta));
734734 if (iQpDelta > 25 || iQpDelta < -26) {//out of iQpDelta range
735735 return GENERATE_ERROR_NO (ERR_LEVEL_MB_DATA, ERR_INFO_INVALID_QP);
736736 }
737− pCurLayer->pLumaQp[iMbXy] = (pSlice->iLastMbQp + iQpDelta + 52) % 52; //update last_mb_qp
738− pSlice->iLastMbQp = pCurLayer->pLumaQp[iMbXy];
737+ pCurDqLayer->pLumaQp[iMbXy] = (pSlice->iLastMbQp + iQpDelta + 52) % 52; //update last_mb_qp
738+ pSlice->iLastMbQp = pCurDqLayer->pLumaQp[iMbXy];
739739 for (i = 0; i < 2; i++) {
740− pCurLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 ((pSlice->iLastMbQp +
740+ pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 ((pSlice->iLastMbQp +
741741 pSliceHeader->pPps->iChromaQpIndexOffset[i]), 0, 51)];
742742 }
743− if (MB_TYPE_INTRA16x16 == pCurLayer->pMbType[iMbXy]) {
743+ if (MB_TYPE_INTRA16x16 == pCurDqLayer->pDec->pMbType[iMbXy]) {
744744 //step1: Luma DC
745745 WELS_READ_VERIFY (ParseResidualBlockCabac (&sNeighAvail, pNonZeroCount, pBsAux, 0, 16, g_kuiLumaDcZigzagScan,
746− I16_LUMA_DC, pCurLayer->pScaledTCoeff[iMbXy], pCurLayer->pLumaQp[iMbXy], pCtx));
746+ I16_LUMA_DC, pCurDqLayer->pScaledTCoeff[iMbXy], pCurDqLayer->pLumaQp[iMbXy], pCtx));
747747 //step2: Luma AC
748748 if (uiCbpLuma) {
749749 for (i = 0; i < 16; i++) {
750750 WELS_READ_VERIFY (ParseResidualBlockCabac (&sNeighAvail, pNonZeroCount, pBsAux, i,
751751 iScanIdxEnd - WELS_MAX (iScanIdxStart, 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), I16_LUMA_AC,
752− pCurLayer->pScaledTCoeff[iMbXy] + (i << 4), pCurLayer->pLumaQp[iMbXy], pCtx));
752+ pCurDqLayer->pScaledTCoeff[iMbXy] + (i << 4), pCurDqLayer->pLumaQp[iMbXy], pCtx));
753753 }
754− ST32 (&pCurLayer->pNzc[iMbXy][0], LD32 (&pNonZeroCount[1 + 8 * 1]));
755− ST32 (&pCurLayer->pNzc[iMbXy][4], LD32 (&pNonZeroCount[1 + 8 * 2]));
756− ST32 (&pCurLayer->pNzc[iMbXy][8], LD32 (&pNonZeroCount[1 + 8 * 3]));
757− ST32 (&pCurLayer->pNzc[iMbXy][12], LD32 (&pNonZeroCount[1 + 8 * 4]));
754+ ST32 (&pCurDqLayer->pNzc[iMbXy][0], LD32 (&pNonZeroCount[1 + 8 * 1]));
755+ ST32 (&pCurDqLayer->pNzc[iMbXy][4], LD32 (&pNonZeroCount[1 + 8 * 2]));
756+ ST32 (&pCurDqLayer->pNzc[iMbXy][8], LD32 (&pNonZeroCount[1 + 8 * 3]));
757+ ST32 (&pCurDqLayer->pNzc[iMbXy][12], LD32 (&pNonZeroCount[1 + 8 * 4]));
758758 } else { //pNonZeroCount = 0
759− ST32 (&pCurLayer->pNzc[iMbXy][0], 0);
760− ST32 (&pCurLayer->pNzc[iMbXy][4], 0);
761− ST32 (&pCurLayer->pNzc[iMbXy][8], 0);
762− ST32 (&pCurLayer->pNzc[iMbXy][12], 0);
759+ ST32 (&pCurDqLayer->pNzc[iMbXy][0], 0);
760+ ST32 (&pCurDqLayer->pNzc[iMbXy][4], 0);
761+ ST32 (&pCurDqLayer->pNzc[iMbXy][8], 0);
762+ ST32 (&pCurDqLayer->pNzc[iMbXy][12], 0);
763763 }
764764 } else { //non-MB_TYPE_INTRA16x16
765− if (pCurLayer->pTransformSize8x8Flag[iMbXy]) {
765+ if (pCurDqLayer->pTransformSize8x8Flag[iMbXy]) {
766766 // Transform 8x8 support for CABAC
767767 for (iId8x8 = 0; iId8x8 < 4; iId8x8++) {
768768 if (uiCbpLuma & (1 << iId8x8)) {
769769 WELS_READ_VERIFY (ParseResidualBlockCabac8x8 (&sNeighAvail, pNonZeroCount, pBsAux, (iId8x8 << 2),
770770 iScanIdxEnd - iScanIdxStart + 1, g_kuiZigzagScan8x8 + iScanIdxStart, LUMA_DC_AC_INTRA_8,
771− pCurLayer->pScaledTCoeff[iMbXy] + (iId8x8 << 6), pCurLayer->pLumaQp[iMbXy], pCtx));
771+ pCurDqLayer->pScaledTCoeff[iMbXy] + (iId8x8 << 6), pCurDqLayer->pLumaQp[iMbXy], pCtx));
772772 } else {
773773 ST16 (&pNonZeroCount[g_kCacheNzcScanIdx[ (iId8x8 << 2)]], 0);
774774 ST16 (&pNonZeroCount[g_kCacheNzcScanIdx[ (iId8x8 << 2) + 2]], 0);
775775 }
776776 }
777− ST32 (&pCurLayer->pNzc[iMbXy][0], LD32 (&pNonZeroCount[1 + 8 * 1]));
778− ST32 (&pCurLayer->pNzc[iMbXy][4], LD32 (&pNonZeroCount[1 + 8 * 2]));
779− ST32 (&pCurLayer->pNzc[iMbXy][8], LD32 (&pNonZeroCount[1 + 8 * 3]));
780− ST32 (&pCurLayer->pNzc[iMbXy][12], LD32 (&pNonZeroCount[1 + 8 * 4]));
777+ ST32 (&pCurDqLayer->pNzc[iMbXy][0], LD32 (&pNonZeroCount[1 + 8 * 1]));
778+ ST32 (&pCurDqLayer->pNzc[iMbXy][4], LD32 (&pNonZeroCount[1 + 8 * 2]));
779+ ST32 (&pCurDqLayer->pNzc[iMbXy][8], LD32 (&pNonZeroCount[1 + 8 * 3]));
780+ ST32 (&pCurDqLayer->pNzc[iMbXy][12], LD32 (&pNonZeroCount[1 + 8 * 4]));
781781 } else {
782782 for (iId8x8 = 0; iId8x8 < 4; iId8x8++) {
783783 if (uiCbpLuma & (1 << iId8x8)) {
@@ -785,8 +785,8 @@ int32_t WelsDecodeMbCabacISliceBaseMode0 (PWelsDecoderContext pCtx, uint32_t& ui · 1 unmodified line
785785 for (iId4x4 = 0; iId4x4 < 4; iId4x4++) {
786786 //Luma (DC and AC decoding together)
787787 WELS_READ_VERIFY (ParseResidualBlockCabac (&sNeighAvail, pNonZeroCount, pBsAux, iIdx, iScanIdxEnd - iScanIdxStart + 1,
788− g_kuiZigzagScan + iScanIdxStart, LUMA_DC_AC_INTRA, pCurLayer->pScaledTCoeff[iMbXy] + (iIdx << 4),
789− pCurLayer->pLumaQp[iMbXy], pCtx));
788+ g_kuiZigzagScan + iScanIdxStart, LUMA_DC_AC_INTRA, pCurDqLayer->pScaledTCoeff[iMbXy] + (iIdx << 4),
789+ pCurDqLayer->pLumaQp[iMbXy], pCtx));
790790 iIdx++;
791791 }
792792 } else {
@@ -794,10 +794,10 @@ int32_t WelsDecodeMbCabacISliceBaseMode0 (PWelsDecoderContext pCtx, uint32_t& ui · 1 unmodified line
794794 ST16 (&pNonZeroCount[g_kCacheNzcScanIdx[ (iId8x8 << 2) + 2]], 0);
795795 }
796796 }
797− ST32 (&pCurLayer->pNzc[iMbXy][0], LD32 (&pNonZeroCount[1 + 8 * 1]));
798− ST32 (&pCurLayer->pNzc[iMbXy][4], LD32 (&pNonZeroCount[1 + 8 * 2]));
799− ST32 (&pCurLayer->pNzc[iMbXy][8], LD32 (&pNonZeroCount[1 + 8 * 3]));
800− ST32 (&pCurLayer->pNzc[iMbXy][12], LD32 (&pNonZeroCount[1 + 8 * 4]));
797+ ST32 (&pCurDqLayer->pNzc[iMbXy][0], LD32 (&pNonZeroCount[1 + 8 * 1]));
798+ ST32 (&pCurDqLayer->pNzc[iMbXy][4], LD32 (&pNonZeroCount[1 + 8 * 2]));
799+ ST32 (&pCurDqLayer->pNzc[iMbXy][8], LD32 (&pNonZeroCount[1 + 8 * 3]));
800+ ST32 (&pCurDqLayer->pNzc[iMbXy][12], LD32 (&pNonZeroCount[1 + 8 * 4]));
801801 }
802802 }
803803 int32_t iMbResProperty;
@@ -808,7 +808,7 @@ int32_t WelsDecodeMbCabacISliceBaseMode0 (PWelsDecoderContext pCtx, uint32_t& ui · 4 unmodified lines
808808 for (i = 0; i < 2; i++) {
809809 iMbResProperty = i ? CHROMA_DC_V : CHROMA_DC_U;
810810 WELS_READ_VERIFY (ParseResidualBlockCabac (&sNeighAvail, pNonZeroCount, pBsAux, 16 + (i << 2), 4, g_kuiChromaDcScan,
811− iMbResProperty, pCurLayer->pScaledTCoeff[iMbXy] + 256 + (i << 6), pCurLayer->pChromaQp[iMbXy][i], pCtx));
811+ iMbResProperty, pCurDqLayer->pScaledTCoeff[iMbXy] + 256 + (i << 6), pCurDqLayer->pChromaQp[iMbXy][i], pCtx));
812812 }
813813 }
814814
@@ -820,27 +820,27 @@ int32_t WelsDecodeMbCabacISliceBaseMode0 (PWelsDecoderContext pCtx, uint32_t& ui · 5 unmodified lines
820820 for (iId4x4 = 0; iId4x4 < 4; iId4x4++) {
821821 WELS_READ_VERIFY (ParseResidualBlockCabac (&sNeighAvail, pNonZeroCount, pBsAux, iIdx,
822822 iScanIdxEnd - WELS_MAX (iScanIdxStart, 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), iMbResProperty,
823− pCurLayer->pScaledTCoeff[iMbXy] + (iIdx << 4), pCurLayer->pChromaQp[iMbXy][i], pCtx));
823+ pCurDqLayer->pScaledTCoeff[iMbXy] + (iIdx << 4), pCurDqLayer->pChromaQp[iMbXy][i], pCtx));
824824 iIdx++;
825825 }
826826 }
827− ST16 (&pCurLayer->pNzc[iMbXy][16], LD16 (&pNonZeroCount[6 + 8 * 1]));
828− ST16 (&pCurLayer->pNzc[iMbXy][20], LD16 (&pNonZeroCount[6 + 8 * 2]));
829− ST16 (&pCurLayer->pNzc[iMbXy][18], LD16 (&pNonZeroCount[6 + 8 * 4]));
830− ST16 (&pCurLayer->pNzc[iMbXy][22], LD16 (&pNonZeroCount[6 + 8 * 5]));
827+ ST16 (&pCurDqLayer->pNzc[iMbXy][16], LD16 (&pNonZeroCount[6 + 8 * 1]));
828+ ST16 (&pCurDqLayer->pNzc[iMbXy][20], LD16 (&pNonZeroCount[6 + 8 * 2]));
829+ ST16 (&pCurDqLayer->pNzc[iMbXy][18], LD16 (&pNonZeroCount[6 + 8 * 4]));
830+ ST16 (&pCurDqLayer->pNzc[iMbXy][22], LD16 (&pNonZeroCount[6 + 8 * 5]));
831831 } else {
832− ST16 (&pCurLayer->pNzc[iMbXy][16], 0);
833− ST16 (&pCurLayer->pNzc[iMbXy][20], 0);
834− ST16 (&pCurLayer->pNzc[iMbXy][18], 0);
835− ST16 (&pCurLayer->pNzc[iMbXy][22], 0);
832+ ST16 (&pCurDqLayer->pNzc[iMbXy][16], 0);
833+ ST16 (&pCurDqLayer->pNzc[iMbXy][20], 0);
834+ ST16 (&pCurDqLayer->pNzc[iMbXy][18], 0);
835+ ST16 (&pCurDqLayer->pNzc[iMbXy][22], 0);
836836 }
837837 } else {
838− ST32 (&pCurLayer->pNzc[iMbXy][0], 0);
839− ST32 (&pCurLayer->pNzc[iMbXy][4], 0);
840− ST32 (&pCurLayer->pNzc[iMbXy][8], 0);
841− ST32 (&pCurLayer->pNzc[iMbXy][12], 0);
842− ST32 (&pCurLayer->pNzc[iMbXy][16], 0);
843− ST32 (&pCurLayer->pNzc[iMbXy][20], 0);
838+ ST32 (&pCurDqLayer->pNzc[iMbXy][0], 0);
839+ ST32 (&pCurDqLayer->pNzc[iMbXy][4], 0);
840+ ST32 (&pCurDqLayer->pNzc[iMbXy][8], 0);
841+ ST32 (&pCurDqLayer->pNzc[iMbXy][12], 0);
842+ ST32 (&pCurDqLayer->pNzc[iMbXy][16], 0);
843+ ST32 (&pCurDqLayer->pNzc[iMbXy][20], 0);
844844 }
845845
846846 WELS_READ_VERIFY (ParseEndOfSliceCabac (pCtx, uiEosFlag));
@@ -856,21 +856,21 @@ int32_t WelsDecodeMbCabacISlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 9 unmodified lines
856856 }
857857
858858 int32_t WelsDecodeMbCabacPSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAvail pNeighAvail, uint32_t& uiEosFlag) {
859− PDqLayer pCurLayer = pCtx->pCurDqLayer;
860− PBitStringAux pBsAux = pCurLayer->pBitStringAux;
861− PSlice pSlice = &pCurLayer->sLayerInfo.sSliceInLayer;
859+ PDqLayer pCurDqLayer = pCtx->pCurDqLayer;
860+ PBitStringAux pBsAux = pCurDqLayer->pBitStringAux;
861+ PSlice pSlice = &pCurDqLayer->sLayerInfo.sSliceInLayer;
862862 PSliceHeader pSliceHeader = &pSlice->sSliceHeaderExt.sSliceHeader;
863863
864864 int32_t iScanIdxStart = pSlice->sSliceHeaderExt.uiScanIdxStart;
865865 int32_t iScanIdxEnd = pSlice->sSliceHeaderExt.uiScanIdxEnd;
866− int32_t iMbXy = pCurLayer->iMbXyIndex;
866+ int32_t iMbXy = pCurDqLayer->iMbXyIndex;
867867 int32_t iMbResProperty;
868868 int32_t i;
869869 uint32_t uiMbType = 0, uiCbp = 0, uiCbpLuma = 0, uiCbpChroma = 0;
870870
871871 ENFORCE_STACK_ALIGN_1D (uint8_t, pNonZeroCount, 48, 16);
872872
873− pCurLayer->pInterPredictionDoneFlag[iMbXy] = 0;
873+ pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0;
874874
875875 WELS_READ_VERIFY (ParseMBTypePSliceCabac (pCtx, pNeighAvail, uiMbType));
876876 // uiMbType = 4 is not allowded.
@@ -878,10 +878,10 @@ int32_t WelsDecodeMbCabacPSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 1 unmodified line
878878 int16_t pMotionVector[LIST_A][30][MV_A];
879879 int16_t pMvdCache[LIST_A][30][MV_A];
880880 int8_t pRefIndex[LIST_A][30];
881− pCurLayer->pMbType[iMbXy] = g_ksInterPMbTypeInfo[uiMbType].iType;
882− WelsFillCacheInterCabac (pNeighAvail, pNonZeroCount, pMotionVector, pMvdCache, pRefIndex, pCurLayer);
881+ pCurDqLayer->pDec->pMbType[iMbXy] = g_ksInterPMbTypeInfo[uiMbType].iType;
882+ WelsFillCacheInterCabac (pNeighAvail, pNonZeroCount, pMotionVector, pMvdCache, pRefIndex, pCurDqLayer);
883883 WELS_READ_VERIFY (ParseInterPMotionInfoCabac (pCtx, pNeighAvail, pNonZeroCount, pMotionVector, pMvdCache, pRefIndex));
884− pCurLayer->pInterPredictionDoneFlag[iMbXy] = 0;
884+ pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0;
885885 } else { //Intra mode
886886 uiMbType -= 5;
887887 if (uiMbType > 25)
@@ -901,58 +901,58 @@ int32_t WelsDecodeMbCabacPSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 13 unmodified lines
901901 } else { //normal Intra mode
902902 if (0 == uiMbType) { //Intra4x4
903903 ENFORCE_STACK_ALIGN_1D (int8_t, pIntraPredMode, 48, 16);
904− pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA4x4;
904+ pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA4x4;
905905 if (pCtx->pPps->bTransform8x8ModeFlag) {
906906 WELS_READ_VERIFY (ParseTransformSize8x8FlagCabac (pCtx, pNeighAvail, pCtx->pCurDqLayer->pTransformSize8x8Flag[iMbXy]));
907907 }
908908 if (pCtx->pCurDqLayer->pTransformSize8x8Flag[iMbXy]) {
909− uiMbType = pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA8x8;
910− pCtx->pFillInfoCacheIntraNxNFunc (pNeighAvail, pNonZeroCount, pIntraPredMode, pCurLayer);
911− WELS_READ_VERIFY (ParseIntra8x8Mode (pCtx, pNeighAvail, pIntraPredMode, pBsAux, pCurLayer));
909+ uiMbType = pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA8x8;
910+ pCtx->pFillInfoCacheIntraNxNFunc (pNeighAvail, pNonZeroCount, pIntraPredMode, pCurDqLayer);
911+ WELS_READ_VERIFY (ParseIntra8x8Mode (pCtx, pNeighAvail, pIntraPredMode, pBsAux, pCurDqLayer));
912912 } else {
913− pCtx->pFillInfoCacheIntraNxNFunc (pNeighAvail, pNonZeroCount, pIntraPredMode, pCurLayer);
914− WELS_READ_VERIFY (ParseIntra4x4Mode (pCtx, pNeighAvail, pIntraPredMode, pBsAux, pCurLayer));
913+ pCtx->pFillInfoCacheIntraNxNFunc (pNeighAvail, pNonZeroCount, pIntraPredMode, pCurDqLayer);
914+ WELS_READ_VERIFY (ParseIntra4x4Mode (pCtx, pNeighAvail, pIntraPredMode, pBsAux, pCurDqLayer));
915915 }
916916 } else { //Intra16x16
917− pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA16x16;
918− pCurLayer->pTransformSize8x8Flag[iMbXy] = false;
919− pCurLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
920− pCurLayer->pIntraPredMode[iMbXy][7] = (uiMbType - 1) & 3;
921− pCurLayer->pCbp[iMbXy] = g_kuiI16CbpTable[ (uiMbType - 1) >> 2];
922− uiCbpChroma = pCtx->pSps->uiChromaFormatIdc ? pCurLayer->pCbp[iMbXy] >> 4 : 0;
923− uiCbpLuma = pCurLayer->pCbp[iMbXy] & 15;
924− WelsFillCacheNonZeroCount (pNeighAvail, pNonZeroCount, pCurLayer);
925− WELS_READ_VERIFY (ParseIntra16x16Mode (pCtx, pNeighAvail, pBsAux, pCurLayer));
917+ pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA16x16;
918+ pCurDqLayer->pTransformSize8x8Flag[iMbXy] = false;
919+ pCurDqLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
920+ pCurDqLayer->pIntraPredMode[iMbXy][7] = (uiMbType - 1) & 3;
921+ pCurDqLayer->pCbp[iMbXy] = g_kuiI16CbpTable[ (uiMbType - 1) >> 2];
922+ uiCbpChroma = pCtx->pSps->uiChromaFormatIdc ? pCurDqLayer->pCbp[iMbXy] >> 4 : 0;
923+ uiCbpLuma = pCurDqLayer->pCbp[iMbXy] & 15;
924+ WelsFillCacheNonZeroCount (pNeighAvail, pNonZeroCount, pCurDqLayer);
925+ WELS_READ_VERIFY (ParseIntra16x16Mode (pCtx, pNeighAvail, pBsAux, pCurDqLayer));
926926 }
927927 }
928928 }
929929
930− ST32 (&pCurLayer->pNzc[iMbXy][0], 0);
931− ST32 (&pCurLayer->pNzc[iMbXy][4], 0);
932− ST32 (&pCurLayer->pNzc[iMbXy][8], 0);
933− ST32 (&pCurLayer->pNzc[iMbXy][12], 0);
934− ST32 (&pCurLayer->pNzc[iMbXy][16], 0);
935− ST32 (&pCurLayer->pNzc[iMbXy][20], 0);
930+ ST32 (&pCurDqLayer->pNzc[iMbXy][0], 0);
931+ ST32 (&pCurDqLayer->pNzc[iMbXy][4], 0);
932+ ST32 (&pCurDqLayer->pNzc[iMbXy][8], 0);
933+ ST32 (&pCurDqLayer->pNzc[iMbXy][12], 0);
934+ ST32 (&pCurDqLayer->pNzc[iMbXy][16], 0);
935+ ST32 (&pCurDqLayer->pNzc[iMbXy][20], 0);
936936
937− if (MB_TYPE_INTRA16x16 != pCurLayer->pMbType[iMbXy]) {
937+ if (MB_TYPE_INTRA16x16 != pCurDqLayer->pDec->pMbType[iMbXy]) {
938938 WELS_READ_VERIFY (ParseCbpInfoCabac (pCtx, pNeighAvail, uiCbp));
939939
940− pCurLayer->pCbp[iMbXy] = uiCbp;
940+ pCurDqLayer->pCbp[iMbXy] = uiCbp;
941941 pSlice->iLastDeltaQp = uiCbp == 0 ? 0 : pSlice->iLastDeltaQp;
942− uiCbpChroma = pCtx->pSps->uiChromaFormatIdc ? pCurLayer->pCbp[iMbXy] >> 4 : 0 ;
943− uiCbpLuma = pCurLayer->pCbp[iMbXy] & 15;
942+ uiCbpChroma = pCtx->pSps->uiChromaFormatIdc ? pCurDqLayer->pCbp[iMbXy] >> 4 : 0 ;
943+ uiCbpLuma = pCurDqLayer->pCbp[iMbXy] & 15;
944944 }
945945
946− if (pCurLayer->pCbp[iMbXy] || MB_TYPE_INTRA16x16 == pCurLayer->pMbType[iMbXy]) {
946+ if (pCurDqLayer->pCbp[iMbXy] || MB_TYPE_INTRA16x16 == pCurDqLayer->pDec->pMbType[iMbXy]) {
947947
948− if (MB_TYPE_INTRA16x16 != pCurLayer->pMbType[iMbXy]) {
948+ if (MB_TYPE_INTRA16x16 != pCurDqLayer->pDec->pMbType[iMbXy]) {
949949 // Need modification when B picutre add in
950950 bool bNeedParseTransformSize8x8Flag =
951− (((pCurLayer->pMbType[iMbXy] >= MB_TYPE_16x16 && pCurLayer->pMbType[iMbXy] <= MB_TYPE_8x16)
952− || pCurLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy])
953− && (pCurLayer->pMbType[iMbXy] != MB_TYPE_INTRA8x8)
954− && (pCurLayer->pMbType[iMbXy] != MB_TYPE_INTRA4x4)
955− && ((pCurLayer->pCbp[iMbXy] & 0x0F) > 0)
951+ (((pCurDqLayer->pDec->pMbType[iMbXy] >= MB_TYPE_16x16 && pCurDqLayer->pDec->pMbType[iMbXy] <= MB_TYPE_8x16)
952+ || pCurDqLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy])
953+ && (pCurDqLayer->pDec->pMbType[iMbXy] != MB_TYPE_INTRA8x8)
954+ && (pCurDqLayer->pDec->pMbType[iMbXy] != MB_TYPE_INTRA4x4)
955+ && ((pCurDqLayer->pCbp[iMbXy] & 0x0F) > 0)
956956 && (pCtx->pPps->bTransform8x8ModeFlag));
957957
958958 if (bNeedParseTransformSize8x8Flag) {
@@ -961,7 +961,7 @@ int32_t WelsDecodeMbCabacPSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 2 unmodified lines
961961 }
962962 }
963963
964− memset (pCurLayer->pScaledTCoeff[iMbXy], 0, 384 * sizeof (pCurLayer->pScaledTCoeff[iMbXy][0]));
964+ memset (pCurDqLayer->pScaledTCoeff[iMbXy], 0, 384 * sizeof (pCurDqLayer->pScaledTCoeff[iMbXy][0]));
965965
966966 int32_t iQpDelta, iId8x8, iId4x4;
967967
@@ -969,33 +969,33 @@ int32_t WelsDecodeMbCabacPSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 1 unmodified line
969969 if (iQpDelta > 25 || iQpDelta < -26) { //out of iQpDelta range
970970 return GENERATE_ERROR_NO (ERR_LEVEL_MB_DATA, ERR_INFO_INVALID_QP);
971971 }
972− pCurLayer->pLumaQp[iMbXy] = (pSlice->iLastMbQp + iQpDelta + 52) % 52; //update last_mb_qp
973− pSlice->iLastMbQp = pCurLayer->pLumaQp[iMbXy];
972+ pCurDqLayer->pLumaQp[iMbXy] = (pSlice->iLastMbQp + iQpDelta + 52) % 52; //update last_mb_qp
973+ pSlice->iLastMbQp = pCurDqLayer->pLumaQp[iMbXy];
974974 for (i = 0; i < 2; i++) {
975− pCurLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp +
975+ pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp +
976976 pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)];
977977 }
978978
979− if (MB_TYPE_INTRA16x16 == pCurLayer->pMbType[iMbXy]) {
979+ if (MB_TYPE_INTRA16x16 == pCurDqLayer->pDec->pMbType[iMbXy]) {
980980 //step1: Luma DC
981981 WELS_READ_VERIFY (ParseResidualBlockCabac (pNeighAvail, pNonZeroCount, pBsAux, 0, 16, g_kuiLumaDcZigzagScan,
982− I16_LUMA_DC, pCurLayer->pScaledTCoeff[iMbXy], pCurLayer->pLumaQp[iMbXy], pCtx));
982+ I16_LUMA_DC, pCurDqLayer->pScaledTCoeff[iMbXy], pCurDqLayer->pLumaQp[iMbXy], pCtx));
983983 //step2: Luma AC
984984 if (uiCbpLuma) {
985985 for (i = 0; i < 16; i++) {
986986 WELS_READ_VERIFY (ParseResidualBlockCabac (pNeighAvail, pNonZeroCount, pBsAux, i, iScanIdxEnd - WELS_MAX (iScanIdxStart,
987− 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), I16_LUMA_AC, pCurLayer->pScaledTCoeff[iMbXy] + (i << 4),
988− pCurLayer->pLumaQp[iMbXy], pCtx));
987+ 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), I16_LUMA_AC, pCurDqLayer->pScaledTCoeff[iMbXy] + (i << 4),
988+ pCurDqLayer->pLumaQp[iMbXy], pCtx));
989989 }
990− ST32 (&pCurLayer->pNzc[iMbXy][0], LD32 (&pNonZeroCount[1 + 8 * 1]));
991− ST32 (&pCurLayer->pNzc[iMbXy][4], LD32 (&pNonZeroCount[1 + 8 * 2]));
992− ST32 (&pCurLayer->pNzc[iMbXy][8], LD32 (&pNonZeroCount[1 + 8 * 3]));
993− ST32 (&pCurLayer->pNzc[iMbXy][12], LD32 (&pNonZeroCount[1 + 8 * 4]));
990+ ST32 (&pCurDqLayer->pNzc[iMbXy][0], LD32 (&pNonZeroCount[1 + 8 * 1]));
991+ ST32 (&pCurDqLayer->pNzc[iMbXy][4], LD32 (&pNonZeroCount[1 + 8 * 2]));
992+ ST32 (&pCurDqLayer->pNzc[iMbXy][8], LD32 (&pNonZeroCount[1 + 8 * 3]));
993+ ST32 (&pCurDqLayer->pNzc[iMbXy][12], LD32 (&pNonZeroCount[1 + 8 * 4]));
994994 } else {
995− ST32 (&pCurLayer->pNzc[iMbXy][0], 0);
996− ST32 (&pCurLayer->pNzc[iMbXy][4], 0);
997− ST32 (&pCurLayer->pNzc[iMbXy][8], 0);
998− ST32 (&pCurLayer->pNzc[iMbXy][12], 0);
995+ ST32 (&pCurDqLayer->pNzc[iMbXy][0], 0);
996+ ST32 (&pCurDqLayer->pNzc[iMbXy][4], 0);
997+ ST32 (&pCurDqLayer->pNzc[iMbXy][8], 0);
998+ ST32 (&pCurDqLayer->pNzc[iMbXy][12], 0);
999999 }
10001000 } else { //non-MB_TYPE_INTRA16x16
10011001 if (pCtx->pCurDqLayer->pTransformSize8x8Flag[iMbXy]) {
@@ -1004,27 +1004,27 @@ int32_t WelsDecodeMbCabacPSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 2 unmodified lines
10041004 if (uiCbpLuma & (1 << iId8x8)) {
10051005 WELS_READ_VERIFY (ParseResidualBlockCabac8x8 (pNeighAvail, pNonZeroCount, pBsAux, (iId8x8 << 2),
10061006 iScanIdxEnd - iScanIdxStart + 1, g_kuiZigzagScan8x8 + iScanIdxStart,
1007− IS_INTRA (pCurLayer->pMbType[iMbXy]) ? LUMA_DC_AC_INTRA_8 : LUMA_DC_AC_INTER_8,
1008− pCurLayer->pScaledTCoeff[iMbXy] + (iId8x8 << 6), pCurLayer->pLumaQp[iMbXy], pCtx));
1007+ IS_INTRA (pCurDqLayer->pDec->pMbType[iMbXy]) ? LUMA_DC_AC_INTRA_8 : LUMA_DC_AC_INTER_8,
1008+ pCurDqLayer->pScaledTCoeff[iMbXy] + (iId8x8 << 6), pCurDqLayer->pLumaQp[iMbXy], pCtx));
10091009 } else {
10101010 ST16 (&pNonZeroCount[g_kCacheNzcScanIdx[ (iId8x8 << 2)]], 0);
10111011 ST16 (&pNonZeroCount[g_kCacheNzcScanIdx[ (iId8x8 << 2) + 2]], 0);
10121012 }
10131013 }
1014− ST32 (&pCurLayer->pNzc[iMbXy][0], LD32 (&pNonZeroCount[1 + 8 * 1]));
1015− ST32 (&pCurLayer->pNzc[iMbXy][4], LD32 (&pNonZeroCount[1 + 8 * 2]));
1016− ST32 (&pCurLayer->pNzc[iMbXy][8], LD32 (&pNonZeroCount[1 + 8 * 3]));
1017− ST32 (&pCurLayer->pNzc[iMbXy][12], LD32 (&pNonZeroCount[1 + 8 * 4]));
1014+ ST32 (&pCurDqLayer->pNzc[iMbXy][0], LD32 (&pNonZeroCount[1 + 8 * 1]));
1015+ ST32 (&pCurDqLayer->pNzc[iMbXy][4], LD32 (&pNonZeroCount[1 + 8 * 2]));
1016+ ST32 (&pCurDqLayer->pNzc[iMbXy][8], LD32 (&pNonZeroCount[1 + 8 * 3]));
1017+ ST32 (&pCurDqLayer->pNzc[iMbXy][12], LD32 (&pNonZeroCount[1 + 8 * 4]));
10181018 } else {
1019− iMbResProperty = (IS_INTRA (pCurLayer->pMbType[iMbXy])) ? LUMA_DC_AC_INTRA : LUMA_DC_AC_INTER;
1019+ iMbResProperty = (IS_INTRA (pCurDqLayer->pDec->pMbType[iMbXy])) ? LUMA_DC_AC_INTRA : LUMA_DC_AC_INTER;
10201020 for (iId8x8 = 0; iId8x8 < 4; iId8x8++) {
10211021 if (uiCbpLuma & (1 << iId8x8)) {
10221022 int32_t iIdx = (iId8x8 << 2);
10231023 for (iId4x4 = 0; iId4x4 < 4; iId4x4++) {
10241024 //Luma (DC and AC decoding together)
10251025 WELS_READ_VERIFY (ParseResidualBlockCabac (pNeighAvail, pNonZeroCount, pBsAux, iIdx, iScanIdxEnd - iScanIdxStart + 1,
1026− g_kuiZigzagScan + iScanIdxStart, iMbResProperty, pCurLayer->pScaledTCoeff[iMbXy] + (iIdx << 4),
1027− pCurLayer->pLumaQp[iMbXy],
1026+ g_kuiZigzagScan + iScanIdxStart, iMbResProperty, pCurDqLayer->pScaledTCoeff[iMbXy] + (iIdx << 4),
1027+ pCurDqLayer->pLumaQp[iMbXy],
10281028 pCtx));
10291029 iIdx++;
10301030 }
@@ -1033,10 +1033,10 @@ int32_t WelsDecodeMbCabacPSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 2 unmodified lines
10331033 ST16 (&pNonZeroCount[g_kCacheNzcScanIdx[ (iId8x8 << 2) + 2]], 0);
10341034 }
10351035 }
1036− ST32 (&pCurLayer->pNzc[iMbXy][0], LD32 (&pNonZeroCount[1 + 8 * 1]));
1037− ST32 (&pCurLayer->pNzc[iMbXy][4], LD32 (&pNonZeroCount[1 + 8 * 2]));
1038− ST32 (&pCurLayer->pNzc[iMbXy][8], LD32 (&pNonZeroCount[1 + 8 * 3]));
1039− ST32 (&pCurLayer->pNzc[iMbXy][12], LD32 (&pNonZeroCount[1 + 8 * 4]));
1036+ ST32 (&pCurDqLayer->pNzc[iMbXy][0], LD32 (&pNonZeroCount[1 + 8 * 1]));
1037+ ST32 (&pCurDqLayer->pNzc[iMbXy][4], LD32 (&pNonZeroCount[1 + 8 * 2]));
1038+ ST32 (&pCurDqLayer->pNzc[iMbXy][8], LD32 (&pNonZeroCount[1 + 8 * 3]));
1039+ ST32 (&pCurDqLayer->pNzc[iMbXy][12], LD32 (&pNonZeroCount[1 + 8 * 4]));
10401040 }
10411041 }
10421042
@@ -1044,19 +1044,19 @@ int32_t WelsDecodeMbCabacPSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 1 unmodified line
10441044 //step1: DC
10451045 if (1 == uiCbpChroma || 2 == uiCbpChroma) {
10461046 for (i = 0; i < 2; i++) {
1047− if (IS_INTRA (pCurLayer->pMbType[iMbXy]))
1047+ if (IS_INTRA (pCurDqLayer->pDec->pMbType[iMbXy]))
10481048 iMbResProperty = i ? CHROMA_DC_V : CHROMA_DC_U;
10491049 else
10501050 iMbResProperty = i ? CHROMA_DC_V_INTER : CHROMA_DC_U_INTER;
10511051
10521052 WELS_READ_VERIFY (ParseResidualBlockCabac (pNeighAvail, pNonZeroCount, pBsAux, 16 + (i << 2), 4, g_kuiChromaDcScan,
1053− iMbResProperty, pCurLayer->pScaledTCoeff[iMbXy] + 256 + (i << 6), pCurLayer->pChromaQp[iMbXy][i], pCtx));
1053+ iMbResProperty, pCurDqLayer->pScaledTCoeff[iMbXy] + 256 + (i << 6), pCurDqLayer->pChromaQp[iMbXy][i], pCtx));
10541054 }
10551055 }
10561056 //step2: AC
10571057 if (2 == uiCbpChroma) {
10581058 for (i = 0; i < 2; i++) {
1059− if (IS_INTRA (pCurLayer->pMbType[iMbXy]))
1059+ if (IS_INTRA (pCurDqLayer->pDec->pMbType[iMbXy]))
10601060 iMbResProperty = i ? CHROMA_AC_V : CHROMA_AC_U;
10611061 else
10621062 iMbResProperty = i ? CHROMA_AC_V_INTER : CHROMA_AC_U_INTER;
@@ -1064,22 +1064,22 @@ int32_t WelsDecodeMbCabacPSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 1 unmodified line
10641064 for (iId4x4 = 0; iId4x4 < 4; iId4x4++) {
10651065 WELS_READ_VERIFY (ParseResidualBlockCabac (pNeighAvail, pNonZeroCount, pBsAux, index,
10661066 iScanIdxEnd - WELS_MAX (iScanIdxStart, 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1),
1067− iMbResProperty, pCurLayer->pScaledTCoeff[iMbXy] + (index << 4), pCurLayer->pChromaQp[iMbXy][i], pCtx));
1067+ iMbResProperty, pCurDqLayer->pScaledTCoeff[iMbXy] + (index << 4), pCurDqLayer->pChromaQp[iMbXy][i], pCtx));
10681068 index++;
10691069 }
10701070 }
1071− ST16 (&pCurLayer->pNzc[iMbXy][16], LD16 (&pNonZeroCount[6 + 8 * 1]));
1072− ST16 (&pCurLayer->pNzc[iMbXy][20], LD16 (&pNonZeroCount[6 + 8 * 2]));
1073− ST16 (&pCurLayer->pNzc[iMbXy][18], LD16 (&pNonZeroCount[6 + 8 * 4]));
1074− ST16 (&pCurLayer->pNzc[iMbXy][22], LD16 (&pNonZeroCount[6 + 8 * 5]));
1071+ ST16 (&pCurDqLayer->pNzc[iMbXy][16], LD16 (&pNonZeroCount[6 + 8 * 1]));
1072+ ST16 (&pCurDqLayer->pNzc[iMbXy][20], LD16 (&pNonZeroCount[6 + 8 * 2]));
1073+ ST16 (&pCurDqLayer->pNzc[iMbXy][18], LD16 (&pNonZeroCount[6 + 8 * 4]));
1074+ ST16 (&pCurDqLayer->pNzc[iMbXy][22], LD16 (&pNonZeroCount[6 + 8 * 5]));
10751075 } else {
1076− ST32 (&pCurLayer->pNzc[iMbXy][16], 0);
1077− ST32 (&pCurLayer->pNzc[iMbXy][20], 0);
1076+ ST32 (&pCurDqLayer->pNzc[iMbXy][16], 0);
1077+ ST32 (&pCurDqLayer->pNzc[iMbXy][20], 0);
10781078 }
10791079 } else {
1080− pCurLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp;
1080+ pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp;
10811081 for (i = 0; i < 2; i++) {
1082− pCurLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurLayer->pLumaQp[iMbXy] +
1082+ pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] +
10831083 pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)];
10841084 }
10851085 }
@@ -1093,21 +1093,21 @@ int32_t WelsDecodeMbCabacPSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 7 unmodified lines
10931093 }
10941094
10951095 int32_t WelsDecodeMbCabacBSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAvail pNeighAvail, uint32_t& uiEosFlag) {
1096− PDqLayer pCurLayer = pCtx->pCurDqLayer;
1097− PBitStringAux pBsAux = pCurLayer->pBitStringAux;
1098− PSlice pSlice = &pCurLayer->sLayerInfo.sSliceInLayer;
1096+ PDqLayer pCurDqLayer = pCtx->pCurDqLayer;
1097+ PBitStringAux pBsAux = pCurDqLayer->pBitStringAux;
1098+ PSlice pSlice = &pCurDqLayer->sLayerInfo.sSliceInLayer;
10991099 PSliceHeader pSliceHeader = &pSlice->sSliceHeaderExt.sSliceHeader;
11001100
11011101 int32_t iScanIdxStart = pSlice->sSliceHeaderExt.uiScanIdxStart;
11021102 int32_t iScanIdxEnd = pSlice->sSliceHeaderExt.uiScanIdxEnd;
1103− int32_t iMbXy = pCurLayer->iMbXyIndex;
1103+ int32_t iMbXy = pCurDqLayer->iMbXyIndex;
11041104 int32_t iMbResProperty;
11051105 int32_t i;
11061106 uint32_t uiMbType = 0, uiCbp = 0, uiCbpLuma = 0, uiCbpChroma = 0;
11071107
11081108 ENFORCE_STACK_ALIGN_1D (uint8_t, pNonZeroCount, 48, 16);
11091109
1110− pCurLayer->pInterPredictionDoneFlag[iMbXy] = 0;
1110+ pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0;
11111111
11121112 WELS_READ_VERIFY (ParseMBTypeBSliceCabac (pCtx, pNeighAvail, uiMbType));
11131113
@@ -1116,12 +1116,12 @@ int32_t WelsDecodeMbCabacBSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 2 unmodified lines
11161116 int16_t pMvdCache[LIST_A][30][MV_A];
11171117 int8_t pRefIndex[LIST_A][30];
11181118 int8_t pDirect[30];
1119− pCurLayer->pMbType[iMbXy] = g_ksInterBMbTypeInfo[uiMbType].iType;
1120− WelsFillCacheInterCabac (pNeighAvail, pNonZeroCount, pMotionVector, pMvdCache, pRefIndex, pCurLayer);
1121− WelsFillDirectCacheCabac (pNeighAvail, pDirect, pCurLayer);
1119+ pCurDqLayer->pDec->pMbType[iMbXy] = g_ksInterBMbTypeInfo[uiMbType].iType;
1120+ WelsFillCacheInterCabac (pNeighAvail, pNonZeroCount, pMotionVector, pMvdCache, pRefIndex, pCurDqLayer);
1121+ WelsFillDirectCacheCabac (pNeighAvail, pDirect, pCurDqLayer);
11221122 WELS_READ_VERIFY (ParseInterBMotionInfoCabac (pCtx, pNeighAvail, pNonZeroCount, pMotionVector, pMvdCache, pRefIndex,
11231123 pDirect));
1124− pCurLayer->pInterPredictionDoneFlag[iMbXy] = 0;
1124+ pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0;
11251125 } else { //Intra mode
11261126 uiMbType -= 23;
11271127 if (uiMbType > 25)
@@ -1141,59 +1141,59 @@ int32_t WelsDecodeMbCabacBSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 13 unmodified lines
11411141 } else { //normal Intra mode
11421142 if (0 == uiMbType) { //Intra4x4
11431143 ENFORCE_STACK_ALIGN_1D (int8_t, pIntraPredMode, 48, 16);
1144− pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA4x4;
1144+ pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA4x4;
11451145 if (pCtx->pPps->bTransform8x8ModeFlag) {
11461146 WELS_READ_VERIFY (ParseTransformSize8x8FlagCabac (pCtx, pNeighAvail, pCtx->pCurDqLayer->pTransformSize8x8Flag[iMbXy]));
11471147 }
11481148 if (pCtx->pCurDqLayer->pTransformSize8x8Flag[iMbXy]) {
1149− uiMbType = pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA8x8;
1150− pCtx->pFillInfoCacheIntraNxNFunc (pNeighAvail, pNonZeroCount, pIntraPredMode, pCurLayer);
1151− WELS_READ_VERIFY (ParseIntra8x8Mode (pCtx, pNeighAvail, pIntraPredMode, pBsAux, pCurLayer));
1149+ uiMbType = pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA8x8;
1150+ pCtx->pFillInfoCacheIntraNxNFunc (pNeighAvail, pNonZeroCount, pIntraPredMode, pCurDqLayer);
1151+ WELS_READ_VERIFY (ParseIntra8x8Mode (pCtx, pNeighAvail, pIntraPredMode, pBsAux, pCurDqLayer));
11521152 } else {
1153− pCtx->pFillInfoCacheIntraNxNFunc (pNeighAvail, pNonZeroCount, pIntraPredMode, pCurLayer);
1154− WELS_READ_VERIFY (ParseIntra4x4Mode (pCtx, pNeighAvail, pIntraPredMode, pBsAux, pCurLayer));
1153+ pCtx->pFillInfoCacheIntraNxNFunc (pNeighAvail, pNonZeroCount, pIntraPredMode, pCurDqLayer);
1154+ WELS_READ_VERIFY (ParseIntra4x4Mode (pCtx, pNeighAvail, pIntraPredMode, pBsAux, pCurDqLayer));
11551155 }
11561156 } else { //Intra16x16
1157− pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA16x16;
1158− pCurLayer->pTransformSize8x8Flag[iMbXy] = false;
1159− pCurLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
1160− pCurLayer->pIntraPredMode[iMbXy][7] = (uiMbType - 1) & 3;
1161− pCurLayer->pCbp[iMbXy] = g_kuiI16CbpTable[ (uiMbType - 1) >> 2];
1162− uiCbpChroma = pCtx->pSps->uiChromaFormatIdc ? pCurLayer->pCbp[iMbXy] >> 4 : 0;
1163− uiCbpLuma = pCurLayer->pCbp[iMbXy] & 15;
1164− WelsFillCacheNonZeroCount (pNeighAvail, pNonZeroCount, pCurLayer);
1165− WELS_READ_VERIFY (ParseIntra16x16Mode (pCtx, pNeighAvail, pBsAux, pCurLayer));
1157+ pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA16x16;
1158+ pCurDqLayer->pTransformSize8x8Flag[iMbXy] = false;
1159+ pCurDqLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
1160+ pCurDqLayer->pIntraPredMode[iMbXy][7] = (uiMbType - 1) & 3;
1161+ pCurDqLayer->pCbp[iMbXy] = g_kuiI16CbpTable[ (uiMbType - 1) >> 2];
1162+ uiCbpChroma = pCtx->pSps->uiChromaFormatIdc ? pCurDqLayer->pCbp[iMbXy] >> 4 : 0;
1163+ uiCbpLuma = pCurDqLayer->pCbp[iMbXy] & 15;
1164+ WelsFillCacheNonZeroCount (pNeighAvail, pNonZeroCount, pCurDqLayer);
1165+ WELS_READ_VERIFY (ParseIntra16x16Mode (pCtx, pNeighAvail, pBsAux, pCurDqLayer));
11661166 }
11671167 }
11681168 }
11691169
1170− ST32 (&pCurLayer->pNzc[iMbXy][0], 0);
1171− ST32 (&pCurLayer->pNzc[iMbXy][4], 0);
1172− ST32 (&pCurLayer->pNzc[iMbXy][8], 0);
1173− ST32 (&pCurLayer->pNzc[iMbXy][12], 0);
1174− ST32 (&pCurLayer->pNzc[iMbXy][16], 0);
1175− ST32 (&pCurLayer->pNzc[iMbXy][20], 0);
1170+ ST32 (&pCurDqLayer->pNzc[iMbXy][0], 0);
1171+ ST32 (&pCurDqLayer->pNzc[iMbXy][4], 0);
1172+ ST32 (&pCurDqLayer->pNzc[iMbXy][8], 0);
1173+ ST32 (&pCurDqLayer->pNzc[iMbXy][12], 0);
1174+ ST32 (&pCurDqLayer->pNzc[iMbXy][16], 0);
1175+ ST32 (&pCurDqLayer->pNzc[iMbXy][20], 0);
11761176
1177− if (MB_TYPE_INTRA16x16 != pCurLayer->pMbType[iMbXy]) {
1177+ if (MB_TYPE_INTRA16x16 != pCurDqLayer->pDec->pMbType[iMbXy]) {
11781178 WELS_READ_VERIFY (ParseCbpInfoCabac (pCtx, pNeighAvail, uiCbp));
11791179
1180− pCurLayer->pCbp[iMbXy] = uiCbp;
1180+ pCurDqLayer->pCbp[iMbXy] = uiCbp;
11811181 pSlice->iLastDeltaQp = uiCbp == 0 ? 0 : pSlice->iLastDeltaQp;
1182− uiCbpChroma = pCtx->pSps->uiChromaFormatIdc ? pCurLayer->pCbp[iMbXy] >> 4 : 0;
1183− uiCbpLuma = pCurLayer->pCbp[iMbXy] & 15;
1182+ uiCbpChroma = pCtx->pSps->uiChromaFormatIdc ? pCurDqLayer->pCbp[iMbXy] >> 4 : 0;
1183+ uiCbpLuma = pCurDqLayer->pCbp[iMbXy] & 15;
11841184 }
11851185
1186− if (pCurLayer->pCbp[iMbXy] || MB_TYPE_INTRA16x16 == pCurLayer->pMbType[iMbXy]) {
1186+ if (pCurDqLayer->pCbp[iMbXy] || MB_TYPE_INTRA16x16 == pCurDqLayer->pDec->pMbType[iMbXy]) {
11871187
1188− if (MB_TYPE_INTRA16x16 != pCurLayer->pMbType[iMbXy]) {
1188+ if (MB_TYPE_INTRA16x16 != pCurDqLayer->pDec->pMbType[iMbXy]) {
11891189 // Need modification when B picutre add in
11901190 bool bNeedParseTransformSize8x8Flag =
1191− (((IS_INTER_16x16 (pCurLayer->pMbType[iMbXy]) || IS_DIRECT (pCurLayer->pMbType[iMbXy])
1192− || IS_INTER_16x8 (pCurLayer->pMbType[iMbXy]) || IS_INTER_8x16 (pCurLayer->pMbType[iMbXy]))
1193− || pCurLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy])
1194− && (pCurLayer->pMbType[iMbXy] != MB_TYPE_INTRA8x8)
1195− && (pCurLayer->pMbType[iMbXy] != MB_TYPE_INTRA4x4)
1196− && ((pCurLayer->pCbp[iMbXy] & 0x0F) > 0)
1191+ (((IS_INTER_16x16 (pCurDqLayer->pDec->pMbType[iMbXy]) || IS_DIRECT (pCurDqLayer->pDec->pMbType[iMbXy])
1192+ || IS_INTER_16x8 (pCurDqLayer->pDec->pMbType[iMbXy]) || IS_INTER_8x16 (pCurDqLayer->pDec->pMbType[iMbXy]))
1193+ || pCurDqLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy])
1194+ && (pCurDqLayer->pDec->pMbType[iMbXy] != MB_TYPE_INTRA8x8)
1195+ && (pCurDqLayer->pDec->pMbType[iMbXy] != MB_TYPE_INTRA4x4)
1196+ && ((pCurDqLayer->pCbp[iMbXy] & 0x0F) > 0)
11971197 && (pCtx->pPps->bTransform8x8ModeFlag));
11981198
11991199 if (bNeedParseTransformSize8x8Flag) {
@@ -1202,7 +1202,7 @@ int32_t WelsDecodeMbCabacBSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 2 unmodified lines
12021202 }
12031203 }
12041204
1205− memset (pCurLayer->pScaledTCoeff[iMbXy], 0, 384 * sizeof (pCurLayer->pScaledTCoeff[iMbXy][0]));
1205+ memset (pCurDqLayer->pScaledTCoeff[iMbXy], 0, 384 * sizeof (pCurDqLayer->pScaledTCoeff[iMbXy][0]));
12061206
12071207 int32_t iQpDelta, iId8x8, iId4x4;
12081208
@@ -1210,33 +1210,33 @@ int32_t WelsDecodeMbCabacBSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 1 unmodified line
12101210 if (iQpDelta > 25 || iQpDelta < -26) { //out of iQpDelta range
12111211 return GENERATE_ERROR_NO (ERR_LEVEL_MB_DATA, ERR_INFO_INVALID_QP);
12121212 }
1213− pCurLayer->pLumaQp[iMbXy] = (pSlice->iLastMbQp + iQpDelta + 52) % 52; //update last_mb_qp
1214− pSlice->iLastMbQp = pCurLayer->pLumaQp[iMbXy];
1213+ pCurDqLayer->pLumaQp[iMbXy] = (pSlice->iLastMbQp + iQpDelta + 52) % 52; //update last_mb_qp
1214+ pSlice->iLastMbQp = pCurDqLayer->pLumaQp[iMbXy];
12151215 for (i = 0; i < 2; i++) {
1216− pCurLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp +
1216+ pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp +
12171217 pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)];
12181218 }
12191219
1220− if (MB_TYPE_INTRA16x16 == pCurLayer->pMbType[iMbXy]) {
1220+ if (MB_TYPE_INTRA16x16 == pCurDqLayer->pDec->pMbType[iMbXy]) {
12211221 //step1: Luma DC
12221222 WELS_READ_VERIFY (ParseResidualBlockCabac (pNeighAvail, pNonZeroCount, pBsAux, 0, 16, g_kuiLumaDcZigzagScan,
1223− I16_LUMA_DC, pCurLayer->pScaledTCoeff[iMbXy], pCurLayer->pLumaQp[iMbXy], pCtx));
1223+ I16_LUMA_DC, pCurDqLayer->pScaledTCoeff[iMbXy], pCurDqLayer->pLumaQp[iMbXy], pCtx));
12241224 //step2: Luma AC
12251225 if (uiCbpLuma) {
12261226 for (i = 0; i < 16; i++) {
12271227 WELS_READ_VERIFY (ParseResidualBlockCabac (pNeighAvail, pNonZeroCount, pBsAux, i, iScanIdxEnd - WELS_MAX (iScanIdxStart,
1228− 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), I16_LUMA_AC, pCurLayer->pScaledTCoeff[iMbXy] + (i << 4),
1229− pCurLayer->pLumaQp[iMbXy], pCtx));
1228+ 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), I16_LUMA_AC, pCurDqLayer->pScaledTCoeff[iMbXy] + (i << 4),
1229+ pCurDqLayer->pLumaQp[iMbXy], pCtx));
12301230 }
1231− ST32 (&pCurLayer->pNzc[iMbXy][0], LD32 (&pNonZeroCount[1 + 8 * 1]));
1232− ST32 (&pCurLayer->pNzc[iMbXy][4], LD32 (&pNonZeroCount[1 + 8 * 2]));
1233− ST32 (&pCurLayer->pNzc[iMbXy][8], LD32 (&pNonZeroCount[1 + 8 * 3]));
1234− ST32 (&pCurLayer->pNzc[iMbXy][12], LD32 (&pNonZeroCount[1 + 8 * 4]));
1231+ ST32 (&pCurDqLayer->pNzc[iMbXy][0], LD32 (&pNonZeroCount[1 + 8 * 1]));
1232+ ST32 (&pCurDqLayer->pNzc[iMbXy][4], LD32 (&pNonZeroCount[1 + 8 * 2]));
1233+ ST32 (&pCurDqLayer->pNzc[iMbXy][8], LD32 (&pNonZeroCount[1 + 8 * 3]));
1234+ ST32 (&pCurDqLayer->pNzc[iMbXy][12], LD32 (&pNonZeroCount[1 + 8 * 4]));
12351235 } else {
1236− ST32 (&pCurLayer->pNzc[iMbXy][0], 0);
1237− ST32 (&pCurLayer->pNzc[iMbXy][4], 0);
1238− ST32 (&pCurLayer->pNzc[iMbXy][8], 0);
1239− ST32 (&pCurLayer->pNzc[iMbXy][12], 0);
1236+ ST32 (&pCurDqLayer->pNzc[iMbXy][0], 0);
1237+ ST32 (&pCurDqLayer->pNzc[iMbXy][4], 0);
1238+ ST32 (&pCurDqLayer->pNzc[iMbXy][8], 0);
1239+ ST32 (&pCurDqLayer->pNzc[iMbXy][12], 0);
12401240 }
12411241 } else { //non-MB_TYPE_INTRA16x16
12421242 if (pCtx->pCurDqLayer->pTransformSize8x8Flag[iMbXy]) {
@@ -1245,27 +1245,27 @@ int32_t WelsDecodeMbCabacBSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 2 unmodified lines
12451245 if (uiCbpLuma & (1 << iId8x8)) {
12461246 WELS_READ_VERIFY (ParseResidualBlockCabac8x8 (pNeighAvail, pNonZeroCount, pBsAux, (iId8x8 << 2),
12471247 iScanIdxEnd - iScanIdxStart + 1, g_kuiZigzagScan8x8 + iScanIdxStart,
1248− IS_INTRA (pCurLayer->pMbType[iMbXy]) ? LUMA_DC_AC_INTRA_8 : LUMA_DC_AC_INTER_8,
1249− pCurLayer->pScaledTCoeff[iMbXy] + (iId8x8 << 6), pCurLayer->pLumaQp[iMbXy], pCtx));
1248+ IS_INTRA (pCurDqLayer->pDec->pMbType[iMbXy]) ? LUMA_DC_AC_INTRA_8 : LUMA_DC_AC_INTER_8,
1249+ pCurDqLayer->pScaledTCoeff[iMbXy] + (iId8x8 << 6), pCurDqLayer->pLumaQp[iMbXy], pCtx));
12501250 } else {
12511251 ST16 (&pNonZeroCount[g_kCacheNzcScanIdx[ (iId8x8 << 2)]], 0);
12521252 ST16 (&pNonZeroCount[g_kCacheNzcScanIdx[ (iId8x8 << 2) + 2]], 0);
12531253 }
12541254 }
1255− ST32 (&pCurLayer->pNzc[iMbXy][0], LD32 (&pNonZeroCount[1 + 8 * 1]));
1256− ST32 (&pCurLayer->pNzc[iMbXy][4], LD32 (&pNonZeroCount[1 + 8 * 2]));
1257− ST32 (&pCurLayer->pNzc[iMbXy][8], LD32 (&pNonZeroCount[1 + 8 * 3]));
1258− ST32 (&pCurLayer->pNzc[iMbXy][12], LD32 (&pNonZeroCount[1 + 8 * 4]));
1255+ ST32 (&pCurDqLayer->pNzc[iMbXy][0], LD32 (&pNonZeroCount[1 + 8 * 1]));
1256+ ST32 (&pCurDqLayer->pNzc[iMbXy][4], LD32 (&pNonZeroCount[1 + 8 * 2]));
1257+ ST32 (&pCurDqLayer->pNzc[iMbXy][8], LD32 (&pNonZeroCount[1 + 8 * 3]));
1258+ ST32 (&pCurDqLayer->pNzc[iMbXy][12], LD32 (&pNonZeroCount[1 + 8 * 4]));
12591259 } else {
1260− iMbResProperty = (IS_INTRA (pCurLayer->pMbType[iMbXy])) ? LUMA_DC_AC_INTRA : LUMA_DC_AC_INTER;
1260+ iMbResProperty = (IS_INTRA (pCurDqLayer->pDec->pMbType[iMbXy])) ? LUMA_DC_AC_INTRA : LUMA_DC_AC_INTER;
12611261 for (iId8x8 = 0; iId8x8 < 4; iId8x8++) {
12621262 if (uiCbpLuma & (1 << iId8x8)) {
12631263 int32_t iIdx = (iId8x8 << 2);
12641264 for (iId4x4 = 0; iId4x4 < 4; iId4x4++) {
12651265 //Luma (DC and AC decoding together)
12661266 WELS_READ_VERIFY (ParseResidualBlockCabac (pNeighAvail, pNonZeroCount, pBsAux, iIdx, iScanIdxEnd - iScanIdxStart + 1,
1267− g_kuiZigzagScan + iScanIdxStart, iMbResProperty, pCurLayer->pScaledTCoeff[iMbXy] + (iIdx << 4),
1268− pCurLayer->pLumaQp[iMbXy],
1267+ g_kuiZigzagScan + iScanIdxStart, iMbResProperty, pCurDqLayer->pScaledTCoeff[iMbXy] + (iIdx << 4),
1268+ pCurDqLayer->pLumaQp[iMbXy],
12691269 pCtx));
12701270 iIdx++;
12711271 }
@@ -1274,10 +1274,10 @@ int32_t WelsDecodeMbCabacBSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 2 unmodified lines
12741274 ST16 (&pNonZeroCount[g_kCacheNzcScanIdx[ (iId8x8 << 2) + 2]], 0);
12751275 }
12761276 }
1277− ST32 (&pCurLayer->pNzc[iMbXy][0], LD32 (&pNonZeroCount[1 + 8 * 1]));
1278− ST32 (&pCurLayer->pNzc[iMbXy][4], LD32 (&pNonZeroCount[1 + 8 * 2]));
1279− ST32 (&pCurLayer->pNzc[iMbXy][8], LD32 (&pNonZeroCount[1 + 8 * 3]));
1280− ST32 (&pCurLayer->pNzc[iMbXy][12], LD32 (&pNonZeroCount[1 + 8 * 4]));
1277+ ST32 (&pCurDqLayer->pNzc[iMbXy][0], LD32 (&pNonZeroCount[1 + 8 * 1]));
1278+ ST32 (&pCurDqLayer->pNzc[iMbXy][4], LD32 (&pNonZeroCount[1 + 8 * 2]));
1279+ ST32 (&pCurDqLayer->pNzc[iMbXy][8], LD32 (&pNonZeroCount[1 + 8 * 3]));
1280+ ST32 (&pCurDqLayer->pNzc[iMbXy][12], LD32 (&pNonZeroCount[1 + 8 * 4]));
12811281 }
12821282 }
12831283
@@ -1285,19 +1285,19 @@ int32_t WelsDecodeMbCabacBSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 1 unmodified line
12851285 //step1: DC
12861286 if (1 == uiCbpChroma || 2 == uiCbpChroma) {
12871287 for (i = 0; i < 2; i++) {
1288− if (IS_INTRA (pCurLayer->pMbType[iMbXy]))
1288+ if (IS_INTRA (pCurDqLayer->pDec->pMbType[iMbXy]))
12891289 iMbResProperty = i ? CHROMA_DC_V : CHROMA_DC_U;
12901290 else
12911291 iMbResProperty = i ? CHROMA_DC_V_INTER : CHROMA_DC_U_INTER;
12921292
12931293 WELS_READ_VERIFY (ParseResidualBlockCabac (pNeighAvail, pNonZeroCount, pBsAux, 16 + (i << 2), 4, g_kuiChromaDcScan,
1294− iMbResProperty, pCurLayer->pScaledTCoeff[iMbXy] + 256 + (i << 6), pCurLayer->pChromaQp[iMbXy][i], pCtx));
1294+ iMbResProperty, pCurDqLayer->pScaledTCoeff[iMbXy] + 256 + (i << 6), pCurDqLayer->pChromaQp[iMbXy][i], pCtx));
12951295 }
12961296 }
12971297 //step2: AC
12981298 if (2 == uiCbpChroma) {
12991299 for (i = 0; i < 2; i++) {
1300− if (IS_INTRA (pCurLayer->pMbType[iMbXy]))
1300+ if (IS_INTRA (pCurDqLayer->pDec->pMbType[iMbXy]))
13011301 iMbResProperty = i ? CHROMA_AC_V : CHROMA_AC_U;
13021302 else
13031303 iMbResProperty = i ? CHROMA_AC_V_INTER : CHROMA_AC_U_INTER;
@@ -1305,22 +1305,22 @@ int32_t WelsDecodeMbCabacBSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 1 unmodified line
13051305 for (iId4x4 = 0; iId4x4 < 4; iId4x4++) {
13061306 WELS_READ_VERIFY (ParseResidualBlockCabac (pNeighAvail, pNonZeroCount, pBsAux, index,
13071307 iScanIdxEnd - WELS_MAX (iScanIdxStart, 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1),
1308− iMbResProperty, pCurLayer->pScaledTCoeff[iMbXy] + (index << 4), pCurLayer->pChromaQp[iMbXy][i], pCtx));
1308+ iMbResProperty, pCurDqLayer->pScaledTCoeff[iMbXy] + (index << 4), pCurDqLayer->pChromaQp[iMbXy][i], pCtx));
13091309 index++;
13101310 }
13111311 }
1312− ST16 (&pCurLayer->pNzc[iMbXy][16], LD16 (&pNonZeroCount[6 + 8 * 1]));
1313− ST16 (&pCurLayer->pNzc[iMbXy][20], LD16 (&pNonZeroCount[6 + 8 * 2]));
1314− ST16 (&pCurLayer->pNzc[iMbXy][18], LD16 (&pNonZeroCount[6 + 8 * 4]));
1315− ST16 (&pCurLayer->pNzc[iMbXy][22], LD16 (&pNonZeroCount[6 + 8 * 5]));
1312+ ST16 (&pCurDqLayer->pNzc[iMbXy][16], LD16 (&pNonZeroCount[6 + 8 * 1]));
1313+ ST16 (&pCurDqLayer->pNzc[iMbXy][20], LD16 (&pNonZeroCount[6 + 8 * 2]));
1314+ ST16 (&pCurDqLayer->pNzc[iMbXy][18], LD16 (&pNonZeroCount[6 + 8 * 4]));
1315+ ST16 (&pCurDqLayer->pNzc[iMbXy][22], LD16 (&pNonZeroCount[6 + 8 * 5]));
13161316 } else {
1317− ST32 (&pCurLayer->pNzc[iMbXy][16], 0);
1318− ST32 (&pCurLayer->pNzc[iMbXy][20], 0);
1317+ ST32 (&pCurDqLayer->pNzc[iMbXy][16], 0);
1318+ ST32 (&pCurDqLayer->pNzc[iMbXy][20], 0);
13191319 }
13201320 } else {
1321− pCurLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp;
1321+ pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp;
13221322 for (i = 0; i < 2; i++) {
1323− pCurLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurLayer->pLumaQp[iMbXy] +
1323+ pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] +
13241324 pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)];
13251325 }
13261326 }
@@ -1335,52 +1335,52 @@ int32_t WelsDecodeMbCabacBSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 8 unmodified lines
13351335
13361336
13371337 int32_t WelsDecodeMbCabacPSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uint32_t& uiEosFlag) {
1338− PDqLayer pCurLayer = pCtx->pCurDqLayer;
1339− PSlice pSlice = &pCurLayer->sLayerInfo.sSliceInLayer;
1338+ PDqLayer pCurDqLayer = pCtx->pCurDqLayer;
1339+ PSlice pSlice = &pCurDqLayer->sLayerInfo.sSliceInLayer;
13401340 PSliceHeader pSliceHeader = &pSlice->sSliceHeaderExt.sSliceHeader;
13411341 PPicture* ppRefPic = pCtx->sRefPic.pRefList[LIST_0];
13421342 uint32_t uiCode;
1343− int32_t iMbXy = pCurLayer->iMbXyIndex;
1343+ int32_t iMbXy = pCurDqLayer->iMbXyIndex;
13441344 int32_t i;
13451345 SWelsNeighAvail uiNeighAvail;
1346− pCurLayer->pCbp[iMbXy] = 0;
1347− pCurLayer->pCbfDc[iMbXy] = 0;
1348− pCurLayer->pChromaPredMode[iMbXy] = C_PRED_DC;
1346+ pCurDqLayer->pCbp[iMbXy] = 0;
1347+ pCurDqLayer->pCbfDc[iMbXy] = 0;
1348+ pCurDqLayer->pChromaPredMode[iMbXy] = C_PRED_DC;
13491349
1350− pCurLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
1351− pCurLayer->pTransformSize8x8Flag[iMbXy] = false;
1350+ pCurDqLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
1351+ pCurDqLayer->pTransformSize8x8Flag[iMbXy] = false;
13521352
1353− GetNeighborAvailMbType (&uiNeighAvail, pCurLayer);
1353+ GetNeighborAvailMbType (&uiNeighAvail, pCurDqLayer);
13541354 WELS_READ_VERIFY (ParseSkipFlagCabac (pCtx, &uiNeighAvail, uiCode));
13551355
13561356 if (uiCode) {
13571357 int16_t pMv[2] = {0};
1358− pCurLayer->pMbType[iMbXy] = MB_TYPE_SKIP;
1359− ST32 (&pCurLayer->pNzc[iMbXy][0], 0);
1360− ST32 (&pCurLayer->pNzc[iMbXy][4], 0);
1361− ST32 (&pCurLayer->pNzc[iMbXy][8], 0);
1362− ST32 (&pCurLayer->pNzc[iMbXy][12], 0);
1363− ST32 (&pCurLayer->pNzc[iMbXy][16], 0);
1364− ST32 (&pCurLayer->pNzc[iMbXy][20], 0);
1365−
1366− pCurLayer->pInterPredictionDoneFlag[iMbXy] = 0;
1367− memset (pCurLayer->pRefIndex[0][iMbXy], 0, sizeof (int8_t) * 16);
1358+ pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_SKIP;
1359+ ST32 (&pCurDqLayer->pNzc[iMbXy][0], 0);
1360+ ST32 (&pCurDqLayer->pNzc[iMbXy][4], 0);
1361+ ST32 (&pCurDqLayer->pNzc[iMbXy][8], 0);
1362+ ST32 (&pCurDqLayer->pNzc[iMbXy][12], 0);
1363+ ST32 (&pCurDqLayer->pNzc[iMbXy][16], 0);
1364+ ST32 (&pCurDqLayer->pNzc[iMbXy][20], 0);
1365+
1366+ pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0;
1367+ memset (pCurDqLayer->pDec->pRefIndex[0][iMbXy], 0, sizeof (int8_t) * 16);
13681368 pCtx->bMbRefConcealed = pCtx->bRPLRError || pCtx->bMbRefConcealed || ! (ppRefPic[0] && ppRefPic[0]->bIsComplete);
13691369 //predict mv
1370− PredPSkipMvFromNeighbor (pCurLayer, pMv);
1370+ PredPSkipMvFromNeighbor (pCurDqLayer, pMv);
13711371 for (i = 0; i < 16; i++) {
1372− ST32 (pCurLayer->pMv[0][iMbXy][i], * (uint32_t*)pMv);
1373− ST32 (pCurLayer->pMvd[0][iMbXy][i], 0);
1372+ ST32 (pCurDqLayer->pDec->pMv[0][iMbXy][i], * (uint32_t*)pMv);
1373+ ST32 (pCurDqLayer->pMvd[0][iMbXy][i], 0);
13741374 }
13751375
13761376 //if (!pSlice->sSliceHeaderExt.bDefaultResidualPredFlag) {
1377− // memset (pCurLayer->pScaledTCoeff[iMbXy], 0, 384 * sizeof (int16_t));
1377+ // memset (pCurDqLayer->pScaledTCoeff[iMbXy], 0, 384 * sizeof (int16_t));
13781378 //}
13791379
13801380 //reset rS
1381− pCurLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; //??????????????? dqaunt of previous mb
1381+ pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; //??????????????? dqaunt of previous mb
13821382 for (i = 0; i < 2; i++) {
1383− pCurLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurLayer->pLumaQp[iMbXy] +
1383+ pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] +
13841384 pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)];
13851385 }
13861386
@@ -1398,41 +1398,41 @@ int32_t WelsDecodeMbCabacPSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 11 unmodified lines
13981398
13991399
14001400 int32_t WelsDecodeMbCabacBSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uint32_t& uiEosFlag) {
1401− PDqLayer pCurLayer = pCtx->pCurDqLayer;
1402− PSlice pSlice = &pCurLayer->sLayerInfo.sSliceInLayer;
1401+ PDqLayer pCurDqLayer = pCtx->pCurDqLayer;
1402+ PSlice pSlice = &pCurDqLayer->sLayerInfo.sSliceInLayer;
14031403 PSliceHeader pSliceHeader = &pSlice->sSliceHeaderExt.sSliceHeader;
14041404 PPicture* ppRefPicL0 = pCtx->sRefPic.pRefList[LIST_0];
14051405 PPicture* ppRefPicL1 = pCtx->sRefPic.pRefList[LIST_1];
14061406 uint32_t uiCode;
1407− int32_t iMbXy = pCurLayer->iMbXyIndex;
1407+ int32_t iMbXy = pCurDqLayer->iMbXyIndex;
14081408 int32_t i;
14091409 SWelsNeighAvail uiNeighAvail;
1410− pCurLayer->pCbp[iMbXy] = 0;
1411− pCurLayer->pCbfDc[iMbXy] = 0;
1412− pCurLayer->pChromaPredMode[iMbXy] = C_PRED_DC;
1410+ pCurDqLayer->pCbp[iMbXy] = 0;
1411+ pCurDqLayer->pCbfDc[iMbXy] = 0;
1412+ pCurDqLayer->pChromaPredMode[iMbXy] = C_PRED_DC;
14131413
1414− pCurLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
1415− pCurLayer->pTransformSize8x8Flag[iMbXy] = false;
1414+ pCurDqLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
1415+ pCurDqLayer->pTransformSize8x8Flag[iMbXy] = false;
14161416
1417− GetNeighborAvailMbType (&uiNeighAvail, pCurLayer);
1417+ GetNeighborAvailMbType (&uiNeighAvail, pCurDqLayer);
14181418 WELS_READ_VERIFY (ParseSkipFlagCabac (pCtx, &uiNeighAvail, uiCode));
14191419
1420− memset (pCurLayer->pDirect[iMbXy], 0, sizeof (int8_t) * 16);
1420+ memset (pCurDqLayer->pDirect[iMbXy], 0, sizeof (int8_t) * 16);
14211421
14221422 if (uiCode) {
14231423 int16_t pMv[LIST_A][2] = { {0, 0}, { 0, 0 } };
14241424 int8_t ref[LIST_A] = { 0 };
1425− pCurLayer->pMbType[iMbXy] = MB_TYPE_SKIP | MB_TYPE_DIRECT;
1426− ST32 (&pCurLayer->pNzc[iMbXy][0], 0);
1427− ST32 (&pCurLayer->pNzc[iMbXy][4], 0);
1428− ST32 (&pCurLayer->pNzc[iMbXy][8], 0);
1429− ST32 (&pCurLayer->pNzc[iMbXy][12], 0);
1430− ST32 (&pCurLayer->pNzc[iMbXy][16], 0);
1431− ST32 (&pCurLayer->pNzc[iMbXy][20], 0);
1432−
1433− pCurLayer->pInterPredictionDoneFlag[iMbXy] = 0;
1434− memset (pCurLayer->pRefIndex[LIST_0][iMbXy], 0, sizeof (int8_t) * 16);
1435− memset (pCurLayer->pRefIndex[LIST_1][iMbXy], 0, sizeof (int8_t) * 16);
1425+ pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_SKIP | MB_TYPE_DIRECT;
1426+ ST32 (&pCurDqLayer->pNzc[iMbXy][0], 0);
1427+ ST32 (&pCurDqLayer->pNzc[iMbXy][4], 0);
1428+ ST32 (&pCurDqLayer->pNzc[iMbXy][8], 0);
1429+ ST32 (&pCurDqLayer->pNzc[iMbXy][12], 0);
1430+ ST32 (&pCurDqLayer->pNzc[iMbXy][16], 0);
1431+ ST32 (&pCurDqLayer->pNzc[iMbXy][20], 0);
1432+
1433+ pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0;
1434+ memset (pCurDqLayer->pDec->pRefIndex[LIST_0][iMbXy], 0, sizeof (int8_t) * 16);
1435+ memset (pCurDqLayer->pDec->pRefIndex[LIST_1][iMbXy], 0, sizeof (int8_t) * 16);
14361436 pCtx->bMbRefConcealed = pCtx->bRPLRError || pCtx->bMbRefConcealed || ! (ppRefPicL0[0] && ppRefPicL0[0]->bIsComplete)
14371437 || ! (ppRefPicL1[0] && ppRefPicL1[0]->bIsComplete);
14381438
@@ -1460,9 +1460,9 @@ int32_t WelsDecodeMbCabacBSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 21 unmodified lines
14601460
14611461
14621462 //reset rS
1463− pCurLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; //??????????????? dqaunt of previous mb
1463+ pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; //??????????????? dqaunt of previous mb
14641464 for (i = 0; i < 2; i++) {
1465− pCurLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurLayer->pLumaQp[iMbXy] +
1465+ pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] +
14661466 pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)];
14671467 }
14681468
@@ -1509,12 +1509,12 @@ int32_t WelsCalcDeqCoeffScalingList (PWelsDecoderContext pCtx) { · 40 unmodified lines
15091509 }
15101510
15111511 int32_t WelsDecodeSlice (PWelsDecoderContext pCtx, bool bFirstSliceInLayer, PNalUnit pNalCur) {
1512− PDqLayer pCurLayer = pCtx->pCurDqLayer;
1512+ PDqLayer pCurDqLayer = pCtx->pCurDqLayer;
15131513 PFmo pFmo = pCtx->pFmo;
15141514 int32_t iRet;
15151515 int32_t iNextMbXyIndex, iSliceIdc;
15161516
1517− PSlice pSlice = &pCurLayer->sLayerInfo.sSliceInLayer;
1517+ PSlice pSlice = &pCurDqLayer->sLayerInfo.sSliceInLayer;
15181518 PSliceHeaderExt pSliceHeaderExt = &pSlice->sSliceHeaderExt;
15191519 PSliceHeader pSliceHeader = &pSliceHeaderExt->sSliceHeader;
15201520 int32_t iMbX, iMbY;
@@ -1560,7 +1560,7 @@ int32_t WelsDecodeSlice (PWelsDecoderContext pCtx, bool bFirstSliceInLayer, PNal · 39 unmodified lines
15601560 }
15611561
15621562 pCtx->eSliceType = pSliceHeader->eSliceType;
1563− if (pCurLayer->sLayerInfo.pPps->bEntropyCodingModeFlag == 1) {
1563+ if (pCurDqLayer->sLayerInfo.pPps->bEntropyCodingModeFlag == 1) {
15641564 int32_t iQp = pSlice->sSliceHeaderExt.sSliceHeader.iSliceQp;
15651565 int32_t iCabacInitIdc = pSlice->sSliceHeaderExt.sSliceHeader.iCabacInitIdc;
15661566 WelsCabacContextInit (pCtx, pSlice->eSliceType, iCabacInitIdc, iQp);
@@ -1572,24 +1572,24 @@ int32_t WelsDecodeSlice (PWelsDecoderContext pCtx, bool bFirstSliceInLayer, PNal · 5 unmodified lines
15721572 WelsCalcDeqCoeffScalingList (pCtx);
15731573
15741574 iNextMbXyIndex = pSliceHeader->iFirstMbInSlice;
1575− iMbX = iNextMbXyIndex % pCurLayer->iMbWidth;
1576− iMbY = iNextMbXyIndex / pCurLayer->iMbWidth; // error is introduced by multiple slices case, 11/23/2009
1575+ iMbX = iNextMbXyIndex % pCurDqLayer->iMbWidth;
1576+ iMbY = iNextMbXyIndex / pCurDqLayer->iMbWidth; // error is introduced by multiple slices case, 11/23/2009
15771577 pSlice->iMbSkipRun = -1;
1578− iSliceIdc = (pSliceHeader->iFirstMbInSlice << 7) + pCurLayer->uiLayerDqId;
1578+ iSliceIdc = (pSliceHeader->iFirstMbInSlice << 7) + pCurDqLayer->uiLayerDqId;
15791579
1580− pCurLayer->iMbX = iMbX;
1581− pCurLayer->iMbY = iMbY;
1582− pCurLayer->iMbXyIndex = iNextMbXyIndex;
1580+ pCurDqLayer->iMbX = iMbX;
1581+ pCurDqLayer->iMbY = iMbY;
1582+ pCurDqLayer->iMbXyIndex = iNextMbXyIndex;
15831583
15841584 do {
15851585 if ((-1 == iNextMbXyIndex) || (iNextMbXyIndex >= kiCountNumMb)) { // slice group boundary or end of a frame
15861586 break;
15871587 }
15881588
1589− pCurLayer->pSliceIdc[iNextMbXyIndex] = iSliceIdc;
1589+ pCurDqLayer->pSliceIdc[iNextMbXyIndex] = iSliceIdc;
15901590 pCtx->bMbRefConcealed = false;
15911591 iRet = pDecMbFunc (pCtx, pNalCur, uiEosFlag);
1592− pCurLayer->pMbRefConcealedFlag[iNextMbXyIndex] = pCtx->bMbRefConcealed;
1592+ pCurDqLayer->pMbRefConcealedFlag[iNextMbXyIndex] = pCtx->bMbRefConcealed;
15931593 if (iRet != ERR_NONE) {
15941594 return iRet;
15951595 }
@@ -1603,21 +1603,21 @@ int32_t WelsDecodeSlice (PWelsDecoderContext pCtx, bool bFirstSliceInLayer, PNal · 7 unmodified lines
16031603 } else {
16041604 ++iNextMbXyIndex;
16051605 }
1606− iMbX = iNextMbXyIndex % pCurLayer->iMbWidth;
1607− iMbY = iNextMbXyIndex / pCurLayer->iMbWidth;
1608− pCurLayer->iMbX = iMbX;
1609− pCurLayer->iMbY = iMbY;
1610− pCurLayer->iMbXyIndex = iNextMbXyIndex;
1606+ iMbX = iNextMbXyIndex % pCurDqLayer->iMbWidth;
1607+ iMbY = iNextMbXyIndex / pCurDqLayer->iMbWidth;
1608+ pCurDqLayer->iMbX = iMbX;
1609+ pCurDqLayer->iMbY = iMbY;
1610+ pCurDqLayer->iMbXyIndex = iNextMbXyIndex;
16111611 } while (1);
16121612
16131613 return ERR_NONE;
16141614 }
16151615
16161616 int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) {
1617− SVlcTable* pVlcTable = &pCtx->sVlcTable;
1618− PDqLayer pCurLayer = pCtx->pCurDqLayer;
1619− PBitStringAux pBs = pCurLayer->pBitStringAux;
1620− PSlice pSlice = &pCurLayer->sLayerInfo.sSliceInLayer;
1617+ SVlcTable* pVlcTable = pCtx->pVlcTable;
1618+ PDqLayer pCurDqLayer = pCtx->pCurDqLayer;
1619+ PBitStringAux pBs = pCurDqLayer->pBitStringAux;
1620+ PSlice pSlice = &pCurDqLayer->sLayerInfo.sSliceInLayer;
16211621 PSliceHeader pSliceHeader = &pSlice->sSliceHeaderExt.sSliceHeader;
16221622
16231623 SWelsNeighAvail sNeighAvail;
@@ -1626,10 +1626,10 @@ int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { · 2 unmodified lines
16261626 int32_t iScanIdxStart = pSlice->sSliceHeaderExt.uiScanIdxStart;
16271627 int32_t iScanIdxEnd = pSlice->sSliceHeaderExt.uiScanIdxEnd;
16281628
1629− int32_t iMbX = pCurLayer->iMbX;
1630− int32_t iMbY = pCurLayer->iMbY;
1631− const int32_t iMbXy = pCurLayer->iMbXyIndex;
1632− int8_t* pNzc = pCurLayer->pNzc[iMbXy];
1629+ int32_t iMbX = pCurDqLayer->iMbX;
1630+ int32_t iMbY = pCurDqLayer->iMbY;
1631+ const int32_t iMbXy = pCurDqLayer->iMbXyIndex;
1632+ int8_t* pNzc = pCurDqLayer->pNzc[iMbXy];
16331633 int32_t i;
16341634 int32_t iRet = ERR_NONE;
16351635 uint32_t uiMbType = 0, uiCbp = 0, uiCbpL = 0, uiCbpC = 0;
@@ -1637,12 +1637,12 @@ int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { · 1 unmodified line
16371637 int32_t iCode;
16381638
16391639 ENFORCE_STACK_ALIGN_1D (uint8_t, pNonZeroCount, 48, 16);
1640− GetNeighborAvailMbType (&sNeighAvail, pCurLayer);
1641− pCurLayer->pInterPredictionDoneFlag[iMbXy] = 0;
1642− pCurLayer->pResidualPredFlag[iMbXy] = pSlice->sSliceHeaderExt.bDefaultResidualPredFlag;
1640+ GetNeighborAvailMbType (&sNeighAvail, pCurDqLayer);
1641+ pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0;
1642+ pCurDqLayer->pResidualPredFlag[iMbXy] = pSlice->sSliceHeaderExt.bDefaultResidualPredFlag;
16431643
1644− pCurLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
1645− pCurLayer->pTransformSize8x8Flag[iMbXy] = false;
1644+ pCurDqLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
1645+ pCurDqLayer->pTransformSize8x8Flag[iMbXy] = false;
16461646
16471647 WELS_READ_VERIFY (BsGetUe (pBs, &uiCode)); //uiMbType
16481648 uiMbType = uiCode;
@@ -1653,15 +1653,15 @@ int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { · 4 unmodified lines
16531653
16541654 if (25 == uiMbType) {
16551655 WelsLog (& (pCtx->sLogCtx), WELS_LOG_DEBUG, "I_PCM mode exists in I slice!");
1656− int32_t iDecStrideL = pCurLayer->pDec->iLinesize[0];
1657− int32_t iDecStrideC = pCurLayer->pDec->iLinesize[1];
1656+ int32_t iDecStrideL = pCurDqLayer->pDec->iLinesize[0];
1657+ int32_t iDecStrideC = pCurDqLayer->pDec->iLinesize[1];
16581658
16591659 int32_t iOffsetL = (iMbX + iMbY * iDecStrideL) << 4;
16601660 int32_t iOffsetC = (iMbX + iMbY * iDecStrideC) << 3;
16611661
1662− uint8_t* pDecY = pCurLayer->pDec->pData[0] + iOffsetL;
1663− uint8_t* pDecU = pCurLayer->pDec->pData[1] + iOffsetC;
1664− uint8_t* pDecV = pCurLayer->pDec->pData[2] + iOffsetC;
1662+ uint8_t* pDecY = pCurDqLayer->pDec->pData[0] + iOffsetL;
1663+ uint8_t* pDecU = pCurDqLayer->pDec->pData[1] + iOffsetC;
1664+ uint8_t* pDecV = pCurDqLayer->pDec->pData[2] + iOffsetC;
16651665
16661666 uint8_t* pTmpBsBuf;
16671667
@@ -1672,7 +1672,7 @@ int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { · 4 unmodified lines
16721672
16731673 int32_t iIndex = ((-pBs->iLeftBits) >> 3) + 2;
16741674
1675− pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA_PCM;
1675+ pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA_PCM;
16761676
16771677 //step 1: locating bit-stream pointer [must align into integer byte]
16781678 pBs->pCurBuf -= iIndex;
@@ -1700,27 +1700,27 @@ int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { · 21 unmodified lines
17001700 pBs->pCurBuf += 384;
17011701
17021702 //step 3: update QP and pNonZeroCount
1703− pCurLayer->pLumaQp[iMbXy] = 0;
1704− memset (pCurLayer->pChromaQp[iMbXy], 0, sizeof (pCurLayer->pChromaQp[iMbXy]));
1705− memset (pNzc, 16, sizeof (pCurLayer->pNzc[iMbXy])); //Rec. 9.2.1 for PCM, nzc=16
1703+ pCurDqLayer->pLumaQp[iMbXy] = 0;
1704+ memset (pCurDqLayer->pChromaQp[iMbXy], 0, sizeof (pCurDqLayer->pChromaQp[iMbXy]));
1705+ memset (pNzc, 16, sizeof (pCurDqLayer->pNzc[iMbXy])); //Rec. 9.2.1 for PCM, nzc=16
17061706 WELS_READ_VERIFY (InitReadBits (pBs, 0));
17071707 return ERR_NONE;
17081708 } else if (0 == uiMbType) { //reference to JM
17091709 ENFORCE_STACK_ALIGN_1D (int8_t, pIntraPredMode, 48, 16);
1710− pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA4x4;
1710+ pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA4x4;
17111711 if (pCtx->pPps->bTransform8x8ModeFlag) {
17121712 WELS_READ_VERIFY (BsGetOneBit (pBs, &uiCode)); //transform_size_8x8_flag
1713− pCurLayer->pTransformSize8x8Flag[iMbXy] = !!uiCode;
1714− if (pCurLayer->pTransformSize8x8Flag[iMbXy]) {
1715− uiMbType = pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA8x8;
1713+ pCurDqLayer->pTransformSize8x8Flag[iMbXy] = !!uiCode;
1714+ if (pCurDqLayer->pTransformSize8x8Flag[iMbXy]) {
1715+ uiMbType = pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA8x8;
17161716 }
17171717 }
1718− if (!pCurLayer->pTransformSize8x8Flag[iMbXy]) {
1719− pCtx->pFillInfoCacheIntraNxNFunc (&sNeighAvail, pNonZeroCount, pIntraPredMode, pCurLayer);
1720− WELS_READ_VERIFY (ParseIntra4x4Mode (pCtx, &sNeighAvail, pIntraPredMode, pBs, pCurLayer));
1718+ if (!pCurDqLayer->pTransformSize8x8Flag[iMbXy]) {
1719+ pCtx->pFillInfoCacheIntraNxNFunc (&sNeighAvail, pNonZeroCount, pIntraPredMode, pCurDqLayer);
1720+ WELS_READ_VERIFY (ParseIntra4x4Mode (pCtx, &sNeighAvail, pIntraPredMode, pBs, pCurDqLayer));
17211721 } else {
1722− pCtx->pFillInfoCacheIntraNxNFunc (&sNeighAvail, pNonZeroCount, pIntraPredMode, pCurLayer);
1723− WELS_READ_VERIFY (ParseIntra8x8Mode (pCtx, &sNeighAvail, pIntraPredMode, pBs, pCurLayer));
1722+ pCtx->pFillInfoCacheIntraNxNFunc (&sNeighAvail, pNonZeroCount, pIntraPredMode, pCurDqLayer);
1723+ WELS_READ_VERIFY (ParseIntra8x8Mode (pCtx, &sNeighAvail, pIntraPredMode, pBs, pCurDqLayer));
17241724 }
17251725
17261726 //uiCbp
@@ -1736,19 +1736,19 @@ int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { · 9 unmodified lines
17361736 uiCbp = g_kuiIntra4x4CbpTable[uiCbp];
17371737 else
17381738 uiCbp = g_kuiIntra4x4CbpTable400[uiCbp];
1739− pCurLayer->pCbp[iMbXy] = uiCbp;
1739+ pCurDqLayer->pCbp[iMbXy] = uiCbp;
17401740 uiCbpC = uiCbp >> 4;
17411741 uiCbpL = uiCbp & 15;
17421742 } else { //I_PCM exclude, we can ignore it
1743− pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA16x16;
1744− pCurLayer->pTransformSize8x8Flag[iMbXy] = false;
1745− pCurLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
1746− pCurLayer->pIntraPredMode[iMbXy][7] = (uiMbType - 1) & 3;
1747− pCurLayer->pCbp[iMbXy] = g_kuiI16CbpTable[ (uiMbType - 1) >> 2];
1748− uiCbpC = pCtx->pSps->uiChromaFormatIdc ? pCurLayer->pCbp[iMbXy] >> 4 : 0;
1749− uiCbpL = pCurLayer->pCbp[iMbXy] & 15;
1750− WelsFillCacheNonZeroCount (&sNeighAvail, pNonZeroCount, pCurLayer);
1751− WELS_READ_VERIFY (ParseIntra16x16Mode (pCtx, &sNeighAvail, pBs, pCurLayer));
1743+ pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA16x16;
1744+ pCurDqLayer->pTransformSize8x8Flag[iMbXy] = false;
1745+ pCurDqLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
1746+ pCurDqLayer->pIntraPredMode[iMbXy][7] = (uiMbType - 1) & 3;
1747+ pCurDqLayer->pCbp[iMbXy] = g_kuiI16CbpTable[ (uiMbType - 1) >> 2];
1748+ uiCbpC = pCtx->pSps->uiChromaFormatIdc ? pCurDqLayer->pCbp[iMbXy] >> 4 : 0;
1749+ uiCbpL = pCurDqLayer->pCbp[iMbXy] & 15;
1750+ WelsFillCacheNonZeroCount (&sNeighAvail, pNonZeroCount, pCurDqLayer);
1751+ WELS_READ_VERIFY (ParseIntra16x16Mode (pCtx, &sNeighAvail, pBs, pCurDqLayer));
17521752 }
17531753
17541754 ST32A4 (&pNzc[0], 0);
@@ -1758,17 +1758,17 @@ int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { · 3 unmodified lines
17581758 ST32A4 (&pNzc[16], 0);
17591759 ST32A4 (&pNzc[20], 0);
17601760
1761− if (pCurLayer->pCbp[iMbXy] == 0 && IS_INTRANxN (pCurLayer->pMbType[iMbXy])) {
1762− pCurLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp;
1761+ if (pCurDqLayer->pCbp[iMbXy] == 0 && IS_INTRANxN (pCurDqLayer->pDec->pMbType[iMbXy])) {
1762+ pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp;
17631763 for (i = 0; i < 2; i++) {
1764− pCurLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurLayer->pLumaQp[iMbXy] +
1764+ pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] +
17651765 pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)];
17661766 }
17671767
17681768 }
17691769
1770− if (pCurLayer->pCbp[iMbXy] || MB_TYPE_INTRA16x16 == pCurLayer->pMbType[iMbXy]) {
1771− memset (pCurLayer->pScaledTCoeff[iMbXy], 0, 384 * sizeof (pCurLayer->pScaledTCoeff[iMbXy][0]));
1770+ if (pCurDqLayer->pCbp[iMbXy] || MB_TYPE_INTRA16x16 == pCurDqLayer->pDec->pMbType[iMbXy]) {
1771+ memset (pCurDqLayer->pScaledTCoeff[iMbXy], 0, 384 * sizeof (pCurDqLayer->pScaledTCoeff[iMbXy][0]));
17721772 int32_t iQpDelta, iId8x8, iId4x4;
17731773
17741774 WELS_READ_VERIFY (BsGetSe (pBs, &iCode)); //mb_qp_delta
@@ -1778,10 +1778,10 @@ int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { · 3 unmodified lines
17781778 return GENERATE_ERROR_NO (ERR_LEVEL_MB_DATA, ERR_INFO_INVALID_QP);
17791779 }
17801780
1781− pCurLayer->pLumaQp[iMbXy] = (pSlice->iLastMbQp + iQpDelta + 52) % 52; //update last_mb_qp
1782− pSlice->iLastMbQp = pCurLayer->pLumaQp[iMbXy];
1781+ pCurDqLayer->pLumaQp[iMbXy] = (pSlice->iLastMbQp + iQpDelta + 52) % 52; //update last_mb_qp
1782+ pSlice->iLastMbQp = pCurDqLayer->pLumaQp[iMbXy];
17831783 for (i = 0; i < 2; i++) {
1784− pCurLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp +
1784+ pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp +
17851785 pSliceHeader->pPps->iChromaQpIndexOffset[i], 0,
17861786 51)];
17871787 }
@@ -1789,18 +1789,18 @@ int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { · 1 unmodified line
17891789
17901790 BsStartCavlc (pBs);
17911791
1792− if (MB_TYPE_INTRA16x16 == pCurLayer->pMbType[iMbXy]) {
1792+ if (MB_TYPE_INTRA16x16 == pCurDqLayer->pDec->pMbType[iMbXy]) {
17931793 //step1: Luma DC
17941794 if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, 0, 16, g_kuiLumaDcZigzagScan, I16_LUMA_DC,
1795− pCurLayer->pScaledTCoeff[iMbXy], pCurLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
1795+ pCurDqLayer->pScaledTCoeff[iMbXy], pCurDqLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
17961796 return iRet;//abnormal
17971797 }
17981798 //step2: Luma AC
17991799 if (uiCbpL) {
18001800 for (i = 0; i < 16; i++) {
18011801 if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, i, iScanIdxEnd - WELS_MAX (iScanIdxStart, 1) + 1,
1802− g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), I16_LUMA_AC, pCurLayer->pScaledTCoeff[iMbXy] + (i << 4),
1803− pCurLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
1802+ g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), I16_LUMA_AC, pCurDqLayer->pScaledTCoeff[iMbXy] + (i << 4),
1803+ pCurDqLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
18041804 return iRet;//abnormal
18051805 }
18061806 }
@@ -1810,15 +1810,15 @@ int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { · 3 unmodified lines
18101810 ST32A4 (&pNzc[12], LD32 (&pNonZeroCount[1 + 8 * 4]));
18111811 }
18121812 } else { //non-MB_TYPE_INTRA16x16
1813− if (pCurLayer->pTransformSize8x8Flag[iMbXy]) {
1813+ if (pCurDqLayer->pTransformSize8x8Flag[iMbXy]) {
18141814 for (iId8x8 = 0; iId8x8 < 4; iId8x8++) {
1815− iMbResProperty = (IS_INTRA (pCurLayer->pMbType[iMbXy])) ? LUMA_DC_AC_INTRA_8 : LUMA_DC_AC_INTER_8;
1815+ iMbResProperty = (IS_INTRA (pCurDqLayer->pDec->pMbType[iMbXy])) ? LUMA_DC_AC_INTRA_8 : LUMA_DC_AC_INTER_8;
18161816 if (uiCbpL & (1 << iId8x8)) {
18171817 int32_t iIndex = (iId8x8 << 2);
18181818 for (iId4x4 = 0; iId4x4 < 4; iId4x4++) {
18191819 if ((iRet = WelsResidualBlockCavlc8x8 (pVlcTable, pNonZeroCount, pBs, iIndex, iScanIdxEnd - iScanIdxStart + 1,
1820− g_kuiZigzagScan8x8 + iScanIdxStart, iMbResProperty, pCurLayer->pScaledTCoeff[iMbXy] + (iId8x8 << 6), iId4x4,
1821− pCurLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
1820+ g_kuiZigzagScan8x8 + iScanIdxStart, iMbResProperty, pCurDqLayer->pScaledTCoeff[iMbXy] + (iId8x8 << 6), iId4x4,
1821+ pCurDqLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
18221822 return iRet;
18231823 }
18241824 iIndex++;
@@ -1839,8 +1839,8 @@ int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { · 14 unmodified lines
18391839 for (iId4x4 = 0; iId4x4 < 4; iId4x4++) {
18401840 //Luma (DC and AC decoding together)
18411841 if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, iIndex, iScanIdxEnd - iScanIdxStart + 1,
1842− g_kuiZigzagScan + iScanIdxStart, LUMA_DC_AC_INTRA, pCurLayer->pScaledTCoeff[iMbXy] + (iIndex << 4),
1843− pCurLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
1842+ g_kuiZigzagScan + iScanIdxStart, LUMA_DC_AC_INTRA, pCurDqLayer->pScaledTCoeff[iMbXy] + (iIndex << 4),
1843+ pCurDqLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
18441844 return iRet;//abnormal
18451845 }
18461846 iIndex++;
@@ -1863,7 +1863,7 @@ int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { · 16 unmodified lines
18631863 for (i = 0; i < 2; i++) { //Cb Cr
18641864 iMbResProperty = i ? CHROMA_DC_V : CHROMA_DC_U;
18651865 if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, 16 + (i << 2), 4, g_kuiChromaDcScan, iMbResProperty,
1866− pCurLayer->pScaledTCoeff[iMbXy] + 256 + (i << 6), pCurLayer->pChromaQp[iMbXy][i], pCtx)) != ERR_NONE) {
1866+ pCurDqLayer->pScaledTCoeff[iMbXy] + 256 + (i << 6), pCurDqLayer->pChromaQp[iMbXy][i], pCtx)) != ERR_NONE) {
18671867 return iRet;//abnormal
18681868 }
18691869 }
@@ -1876,8 +1876,8 @@ int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { · 6 unmodified lines
18761876 int32_t iIndex = 16 + (i << 2);
18771877 for (iId4x4 = 0; iId4x4 < 4; iId4x4++) {
18781878 if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, iIndex, iScanIdxEnd - WELS_MAX (iScanIdxStart,
1879− 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), iMbResProperty, pCurLayer->pScaledTCoeff[iMbXy] + (iIndex << 4),
1880− pCurLayer->pChromaQp[iMbXy][i], pCtx)) != ERR_NONE) {
1879+ 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), iMbResProperty, pCurDqLayer->pScaledTCoeff[iMbXy] + (iIndex << 4),
1880+ pCurDqLayer->pChromaQp[iMbXy][i], pCtx)) != ERR_NONE) {
18811881 return iRet;//abnormal
18821882 }
18831883 iIndex++;
@@ -1895,9 +1895,9 @@ int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { · 11 unmodified lines
18951895 }
18961896
18971897 int32_t WelsDecodeMbCavlcISlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uint32_t& uiEosFlag) {
1898− PDqLayer pCurLayer = pCtx->pCurDqLayer;
1899− PBitStringAux pBs = pCurLayer->pBitStringAux;
1900− PSliceHeaderExt pSliceHeaderExt = &pCurLayer->sLayerInfo.sSliceInLayer.sSliceHeaderExt;
1898+ PDqLayer pCurDqLayer = pCtx->pCurDqLayer;
1899+ PBitStringAux pBs = pCurDqLayer->pBitStringAux;
1900+ PSliceHeaderExt pSliceHeaderExt = &pCurDqLayer->sLayerInfo.sSliceInLayer.sSliceHeaderExt;
19011901 int32_t iBaseModeFlag;
19021902 int32_t iRet = 0; //should have the return value to indicate decoding error or not, It's NECESSARY--2010.4.15
19031903 uint32_t uiCode;
@@ -1922,7 +1922,7 @@ int32_t WelsDecodeMbCavlcISlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 18 unmodified lines
19221922 // check whether there is left bits to read next time in case multiple slices
19231923 iUsedBits = ((pBs->pCurBuf - pBs->pStartBuf) << 3) - (16 - pBs->iLeftBits);
19241924 // sub 1, for stop bit
1925− if ((iUsedBits == (pBs->iBits - 1)) && (0 >= pCurLayer->sLayerInfo.sSliceInLayer.iMbSkipRun)) { // slice boundary
1925+ if ((iUsedBits == (pBs->iBits - 1)) && (0 >= pCurDqLayer->sLayerInfo.sSliceInLayer.iMbSkipRun)) { // slice boundary
19261926 uiEosFlag = 1;
19271927 }
19281928 if (iUsedBits > (pBs->iBits -
@@ -1936,20 +1936,20 @@ int32_t WelsDecodeMbCavlcISlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 7 unmodified lines
19361936 }
19371937
19381938 int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) {
1939− SVlcTable* pVlcTable = &pCtx->sVlcTable;
1940− PDqLayer pCurLayer = pCtx->pCurDqLayer;
1941− PBitStringAux pBs = pCurLayer->pBitStringAux;
1942− PSlice pSlice = &pCurLayer->sLayerInfo.sSliceInLayer;
1939+ SVlcTable* pVlcTable = pCtx->pVlcTable;
1940+ PDqLayer pCurDqLayer = pCtx->pCurDqLayer;
1941+ PBitStringAux pBs = pCurDqLayer->pBitStringAux;
1942+ PSlice pSlice = &pCurDqLayer->sLayerInfo.sSliceInLayer;
19431943 PSliceHeader pSliceHeader = &pSlice->sSliceHeaderExt.sSliceHeader;
19441944
19451945 int32_t iScanIdxStart = pSlice->sSliceHeaderExt.uiScanIdxStart;
19461946 int32_t iScanIdxEnd = pSlice->sSliceHeaderExt.uiScanIdxEnd;
19471947
19481948 SWelsNeighAvail sNeighAvail;
1949− int32_t iMbX = pCurLayer->iMbX;
1950− int32_t iMbY = pCurLayer->iMbY;
1951− const int32_t iMbXy = pCurLayer->iMbXyIndex;
1952− int8_t* pNzc = pCurLayer->pNzc[iMbXy];
1949+ int32_t iMbX = pCurDqLayer->iMbX;
1950+ int32_t iMbY = pCurDqLayer->iMbY;
1951+ const int32_t iMbXy = pCurDqLayer->iMbXyIndex;
1952+ int8_t* pNzc = pCurDqLayer->pNzc[iMbXy];
19531953 int32_t i;
19541954 int32_t iRet = ERR_NONE;
19551955 uint32_t uiMbType = 0, uiCbp = 0, uiCbpL = 0, uiCbpC = 0;
@@ -1957,16 +1957,16 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 1 unmodified line
19571957 int32_t iCode;
19581958 int32_t iMbResProperty;
19591959
1960− GetNeighborAvailMbType (&sNeighAvail, pCurLayer);
1960+ GetNeighborAvailMbType (&sNeighAvail, pCurDqLayer);
19611961 ENFORCE_STACK_ALIGN_1D (uint8_t, pNonZeroCount, 48, 16);
1962− pCurLayer->pInterPredictionDoneFlag[iMbXy] = 0;//2009.10.23
1962+ pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0;//2009.10.23
19631963 WELS_READ_VERIFY (BsGetUe (pBs, &uiCode)); //uiMbType
19641964 uiMbType = uiCode;
19651965 if (uiMbType < 5) { //inter MB type
19661966 int16_t iMotionVector[LIST_A][30][MV_A];
19671967 int8_t iRefIndex[LIST_A][30];
1968− pCurLayer->pMbType[iMbXy] = g_ksInterPMbTypeInfo[uiMbType].iType;
1969− WelsFillCacheInter (&sNeighAvail, pNonZeroCount, iMotionVector, iRefIndex, pCurLayer);
1968+ pCurDqLayer->pDec->pMbType[iMbXy] = g_ksInterPMbTypeInfo[uiMbType].iType;
1969+ WelsFillCacheInter (&sNeighAvail, pNonZeroCount, iMotionVector, iRefIndex, pCurDqLayer);
19701970
19711971 if ((iRet = ParseInterInfo (pCtx, iMotionVector, iRefIndex, pBs)) != ERR_NONE) {
19721972 return iRet;//abnormal
@@ -1974,13 +1974,13 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 1 unmodified line
19741974
19751975 if (pSlice->sSliceHeaderExt.bAdaptiveResidualPredFlag == 1) {
19761976 WELS_READ_VERIFY (BsGetOneBit (pBs, &uiCode)); //residual_prediction_flag
1977− pCurLayer->pResidualPredFlag[iMbXy] = uiCode;
1977+ pCurDqLayer->pResidualPredFlag[iMbXy] = uiCode;
19781978 } else {
1979− pCurLayer->pResidualPredFlag[iMbXy] = pSlice->sSliceHeaderExt.bDefaultResidualPredFlag;
1979+ pCurDqLayer->pResidualPredFlag[iMbXy] = pSlice->sSliceHeaderExt.bDefaultResidualPredFlag;
19801980 }
19811981
1982− if (pCurLayer->pResidualPredFlag[iMbXy] == 0) {
1983− pCurLayer->pInterPredictionDoneFlag[iMbXy] = 0;
1982+ if (pCurDqLayer->pResidualPredFlag[iMbXy] == 0) {
1983+ pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0;
19841984 } else {
19851985 WelsLog (& (pCtx->sLogCtx), WELS_LOG_WARNING, "residual_pred_flag = 1 not supported.");
19861986 return GENERATE_ERROR_NO (ERR_LEVEL_MB_DATA, ERR_INFO_UNSUPPORTED_ILP);
@@ -1994,15 +1994,15 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 7 unmodified lines
19941994
19951995 if (25 == uiMbType) {
19961996 WelsLog (& (pCtx->sLogCtx), WELS_LOG_DEBUG, "I_PCM mode exists in P slice!");
1997− int32_t iDecStrideL = pCurLayer->pDec->iLinesize[0];
1998− int32_t iDecStrideC = pCurLayer->pDec->iLinesize[1];
1997+ int32_t iDecStrideL = pCurDqLayer->pDec->iLinesize[0];
1998+ int32_t iDecStrideC = pCurDqLayer->pDec->iLinesize[1];
19991999
20002000 int32_t iOffsetL = (iMbX + iMbY * iDecStrideL) << 4;
20012001 int32_t iOffsetC = (iMbX + iMbY * iDecStrideC) << 3;
20022002
2003− uint8_t* pDecY = pCurLayer->pDec->pData[0] + iOffsetL;
2004− uint8_t* pDecU = pCurLayer->pDec->pData[1] + iOffsetC;
2005− uint8_t* pDecV = pCurLayer->pDec->pData[2] + iOffsetC;
2003+ uint8_t* pDecY = pCurDqLayer->pDec->pData[0] + iOffsetL;
2004+ uint8_t* pDecU = pCurDqLayer->pDec->pData[1] + iOffsetC;
2005+ uint8_t* pDecV = pCurDqLayer->pDec->pData[2] + iOffsetC;
20062006
20072007 uint8_t* pTmpBsBuf;
20082008
@@ -2012,7 +2012,7 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 3 unmodified lines
20122012
20132013 int32_t iIndex = ((-pBs->iLeftBits) >> 3) + 2;
20142014
2015− pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA_PCM;
2015+ pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA_PCM;
20162016
20172017 //step 1: locating bit-stream pointer [must align into integer byte]
20182018 pBs->pCurBuf -= iIndex;
@@ -2041,8 +2041,8 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 22 unmodified lines
20412041 pBs->pCurBuf += 384;
20422042
20432043 //step 3: update QP and pNonZeroCount
2044− pCurLayer->pLumaQp[iMbXy] = 0;
2045− pCurLayer->pChromaQp[iMbXy][0] = pCurLayer->pChromaQp[iMbXy][1] = 0;
2044+ pCurDqLayer->pLumaQp[iMbXy] = 0;
2045+ pCurDqLayer->pChromaQp[iMbXy][0] = pCurDqLayer->pChromaQp[iMbXy][1] = 0;
20462046 //Rec. 9.2.1 for PCM, nzc=16
20472047 ST32A4 (&pNzc[0], 0x10101010);
20482048 ST32A4 (&pNzc[4], 0x10101010);
@@ -2055,38 +2055,38 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 6 unmodified lines
20552055 } else {
20562056 if (0 == uiMbType) {
20572057 ENFORCE_STACK_ALIGN_1D (int8_t, pIntraPredMode, 48, 16);
2058− pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA4x4;
2058+ pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA4x4;
20592059 if (pCtx->pPps->bTransform8x8ModeFlag) {
20602060 WELS_READ_VERIFY (BsGetOneBit (pBs, &uiCode)); //transform_size_8x8_flag
2061− pCurLayer->pTransformSize8x8Flag[iMbXy] = !!uiCode;
2062− if (pCurLayer->pTransformSize8x8Flag[iMbXy]) {
2063− uiMbType = pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA8x8;
2061+ pCurDqLayer->pTransformSize8x8Flag[iMbXy] = !!uiCode;
2062+ if (pCurDqLayer->pTransformSize8x8Flag[iMbXy]) {
2063+ uiMbType = pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA8x8;
20642064 }
20652065 }
2066− if (!pCurLayer->pTransformSize8x8Flag[iMbXy]) {
2067− pCtx->pFillInfoCacheIntraNxNFunc (&sNeighAvail, pNonZeroCount, pIntraPredMode, pCurLayer);
2068− WELS_READ_VERIFY (ParseIntra4x4Mode (pCtx, &sNeighAvail, pIntraPredMode, pBs, pCurLayer));
2066+ if (!pCurDqLayer->pTransformSize8x8Flag[iMbXy]) {
2067+ pCtx->pFillInfoCacheIntraNxNFunc (&sNeighAvail, pNonZeroCount, pIntraPredMode, pCurDqLayer);
2068+ WELS_READ_VERIFY (ParseIntra4x4Mode (pCtx, &sNeighAvail, pIntraPredMode, pBs, pCurDqLayer));
20692069 } else {
2070− pCtx->pFillInfoCacheIntraNxNFunc (&sNeighAvail, pNonZeroCount, pIntraPredMode, pCurLayer);
2071− WELS_READ_VERIFY (ParseIntra8x8Mode (pCtx, &sNeighAvail, pIntraPredMode, pBs, pCurLayer));
2070+ pCtx->pFillInfoCacheIntraNxNFunc (&sNeighAvail, pNonZeroCount, pIntraPredMode, pCurDqLayer);
2071+ WELS_READ_VERIFY (ParseIntra8x8Mode (pCtx, &sNeighAvail, pIntraPredMode, pBs, pCurDqLayer));
20722072 }
20732073 } else { //I_PCM exclude, we can ignore it
2074− pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA16x16;
2075− pCurLayer->pTransformSize8x8Flag[iMbXy] = false;
2076− pCurLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
2077− pCurLayer->pIntraPredMode[iMbXy][7] = (uiMbType - 1) & 3;
2078− pCurLayer->pCbp[iMbXy] = g_kuiI16CbpTable[ (uiMbType - 1) >> 2];
2079− uiCbpC = pCtx->pSps->uiChromaFormatIdc ? pCurLayer->pCbp[iMbXy] >> 4 : 0;
2080− uiCbpL = pCurLayer->pCbp[iMbXy] & 15;
2081− WelsFillCacheNonZeroCount (&sNeighAvail, pNonZeroCount, pCurLayer);
2082− if ((iRet = ParseIntra16x16Mode (pCtx, &sNeighAvail, pBs, pCurLayer)) != ERR_NONE) {
2074+ pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA16x16;
2075+ pCurDqLayer->pTransformSize8x8Flag[iMbXy] = false;
2076+ pCurDqLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
2077+ pCurDqLayer->pIntraPredMode[iMbXy][7] = (uiMbType - 1) & 3;
2078+ pCurDqLayer->pCbp[iMbXy] = g_kuiI16CbpTable[ (uiMbType - 1) >> 2];
2079+ uiCbpC = pCtx->pSps->uiChromaFormatIdc ? pCurDqLayer->pCbp[iMbXy] >> 4 : 0;
2080+ uiCbpL = pCurDqLayer->pCbp[iMbXy] & 15;
2081+ WelsFillCacheNonZeroCount (&sNeighAvail, pNonZeroCount, pCurDqLayer);
2082+ if ((iRet = ParseIntra16x16Mode (pCtx, &sNeighAvail, pBs, pCurDqLayer)) != ERR_NONE) {
20832083 return iRet;
20842084 }
20852085 }
20862086 }
20872087 }
20882088
2089− if (MB_TYPE_INTRA16x16 != pCurLayer->pMbType[iMbXy]) {
2089+ if (MB_TYPE_INTRA16x16 != pCurDqLayer->pDec->pMbType[iMbXy]) {
20902090 WELS_READ_VERIFY (BsGetUe (pBs, &uiCode)); //coded_block_pattern
20912091 uiCbp = uiCode;
20922092 {
@@ -2094,29 +2094,29 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 1 unmodified line
20942094 return GENERATE_ERROR_NO (ERR_LEVEL_MB_DATA, ERR_INFO_INVALID_CBP);
20952095 if (!pCtx->pSps->uiChromaFormatIdc && (uiCbp > 15))
20962096 return GENERATE_ERROR_NO (ERR_LEVEL_MB_DATA, ERR_INFO_INVALID_CBP);
2097− if (MB_TYPE_INTRA4x4 == pCurLayer->pMbType[iMbXy] || MB_TYPE_INTRA8x8 == pCurLayer->pMbType[iMbXy]) {
2097+ if (MB_TYPE_INTRA4x4 == pCurDqLayer->pDec->pMbType[iMbXy] || MB_TYPE_INTRA8x8 == pCurDqLayer->pDec->pMbType[iMbXy]) {
20982098
20992099 uiCbp = pCtx->pSps->uiChromaFormatIdc ? g_kuiIntra4x4CbpTable[uiCbp] : g_kuiIntra4x4CbpTable400[uiCbp];
21002100 } else //inter
21012101 uiCbp = pCtx->pSps->uiChromaFormatIdc ? g_kuiInterCbpTable[uiCbp] : g_kuiInterCbpTable400[uiCbp];
21022102 }
21032103
2104− pCurLayer->pCbp[iMbXy] = uiCbp;
2105− uiCbpC = pCurLayer->pCbp[iMbXy] >> 4;
2106− uiCbpL = pCurLayer->pCbp[iMbXy] & 15;
2104+ pCurDqLayer->pCbp[iMbXy] = uiCbp;
2105+ uiCbpC = pCurDqLayer->pCbp[iMbXy] >> 4;
2106+ uiCbpL = pCurDqLayer->pCbp[iMbXy] & 15;
21072107
21082108 // Need modification when B picutre add in
21092109 bool bNeedParseTransformSize8x8Flag =
2110− (((pCurLayer->pMbType[iMbXy] >= MB_TYPE_16x16 && pCurLayer->pMbType[iMbXy] <= MB_TYPE_8x16)
2111− || pCurLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy])
2112− && (pCurLayer->pMbType[iMbXy] != MB_TYPE_INTRA8x8)
2113− && (pCurLayer->pMbType[iMbXy] != MB_TYPE_INTRA4x4)
2110+ (((pCurDqLayer->pDec->pMbType[iMbXy] >= MB_TYPE_16x16 && pCurDqLayer->pDec->pMbType[iMbXy] <= MB_TYPE_8x16)
2111+ || pCurDqLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy])
2112+ && (pCurDqLayer->pDec->pMbType[iMbXy] != MB_TYPE_INTRA8x8)
2113+ && (pCurDqLayer->pDec->pMbType[iMbXy] != MB_TYPE_INTRA4x4)
21142114 && (uiCbpL > 0)
21152115 && (pCtx->pPps->bTransform8x8ModeFlag));
21162116
21172117 if (bNeedParseTransformSize8x8Flag) {
21182118 WELS_READ_VERIFY (BsGetOneBit (pBs, &uiCode)); //transform_size_8x8_flag
2119− pCurLayer->pTransformSize8x8Flag[iMbXy] = !!uiCode;
2119+ pCurDqLayer->pTransformSize8x8Flag[iMbXy] = !!uiCode;
21202120 }
21212121 }
21222122
@@ -2126,17 +2126,17 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 3 unmodified lines
21262126 ST32A4 (&pNzc[12], 0);
21272127 ST32A4 (&pNzc[16], 0);
21282128 ST32A4 (&pNzc[20], 0);
2129− if (pCurLayer->pCbp[iMbXy] == 0 && !IS_INTRA16x16 (pCurLayer->pMbType[iMbXy]) && !IS_I_BL (pCurLayer->pMbType[iMbXy])) {
2130− pCurLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp;
2129+ if (pCurDqLayer->pCbp[iMbXy] == 0 && !IS_INTRA16x16 (pCurDqLayer->pDec->pMbType[iMbXy]) && !IS_I_BL (pCurDqLayer->pDec->pMbType[iMbXy])) {
2130+ pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp;
21312131 for (i = 0; i < 2; i++) {
2132− pCurLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurLayer->pLumaQp[iMbXy] +
2132+ pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] +
21332133 pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)];
21342134 }
21352135 }
21362136
2137− if (pCurLayer->pCbp[iMbXy] || MB_TYPE_INTRA16x16 == pCurLayer->pMbType[iMbXy]) {
2137+ if (pCurDqLayer->pCbp[iMbXy] || MB_TYPE_INTRA16x16 == pCurDqLayer->pDec->pMbType[iMbXy]) {
21382138 int32_t iQpDelta, iId8x8, iId4x4;
2139− memset (pCurLayer->pScaledTCoeff[iMbXy], 0, MB_COEFF_LIST_SIZE * sizeof (int16_t));
2139+ memset (pCurDqLayer->pScaledTCoeff[iMbXy], 0, MB_COEFF_LIST_SIZE * sizeof (int16_t));
21402140 WELS_READ_VERIFY (BsGetSe (pBs, &iCode)); //mb_qp_delta
21412141 iQpDelta = iCode;
21422142
@@ -2144,28 +2144,28 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 1 unmodified line
21442144 return GENERATE_ERROR_NO (ERR_LEVEL_MB_DATA, ERR_INFO_INVALID_QP);
21452145 }
21462146
2147− pCurLayer->pLumaQp[iMbXy] = (pSlice->iLastMbQp + iQpDelta + 52) % 52; //update last_mb_qp
2148− pSlice->iLastMbQp = pCurLayer->pLumaQp[iMbXy];
2147+ pCurDqLayer->pLumaQp[iMbXy] = (pSlice->iLastMbQp + iQpDelta + 52) % 52; //update last_mb_qp
2148+ pSlice->iLastMbQp = pCurDqLayer->pLumaQp[iMbXy];
21492149 for (i = 0; i < 2; i++) {
2150− pCurLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp +
2150+ pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp +
21512151 pSliceHeader->pPps->iChromaQpIndexOffset[i], 0,
21522152 51)];
21532153 }
21542154
21552155 BsStartCavlc (pBs);
21562156
2157− if (MB_TYPE_INTRA16x16 == pCurLayer->pMbType[iMbXy]) {
2157+ if (MB_TYPE_INTRA16x16 == pCurDqLayer->pDec->pMbType[iMbXy]) {
21582158 //step1: Luma DC
21592159 if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, 0, 16, g_kuiLumaDcZigzagScan, I16_LUMA_DC,
2160− pCurLayer->pScaledTCoeff[iMbXy], pCurLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
2160+ pCurDqLayer->pScaledTCoeff[iMbXy], pCurDqLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
21612161 return iRet;//abnormal
21622162 }
21632163 //step2: Luma AC
21642164 if (uiCbpL) {
21652165 for (i = 0; i < 16; i++) {
21662166 if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, i, iScanIdxEnd - WELS_MAX (iScanIdxStart, 1) + 1,
2167− g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), I16_LUMA_AC, pCurLayer->pScaledTCoeff[iMbXy] + (i << 4),
2168− pCurLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
2167+ g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), I16_LUMA_AC, pCurDqLayer->pScaledTCoeff[iMbXy] + (i << 4),
2168+ pCurDqLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
21692169 return iRet;//abnormal
21702170 }
21712171 }
@@ -2175,15 +2175,15 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 3 unmodified lines
21752175 ST32A4 (&pNzc[12], LD32 (&pNonZeroCount[1 + 8 * 4]));
21762176 }
21772177 } else { //non-MB_TYPE_INTRA16x16
2178− if (pCurLayer->pTransformSize8x8Flag[iMbXy]) {
2178+ if (pCurDqLayer->pTransformSize8x8Flag[iMbXy]) {
21792179 for (iId8x8 = 0; iId8x8 < 4; iId8x8++) {
2180− iMbResProperty = (IS_INTRA (pCurLayer->pMbType[iMbXy])) ? LUMA_DC_AC_INTRA_8 : LUMA_DC_AC_INTER_8;
2180+ iMbResProperty = (IS_INTRA (pCurDqLayer->pDec->pMbType[iMbXy])) ? LUMA_DC_AC_INTRA_8 : LUMA_DC_AC_INTER_8;
21812181 if (uiCbpL & (1 << iId8x8)) {
21822182 int32_t iIndex = (iId8x8 << 2);
21832183 for (iId4x4 = 0; iId4x4 < 4; iId4x4++) {
21842184 if ((iRet = WelsResidualBlockCavlc8x8 (pVlcTable, pNonZeroCount, pBs, iIndex, iScanIdxEnd - iScanIdxStart + 1,
2185− g_kuiZigzagScan8x8 + iScanIdxStart, iMbResProperty, pCurLayer->pScaledTCoeff[iMbXy] + (iId8x8 << 6), iId4x4,
2186− pCurLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
2185+ g_kuiZigzagScan8x8 + iScanIdxStart, iMbResProperty, pCurDqLayer->pScaledTCoeff[iMbXy] + (iId8x8 << 6), iId4x4,
2186+ pCurDqLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
21872187 return iRet;
21882188 }
21892189 iIndex++;
@@ -2199,14 +2199,14 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 9 unmodified lines
21992199 ST32A4 (&pNzc[12], LD32 (&pNonZeroCount[1 + 8 * 4]));
22002200 } else { // Normal T4x4
22012201 for (iId8x8 = 0; iId8x8 < 4; iId8x8++) {
2202− iMbResProperty = (IS_INTRA (pCurLayer->pMbType[iMbXy])) ? LUMA_DC_AC_INTRA : LUMA_DC_AC_INTER;
2202+ iMbResProperty = (IS_INTRA (pCurDqLayer->pDec->pMbType[iMbXy])) ? LUMA_DC_AC_INTRA : LUMA_DC_AC_INTER;
22032203 if (uiCbpL & (1 << iId8x8)) {
22042204 int32_t iIndex = (iId8x8 << 2);
22052205 for (iId4x4 = 0; iId4x4 < 4; iId4x4++) {
22062206 //Luma (DC and AC decoding together)
22072207 if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, iIndex, iScanIdxEnd - iScanIdxStart + 1,
2208− g_kuiZigzagScan + iScanIdxStart, iMbResProperty, pCurLayer->pScaledTCoeff[iMbXy] + (iIndex << 4),
2209− pCurLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
2208+ g_kuiZigzagScan + iScanIdxStart, iMbResProperty, pCurDqLayer->pScaledTCoeff[iMbXy] + (iIndex << 4),
2209+ pCurDqLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
22102210 return iRet;//abnormal
22112211 }
22122212 iIndex++;
@@ -2228,13 +2228,13 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 15 unmodified lines
22282228 //step1: DC
22292229 if (1 == uiCbpC || 2 == uiCbpC) {
22302230 for (i = 0; i < 2; i++) { //Cb Cr
2231− if (IS_INTRA (pCurLayer->pMbType[iMbXy]))
2231+ if (IS_INTRA (pCurDqLayer->pDec->pMbType[iMbXy]))
22322232 iMbResProperty = i ? CHROMA_DC_V : CHROMA_DC_U;
22332233 else
22342234 iMbResProperty = i ? CHROMA_DC_V_INTER : CHROMA_DC_U_INTER;
22352235
22362236 if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, 16 + (i << 2), 4, g_kuiChromaDcScan, iMbResProperty,
2237− pCurLayer->pScaledTCoeff[iMbXy] + 256 + (i << 6), pCurLayer->pChromaQp[iMbXy][i], pCtx)) != ERR_NONE) {
2237+ pCurDqLayer->pScaledTCoeff[iMbXy] + 256 + (i << 6), pCurDqLayer->pChromaQp[iMbXy][i], pCtx)) != ERR_NONE) {
22382238 return iRet;//abnormal
22392239 }
22402240 }
@@ -2243,7 +2243,7 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 2 unmodified lines
22432243 //step2: AC
22442244 if (2 == uiCbpC) {
22452245 for (i = 0; i < 2; i++) { //Cb Cr
2246− if (IS_INTRA (pCurLayer->pMbType[iMbXy]))
2246+ if (IS_INTRA (pCurDqLayer->pDec->pMbType[iMbXy]))
22472247 iMbResProperty = i ? CHROMA_AC_V : CHROMA_AC_U;
22482248 else
22492249 iMbResProperty = i ? CHROMA_AC_V_INTER : CHROMA_AC_U_INTER;
@@ -2251,8 +2251,8 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 1 unmodified line
22512251 int32_t iIndex = 16 + (i << 2);
22522252 for (iId4x4 = 0; iId4x4 < 4; iId4x4++) {
22532253 if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, iIndex, iScanIdxEnd - WELS_MAX (iScanIdxStart,
2254− 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), iMbResProperty, pCurLayer->pScaledTCoeff[iMbXy] + (iIndex << 4),
2255− pCurLayer->pChromaQp[iMbXy][i], pCtx)) != ERR_NONE) {
2254+ 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), iMbResProperty, pCurDqLayer->pScaledTCoeff[iMbXy] + (iIndex << 4),
2255+ pCurDqLayer->pChromaQp[iMbXy][i], pCtx)) != ERR_NONE) {
22562256 return iRet;//abnormal
22572257 }
22582258 iIndex++;
@@ -2270,20 +2270,20 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 11 unmodified lines
22702270 }
22712271
22722272 int32_t WelsDecodeMbCavlcPSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uint32_t& uiEosFlag) {
2273− PDqLayer pCurLayer = pCtx->pCurDqLayer;
2274− PBitStringAux pBs = pCurLayer->pBitStringAux;
2275− PSlice pSlice = &pCurLayer->sLayerInfo.sSliceInLayer;
2273+ PDqLayer pCurDqLayer = pCtx->pCurDqLayer;
2274+ PBitStringAux pBs = pCurDqLayer->pBitStringAux;
2275+ PSlice pSlice = &pCurDqLayer->sLayerInfo.sSliceInLayer;
22762276 PSliceHeader pSliceHeader = &pSlice->sSliceHeaderExt.sSliceHeader;
22772277 PPicture* ppRefPic = pCtx->sRefPic.pRefList[LIST_0];
22782278 intX_t iUsedBits;
2279− const int32_t iMbXy = pCurLayer->iMbXyIndex;
2280− int8_t* pNzc = pCurLayer->pNzc[iMbXy];
2279+ const int32_t iMbXy = pCurDqLayer->iMbXyIndex;
2280+ int8_t* pNzc = pCurDqLayer->pNzc[iMbXy];
22812281 int32_t iBaseModeFlag, i;
22822282 int32_t iRet = 0; //should have the return value to indicate decoding error or not, It's NECESSARY--2010.4.15
22832283 uint32_t uiCode;
22842284
2285− pCurLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
2286− pCurLayer->pTransformSize8x8Flag[iMbXy] = false;
2285+ pCurDqLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
2286+ pCurDqLayer->pTransformSize8x8Flag[iMbXy] = false;
22872287
22882288 if (-1 == pSlice->iMbSkipRun) {
22892289 WELS_READ_VERIFY (BsGetUe (pBs, &uiCode)); //mb_skip_run
@@ -2295,7 +2295,7 @@ int32_t WelsDecodeMbCavlcPSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 5 unmodified lines
22952295 if (pSlice->iMbSkipRun--) {
22962296 int16_t iMv[2];
22972297
2298− pCurLayer->pMbType[iMbXy] = MB_TYPE_SKIP;
2298+ pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_SKIP;
22992299 ST32A4 (&pNzc[0], 0);
23002300 ST32A4 (&pNzc[4], 0);
23012301 ST32A4 (&pNzc[8], 0);
@@ -2303,30 +2303,30 @@ int32_t WelsDecodeMbCavlcPSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 1 unmodified line
23032303 ST32A4 (&pNzc[16], 0);
23042304 ST32A4 (&pNzc[20], 0);
23052305
2306− pCurLayer->pInterPredictionDoneFlag[iMbXy] = 0;
2307− memset (pCurLayer->pRefIndex[0][iMbXy], 0, sizeof (int8_t) * 16);
2306+ pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0;
2307+ memset (pCurDqLayer->pDec->pRefIndex[0][iMbXy], 0, sizeof (int8_t) * 16);
23082308 pCtx->bMbRefConcealed = pCtx->bRPLRError || pCtx->bMbRefConcealed || ! (ppRefPic[0] && ppRefPic[0]->bIsComplete);
23092309 //predict iMv
2310− PredPSkipMvFromNeighbor (pCurLayer, iMv);
2310+ PredPSkipMvFromNeighbor (pCurDqLayer, iMv);
23112311 for (i = 0; i < 16; i++) {
2312− ST32A2 (pCurLayer->pMv[0][iMbXy][i], * (uint32_t*)iMv);
2312+ ST32A2 (pCurDqLayer->pDec->pMv[0][iMbXy][i], * (uint32_t*)iMv);
23132313 }
23142314
23152315 //if (!pSlice->sSliceHeaderExt.bDefaultResidualPredFlag) {
2316− // memset (pCurLayer->pScaledTCoeff[iMbXy], 0, 384 * sizeof (int16_t));
2316+ // memset (pCurDqLayer->pScaledTCoeff[iMbXy], 0, 384 * sizeof (int16_t));
23172317 //}
23182318
23192319 //reset rS
23202320 if (!pSlice->sSliceHeaderExt.bDefaultResidualPredFlag ||
23212321 (pNalCur->sNalHeaderExt.uiQualityId == 0 && pNalCur->sNalHeaderExt.uiDependencyId == 0)) {
2322− pCurLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp;
2322+ pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp;
23232323 for (i = 0; i < 2; i++) {
2324− pCurLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurLayer->pLumaQp[iMbXy] +
2324+ pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] +
23252325 pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)];
23262326 }
23272327 }
23282328
2329− pCurLayer->pCbp[iMbXy] = 0;
2329+ pCurDqLayer->pCbp[iMbXy] = 0;
23302330 } else {
23312331 if (pSlice->sSliceHeaderExt.bAdaptiveBaseModeFlag == 1) {
23322332 WELS_READ_VERIFY (BsGetOneBit (pBs, &uiCode)); //base_mode_flag
@@ -2348,7 +2348,7 @@ int32_t WelsDecodeMbCavlcPSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 15 unmodified lines
23482348 // check whether there is left bits to read next time in case multiple slices
23492349 iUsedBits = ((pBs->pCurBuf - pBs->pStartBuf) << 3) - (16 - pBs->iLeftBits);
23502350 // sub 1, for stop bit
2351− if ((iUsedBits == (pBs->iBits - 1)) && (0 >= pCurLayer->sLayerInfo.sSliceInLayer.iMbSkipRun)) { // slice boundary
2351+ if ((iUsedBits == (pBs->iBits - 1)) && (0 >= pCurDqLayer->sLayerInfo.sSliceInLayer.iMbSkipRun)) { // slice boundary
23522352 uiEosFlag = 1;
23532353 }
23542354 if (iUsedBits > (pBs->iBits -
@@ -2362,21 +2362,21 @@ int32_t WelsDecodeMbCavlcPSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 7 unmodified lines
23622362 }
23632363
23642364 int32_t WelsDecodeMbCavlcBSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uint32_t& uiEosFlag) {
2365− PDqLayer pCurLayer = pCtx->pCurDqLayer;
2366− PBitStringAux pBs = pCurLayer->pBitStringAux;
2367− PSlice pSlice = &pCurLayer->sLayerInfo.sSliceInLayer;
2365+ PDqLayer pCurDqLayer = pCtx->pCurDqLayer;
2366+ PBitStringAux pBs = pCurDqLayer->pBitStringAux;
2367+ PSlice pSlice = &pCurDqLayer->sLayerInfo.sSliceInLayer;
23682368 PSliceHeader pSliceHeader = &pSlice->sSliceHeaderExt.sSliceHeader;
23692369 PPicture* ppRefPicL0 = pCtx->sRefPic.pRefList[LIST_0];
23702370 PPicture* ppRefPicL1 = pCtx->sRefPic.pRefList[LIST_1];
23712371 intX_t iUsedBits;
2372− const int32_t iMbXy = pCurLayer->iMbXyIndex;
2373− int8_t* pNzc = pCurLayer->pNzc[iMbXy];
2372+ const int32_t iMbXy = pCurDqLayer->iMbXyIndex;
2373+ int8_t* pNzc = pCurDqLayer->pNzc[iMbXy];
23742374 int32_t iBaseModeFlag, i;
23752375 int32_t iRet = 0; //should have the return value to indicate decoding error or not, It's NECESSARY--2010.4.15
23762376 uint32_t uiCode;
23772377
2378− pCurLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
2379− pCurLayer->pTransformSize8x8Flag[iMbXy] = false;
2378+ pCurDqLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
2379+ pCurDqLayer->pTransformSize8x8Flag[iMbXy] = false;
23802380
23812381 if (-1 == pSlice->iMbSkipRun) {
23822382 WELS_READ_VERIFY (BsGetUe (pBs, &uiCode)); //mb_skip_run
@@ -2389,7 +2389,7 @@ int32_t WelsDecodeMbCavlcBSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 6 unmodified lines
23892389 int16_t iMv[LIST_A][2] = { { 0, 0 }, { 0, 0 } };
23902390 int8_t ref[LIST_A] = { 0 };
23912391
2392− pCurLayer->pMbType[iMbXy] = MB_TYPE_SKIP | MB_TYPE_DIRECT;
2392+ pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_SKIP | MB_TYPE_DIRECT;
23932393 ST32A4 (&pNzc[0], 0);
23942394 ST32A4 (&pNzc[4], 0);
23952395 ST32A4 (&pNzc[8], 0);
@@ -2397,9 +2397,9 @@ int32_t WelsDecodeMbCavlcBSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 1 unmodified line
23972397 ST32A4 (&pNzc[16], 0);
23982398 ST32A4 (&pNzc[20], 0);
23992399
2400− pCurLayer->pInterPredictionDoneFlag[iMbXy] = 0;
2401− memset (pCurLayer->pRefIndex[LIST_0][iMbXy], 0, sizeof (int8_t) * 16);
2402− memset (pCurLayer->pRefIndex[LIST_1][iMbXy], 0, sizeof (int8_t) * 16);
2400+ pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0;
2401+ memset (pCurDqLayer->pDec->pRefIndex[LIST_0][iMbXy], 0, sizeof (int8_t) * 16);
2402+ memset (pCurDqLayer->pDec->pRefIndex[LIST_1][iMbXy], 0, sizeof (int8_t) * 16);
24032403 pCtx->bMbRefConcealed = pCtx->bRPLRError || pCtx->bMbRefConcealed || ! (ppRefPicL0[0] && ppRefPicL0[0]->bIsComplete)
24042404 || ! (ppRefPicL1[0] && ppRefPicL1[0]->bIsComplete);
24052405
@@ -2426,20 +2426,20 @@ int32_t WelsDecodeMbCavlcBSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 20 unmodified lines
24262426 }
24272427
24282428 //if (!pSlice->sSliceHeaderExt.bDefaultResidualPredFlag) {
2429− // memset (pCurLayer->pScaledTCoeff[iMbXy], 0, 384 * sizeof (int16_t));
2429+ // memset (pCurDqLayer->pScaledTCoeff[iMbXy], 0, 384 * sizeof (int16_t));
24302430 //}
24312431
24322432 //reset rS
24332433 if (!pSlice->sSliceHeaderExt.bDefaultResidualPredFlag ||
24342434 (pNalCur->sNalHeaderExt.uiQualityId == 0 && pNalCur->sNalHeaderExt.uiDependencyId == 0)) {
2435− pCurLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp;
2435+ pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp;
24362436 for (i = 0; i < 2; i++) {
2437− pCurLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurLayer->pLumaQp[iMbXy] +
2437+ pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] +
24382438 pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)];
24392439 }
24402440 }
24412441
2442− pCurLayer->pCbp[iMbXy] = 0;
2442+ pCurDqLayer->pCbp[iMbXy] = 0;
24432443 } else {
24442444 if (pSlice->sSliceHeaderExt.bAdaptiveBaseModeFlag == 1) {
24452445 WELS_READ_VERIFY (BsGetOneBit (pBs, &uiCode)); //base_mode_flag
@@ -2461,7 +2461,7 @@ int32_t WelsDecodeMbCavlcBSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 15 unmodified lines
24612461 // check whether there is left bits to read next time in case multiple slices
24622462 iUsedBits = ((pBs->pCurBuf - pBs->pStartBuf) << 3) - (16 - pBs->iLeftBits);
24632463 // sub 1, for stop bit
2464− if ((iUsedBits == (pBs->iBits - 1)) && (0 >= pCurLayer->sLayerInfo.sSliceInLayer.iMbSkipRun)) { // slice boundary
2464+ if ((iUsedBits == (pBs->iBits - 1)) && (0 >= pCurDqLayer->sLayerInfo.sSliceInLayer.iMbSkipRun)) { // slice boundary
24652465 uiEosFlag = 1;
24662466 }
24672467 if (iUsedBits > (pBs->iBits -
@@ -2475,20 +2475,20 @@ int32_t WelsDecodeMbCavlcBSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 7 unmodified lines
24752475 }
24762476
24772477 int32_t WelsActualDecodeMbCavlcBSlice (PWelsDecoderContext pCtx) {
2478− SVlcTable* pVlcTable = &pCtx->sVlcTable;
2479− PDqLayer pCurLayer = pCtx->pCurDqLayer;
2480− PBitStringAux pBs = pCurLayer->pBitStringAux;
2481− PSlice pSlice = &pCurLayer->sLayerInfo.sSliceInLayer;
2478+ SVlcTable* pVlcTable = pCtx->pVlcTable;
2479+ PDqLayer pCurDqLayer = pCtx->pCurDqLayer;
2480+ PBitStringAux pBs = pCurDqLayer->pBitStringAux;
2481+ PSlice pSlice = &pCurDqLayer->sLayerInfo.sSliceInLayer;
24822482 PSliceHeader pSliceHeader = &pSlice->sSliceHeaderExt.sSliceHeader;
24832483
24842484 int32_t iScanIdxStart = pSlice->sSliceHeaderExt.uiScanIdxStart;
24852485 int32_t iScanIdxEnd = pSlice->sSliceHeaderExt.uiScanIdxEnd;
24862486
24872487 SWelsNeighAvail sNeighAvail;
2488− int32_t iMbX = pCurLayer->iMbX;
2489− int32_t iMbY = pCurLayer->iMbY;
2490− const int32_t iMbXy = pCurLayer->iMbXyIndex;
2491− int8_t* pNzc = pCurLayer->pNzc[iMbXy];
2488+ int32_t iMbX = pCurDqLayer->iMbX;
2489+ int32_t iMbY = pCurDqLayer->iMbY;
2490+ const int32_t iMbXy = pCurDqLayer->iMbXyIndex;
2491+ int8_t* pNzc = pCurDqLayer->pNzc[iMbXy];
24922492 int32_t i;
24932493 int32_t iRet = ERR_NONE;
24942494 uint32_t uiMbType = 0, uiCbp = 0, uiCbpL = 0, uiCbpC = 0;
@@ -2496,16 +2496,16 @@ int32_t WelsActualDecodeMbCavlcBSlice (PWelsDecoderContext pCtx) { · 1 unmodified line
24962496 int32_t iCode;
24972497 int32_t iMbResProperty;
24982498
2499− GetNeighborAvailMbType (&sNeighAvail, pCurLayer);
2499+ GetNeighborAvailMbType (&sNeighAvail, pCurDqLayer);
25002500 ENFORCE_STACK_ALIGN_1D (uint8_t, pNonZeroCount, 48, 16);
2501− pCurLayer->pInterPredictionDoneFlag[iMbXy] = 0;//2009.10.23
2501+ pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0;//2009.10.23
25022502 WELS_READ_VERIFY (BsGetUe (pBs, &uiCode)); //uiMbType
25032503 uiMbType = uiCode;
25042504 if (uiMbType < 23) { //inter MB type
25052505 int16_t iMotionVector[LIST_A][30][MV_A];
25062506 int8_t iRefIndex[LIST_A][30];
2507− pCurLayer->pMbType[iMbXy] = g_ksInterBMbTypeInfo[uiMbType].iType;
2508− WelsFillCacheInter (&sNeighAvail, pNonZeroCount, iMotionVector, iRefIndex, pCurLayer);
2507+ pCurDqLayer->pDec->pMbType[iMbXy] = g_ksInterBMbTypeInfo[uiMbType].iType;
2508+ WelsFillCacheInter (&sNeighAvail, pNonZeroCount, iMotionVector, iRefIndex, pCurDqLayer);
25092509
25102510 if ((iRet = ParseInterBInfo (pCtx, iMotionVector, iRefIndex, pBs)) != ERR_NONE) {
25112511 return iRet;//abnormal
@@ -2513,13 +2513,13 @@ int32_t WelsActualDecodeMbCavlcBSlice (PWelsDecoderContext pCtx) { · 1 unmodified line
25132513
25142514 if (pSlice->sSliceHeaderExt.bAdaptiveResidualPredFlag == 1) {
25152515 WELS_READ_VERIFY (BsGetOneBit (pBs, &uiCode)); //residual_prediction_flag
2516− pCurLayer->pResidualPredFlag[iMbXy] = uiCode;
2516+ pCurDqLayer->pResidualPredFlag[iMbXy] = uiCode;
25172517 } else {
2518− pCurLayer->pResidualPredFlag[iMbXy] = pSlice->sSliceHeaderExt.bDefaultResidualPredFlag;
2518+ pCurDqLayer->pResidualPredFlag[iMbXy] = pSlice->sSliceHeaderExt.bDefaultResidualPredFlag;
25192519 }
25202520
2521− if (pCurLayer->pResidualPredFlag[iMbXy] == 0) {
2522− pCurLayer->pInterPredictionDoneFlag[iMbXy] = 0;
2521+ if (pCurDqLayer->pResidualPredFlag[iMbXy] == 0) {
2522+ pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0;
25232523 } else {
25242524 WelsLog (& (pCtx->sLogCtx), WELS_LOG_WARNING, "residual_pred_flag = 1 not supported.");
25252525 return GENERATE_ERROR_NO (ERR_LEVEL_MB_DATA, ERR_INFO_UNSUPPORTED_ILP);
@@ -2533,15 +2533,15 @@ int32_t WelsActualDecodeMbCavlcBSlice (PWelsDecoderContext pCtx) { · 7 unmodified lines
25332533
25342534 if (25 == uiMbType) {
25352535 WelsLog (& (pCtx->sLogCtx), WELS_LOG_DEBUG, "I_PCM mode exists in B slice!");
2536− int32_t iDecStrideL = pCurLayer->pDec->iLinesize[0];
2537− int32_t iDecStrideC = pCurLayer->pDec->iLinesize[1];
2536+ int32_t iDecStrideL = pCurDqLayer->pDec->iLinesize[0];
2537+ int32_t iDecStrideC = pCurDqLayer->pDec->iLinesize[1];
25382538
25392539 int32_t iOffsetL = (iMbX + iMbY * iDecStrideL) << 4;
25402540 int32_t iOffsetC = (iMbX + iMbY * iDecStrideC) << 3;
25412541
2542− uint8_t* pDecY = pCurLayer->pDec->pData[0] + iOffsetL;
2543− uint8_t* pDecU = pCurLayer->pDec->pData[1] + iOffsetC;
2544− uint8_t* pDecV = pCurLayer->pDec->pData[2] + iOffsetC;
2542+ uint8_t* pDecY = pCurDqLayer->pDec->pData[0] + iOffsetL;
2543+ uint8_t* pDecU = pCurDqLayer->pDec->pData[1] + iOffsetC;
2544+ uint8_t* pDecV = pCurDqLayer->pDec->pData[2] + iOffsetC;
25452545
25462546 uint8_t* pTmpBsBuf;
25472547
@@ -2551,7 +2551,7 @@ int32_t WelsActualDecodeMbCavlcBSlice (PWelsDecoderContext pCtx) { · 3 unmodified lines
25512551
25522552 int32_t iIndex = ((-pBs->iLeftBits) >> 3) + 2;
25532553
2554− pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA_PCM;
2554+ pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA_PCM;
25552555
25562556 //step 1: locating bit-stream pointer [must align into integer byte]
25572557 pBs->pCurBuf -= iIndex;
@@ -2580,8 +2580,8 @@ int32_t WelsActualDecodeMbCavlcBSlice (PWelsDecoderContext pCtx) { · 22 unmodified lines
25802580 pBs->pCurBuf += 384;
25812581
25822582 //step 3: update QP and pNonZeroCount
2583− pCurLayer->pLumaQp[iMbXy] = 0;
2584− pCurLayer->pChromaQp[iMbXy][0] = pCurLayer->pChromaQp[iMbXy][1] = 0;
2583+ pCurDqLayer->pLumaQp[iMbXy] = 0;
2584+ pCurDqLayer->pChromaQp[iMbXy][0] = pCurDqLayer->pChromaQp[iMbXy][1] = 0;
25852585 //Rec. 9.2.1 for PCM, nzc=16
25862586 ST32A4 (&pNzc[0], 0x10101010);
25872587 ST32A4 (&pNzc[4], 0x10101010);
@@ -2594,38 +2594,38 @@ int32_t WelsActualDecodeMbCavlcBSlice (PWelsDecoderContext pCtx) { · 6 unmodified lines
25942594 } else {
25952595 if (0 == uiMbType) {
25962596 ENFORCE_STACK_ALIGN_1D (int8_t, pIntraPredMode, 48, 16);
2597− pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA4x4;
2597+ pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA4x4;
25982598 if (pCtx->pPps->bTransform8x8ModeFlag) {
25992599 WELS_READ_VERIFY (BsGetOneBit (pBs, &uiCode)); //transform_size_8x8_flag
2600− pCurLayer->pTransformSize8x8Flag[iMbXy] = !!uiCode;
2601− if (pCurLayer->pTransformSize8x8Flag[iMbXy]) {
2602− uiMbType = pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA8x8;
2600+ pCurDqLayer->pTransformSize8x8Flag[iMbXy] = !!uiCode;
2601+ if (pCurDqLayer->pTransformSize8x8Flag[iMbXy]) {
2602+ uiMbType = pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA8x8;
26032603 }
26042604 }
2605− if (!pCurLayer->pTransformSize8x8Flag[iMbXy]) {
2606− pCtx->pFillInfoCacheIntraNxNFunc (&sNeighAvail, pNonZeroCount, pIntraPredMode, pCurLayer);
2607− WELS_READ_VERIFY (ParseIntra4x4Mode (pCtx, &sNeighAvail, pIntraPredMode, pBs, pCurLayer));
2605+ if (!pCurDqLayer->pTransformSize8x8Flag[iMbXy]) {
2606+ pCtx->pFillInfoCacheIntraNxNFunc (&sNeighAvail, pNonZeroCount, pIntraPredMode, pCurDqLayer);
2607+ WELS_READ_VERIFY (ParseIntra4x4Mode (pCtx, &sNeighAvail, pIntraPredMode, pBs, pCurDqLayer));
26082608 } else {
2609− pCtx->pFillInfoCacheIntraNxNFunc (&sNeighAvail, pNonZeroCount, pIntraPredMode, pCurLayer);
2610− WELS_READ_VERIFY (ParseIntra8x8Mode (pCtx, &sNeighAvail, pIntraPredMode, pBs, pCurLayer));
2609+ pCtx->pFillInfoCacheIntraNxNFunc (&sNeighAvail, pNonZeroCount, pIntraPredMode, pCurDqLayer);
2610+ WELS_READ_VERIFY (ParseIntra8x8Mode (pCtx, &sNeighAvail, pIntraPredMode, pBs, pCurDqLayer));
26112611 }
26122612 } else { //I_PCM exclude, we can ignore it
2613− pCurLayer->pMbType[iMbXy] = MB_TYPE_INTRA16x16;
2614− pCurLayer->pTransformSize8x8Flag[iMbXy] = false;
2615− pCurLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
2616− pCurLayer->pIntraPredMode[iMbXy][7] = (uiMbType - 1) & 3;
2617− pCurLayer->pCbp[iMbXy] = g_kuiI16CbpTable[ (uiMbType - 1) >> 2];
2618− uiCbpC = pCtx->pSps->uiChromaFormatIdc ? pCurLayer->pCbp[iMbXy] >> 4 : 0;
2619− uiCbpL = pCurLayer->pCbp[iMbXy] & 15;
2620− WelsFillCacheNonZeroCount (&sNeighAvail, pNonZeroCount, pCurLayer);
2621− if ((iRet = ParseIntra16x16Mode (pCtx, &sNeighAvail, pBs, pCurLayer)) != ERR_NONE) {
2613+ pCurDqLayer->pDec->pMbType[iMbXy] = MB_TYPE_INTRA16x16;
2614+ pCurDqLayer->pTransformSize8x8Flag[iMbXy] = false;
2615+ pCurDqLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy] = true;
2616+ pCurDqLayer->pIntraPredMode[iMbXy][7] = (uiMbType - 1) & 3;
2617+ pCurDqLayer->pCbp[iMbXy] = g_kuiI16CbpTable[ (uiMbType - 1) >> 2];
2618+ uiCbpC = pCtx->pSps->uiChromaFormatIdc ? pCurDqLayer->pCbp[iMbXy] >> 4 : 0;
2619+ uiCbpL = pCurDqLayer->pCbp[iMbXy] & 15;
2620+ WelsFillCacheNonZeroCount (&sNeighAvail, pNonZeroCount, pCurDqLayer);
2621+ if ((iRet = ParseIntra16x16Mode (pCtx, &sNeighAvail, pBs, pCurDqLayer)) != ERR_NONE) {
26222622 return iRet;
26232623 }
26242624 }
26252625 }
26262626 }
26272627
2628− if (MB_TYPE_INTRA16x16 != pCurLayer->pMbType[iMbXy]) {
2628+ if (MB_TYPE_INTRA16x16 != pCurDqLayer->pDec->pMbType[iMbXy]) {
26292629 WELS_READ_VERIFY (BsGetUe (pBs, &uiCode)); //coded_block_pattern
26302630 uiCbp = uiCode;
26312631 {
@@ -2633,29 +2633,29 @@ int32_t WelsActualDecodeMbCavlcBSlice (PWelsDecoderContext pCtx) { · 1 unmodified line
26332633 return GENERATE_ERROR_NO (ERR_LEVEL_MB_DATA, ERR_INFO_INVALID_CBP);
26342634 if (!pCtx->pSps->uiChromaFormatIdc && (uiCbp > 15))
26352635 return GENERATE_ERROR_NO (ERR_LEVEL_MB_DATA, ERR_INFO_INVALID_CBP);
2636− if (MB_TYPE_INTRA4x4 == pCurLayer->pMbType[iMbXy] || MB_TYPE_INTRA8x8 == pCurLayer->pMbType[iMbXy]) {
2636+ if (MB_TYPE_INTRA4x4 == pCurDqLayer->pDec->pMbType[iMbXy] || MB_TYPE_INTRA8x8 == pCurDqLayer->pDec->pMbType[iMbXy]) {
26372637
26382638 uiCbp = pCtx->pSps->uiChromaFormatIdc ? g_kuiIntra4x4CbpTable[uiCbp] : g_kuiIntra4x4CbpTable400[uiCbp];
26392639 } else //inter
26402640 uiCbp = pCtx->pSps->uiChromaFormatIdc ? g_kuiInterCbpTable[uiCbp] : g_kuiInterCbpTable400[uiCbp];
26412641 }
26422642
2643− pCurLayer->pCbp[iMbXy] = uiCbp;
2644− uiCbpC = pCurLayer->pCbp[iMbXy] >> 4;
2645− uiCbpL = pCurLayer->pCbp[iMbXy] & 15;
2643+ pCurDqLayer->pCbp[iMbXy] = uiCbp;
2644+ uiCbpC = pCurDqLayer->pCbp[iMbXy] >> 4;
2645+ uiCbpL = pCurDqLayer->pCbp[iMbXy] & 15;
26462646
26472647 // Need modification when B picutre add in
26482648 bool bNeedParseTransformSize8x8Flag =
2649− (((pCurLayer->pMbType[iMbXy] >= MB_TYPE_16x16 && pCurLayer->pMbType[iMbXy] <= MB_TYPE_8x16)
2650− || pCurLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy])
2651− && (pCurLayer->pMbType[iMbXy] != MB_TYPE_INTRA8x8)
2652− && (pCurLayer->pMbType[iMbXy] != MB_TYPE_INTRA4x4)
2649+ (((pCurDqLayer->pDec->pMbType[iMbXy] >= MB_TYPE_16x16 && pCurDqLayer->pDec->pMbType[iMbXy] <= MB_TYPE_8x16)
2650+ || pCurDqLayer->pNoSubMbPartSizeLessThan8x8Flag[iMbXy])
2651+ && (pCurDqLayer->pDec->pMbType[iMbXy] != MB_TYPE_INTRA8x8)
2652+ && (pCurDqLayer->pDec->pMbType[iMbXy] != MB_TYPE_INTRA4x4)
26532653 && (uiCbpL > 0)
26542654 && (pCtx->pPps->bTransform8x8ModeFlag));
26552655
26562656 if (bNeedParseTransformSize8x8Flag) {
26572657 WELS_READ_VERIFY (BsGetOneBit (pBs, &uiCode)); //transform_size_8x8_flag
2658− pCurLayer->pTransformSize8x8Flag[iMbXy] = !!uiCode;
2658+ pCurDqLayer->pTransformSize8x8Flag[iMbXy] = !!uiCode;
26592659 }
26602660 }
26612661
@@ -2665,17 +2665,17 @@ int32_t WelsActualDecodeMbCavlcBSlice (PWelsDecoderContext pCtx) { · 3 unmodified lines
26652665 ST32A4 (&pNzc[12], 0);
26662666 ST32A4 (&pNzc[16], 0);
26672667 ST32A4 (&pNzc[20], 0);
2668− if (pCurLayer->pCbp[iMbXy] == 0 && !IS_INTRA16x16 (pCurLayer->pMbType[iMbXy]) && !IS_I_BL (pCurLayer->pMbType[iMbXy])) {
2669− pCurLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp;
2668+ if (pCurDqLayer->pCbp[iMbXy] == 0 && !IS_INTRA16x16 (pCurDqLayer->pDec->pMbType[iMbXy]) && !IS_I_BL (pCurDqLayer->pDec->pMbType[iMbXy])) {
2669+ pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp;
26702670 for (i = 0; i < 2; i++) {
2671− pCurLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurLayer->pLumaQp[iMbXy] +
2671+ pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] +
26722672 pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)];
26732673 }
26742674 }
26752675
2676− if (pCurLayer->pCbp[iMbXy] || MB_TYPE_INTRA16x16 == pCurLayer->pMbType[iMbXy]) {
2676+ if (pCurDqLayer->pCbp[iMbXy] || MB_TYPE_INTRA16x16 == pCurDqLayer->pDec->pMbType[iMbXy]) {
26772677 int32_t iQpDelta, iId8x8, iId4x4;
2678− memset (pCurLayer->pScaledTCoeff[iMbXy], 0, MB_COEFF_LIST_SIZE * sizeof (int16_t));
2678+ memset (pCurDqLayer->pScaledTCoeff[iMbXy], 0, MB_COEFF_LIST_SIZE * sizeof (int16_t));
26792679 WELS_READ_VERIFY (BsGetSe (pBs, &iCode)); //mb_qp_delta
26802680 iQpDelta = iCode;
26812681
@@ -2683,28 +2683,28 @@ int32_t WelsActualDecodeMbCavlcBSlice (PWelsDecoderContext pCtx) { · 1 unmodified line
26832683 return GENERATE_ERROR_NO (ERR_LEVEL_MB_DATA, ERR_INFO_INVALID_QP);
26842684 }
26852685
2686− pCurLayer->pLumaQp[iMbXy] = (pSlice->iLastMbQp + iQpDelta + 52) % 52; //update last_mb_qp
2687− pSlice->iLastMbQp = pCurLayer->pLumaQp[iMbXy];
2686+ pCurDqLayer->pLumaQp[iMbXy] = (pSlice->iLastMbQp + iQpDelta + 52) % 52; //update last_mb_qp
2687+ pSlice->iLastMbQp = pCurDqLayer->pLumaQp[iMbXy];
26882688 for (i = 0; i < 2; i++) {
2689− pCurLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp +
2689+ pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp +
26902690 pSliceHeader->pPps->iChromaQpIndexOffset[i], 0,
26912691 51)];
26922692 }
26932693
26942694 BsStartCavlc (pBs);
26952695
2696− if (MB_TYPE_INTRA16x16 == pCurLayer->pMbType[iMbXy]) {
2696+ if (MB_TYPE_INTRA16x16 == pCurDqLayer->pDec->pMbType[iMbXy]) {
26972697 //step1: Luma DC
26982698 if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, 0, 16, g_kuiLumaDcZigzagScan, I16_LUMA_DC,
2699− pCurLayer->pScaledTCoeff[iMbXy], pCurLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
2699+ pCurDqLayer->pScaledTCoeff[iMbXy], pCurDqLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
27002700 return iRet;//abnormal
27012701 }
27022702 //step2: Luma AC
27032703 if (uiCbpL) {
27042704 for (i = 0; i < 16; i++) {
27052705 if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, i, iScanIdxEnd - WELS_MAX (iScanIdxStart, 1) + 1,
2706− g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), I16_LUMA_AC, pCurLayer->pScaledTCoeff[iMbXy] + (i << 4),
2707− pCurLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
2706+ g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), I16_LUMA_AC, pCurDqLayer->pScaledTCoeff[iMbXy] + (i << 4),
2707+ pCurDqLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
27082708 return iRet;//abnormal
27092709 }
27102710 }
@@ -2714,15 +2714,15 @@ int32_t WelsActualDecodeMbCavlcBSlice (PWelsDecoderContext pCtx) { · 3 unmodified lines
27142714 ST32A4 (&pNzc[12], LD32 (&pNonZeroCount[1 + 8 * 4]));
27152715 }
27162716 } else { //non-MB_TYPE_INTRA16x16
2717− if (pCurLayer->pTransformSize8x8Flag[iMbXy]) {
2717+ if (pCurDqLayer->pTransformSize8x8Flag[iMbXy]) {
27182718 for (iId8x8 = 0; iId8x8 < 4; iId8x8++) {
2719− iMbResProperty = (IS_INTRA (pCurLayer->pMbType[iMbXy])) ? LUMA_DC_AC_INTRA_8 : LUMA_DC_AC_INTER_8;
2719+ iMbResProperty = (IS_INTRA (pCurDqLayer->pDec->pMbType[iMbXy])) ? LUMA_DC_AC_INTRA_8 : LUMA_DC_AC_INTER_8;
27202720 if (uiCbpL & (1 << iId8x8)) {
27212721 int32_t iIndex = (iId8x8 << 2);
27222722 for (iId4x4 = 0; iId4x4 < 4; iId4x4++) {
27232723 if ((iRet = WelsResidualBlockCavlc8x8 (pVlcTable, pNonZeroCount, pBs, iIndex, iScanIdxEnd - iScanIdxStart + 1,
2724− g_kuiZigzagScan8x8 + iScanIdxStart, iMbResProperty, pCurLayer->pScaledTCoeff[iMbXy] + (iId8x8 << 6), iId4x4,
2725− pCurLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
2724+ g_kuiZigzagScan8x8 + iScanIdxStart, iMbResProperty, pCurDqLayer->pScaledTCoeff[iMbXy] + (iId8x8 << 6), iId4x4,
2725+ pCurDqLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
27262726 return iRet;
27272727 }
27282728 iIndex++;
@@ -2738,14 +2738,14 @@ int32_t WelsActualDecodeMbCavlcBSlice (PWelsDecoderContext pCtx) { · 9 unmodified lines
27382738 ST32A4 (&pNzc[12], LD32 (&pNonZeroCount[1 + 8 * 4]));
27392739 } else { // Normal T4x4
27402740 for (iId8x8 = 0; iId8x8 < 4; iId8x8++) {
2741− iMbResProperty = (IS_INTRA (pCurLayer->pMbType[iMbXy])) ? LUMA_DC_AC_INTRA : LUMA_DC_AC_INTER;
2741+ iMbResProperty = (IS_INTRA (pCurDqLayer->pDec->pMbType[iMbXy])) ? LUMA_DC_AC_INTRA : LUMA_DC_AC_INTER;
27422742 if (uiCbpL & (1 << iId8x8)) {
27432743 int32_t iIndex = (iId8x8 << 2);
27442744 for (iId4x4 = 0; iId4x4 < 4; iId4x4++) {
27452745 //Luma (DC and AC decoding together)
27462746 if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, iIndex, iScanIdxEnd - iScanIdxStart + 1,
2747− g_kuiZigzagScan + iScanIdxStart, iMbResProperty, pCurLayer->pScaledTCoeff[iMbXy] + (iIndex << 4),
2748− pCurLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
2747+ g_kuiZigzagScan + iScanIdxStart, iMbResProperty, pCurDqLayer->pScaledTCoeff[iMbXy] + (iIndex << 4),
2748+ pCurDqLayer->pLumaQp[iMbXy], pCtx)) != ERR_NONE) {
27492749 return iRet;//abnormal
27502750 }
27512751 iIndex++;
@@ -2767,13 +2767,13 @@ int32_t WelsActualDecodeMbCavlcBSlice (PWelsDecoderContext pCtx) { · 15 unmodified lines
27672767 //step1: DC
27682768 if (1 == uiCbpC || 2 == uiCbpC) {
27692769 for (i = 0; i < 2; i++) { //Cb Cr
2770− if (IS_INTRA (pCurLayer->pMbType[iMbXy]))
2770+ if (IS_INTRA (pCurDqLayer->pDec->pMbType[iMbXy]))
27712771 iMbResProperty = i ? CHROMA_DC_V : CHROMA_DC_U;
27722772 else
27732773 iMbResProperty = i ? CHROMA_DC_V_INTER : CHROMA_DC_U_INTER;
27742774
27752775 if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, 16 + (i << 2), 4, g_kuiChromaDcScan, iMbResProperty,
2776− pCurLayer->pScaledTCoeff[iMbXy] + 256 + (i << 6), pCurLayer->pChromaQp[iMbXy][i], pCtx)) != ERR_NONE) {
2776+ pCurDqLayer->pScaledTCoeff[iMbXy] + 256 + (i << 6), pCurDqLayer->pChromaQp[iMbXy][i], pCtx)) != ERR_NONE) {
27772777 return iRet;//abnormal
27782778 }
27792779 }
@@ -2782,7 +2782,7 @@ int32_t WelsActualDecodeMbCavlcBSlice (PWelsDecoderContext pCtx) { · 2 unmodified lines
27822782 //step2: AC
27832783 if (2 == uiCbpC) {
27842784 for (i = 0; i < 2; i++) { //Cb Cr
2785− if (IS_INTRA (pCurLayer->pMbType[iMbXy]))
2785+ if (IS_INTRA (pCurDqLayer->pDec->pMbType[iMbXy]))
27862786 iMbResProperty = i ? CHROMA_AC_V : CHROMA_AC_U;
27872787 else
27882788 iMbResProperty = i ? CHROMA_AC_V_INTER : CHROMA_AC_U_INTER;
@@ -2790,8 +2790,8 @@ int32_t WelsActualDecodeMbCavlcBSlice (PWelsDecoderContext pCtx) { · 1 unmodified line
27902790 int32_t iIndex = 16 + (i << 2);
27912791 for (iId4x4 = 0; iId4x4 < 4; iId4x4++) {
27922792 if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, iIndex, iScanIdxEnd - WELS_MAX (iScanIdxStart,
2793− 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), iMbResProperty, pCurLayer->pScaledTCoeff[iMbXy] + (iIndex << 4),
2794− pCurLayer->pChromaQp[iMbXy][i], pCtx)) != ERR_NONE) {
2793+ 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), iMbResProperty, pCurDqLayer->pScaledTCoeff[iMbXy] + (iIndex << 4),
2794+ pCurDqLayer->pChromaQp[iMbXy][i], pCtx)) != ERR_NONE) {
27952795 return iRet;//abnormal
27962796 }
27972797 iIndex++;
@@ -2860,8 +2860,8 @@ void WelsBlockZero8x8_c (int16_t* pBlock, int32_t iStride) { · 62 unmodified lines
28602860 // to all direct MBs in this slice, as per clause 8.4.1.2.3
28612861 // of T-REC H.264 201704
28622862 bool ComputeColocatedTemporalScaling (PWelsDecoderContext pCtx) {
2863− PDqLayer pCurLayer = pCtx->pCurDqLayer;
2864− PSlice pCurSlice = &pCurLayer->sLayerInfo.sSliceInLayer;
2863+ PDqLayer pCurDqLayer = pCtx->pCurDqLayer;
2864+ PSlice pCurSlice = &pCurDqLayer->sLayerInfo.sSliceInLayer;
28652865 PSliceHeader pSliceHeader = &pCurSlice->sSliceHeaderExt.sSliceHeader;
28662866 if (!pSliceHeader->iDirectSpatialMvPredFlag) {
28672867 uint32_t uiRefCount = pSliceHeader->uiRefCount[LIST_0];

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