History

Fix a few more fixes found during creating thread unit tests. 1. set all none-zero pCurDqLayer->pNzc to 1 before a MB deblocking. 2. make ReleaseBufferedReadyPicture to behaviour to be more close between thread and non-thread. 3. Fix a typo "sSliceDecodeFinsh"

xiaotiansf committed 6 years ago

Commit ffdf9121 parent e3882546 files · +93 −39Browse files

Showing the changes to codec/decoder/plus/src/welsDecoderExt.cpp (1 of 6 files). Show all

Unified · Split

codec/decoder/plus/src/welsDecoderExt.cpp+73−25
@@ -106,7 +106,7 @@ static DECODING_STATE ConstructAccessUnit (CWelsDecoder* pWelsDecoder, PWelsDec · 105 unmodified lines
106106 }
107107 pThrCtx->pDec = NULL;
108108 if (GetThreadCount (pThrCtx->pCtx) > 1) {
109− RESET_EVENT (&pThrCtx->sSliceDecodeFinsh);
109+ RESET_EVENT (&pThrCtx->sSliceDecodeFinish);
110110 }
111111 iRet |= pWelsDecoder->DecodeFrame2WithCtx (pThrCtx->pCtx, NULL, 0, pThrCtx->ppDst, &pThrCtx->sDstInfo);
112112
@@ -142,7 +142,8 @@ CWelsDecoder::CWelsDecoder (void) · 29 unmodified lines
142142 m_bFreezeOutput (false),
143143 m_DecCtxActiveCount (0),
144144 m_pDecThrCtx (NULL),
145− m_pLastDecThrCtx (NULL) {
145+ m_pLastDecThrCtx (NULL),
146+ m_iLastBufferedIdx (0) {
146147 #ifdef OUTPUT_BIT_STREAM
147148 char chFileName[1024] = { 0 }; //for .264
148149 int iBufUsed = 0;
@@ -314,7 +315,7 @@ void CWelsDecoder::OpenDecoderThreads() { · 165 unmodified lines
314315 m_pDecThrCtx[i].pDec = NULL;
315316 CREATE_EVENT (&m_pDecThrCtx[i].sImageReady, 1, 0, NULL);
316317 CREATE_EVENT (&m_pDecThrCtx[i].sSliceDecodeStart, 1, 0, NULL);
317− CREATE_EVENT (&m_pDecThrCtx[i].sSliceDecodeFinsh, 1, 0, NULL);
318+ CREATE_EVENT (&m_pDecThrCtx[i].sSliceDecodeFinish, 1, 0, NULL);
318319 CREATE_SEMAPHORE (&m_pDecThrCtx[i].sThreadInfo.sIsIdle, 0, 1, NULL);
319320 CREATE_SEMAPHORE (&m_pDecThrCtx[i].sThreadInfo.sIsActivated, 0, 1, NULL);
320321 CREATE_THREAD (&m_pDecThrCtx[i].sThreadInfo.sThrHandle, pThrProcInit, (void*) (& (m_pDecThrCtx[i])));
@@ -330,7 +331,7 @@ void CWelsDecoder::CloseDecoderThreads() { · 9 unmodified lines
330331 WAIT_THREAD (&m_pDecThrCtx[i].sThreadInfo.sThrHandle);
331332 CLOSE_EVENT (&m_pDecThrCtx[i].sImageReady);
332333 CLOSE_EVENT (&m_pDecThrCtx[i].sSliceDecodeStart);
333− CLOSE_EVENT (&m_pDecThrCtx[i].sSliceDecodeFinsh);
334+ CLOSE_EVENT (&m_pDecThrCtx[i].sSliceDecodeFinish);
334335 CLOSE_SEMAPHORE (&m_pDecThrCtx[i].sThreadInfo.sIsIdle);
335336 CLOSE_SEMAPHORE (&m_pDecThrCtx[i].sThreadInfo.sIsActivated);
336337 }
@@ -925,14 +926,42 @@ DECODING_STATE CWelsDecoder::FlushFrame (unsigned char** ppDst, · 588 unmodified lines
925926 }
926927 if (bEndOfStreamFlag && m_sReoderingStatus.iNumOfPicts > 0) {
927928 m_sReoderingStatus.iMinPOC = IMinInt32;
928− for (int32_t i = 0; i <= m_sReoderingStatus.iLargestBufferedPicIndex; ++i) {
929− if (m_sReoderingStatus.iMinPOC == IMinInt32 && m_sPictInfoList[i].iPOC > IMinInt32) {
930− m_sReoderingStatus.iMinPOC = m_sPictInfoList[i].iPOC;
931− m_sReoderingStatus.iPictInfoIndex = i;
929+ if (m_bIsBaseline) {
930+ uint32_t uiDecodingTimeStamp = 0;
931+ int32_t firstValidIdx = -1;
932+ for (int32_t i = 0; i <= m_sReoderingStatus.iLargestBufferedPicIndex; ++i) {
933+ if (m_sPictInfoList[i].iPOC > IMinInt32) {
934+ uiDecodingTimeStamp = m_sPictInfoList[i].uiDecodingTimeStamp;
935+ m_sReoderingStatus.iMinPOC = m_sPictInfoList[i].iPOC;
936+ m_sReoderingStatus.iPictInfoIndex = i;
937+ firstValidIdx = i;
938+ break;
939+ }
932940 }
933− if (m_sPictInfoList[i].iPOC > IMinInt32 && m_sPictInfoList[i].iPOC < m_sReoderingStatus.iMinPOC) {
934− m_sReoderingStatus.iMinPOC = m_sPictInfoList[i].iPOC;
935− m_sReoderingStatus.iPictInfoIndex = i;
941+ for (int32_t i = 0; i <= m_sReoderingStatus.iLargestBufferedPicIndex; ++i) {
942+ if (i == firstValidIdx) continue;
943+ if (m_sPictInfoList[i].iPOC > IMinInt32 && m_sPictInfoList[i].uiDecodingTimeStamp < uiDecodingTimeStamp) {
944+ uiDecodingTimeStamp = m_sPictInfoList[i].uiDecodingTimeStamp;
945+ m_sReoderingStatus.iMinPOC = m_sPictInfoList[i].iPOC;
946+ m_sReoderingStatus.iPictInfoIndex = i;
947+ }
948+ }
949+ } else {
950+ int32_t firstValidIdx = -1;
951+ for (int32_t i = 0; i <= m_sReoderingStatus.iLargestBufferedPicIndex; ++i) {
952+ if (m_sReoderingStatus.iMinPOC == IMinInt32 && m_sPictInfoList[i].iPOC > IMinInt32) {
953+ m_sReoderingStatus.iMinPOC = m_sPictInfoList[i].iPOC;
954+ m_sReoderingStatus.iPictInfoIndex = i;
955+ firstValidIdx = i;
956+ break;
957+ }
958+ }
959+ for (int32_t i = 0; i <= m_sReoderingStatus.iLargestBufferedPicIndex; ++i) {
960+ if (i == firstValidIdx) continue;
961+ if (m_sPictInfoList[i].iPOC > IMinInt32 && m_sPictInfoList[i].iPOC < m_sReoderingStatus.iMinPOC) {
962+ m_sReoderingStatus.iMinPOC = m_sPictInfoList[i].iPOC;
963+ m_sReoderingStatus.iPictInfoIndex = i;
964+ }
936965 }
937966 }
938967 }
@@ -940,7 +969,8 @@ DECODING_STATE CWelsDecoder::FlushFrame (unsigned char** ppDst, · 1 unmodified line
940969 m_sReoderingStatus.iLastWrittenPOC = m_sReoderingStatus.iMinPOC;
941970 #if defined (_DEBUG)
942971 #ifdef _MOTION_VECTOR_DUMP_
943− fprintf (stderr, "Output POC: #%d\n", m_sReoderingStatus.iLastWrittenPOC);
972+ fprintf (stderr, "Output POC: #%d uiDecodingTimeStamp=%d\n", m_sReoderingStatus.iLastWrittenPOC,
973+ m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].uiDecodingTimeStamp);
944974 #endif
945975 #endif
946976 memcpy (pDstInfo, &m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].sBufferInfo, sizeof (SBufferInfo));
@@ -1051,6 +1081,7 @@ void CWelsDecoder::BufferingReadyPicture (PWelsDecoderContext pCtx, unsigned cha · 104 unmodified lines
10511081 m_sPictInfoList[i].iPicBuffIdx = pCtx->pLastDecPicInfo->pPreviousDecodedPictureInDpb->iPicBuffIdx;
10521082 if (GetThreadCount (pCtx) <= 1) ++pCtx->pLastDecPicInfo->pPreviousDecodedPictureInDpb->iRefCount;
10531083 m_sPictInfoList[i].bLastGOP = false;
1084+ m_iLastBufferedIdx = i;
10541085 pDstInfo->iBufferStatus = 0;
10551086 ++m_sReoderingStatus.iNumOfPicts;
10561087 if (i > m_sReoderingStatus.iLargestBufferedPicIndex) {
@@ -1069,11 +1100,17 @@ void CWelsDecoder::ReleaseBufferedReadyPicture (PWelsDecoderContext pCtx, unsign · 12 unmodified lines
10691100 }
10701101 if (!m_bIsBaseline && m_sReoderingStatus.iLastGOPRemainPicts > 0) {
10711102 m_sReoderingStatus.iMinPOC = IMinInt32;
1103+ int32_t firstValidIdx = -1;
10721104 for (int32_t i = 0; i <= m_sReoderingStatus.iLargestBufferedPicIndex; ++i) {
10731105 if (m_sReoderingStatus.iMinPOC == IMinInt32 && m_sPictInfoList[i].iPOC > IMinInt32 && m_sPictInfoList[i].bLastGOP) {
10741106 m_sReoderingStatus.iMinPOC = m_sPictInfoList[i].iPOC;
10751107 m_sReoderingStatus.iPictInfoIndex = i;
1108+ firstValidIdx = i;
1109+ break;
10761110 }
1111+ }
1112+ for (int32_t i = 0; i <= m_sReoderingStatus.iLargestBufferedPicIndex; ++i) {
1113+ if (i == firstValidIdx) continue;
10771114 if (m_sPictInfoList[i].iPOC > IMinInt32 && m_sPictInfoList[i].iPOC < m_sReoderingStatus.iMinPOC
10781115 && m_sPictInfoList[i].bLastGOP) {
10791116 m_sReoderingStatus.iMinPOC = m_sPictInfoList[i].iPOC;
@@ -1083,7 +1120,8 @@ void CWelsDecoder::ReleaseBufferedReadyPicture (PWelsDecoderContext pCtx, unsign · 3 unmodified lines
10831120 m_sReoderingStatus.iLastWrittenPOC = m_sReoderingStatus.iMinPOC;
10841121 #if defined (_DEBUG)
10851122 #ifdef _MOTION_VECTOR_DUMP_
1086− fprintf (stderr, "Output POC: #%d\n", m_sReoderingStatus.iLastWrittenPOC);
1123+ fprintf (stderr, "Output POC: #%d uiDecodingTimeStamp=%d\n", m_sReoderingStatus.iLastWrittenPOC,
1124+ m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].uiDecodingTimeStamp);
10871125 #endif
10881126 #endif
10891127 memcpy (pDstInfo, &m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].sBufferInfo, sizeof (SBufferInfo));
@@ -1104,21 +1142,29 @@ void CWelsDecoder::ReleaseBufferedReadyPicture (PWelsDecoderContext pCtx, unsign · 14 unmodified lines
11041142 }
11051143 if (m_sReoderingStatus.iNumOfPicts && m_bIsBaseline) {
11061144 uint32_t uiDecodingTimeStamp = 0;
1145+ int32_t firstValidIdx = -1;
11071146 for (int32_t i = 0; i <= m_sReoderingStatus.iLargestBufferedPicIndex; ++i) {
11081147 if (m_sPictInfoList[i].iPOC > IMinInt32) {
11091148 uiDecodingTimeStamp = m_sPictInfoList[i].uiDecodingTimeStamp;
11101149 m_sReoderingStatus.iPictInfoIndex = i;
1150+ firstValidIdx = i;
11111151 break;
11121152 }
11131153 }
11141154 for (int32_t i = 0; i <= m_sReoderingStatus.iLargestBufferedPicIndex; ++i) {
1115− if (m_sReoderingStatus.iPictInfoIndex != i && m_sPictInfoList[i].iPOC > IMinInt32
1116− && m_sPictInfoList[i].sBufferInfo.uiInBsTimeStamp < uiDecodingTimeStamp) {
1155+ if (i == firstValidIdx) continue;
1156+ if (m_sPictInfoList[i].iPOC > IMinInt32 && m_sPictInfoList[i].uiDecodingTimeStamp < uiDecodingTimeStamp) {
11171157 uiDecodingTimeStamp = m_sPictInfoList[i].uiDecodingTimeStamp;
11181158 m_sReoderingStatus.iPictInfoIndex = i;
11191159 }
11201160 }
11211161 if (uiDecodingTimeStamp > 0) {
1162+#if defined (_DEBUG)
1163+#ifdef _MOTION_VECTOR_DUMP_
1164+ fprintf (stderr, "Output POC: #%d uiDecodingTimeStamp=%d\n", m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].iPOC,
1165+ uiDecodingTimeStamp);
1166+#endif
1167+#endif
11221168 memcpy (pDstInfo, &m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].sBufferInfo, sizeof (SBufferInfo));
11231169 ppDst[0] = pDstInfo->pDst[0];
11241170 ppDst[1] = pDstInfo->pDst[1];
@@ -1132,11 +1178,17 @@ void CWelsDecoder::ReleaseBufferedReadyPicture (PWelsDecoderContext pCtx, unsign · 7 unmodified lines
11321178 }
11331179 if (m_sReoderingStatus.iNumOfPicts > 0) {
11341180 m_sReoderingStatus.iMinPOC = IMinInt32;
1181+ int32_t firstValidIdx = -1;
11351182 for (int32_t i = 0; i <= m_sReoderingStatus.iLargestBufferedPicIndex; ++i) {
11361183 if (m_sReoderingStatus.iMinPOC == IMinInt32 && m_sPictInfoList[i].iPOC > IMinInt32) {
11371184 m_sReoderingStatus.iMinPOC = m_sPictInfoList[i].iPOC;
11381185 m_sReoderingStatus.iPictInfoIndex = i;
1186+ firstValidIdx = i;
1187+ break;
11391188 }
1189+ }
1190+ for (int32_t i = 0; i <= m_sReoderingStatus.iLargestBufferedPicIndex; ++i) {
1191+ if (i == firstValidIdx) continue;
11401192 if (m_sPictInfoList[i].iPOC > IMinInt32 && m_sPictInfoList[i].iPOC < m_sReoderingStatus.iMinPOC) {
11411193 m_sReoderingStatus.iMinPOC = m_sPictInfoList[i].iPOC;
11421194 m_sReoderingStatus.iPictInfoIndex = i;
@@ -1144,20 +1196,16 @@ void CWelsDecoder::ReleaseBufferedReadyPicture (PWelsDecoderContext pCtx, unsign · 1 unmodified line
11441196 }
11451197 }
11461198 if (m_sReoderingStatus.iMinPOC > IMinInt32) {
1147− bool isReady = false;
1148− if (pCtx != NULL) {
1149− isReady = (m_sReoderingStatus.iLastWrittenPOC > IMinInt32
1150− && m_sReoderingStatus.iMinPOC - m_sReoderingStatus.iLastWrittenPOC <= 1)
1151− || m_sReoderingStatus.iMinPOC < pCtx->pSliceHeader->iPicOrderCntLsb;
1152− } else {
1153− isReady = m_sReoderingStatus.iMinPOC == 0 || (m_sReoderingStatus.iLastWrittenPOC >= 0
1154− && m_sReoderingStatus.iMinPOC <= m_sReoderingStatus.iLastWrittenPOC + 2) ;
1155− }
1199+ int32_t iLastPOC = pCtx != NULL ? pCtx->pSliceHeader->iPicOrderCntLsb : m_sPictInfoList[m_iLastBufferedIdx].iPOC;
1200+ bool isReady = (m_sReoderingStatus.iLastWrittenPOC > IMinInt32
1201+ && m_sReoderingStatus.iMinPOC - m_sReoderingStatus.iLastWrittenPOC <= 1)
1202+ || m_sReoderingStatus.iMinPOC < iLastPOC;
11561203 if (isReady) {
11571204 m_sReoderingStatus.iLastWrittenPOC = m_sReoderingStatus.iMinPOC;
11581205 #if defined (_DEBUG)
11591206 #ifdef _MOTION_VECTOR_DUMP_
1160− fprintf (stderr, "Output POC: #%d\n", m_sReoderingStatus.iLastWrittenPOC);
1207+ fprintf (stderr, "Output POC: #%d uiDecodingTimeStamp=%d\n", m_sReoderingStatus.iLastWrittenPOC,
1208+ m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].uiDecodingTimeStamp);
11611209 #endif
11621210 #endif
11631211 memcpy (pDstInfo, &m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].sBufferInfo, sizeof (SBufferInfo));

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