Page 1 of 1

Luckfox Pico Ultra W (RV1106) VI bind VO Segmentation fault (core dumped)

Posted: 2025-10-30 8:41
by LJTY
我的开发板Luckfox Pico Ultra W(RV1106),我想通过 VI 绑定到 VO 将摄像头画面显示到480*854屏幕上。取帧转发的方式(先用 RK_MPI_VI_GetChnFrame 获取 VI帧,再用RK_MPI_VO_SendFrame 将VI帧发送给VO) 屏幕能正常显示摄像头画面,但占用CPU,所以 我想 通过 RK_MPI_SYS_Bind 将 VI直接绑定到VO,但是 执行到 RK_MPI_SYS_Bind时 就会报错Segmentation fault (core dumped),我在SDK中没找到VI bind VO 的示例代码,不知道是我的参数设置有问题,还是其他问题,具体情况如下:
我的代码 ( 通过 VI_bin_VO 来切换 取帧转发的方式 和 VI-bind-VI 方式)

Code: Select all

#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/poll.h>
#include <sys/prctl.h>
#include <time.h>
#include <unistd.h>

#include "rk_debug.h"
#include "rk_defines.h"
#include "rk_mpi_sys.h"
#include "rk_mpi_vi.h"
#include "rk_mpi_vo.h"

#include "sample_comm.h"

#define VI_bin_VO 1

static bool quit = false;
static	int u32Width = 480;    //1024;
static	int u32Height = 854;   //600; 
static	int s32chnlId = 0;
static	int VoLayer = 0;
static	int VoDev = 0;
static	int VoChn = 0;
static	ROTATION_E VoRotation = ROTATION_90;

static void sigterm_handler(int sig) {
	fprintf(stderr, "signal %d\n", sig);
	quit = true;
}

static void *GetMediaBuffer0_thread(void *arg) {
	printf("========%s========\n", __func__);
    // prctl(PR_SET_NAME, "RkipcSendJPEG", 0, 0, 0);
    prctl(PR_SET_NAME, __func__, 0, 0, 0);
	int s32Ret;
	RK_S32 waitTime = 1000;
	int pipeId = 0;
	VIDEO_FRAME_INFO_S stViFrame;

	while (!quit) {
		s32Ret = RK_MPI_VI_GetChnFrame(pipeId, s32chnlId, &stViFrame, waitTime);
		if (s32Ret == RK_SUCCESS) {
			s32Ret = RK_MPI_VO_SendFrame(VoLayer, VoChn, &stViFrame, -1);
            if (s32Ret != RK_SUCCESS) {
				RK_LOGE("%s RK_MPI_VO_SendFrame fail 0x%X", __func__, s32Ret);
			}
			// 7.release the frame
			s32Ret = RK_MPI_VI_ReleaseChnFrame(pipeId, s32chnlId, &stViFrame);
			if (s32Ret != RK_SUCCESS) {
				RK_LOGE("%s RK_MPI_VI_ReleaseChnFrame fail 0x%X", __func__, s32Ret);
			}
		} else {
			RK_LOGE("%s RK_MPI_VI_GetChnFrame timeout 0x%X", __func__, s32Ret);
		}
	}
	return NULL;
}


// demo板dev默认都是0,根据不同的channel 来选择不同的vi节点
int vi_dev_init() {
	printf("%s\n", __func__);
	int ret = 0;
	int devId = 0;
	int pipeId = devId;

	VI_DEV_ATTR_S stDevAttr;
	VI_DEV_BIND_PIPE_S stBindPipe;
	memset(&stDevAttr, 0, sizeof(stDevAttr));
	memset(&stBindPipe, 0, sizeof(stBindPipe));
	// 0. get dev config status
	ret = RK_MPI_VI_GetDevAttr(devId, &stDevAttr);
	if (ret == RK_ERR_VI_NOT_CONFIG) {
		// 0-1.config dev
		ret = RK_MPI_VI_SetDevAttr(devId, &stDevAttr);
		if (ret != RK_SUCCESS) {
			printf("RK_MPI_VI_SetDevAttr %x\n", ret);
			return -1;
		}
	} else {
		printf("RK_MPI_VI_SetDevAttr already\n");
	}
	// 1.get dev enable status
	ret = RK_MPI_VI_GetDevIsEnable(devId);
	if (ret != RK_SUCCESS) {
		// 1-2.enable dev
		ret = RK_MPI_VI_EnableDev(devId);
		if (ret != RK_SUCCESS) {
			printf("RK_MPI_VI_EnableDev %x\n", ret);
			return -1;
		}
		// 1-3.bind dev/pipe
		stBindPipe.u32Num = 1;
		stBindPipe.PipeId[0] = pipeId;
		ret = RK_MPI_VI_SetDevBindPipe(devId, &stBindPipe);
		if (ret != RK_SUCCESS) {
			printf("RK_MPI_VI_SetDevBindPipe %x\n", ret);
			return -1;
		}
	} else {
		printf("RK_MPI_VI_EnableDev already\n");
	}

	return 0;
}

int vi_chn_init(int channelId, int width, int height) {
	int ret;
	int buf_cnt = 2;
	// VI init
	VI_CHN_ATTR_S vi_chn_attr;
	memset(&vi_chn_attr, 0, sizeof(vi_chn_attr));
	vi_chn_attr.stIspOpt.u32BufCount = buf_cnt;
	// vi_chn_attr.stIspOpt.enMemoryType = VI_V4L2_MEMORY_TYPE_DMABUF; // VI_V4L2_MEMORY_TYPE_MMAP;
	vi_chn_attr.stIspOpt.enMemoryType = VI_V4L2_MEMORY_TYPE_MMAP; // VI_V4L2_MEMORY_TYPE_MMAP;
	vi_chn_attr.stSize.u32Width = width;
	vi_chn_attr.stSize.u32Height = height;
	vi_chn_attr.enPixelFormat = RK_FMT_YUV420SP;
	vi_chn_attr.enCompressMode = COMPRESS_MODE_NONE;
	vi_chn_attr.u32Depth = 2; //0, get fail, 1 - u32BufCount, can get, if bind to other device, must be < u32BufCount
	ret = RK_MPI_VI_SetChnAttr(0, channelId, &vi_chn_attr);
	ret |= RK_MPI_VI_EnableChn(0, channelId);
	if (ret) {
		printf("ERROR: create VI error! ret=%d\n", ret);
		return ret;
	}

	return ret;
}

static int vo_init(int VoLayer, int VoDev, int VoChn, int width, int height, ROTATION_E rotation) {
	int ret = RK_SUCCESS;
	VO_PUB_ATTR_S            stVoPubAttr;
	VO_VIDEO_LAYER_ATTR_S    stLayerAttr;
	VO_CHN_ATTR_S            stChnAttr;

	ret = RK_MPI_VO_BindLayer(VoLayer, VoDev, VO_LAYER_MODE_VIDEO);
	if (ret != RK_SUCCESS) {
		RK_LOGE("%s RK_MPI_VO_BindLayer failed, ret = 0x%X", __func__, ret);
		return ret;
	}

	memset(&stVoPubAttr, 0, sizeof(VO_PUB_ATTR_S));
	memset(&stLayerAttr, 0, sizeof(VO_VIDEO_LAYER_ATTR_S));
	memset(&stChnAttr, 0, sizeof(VO_CHN_ATTR_S));

	stVoPubAttr.enIntfType = VO_INTF_DEFAULT;
	stVoPubAttr.enIntfSync = VO_OUTPUT_DEFAULT;

	ret = RK_MPI_VO_SetPubAttr(VoDev, &stVoPubAttr);
	if (ret != RK_SUCCESS) {
		RK_LOGE("%s RK_MPI_VO_SetPubAttr failed, ret = 0x%X", __func__, ret);
		return ret;
	}

	ret = RK_MPI_VO_Enable(VoDev);
	if (ret != RK_SUCCESS) {
		RK_LOGE("%s RK_MPI_VO_Enable failed, ret = 0x%X", __func__, ret);
		return ret;
	}

	/* Enable Layer */
	stLayerAttr.enPixFormat      = RK_FMT_RGB888;  
	stLayerAttr.enCompressMode   = COMPRESS_AFBC_16x16;
	// stLayerAttr.enPixFormat      = RK_FMT_YUV420SP;
	// stLayerAttr.enCompressMode   = COMPRESS_MODE_NONE;
	stLayerAttr.stDispRect.s32X  = 0;
	stLayerAttr.stDispRect.s32Y  = 0;
	stLayerAttr.stDispRect.u32Width   = width;
	stLayerAttr.stDispRect.u32Height  = height;
	stLayerAttr.stImageSize.u32Width  = width;
	stLayerAttr.stImageSize.u32Height = height;
	stLayerAttr.u32DispFrmRt          = 25;

	ret = RK_MPI_VO_SetLayerAttr(VoLayer, &stLayerAttr);
	if (ret != RK_SUCCESS) {
		RK_LOGE("%s RK_MPI_VO_SetLayerAttr failed, ret = 0x%X", __func__, ret);
		return ret;
	}

	RK_MPI_VO_SetLayerSpliceMode(VoLayer, VO_SPLICE_MODE_RGA);

	ret = RK_MPI_VO_EnableLayer(VoLayer);
	if (ret != RK_SUCCESS) {
		RK_LOGE("%s RK_MPI_VO_EnableLayer failed, ret = 0x%X", __func__, ret);
		return ret;
	}

	stChnAttr.stRect.s32X = 0;
	stChnAttr.stRect.s32Y = 0;
	stChnAttr.stRect.u32Width = width;
	stChnAttr.stRect.u32Height = height;
	stChnAttr.u32FgAlpha = 255;
	stChnAttr.u32BgAlpha = 0;
	stChnAttr.enMirror = MIRROR_NONE;
	// stChnAttr.enRotation = ROTATION_90;
	stChnAttr.enRotation = rotation;
	stChnAttr.u32Priority = 1;

	ret = RK_MPI_VO_SetChnAttr(VoLayer, VoChn, &stChnAttr);
	if (ret != RK_SUCCESS) {
		RK_LOGE("%s RK_MPI_VO_SetChnAttr failed, ret = 0x%X", __func__, ret);
		return ret;
	}

	ret = RK_MPI_VO_EnableChn(VoLayer, VoChn);
	if (ret != RK_SUCCESS) {
		RK_LOGE("%s RK_MPI_VO_EnableChn failed, ret = 0x%X", __func__, ret);
		return ret;
	}

	RK_LOGI("%s Create vo [dev: %d, layer: %d, chn: %d] success!", __func__, VoDev, VoLayer, VoChn);
	return ret;
}

static int vo_deinit(int VoLayer, int VoDev, int VoChn) {
	int ret = 0;

	ret = RK_MPI_VO_DisableChn(VoLayer, VoChn);
	if (ret != RK_SUCCESS) {
		RK_LOGE("%s RK_MPI_VO_DisableChn failed, ret = 0x%X", __func__, ret);
		return ret;
	}

	ret = RK_MPI_VO_DisableLayer(VoLayer);
	if (ret != RK_SUCCESS) {
		RK_LOGE("%s RK_MPI_VO_DisableLayer failed, ret = 0x%X", __func__, ret);
		return ret;
	}

	ret = RK_MPI_VO_Disable(VoDev);
	if (ret != RK_SUCCESS) {
		RK_LOGE("%s RK_MPI_VO_Disable failed, ret = 0x%X", __func__, ret);
		return ret;
	}

	ret = RK_MPI_VO_UnBindLayer(VoLayer, VoDev);
	if (ret != RK_SUCCESS) {
		RK_LOGE("%s RK_MPI_VO_UnBindLayer failed, ret = 0x%X", __func__, ret);
		return ret;
	}

	RK_MPI_VO_CloseFd();

	RK_LOGE("%s Destroy vo [dev: %d, layer: %d, chn: %d] success!", __func__, VoDev, VoLayer, VoChn);
	return ret;
}


static RK_CHAR optstr[] = "?::w:h:I:l:d:r:";
static void print_usage(const RK_CHAR *name) {
	printf("usage example:\n");
	printf("\t%s simple_vi_get_frame_send_vo  -w 1024 -h 600 -I 0 -l 0 -d 0\n", name);
	printf("\t-w | --width: VI width, Default:1920\n");
	printf("\t-h | --heght: VI height, Default:1080\n");
	printf("\t-I | --camid: camera ctx id, Default 0. "
	       "0:rkisp_mainpath,1:rkisp_selfpath,2:rkisp_bypasspath\n");
	printf("\t-l | --layer: Vo layer, Default 0. ");
	printf("\t-d | --device: Vo device, Default 0. ");
	printf("\t-r | --device: Vo device rotation, Default 0. ");
}

// /oem/usr/bin/simple_vi_get_frame_send_vo_rv1106 -w 480 -h 854 -I 0 -l 0 -d 0
// ./luckfox_pico_rtsp_yolov5 -w 480 -h 854 -I 0 -l 0 -d 0
// ./luckfox_pico_rtsp_yolov5 -r 1

int main(int argc, char *argv[]) {
	RK_S32 s32Ret = RK_FAILURE;
	MPP_CHN_S stSrcChn, stVoChn;
	int c;
	int ret = -1;
	while ((c = getopt(argc, argv, optstr)) != -1) {
		switch (c) {
		case 'w':
			u32Width = atoi(optarg);
			break;
		case 'h':
			u32Height = atoi(optarg);
			break;
		case 'I':
			s32chnlId = atoi(optarg);
			break;
		case 'l':
			VoLayer = atoi(optarg);
			break;
		case 'd':
			VoDev = atoi(optarg);
			break;
		case 'r':
			VoRotation = (ROTATION_E)atoi(optarg);
			break;
		case '?':
		default:
			print_usage(argv[0]);
			return -1;
		}
	}

	printf("#Resolution: %dx%d\n", u32Width, u32Height);
	printf("#CameraIdx: %d\n\n", s32chnlId);
	printf("#Vo Layer: %d\n\n", VoLayer);
	printf("#Vo Devices: %d\n\n", VoDev);

	signal(SIGINT, sigterm_handler);

    // rkaiq init
    RK_BOOL multi_sensor = RK_FALSE;	
    const char *iq_dir = "/etc/iqfiles";
    rk_aiq_working_mode_t hdr_mode = RK_AIQ_WORKING_MODE_NORMAL;
    SAMPLE_COMM_ISP_Init(0, hdr_mode, multi_sensor, iq_dir);
    SAMPLE_COMM_ISP_Run(0);

	if (RK_MPI_SYS_Init() != RK_SUCCESS) {
		RK_LOGE("rk mpi sys init fail!");
		goto __FAILED;
	}

	vi_dev_init();
	vi_chn_init(s32chnlId, u32Width, u32Height);
	s32Ret = vo_init(VoLayer, VoDev, VoChn, u32Width, u32Height, VoRotation);
	// s32Ret = vo_init(VoLayer, VoDev, VoChn, u32Height, u32Width, VoRotation);
	if (s32Ret != RK_SUCCESS) {
		printf("vo[%d:%d:%d:%dx%d r%d] init failed 0x%X", VoLayer, VoDev, VoChn, u32Height, u32Width, (int)VoRotation *90,  s32Ret);
		goto __FAILED;
	}

	// VI → VO 
	stSrcChn.enModId = RK_ID_VI;
	stSrcChn.s32DevId = 0;
	stSrcChn.s32ChnId = s32chnlId;

	stVoChn.enModId = RK_ID_VO;
    stVoChn.s32DevId = 0;
    stVoChn.s32ChnId = VoChn;

#if VI_bin_VO
	printf("====RK_MPI_SYS_Bind VI[0] to VO[0]====\n");
	s32Ret = RK_MPI_SYS_Bind(&stSrcChn, &stVoChn);
	printf("====bind ret 0x%X====\n", s32Ret);
	if (s32Ret != RK_SUCCESS) {
		printf("VI[0] bind VO[0] ch failed 0x%X", s32Ret);
		goto __FAILED;
	}
	printf("====bind OK====\n");
#else
	pthread_t main_tid;
	pthread_create(&main_tid, NULL, GetMediaBuffer0_thread, NULL);
#endif

	while (!quit) {
		usleep(50000);
	}

#if not VI_bin_VO
	pthread_join(main_tid, NULL);
#endif

	s32Ret = RK_MPI_SYS_UnBind(&stSrcChn, &stVoChn);
	if (s32Ret != RK_SUCCESS) {
		printf("RK_MPI_SYS_UnBind fail %x", s32Ret);
	}

	s32Ret = RK_MPI_VI_DisableChn(0, s32chnlId);
	printf("%s RK_MPI_VI_DisableChn 0x%X", __func__, s32Ret);

	s32Ret = RK_MPI_VI_DisableDev(0);
	printf("%s RK_MPI_VI_DisableDev 0x%X", __func__, s32Ret);

	vo_deinit(VoLayer, VoDev, VoChn);
	ret = 0;
__FAILED:
	printf("test running exit:%d", s32Ret);
	RK_MPI_SYS_Exit();

	return ret;
}


在 Luckfox Pico Ultra W(RV1106)上执行输出

Code: Select all

[root@luckfox luckfox_pico_rtsp_yolov5_demo]# ./luckfox_pico_rtsp_yolov5 
#Resolution: 480x854
#CameraIdx: 0

#Vo Layer: 0

#Vo Devices: 0

rkaiq log level ff1
XCORE:K:rk_aiq_init_lib, ISP HW ver: 32
XCORE:K:
************************** VERSION INFOS **************************
version release date: 2024-2-18
         AIQ:       AIQ v5.0x5.0

git logs:
25bd14e RV1106: smart_door: release rga/isp/mpp for V1.3.0
99d080a RV1106/RV1103: Battery/Doorbell: release kmpp/rockit-ko for V1.3.2
6458e2a RV1106/RV1103: Battery/Doorbell: release kmpp/rockit-ko for V1.3.1
e8dab39 RV1106: CVR: release rga/isp/mpp for V1.1.0
a021b32 RV1106/RV1103: Battery/Doorbell: release kmpp/rockit-ko for V1.3.0

************************ VERSION INFOS END ************************

ID: 0, sensor_name is m00_f_gc2053 4-0037, iqfiles is /etc/iqfiles
XCORE:K:rk_aiq_uapi_sysctl_preInit_devBufCnt: dev_ent:rkraw_rx, buf_cnt:2
IPCSERVER:K:cid[0] Process path:/tmp/UNIX.domain0, sockfd:13
XCORE:K:cid[0] rk_aiq_uapi_sysctl_init success. iq:/etc/iqfiles/gc2053_CMK-OT2274-V10_28IRC-F20.json
CAMHW:E:failed to set hdr mode 0
XCORE:K:cid[0] rk_aiq_uapi_sysctl_prepare success. mode:0 
rk_aiq_uapi2_sysctl_init/prepare succeed
CAMHW:K:cid[0] start success. isGroup:0, isOnline:1, isMultiIsp:0, init_ens:0x1bfc8ffc473b
XCORE:K:cid[0] rk_aiq_uapi_sysctl_start success.
rk_aiq_uapi2_sysctl_start succeed
rockit log path (null), log_size = 0, can use export rt_log_path=, export rt_log_size= change
log_file = (nil) 
RTVersion        13:46:17-188 {dump              :064} ---------------------------------------------------------
RTVersion        13:46:17-190 {dump              :065} rockit version: git-4720dc10a Tue Apr 30 15:47:55 2024 +0800
RTVersion        13:46:17-191 {dump              :066} rockit building: built- 2024-04-30 15:54:26
RTVersion        13:46:17-192 {dump              :067} ---------------------------------------------------------
(null)           13:46:17-192 {log_level_init    :207} 

 please use echo name=level > /tmp/rt_log_level set log level 
        name: all cmpi mb sys vdec venc rgn vpss vgs tde avs wbc vo vi ai ao aenc adec
        log_level: 0 1 2 3 4 5 6 

rockit default level 4, can use export rt_log_level=x, x=0,1,2,3,4,5,6 change
(null)           13:46:17-193 {read_log_level    :098} text is all=4
(null)           13:46:17-194 {read_log_level    :100} module is all, log_level is 4
vi_dev_init
(null)           13:46:17-200 {monitor_log_level :149} #Start monitor_log_level thread, arg:(nil)
RKViDev          13:46:17-202 {vi_set_dev_attr   :612} VI_DEV_ATTR_S all parameter reserved
RTIsp3x          13:46:17-204 {ispInitDevice     :591} sensor name = m00_f_gc2053 4-0037
RTDeviceSensorV4 13:46:17-241 {ispOpenDevice     :502} v4l2_open(/dev/video0), handler=45
RTDeviceSensorV4 13:46:17-242 {ispOpenDevice     :502} v4l2_open(/dev/v4l-subdev2), handler=47
RTDeviceSensorV4 13:46:17-242 {close             :112} do RTDeviceSensorV4L2 close
RTDeviceSensorV4 13:46:17-253 {close             :112} do RTDeviceSensorV4L2 close
RKViChn          13:46:17-254 {prepareRuntime    :354} ---------------------------------------------------------
RKViChn          13:46:17-254 {prepareRuntime    :356} vi version: 1.22, name:vvi
RKViChn          13:46:17-257 {prepareRuntime    :357} rockit-ko version: vmpi:28ee389dbc33
RKViChn          13:46:17-258 {prepareRuntime    :358} rockit-ko building: -2024-05-24-18:15:06
RKViChn          13:46:17-259 {prepareRuntime    :359} ---------------------------------------------------------
cmpi             13:46:17-260 {prepareRuntime    :378} mb pool create success, MBCnt= 2
RTIsp3x          13:46:17-261 {ispInitDevice     :591} sensor name = m00_f_gc2053 4-0037
cmpi             13:46:17-283 {createRuntime     :634} >>>>>>>>> Sensor link info dump: <<<<<<<<<
cmpi             13:46:17-283 {createRuntime     :636}   vicap media name           : /dev/media0
cmpi             13:46:17-284 {createRuntime     :637}   vicap model name           : rkcif-mipi-lvds
cmpi             13:46:17-284 {createRuntime     :638}   camera id                  : 0
cmpi             13:46:17-285 {createRuntime     :639}   sensor name                : m00_f_gc2053 4-0037
cmpi             13:46:17-285 {createRuntime     :641}   stream_cif_mipi_id0 video name: /dev/video0
cmpi             13:46:17-286 {createRuntime     :642}   stream_cif_mipi_id1 video name: /dev/video1
cmpi             13:46:17-286 {createRuntime     :643}   stream_cif_mipi_id2 video name: /dev/video2
cmpi             13:46:17-287 {createRuntime     :644}   stream_cif_mipi_id3 video name: /dev/video3
cmpi             13:46:17-287 {createRuntime     :646}   sensor raw width           : 1920
cmpi             13:46:17-287 {createRuntime     :647}   sensor raw height          : 1080
cmpi             13:46:17-288 {createRuntime     :648} ---------------------------------------------------------
cmpi             13:46:17-288 {createRuntime     :654}   isp media name           : /dev/media1
cmpi             13:46:17-289 {createRuntime     :655}   isp model name           : rkisp0
cmpi             13:46:17-289 {createRuntime     :656}   isp driver name          : rkisp-vir0
cmpi             13:46:17-289 {createRuntime     :657}   isp dev name             : /dev/v4l-subdev3
cmpi             13:46:17-290 {createRuntime     :659}   isp rawrd0_m_path        : /dev/video17
cmpi             13:46:17-290 {createRuntime     :660}   isp rawrd1_l_path        : 
cmpi             13:46:17-290 {createRuntime     :661}   isp rawrd2_s_path        : /dev/video18
cmpi             13:46:17-290 {createRuntime     :664}   mainpath video name      : /dev/video11
cmpi             13:46:17-291 {createRuntime     :665}   selfpath video name      : /dev/video12
cmpi             13:46:17-291 {createRuntime     :666}   bypasspath video name    : /dev/video13
cmpi             13:46:17-291 {createRuntime     :667}   sensor link type         : 2
cmpi             13:46:17-291 {createRuntime     :668}   sensor is united         : 0
cmpi             13:46:17-291 {createRuntime     :672} ---------------------------------------------------------
cmpi             13:46:17-291 {createRuntime     :711} [non-WRAP MODE]: buff size = 622080
cmpi             13:46:17-292 {open              :869} use mmap memory the node_buff_type:0 must be extern(1)!
RTIsp3x          13:46:17-294 {ispInitDevice     :591} sensor name = m00_f_gc2053 4-0037
RTDeviceV4L2     13:46:17-316 {open              :137} cameraIndex:0, entityName:rkisp_mainpath
RTDeviceV4L2     13:46:17-316 {open              :143} open video name(/dev/video11)
RKViChn          13:46:17-317 {setFrameRate      :1469} [vi] dev(0) ch(0) illegal param s32SrcFrameRate(0) s32DstFrameRate(0)
RTDeviceV4L2     13:46:17-318 {ispCameraInfo     :567} current device:/dev/video11 isn't compatible(cap:0x84201000) device,memoryType:1, retry:0
RTDeviceV4L2     13:46:17-318 {ispInitFormat     :767} ioctl VIDIOC_S_FMT OK
cmpi             13:46:17-319 {start             :1093} =========== vi Start startRuntime ===========
RTDeviceV4L2     13:46:17-319 {ispStreamOn       :458} do ispStreamOn start
CAMHW:K:camId:0, notify_isp_stream_status on
RTDeviceV4L2     13:46:17-473 {ispStreamOn       :511} do ispStreamOn done
=== 0 ===
=== 1 ===
mpi_vo           13:46:17-709 {vo_init           :071} find a plane type = 1, index = 0, zpos = 0
get a connect id = 70 ,type = 17, type_id = 1, encoder_type = 8
drm_output_create crtc id 66
mpi_vo           13:46:17-711 {RK_MPI_VO_Enable  :369} Vodev 0 enable ok
cmpi             13:46:17-713 {vo_init           :219} vo_init Create vo [dev: 0, layer: 0, chn: 0] success!
====RK_MPI_SYS_Bind VI[0] to VO[0]====
Segmentation fault (core dumped)
[root@luckfox luckfox_pico_rtsp_yolov5_demo]# 

Re: Luckfox Pico Ultra W (RV1106) VI bind VO Segmentation fault (core dumped)

Posted: 2025-11-01 3:20
by Crocodile
您好,RKMPI 库的文档没有提到绑定VI 和 VO的用法,VI 代表的输入设备占用的CMA和VO代表的输出设备占用的CMA不是同一个,能绑定的组件都是用RKMPI内存缓冲池的,基于 VI 的那个CMA