[CAM-C1126S2U] AIO原厂 AI-UVC-CAMERA固件 rkmedia_vi_get_frame_test 报错请教

请教一下坛友,我这边测试CAM-C1126S2U demo code, 比如rkmedia_vi_get_frame_test ,无法正常执行.
固件:cam-crv1126s2u-uvcc.mk
demo: https://wiki.t-firefly.com/zh_CN/CAM-C11262U/Rkmedia.html#vi-getframe

异常:
[09:46:40.344487][CAMHW]:XCAM ERROR CamHwIsp20.cpp:928: No free isp&ispp needed by fake camera!

[root@RV1126_RV1109:/oem/usr/bin]# ./rkmedia_vi_get_frame_test  -a /oem/etc/iqfi
les/ -w 1920 -h 1080 -d rkispp_scale0 -o /tmp/1080p.nv12 -c 10
media get entity by name: rkcif-lvds-subdev is null
media get entity by name: rkcif-lite-lvds-subdev is null
media get entity by name: rkisp-mpfbc-subdev is null
media get entity by name: rkisp_dmapath is null
media get entity by name: rkisp-mpfbc-subdev is null
media get entity by name: rkisp_dmapath is null
media get entity by name: rockchip-mipi-dphy-rx is null
[09:46:40.344487][CAMHW]:XCAM ERROR CamHwIsp20.cpp:928: No free isp&ispp needed by fake camera!
Rga built version:1.04 1e7d09e+2021-08-03 04:35:55
Had init the rga dev ctx = 0x363a8
Rga built version:1.04 1e7d09e+2021-08-03 04:35:55
#####Device: rkispp_scale0
#####Resolution: 1920x1080
#####Frame Count to save: 10
#####Output Path: /tmp/1080p.nv12
#CameraIdx: 0

#####Aiq xml dirpath: /oem/etc/iqfiles/

#bMultictx: 0

ID: 0, sensor_name is m00_f_gc2053 1-0037, iqfiles is /oem/etc/iqfiles/
[09:46:40.809746][XCORE]:XCAM ERROR v4l2_device.cpp:657: device(/dev/video27) start failed
[09:46:40.809863][CAMHW]:XCAM ERROR CamHwIsp20.cpp:3068: prepare isp params dev err: -9

Segmentation fault (core dumped)

若我执行RkApps-stop.sh 来停掉aicamera.sh. 那adb 就无法连接了. 也就无法测试了.

  1. external/rkmedia/example/ 这个路径的代码是 RK 提供的,RK 没有更新我们就没有更新,而且所有 demo 都经过反复验证可行。
  2. example 已经很明显有 rkmedia_vi_get_frame_test和 rkmedia_vi_double_cameras_test.c 之分了,所名 单目和双目初始化方法不一样。为啥一点要在单目跑双目的 demo, 双目跑单目的demo 呢?你可以是一下用 AIO 跑rkmedia_vi_get_frame_test是不是可行,跑 rkmedia_vi_double_cameras_test 是不是不可行
  3. 遇到问题前先看看文档和代码,每个 demo 其实就百来行代码基本所有 api doc里都有介绍。

本帖最后由 ubuntu 于 2021-8-6 16:03 编辑

板蓝根 发表于 2021-8-6 09:58

  1. external/rkmedia/example/ 这个路径的代码是 RK 提供的,RK 没有更新我们就没有更新,而且所有 demo 都 …
    删除此贴, 回错帖子了.

板蓝根 发表于 2021-8-6 09:58

  1. external/rkmedia/example/ 这个路径的代码是 RK 提供的,RK 没有更新我们就没有更新,而且所有 demo 都 …

谢谢支持.
step1. 我周末测试到现在, 如您建议跑双摄的demo也一样:
CamHwIsp20.cpp:928: No free isp&ispp needed by fake camera!
step2. 参考您找个帖子给另外一位同学的建议,关闭开机启动后也无效,
https://dev.t-firefly.com/forum.php?mod=viewthread&tid=104268
step3. 在step2基础上移掉S58_lunch_init, 无法adb了.

附: step1 执行后完整log

[root@RV1126_RV1109:/oem/usr/bin]# ./rkmedia_vi_double_cameras_test  -a /oem/etc
/iqfiles/
media get entity by name: rkcif-lvds-subdev is null
media get entity by name: rkcif-lite-lvds-subdev is null
media get entity by name: rkisp-mpfbc-subdev is null
media get entity by name: rkisp_dmapath is null
media get entity by name: rkisp-mpfbc-subdev is null
media get entity by name: rkisp_dmapath is null
media get entity by name: rockchip-mipi-dphy-rx is null
[10:47:12.710108][CAMHW]:XCAM ERROR CamHwIsp20.cpp:928: No free isp&ispp needed by fake camera!
Rga built version:1.04 1e7d09e+2021-08-03 04:35:55
Had init the rga dev ctx = 0x363a8
Rga built version:1.04 1e7d09e+2021-08-03 04:35:55
ID: 0, sensor_name is m00_f_gc2053 1-0037, iqfiles is /oem/etc/iqfiles/
[10:47:13.166440][XCORE]:XCAM ERROR v4l2_device.cpp:657: device(/dev/video27) start failed
[10:47:13.166543][CAMHW]:XCAM ERROR CamHwIsp20.cpp:3068: prepare isp params dev err: -9

Segmentation fault (core dumped)
[root@RV1126_RV1109:/oem/usr/bin]# 

可以查看 api 文档,自行排查问题

板蓝根 发表于 2021-8-10 08:51
可以查看 api 文档,自行排查问题

这个回答万事皆可用…, 若脚踏实地实事求是的做事情的话,
参考api文档如下, 哪一句和#4 楼问题"step2. 参考您找个帖子给另外一位同学的建议,关闭开机启动后也无效," 有关联?
https://wiki.t-firefly.com/zh_CN/CORE-1126-JD4/Rkmedia.html#mo-kuai-jie-shao

视频
VI
VI 为视频输入模块,可以理解为摄像头采集模块,需要注意的是 VI 需要 RKAIQ 的支持,在使用 VI 前需要提前初始化好 RKAIQ,详细初始化步骤可以在 Example 中查看。

VI 通道属性设置

MPP_CHN_S stViChn;			#定义模块设备通道结构体
stViChn.enModId = RK_ID_VI;	#模块号为 RK_ID_VI
stViChn.s32ChnId				#设置 VI 通道号

VI_CHN_ATTR_S vi_chn_attr;	#定义 VI 通道属性结构体指针
vi_chn_attr.u32BufCnt			# VI 捕获视频缓冲区计数
vi_chn_attr.u32Width			# video 宽度
vi_chn_attr.u32Height			# video 高度
vi_chn_attr.enWorkMode		# VI 通道工作模式
vi_chn_attr.pcVideoNode		# video 节点路径
vi_chn_attr.enPixFmt			# video 格式
设置 VI 通道属性

#函数定义:
RK_MPI_VI_SetChnAttr(VI_PIPE ViPipe, VI_CHN ViChn, const VI_CHN_ATTR_S *pstChnAttr);
# ViPipe 为 VI 管道号;ViChn 为 VI 通道号; pstChnAttr 为 VI 通道属性结构体指针。
#使用示例:
RK_MPI_VI_SetChnAttr(vi_pipe, stViChn.s32ChnId, &vi_chn_attr);
启用 VI 通道

#函数定义:
RK_S32 RK_MPI_VI_EnableChn(VI_PIPE ViPipe, VI_CHN ViChn);
# ViPipe 为 VI 管道号; ViChn 为 VI 通道号。
#使用示例:
RK_MPI_VI_EnableChn(vi_pipe, stViChn.s32ChnId);
VDEC
VDEC 模块,即视频解码模块。本模块支持多路实时解码,且每路解码独立,支持 H264/H265/MJPEG/JPEG 解码。

解码通道属性设置

MPP_CHN_S stVdecChn;					#定义模块设备通道结构体
stVdecChn.enModId = RK_ID_VDEC;		#模块号为 RK_ID_VDEC
stVdecChn.s32ChnId						#设置解码通道号

VDEC_CHN_ATTR_S stVdecAttr;			#定义解码通道属性结构体
stVdecAttr.enCodecType					#解码格式
stVdecAttr.enMode							#解码输入模式,支持帧/流
stVdecAttr.enDecodecMode				#解码模式,支持硬件或软件解码
创建 VDEC 解码通道

#函数定义:
RK_S32 RK_MPI_VDEC_CreateChn(VDEC_CHN VdChn, const VDEC_CHN_ATTR_S *pstAttr);
# VdChn 为解码通道号; pstAttr 为解码通道属性指针。
#使用示例:
RK_MPI_VDEC_CreateChn(stVdecChn.s32ChnId, &stVdecAttr);
RGA
RGA 模块用于 2D 图像的裁剪、格式转换、缩放、旋转、图片叠加等。

使用 RGA 处理可以大大降低 CPU 的负担,同时加快图片的处理速度。(参考:1080p 图片格式转换。RGA 耗时:7ms,Opencv 耗时:50ms)

rkmedia 中 RGA 通道仅支持裁剪、格式转换、缩放、旋转功能,图片叠加则需要单独调用librga.so库,参见《Rockchip_Developer_Guide_Linux_RGA_CN.pdf》

RGA 通道属性设置

MPP_CHN_S stRgaChn;				#定义模块设备通道结构体
stRgaChn.enModId = RK_ID_RGA;		#模块号为 RK_ID_RGA
stRgaChn.s32ChnId					#设置解码通道号

RGA_ATTR_S stRgaAttr;				#定义 RGA 属性结构体
stRgaAttr.bEnBufPool					#使能缓冲池
stRgaAttr.u16BufPoolCnt				#缓冲池计数
stRgaAttr.u16Rotaion					#旋转   取值范围 0,90,180,270
stRgaAttr.stImgIn.u32X					# RGA 通道输入图片的X轴坐标
stRgaAttr.stImgIn.u32Y 				# RGA 通道输入图片的Y轴坐标
stRgaAttr.stImgIn.imgType				# RGA 通道输入图片格式
stRgaAttr.stImgIn.u32Width 			#输入图片宽度
stRgaAttr.stImgIn.u32Height 			#输入图片高度
stRgaAttr.stImgIn.u32HorStride 		#输入图片虚宽
stRgaAttr.stImgIn.u32VirStride 		#输入图片虚高
stRgaAttr.stImgOut.u32X 				# RGA 通道输出图片的 X 轴坐标
stRgaAttr.stImgOut.u32Y				# RGA 通道输出图片的 Y 轴坐标
stRgaAttr.stImgOut.imgType			# RGA 通道输出图片格式
stRgaAttr.stImgOut.u32Width			#输出图片宽度
stRgaAttr.stImgOut.u32Height			#输出图片高度
stRgaAttr.stImgOut.u32HorStride		#输出图片虚宽
stRgaAttr.stImgOut.u32VirStride		#输出图片虚高
创建 RGA 通道

#函数定义:
RK_S32 RK_MPI_RGA_CreateChn(RGA_CHN RgaChn, RGA_ATTR_S *pstRgaAttr);
# RgaChn 为 RGA 通道号; pstAttr 为 RGA 通道属性指针。
#使用示例:
RK_MPI_RGA_CreateChn(stRgaChn.s32ChnId, &stRgaAttr);
stride 宽度,通常与 buffer_width 相同。若 u32VirWidth 大于 buffer 宽度,则必须满足 16 对齐。 可使用 CELING_2_POWER 函数对变量进行 16 对齐设置。例如:

stRgaAttr.stImgOut.u32VirStride = CELING_2_POWER(u32Height,16);
VO
VO 模块用于视频输出管理。VO 模块是对 DRM/KMS 的封装,支持多 VOP 以及多图层显示。

MPP_CHN_S VoChn;						#定义模块设备通道结构体
VO_CHN_ATTR_S stVoAttr = {0};			#定义视频输出属性结构体并初始化为 0
memset(&stVoAttr, 0, sizeof(stVoAttr));

stVoAttr.pcDevNode = "/dev/dri/card0";	#视频 VO 输出设备节点设置为"/dev/dri/card0"
stVoAttr.emPlaneType						#视频输出图层类型
stVoAttr.enImgType						#输入图片格式
stVoAttr.u16Zpos							#输出图层 Z 轴高度
stVoAttr.u32Width							#视频输出宽度
stVoAttr.u32Height							#视频输出高度
stVoAttr.stImgRect.s32X					#视频输入图像区域的 X 轴坐标
stVoAttr.stImgRect.s32Y					#视频输入图像区域的 Y 轴坐标
stVoAttr.stImgRect.u32Width				#输入图像区域的宽度
stVoAttr.stImgRect.u32Height				#输入图像区域的高度
stVoAttr.stDispRect.s32X					#显示区域的起始 X 轴坐标
stVoAttr.stDispRect.s32Y					#显示区域的起始 Y 轴坐标
stVoAttr.stDispRect.u32Width				#显示区域的宽度
stVoAttr.stDispRect.u32Height				#显示区域的高度

VoChn.enModId = RK_ID_VO;				#模块号为 RK_ID_VO
VoChn.s32DevId							#模块设备号
VoChn.s32ChnId							#模块通道号
创建 VO 通道

#函数定义:
RK_S32 RK_MPI_VO_CreateChn(VO_CHN VoChn, const VO_CHN_ATTR_S *pstAttr);
# VoChn 为 VO 通道号;pstAttr 为 VO 通道属性指针。
#使用示例:
RK_MPI_VO_CreateChn(VoChn.s32ChnId, &stVoAttr);
VENC
VENC 模块,即视频编码模块。本模块支持多路实时编码,且每路编码独立,编码协议和编码 profile 可以不同。支持视频编码同时,调度 Region 模块对编码图像内容进行叠加和遮挡。支持 H264/H265/MJPEG/JPEG 编码。

MPP_CHN_S stVenChn;							#定义模块设备通道结构体
stVenChn.enModId = RK_ID_VENC;					#模块号设置为 RK_ID_VENC
stVenChn.s32ChnId								#编码通道号
memset(&venc_chn_attr, 0, sizeof(venc_chn_attr));

VENC_CHN_ATTR_S venc_chn_attr;				#定义 VENC 通道属性结构体
venc_chn_attr.stVencAttr.enType					#编码格式
venc_chn_attr.stVencAttr.imageType				#编码图片格式
venc_chn_attr.stVencAttr.u32PicWidth				#图片宽度
venc_chn_attr.stVencAttr.u32PicHeight			#图片高度
venc_chn_attr.stVencAttr.u32VirWidth				#图片虚宽
venc_chn_attr.stVencAttr.u32VirHeight			#图片虚高
venc_chn_attr.stVencAttr.u32Profile				#用于H264编码器的 Profile IDC 值
H264 或 H265 编码的参数参照以下配置

venc_chn_attr.stRcAttr.enRcMode									#编码协议类型 根据具体使用编码格式配置
venc_chn_attr.stRcAttr.stH264Cbr.u32Gop = fps;					# I 帧间隔,取值范围:[1, 65536]
venc_chn_attr.stRcAttr.stH264Cbr.u32BitRate =
    u32Width * u32Height * fps / 14;									#平均比特率,取值范围:[2000, 98000000],单位:bps
venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = 1;		#目标帧率分子
venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum = fps;	#目标帧率分母
venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = 1;		#数据源帧率分子
venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = fps;	#数据源帧率分母
创建 VENC 通道

#函数定义:
RK_S32 RK_MPI_VENC_CreateChn(VENC_CHN VeChn, VENC_CHN_ATTR_S *stVencChnAttr);
# VeChn 为编码通道号; stVencChnAttr 编码通道属性指针。
#使用示例:
RK_MPI_VENC_CreateChn(stVenChn.s32ChnId, &venc_chn_attr);
通道绑定
设置好通道属性之后就可以对通道进行绑定了。

数据源和数据接收者绑定接口如下:

RK_S32 RK_MPI_SYS_Bind(const MPP_CHN_S *pstSrcChn,const MPP_CHN_S *pstDestChn);
#pstSrcChn 为源通道指针; pstDestChn 目的通道指针。
注:通道绑定需要注意源通道的输出与目的通道的输入的数据格式要对应。

通道数据发送与获取
常用向指定通道输入数据函数如下:

RK_S32 RK_MPI_SYS_SendMediaBuffer(MOD_ID_E enModID, RK_S32 s32ChnID, MEDIA_BUFFER buffer);
# enModID 为模块号; s32ChnID 为通道号; buffer 为缓冲区。
常用向指定通道获取数据函数如下:

MEDIA_BUFFER RK_MPI_SYS_GetMediaBuffer(MOD_ID_E enModID, RK_S32 s32ChnID, RK_S32 s32MilliSec);
# enModID 为模块号; s32ChnID 为通道号; s32MilliSec 为阻塞等待时间,当该值为 -1 的时候表示阻塞等待。