Skip to content

rv1126使用rockit的mpi问题 #1

@jiale-gdyd

Description

@jiale-gdyd

[RKMEDIA][SYS][Info]:text is all=3
[RKMEDIA][SYS][Info]:module is all, log_level is 3
[New LWP 672]
[ 2945.879077] pgd = bda53909
[ 2945.879135] [00000000] *pgd=2d73a835, pte=00000000, ppte=00000000
[ 2945.879172] CPU: 1 PID: 669 Comm: rvrpem_rockit Tainted: G W O 4.19.111 #32
[ 2945.879193] Hardware name: Generic DT based system
[ 2945.879210] PC is
Thread 1 "rvrpem_rockit" received signal SIGSEGV, Segmentaation fault.
t 0x9be60494
[ 2945.879222] LR is at 0x9be602c0
[ 2945.879233] pc : [<9be60494>] lr : [<9be602c0>] psr: 600b0010
[ 2945.879246] sp : aec08a88 ip : 9c06ed94 fp : 00000000
[ 2945.879258] r10: a6fb0000 r9 : 00000000 r8 : 00000000
[ 2945.879273] r7 : aec08acc r6 : 00000000 r5 : 00000000 r4 : 00000000
[ 2945.879286] r3 : 00000000 r2 : 00000000 r1 : aec08acc r0 : 00000000
[ 2945.879300] Flags: nZCv IRQs on FIQs on Mode USER_32 ISA ARM Segment user
[ 2945.879314] Control: 10c5387d Table: 2ca1406a DAC: 00000055
[ 2945.879332] CPU: 1 PID: 669 Comm: rvrpem_rockit Tainted: G W O 4.19.111 #32
[ 2945.879343] Hardware name: Generic DT based system
[ 2945.879379] [] (unwind_backtrace) from [] (show_stack+0x10/0x14)
[ 2945.879411] [] (show_stack) from [] (dump_stack+0x90/0xa4)
[ 2945.879436] [] (dump_stack) from [] (__do_user_fault+0x130/0x134)
[ 2945.879460] [] (__do_user_fault) from [] (do_page_fault+0x240/0x348)
[ 2945.879483] [] (do_page_fault) from [] (do_DataAbort+0x4c/0xec)
[ 2945.879512] [] (do_DataAbort) from [] (__dabt_usr+0x3c/0x40)
[ 2945.879527] Exception stack(0xee903fb0 to 0xee903ff8)
[ 2945.879544] 3fa0: 00000000 aec08acc 00000000 00000000
[ 2945.879561] 3fc0: 00000000 00000000 00000000 aec08acc 00000000 00000000 a6fb0000 00000000
[ 2945.879577] 3fe0: 9c06ed94 aec08a88 9be602c0 9be60494 600b0010 ffffffff
0x9be60494 in vi_set_dev_attr () from /usr/lib/librockit.so
(gdb)
(gdb) bt
#0 0x9be60494 in vi_set_dev_attr () from /usr/lib/librockit.so
#1 0x00071d94 in rv11xx_rockit_vi_main(int, char
) ()
#2 0x9a49b4e4 in __libc_start_main () from /lib/libc.so.6
#3 0x0001816c in _start () at ../sysdeps/arm/start.S:124
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb)

很简单的源码:
int rv11xx_rockit_vi_main(int argc, char *argv[])
{
int ret = 0;
int devId = 0;
int chnId = 1;
int loopCount = 0;
int waitTime = 33;
VI_FRAME_S stViFrame;
VI_CHN_ATTR_S stViChnAttr;
VI_DEV_ATTR_S stViDevAttr;
VI_CHN_STATUS_S stViChnStatus;
VI_DEV_BIND_PIPE_S stViBindPipe;

if (RK_MPI_SYS_Init() != RK_SUCCESS) {
    return -1;
}

// 0.获取设备配置状态
ret = RK_MPI_VI_GetDevAttr(devId, &stViDevAttr);
if (ret == RK_ERR_VI_NOT_CONFIG) {
    // 0-1.配置设备
    ret = RK_MPI_VI_SetDevAttr(devId, &stViDevAttr);
    if (ret != RK_SUCCESS) {
        goto FAILED_EXIT;
    }
} else {
    printf("RK_MPI_VI_SetDevAttr already\n");
}

// 1.获取设备使能状态
ret = RK_MPI_VI_GetDevIsEnable(devId);
if (ret != RK_SUCCESS) {
    // 1-2.使能设备
    ret = RK_MPI_VI_EnableDev(devId);
    if (ret != RK_SUCCESS) {
        goto FAILED_EXIT;
    }

    // 1-3.绑定设备管道
    stViBindPipe.u32Num = devId;
    stViBindPipe.PipeId[0] = devId;
    ret = RK_MPI_VI_SetDevBindPipe(devId, &stViBindPipe);
    if (ret != RK_SUCCESS) {
        goto FAILED_EXIT;
    }
} else {
    printf("RK_MPI_VI_EnableDev already\n");
}

// 2.配置通道
strcpy(stViChnAttr.stIspOpt.aEntityName, "/dev/video0");
stViChnAttr.stIspOpt.u32BufCount = 3;
stViChnAttr.stIspOpt.enMemoryType = VI_V4L2_MEMORY_TYPE_MMAP;
stViChnAttr.u32Depth = 2;
stViChnAttr.enPixelFormat = RK_FMT_YUV420SP;
stViChnAttr.stFrameRate.s32SrcFrameRate = -1;
stViChnAttr.stFrameRate.s32DstFrameRate = -1;
stViChnAttr.stSize.u32Width = 1280;
stViChnAttr.stSize.u32Height = 720;
ret = RK_MPI_VI_SetChnAttr(devId, chnId, &stViChnAttr);
if (ret != RK_SUCCESS) {
    goto FAILED_EXIT;
}

// 3.使能通道
ret = RK_MPI_VI_EnableChn(devId, chnId);
if (ret != RK_SUCCESS) {
    goto FAILED_EXIT;
}

while (loopCount < 100) {
    // 5.获取帧
    ret = RK_MPI_VI_GetChnFrame(devId, chnId, &stViFrame, waitTime);
    if (ret == RK_SUCCESS) {
        void *data = RK_MPI_MB_Handle2VirAddr(stViFrame.pMbBlk);
        printf("loop:[%03d], seq:[%d], pts:[%lld]ms\n", loopCount, stViFrame.s32Seq, stViFrame.s64PTS / 1000);

        // 6.获取通道状态
        ret = RK_MPI_VI_QueryChnStatus(devId, chnId, &stViChnStatus);
        printf("return:[%d], w:[%d], h:[%d], state:[%d], lost:[%d], frameRate:[%d], vbfail:[%d]\n", ret,
            stViChnStatus.stSize.u32Width, stViChnStatus.stSize.u32Height, stViChnStatus.bEnable,
            stViChnStatus.u32LostFrame, stViChnStatus.u32FrameRate, stViChnStatus.u32VbFail);

        // 7.释放帧
        ret = RK_MPI_VI_ReleaseChnFrame(devId, chnId, &stViFrame);
        if (ret != RK_SUCCESS) {
            printf("RK_MPI_VI_ReleaseChnFrame failed, return:[%d]\n", ret);
        }

        loopCount++;
    } else {
        printf("RK_MPI_VI_GetChnFrame failed, timeout, return[%d]\n", ret);
    }

    usleep(10 * 1000);
}

// 8.停止通道
ret = RK_MPI_VI_DisableChn(devId, chnId);
// 9.停止设备
ret = RK_MPI_VI_DisableDev(devId);

FAILED_EXIT:
RK_MPI_SYS_Exit();
return ret;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions