Skip to content

rv1126使用rockit的mpi问题 #1

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;
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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