Hi, I used the DM648 chip and call the VICP library function: CPIS_colorSpcConv( ) Func, However I find the function has some problems, my code is that:
Int16 g_VICP_iCoeffMatrix[9] = {0, 0, 0, 0, -401, 0, 0, 0 0}; //系数矩阵
Int16 g_VICP_i16PreOffset[3] = {0, -128, -128}; //运算前输入加上的值
Int16 g_VICP_i16PostOffset[3] = {0, 0, 0}; //运算后输出加上的值
Int16 g_VICP_i16SignedInput[3] = {0, 0, 0}; //输入数据符号
Int16 g_VICP_i16SignedOutput[3] = {0, 0, 0}; //输出数据符号
Uint32 g_VICP_ui32QShift = 10; //结果左移10位
SpacConvBase->srcFormat[0] = CPIS_YUV_444P;
SpacConvBase->srcBuf[0].ptr = pui8YComponent;
SpacConvBase->srcBuf[0].stride = iWidth;
SpacConvBase->srcBuf[1].ptr = (char*)pui8UComponent;
SpacConvBase->srcBuf[1].stride = iWidth;
SpacConvBase->srcBuf[2].ptr = (char*)pui8VComponent;
SpacConvBase->srcBuf[2].stride = iWidth;
SpacConvBase->dstFormat[0] = CPIS_RGB_P; //
SpacConvBase->dstBuf[0].ptr = pui8RComponent;
SpacConvBase->dstBuf[0].stride = iWidth;
SpacConvBase->dstBuf[1].ptr = pui8GComponent;
SpacConvBase->dstBuf[1].stride = iWidth;
SpacConvBase->dstBuf[2].ptr = pui8BComponent;
SpacConvBase->dstBuf[2].stride = iWidth;
SpacConvBase->roiSize.width = iWidth;
SpacConvBase->roiSize.height = iHeight;
SpacConvBase->procBlockSize.width = g_VICP_ui32BlockWidth;
SpacConvBase->procBlockSize.height = g_VICP_ui32BlockHeight;
SpacConvBase->numInput = (iWidth * iHeight);
SpacConvBase->numOutput = (iWidth * iHeight);
SpacConvParams->matrix[0] = g_VICP_i16CoeffMatrixff[0];
SpacConvParams->matrix[1] = g_VICP_i16CoeffMatrixff[1];
SpacConvParams->matrix[2] = g_VICP_i16CoeffMatrixff[2];
SpacConvParams->matrix[3] = g_VICP_i16CoeffMatrixff[3];
SpacConvParams->matrix[4] = g_VICP_i16CoeffMatrixff[4];
SpacConvParams->matrix[5] = g_VICP_i16CoeffMatrixff[5];
SpacConvParams->matrix[6] = g_VICP_i16CoeffMatrixff[6];
SpacConvParams->matrix[7] = g_VICP_i16CoeffMatrixff[7];
SpacConvParams->matrix[8] = g_VICP_i16CoeffMatrixff[8];
SpacConvParams->qShift = g_VICP_ui32QShift;
SpacConvParams->preOffset[0] = g_VICP_i16PreOffset[0];
SpacConvParams->preOffset[1] = g_VICP_i16PreOffset[1];
SpacConvParams->preOffset[2] = g_VICP_i16PreOffset[2];
SpacConvParams->postOffset[0] = g_VICP_i16PostOffset[0];
SpacConvParams->postOffset[1] = g_VICP_i16PostOffset[1];
SpacConvParams->postOffset[2] = g_VICP_i16PostOffset[2];
SpacConvParams->signedInput[0] = g_VICP_i16SignedInput[0];
SpacConvParams->signedInput[1] = g_VICP_i16SignedInput[1];
SpacConvParams->signedInput[2] = g_VICP_i16SignedInput[2];
SpacConvParams->signedOutput[0] = g_VICP_i16SignedOutput[0];
SpacConvParams->signedOutput[1] = g_VICP_i16SignedOutput[1];
SpacConvParams->signedOutput[2] = g_VICP_i16SignedOutput[2];
SpacConvParams->colorDsMode = g_VICP_ColorDsMode;
the formula is:
R = 0*(Y - 0) + 0*(U - 128) + 0*(V - 128)
G = 0*(Y - 0) + 0.392*(U - 128) + 0*(V - 128)
B = 0*(Y - 0) + 0*(U - 128) + 0*(V - 128)
the result show blow:
the first data of Cb is 113, the difference between it and 128 is -15, and the -15*( -0.392), the result is 6, however the result is -94. I suppose the compiler execute 113-128, the result is 67.
I hope you can reply as soon as possible, thanks!






