2021-07-23 编译 rv1126 手动编译 extra

2023-11-22 14:50
文章标签 编译 23 手动 2021 07 rv1126 extra

本文主要是介绍2021-07-23 编译 rv1126 手动编译 extra,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1/
在这里插入图片描述

2/lpthread rk_leasymedia 库要添加到 lib gcc
库接口复制到源码目录

在这里插入图片描述

3/官方源码

// Copyright 2020 Fuzhou Rockchip Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.#include <assert.h>
#include <fcntl.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>#include <pthread.h>//#include "common/sample_common.h"
#include "rkmedia_api.h"
#include "rkmedia_venc.h"static bool quit = false;// 信号处理程序
static void sigterm_handler(int sig)
{
fprintf(stderr, "signal %d\n", sig);
quit = true;
}// 图像数据处理线程
static void *GetMediaBuffer(void *arg)
{
RGA_CHN rga_chn = *(RGA_CHN *)arg;
char save_path[512];//
printf("#Start %s thread, rga_chn:%d\n", __func__, rga_chn);
sprintf(save_path, "/userdata/output_%d.nv12", rga_chn);
//
FILE *save_file = fopen(save_path, "w");
if (!save_file)printf("ERROR: Open %s failed!\n", save_path);MEDIA_BUFFER mb = NULL;
int save_cnt = 0;
int recv_len;
while (!quit)
{mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_RGA, rga_chn, 50);if (!mb){if (!quit){continue;}printf("chn-%d:RK_MPI_SYS_GetMediaBuffer get null buffer!\n", rga_chn);break;}recv_len = RK_MPI_MB_GetSize(mb);printf("Get Frame-chn-%d:ptr:%p, fd:%d, size:%zu, mode:%d, channel:%d, ""timestamp:%lld\n",rga_chn,RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetFD(mb), recv_len,RK_MPI_MB_GetModeID(mb), RK_MPI_MB_GetChannelID(mb),RK_MPI_MB_GetTimestamp(mb));if (save_file && (save_cnt < 1)){int rtn = fwrite(RK_MPI_MB_GetPtr(mb), 1, recv_len, save_file);fsync(fileno(save_file));printf("#Save frame-chn-%d:%d to %s, rtn = %d\n", rga_chn, save_cnt, save_path, rtn);save_cnt++;}RK_MPI_MB_ReleaseBuffer(mb);
}if (save_file)fclose(save_file);
printf("%s-chn-%d - exit\r\n", __func__, rga_chn);return NULL;
}//
int main(){
int ret = -1;
//
VI_PIPE vi_pipe_0 = 0;
VI_CHN vi_chn_1 = 1;
//
RGA_CHN rga_chn_0 = 0;
RGA_CHN rga_chn_1 = 1;
RGA_CHN rga_chn_2 = 2;// 初始化mpi sys
RK_MPI_SYS_Init();//
// 数据源,ISP20的输出:
// rkispp_m_bypass, 不支持设置分辨率,不支持缩放,         NV12/NV16/YUYV/FBC0/FBC2
// rkispp_scale0,   max width: 3264,最大支持 8 倍缩放, NV12/NV16/YUYV
// rkispp_scale1,   max width: 1280,最大支持 8 倍缩放, NV12/NV16/YUYV
// rkispp_scale2,   max width: 1280,最大支持 8 倍缩放, NV12/NV16/YUYV
//
VI_CHN_ATTR_S vi_chn_attr;
vi_chn_attr.pcVideoNode = "rkispp_scale0";
vi_chn_attr.u32BufCnt = 4;
vi_chn_attr.u32Width = 1920;
vi_chn_attr.u32Height = 1080;
vi_chn_attr.enPixFmt = IMAGE_TYPE_NV12;
vi_chn_attr.enWorkMode = VI_WORK_MODE_NORMAL;
//
ret = RK_MPI_VI_SetChnAttr(vi_pipe_0, vi_chn_1, &vi_chn_attr);
ret |= RK_MPI_VI_EnableChn(vi_pipe_0, vi_chn_1);
if (ret)
{printf("Create vi[%d] failed! ret=%d\n", vi_chn_1, ret);return -1;
}//
// 源数据配置
//
MPP_CHN_S stSrcChn;
stSrcChn.enModId = RK_ID_VI;
stSrcChn.s32DevId = vi_pipe_0;
stSrcChn.s32ChnId = vi_chn_1;//
// 输出-0
// 格式转换 IMAGE_TYPE_NV12 -> IMAGE_TYPE_YUV420P
//
RGA_ATTR_S stRgaAttr_0;
stRgaAttr_0.bEnBufPool = RK_TRUE;
stRgaAttr_0.u16BufPoolCnt = 4;
stRgaAttr_0.u16Rotaion = 0;
stRgaAttr_0.stImgIn.u32X = 0;
stRgaAttr_0.stImgIn.u32Y = 0;
stRgaAttr_0.stImgIn.imgType = IMAGE_TYPE_NV12;
stRgaAttr_0.stImgIn.u32Width = 1920;
stRgaAttr_0.stImgIn.u32Height = 1080;
stRgaAttr_0.stImgIn.u32HorStride = 1920;
stRgaAttr_0.stImgIn.u32VirStride = 1080;
stRgaAttr_0.stImgOut.u32X = 0;
stRgaAttr_0.stImgOut.u32Y = 0;
stRgaAttr_0.stImgOut.imgType = IMAGE_TYPE_YUV420P;
stRgaAttr_0.stImgOut.u32Width = 1920;
stRgaAttr_0.stImgOut.u32Height = 1080;
stRgaAttr_0.stImgOut.u32HorStride = 1920;
stRgaAttr_0.stImgOut.u32VirStride = 1080;
//
ret = RK_MPI_RGA_CreateChn(rga_chn_0, &stRgaAttr_0);
if (ret)
{printf("Create rga[%d] falied! ret=%d\n", rga_chn_0, ret);goto EXIT_0;
}pthread_t read_thread_0;
pthread_create(&read_thread_0, NULL, GetMediaBuffer, &rga_chn_0);//
MPP_CHN_S stDestChn_0;
stDestChn_0.enModId = RK_ID_RGA;
stDestChn_0.s32DevId = 0;
stDestChn_0.s32ChnId = rga_chn_0;
//
ret = RK_MPI_SYS_Bind(&stSrcChn, &stDestChn_0);
if (ret)
{printf("Bind vi[1] and rga[%d] failed! ret=%d\n", rga_chn_0, ret);goto EXIT_1;
}//
// 输出-1
// 旋转 270 度
// 缩放 1920 -> 960
// 缩放 1080 -> 544
// 格式转换 IMAGE_TYPE_NV12 -> IMAGE_TYPE_YUV420P
//
RGA_ATTR_S stRgaAttr_1;
stRgaAttr_1.bEnBufPool = RK_TRUE;
stRgaAttr_1.u16BufPoolCnt = 4;
stRgaAttr_1.u16Rotaion = 270;
stRgaAttr_1.stImgIn.u32X = 0;
stRgaAttr_1.stImgIn.u32Y = 0;
stRgaAttr_1.stImgIn.imgType = IMAGE_TYPE_NV12;
stRgaAttr_1.stImgIn.u32Width = 1920;
stRgaAttr_1.stImgIn.u32Height = 1080;
stRgaAttr_1.stImgIn.u32HorStride = 1920;
stRgaAttr_1.stImgIn.u32VirStride = 1080;
stRgaAttr_1.stImgOut.u32X = 0;
stRgaAttr_1.stImgOut.u32Y = 0;
stRgaAttr_1.stImgOut.imgType = IMAGE_TYPE_YUV420P;
stRgaAttr_1.stImgOut.u32Width = 544;
stRgaAttr_1.stImgOut.u32Height = 960;
stRgaAttr_1.stImgOut.u32HorStride = 544;
stRgaAttr_1.stImgOut.u32VirStride = 960;
//
ret = RK_MPI_RGA_CreateChn(rga_chn_1, &stRgaAttr_1);
if (ret)
{printf("Create rga[%d] falied! ret=%d\n", rga_chn_1, ret);goto EXIT_2;
}pthread_t read_thread_1;
pthread_create(&read_thread_1, NULL, GetMediaBuffer, &rga_chn_1);//
MPP_CHN_S stDestChn_1;
stDestChn_1.enModId = RK_ID_RGA;
stDestChn_1.s32DevId = 0;
stDestChn_1.s32ChnId = rga_chn_1;
//
ret = RK_MPI_SYS_Bind(&stSrcChn, &stDestChn_1);
if (ret)
{printf("Bind vi[1] and rga[%d] failed! ret=%d\n", rga_chn_1, ret);goto EXIT_3;
}//
// 输出-2
// 裁剪 1920 -> 1000, 取中间部分
// 裁剪 1080 -> 800, 取中间部分
// 格式转换 IMAGE_TYPE_NV12 -> IMAGE_TYPE_YUV420P
//
RGA_ATTR_S stRgaAttr_2;
stRgaAttr_2.bEnBufPool = RK_TRUE;
stRgaAttr_2.u16BufPoolCnt = 4;
stRgaAttr_2.u16Rotaion = 0;
stRgaAttr_2.stImgIn.u32X = 460;
stRgaAttr_2.stImgIn.u32Y = 140;
stRgaAttr_2.stImgIn.imgType = IMAGE_TYPE_NV12;
stRgaAttr_2.stImgIn.u32Width = 1000;
stRgaAttr_2.stImgIn.u32Height = 800;
stRgaAttr_2.stImgIn.u32HorStride = 1920;
stRgaAttr_2.stImgIn.u32VirStride = 1080;
stRgaAttr_2.stImgOut.u32X = 0;
stRgaAttr_2.stImgOut.u32Y = 0;
stRgaAttr_2.stImgOut.imgType = IMAGE_TYPE_YUV420P;
stRgaAttr_2.stImgOut.u32Width = 1000;
stRgaAttr_2.stImgOut.u32Height = 800;
stRgaAttr_2.stImgOut.u32HorStride = 1000;
stRgaAttr_2.stImgOut.u32VirStride = 800;
//
ret = RK_MPI_RGA_CreateChn(rga_chn_2, &stRgaAttr_2);
if (ret)
{printf("Create rga[%d] falied! ret=%d\n", rga_chn_2, ret);goto EXIT_4;
}pthread_t read_thread_2;
pthread_create(&read_thread_2, NULL, GetMediaBuffer, &rga_chn_2);//
MPP_CHN_S stDestChn_2;
stDestChn_2.enModId = RK_ID_RGA;
stDestChn_2.s32DevId = 0;
stDestChn_2.s32ChnId = rga_chn_2;
//
ret = RK_MPI_SYS_Bind(&stSrcChn, &stDestChn_2);
if (ret)
{printf("Bind vi[1] and rga[%d] failed! ret=%d\n", rga_chn_2, ret);goto EXIT_5;
}//
// 监听退出信号
//
printf("%s initial finish\n", __func__);
signal(SIGINT, sigterm_handler);//
// 等待退出信号
while (!quit)
{usleep(100);
}//
// 退出
//
ret = 0;EXIT_6:
RK_MPI_SYS_UnBind(&stSrcChn, &stDestChn_2);
EXIT_5:
RK_MPI_RGA_DestroyChn(rga_chn_2);
EXIT_4:
RK_MPI_SYS_UnBind(&stSrcChn, &stDestChn_1);
EXIT_3:
RK_MPI_RGA_DestroyChn(rga_chn_1);
EXIT_2:
RK_MPI_SYS_UnBind(&stSrcChn, &stDestChn_0);
EXIT_1:
RK_MPI_RGA_DestroyChn(rga_chn_0);
EXIT_0:
RK_MPI_VI_DisableChn(vi_pipe_0, vi_chn_1);return ret;
}

5/运行正常

在这里插入图片描述

这篇关于2021-07-23 编译 rv1126 手动编译 extra的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码

Golang test编译使用

创建文件my_test.go package testsimport "testing"func TestMy(t *testing.T) {t.Log("TestMy")} 通常用法: $ go test -v -run TestMy my_test.go=== RUN TestMyTestMy: my_test.go:6: TestMy--- PASS: TestMy (0.

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

07 v-if和v-show使用和区别

划重点: v-ifv-show 小葱拌豆腐 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="

C++/《C/C++程序编译流程》

程序的基本流程如图:   1.预处理        预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。 读取C/C++源程序,对其中的伪指令(以#开头的指令)进行处理将所有的“#define”删除,并且展开所有的宏定义处理所有的条件编译指令,如:“#if”、“

2021-8-14 react笔记-2 创建组件 基本用法

1、目录解析 public中的index.html为入口文件 src目录中文件很乱,先整理文件夹。 新建components 放组件 新建assets放资源   ->/images      ->/css 把乱的文件放进去  修改App.js 根组件和index.js入口文件中的引入路径 2、新建组件 在components文件夹中新建[Name].js文件 //组件名首字母大写

2021-08-14 react笔记-1 安装、环境搭建、创建项目

1、环境 1、安装nodejs 2.安装react脚手架工具 //  cnpm install -g create-react-app 全局安装 2、创建项目 create-react-app [项目名称] 3、运行项目 npm strat  //cd到项目文件夹    进入这个页面  代表运行成功  4、打包 npm run build