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

相关文章

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index

C++工程编译链接错误汇总VisualStudio

目录 一些小的知识点 make工具 可以使用windows下的事件查看器崩溃的地方 dumpbin工具查看dll是32位还是64位的 _MSC_VER .cc 和.cpp 【VC++目录中的包含目录】 vs 【C/C++常规中的附加包含目录】——头文件所在目录如何怎么添加,添加了以后搜索头文件就会到这些个路径下搜索了 include<> 和 include"" WinMain 和

C/C++的编译和链接过程

目录 从源文件生成可执行文件(书中第2章) 1.Preprocessing预处理——预处理器cpp 2.Compilation编译——编译器cll ps:vs中优化选项设置 3.Assembly汇编——汇编器as ps:vs中汇编输出文件设置 4.Linking链接——链接器ld 符号 模块,库 链接过程——链接器 链接过程 1.简单链接的例子 2.链接过程 3.地址和

Windwos +vs 2022 编译openssl 1.0.2 库

一 前言 先说 结论,编译64位报错,查了一圈没找到解决方案,最后换了32位的。 使用qt访问web接口,因为是https,没有openssl库会报错 QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());if (reply){if (reply->error() == QNetworkReply::NoError

青龙面板2.9之Cdle傻妞机器人编译教程

看到有的朋友对傻妞机器人感兴趣,这里写一下傻妞机器人的编译教程。 第一步,这里以linux amd64为例,去官网下载安装go语言安装包: 第二步,输入下方指令 cd /usr/local && wget https://golang.google.cn/dl/go1.16.7.linux-amd64.tar.gz -O go1.16.7.linux-amd64.tar.gz

开启青龙 Ninja 扫码功能失效后修改成手动填写CK功能【修正Ninja拉库地址】

国内:进入容器docker exec -it qinglong bash #获取ninjagit clone -b main https://ghproxy.com/https://github.com/wjx0428/ninja.git /ql/ninja#安装cd /ql/ninja/backend && pnpm install cp .env.example .env

ScrollView 非手动调用的方法

1. /**  *  非人为的时候调用这个方法  *  *  @param scrollView <#scrollView description#>  */ - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {           } 2.判断控制器的view是否加载过 [willShowVC

iOS:编译时出现no such file or directory:xxx以及use twice...filenames are used to distinguish private dec

简    注册  登录   添加关注 作者  婉卿容若 2016.04.29 11:22 写了21870字,被16人关注,获得了14个喜欢 iOS:编译时出现"no such file or directory:xxx"以及"use twice...filenames are used to distinguish private

Java的简易编译命令

生成jar包 编译生成.class 文件 编译.class文件的命令,其中的参数是输出,原文件路径 javac -sourcepath class.class MyClass.java 如果有包名的需要创建对应包的文件夹,建文件移动对应的包名下在开始包下创建meta-inf文件夹在meta-inf文件下创建manifest.mf文件 生成可运行的jar包 解压 生成了jar包后,进

编译测试后出现“发现不明确的匹配”错误

原文链接:http://blog.163.com/zhaoyanping_1125/blog/static/201329153201204218533/ 错误提示: 【“/”应用程序中的服务器错误。  分析器错误 说明: 在分析向此请求提供服务所需资源时出错。请检查下列特定分析错误详细信息并适当地修改源文件。  分析器错误信息: 发现不明确的匹配。】   这个问题发生原因一般情况是