| @@ -54,12 +54,21 @@ static inline int32_t DecodeFrameConstruction (PWelsDecoderContext pCtx, uint8_t · 53 unmodified lines |
| 54 | const int32_t kiHeight = pCurDq->iMbHeight << 4; | 54 | const int32_t kiHeight = pCurDq->iMbHeight << 4; |
| 55 | | 55 | |
| 56 | const int32_t kiTotalNumMbInCurLayer = pCurDq->iMbWidth * pCurDq->iMbHeight; | 56 | const int32_t kiTotalNumMbInCurLayer = pCurDq->iMbWidth * pCurDq->iMbHeight; |
| | 57 | bool bFrameCompleteFlag = true; |
| 57 | | 58 | |
| 58 | if (pCtx->iTotalNumMbRec != kiTotalNumMbInCurLayer) { | 59 | if (pCtx->iTotalNumMbRec != kiTotalNumMbInCurLayer) { |
| | 60 | if ((pCtx->iTotalNumMbRec != 0) && (I_SLICE == pCurDq->sLayerInfo.sSliceInLayer.eSliceType)) { //TODO should be IDR instead of I_SLICE! |
| | 61 | memcpy (& (pCtx->sFrameCrop), & (pCurDq->sLayerInfo.sSliceInLayer.sSliceHeaderExt.sSliceHeader.pSps->sFrameCrop), sizeof (SPosOffset)); |
| | 62 | #ifdef LONG_TERM_REF |
| | 63 | pCtx->bParamSetsLostFlag = false; |
| | 64 | #else |
| | 65 | pCtx->bReferenceLostAtT0Flag = false; |
| | 66 | #endif //LONG_TERM_REF |
| | 67 | } |
| 59 | WelsLog (pCtx, WELS_LOG_WARNING, | 68 | WelsLog (pCtx, WELS_LOG_WARNING, |
| 60 | "DecodeFrameConstruction():::iTotalNumMbRec:%d, total_num_mb_sps:%d, cur_layer_mb_width:%d, cur_layer_mb_height:%d \n", | 69 | "DecodeFrameConstruction():::iTotalNumMbRec:%d, total_num_mb_sps:%d, cur_layer_mb_width:%d, cur_layer_mb_height:%d \n", |
| 61 | pCtx->iTotalNumMbRec, kiTotalNumMbInCurLayer, pCurDq->iMbWidth, pCurDq->iMbHeight); | 70 | pCtx->iTotalNumMbRec, kiTotalNumMbInCurLayer, pCurDq->iMbWidth, pCurDq->iMbHeight); |
| 62 | return -1; | 71 | bFrameCompleteFlag = false; //return later after output buffer is done |
| 63 | } | 72 | } |
| 64 | #ifdef NO_WAITING_AU | 73 | #ifdef NO_WAITING_AU |
| 65 | pCtx->iTotalNumMbRec = 0; | 74 | pCtx->iTotalNumMbRec = 0; |
| @@ -99,6 +108,14 @@ static inline int32_t DecodeFrameConstruction (PWelsDecoderContext pCtx, uint8_t · 33 unmodified lines |
| 99 | ppDst[2] = ppDst[2] + pCtx->sFrameCrop.iTopOffset * pPic->iLinesize[1] + pCtx->sFrameCrop.iLeftOffset; | 108 | ppDst[2] = ppDst[2] + pCtx->sFrameCrop.iTopOffset * pPic->iLinesize[1] + pCtx->sFrameCrop.iLeftOffset; |
| 100 | pDstInfo->iBufferStatus = 1; | 109 | pDstInfo->iBufferStatus = 1; |
| 101 | | 110 | |
| | 111 | if (pCtx->iErrorConMethod == ERROR_CON_DISABLE) //no buffer output if EC is disabled and frame incomplete |
| | 112 | pDstInfo->iBufferStatus = (int32_t) bFrameCompleteFlag; |
| | 113 | |
| | 114 | if (!bFrameCompleteFlag) { |
| | 115 | pCtx->iErrorCode |= dsBitstreamError; |
| | 116 | return -1; |
| | 117 | } |
| | 118 | |
| 102 | return 0; | 119 | return 0; |
| 103 | } | 120 | } |
| 104 | | 121 | |
| @@ -955,6 +972,8 @@ int32_t InitialDqLayersContext (PWelsDecoderContext pCtx, const int32_t kiMaxWid · 850 unmodified lines |
| 955 | pCtx->sMb.pInterPredictionDoneFlag[i] = (int8_t*) WelsMalloc (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof ( | 972 | pCtx->sMb.pInterPredictionDoneFlag[i] = (int8_t*) WelsMalloc (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof ( |
| 956 | int8_t), "pCtx->sMb.pInterPredictionDoneFlag[]"); | 973 | int8_t), "pCtx->sMb.pInterPredictionDoneFlag[]"); |
| 957 | | 974 | |
| | 975 | pCtx->sMb.pMbCorrectlyDecodedFlag[i] = (bool*) WelsMalloc (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof (bool), "pCtx->sMb.pMbCorrectlyDecodedFlag[]"); |
| | 976 | |
| 958 | // check memory block valid due above allocated.. | 977 | // check memory block valid due above allocated.. |
| 959 | WELS_VERIFY_RETURN_IF (ERR_INFO_OUT_OF_MEMORY, | 978 | WELS_VERIFY_RETURN_IF (ERR_INFO_OUT_OF_MEMORY, |
| 960 | ((NULL == pCtx->sMb.pMbType[i]) || | 979 | ((NULL == pCtx->sMb.pMbType[i]) || |
| @@ -972,7 +991,8 @@ int32_t InitialDqLayersContext (PWelsDecoderContext pCtx, const int32_t kiMaxWid · 11 unmodified lines |
| 972 | (NULL == pCtx->sMb.pSubMbType[i]) || | 991 | (NULL == pCtx->sMb.pSubMbType[i]) || |
| 973 | (NULL == pCtx->sMb.pSliceIdc[i]) || | 992 | (NULL == pCtx->sMb.pSliceIdc[i]) || |
| 974 | (NULL == pCtx->sMb.pResidualPredFlag[i]) || | 993 | (NULL == pCtx->sMb.pResidualPredFlag[i]) || |
| 975 | (NULL == pCtx->sMb.pInterPredictionDoneFlag[i]) | 994 | (NULL == pCtx->sMb.pInterPredictionDoneFlag[i]) || |
| | 995 | (NULL == pCtx->sMb.pMbCorrectlyDecodedFlag[i]) |
| 976 | ) | 996 | ) |
| 977 | ) | 997 | ) |
| 978 | | 998 | |
| @@ -1100,6 +1120,12 @@ void UninitialDqLayersContext (PWelsDecoderContext pCtx) { · 121 unmodified lines |
| 1100 | | 1120 | |
| 1101 | pCtx->sMb.pInterPredictionDoneFlag[i] = NULL; | 1121 | pCtx->sMb.pInterPredictionDoneFlag[i] = NULL; |
| 1102 | } | 1122 | } |
| | 1123 | |
| | 1124 | if (pCtx->sMb.pMbCorrectlyDecodedFlag[i]) { |
| | 1125 | WelsFree (pCtx->sMb.pMbCorrectlyDecodedFlag[i], "pCtx->sMb.pMbCorrectlyDecodedFlag[]"); |
| | 1126 | pCtx->sMb.pMbCorrectlyDecodedFlag[i] = NULL; |
| | 1127 | } |
| | 1128 | |
| 1103 | WelsFree (pDq, "pDq"); | 1129 | WelsFree (pDq, "pDq"); |
| 1104 | | 1130 | |
| 1105 | pDq = NULL; | 1131 | pDq = NULL; |
| @@ -1560,8 +1586,6 @@ int32_t ConstructAccessUnit (PWelsDecoderContext pCtx, uint8_t** ppDst, SBufferI · 454 unmodified lines |
| 1560 | pCtx->bNewSeqBegin = false; | 1586 | pCtx->bNewSeqBegin = false; |
| 1561 | if (ERR_NONE != iErr) { | 1587 | if (ERR_NONE != iErr) { |
| 1562 | WelsLog (pCtx, WELS_LOG_INFO, "returned error from decoding:[0x%x]\n", iErr); | 1588 | WelsLog (pCtx, WELS_LOG_INFO, "returned error from decoding:[0x%x]\n", iErr); |
| 1563 | | | |
| 1564 | pDstInfo->iBufferStatus = 0; | | |
| 1565 | return iErr; | 1589 | return iErr; |
| 1566 | } | 1590 | } |
| 1567 | | 1591 | |
| @@ -1651,6 +1675,7 @@ void InitCurDqLayerData (PWelsDecoderContext pCtx, PDqLayer pCurDq) { · 83 unmodified lines |
| 1651 | pCurDq->pSubMbType = pCtx->sMb.pSubMbType[0]; | 1675 | pCurDq->pSubMbType = pCtx->sMb.pSubMbType[0]; |
| 1652 | pCurDq->pInterPredictionDoneFlag = pCtx->sMb.pInterPredictionDoneFlag[0]; | 1676 | pCurDq->pInterPredictionDoneFlag = pCtx->sMb.pInterPredictionDoneFlag[0]; |
| 1653 | pCurDq->pResidualPredFlag = pCtx->sMb.pResidualPredFlag[0]; | 1677 | pCurDq->pResidualPredFlag = pCtx->sMb.pResidualPredFlag[0]; |
| | 1678 | pCurDq->pMbCorrectlyDecodedFlag = pCtx->sMb.pMbCorrectlyDecodedFlag[0]; |
| 1654 | } | 1679 | } |
| 1655 | } | 1680 | } |
| 1656 | | 1681 | |
| @@ -1725,6 +1750,7 @@ int32_t DecodeCurrentAccessUnit (PWelsDecoderContext pCtx, uint8_t** ppDst, int3 · 68 unmodified lines |
| 1725 | if (pCtx->iTotalNumMbRec == 0) { //Picture start to decode | 1750 | if (pCtx->iTotalNumMbRec == 0) { //Picture start to decode |
| 1726 | for (int32_t i = 0; i < LAYER_NUM_EXCHANGEABLE; ++ i) | 1751 | for (int32_t i = 0; i < LAYER_NUM_EXCHANGEABLE; ++ i) |
| 1727 | memset (pCtx->sMb.pSliceIdc[i], 0xff, (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof (int32_t))); | 1752 | memset (pCtx->sMb.pSliceIdc[i], 0xff, (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof (int32_t))); |
| | 1753 | memset (pCtx->pCurDqLayer->pMbCorrectlyDecodedFlag, 0, pCtx->pSps->iMbWidth * pCtx->pSps->iMbHeight); |
| 1728 | } | 1754 | } |
| 1729 | GetI4LumaIChromaAddrTable (pCtx->iDecBlockOffsetArray, pCtx->pDec->iLinesize[0], pCtx->pDec->iLinesize[1]); | 1755 | GetI4LumaIChromaAddrTable (pCtx->iDecBlockOffsetArray, pCtx->pDec->iLinesize[0], pCtx->pDec->iLinesize[1]); |
| 1730 | | 1756 | |
| @@ -1796,15 +1822,16 @@ int32_t DecodeCurrentAccessUnit (PWelsDecoderContext pCtx, uint8_t** ppDst, int3 · 65 unmodified lines |
| 1796 | "referencing pictures lost due frame gaps exist, prev_frame_num: %d, curr_frame_num: %d\n", pCtx->iPrevFrameNum, | 1822 | "referencing pictures lost due frame gaps exist, prev_frame_num: %d, curr_frame_num: %d\n", pCtx->iPrevFrameNum, |
| 1797 | pSh->iFrameNum); | 1823 | pSh->iFrameNum); |
| 1798 | | 1824 | |
| | 1825 | pCtx->iErrorCode |= dsRefLost; |
| | 1826 | if (pCtx->iErrorConMethod == ERROR_CON_DISABLE) { |
| 1799 | #ifdef LONG_TERM_REF | 1827 | #ifdef LONG_TERM_REF |
| 1800 | pCtx->bParamSetsLostFlag = true; | 1828 | pCtx->bParamSetsLostFlag = true; |
| 1801 | #else | 1829 | #else |
| 1802 | pCtx->bReferenceLostAtT0Flag = true; | 1830 | pCtx->bReferenceLostAtT0Flag = true; |
| 1803 | #endif | 1831 | #endif |
| 1804 | ResetParameterSetsState (pCtx); | 1832 | ResetParameterSetsState (pCtx); |
| 1805 | | 1833 | return ERR_INFO_REFERENCE_PIC_LOST; |
| 1806 | pCtx->iErrorCode |= dsRefLost; | 1834 | } |
| 1807 | return ERR_INFO_REFERENCE_PIC_LOST; | | |
| 1808 | } | 1835 | } |
| 1809 | } | 1836 | } |
| 1810 | | 1837 | |
| @@ -1875,6 +1902,9 @@ int32_t DecodeCurrentAccessUnit (PWelsDecoderContext pCtx, uint8_t** ppDst, int3 · 64 unmodified lines |
| 1875 | #endif | 1902 | #endif |
| 1876 | | 1903 | |
| 1877 | } | 1904 | } |
| | 1905 | |
| | 1906 | pCtx->pPreviousDecodedPictureInDpb = pCtx->pDec; //store latest decoded picture for EC |
| | 1907 | |
| 1878 | if (uiNalRefIdc > 0) { | 1908 | if (uiNalRefIdc > 0) { |
| 1879 | iRet = WelsMarkAsRef (pCtx); | 1909 | iRet = WelsMarkAsRef (pCtx); |
| 1880 | if (iRet != ERR_NONE) { | 1910 | if (iRet != ERR_NONE) { |