void DeblockingBSCalc_c (SWelsFuncPtrList* pFunc, SMB* pCurMb, uint8_t uiBS[2][4][4], Mb_Type uiCurMbType, int32_t iMbStride, int32_t iLeftFlag, int32_t iTopFlag) { if (iLeftFlag) { * (uint32_t*)uiBS[0][0] = IS_INTRA ((pCurMb - 1)->uiMbType) ? 0x04040404 : DeblockingBSMarginalMBAvcbase (pCurMb, pCurMb - 1, 0); } else { * (uint32_t*)uiBS[0][0] = 0; } if (iTopFlag) { * (uint32_t*)uiBS[1][0] = IS_INTRA ((pCurMb - iMbStride)->uiMbType) ? 0x04040404 : DeblockingBSMarginalMBAvcbase ( pCurMb, (pCurMb - iMbStride), 1); } else { * (uint32_t*)uiBS[1][0] = 0; } //SKIP MB_16x16 or others if (uiCurMbType != MB_TYPE_SKIP) { pFunc->pfSetNZCZero (pCurMb->pNonZeroCount); // set all none-zero nzc to 1; dbk can be opti! if (uiCurMbType == MB_TYPE_16x16) { DeblockingBSInsideMBAvsbase (pCurMb->pNonZeroCount, uiBS, 1); } else { DeblockingBSInsideMBNormal (pCurMb, uiBS, pCurMb->pNonZeroCount); } } else { * (uint32_t*)uiBS[0][1] = * (uint32_t*)uiBS[0][2] = * (uint32_t*)uiBS[0][3] = * (uint32_t*)uiBS[1][1] = * (uint32_t*)uiBS[1][2] = * (uint32_t*)uiBS[1][3] = 0; } }
void DeblockingMbAvcbase (SWelsFuncPtrList* pFunc, SMB* pCurMb, SDeblockingFilter* pFilter) { uint8_t uiBS[2][4][4] = { 0 }; Mb_Type uiCurMbType = pCurMb->uiMbType; int32_t iMbStride = pFilter->iMbStride; int32_t iMbX = pCurMb->iMbX; int32_t iMbY = pCurMb->iMbY; bool bLeftBsValid[2] = { (iMbX > 0), ((iMbX > 0) && (pCurMb->uiSliceIdc == (pCurMb - 1)->uiSliceIdc))}; bool bTopBsValid[2] = { (iMbY > 0), ((iMbY > 0) && (pCurMb->uiSliceIdc == (pCurMb - iMbStride)->uiSliceIdc))}; int32_t iLeftFlag = bLeftBsValid[pFilter->uiFilterIdc]; int32_t iTopFlag = bTopBsValid[pFilter->uiFilterIdc]; switch (uiCurMbType) { case MB_TYPE_INTRA4x4: case MB_TYPE_INTRA16x16: case MB_TYPE_INTRA_PCM: DeblockingIntraMb (&pFunc->pfDeblocking, pCurMb, pFilter); break; default: if (iLeftFlag) { * (uint32_t*)uiBS[0][0] = IS_INTRA ((pCurMb - 1)->uiMbType) ? 0x04040404 : DeblockingBSMarginalMBAvcbase (pCurMb, pCurMb - 1, 0); } else { * (uint32_t*)uiBS[0][0] = 0; } if (iTopFlag) { * (uint32_t*)uiBS[1][0] = IS_INTRA ((pCurMb - iMbStride)->uiMbType) ? 0x04040404 : DeblockingBSMarginalMBAvcbase ( pCurMb, (pCurMb - iMbStride), 1); } else { * (uint32_t*)uiBS[1][0] = 0; } //SKIP MB_16x16 or others if (uiCurMbType != MB_TYPE_SKIP) { pFunc->pfSetNZCZero (pCurMb->pNonZeroCount); // set all none-zero nzc to 1; dbk can be opti! if (uiCurMbType == MB_TYPE_16x16) { DeblockingBSInsideMBAvsbase (pCurMb->pNonZeroCount, uiBS, 1); } else { DeblockingBSInsideMBNormal (pCurMb, uiBS, pCurMb->pNonZeroCount); } } else { * (uint32_t*)uiBS[0][1] = * (uint32_t*)uiBS[0][2] = * (uint32_t*)uiBS[0][3] = * (uint32_t*)uiBS[1][1] = * (uint32_t*)uiBS[1][2] = * (uint32_t*)uiBS[1][3] = 0; } DeblockingInterMb (&pFunc->pfDeblocking, pCurMb, pFilter, uiBS); break; } }