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

news2024/9/20 22:46:58

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2079370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CMake之PUBLIC、PRIVATE、INTERFACE

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~ 个人主页&#xff1a; rainInSunny | 个人专栏&#xff1a; C那些事儿、 Qt那些事儿 文章目录 写在前面抽象版解释头文件和链接库传递测试代码结构PUBLIC传递PRIVATE传递INTERFACE传递 写在前面 使用CMake必然离不开target_include_dir…

LVGL从SD卡读取图片并显示到MCU LCD屏详细笔记教程

1、前言 在上一篇LVGL专题文章中已经讲解了如何将LVGL与FatFs链接起来&#xff0c;实现LVGL对SD卡中的数据进行读写操作。本文在上一文的基础上&#xff0c;将实现LVGL读取文件系统中的图片文件&#xff08;BMP、PNG、JPG&#xff09;&#xff0c;并显示到MCU设备中的LCD屏中。…

转行软件测试必需要知道的知识

1前言 随着现在互联网行业的迅猛发展&#xff0c;越来越多的人想涌入进来&#xff0c;因为大家都觉得IT行业工资高&#xff0c;做测试门槛又低&#xff0c;是的&#xff0c;入门门槛确实比较低&#xff0c;但是要做好的话&#xff0c;还是有点难的&#xff0c;毕竟术业有专攻嘛…

网约车资格证考试攻略(必备宝典)

考试分数详情及攻略如下&#xff1a; 一、理论部分&#xff1a;&#xff08;电脑操作&#xff0c;鼠标勾选&#xff09; 1、全国试题&#xff0c;满分50分&#xff0c;40分过关&#xff0c;每位学员要练习到45分才行&#xff1b; 2、地方试题&#xff0c;满分25分&#xff0c…

Vue3源码调试-第三篇

前言 上两篇已经调试完packages/runtime-dom/src/index.ts下的createApp函数的第一行了&#xff0c;接下来我们看下一行 injectNativeTagCheck 首先说下这个__DEV__估计也是定义在dev.js下&#xff0c;又或者是哪里的&#xff0c;这里控制台输出是true&#xff0c;那我估计是…

Nginx: 代理场景下Nginx接收用户请求包体的处理

Nginx 反向代理图 当用户发过来一个request body的时候&#xff0c;Nginx 是如何处理这样一个body这个body 它对应的就是我们客户请求的一些具体内容 1 &#xff09;proxy_request_bufering 指令 接收包体的两种方式 接收完全部包体再发送一边接收包体一边发送 接收包体的两种…

前端项目部署到服务器上(nginx)

我这个之前已经部署过项目&#xff0c;所以要进行这个操作 docker imagedocker rm -f nginx //用于强制删除名为“nginx”的容器docker ps //用于列出当前正在运行的Docker容器docker volume -fdocker volume prune //用于删除所有未使用的Docker数据卷&#xff0c;‌释放存…

day11JS-面向对象和js中的设计模式

1. 面向对象 1.1 什么是面向对象 面向对象是一种编程思想&#xff0c;JS就是基于这个思想构建出来的一门编程语言&#xff0c;所以JS中存在对象、类、实例的概念。 对象&#xff1a;万物皆对象。 构造函数&#xff08;类&#xff09;&#xff1a;把具有某一特征的内容可以划分…

穿梭虚实之间:3DGS与NeRF如何辅助机器人遥控操作?

导读&#xff1a; 本研究介绍了一种用于机器人遥控操作的新型辐射场可视化技术&#xff0c;研究者提出了一种在线训练辐射场的方法&#xff0c;能够实时从多个摄像头获取数据&#xff0c;支持多种辐射方法&#xff0c;包括NeRF和3DGS。该系统与现有的ROS遥控操作系统集成&#…

惠海H6501 DCDC降压恒压ic 60V72V80V100V转24V36V48V实地架构低功耗 仪表仪器供电 兼容XX9487

H6501是一款高压降压型开关稳压器&#xff0c;可输出高达1A的持续电流至负载。它集成了一个 高压高端MOSFET&#xff0c;提供2.5A的典型峰值电流限。其4.5V至48V的宽输入电压范围可适用于各种降压应用&#xff0c;是汽车、工业和照明应用的理想之选。采用滞环电压控制模式&…

行为识别实战第二天——Yolov5+SlowFast+deepsort: Action Detection(PytorchVideo)

Yolov5SlowFastdeepsort 一、简介 YoloV5SlowFastDeepSort 是一个结合了目标检测、动作识别和目标跟踪技术的视频处理框架。这一集成系统利用了各自领域中的先进技术&#xff0c;为视频监控、体育分析、人机交互等应用提供了一种强大的解决方案。 1. 组件说明&#xff1a; Y…

golang笔记——Go堆内存管理

前言 本文主要记录个人学习Golang堆内存管理&#xff0c;涉及到的相关内容&#xff0c;算是对个人所学知识点的梳理与总结。从非常宏观的角度看&#xff0c;Go的堆内存管理就是下图这个样子 学习内存管理&#xff0c;肯定首先需要了解内存管理的基本知识&#xff0c;我会按照 内…

C++笔记10•容器适配器:stackqueue priority_queue•

从C中看stack&queue&priority_queue 1.stack的介绍 官方stack实现&#xff1a; 本质是一个数组 1. stack 是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack 是作为容器适…

【C/C++】typedef用法

typedef用法讲解&#xff0c;时隔半年&#xff0c;再看typedef。 &#x1f381;typedef可以简化结构体关键字 #include<iostream> using namespace std;struct Person {char name[64];int age; };void test01() {struct Person p { "张三",18 };//不用type…

【设计模式-代理】

定义 代理模式是一种结构型设计模式&#xff0c;它提供了对象的替代者或占位符&#xff0c;用来控制对这个对象的访问。通过代理模式&#xff0c;一个类可以代表另一个类来执行某些操作。这种模式常用于增强对象的功能或控制对对象的访问。 特点 控制访问&#xff1a;代理模…

day01 1.c++对c的扩充

#include <iostream>using namespace std;int main() {string s1;cout << "请输入一个字符串&#xff1a;";getline(cin,s1);int count10,count20,count30,count40;int len s1.length();for(int i0;i<len;i){if((s1[i]>a&&s1[i]<z) ||…

BeanPostProcessor和Ordered

1. 概述 BeanPostProcessor 和 Ordered 接口用于在Spring容器初始化Bean的过程中进行自定义处理&#xff0c;并控制处理顺序 2. BeanPostProcessor BeanPostProcessor 接口允许你在Spring容器初始化Bean的前后对Bean进行自定义处理。它有两个方法&#xff1a; postProcessB…

zabbix对接Grafana

1.grafana安装 Download Grafana | Grafana Labs sudo yum install -y https://dl.grafana.com/oss/release/grafana-11.1.4-1.x86_64.rpm 2.zabbix插件安装 Grafana 默认并没有 zabbix 数据源的支持&#xff0c;只有安装了zabbix插件&#xff0c;才可以在grafana中添加zabbi…

峟思固定测斜仪的工作原理与应用

固定测斜仪作为一种精密的测量仪器&#xff0c;在地质工程、土木工程、矿山安全等领域中发挥着至关重要的作用。它通过测量土体或岩体内部的水平位移&#xff0c;为工程安全监测提供了可靠的数据支持。本文将详细介绍固定测斜仪的工作原理、结构组成以及其在实际应用中的表现。…

一文读懂 DDD领域驱动设计

DDD&#xff08;Domain-Driven Design&#xff0c;领域驱动设计&#xff09;是一种软件开发方法&#xff0c;它强调软件系统设计应该以问题领域为中心&#xff0c;而不是技术实现为主导。DDD通过一系列手段如统一语言、业务抽象、领域划分和领域建模等来控制软件复杂度&#xf…