void_t WelsFillCacheConstrain0Intra4x4(PNeighAvail pNeighAvail, uint8_t* pNonZeroCount, int8_t* pIntraPredMode, PDqLayer pCurLayer) //no matter slice type { int32_t iCurXy = pCurLayer->iMbXyIndex; int32_t iTopXy = 0; int32_t iLeftXy = 0; //stuff non_zero_coeff_count from pNeighAvail(left and top) WelsFillCacheNonZeroCount( pNeighAvail, pNonZeroCount, pCurLayer ); if ( pNeighAvail->iTopAvail ) { iTopXy = iCurXy - pCurLayer->iMbWidth; } if ( pNeighAvail->iLeftAvail ) { iLeftXy = iCurXy - 1; } //intra4x4_pred_mode if (pNeighAvail->iTopAvail && IS_INTRA4x4(pNeighAvail->iTopType)) //top { ST32(pIntraPredMode + 1, LD32(&pCurLayer->pIntraPredMode[iTopXy][0])); } else { int32_t iPred; if( pNeighAvail->iTopAvail ) iPred= 0x02020202; else iPred= 0xffffffff; ST32(pIntraPredMode + 1, iPred); } if (pNeighAvail->iLeftAvail && IS_INTRA4x4(pNeighAvail->iLeftType)) //left { pIntraPredMode[ 0 + 8 * 1] = pCurLayer->pIntraPredMode[iLeftXy][4]; pIntraPredMode[ 0 + 8 * 2] = pCurLayer->pIntraPredMode[iLeftXy][5]; pIntraPredMode[ 0 + 8 * 3] = pCurLayer->pIntraPredMode[iLeftXy][6]; pIntraPredMode[ 0 + 8 * 4] = pCurLayer->pIntraPredMode[iLeftXy][3]; } else { int8_t iPred; if( pNeighAvail->iLeftAvail ) iPred= 2; else iPred= -1; pIntraPredMode[ 0 + 8 * 1] = pIntraPredMode[ 0 + 8 * 2] = pIntraPredMode[ 0 + 8 * 3] = pIntraPredMode[ 0 + 8 * 4] = iPred; } }
void WelsFillCacheInter (PNeighAvail pNeighAvail, uint8_t* pNonZeroCount, int16_t iMvArray[LIST_A][30][MV_A], int8_t iRefIdxArray[LIST_A][30], PDqLayer pCurLayer) { int32_t iCurXy = pCurLayer->iMbXyIndex; int32_t iTopXy = 0; int32_t iLeftXy = 0; int32_t iLeftTopXy = 0; int32_t iRightTopXy = 0; //stuff non_zero_coeff_count from pNeighAvail(left and top) WelsFillCacheNonZeroCount (pNeighAvail, pNonZeroCount, pCurLayer); if (pNeighAvail->iTopAvail) { iTopXy = iCurXy - pCurLayer->iMbWidth; } if (pNeighAvail->iLeftAvail) { iLeftXy = iCurXy - 1; } if (pNeighAvail->iLeftTopAvail) { iLeftTopXy = iCurXy - 1 - pCurLayer->iMbWidth; } if (pNeighAvail->iRightTopAvail) { iRightTopXy = iCurXy + 1 - pCurLayer->iMbWidth; } //stuff mv_cache and iRefIdxArray from left and top (inter) if (pNeighAvail->iLeftAvail && IS_INTER (pNeighAvail->iLeftType)) { ST32 (iMvArray[0][ 6], LD32 (pCurLayer->pMv[0][iLeftXy][ 3])); ST32 (iMvArray[0][12], LD32 (pCurLayer->pMv[0][iLeftXy][ 7])); ST32 (iMvArray[0][18], LD32 (pCurLayer->pMv[0][iLeftXy][11])); ST32 (iMvArray[0][24], LD32 (pCurLayer->pMv[0][iLeftXy][15])); iRefIdxArray[0][ 6] = pCurLayer->pRefIndex[0][iLeftXy][ 3]; iRefIdxArray[0][12] = pCurLayer->pRefIndex[0][iLeftXy][ 7]; iRefIdxArray[0][18] = pCurLayer->pRefIndex[0][iLeftXy][11]; iRefIdxArray[0][24] = pCurLayer->pRefIndex[0][iLeftXy][15]; } else { ST32 (iMvArray[0][ 6], 0); ST32 (iMvArray[0][12], 0); ST32 (iMvArray[0][18], 0); ST32 (iMvArray[0][24], 0); if (0 == pNeighAvail->iLeftAvail) { //not available iRefIdxArray[0][ 6] = iRefIdxArray[0][12] = iRefIdxArray[0][18] = iRefIdxArray[0][24] = REF_NOT_AVAIL; } else { //available but is intra mb type iRefIdxArray[0][ 6] = iRefIdxArray[0][12] = iRefIdxArray[0][18] = iRefIdxArray[0][24] = REF_NOT_IN_LIST; } } if (pNeighAvail->iLeftTopAvail && IS_INTER (pNeighAvail->iLeftTopType)) { ST32 (iMvArray[0][0], LD32 (pCurLayer->pMv[0][iLeftTopXy][15])); iRefIdxArray[0][0] = pCurLayer->pRefIndex[0][iLeftTopXy][15]; } else { ST32 (iMvArray[0][0], 0); if (0 == pNeighAvail->iLeftTopAvail) { //not available iRefIdxArray[0][0] = REF_NOT_AVAIL; } else { //available but is intra mb type iRefIdxArray[0][0] = REF_NOT_IN_LIST; } } if (pNeighAvail->iTopAvail && IS_INTER (pNeighAvail->iTopType)) { ST64 (iMvArray[0][1], LD64 (pCurLayer->pMv[0][iTopXy][12])); ST64 (iMvArray[0][3], LD64 (pCurLayer->pMv[0][iTopXy][14])); ST32 (&iRefIdxArray[0][1], LD32 (&pCurLayer->pRefIndex[0][iTopXy][12])); } else { ST64 (iMvArray[0][1], 0); ST64 (iMvArray[0][3], 0); if (0 == pNeighAvail->iTopAvail) { //not available iRefIdxArray[0][1] = iRefIdxArray[0][2] = iRefIdxArray[0][3] = iRefIdxArray[0][4] = REF_NOT_AVAIL; } else { //available but is intra mb type iRefIdxArray[0][1] = iRefIdxArray[0][2] = iRefIdxArray[0][3] = iRefIdxArray[0][4] = REF_NOT_IN_LIST; } } if (pNeighAvail->iRightTopAvail && IS_INTER (pNeighAvail->iRightTopType)) { ST32 (iMvArray[0][5], LD32 (pCurLayer->pMv[0][iRightTopXy][12])); iRefIdxArray[0][5] = pCurLayer->pRefIndex[0][iRightTopXy][12]; } else { ST32 (iMvArray[0][5], 0); if (0 == pNeighAvail->iRightTopAvail) { //not available iRefIdxArray[0][5] = REF_NOT_AVAIL; } else { //available but is intra mb type iRefIdxArray[0][5] = REF_NOT_IN_LIST; } } //right-top 4*4 block unavailable ST32 (iMvArray[0][ 9], 0); ST32 (iMvArray[0][21], 0); ST32 (iMvArray[0][11], 0); ST32 (iMvArray[0][17], 0); ST32 (iMvArray[0][23], 0); iRefIdxArray[0][ 9] = iRefIdxArray[0][21] = iRefIdxArray[0][11] = iRefIdxArray[0][17] = iRefIdxArray[0][23] = REF_NOT_AVAIL; }