20240827让飞凌的OK3588-C核心板在Linux R4下通过rockit工具的VI功能获取SONY索尼8530机芯的YUV图

本文主要是介绍20240827让飞凌的OK3588-C核心板在Linux R4下通过rockit工具的VI功能获取SONY索尼8530机芯的YUV图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

20240827让飞凌的OK3588-C核心板在Linux R4下通过rockit工具的VI功能获取SONY索尼8530机芯的YUV图
2024/8/27 19:40


缘起,我司使用飞凌的OK3588-C的核心板,系统是Linux R4版本。
机芯选用SONY索尼的HDMI OUT接口的8530,输出格式有BGR3/NV16。
我司选用NV16格式了。

由于代理商不给力,让我们直接找Rockchip原厂了。
当然,他们也怕在转达信息的过程中丢失了信息/失真导致更大的问题呀!^_
打深圳前台077586690899,转工程师,问题号#501046

然后Rockchip原厂的深圳办竟然没有HDMI OUT的机芯。
不过回复说Rockchip原厂什么样的场景都见过,HDMI OUT的相机肯定对接过。
让他们先用笔记本电脑的HDMI OUT模拟机芯测试,实在不行,我这里打车送过去了。
都在科技园,不太远的!

Z:\repo_RK3588_Buildroot20240508\external\rockit\mpi\example\mod\test_mpi_vi.cpp
千辛万苦编译了Rockit/VI,但是运行有问题。
Rockchip原厂提供了Demo.c,但是运行也有问题!
Rockchip原厂给人有点不是那么靠谱的感觉!

#if 1

#include <stdio.h>
#include <sys/poll.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
#include <time.h>
#include <cstring>
#include <cstdlib>


#include "rk_defines.h"
#include "rk_debug.h"
#include "rk_mpi_vi.h"
#include "rk_mpi_mb.h"
#include "rk_mpi_sys.h"
#include "rk_mpi_venc.h"
#include "rk_mpi_vpss.h"
#include "rk_mpi_vo.h"
#include "rk_mpi_rgn.h"
#include "rk_common.h"
#include "rk_comm_rgn.h"
#include "rk_comm_vi.h"
#include "rk_comm_vo.h"
#include "test_common.h"
#include "test_comm_utils.h"
#include "test_comm_argparse.h"
#include "rk_mpi_cal.h"
#include "rk_mpi_mmz.h"

static RK_S32 g_s32FrameCnt = -1;
static bool quit = false;

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

RK_U64 TEST_COMM_GetNowUs() {
    struct timespec time = {0, 0};
    clock_gettime(CLOCK_MONOTONIC, &time);
    return (RK_U64)time.tv_sec * 1000000 + (RK_U64)time.tv_nsec / 1000; /* microseconds */
}

static void *GetMediaBuffer0(void *arg) {
    printf("========%s========\n", __func__);
    int loopCount = 0;
    int s32Ret;
    RK_S32 waitTime = 330;
    int pipeId = 0;
    int channelId = 0;
    channelId = *(int *)arg;
    VIDEO_FRAME_INFO_S stViFrame;
    VI_CHN_STATUS_S stChnStatus;

    while (!quit) {
        s32Ret = RK_MPI_VI_GetChnFrame(pipeId, channelId, &stViFrame, waitTime);
        if (s32Ret == RK_SUCCESS) {
            RK_U64 nowUs = TEST_COMM_GetNowUs();
            void *data = RK_MPI_MB_Handle2VirAddr(stViFrame.stVFrame.pMbBlk);
            RK_LOGD("RK_MPI_VI_GetChnFrame ok:data %p loop:%d seq:%d pts:%lld ms len=%d", data, loopCount,
                             stViFrame.stVFrame.u32TimeRef, stViFrame.stVFrame.u64PTS / 1000, stViFrame.stVFrame.u64PrivateData);
            // 6.get the channel status
            s32Ret = RK_MPI_VI_QueryChnStatus(pipeId, channelId, &stChnStatus);
            RK_LOGD("RK_MPI_VI_QueryChnStatus ret %x, w:%d,h:%d,enable:%d," \
                            "current frame id:%d,input lost:%d,output lost:%d," \
                            "framerate:%d,vbfail:%d delay=%lldus",
                             s32Ret,
                             stChnStatus.stSize.u32Width,
                             stChnStatus.stSize.u32Height,
                             stChnStatus.bEnable,
                             stChnStatus.u32CurFrameID,
                             stChnStatus.u32InputLostFrame,
                             stChnStatus.u32OutputLostFrame,
                             stChnStatus.u32FrameRate,
                             stChnStatus.u32VbFail,
                             nowUs - stViFrame.stVFrame.u64PTS);

            // 7.release the frame
            s32Ret = RK_MPI_VI_ReleaseChnFrame(pipeId, channelId, &stViFrame);
            if (s32Ret != RK_SUCCESS) {
                RK_LOGE("RK_MPI_VI_ReleaseChnFrame fail %x", s32Ret);
            }
            loopCount++;
        } else {
            RK_LOGE("RK_MPI_VI_GetChnFrame timeout %x", s32Ret);
        }

        if ((g_s32FrameCnt >= 0) && (loopCount > g_s32FrameCnt))
        {
            quit = true;
            break;
        }

    }

    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 = pipeId;
        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;
    int buf_cnt = 5;

    // 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;
    // timeout
    vi_chn_attr.enAllocBufType = VI_ALLOC_BUF_TYPE_EXTERNAL;
    vi_chn_attr.stIspOpt.enMemoryType = VI_V4L2_MEMORY_TYPE_MMAP;//VI_V4L2_MEMORY_TYPE_MMAP;
    //vi_chn_attr.stIspOpt.bNoUseLibV4L2 = TRUE;

    vi_chn_attr.stSize.u32Width = width;
    vi_chn_attr.stSize.u32Height = height;
    //vi_chn_attr.enPixelFormat = RK_FMT_BGR888;
    vi_chn_attr.enPixelFormat = RK_FMT_YUV422SP;

    vi_chn_attr.enCompressMode = COMPRESS_MODE_NONE; // COMPRESS_AFBC_16x16;
    vi_chn_attr.u32Depth = 2;
    memcpy(vi_chn_attr.stIspOpt.aEntityName, "/dev/video8", strlen("/dev/video8"));
    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 RK_CHAR optstr[] = "?::w:h:c:I:o:";
static void print_usage(const RK_CHAR *name) {
    printf("usage example:\n");
    printf("\t%s -I 0 -w 1920 -h 1080 -o /tmp/ \n", name);
    printf("\t-w | --width: VI width, Default:1920\n");
    printf("\t-h | --heght: VI height, Default:1080\n");
    printf("\t-c | --frame_cnt: frame number of output, Default:-1\n");
    printf("\t-I | --camid: camera ctx id, Default 0. 0:rkisp_mainpath,1:rkisp_selfpath,2:rkisp_bypasspath\n");
    printf("\t-o | --output path, Default:NULL (folder path:/tmp)\n");
}

int main(int argc, char *argv[])
{
    RK_S32 s32Ret = RK_FAILURE;
    RK_U32 u32Width = 1920;
    RK_U32 u32Height = 1080;
    RK_S32 s32chnlId = 0;
    int c;
    VI_SAVE_FILE_INFO_S stDebugFile;
    RK_CHAR *pOutPath = NULL;

    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 'c':
        g_s32FrameCnt = atoi(optarg);
            break;
        case 'o':
            pOutPath = optarg;
            break;
        case '?':
        default:
            print_usage(argv[0]);
            return 0;
        }
    }

    printf("#Resolution: %dx%d\n", u32Width, u32Height);
    printf("#Output Path: %s\n", pOutPath);
    printf("#CameraIdx: %d\n\n", s32chnlId);
    printf("#Frame Count to save: %d\n", g_s32FrameCnt);

    signal(SIGINT, sigterm_handler);

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

    if (pOutPath) {
        stDebugFile.bCfg = RK_TRUE;
        strcpy(stDebugFile.aFilePath, pOutPath);
        snprintf(stDebugFile.aFileName, sizeof(stDebugFile.aFileName), "test_%d.yuv",s32chnlId);
        RK_MPI_VI_ChnSaveFile(0, s32chnlId, &stDebugFile);
    }

    pthread_t main_thread;
    pthread_create(&main_thread, NULL, GetMediaBuffer0, &s32chnlId);

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

    s32Ret = RK_MPI_VI_DisableChn(0, s32chnlId);
    RK_LOGE("RK_MPI_VI_DisableChn %x", s32Ret);

    s32Ret = RK_MPI_VI_DisableDev(0);
    RK_LOGE("RK_MPI_VI_DisableDev %x", s32Ret);

__FAILED:
    RK_LOGE("test running exit:%d", s32Ret);
    RK_MPI_SYS_Exit();

    return 0;
}


#endif
 


【增加的文件】
Z:\repo_RK3588_Buildroot20240508\external\rockit\cross.cmake
cmake_minimum_required(VERSION 3.5.1)

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_C_COMPILER "/home/forlinx/aarch64-buildroot-linux-gnu_sdk-buildroot/bin/aarch64-buildroot-linux-gnu-gcc")
SET(CMAKE_CXX_COMPILER "/home/forlinx/aarch64-buildroot-linux-gnu_sdk-buildroot/bin/aarch64-buildroot-linux-gnu-g++")
set(CMAKE_SYSTEM_PROCESSOR aarch64)


编译指令:
forlinx@ubuntu20:~/RK3588_LV198_repo20240508/external/rockit/build$ cmake -DCMAKE_TOOLCHAIN_FILE=../cross.cmake ..
forlinx@ubuntu20:~/RK3588_LV198_repo20240508/external/rockit/build$ make


提议:
原厂VI有更新吗?领导 想让我 送HDMI OUT的机芯去RK。万利达大厦?
1、Rockchip原厂是否在RK3588开发板上接HDMI OUT的机芯测试这个demo?
2、Rockchip有HDMI OUT的机芯吗?
把笔记本电脑的HDMI OUT接到RK3588的HDMI IN上。使用 这种方式也可以测试吧?


微调之后,程序终于可以取图了。
测试步骤:
1、给飞凌的OK3588-C核心板刷最新的Linux R4的固件。
2、替换/更新/补全Linux R4缺少/过时的so库文件。
3、将推送到/目录,准备执行。


so.bat
adb push libgraphic_lsf.so /usr/lib
adb push libpanoStitchApp.so /usr/lib
adb push librkgfx_avs.so /usr/lib
adb push libRkSwCac.so /usr/lib
adb push librockit.so /usr/lib
adb push librkAlgoDis.so /usr/lib
adb shell mkdir -p /app
adb push rk_mpi_vi_test /
adb shell chmod 777 rk_mpi_vi_test

库文件在Z:\repo_RK3588_Buildroot20240508\external\rockit\lib\lib64目录。
简单起见,可以使用adb将全部的文件都push到/usr/lib目录中。^_


执行:
root@ok3588:/# 
root@ok3588:/# ./rk_mpi_vi_test -w 3840 -h 2160 -I 0 -c 2 -o /app
#Resolution: 3840x2160
#Output Path: /app
#CameraIdx: 0

#Frame Count to save: 2
rk-debug -----------------------Graphics so version=4.25.11-----------------------------
rk-debug init version=4.25.11,args[16,16,0], threadId=548256207104
arm_release_ver of this libmali is 'g6p0-01eac0', rk_so_ver is '6'.
GL Version = OpenGL ES 3.2 v1.g6p0-01eac0.ba52c908d926792b8f5fe28f383a2b03
GL Vendor = ARM
GL Renderer = Mali-LODX
rk-debug setupGraphicsRenderInRGB1555YUVTarget [6,1,0,0] 
rk-debug setupGraphicsRenderInRGB888YUVTarget [9,1,0,-1] 
rk-debug os_memory_size=7
 rk-debug -----------------------Graphics so version=4.25.11-----------------------------
rk-debug init version=4.25.11,args[16,16,0], threadId=548136743168
GL Version = OpenGL ES 3.2 v1.g6p0-01eac0.ba52c908d926792b8f5fe28f383a2b03
GL Vendor = ARM
GL Renderer = Mali-LODX
rk-debug setupGraphicsRenderInRGB1555YUVTarget [6,1,0,0] 
rk-debug setupGraphicsRenderInRGB888YUVTarget [9,1,0,-1] 
rk-debug os_memory_size=7
 vi_dev_init
rockit log path (null), log_size = 0
log_file = (nil) 
RTVersion        00:28:06-097 {dump              :064} ---------------------------------------------------------
RTVersion        00:28:06-097 {dump              :065} rockit version: git-e5c70ee41 Fri Sep 15 09:17:17 2023 +0800
RTVersion        00:28:06-097 {dump              :066} rockit building: built-Chu 2023-09-15 11:40:17
RTVersion        00:28:06-097 {dump              :067} ---------------------------------------------------------
RKViChn          00:28:06-098 {setFrameRate      :621} [vi] dev(0) ch(0) illegal param s32SrcFrameRate(0) s32DstFrameRate(0)
Using mplane plugin for capture 
Using mplane plugin for capture 
RTDeviceV4L2     00:28:06-111 {commitMmapBuffer  :767} buf.type(1) buf.index(0) buf.memory(1) buf.m.planes(0) buf.length(16588800) mmapLength(16588800)
Using mplane plugin for capture 
RTDeviceV4L2     00:28:06-112 {commitMmapBuffer  :767} buf.type(1) buf.index(1) buf.memory(1) buf.m.planes(16588800) buf.length(16588800) mmapLength(16588800)
RTDeviceV4L2     00:28:06-113 {commitMmapBuffer  :767} buf.type(1) buf.index(2) buf.memory(1) buf.m.planes(33177600) buf.length(16588800) mmapLength(16588800)
RTDeviceV4L2     00:28:06-114 {commitMmapBuffer  :767} buf.type(1) buf.index(3) buf.memory(1) buf.m.planes(49766400) buf.length(16588800) mmapLength(16588800)
RTDeviceV4L2     00:28:06-115 {commitMmapBuffer  :767} buf.type(1) buf.index(4) buf.memory(1) buf.m.planes(66355200) buf.length(16588800) mmapLength(16588800)
RKALG-I: InsertExtraBackendCreator 3
RKALG-I: --s-- rk_swcac_loglevl_set()
========GetMediaBuffer0========
RTDeviceV4L2     00:28:06-376 {read              :295} tracebuffer(id=0, len=16588800, fd=0(18), pts=1686376 ms, time=1686376 ms) is received from isp
RTDeviceV4L2     00:28:06-376 {read              :297} Isp Frame Info:
        CamId:0, Seq:0, pts:(1686.488s)
RTIsp3x          00:28:06-497 {getIspStreamInfo  :342} request RKISP_CMD_GET_STREAM_INFO, err -1 : Invalid argument

RTIsp3x          00:28:06-532 {getIspStreamInfo  :342} request RKISP_CMD_GET_STREAM_INFO, err -1 : Invalid argument

RTIsp3x          00:28:06-565 {getIspStreamInfo  :342} request RKISP_CMD_GET_STREAM_INFO, err -1 : Invalid argument

RTDeviceV4L2     00:28:06-577 {invoke            :1057} unsupport command interrupt
RTDeviceV4L2     00:28:06-610 {invoke            :1057} unsupport command interrupt
cmpi             00:28:06-745 {main              :253} RK_MPI_VI_DisableChn 0
cmpi             00:28:06-745 {main              :256} RK_MPI_VI_DisableDev 0
cmpi             00:28:06-745 {main              :259} test running exit:0
rk-debug call distortionByGpuDeinit mInitSucee=1,threadId=548256207104
rk-debug GpuManage.refcnt=2
rk-debug call distortionByGpuDeinit mInitSucee=1,threadId=548136743168
rk-debug GpuManage.refcnt=1
rk-debug call destroyEGL 
root@ok3588:/# cd app
root@ok3588:/app# ls -l
total 48600
-rw-r--r-- 1 root root 49766400 Jan  1 08:28 test_0.yuv
root@ok3588:/app# 


通过adb pull拉去YUV文件到WIN11上。
D:\hdmi\20240508>adb pull /app/test_0.yuv
/app/test_0.yuv: 1 file pulled, 0 skipped. 10.8 MB/s (49766400 bytes in 4.403s)

D:\hdmi\20240508>


使用7YUV预览YUV图。
由于没有NV16这个选项,使用最接近的NV12选项,偏色了!


编译LOG:

[BEGIN] 2024/8/27 20:06:01
forlinx@ubuntu20:~/RK3588_LV198_repo20240508/external/rockit/build$ cmake -DCMAKE_TOOLCHAIN_FILE=../cross.cmake ..
-- The C compiler identification is GNU 10.3.0
-- The CXX compiler identification is GNU 10.3.0
-- Check for working C compiler: /home/forlinx/aarch64-buildroot-linux-gnu_sdk-buildroot/bin/aarch64-buildroot-linux-gnu-gcc
-- Check for working C compiler: /home/forlinx/aarch64-buildroot-linux-gnu_sdk-buildroot/bin/aarch64-buildroot-linux-gnu-gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /home/forlinx/aarch64-buildroot-linux-gnu_sdk-buildroot/bin/aarch64-buildroot-linux-gnu-g++
-- Check for working CXX compiler: /home/forlinx/aarch64-buildroot-linux-gnu_sdk-buildroot/bin/aarch64-buildroot-linux-gnu-g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
Build rockit mpi
-- Build WITH linker libs for Linux
-- Configuring done
-- Generating done
-- Build files have been written to: /home/forlinx/RK3588_LV198_repo20240508/external/rockit/build
forlinx@ubuntu20:~/RK3588_LV198_repo20240508/external/rockit/build$ 
forlinx@ubuntu20:~/RK3588_LV198_repo20240508/external/rockit/build$ 
forlinx@ubuntu20:~/RK3588_LV198_repo20240508/external/rockit/build$ 
forlinx@ubuntu20:~/RK3588_LV198_repo20240508/external/rockit/build$ make
Scanning dependencies of target rt_test_comm
[  3%] Building CXX object mpi/example/common/CMakeFiles/rt_test_comm.dir/test_comm_argparse.cpp.o
[  6%] Building CXX object mpi/example/common/CMakeFiles/rt_test_comm.dir/test_comm_utils.cpp.o
[  9%] Building CXX object mpi/example/common/CMakeFiles/rt_test_comm.dir/test_comm_bmp.cpp.o
[ 12%] Building CXX object mpi/example/common/CMakeFiles/rt_test_comm.dir/test_comm_imgproc.cpp.o
[ 16%] Building CXX object mpi/example/common/CMakeFiles/rt_test_comm.dir/test_comm_sys.cpp.o
[ 19%] Building CXX object mpi/example/common/CMakeFiles/rt_test_comm.dir/test_comm_vdec.cpp.o
[ 22%] Building CXX object mpi/example/common/CMakeFiles/rt_test_comm.dir/test_comm_vo.cpp.o
[ 25%] Building CXX object mpi/example/common/CMakeFiles/rt_test_comm.dir/test_comm_ao.cpp.o
[ 29%] Building CXX object mpi/example/common/CMakeFiles/rt_test_comm.dir/tmedia/test_comm_tmd.cpp.o
[ 32%] Building CXX object mpi/example/common/CMakeFiles/rt_test_comm.dir/test_mod_vpss.cpp.o
[ 35%] Linking CXX static library librt_test_comm.a
[ 35%] Built target rt_test_comm
Scanning dependencies of target rk_mpi_adec_test
[ 38%] Building CXX object mpi/example/mod/CMakeFiles/rk_mpi_adec_test.dir/test_mpi_adec.cpp.o
[ 41%] Linking CXX executable rk_mpi_adec_test
[ 41%] Built target rk_mpi_adec_test
Scanning dependencies of target rk_mpi_mb_test
[ 45%] Building CXX object mpi/example/mod/CMakeFiles/rk_mpi_mb_test.dir/test_mpi_mb.cpp.o
[ 48%] Linking CXX executable rk_mpi_mb_test
[ 48%] Built target rk_mpi_mb_test
Scanning dependencies of target rk_mpi_vdec_test
[ 51%] Building CXX object mpi/example/mod/CMakeFiles/rk_mpi_vdec_test.dir/test_mpi_vdec.cpp.o
[ 54%] Linking CXX executable rk_mpi_vdec_test
[ 54%] Built target rk_mpi_vdec_test
Scanning dependencies of target rk_mpi_ai_test
[ 58%] Building CXX object mpi/example/mod/CMakeFiles/rk_mpi_ai_test.dir/test_mpi_ai.cpp.o
[ 61%] Linking CXX executable rk_mpi_ai_test
[ 61%] Built target rk_mpi_ai_test
Scanning dependencies of target rk_mpi_aenc_test
[ 64%] Building CXX object mpi/example/mod/CMakeFiles/rk_mpi_aenc_test.dir/test_mpi_aenc.cpp.o
[ 67%] Linking CXX executable rk_mpi_aenc_test
[ 67%] Built target rk_mpi_aenc_test
Scanning dependencies of target rk_mpi_vi_test
[ 70%] Building CXX object mpi/example/mod/CMakeFiles/rk_mpi_vi_test.dir/test_mpi_vi.cpp.o
[ 74%] Linking CXX executable rk_mpi_vi_test
[ 74%] Built target rk_mpi_vi_test
Scanning dependencies of target rk_mpi_sys_test
[ 77%] Building CXX object mpi/example/mod/CMakeFiles/rk_mpi_sys_test.dir/test_mpi_sys.cpp.o
[ 80%] Linking CXX executable rk_mpi_sys_test
[ 80%] Built target rk_mpi_sys_test
Scanning dependencies of target rk_mpi_vo_test
[ 83%] Building CXX object mpi/example/mod/CMakeFiles/rk_mpi_vo_test.dir/test_mpi_vo.cpp.o
[ 87%] Linking CXX executable rk_mpi_vo_test
[ 87%] Built target rk_mpi_vo_test
Scanning dependencies of target rk_mpi_mmz_test
[ 90%] Building CXX object mpi/example/mod/CMakeFiles/rk_mpi_mmz_test.dir/test_mpi_mmz.cpp.o
[ 93%] Linking CXX executable rk_mpi_mmz_test
[ 93%] Built target rk_mpi_mmz_test
Scanning dependencies of target rk_mpi_avio_test
[ 96%] Building CXX object mpi/example/mod/CMakeFiles/rk_mpi_avio_test.dir/sys/test_sys_avio.cpp.o
[100%] Linking CXX executable rk_mpi_avio_test
[100%] Built target rk_mpi_avio_test
forlinx@ubuntu20:~/RK3588_LV198_repo20240508/external/rockit/build$ 
forlinx@ubuntu20:~/RK3588_LV198_repo20240508/external/rockit/build$ 
forlinx@ubuntu20:~/RK3588_LV198_repo20240508/external/rockit/build$ 
forlinx@ubuntu20:~/RK3588_LV198_repo20240508/external/rockit/build$ 

[END] 2024/8/27 20:06:45


参考资料:
https://blog.csdn.net/qq_36784503/article/details/130017082
rk3588 搭建交叉编译环境


https://blog.csdn.net/baoecit/article/details/139329587
瑞芯微 RK3588 环境搭建 SDK编译 编译指定模块


https://blog.csdn.net/zfenggo/article/details/138923252?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EYuanLiJiHua%7ECtr-1-138923252-blog-138996416.235%5Ev43%5Epc_blog_bottom_relevance_base7&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EYuanLiJiHua%7ECtr-1-138923252-blog-138996416.235%5Ev43%5Epc_blog_bottom_relevance_base7&utm_relevant_index=1

https://blog.csdn.net/zfenggo/article/details/138923252
rk3568 rockit编译测试


https://blog.csdn.net/Y1anH/article/details/138996416?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6-138996416-blog-137455250.235%5Ev43%5Epc_blog_bottom_relevance_base7&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6-138996416-blog-137455250.235%5Ev43%5Epc_blog_bottom_relevance_base7&utm_relevant_index=12

https://blog.csdn.net/Y1anH/article/details/138996416
RK3588S HDMI显示Camera ISP流方案


https://blog.csdn.net/Y1anH/article/details/137455250
RK356X rockit_mpi解析 (一)实现HDMI输出


https://blog.csdn.net/sinat_16643223/article/details/136230392?spm=1001.2101.3001.6650.17&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ECtr-17-136230392-blog-129932173.235%5Ev43%5Epc_blog_bottom_relevance_base7&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ECtr-17-136230392-blog-129932173.235%5Ev43%5Epc_blog_bottom_relevance_base7&utm_relevant_index=18

https://blog.csdn.net/sinat_16643223/article/details/136230392
RK3588S硬编码rtsp推流


https://huaweicloud.csdn.net/635639eed3efff3090b5b453.html
RK3588编译RKMPP库+编解码测试


https://blog.csdn.net/weixin_44710103/article/details/136626877
RK3588-hdmi in

这篇关于20240827让飞凌的OK3588-C核心板在Linux R4下通过rockit工具的VI功能获取SONY索尼8530机芯的YUV图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113455

相关文章

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念