History

add EC frame/slice copy.

huili2 committed 12 years ago

Commit bc2c4b01 parent b2f71919 files · +156 −21Browse files

Showing the changes to codec/decoder/core/src/decoder_core.cpp (1 of 9 files). Show all

Unified · Split

codec/decoder/core/src/decoder_core.cpp+40−10
@@ -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_AU73#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 decode1750 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_REF1827#ifdef LONG_TERM_REF
1800 pCtx->bParamSetsLostFlag = true;1828 pCtx->bParamSetsLostFlag = true;
1801#else1829#else
1802 pCtx->bReferenceLostAtT0Flag = true;1830 pCtx->bReferenceLostAtT0Flag = true;
1803#endif1831#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#endif1902#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) {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t