History

fix PCM parseonly crash issue

huili2 committed 9 years ago

Commit 71566cd1 parent b26bcda2 files · +52 −42Browse files

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

Unified · Split

codec/decoder/core/src/decode_slice.cpp+36−28
@@ -614,6 +614,7 @@ int32_t WelsDecodeMbCabacISliceBaseMode0 (PWelsDecoderContext pCtx, uint32_t& ui · 613 unmodified lines
614614 && uiMbType <= 24))) {
615615 return GENERATE_ERROR_NO (ERR_LEVEL_MB_DATA, ERR_INFO_INVALID_MB_TYPE);
616616 } else if (25 == uiMbType) { //I_PCM
617+ WelsLog (& (pCtx->sLogCtx), WELS_LOG_DEBUG, "I_PCM mode exists in I slice!");
617618 WELS_READ_VERIFY (ParseIPCMInfoCabac (pCtx));
618619 pSlice->iLastDeltaQp = 0;
619620 WELS_READ_VERIFY (ParseEndOfSliceCabac (pCtx, uiEosFlag));
@@ -833,6 +834,7 @@ int32_t WelsDecodeMbCabacPSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 213 unmodified lines
833834 return GENERATE_ERROR_NO (ERR_LEVEL_MB_DATA, ERR_INFO_INVALID_MB_TYPE);
834835
835836 if (25 == uiMbType) { //I_PCM
837+ WelsLog (& (pCtx->sLogCtx), WELS_LOG_DEBUG, "I_PCM mode exists in P slice!");
836838 WELS_READ_VERIFY (ParseIPCMInfoCabac (pCtx));
837839 pSlice->iLastDeltaQp = 0;
838840 WELS_READ_VERIFY (ParseEndOfSliceCabac (pCtx, uiEosFlag));
@@ -1265,6 +1267,7 @@ int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { · 426 unmodified lines
12651267 return GENERATE_ERROR_NO (ERR_LEVEL_MB_DATA, ERR_INFO_INVALID_MB_TYPE);
12661268
12671269 if (25 == uiMbType) {
1270+ WelsLog (& (pCtx->sLogCtx), WELS_LOG_DEBUG, "I_PCM mode exists in I slice!");
12681271 int32_t iDecStrideL = pCurLayer->pDec->iLinesize[0];
12691272 int32_t iDecStrideC = pCurLayer->pDec->iLinesize[1];
12701273
@@ -1291,20 +1294,22 @@ int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { · 20 unmodified lines
12911294
12921295 //step 2: copy pixel from bit-stream into fdec [reconstruction]
12931296 pTmpBsBuf = pBs->pCurBuf;
1294− for (i = 0; i < 16; i++) { //luma
1295− memcpy (pDecY , pTmpBsBuf, iCopySizeY);
1296− pDecY += iDecStrideL;
1297− pTmpBsBuf += 16;
1298− }
1299− for (i = 0; i < 8; i++) { //cb
1300− memcpy (pDecU, pTmpBsBuf, iCopySizeUV);
1301− pDecU += iDecStrideC;
1302− pTmpBsBuf += 8;
1303− }
1304− for (i = 0; i < 8; i++) { //cr
1305− memcpy (pDecV, pTmpBsBuf, iCopySizeUV);
1306− pDecV += iDecStrideC;
1307− pTmpBsBuf += 8;
1297+ if (!pCtx->pParam->bParseOnly) {
1298+ for (i = 0; i < 16; i++) { //luma
1299+ memcpy (pDecY , pTmpBsBuf, iCopySizeY);
1300+ pDecY += iDecStrideL;
1301+ pTmpBsBuf += 16;
1302+ }
1303+ for (i = 0; i < 8; i++) { //cb
1304+ memcpy (pDecU, pTmpBsBuf, iCopySizeUV);
1305+ pDecU += iDecStrideC;
1306+ pTmpBsBuf += 8;
1307+ }
1308+ for (i = 0; i < 8; i++) { //cr
1309+ memcpy (pDecV, pTmpBsBuf, iCopySizeUV);
1310+ pDecV += iDecStrideC;
1311+ pTmpBsBuf += 8;
1312+ }
13081313 }
13091314
13101315 pBs->pCurBuf += 384;
@@ -1603,6 +1608,7 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 292 unmodified lines
16031608 return GENERATE_ERROR_NO (ERR_LEVEL_MB_DATA, ERR_INFO_INVALID_MB_TYPE);
16041609
16051610 if (25 == uiMbType) {
1611+ WelsLog (& (pCtx->sLogCtx), WELS_LOG_DEBUG, "I_PCM mode exists in P slice!");
16061612 int32_t iDecStrideL = pCurLayer->pDec->iLinesize[0];
16071613 int32_t iDecStrideC = pCurLayer->pDec->iLinesize[1];
16081614
@@ -1628,21 +1634,23 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 19 unmodified lines
16281634
16291635 //step 2: copy pixel from bit-stream into fdec [reconstruction]
16301636 pTmpBsBuf = pBs->pCurBuf;
1631− for (i = 0; i < 16; i++) { //luma
1632− memcpy (pDecY , pTmpBsBuf, iCopySizeY);
1633− pDecY += iDecStrideL;
1634− pTmpBsBuf += 16;
1635− }
1637+ if (!pCtx->pParam->bParseOnly) {
1638+ for (i = 0; i < 16; i++) { //luma
1639+ memcpy (pDecY, pTmpBsBuf, iCopySizeY);
1640+ pDecY += iDecStrideL;
1641+ pTmpBsBuf += 16;
1642+ }
16361643
1637− for (i = 0; i < 8; i++) { //cb
1638− memcpy (pDecU, pTmpBsBuf, iCopySizeUV);
1639− pDecU += iDecStrideC;
1640− pTmpBsBuf += 8;
1641− }
1642− for (i = 0; i < 8; i++) { //cr
1643− memcpy (pDecV, pTmpBsBuf, iCopySizeUV);
1644− pDecV += iDecStrideC;
1645− pTmpBsBuf += 8;
1644+ for (i = 0; i < 8; i++) { //cb
1645+ memcpy (pDecU, pTmpBsBuf, iCopySizeUV);
1646+ pDecU += iDecStrideC;
1647+ pTmpBsBuf += 8;
1648+ }
1649+ for (i = 0; i < 8; i++) { //cr
1650+ memcpy (pDecV, pTmpBsBuf, iCopySizeUV);
1651+ pDecV += iDecStrideC;
1652+ pTmpBsBuf += 8;
1653+ }
16461654 }
16471655
16481656 pBs->pCurBuf += 384;

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