MCPcopy Create free account
hub / github.com/cisco/openh264 / DoErrorConSliceMVCopy

Function DoErrorConSliceMVCopy

codec/decoder/core/src/error_concealment.cpp:378–437  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

376}
377
378void 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

Callers 1

ImplementErrorConFunction · 0.85

Calls 2

WelsLogFunction · 0.85
DoMbECMvCopyFunction · 0.85

Tested by

no test coverage detected