| 427 | } |
| 428 | |
| 429 | void WelsFillCacheInter (PWelsNeighAvail pNeighAvail, uint8_t* pNonZeroCount, |
| 430 | int16_t iMvArray[LIST_A][30][MV_A], int8_t iRefIdxArray[LIST_A][30], PDqLayer pCurDqLayer) { |
| 431 | int32_t iCurXy = pCurDqLayer->iMbXyIndex; |
| 432 | int32_t iTopXy = 0; |
| 433 | int32_t iLeftXy = 0; |
| 434 | int32_t iLeftTopXy = 0; |
| 435 | int32_t iRightTopXy = 0; |
| 436 | |
| 437 | PSlice pSlice = &pCurDqLayer->sLayerInfo.sSliceInLayer; |
| 438 | PSliceHeader pSliceHeader = &pSlice->sSliceHeaderExt.sSliceHeader; |
| 439 | int32_t listCount = 1; |
| 440 | if (pSliceHeader->eSliceType == B_SLICE) { |
| 441 | listCount = 2; |
| 442 | } |
| 443 | |
| 444 | //stuff non_zero_coeff_count from pNeighAvail(left and top) |
| 445 | WelsFillCacheNonZeroCount (pNeighAvail, pNonZeroCount, pCurDqLayer); |
| 446 | |
| 447 | if (pNeighAvail->iTopAvail) { |
| 448 | iTopXy = iCurXy - pCurDqLayer->iMbWidth; |
| 449 | } |
| 450 | if (pNeighAvail->iLeftAvail) { |
| 451 | iLeftXy = iCurXy - 1; |
| 452 | } |
| 453 | if (pNeighAvail->iLeftTopAvail) { |
| 454 | iLeftTopXy = iCurXy - 1 - pCurDqLayer->iMbWidth; |
| 455 | } |
| 456 | if (pNeighAvail->iRightTopAvail) { |
| 457 | iRightTopXy = iCurXy + 1 - pCurDqLayer->iMbWidth; |
| 458 | } |
| 459 | |
| 460 | for (int32_t listIdx = 0; listIdx < listCount; ++listIdx) { |
| 461 | //stuff mv_cache and iRefIdxArray from left and top (inter) |
| 462 | if (pNeighAvail->iLeftAvail && IS_INTER (pNeighAvail->iLeftType)) { |
| 463 | ST32 (iMvArray[listIdx][6], LD32 (pCurDqLayer->pDec->pMv[listIdx][iLeftXy][3])); |
| 464 | ST32 (iMvArray[listIdx][12], LD32 (pCurDqLayer->pDec->pMv[listIdx][iLeftXy][7])); |
| 465 | ST32 (iMvArray[listIdx][18], LD32 (pCurDqLayer->pDec->pMv[listIdx][iLeftXy][11])); |
| 466 | ST32 (iMvArray[listIdx][24], LD32 (pCurDqLayer->pDec->pMv[listIdx][iLeftXy][15])); |
| 467 | iRefIdxArray[listIdx][6] = pCurDqLayer->pDec->pRefIndex[listIdx][iLeftXy][3]; |
| 468 | iRefIdxArray[listIdx][12] = pCurDqLayer->pDec->pRefIndex[listIdx][iLeftXy][7]; |
| 469 | iRefIdxArray[listIdx][18] = pCurDqLayer->pDec->pRefIndex[listIdx][iLeftXy][11]; |
| 470 | iRefIdxArray[listIdx][24] = pCurDqLayer->pDec->pRefIndex[listIdx][iLeftXy][15]; |
| 471 | } else { |
| 472 | ST32 (iMvArray[listIdx][6], 0); |
| 473 | ST32 (iMvArray[listIdx][12], 0); |
| 474 | ST32 (iMvArray[listIdx][18], 0); |
| 475 | ST32 (iMvArray[listIdx][24], 0); |
| 476 | |
| 477 | if (0 == pNeighAvail->iLeftAvail) { //not available |
| 478 | iRefIdxArray[listIdx][6] = |
| 479 | iRefIdxArray[listIdx][12] = |
| 480 | iRefIdxArray[listIdx][18] = |
| 481 | iRefIdxArray[listIdx][24] = REF_NOT_AVAIL; |
| 482 | } else { //available but is intra mb type |
| 483 | iRefIdxArray[listIdx][6] = |
| 484 | iRefIdxArray[listIdx][12] = |
| 485 | iRefIdxArray[listIdx][18] = |
| 486 | iRefIdxArray[listIdx][24] = REF_NOT_IN_LIST; |
no test coverage detected