⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chenimage.cpp

📁 LDPC码的实现,包括编码器和解码器,使用了DCT.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		return GOOD_RETURN;
	}
	else
	{
		if (pBlock1)
			delete [] pBlock1;

		if (pBlock2)
			delete [] pBlock2;

		if (pBlockRes)
			delete [] pBlockRes;

		if (pBlockResAbs)
			delete [] pBlockResAbs;
		
		return BAD_RETURN;
	}

#endif

}

int ChenImage_imageBlockMatch1DDoubleHypothesisAdd(const int nWidth, const int nHeight, const int nBlockSize, const int nMaxShift, const short* pSrc1, const short* pSrc2, const short* pSrc3, const float* pWeights, short* pShifted, short* pResidual, short* pShifts1, short* pShifts2)
{
#ifdef _USEIPP

	bool bSuccess = true;

	// Initialize
	int nBlockRows = nHeight / nBlockSize;
	int nBlockCols = nWidth / nBlockSize;
	int nBlockElems = nBlockSize * nBlockSize;
	short* pBlock1 = new short[nBlockElems];
	short* pBlock2 = new short[nBlockElems];
	short* pBlock3 = new short[nBlockElems];
	short* pBlockComb = new short[nBlockElems];
	short* pBlockRes = new short[nBlockElems];
	short* pBlockResAbs = new short[nBlockElems];
	float* pBlock2F = new float[nBlockElems];
	float* pBlock3F = new float[nBlockElems];
	float* pBlockCombF = new float[nBlockElems];

	// Copy src 2 into output by default
	int nSrcStep = nWidth * sizeof(short);
	int nDstStep = nWidth * sizeof(short);
	IppiSize roiSize = {nWidth, nHeight};
	RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pSrc2, nSrcStep, (Ipp16s*)pShifted, nDstStep, roiSize), bSuccess );

	// Iterate across all blocks
	double dMinResAbsSum;
	int nSrc1StartCol, nSrc1StartRow, nSrc2StartCol, nSrc2StartRow, nSrc3StartCol, nSrc3StartRow;
	roiSize.width = nBlockSize; 
	roiSize.height = nBlockSize;
	for (int nBlockRow = 0; nBlockRow < nBlockRows; nBlockRow++) {
		for (int nBlockCol = 0; nBlockCol < nBlockCols; nBlockCol++) {
			int nBlock = nBlockRow*nBlockCols + nBlockCol;
			dMinResAbsSum = LARGE;
			nSrc1StartCol = nBlockSize * nBlockCol;
			nSrc1StartRow = nBlockSize * nBlockRow;

			// Copy block from image X
			nSrcStep = nWidth * sizeof(short);
			nDstStep = nBlockSize * sizeof(short);
			RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)(pSrc1 + nSrc1StartRow*nWidth + nSrc1StartCol), nSrcStep, (Ipp16s*)pBlock1, nDstStep, roiSize), bSuccess );

			// Iterate across all local horizontal shifts for Y1 and Y2
			nSrc2StartRow = nSrc1StartRow;
			nSrc3StartRow = nSrc1StartRow;
			for (nSrc2StartCol = MAX(0,nSrc1StartCol-nMaxShift); nSrc2StartCol <= MIN(nSrc1StartCol+nMaxShift,nWidth-nBlockSize); nSrc2StartCol++) {
				for (nSrc3StartCol = MAX(0,nSrc1StartCol-nMaxShift); nSrc3StartCol <= MIN(nSrc1StartCol+nMaxShift,nWidth-nBlockSize); nSrc3StartCol++) {

					// Copy blocks from Y1 and Y2
					nSrcStep = nWidth * sizeof(short);
					nDstStep = nBlockSize * sizeof(short);
					RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)(pSrc2 + nSrc2StartRow*nWidth + nSrc2StartCol), nSrcStep, (Ipp16s*)pBlock2, nDstStep, roiSize), bSuccess );
					RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)(pSrc3 + nSrc3StartRow*nWidth + nSrc3StartCol), nSrcStep, (Ipp16s*)pBlock3, nDstStep, roiSize), bSuccess );

					// Form combination block in a1*Y1 + a2*Y2
					nSrcStep = nBlockSize * sizeof(short);
					nDstStep = nBlockSize * sizeof(float);
					RECORD_IPP_SUCCESS( ippiConvert_16s32f_C1R((const Ipp16s*)pBlock2, nSrcStep, (Ipp32f*)pBlock2F, nDstStep, roiSize), bSuccess );
					RECORD_IPP_SUCCESS( ippiConvert_16s32f_C1R((const Ipp16s*)pBlock3, nSrcStep, (Ipp32f*)pBlock3F, nDstStep, roiSize), bSuccess );
					RECORD_IPP_SUCCESS( ippiMulC_32f_C1IR(pWeights[0], (Ipp32f*)pBlock2F, nDstStep, roiSize), bSuccess );
					RECORD_IPP_SUCCESS( ippiMulC_32f_C1IR(pWeights[1], (Ipp32f*)pBlock3F, nDstStep, roiSize), bSuccess );
					nSrcStep = nBlockSize * sizeof(float);
					nDstStep = nBlockSize * sizeof(float);
					RECORD_IPP_SUCCESS( ippiAdd_32f_C1R((const Ipp32f*)pBlock2F, nSrcStep, (const Ipp32f*)pBlock3F, nSrcStep, (Ipp32f*)pBlockCombF, nDstStep, roiSize), bSuccess );
					nSrcStep = nBlockSize * sizeof(float);
					nDstStep = nBlockSize * sizeof(short);
					IppRoundMode rndMode = ippRndNear;
					RECORD_IPP_SUCCESS( ippiConvert_32f16s_C1R((const Ipp32f*)pBlockCombF, nSrcStep, (Ipp16s*)pBlockComb, nDstStep, roiSize, rndMode), bSuccess );

					// Create residual block
					nSrcStep = nBlockSize * sizeof(short);
					nDstStep = nBlockSize * sizeof(short);
					int nScaleFactor = 0;
					RECORD_IPP_SUCCESS( ippiSub_16s_C1RSfs((const Ipp16s*)pBlockComb, nSrcStep, (const Ipp16s*)pBlock1, nSrcStep, (Ipp16s*)pBlockRes, nDstStep, roiSize, nScaleFactor), bSuccess );

					// Calculate sum of absolute residuals
					double dResAbsSum;
					nSrcStep = nBlockSize * sizeof(short);
					nDstStep = nBlockSize * sizeof(short);
					RECORD_IPP_SUCCESS( ippiAbs_16s_C1R((const Ipp16s*)pBlockRes, nSrcStep, (Ipp16s*)pBlockResAbs, nDstStep, roiSize), bSuccess );
					RECORD_IPP_SUCCESS( ippiSum_16s_C1R((const Ipp16s*)pBlockResAbs, nSrcStep, roiSize, &dResAbsSum), bSuccess );

					// Compare with previous min sum of absolute residuals
					if (dResAbsSum < dMinResAbsSum) {
						dMinResAbsSum = dResAbsSum;
						// Copy shifted block into output image
						nSrcStep = nBlockSize * sizeof(short);
						nDstStep = nWidth * sizeof(short);
						RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pBlockComb, nSrcStep, (Ipp16s*)(pShifted + nSrc1StartRow*nWidth + nSrc1StartCol), nDstStep, roiSize), bSuccess );

						// Copy block residual into output residual image
						nSrcStep = nBlockSize * sizeof(short);
						nDstStep = nWidth * sizeof(short);
						RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pBlockRes, nSrcStep, (Ipp16s*)(pResidual + nSrc1StartRow*nWidth + nSrc1StartCol), nDstStep, roiSize), bSuccess );

						// Record optimal shift value
						if (pShifts1 != NULL) {
							pShifts1[nBlock] = nSrc2StartCol - nSrc1StartCol;
						}
						if (pShifts2 != NULL) {
							pShifts2[nBlock] = nSrc3StartCol - nSrc1StartCol;
						}
					} // end if

				} // end nSrc3StartCol
			} // end nSrc2StartCol
		
		} // end nBlockCol
	} // end nBlockRow

	delete [] pBlock1;
	delete [] pBlock2;
	delete [] pBlock3;
	delete [] pBlockRes;
	delete [] pBlockComb;
	delete [] pBlock2F;
	delete [] pBlock3F;
	delete [] pBlockCombF;
	return bSuccess ? GOOD_RETURN : BAD_RETURN;

#else

	return BAD_RETURN;

#endif

}

int ChenImage_imageBlockMatch1DDoubleHypothesisSwitch(const int nWidth, const int nHeight, const int nBlockSize, const int nMaxShift, const short* pSrc1, const short* pSrc2, const short* pSrc3, short* pShiftedImg, short* pResidual, short* pShifts1, short* pShifts2)
{

#ifdef _USEIPP

	bool bSuccess = true;

	// Initialize
	int nBlockRows = nHeight / nBlockSize;
	int nBlockCols = nWidth / nBlockSize;
	int nBlockElems = nBlockSize * nBlockSize;
	short* pBlock1 = new short[nBlockElems];
	short* pBlock2 = new short[nBlockElems];
	short* pBlock3 = new short[nBlockElems];
	short* pBlockComb = new short[nBlockElems];
	short* pBlockRes2 = new short[nBlockElems];
	short* pBlockResAbs2 = new short[nBlockElems];
	short* pBlockRes3 = new short[nBlockElems];
	short* pBlockResAbs3 = new short[nBlockElems];

	// Copy src 2 into output by default
	int nSrcStep = nWidth * sizeof(short);
	int nDstStep = nWidth * sizeof(short);
	IppiSize roiSize = {nWidth, nHeight};
	RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pSrc2, nSrcStep, (Ipp16s*)pShiftedImg, nDstStep, roiSize), bSuccess );
	RECORD_IPP_SUCCESS( ippsSet_16s(-nMaxShift-1, (Ipp16s*)pShifts1, nBlockRows*nBlockCols), bSuccess );
	RECORD_IPP_SUCCESS( ippsSet_16s(-nMaxShift-1, (Ipp16s*)pShifts2, nBlockRows*nBlockCols), bSuccess );

	// Iterate across all blocks
	double dMinResAbsSum;
	int nSrc1StartCol, nSrc1StartRow, nSrc2StartCol, nSrc2StartRow, nSrc3StartCol, nSrc3StartRow;
	roiSize.width = nBlockSize; 
	roiSize.height = nBlockSize;
	for (int nBlockRow = 0; nBlockRow < nBlockRows; nBlockRow++) {
		for (int nBlockCol = 0; nBlockCol < nBlockCols; nBlockCol++) {
			int nBlock = nBlockRow*nBlockCols + nBlockCol;
			dMinResAbsSum = LARGE;
			nSrc1StartCol = nBlockSize * nBlockCol;
			nSrc1StartRow = nBlockSize * nBlockRow;

			// Copy block from image X
			nSrcStep = nWidth * sizeof(short);
			nDstStep = nBlockSize * sizeof(short);
			RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)(pSrc1 + nSrc1StartRow*nWidth + nSrc1StartCol), nSrcStep, (Ipp16s*)pBlock1, nDstStep, roiSize), bSuccess );

			// Iterate across all local horizontal shifts for Y1 and Y2
			nSrc2StartRow = nSrc1StartRow;
			nSrc3StartRow = nSrc1StartRow;
			for (nSrc2StartCol = MAX(0,nSrc1StartCol-nMaxShift); nSrc2StartCol <= MIN(nSrc1StartCol+nMaxShift,nWidth-nBlockSize); nSrc2StartCol++) {
				nSrc3StartCol = nSrc2StartCol;

				// Copy blocks from Y1 and Y2
				nSrcStep = nWidth * sizeof(short);
				nDstStep = nBlockSize * sizeof(short);
				RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)(pSrc2 + nSrc2StartRow*nWidth + nSrc2StartCol), nSrcStep, (Ipp16s*)pBlock2, nDstStep, roiSize), bSuccess );
				RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)(pSrc3 + nSrc3StartRow*nWidth + nSrc3StartCol), nSrcStep, (Ipp16s*)pBlock3, nDstStep, roiSize), bSuccess );

				// Create residual blocks
				nSrcStep = nBlockSize * sizeof(short);
				nDstStep = nBlockSize * sizeof(short);
				int nScaleFactor = 0;
				RECORD_IPP_SUCCESS( ippiSub_16s_C1RSfs((const Ipp16s*)pBlock2, nSrcStep, (const Ipp16s*)pBlock1, nSrcStep, (Ipp16s*)pBlockRes2, nDstStep, roiSize, nScaleFactor), bSuccess );
				RECORD_IPP_SUCCESS( ippiSub_16s_C1RSfs((const Ipp16s*)pBlock3, nSrcStep, (const Ipp16s*)pBlock1, nSrcStep, (Ipp16s*)pBlockRes3, nDstStep, roiSize, nScaleFactor), bSuccess );

				// Calculate sum of absolute residuals
				double dResAbsSum2, dResAbsSum3;
				nSrcStep = nBlockSize * sizeof(short);
				nDstStep = nBlockSize * sizeof(short);
				RECORD_IPP_SUCCESS( ippiAbs_16s_C1R((const Ipp16s*)pBlockRes2, nSrcStep, (Ipp16s*)pBlockResAbs2, nDstStep, roiSize), bSuccess );
				RECORD_IPP_SUCCESS( ippiSum_16s_C1R((const Ipp16s*)pBlockResAbs2, nSrcStep, roiSize, &dResAbsSum2), bSuccess );
				RECORD_IPP_SUCCESS( ippiAbs_16s_C1R((const Ipp16s*)pBlockRes3, nSrcStep, (Ipp16s*)pBlockResAbs3, nDstStep, roiSize), bSuccess );
				RECORD_IPP_SUCCESS( ippiSum_16s_C1R((const Ipp16s*)pBlockResAbs3, nSrcStep, roiSize, &dResAbsSum3), bSuccess );

				// Compare with previous min sum of absolute residuals
				if (MIN(dResAbsSum2, dResAbsSum3) < dMinResAbsSum) {
					dMinResAbsSum = MIN(dResAbsSum2, dResAbsSum3);

					if (dResAbsSum2 < dResAbsSum3) {
						// Copy shifted block into output image
						nSrcStep = nBlockSize * sizeof(short);
						nDstStep = nWidth * sizeof(short);
						RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pBlock2, nSrcStep, (Ipp16s*)(pShiftedImg + nSrc1StartRow*nWidth + nSrc1StartCol), nDstStep, roiSize), bSuccess );

						// Copy block residual into output residual image
						nSrcStep = nBlockSize * sizeof(short);
						nDstStep = nWidth * sizeof(short);
						RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pBlockRes2, nSrcStep, (Ipp16s*)(pResidual + nSrc1StartRow*nWidth + nSrc1StartCol), nDstStep, roiSize), bSuccess );

						// Record optimal shift value
						if (pShifts1 != NULL) {
							pShifts1[nBlock] = nSrc2StartCol - nSrc1StartCol;
							pShifts2[nBlock] = -nMaxShift - 1;
						}
					}
					else {
						// Copy shifted block into output image
						nSrcStep = nBlockSize * sizeof(short);
						nDstStep = nWidth * sizeof(short);
						RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pBlock3, nSrcStep, (Ipp16s*)(pShiftedImg + nSrc1StartRow*nWidth + nSrc1StartCol), nDstStep, roiSize), bSuccess );

						// Copy block residual into output residual image
						nSrcStep = nBlockSize * sizeof(short);
						nDstStep = nWidth * sizeof(short);
						RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pBlockRes3, nSrcStep, (Ipp16s*)(pResidual + nSrc1StartRow*nWidth + nSrc1StartCol), nDstStep, roiSize), bSuccess );

						// Record optimal shift value
						if (pShifts2 != NULL) {
							pShifts2[nBlock] = nSrc3StartCol - nSrc1StartCol;
							pShifts1[nBlock] = -nMaxShift - 1;
						}
					}
				} // end if

			} // end nSrc2StartCol
		
		} // end nBlockCol
	} // end nBlockRow

	delete [] pBlock1;
	delete [] pBlock2;
	delete [] pBlock3;
	delete [] pBlockRes2;
	delete [] pBlockRes3;
	return bSuccess ? GOOD_RETURN : BAD_RETURN;

#else

	return BAD_RETURN;

#endif
}

int ChenImage_imageBlockMatch1DDoubleHypothesisAddDynamicWeight(const int nWidth, const int nHeight, const int nBlockSize, const int nMaxShift, const short* pSrc1, const short* pSrc2, const short* pSrc3, short* pShiftedImg, short* pResidual, short* pShifts1, short* pShifts2, short* pWeights1)
{
#ifdef _USEIPP

	bool bSuccess = true;

	// Initialize
	int nBlockRows = nHeight / nBlockSize;
	int nBlockCols = nWidth / nBlockSize;
	int nBlockElems = nBlockSize * nBlockSize;
	short* pBlock1 = new short[nBlockElems];
	short* pBlock2 = new short[nBlockElems];
	short* pBlock3 = new short[nBlockElems];
	short* pBlockComb = new short[nBlockElems];
	short* pBlockRes = new short[nBlockElems];
	short* pBlockResAbs = new short[nBlockElems];
	float* pBlock2F = new float[nBlockElems];
	float* pBlock3F = new float[nBlockElems];
	float* pBlockCombF = new float[nBlockElems];

	// Copy src 2 into output by default
	int nSrcStep = nWidth * sizeof(short);
	int nDstStep = nWidth * sizeof(short);
	IppiSize roiSize = {nWidth, nHeight};
	RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pSrc2, nSrcStep, (Ipp16s*)pShiftedImg, nDstStep, roiSize), bSuccess );

	// Iterate across all blocks
	double dMinResAbsSum;
	int nSrc1StartCol, nSrc1StartRow, nSrc2StartCol, nSrc2StartRow, nSrc3StartCol, nSrc3StartRow;
	roiSize.width = nBlockSize; 
	roiSize.height = nBlockSize;
	float pLinearWeightsY1[3] = {1, (float)0.5, 0};
	float pLinearWeightsY2[3] = {0, (float)0.5, 1};
	for (int nBlockRow = 0; nBlockRow < nBlockRows; nBlockRow++) {
		for (int nBlockCol = 0; nBlockCol < nBlockCols; nBlockCol++) {
			int nBlock = nBlockRow*nBlockCols + nBlockCol;
			dMinResAbsSum = LARGE;
			nSrc1StartCol = nBlockSize * nBlockCol;
			nSrc1StartRow = nBlockSize * nBlockRow;

			// Copy block from image X
			nSrcStep = nWidth * sizeof(short);
			nDstStep = nBlockSize * sizeof(short);
			RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)(pSrc1 + nSrc1StartRow*nWidth + nSrc1StartCol), nSrcStep, (Ipp16s*)pBlock1, nDstStep, roiSize), bSuccess );

			// Iterate across all local horizontal shifts for Y1 and Y2
			nSrc2StartRow = nSrc1StartRow;
			nSrc3StartRow = nSrc1StartRow;
			for (nSrc2StartCol = MAX(0,nSrc1StartCol-nMaxShift); nSrc2StartCol <= MIN(nSrc1StartCol+nMaxShift,nWidth-nBlockSize); nSrc2StartCol++) {
				for (nSrc3StartCol = MAX(0,nSrc1StartCol-nMaxShift); nSrc3StartCol <= MIN(nSrc1StartCol+nMaxShift,nWidth-nBlockSize); nSrc3StartCol++) {
					for (int nWeight = 0; nWeight < 3; nWeight++) {

						// Copy blocks from Y1 and Y2
						nSrcStep = nWidth * sizeof(short);
						nDstStep = nBlockSize * sizeof(short);
						RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)(pSrc2 + nSrc2StartRow*nWidth + nSrc2StartCol), nSrcStep, (Ipp16s*)pBlock2, nDstStep, roiSize), bSuccess );
						RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)(pSrc3 + nSrc3StartRow*nWidth + nSrc3StartCol), nSrcStep, (Ipp16s*)pBlock3, nDstStep, roiSize), bSuccess );

						// Form combination block in a1*Y1 + (1-a1)*Y2
						nSrcStep = nBlockSize * sizeof(short);
						nDstStep = nBlockSize * sizeof(float);
						RECORD_IPP_SUCCESS( ippiConvert_16s32f_C1R((const Ipp16s*)pBlock2, nSrcStep, (Ipp32f*)pBlock2F, nDstStep, roiSize), bSuccess );
						RECORD_IPP_SUCCESS( ippiConvert_16s32f_C1R((const Ipp16s*)pBlock3, nSrcStep, (Ipp32f*)pBlock3F, nDstStep, roiSize), bSuccess );
						RECORD_IPP_SUCCESS( ippiMulC_32f_C1IR(pLinearWeightsY1[nWeight], (Ipp32f*)pBlock2F, nDstStep, roiSize), bSuccess );
						RECORD_IPP_SUCCESS( ippiMulC_32f_C1IR(pLinearWeightsY2[nWeight], (Ipp32f*)pBlock3F, nDstStep, roiSize), bSuccess );
						nSrcStep = nBlockSize * sizeof(float);
						nDstStep = nBlockSize * sizeof(float);
						RECORD_IPP_SUCCESS( ippiAdd_32f_C1R((const Ipp32f*)pBlock2F, nSrcStep, (const Ipp32f*)pBlock3F, nSrcStep, (Ipp32f*)pBlockCombF, nDstStep, roiSize), bSuccess );
						nSrcStep = nBlockSize * sizeof(float);
						nDstStep = nBlockSize * sizeof(short);
						IppRoundMode rndMode = ippRndNear;
						RECORD_IPP_SUCCESS( ippiConvert_32f16s_C1R((const Ipp32f*)pBlockCombF, nSrcStep, (Ipp16s*)pBlockComb, nDstStep, roiSize, rndMode), bSuccess );

						// Create residual block
						nSrcStep = nBlockSize * sizeof(short);
						nDstStep = nBlockSize * sizeof(short);
						int nScaleFactor = 0;
						RECORD_IPP_SUCCESS( ippiSub_16s_C1RSfs((const Ipp16s*)pBlockComb, nSrcStep, (const Ipp16s*)pBlock1, nSrcStep, (Ipp16s*)pBlockRes, nDstStep, roiSize, nScaleFactor), bSuccess );

						// Calculate sum of absolute residuals
						double dResAbsSum;
						nSrcStep = nBlockSize * sizeof(short);
						nDstStep = nBlockSize * sizeof(short);
						RECORD_IPP_SUCCESS( ippiAbs_16s_C1R((const Ipp16s*)pBlockRes, nSrcStep, (Ipp16s*)pBlockResAbs, nDstStep, roiSize), bSuccess );
						RECORD_IPP_SUCCESS( ippiSum_16s_C1R((const Ipp16s*)pBlockResAbs, nSrcStep, roiSize, &dResAbsSum), bSuccess );

						// Compare with previous min sum of absolute residuals
						if (dResAbsSum < dMinResAbsSum) {
							dMinResAbsSum = dResAbsSum;
							// Copy shifted block into output image
							nSrcStep = nBlockSize * sizeof(short);
							nDstStep = nWidth * sizeof(short);
							RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pBlockComb, nSrcStep, (Ipp16s*)(pShiftedImg + nSrc1StartRow*nWidth + nSrc1StartCol), nDstStep, roiSize), bSuccess );

							// Copy block residual into output residual image
							nSrcStep = nBlockSize * sizeof(short);
							nDstStep = nWidth * sizeof(short);
							RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pBlockRes, nSrcStep, (Ipp16s*)(pResidual + nSrc1StartRow*nWidth + nSrc1StartCol), nDstStep, roiSize), bSuccess );

							// Record optimal shift value
							if (pShifts1 != NULL) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -