History

Fix a thread buffering bug: a few yuv frames at output can be dropped due to unexpected pDst reset. This is resolved by moving pDst into SBufferInfo data structure.

xiaotiansf committed 6 years ago

Commit aae33c01 parent cae50c75 files · +25 −25Browse files

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

Unified · Split

codec/decoder/plus/src/welsDecoderExt.cpp+12−15
@@ -944,9 +944,9 @@ DECODING_STATE CWelsDecoder::FlushFrame (unsigned char** ppDst, · 943 unmodified lines
944#endif944#endif
945#endif945#endif
946 memcpy (pDstInfo, &m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].sBufferInfo, sizeof (SBufferInfo));946 memcpy (pDstInfo, &m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].sBufferInfo, sizeof (SBufferInfo));
947 ppDst[0] = m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].pData[0];947 ppDst[0] = pDstInfo->pDst[0];
948 ppDst[1] = m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].pData[1];948 ppDst[1] = pDstInfo->pDst[1];
949 ppDst[2] = m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].pData[2];949 ppDst[2] = pDstInfo->pDst[2];
950 m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].iPOC = IMinInt32;950 m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].iPOC = IMinInt32;
951 PPicBuff pPicBuff = m_iThreadCount <= 1 ? m_pDecThrCtx[0].pCtx->pPicBuff : m_pPicBuff;951 PPicBuff pPicBuff = m_iThreadCount <= 1 ? m_pDecThrCtx[0].pCtx->pPicBuff : m_pPicBuff;
952 if (m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].iPicBuffIdx < pPicBuff->iCapacity) {952 if (m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].iPicBuffIdx < pPicBuff->iCapacity) {
@@ -1046,9 +1046,6 @@ void CWelsDecoder::BufferingReadyPicture (PWelsDecoderContext pCtx, unsigned cha · 93 unmodified lines
1046 for (int32_t i = 0; i < 16; ++i) {1046 for (int32_t i = 0; i < 16; ++i) {
1047 if (m_sPictInfoList[i].iPOC == IMinInt32) {1047 if (m_sPictInfoList[i].iPOC == IMinInt32) {
1048 memcpy (&m_sPictInfoList[i].sBufferInfo, pDstInfo, sizeof (SBufferInfo));1048 memcpy (&m_sPictInfoList[i].sBufferInfo, pDstInfo, sizeof (SBufferInfo));
1049 m_sPictInfoList[i].pData[0] = ppDst[0];
1050 m_sPictInfoList[i].pData[1] = ppDst[1];
1051 m_sPictInfoList[i].pData[2] = ppDst[2];
1052 m_sPictInfoList[i].iPOC = pCtx->pSliceHeader->iPicOrderCntLsb;1049 m_sPictInfoList[i].iPOC = pCtx->pSliceHeader->iPicOrderCntLsb;
1053 m_sPictInfoList[i].uiDecodingTimeStamp = pCtx->uiDecodingTimeStamp;1050 m_sPictInfoList[i].uiDecodingTimeStamp = pCtx->uiDecodingTimeStamp;
1054 m_sPictInfoList[i].iPicBuffIdx = pCtx->pLastDecPicInfo->pPreviousDecodedPictureInDpb->iPicBuffIdx;1051 m_sPictInfoList[i].iPicBuffIdx = pCtx->pLastDecPicInfo->pPreviousDecodedPictureInDpb->iPicBuffIdx;
@@ -1090,9 +1087,9 @@ void CWelsDecoder::ReleaseBufferedReadyPicture (PWelsDecoderContext pCtx, unsign · 35 unmodified lines
1090#endif1087#endif
1091#endif1088#endif
1092 memcpy (pDstInfo, &m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].sBufferInfo, sizeof (SBufferInfo));1089 memcpy (pDstInfo, &m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].sBufferInfo, sizeof (SBufferInfo));
1093 ppDst[0] = m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].pData[0];1090 ppDst[0] = pDstInfo->pDst[0];
1094 ppDst[1] = m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].pData[1];1091 ppDst[1] = pDstInfo->pDst[1];
1095 ppDst[2] = m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].pData[2];1092 ppDst[2] = pDstInfo->pDst[2];
1096 m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].iPOC = IMinInt32;1093 m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].iPOC = IMinInt32;
1097 PPicture pPic = pPicBuff->ppPic[m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].iPicBuffIdx];1094 PPicture pPic = pPicBuff->ppPic[m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].iPicBuffIdx];
1098 --pPic->iRefCount;1095 --pPic->iRefCount;
@@ -1123,9 +1120,9 @@ void CWelsDecoder::ReleaseBufferedReadyPicture (PWelsDecoderContext pCtx, unsign · 24 unmodified lines
1123 }1120 }
1124 if (uiDecodingTimeStamp > 0) {1121 if (uiDecodingTimeStamp > 0) {
1125 memcpy (pDstInfo, &m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].sBufferInfo, sizeof (SBufferInfo));1122 memcpy (pDstInfo, &m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].sBufferInfo, sizeof (SBufferInfo));
1126 ppDst[0] = m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].pData[0];1123 ppDst[0] = pDstInfo->pDst[0];
1127 ppDst[1] = m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].pData[1];1124 ppDst[1] = pDstInfo->pDst[1];
1128 ppDst[2] = m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].pData[2];1125 ppDst[2] = pDstInfo->pDst[2];
1129 m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].iPOC = IMinInt32;1126 m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].iPOC = IMinInt32;
1130 PPicture pPic = pPicBuff->ppPic[m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].iPicBuffIdx];1127 PPicture pPic = pPicBuff->ppPic[m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].iPicBuffIdx];
1131 --pPic->iRefCount;1128 --pPic->iRefCount;
@@ -1164,9 +1161,9 @@ void CWelsDecoder::ReleaseBufferedReadyPicture (PWelsDecoderContext pCtx, unsign · 32 unmodified lines
1164#endif1161#endif
1165#endif1162#endif
1166 memcpy (pDstInfo, &m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].sBufferInfo, sizeof (SBufferInfo));1163 memcpy (pDstInfo, &m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].sBufferInfo, sizeof (SBufferInfo));
1167 ppDst[0] = m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].pData[0];1164 ppDst[0] = pDstInfo->pDst[0];
1168 ppDst[1] = m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].pData[1];1165 ppDst[1] = pDstInfo->pDst[1];
1169 ppDst[2] = m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].pData[2];1166 ppDst[2] = pDstInfo->pDst[2];
1170 m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].iPOC = IMinInt32;1167 m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].iPOC = IMinInt32;
1171 PPicture pPic = pPicBuff->ppPic[m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].iPicBuffIdx];1168 PPicture pPic = pPicBuff->ppPic[m_sPictInfoList[m_sReoderingStatus.iPictInfoIndex].iPicBuffIdx];
1172 --pPic->iRefCount;1169 --pPic->iRefCount;

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