| 623 | } |
| 624 | |
| 625 | int32_t CWelsPreProcess::DownsamplePadding (SPicture* pSrc, SPicture* pDstPic, int32_t iSrcWidth, int32_t iSrcHeight, |
| 626 | int32_t iShrinkWidth, int32_t iShrinkHeight, int32_t iTargetWidth, int32_t iTargetHeight, bool bForceCopy) { |
| 627 | int32_t iRet = 0; |
| 628 | SPixMap sSrcPixMap; |
| 629 | SPixMap sDstPicMap; |
| 630 | memset (&sSrcPixMap, 0, sizeof (sSrcPixMap)); |
| 631 | memset (&sDstPicMap, 0, sizeof (sDstPicMap)); |
| 632 | sSrcPixMap.pPixel[0] = pSrc->pData[0]; |
| 633 | sSrcPixMap.pPixel[1] = pSrc->pData[1]; |
| 634 | sSrcPixMap.pPixel[2] = pSrc->pData[2]; |
| 635 | sSrcPixMap.iSizeInBits = g_kiPixMapSizeInBits; |
| 636 | sSrcPixMap.sRect.iRectWidth = iSrcWidth; |
| 637 | sSrcPixMap.sRect.iRectHeight = iSrcHeight; |
| 638 | sSrcPixMap.iStride[0] = pSrc->iLineSize[0]; |
| 639 | sSrcPixMap.iStride[1] = pSrc->iLineSize[1]; |
| 640 | sSrcPixMap.iStride[2] = pSrc->iLineSize[2]; |
| 641 | sSrcPixMap.eFormat = VIDEO_FORMAT_I420; |
| 642 | |
| 643 | if (iSrcWidth != iShrinkWidth || iSrcHeight != iShrinkHeight || bForceCopy) { |
| 644 | int32_t iMethodIdx = METHOD_DOWNSAMPLE; |
| 645 | sDstPicMap.pPixel[0] = pDstPic->pData[0]; |
| 646 | sDstPicMap.pPixel[1] = pDstPic->pData[1]; |
| 647 | sDstPicMap.pPixel[2] = pDstPic->pData[2]; |
| 648 | sDstPicMap.iSizeInBits = g_kiPixMapSizeInBits; |
| 649 | sDstPicMap.sRect.iRectWidth = iShrinkWidth; |
| 650 | sDstPicMap.sRect.iRectHeight = iShrinkHeight; |
| 651 | sDstPicMap.iStride[0] = pDstPic->iLineSize[0]; |
| 652 | sDstPicMap.iStride[1] = pDstPic->iLineSize[1]; |
| 653 | sDstPicMap.iStride[2] = pDstPic->iLineSize[2]; |
| 654 | sDstPicMap.eFormat = VIDEO_FORMAT_I420; |
| 655 | |
| 656 | if (iSrcWidth != iShrinkWidth || iSrcHeight != iShrinkHeight) { |
| 657 | iRet = m_pInterfaceVp->Process (iMethodIdx, &sSrcPixMap, &sDstPicMap); |
| 658 | } else { |
| 659 | WelsMoveMemory_c (pDstPic->pData[0], pDstPic->pData[1], pDstPic->pData[2], pDstPic->iLineSize[0], pDstPic->iLineSize[1], |
| 660 | pSrc->pData[0], pSrc->pData[1], pSrc->pData[2], pSrc->iLineSize[0], pSrc->iLineSize[1], |
| 661 | iSrcWidth, iSrcHeight); |
| 662 | } |
| 663 | } else { |
| 664 | memcpy (&sDstPicMap, &sSrcPixMap, sizeof (sDstPicMap)); // confirmed_safe_unsafe_usage |
| 665 | } |
| 666 | |
| 667 | // get rid of odd line |
| 668 | iShrinkWidth -= (iShrinkWidth & 1); |
| 669 | iShrinkHeight -= (iShrinkHeight & 1); |
| 670 | Padding ((uint8_t*)sDstPicMap.pPixel[0], (uint8_t*)sDstPicMap.pPixel[1], (uint8_t*)sDstPicMap.pPixel[2], |
| 671 | sDstPicMap.iStride[0], sDstPicMap.iStride[1], iShrinkWidth, iTargetWidth, iShrinkHeight, iTargetHeight); |
| 672 | |
| 673 | return iRet; |
| 674 | } |
| 675 | |
| 676 | //*********************************************************************************************************/ |
| 677 | void CWelsPreProcess::VaaCalculation (SVAAFrameInfo* pVaaInfo, SPicture* pCurPicture, SPicture* pRefPicture, |
nothing calls this directly
no test coverage detected