| 376 | } |
| 377 | |
| 378 | void DoErrorConSliceMVCopy (PWelsDecoderContext pCtx) { |
| 379 | int32_t iMbWidth = (int32_t) pCtx->pSps->iMbWidth; |
| 380 | int32_t iMbHeight = (int32_t) pCtx->pSps->iMbHeight; |
| 381 | PPicture pDstPic = pCtx->pDec; |
| 382 | PPicture pSrcPic = pCtx->pLastDecPicInfo->pPreviousDecodedPictureInDpb; |
| 383 | |
| 384 | bool* pMbCorrectlyDecodedFlag = pCtx->pCurDqLayer->pMbCorrectlyDecodedFlag; |
| 385 | int32_t iMbXyIndex; |
| 386 | uint8_t* pDstData; |
| 387 | uint32_t iDstStride = pDstPic->iLinesize[0]; |
| 388 | sMCRefMember sMCRefMem; |
| 389 | if (pSrcPic != NULL) { |
| 390 | sMCRefMem.iSrcLineLuma = pSrcPic->iLinesize[0]; |
| 391 | sMCRefMem.iSrcLineChroma = pSrcPic->iLinesize[1]; |
| 392 | sMCRefMem.pSrcY = pSrcPic->pData[0]; |
| 393 | sMCRefMem.pSrcU = pSrcPic->pData[1]; |
| 394 | sMCRefMem.pSrcV = pSrcPic->pData[2]; |
| 395 | sMCRefMem.iDstLineLuma = pDstPic->iLinesize[0]; |
| 396 | sMCRefMem.iDstLineChroma = pDstPic->iLinesize[1]; |
| 397 | sMCRefMem.iPicWidth = pDstPic->iWidthInPixel; |
| 398 | sMCRefMem.iPicHeight = pDstPic->iHeightInPixel; |
| 399 | if (pDstPic == pSrcPic) { |
| 400 | // output error info, EC will be ignored in DoMbECMvCopy |
| 401 | WelsLog (& (pCtx->sLogCtx), WELS_LOG_WARNING, "DoErrorConSliceMVCopy()::EC memcpy overlap."); |
| 402 | return; |
| 403 | } |
| 404 | } |
| 405 | |
| 406 | for (int32_t iMbY = 0; iMbY < iMbHeight; ++iMbY) { |
| 407 | for (int32_t iMbX = 0; iMbX < iMbWidth; ++iMbX) { |
| 408 | iMbXyIndex = iMbY * iMbWidth + iMbX; |
| 409 | if (!pMbCorrectlyDecodedFlag[iMbXyIndex]) { |
| 410 | pCtx->pDec->iMbEcedNum++; |
| 411 | if (pSrcPic != NULL) { |
| 412 | DoMbECMvCopy (pCtx, pDstPic, pSrcPic, iMbXyIndex, iMbX, iMbY, &sMCRefMem); |
| 413 | } else { //pSrcPic == NULL |
| 414 | //Y component |
| 415 | pDstData = pDstPic->pData[0] + iMbY * 16 * iDstStride + iMbX * 16; |
| 416 | for (int32_t i = 0; i < 16; ++i) { |
| 417 | memset (pDstData, 128, 16); |
| 418 | pDstData += iDstStride; |
| 419 | } |
| 420 | //U component |
| 421 | pDstData = pDstPic->pData[1] + iMbY * 8 * iDstStride / 2 + iMbX * 8; |
| 422 | for (int32_t i = 0; i < 8; ++i) { |
| 423 | memset (pDstData, 128, 8); |
| 424 | pDstData += iDstStride / 2; |
| 425 | } |
| 426 | //V component |
| 427 | pDstData = pDstPic->pData[2] + iMbY * 8 * iDstStride / 2 + iMbX * 8; |
| 428 | for (int32_t i = 0; i < 8; ++i) { |
| 429 | memset (pDstData, 128, 8); |
| 430 | pDstData += iDstStride / 2; |
| 431 | } |
| 432 | } // |
| 433 | |
| 434 | } //!pMbCorrectlyDecodedFlag[iMbXyIndex] |
| 435 | } //iMbX |
no test coverage detected