[已解决]海思CROP功能设置无效
2 E币
成为会员,免费下载资料
文件大小:40.9 KB
上传者:hongwazi
时间:2017-07-14 17:26:57
下载量:51
本帖最后由 hongwazi 于 2017-7-14 17:30 编辑
我的平台:HI3519 V101 使用sample中sample_venc.c进行局部代码修改
我的目的:sensor--->vi--->ddr--->算法--->vpss--->venc
sensor 采集的图像恒定为3840*2160 然后我要在这里面抠出一个960*960的图让算法处理
方法一:
sensor--->vi(w,h)--->ddr--->算法--->vpss(w,h ---> w/4,h/4)--->venc(w/4,h/4)
vi采集到图像为3840*2160,在vpss的chn crop功能来缩放,其中vpss和venc bind在一起。
VPSS_CROP_INFO_S CropInfo;
CropInfo.bEnable = HI_TRUE;
CropInfo.stCropRect.s32X = 0;
CropInfo.stCropRect.s32Y = 0;
CropInfo.stCropRect.u32Height = 540;
CropInfo.stCropRect.u32Height = 960;
s32Ret = HI_MPI_VPSS_SetChnCrop(VpssGrp,VpssChn, &CropInfo);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("HI_MPI_VPSS_SetChnCrop failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
s32Ret = HI_MPI_VPSS_SetDepth( VpssGrp, VpssChn, 8);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("HI_MPI_VPSS_SetDepth failed with %#x\n", s32Ret);
return HI_FAILURE;
}
s32Ret = HI_MPI_VPSS_EnableChn(VpssGrp, VpssChn);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("HI_MPI_VPSS_EnableChn failed with %#x\n", s32Ret);
return HI_FAILURE;
}
错误信息:HI_MPI_VPSS_SetChnCrop failed with 0xa0078002!(无效的通道号)
但是当我去掉HI_MPI_VPSS_SetChnCrop调用,最后HI_MPI_VPSS_EnableChn正常的
方法二:
使用vi phy chn0的crop功能。在VI通道的框图中PHY CHN和 EXT CHN都有crop能力,但是没有PHY CHN的crop接口。
因此我推测是HI_MPI_VI_SetChnAttr中stCapRect和stDestSize属性是PHY CHN的crop属性设置,使用HI_MPI_VI_SetChnAttr中设置
sensor--->vi(w,h ---> w/4,h/4)--->ddr--->算法--->vpss(w/4,h/4)--->venc(w/4,h/4)
错误信息:编译运行后,成功4帧后(可播放,是crop图像),出现HI_MPI_VPSS_SendFrame failed a007800d(分配buf失败)
方法三:
使用vi ext chn2的crop功能
sensor--->vi(phy chn w,h) --->ext vhn(w,h ---> w/4,h/4)--->ddr--->算法--->vpss(w/4,h/4)--->venc(w/4,h/4)
在调用HI_MPI_VI_EnableChn后
/* enable vi ext chn */
VI_EXT_CHN_ATTR_S stExtChnAttr;
stExtChnAttr.s32BindChn = ViChn; /* 绑定vi chn0 */
stExtChnAttr.stDestSize.u32Width = pstTarSize->u32Width;
stExtChnAttr.stDestSize.u32Height= pstTarSize->u32Height;
stExtChnAttr.s32SrcFrameRate = -1;
stExtChnAttr.s32DstFrameRate = -1;
stExtChnAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; /* sp420 or sp422 */
stExtChnAttr.enCompressMode = COMPRESS_MODE_NONE;
s32Ret = HI_MPI_VI_SetExtChnAttr(ViChn+2, &stExtChnAttr);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
CROP_INFO_S stExtChnCrop;
stExtChnCrop.bEnable = HI_TRUE;
stExtChnCrop.stRect.s32X = 0;
stExtChnCrop.stRect.s32Y = 0;
stExtChnCrop.stRect.u32Height = 540;
stExtChnCrop.stRect.u32Width = 960;
/* 从vi ext chn中扣出的图像大小 */
/* Set crop attribute for vi ext-chn */
s32Ret = HI_MPI_VI_SetExtChnCrop(ViChn+2, &stExtChnCrop);
if (HI_SUCCESS != s32Ret)
{
printf("Set vi ext-chn crop attr err:0x%x\n", s32Ret);
return s32Ret;
}
/* set buffer length */
s32Ret = HI_MPI_VI_SetFrameDepth(ViChn+2, 8);
if (s32Ret != 0)
{
printf("HI_MPI_VI_SetFrameDepth failed with error code %#x!\n", s32Ret);
return HI_FAILURE;
}
/* 使能扩展通道2 */
s32Ret = HI_MPI_VI_EnableChn(ViChn+2);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("ViChn=%d failed with %#x!\n", ViChn,s32Ret);
return HI_FAILURE;
}
后面调用HI_MPI_VI_GetFrame从ViChn+2通道获取vi数据
HI_MPI_VI_GetFrame得到的图像信息宽和高(w,h)而不是设置的(w/4,h/4)所以EXT CHN CROP设置无效
错误信息:
HI_MPI_VPSS_SendFrame failed a007800d
宽度高信息未变化
------------------------------------------------------------------解决方法----------------------------------------------------------------------------
我的需求:sensor采集大图片,最后要从采集大图片中扣出一个小图
软硬平台:Hi3519 V101R001C01SPC020 海思公板 imx274
硬件限制1:vi和vpss在线模式,vi物理通道0的CROP是无法生效的。
视频物理通道(如果绑定的话,数据根本就不会流向DDR)
视频物理通道负责将输入设备解析后得到的视频数据输出到 DDR。在真正将数据输出到 DDR 之前,它可以实现裁剪等功能
硬件限制2:在vi vpss在线情况下
HI_S32 HI_MPI_VPSS_SetGrpCrop(VPSS_GRP VpssGrp, VPSS_CROP_INFO_S*pstCropInfo);也是无效的
VPSS CHN CROP我也试了,错误直接说设置VPSS CHN 无效
最终方法:
VI(CROP)--->ddr--->VPSS(去噪)--->ddr--->算法--->venc
参考代码:
我的平台:HI3519 V101 使用sample中sample_venc.c进行局部代码修改
我的目的:sensor--->vi--->ddr--->算法--->vpss--->venc
sensor 采集的图像恒定为3840*2160 然后我要在这里面抠出一个960*960的图让算法处理
方法一:
sensor--->vi(w,h)--->ddr--->算法--->vpss(w,h ---> w/4,h/4)--->venc(w/4,h/4)
vi采集到图像为3840*2160,在vpss的chn crop功能来缩放,其中vpss和venc bind在一起。
VPSS_CROP_INFO_S CropInfo;
CropInfo.bEnable = HI_TRUE;
CropInfo.stCropRect.s32X = 0;
CropInfo.stCropRect.s32Y = 0;
CropInfo.stCropRect.u32Height = 540;
CropInfo.stCropRect.u32Height = 960;
s32Ret = HI_MPI_VPSS_SetChnCrop(VpssGrp,VpssChn, &CropInfo);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("HI_MPI_VPSS_SetChnCrop failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
s32Ret = HI_MPI_VPSS_SetDepth( VpssGrp, VpssChn, 8);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("HI_MPI_VPSS_SetDepth failed with %#x\n", s32Ret);
return HI_FAILURE;
}
s32Ret = HI_MPI_VPSS_EnableChn(VpssGrp, VpssChn);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("HI_MPI_VPSS_EnableChn failed with %#x\n", s32Ret);
return HI_FAILURE;
}
错误信息:HI_MPI_VPSS_SetChnCrop failed with 0xa0078002!(无效的通道号)
但是当我去掉HI_MPI_VPSS_SetChnCrop调用,最后HI_MPI_VPSS_EnableChn正常的
方法二:
使用vi phy chn0的crop功能。在VI通道的框图中PHY CHN和 EXT CHN都有crop能力,但是没有PHY CHN的crop接口。
因此我推测是HI_MPI_VI_SetChnAttr中stCapRect和stDestSize属性是PHY CHN的crop属性设置,使用HI_MPI_VI_SetChnAttr中设置
sensor--->vi(w,h ---> w/4,h/4)--->ddr--->算法--->vpss(w/4,h/4)--->venc(w/4,h/4)
错误信息:编译运行后,成功4帧后(可播放,是crop图像),出现HI_MPI_VPSS_SendFrame failed a007800d(分配buf失败)
方法三:
使用vi ext chn2的crop功能
sensor--->vi(phy chn w,h) --->ext vhn(w,h ---> w/4,h/4)--->ddr--->算法--->vpss(w/4,h/4)--->venc(w/4,h/4)
在调用HI_MPI_VI_EnableChn后
/* enable vi ext chn */
VI_EXT_CHN_ATTR_S stExtChnAttr;
stExtChnAttr.s32BindChn = ViChn; /* 绑定vi chn0 */
stExtChnAttr.stDestSize.u32Width = pstTarSize->u32Width;
stExtChnAttr.stDestSize.u32Height= pstTarSize->u32Height;
stExtChnAttr.s32SrcFrameRate = -1;
stExtChnAttr.s32DstFrameRate = -1;
stExtChnAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; /* sp420 or sp422 */
stExtChnAttr.enCompressMode = COMPRESS_MODE_NONE;
s32Ret = HI_MPI_VI_SetExtChnAttr(ViChn+2, &stExtChnAttr);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
CROP_INFO_S stExtChnCrop;
stExtChnCrop.bEnable = HI_TRUE;
stExtChnCrop.stRect.s32X = 0;
stExtChnCrop.stRect.s32Y = 0;
stExtChnCrop.stRect.u32Height = 540;
stExtChnCrop.stRect.u32Width = 960;
/* 从vi ext chn中扣出的图像大小 */
/* Set crop attribute for vi ext-chn */
s32Ret = HI_MPI_VI_SetExtChnCrop(ViChn+2, &stExtChnCrop);
if (HI_SUCCESS != s32Ret)
{
printf("Set vi ext-chn crop attr err:0x%x\n", s32Ret);
return s32Ret;
}
/* set buffer length */
s32Ret = HI_MPI_VI_SetFrameDepth(ViChn+2, 8);
if (s32Ret != 0)
{
printf("HI_MPI_VI_SetFrameDepth failed with error code %#x!\n", s32Ret);
return HI_FAILURE;
}
/* 使能扩展通道2 */
s32Ret = HI_MPI_VI_EnableChn(ViChn+2);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("ViChn=%d failed with %#x!\n", ViChn,s32Ret);
return HI_FAILURE;
}
后面调用HI_MPI_VI_GetFrame从ViChn+2通道获取vi数据
HI_MPI_VI_GetFrame得到的图像信息宽和高(w,h)而不是设置的(w/4,h/4)所以EXT CHN CROP设置无效
错误信息:
HI_MPI_VPSS_SendFrame failed a007800d
宽度高信息未变化
------------------------------------------------------------------解决方法----------------------------------------------------------------------------
我的需求:sensor采集大图片,最后要从采集大图片中扣出一个小图
软硬平台:Hi3519 V101R001C01SPC020 海思公板 imx274
硬件限制1:vi和vpss在线模式,vi物理通道0的CROP是无法生效的。
视频物理通道(如果绑定的话,数据根本就不会流向DDR)
视频物理通道负责将输入设备解析后得到的视频数据输出到 DDR。在真正将数据输出到 DDR 之前,它可以实现裁剪等功能
硬件限制2:在vi vpss在线情况下
HI_S32 HI_MPI_VPSS_SetGrpCrop(VPSS_GRP VpssGrp, VPSS_CROP_INFO_S*pstCropInfo);也是无效的
VPSS CHN CROP我也试了,错误直接说设置VPSS CHN 无效
最终方法:
VI(CROP)--->ddr--->VPSS(去噪)--->ddr--->算法--->venc
参考代码:
展开》
折叠》