MCPcopy Create free account
hub / github.com/cisco/openh264 / WelsFillCacheInter

Function WelsFillCacheInter

codec/decoder/core/src/parse_mb_syn_cavlc.cpp:429–542  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

427}
428
429void 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;

Callers 2

Calls 1

Tested by

no test coverage detected