Update and fix temporal direct prediction and fix multi-reference pic…
Showing the changes to codec/decoder/core/src/decode_slice.cpp (1 of 18 files). Show all
Unified · Split
| @@ -54,12 +54,6 @@ namespace WelsDec { · 53 unmodified lines | ||
| 54 | 54 | |
| 55 | 55 | extern void FreePicture (PPicture pPic, CMemoryAlign* pMa); |
| 56 | 56 | |
| 57 | −static inline int32_t iAbs (int32_t x) { | |
| 58 | − static const int32_t INT_BITS = (sizeof (int) * CHAR_BIT) - 1; | |
| 59 | − int32_t y = x >> INT_BITS; | |
| 60 | − return (x ^ y) - y; | |
| 61 | −} | |
| 62 | − | |
| 63 | 57 | extern PPicture AllocPicture (PWelsDecoderContext pCtx, const int32_t kiPicWidth, const int32_t kiPicHeight); |
| 64 | 58 | |
| 65 | 59 | int32_t WelsTargetSliceConstruction (PWelsDecoderContext pCtx) { |
| @@ -1417,19 +1411,17 @@ int32_t WelsDecodeMbCabacBSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 1351 unmodified lines | ||
| 1417 | 1411 | pCtx->bMbRefConcealed = pCtx->bRPLRError || pCtx->bMbRefConcealed || ! (ppRefPicL0[0] && ppRefPicL0[0]->bIsComplete) |
| 1418 | 1412 | || ! (ppRefPicL1[0] && ppRefPicL1[0]->bIsComplete); |
| 1419 | 1413 | |
| 1420 | − | |
| 1414 | + SubMbType subMbType; | |
| 1421 | 1415 | if (pSliceHeader->iDirectSpatialMvPredFlag) { |
| 1422 | 1416 | |
| 1423 | 1417 | //predict direct spatial mv |
| 1424 | − SubMbType subMbType; | |
| 1425 | 1418 | int32_t ret = PredMvBDirectSpatial (pCtx, pMv, ref, subMbType); |
| 1426 | 1419 | if (ret != ERR_NONE) { |
| 1427 | 1420 | return ret; |
| 1428 | 1421 | } |
| 1429 | 1422 | } else { |
| 1430 | 1423 | //temporal direct mode |
| 1431 | − ComputeColocated (pCtx); | |
| 1432 | − int32_t ret = PredBDirectTemporal (pCtx, pMv, ref); | |
| 1424 | + int32_t ret = PredBDirectTemporal (pCtx, pMv, ref, subMbType); | |
| 1433 | 1425 | if (ret != ERR_NONE) { |
| 1434 | 1426 | return ret; |
| 1435 | 1427 | } |
| @@ -2380,18 +2372,17 @@ int32_t WelsDecodeMbCavlcBSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 944 unmodified lines | ||
| 2380 | 2372 | pCtx->bMbRefConcealed = pCtx->bRPLRError || pCtx->bMbRefConcealed || ! (ppRefPicL0[0] && ppRefPicL0[0]->bIsComplete) |
| 2381 | 2373 | || ! (ppRefPicL1[0] && ppRefPicL1[0]->bIsComplete); |
| 2382 | 2374 | //predict iMv |
| 2375 | + SubMbType subMbType; | |
| 2383 | 2376 | if (pSliceHeader->iDirectSpatialMvPredFlag) { |
| 2384 | 2377 | |
| 2385 | 2378 | //predict direct spatial mv |
| 2386 | − SubMbType subMbType; | |
| 2387 | 2379 | int32_t ret = PredMvBDirectSpatial (pCtx, iMv, ref, subMbType); |
| 2388 | 2380 | if (ret != ERR_NONE) { |
| 2389 | 2381 | return ret; |
| 2390 | 2382 | } |
| 2391 | 2383 | } else { |
| 2392 | 2384 | //temporal direct mode |
| 2393 | − ComputeColocated (pCtx); | |
| 2394 | − int32_t ret = PredBDirectTemporal (pCtx, iMv, ref); | |
| 2385 | + int32_t ret = PredBDirectTemporal (pCtx, iMv, ref, subMbType); | |
| 2395 | 2386 | if (ret != ERR_NONE) { |
| 2396 | 2387 | return ret; |
| 2397 | 2388 | } |
| @@ -2832,17 +2823,21 @@ bool ComputeColocated (PWelsDecoderContext pCtx) { · 434 unmodified lines | ||
| 2832 | 2823 | PSlice pCurSlice = &pCurLayer->sLayerInfo.sSliceInLayer; |
| 2833 | 2824 | PSliceHeader pSliceHeader = &pCurSlice->sSliceHeaderExt.sSliceHeader; |
| 2834 | 2825 | if (!pSliceHeader->iDirectSpatialMvPredFlag) { |
| 2835 | − uint32_t uiShortRefCount = pCtx->sRefPic.uiShortRefCount[LIST_0]; | |
| 2836 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 2837 | − for (uint32_t i = 0; i < uiShortRefCount; ++i) { | |
| 2838 | − int32_t iTRb = WELS_CLIP3 (-128, 127, pSliceHeader->iPicOrderCntLsb - pCtx->sRefPic.pRefList[listIdx][i]->iFramePoc); | |
| 2839 | − int32_t iTRp = WELS_CLIP3 (-128, 127, | |
| 2840 | − pCtx->sRefPic.pRefList[LIST_1][i]->iFramePoc - pCtx->sRefPic.pRefList[LIST_0][i]->iFramePoc); | |
| 2841 | − if (iTRp != 0) { | |
| 2842 | − int32_t prescale = (16384 + iAbs (iTRp / 2)) / iTRp; | |
| 2843 | − pCurSlice->iMvScale[listIdx][i] = WELS_CLIP3 (-1024, 1023, (iTRb * prescale + 32) >> 6); | |
| 2844 | − } else { | |
| 2845 | − pCurSlice->iMvScale[listIdx][i] = 0x03FFF; | |
| 2826 | + uint32_t uiRefCount = pSliceHeader->uiRefCount[LIST_0]; | |
| 2827 | + if (pCtx->sRefPic.pRefList[LIST_1][0] != NULL) { | |
| 2828 | + for (uint32_t i = 0; i < uiRefCount; ++i) { | |
| 2829 | + if (pCtx->sRefPic.pRefList[LIST_0][i] != NULL) { | |
| 2830 | + const int32_t poc0 = pCtx->sRefPic.pRefList[LIST_0][i]->iFramePoc; | |
| 2831 | + const int32_t poc1 = pCtx->sRefPic.pRefList[LIST_1][0]->iFramePoc; | |
| 2832 | + const int32_t poc = pSliceHeader->iPicOrderCntLsb; | |
| 2833 | + const int32_t td = WELS_CLIP3 (poc1 - poc0, -128, 127); | |
| 2834 | + if (td == 0) { | |
| 2835 | + pCurSlice->iMvScale[LIST_0][i] = 1 << 8; | |
| 2836 | + } else { | |
| 2837 | + int32_t tb = WELS_CLIP3 (poc - poc0, -128, 127); | |
| 2838 | + int32_t tx = (16384 + (abs (td) >> 1)) / td; | |
| 2839 | + pCurSlice->iMvScale[LIST_0][i] = WELS_CLIP3 ((tb * tx + 32) >> 6, -1024, 1023); | |
| 2840 | + } | |
| 2846 | 2841 | } |
| 2847 | 2842 | } |
| 2848 | 2843 | } |