瑞芯微rv1126 rtsp+mpp+rga取流
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
瑞芯微rv1126 rtsp+mpp+rga取流
- 一、mpp解码
- 二、rga转换
经过测试,使用rtsp+mpp+rga取流1920*1080图像一帧耗时60ms左右,基本可满足要求
一、mpp解码
void decoder_routine(QImage &img,bool &bOK)
{int ret;RK_U32 pkt_done = 0;// write data to packetmpp_packet_write(packet, 0, packet_buffer, packet_wpos);// reset pos and set valid lengthmpp_packet_set_pos(packet, packet_buffer);mpp_packet_set_length(packet, packet_wpos);
// printf("packet_wpos = :%d\n",packet_wpos);packet_wpos = 0;// setup eos flagif (pkt_eos)mpp_packet_set_eos(packet);do {RK_S32 times = 5;// send the packet first if packet is not doneif (!pkt_done){ret = mpi->decode_put_packet(ctx, packet);if (MPP_OK == ret)pkt_done = 1;}// then get all available frame and releasedo {RK_S32 get_frm = 0;RK_U32 frm_eos = 0;try_again:ret = mpi->decode_get_frame(ctx, &frame);if (MPP_ERR_TIMEOUT == ret) {if (times > 0) {times--;msleep(MPP_H264_DECODE_TIMEOUT);goto try_again;}mpp_err("decode_get_frame failed too much time\n");}if (MPP_OK != ret) {mpp_err("decode_get_frame failed ret %d\n", ret);break;}if (frame) {if (mpp_frame_get_info_change(frame)){RK_U32 width = mpp_frame_get_width(frame);RK_U32 height = mpp_frame_get_height(frame);RK_U32 hor_stride = mpp_frame_get_hor_stride(frame);RK_U32 ver_stride = mpp_frame_get_ver_stride(frame);mpp_log("decode_get_frame get info changed found\n");mpp_log("decoder require buffer w:h [%d:%d] stride [%d:%d]\n",width, height, hor_stride, ver_stride);ret = mpp_buffer_group_get_internal(&frm_grp,MPP_BUFFER_TYPE_DRM);if (ret) {mpp_err("get mpp buffer group failed ret %d\n", ret);break;}mpi->control(ctx, MPP_DEC_SET_EXT_BUF_GROUP, frm_grp);mpi->control(ctx, MPP_DEC_SET_INFO_CHANGE_READY, NULL);} else {RK_U32 err_info = mpp_frame_get_errinfo(frame) | mpp_frame_get_discard(frame);if (err_info) {frame_err++;mpp_log("decoder_get_frame get err info:%d discard:%d.\n",mpp_frame_get_errinfo(frame), mpp_frame_get_discard(frame));}else{/** Got a frame */timeval start,end;gettimeofday(&start,NULL);frame_out(img);bOK = true;gettimeofday(&end,NULL);float use_time = 1000*(end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec)/1000;qDebug() << "rgacvt use time ="<< use_time;static timeval last,now;gettimeofday(&now,NULL);float t = 1000*(now.tv_sec - last.tv_sec) + (now.tv_usec - last.tv_usec)/1000;printf("*******time******:%f\n",t);last = now;}}frm_eos = mpp_frame_get_eos(frame);mpp_frame_deinit(&frame);frame = NULL;get_frm = 1;}// if last packet is send but last frame is not found continueif (pkt_eos && pkt_done && !frm_eos) {msleep(MPP_H264_DECODE_TIMEOUT);qDebug() << "continue";continue;}if (frm_eos) {mpp_log("found last frame\n");break;}if (!get_frm)break;} while (1);if (pkt_done)break;/** why sleep here:* mpi->decode_put_packet will failed when packet in internal queue is* full,waiting the package is consumed .*/msleep(MPP_H264_DECODE_TIMEOUT);} while (1);
}void frame_out()
{// MppFrameFormat fmt = mpp_frame_get_fmt(frame);MppBuffer buff = mpp_frame_get_buffer(frame);
// size_t size = mpp_frame_get_buf_size(frame);RK_U32 h = mpp_frame_get_height(frame);RK_U32 w = mpp_frame_get_width(frame);FrameData *framedata = convertdata((char*)mpp_buffer_get_ptr(buff),w,h);if(framedata->data == nullptr){qDebug() << "frame->data = null";return;}
}
二、rga转换
char *dst_buf = nullptr;
char *dst_output_buf = nullptr;
char *dst_resize_output_buf = nullptr;// read frame
struct FrameData *convertdata(char *srcdata,int width, int height)
{FrameData * data = new FrameData();// rgarga_buffer_t src;rga_buffer_t dst;rga_buffer_t dst_output;rga_buffer_t dst_resize_output;try {// h264 16bit 1920 * 1080 == 1920 * 1088int size = 1920 * 1088* 1.5;printf("size = %d",size);if (size == 3133440 || size == 4177920 ){src = wrapbuffer_virtualaddr(srcdata, 1920, 1088, RK_FORMAT_YCrCb_420_SP);if (dst_buf == NULL){dst_buf = (char*)malloc(1920*1088*get_bpp_from_format(DST_FORMAT));}dst = wrapbuffer_virtualaddr(dst_buf, 1920, 1088, DST_FORMAT);if (dst_output_buf == NULL){dst_output_buf = (char*)malloc(1920*1080*get_bpp_from_format(DST_FORMAT));}dst_output = wrapbuffer_virtualaddr(dst_output_buf, 1920, 1080, DST_FORMAT);if (dst_resize_output_buf == NULL){dst_resize_output_buf = (char*)malloc(width*height*get_bpp_from_format(DST_FORMAT));}dst_resize_output = wrapbuffer_virtualaddr(dst_resize_output_buf, width, height, DST_FORMAT);if(src.width == 0 || dst.width == 0 || dst_output.width == 0){printf("%s, %s\n", __FUNCTION__, imStrError());// return data;}else{imcvtcolor(src, dst, src.format, dst.format);im_rect src_rect = {0, 0, 1920, 1080};imcrop(dst,dst_output,src_rect);imresize(dst_output,dst_resize_output);data->width = width;data->height = height;data->data = dst_resize_output_buf;data->size = width*height*get_bpp_from_format(DST_FORMAT);}}}catch (...){data->isRun = STATUS_DISCONNECT;data->size = 0;return data;}return data;}
瑞芯微rv1126 rtsp+mpp+rga取流相关推荐
- yolov5-5.0训练模型+瑞芯微rv1126上实现模型部署
yolov5-5.0训练模型+瑞芯微rv1126上实现模型部署 第一次接触模型训练和在开发板部署,过程曲折,从开始的一脸懵到最后模型部署成功,查阅了不少资料和学习了不少大佬的经验,在这里记录一下过 ...
- [基于瑞芯微RV1126调试RTL8818FU WIFI模组支持STA和AP模式]
基于瑞芯微RV1126调试RTL8818FU WIFI模组支持STA和AP模式 内核menuconfig配置 内核dts配置 文件系统配置和更改 驱动编译 wifi工具编译 libnl库编译 open ...
- 瑞芯微rv1126+yolov3模型转换
瑞芯微rv1126+yolov3模型转换 文章目录 瑞芯微rv1126+yolov3模型转换 环境准备 一.加载运行docker 1.安装 Docker 2. 加载镜像 二.转换步骤 1.下载yolo ...
- 瑞芯微RK3399交叉编译MPP
上一篇介绍了如何在ubuntu下搭建瑞芯微RK3399的检查编译环境,现在就要开始交叉编译MPP来进行对视频的硬编硬解. 这里RK3399用的aarch64架构芯片,上面跑的linux,如果编译and ...
- 瑞芯微RV1126/1109开发流程之模型转换
1.环境搭建(PC端ubuntu16.04搭建rknn环境) (1)安装anaconda环境(为了便于管理自己的环境建议安装,安装步骤请自行搜索,本人安装anaconda版本为Anaconda3-20 ...
- 瑞芯微RV1126平台----yolov5输出后处理C++实现
目录 1.前言 2.代码 2.1 padding resize 代码 2.2 瑞芯微yolov5后处理 2.3 坐标框的后处理 3.完整代码
- 瑞芯微rv1126超频笔记
Print Encode Frame Rate enable print fps log echo 0x100 > /sys/module/rk_vcodec/parameters/mpp_de ...
- 瑞芯微RV1126部署yolov5-face_模型转换_输出后处理C++实现
目录 1.模型转换 1.1 yolov5-face的pt模型转为onnx模型 1.2 yolov5-face的onnx模型转换为rknn模型 2.C++代码 2.1 paddi
- 瑞芯微RV1126 BuildRoot开发学习笔记
1.BuildRoot如何增加一个包? 参考 < The Buildroot User Manual.pdf >第17章 2.BuildRoot如何单独编译某一个包? 如果修改了源码,在编 ...
最新文章
- SparkStreaming Exception in thread main java.lang.IllegalArgumentException xxx is not a valid
- 小猿圈之python的输入和输出
- axure怎么做5秒倒计时_装修隔音怎么做,进屋秒变“静音”模式
- SAP OData Batch request processing in backend
- EntityFramework之迁移操作(五)
- 使用fiddler获取手机上的数据
- flask-Blueprint
- oracle sql列默认值,sql – Oracle:指定对象类型列的默认值
- Ubuntu 20.04美化及QQ、微信、ssh客户端安装
- 基于SSM的个人博客系统(数据库+源码)
- 虚拟地址空间和物理地址空间
- 【历史上的今天】4 月 23 日:YouTube 上传第一个视频;网易云音乐正式上线;数字音频播放器的发明者出生
- AtCoder Beginner Contest 236 题解
- 百度分享在新闻列表页分享多篇文章
- JavaScript中类似java常量constants使用方法
- 淘宝彩票移动项目开发实践
- jQuery Mobile 列表视图
- Redis入门(2):五大数据类型(key,string,list,set,sortset)将其实战,配置文件详解,发布与订阅
- 解决方案丨智慧写字楼:EasyCVR智能视频平台助力写字楼智慧化运营升级
- 访问网站报错‘您目前无法访问XXXX 因为此网站使用了 HSTS
热门文章
- mysql修改添加数字_mysql数据库插入将所有ID更改为4294967295
- 零基础,是怎么开始写Python爬虫的
- 什么是电力系统,以及电力系统的相关概念
- vb.net ACCESS压缩数据库
- 用c语言编程最简单的烟花代码,C语言实现放烟花的程序
- python制作个人信息管理系统_python-员工信息管理系统
- HTTP 1.1 400 Bad Request 11ms
- 计算机简单构图,新手必读 简单8招让你的构图更精彩
- LeetCode 962. 最大宽度坡 题解 C/C++
- 现在python 流行哪个版本好_python3哪个版本稳定-女性时尚流行美容健康娱乐mv-ida网...