您好,我在使用VICP库函数:
Int32 CPIS_colorSpcConv(
CPIS_Handle *handle,
CPIS_BaseParms *base,
CPIS_colorSpcConvParms *params,
CPIS_ExecType execType
);
使用过程中发现了两个问题,希望您能给与解答。首先介绍下我是如何用的,我想实现YUV444P向RGB的转换。各种参数如下(该参数我用C自己实现过了,能够实现YUV转RGB操作)。
Int16 g_VICP_iCoeffMatrix[9] = {1192, 1192, 1192, 0, -401, 2065, 1634, -833, 0}; //系数矩阵
Int16 g_VICP_i16PreOffset[3] = {-16, -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;
利用VICP库函数实现的图像颜色不正确。分析原因如下:
1、VICP对于输出为负数的值不会置为0,而是将其转换为无符号数
2、VICP运算过程中,对于单步运算的结果为负值时,也会将其转换为无符号数进行下一步运算。
具体分析见附件。
希望您能对这些问题给予解答,另外还请指导如何使用VICP库函数,VICP给的例程只是随机产生的一组数据,没有办法验证该函数的正确性,不知您是否有相关的例程。谢谢。
Chris Meng:
VICP是可以设置上限下限,以及到门限后钳制到某个值的。请尝试在运行转换前调用imxenc_set_saturation,该函数具体信息可以在SPRUGN1C.pdf里面找到
tianxing hou:
回复 Chris Meng:
我在E2E上咨询了一下,回复如下:
There could be a bug in _colorSpcConv.c, line 303:
info.cmdlen+= imxenc_color_spc_conv( info.comp[0], info.coefptr, outputPtr, width, height, 3, width, height, 3, width, height, offsetComp, width, offsetComp, width, IMXTYPE_UBYTE, -> IMXTYPE_BYTE IMXTYPE_SHORT, IMXOTYPE_BYTE, params->qShift, info.cmdptr + info.cmdlen );
Could you make the change and recompile src/src_hw/build/imgproclib.pjt ?
根据回复我修改了相应代码,但是又出现了新的问题,就是最终的输出还是会有负数,在图像中会出现大量的红点、绿点或者蓝点。图像如下:
然后我在源码的info.cmdlen+= imxenc_color_spc_conv()前加入了一条语句 info.cmdlen+=imxenc_set_saturation(255, 255, 0, 0, info.cmdptr + info.cmdlen);
但是图像颜色又不正确了。图像如下:
我在E2E上帖子的地址:http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/99/t/188100.aspx
comeback:
回复 tianxing hou:
LZ你好!我在尝试使用VICP LIB,但编译始终有问题。请问你能否给个简单的例程,让我看看怎么使用VICP LIB?
tianxing hou:
回复 comeback:
TI给提供了例子,就在VICP安装目录下,vicplib_v330\test\build\
建议你对vicp的文件结构了解一下,TI提供了例程以及VICP的源码,还有GPP是C语言实现的相应功能。
请问,报的那些错误?能否将源码贴出来看看。
comeback:
回复 tianxing hou:
LZ你好!我在CCS 5中导入vicplib_v330\test\build\中的fillMem_DM6446.pjt,但编译时出现错误:
tianxing hou:
回复 comeback:
我是在CCS3.3下编译运行的。从报错来看,是有两个库你没有添加。请注意VICP用刀了EDMA资源。你是在DM6446上运行吗?在DM648的库目录下能找到这两个库,DM6446的目录下没有。
TI中文支持网





