提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

瑞芯微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取流相关推荐

  1. yolov5-5.0训练模型+瑞芯微rv1126上实现模型部署

    yolov5-5.0训练模型+瑞芯微rv1126上实现模型部署   第一次接触模型训练和在开发板部署,过程曲折,从开始的一脸懵到最后模型部署成功,查阅了不少资料和学习了不少大佬的经验,在这里记录一下过 ...

  2. [基于瑞芯微RV1126调试RTL8818FU WIFI模组支持STA和AP模式]

    基于瑞芯微RV1126调试RTL8818FU WIFI模组支持STA和AP模式 内核menuconfig配置 内核dts配置 文件系统配置和更改 驱动编译 wifi工具编译 libnl库编译 open ...

  3. 瑞芯微rv1126+yolov3模型转换

    瑞芯微rv1126+yolov3模型转换 文章目录 瑞芯微rv1126+yolov3模型转换 环境准备 一.加载运行docker 1.安装 Docker 2. 加载镜像 二.转换步骤 1.下载yolo ...

  4. 瑞芯微RK3399交叉编译MPP

    上一篇介绍了如何在ubuntu下搭建瑞芯微RK3399的检查编译环境,现在就要开始交叉编译MPP来进行对视频的硬编硬解. 这里RK3399用的aarch64架构芯片,上面跑的linux,如果编译and ...

  5. 瑞芯微RV1126/1109开发流程之模型转换

    1.环境搭建(PC端ubuntu16.04搭建rknn环境) (1)安装anaconda环境(为了便于管理自己的环境建议安装,安装步骤请自行搜索,本人安装anaconda版本为Anaconda3-20 ...

  6. 瑞芯微RV1126平台----yolov5输出后处理C++实现

    目录 1.前言 2.代码 2.1 padding resize 代码 2.2 瑞芯微yolov5后处理 2.3 坐标框的后处理 3.完整代码

  7. 瑞芯微rv1126超频笔记

    Print Encode Frame Rate enable print fps log echo 0x100 > /sys/module/rk_vcodec/parameters/mpp_de ...

  8. 瑞芯微RV1126部署yolov5-face_模型转换_输出后处理C++实现

    目录 1.模型转换 1.1 yolov5-face的pt模型转为onnx模型 1.2 yolov5-face的onnx模型转换为rknn模型 2.C++代码 2.1 paddi

  9. 瑞芯微RV1126 BuildRoot开发学习笔记

    1.BuildRoot如何增加一个包? 参考 < The Buildroot User Manual.pdf >第17章 2.BuildRoot如何单独编译某一个包? 如果修改了源码,在编 ...

最新文章

  1. SparkStreaming Exception in thread main java.lang.IllegalArgumentException xxx is not a valid
  2. 小猿圈之python的输入和输出
  3. axure怎么做5秒倒计时_装修隔音怎么做,进屋秒变“静音”模式
  4. SAP OData Batch request processing in backend
  5. EntityFramework之迁移操作(五)
  6. 使用fiddler获取手机上的数据
  7. flask-Blueprint
  8. oracle sql列默认值,sql – Oracle:指定对象类型列的默认值
  9. Ubuntu 20.04美化及QQ、微信、ssh客户端安装
  10. 基于SSM的个人博客系统(数据库+源码)
  11. 虚拟地址空间和物理地址空间
  12. 【历史上的今天】4 月 23 日:YouTube 上传第一个视频;网易云音乐正式上线;数字音频播放器的发明者出生
  13. AtCoder Beginner Contest 236 题解
  14. 百度分享在新闻列表页分享多篇文章
  15. JavaScript中类似java常量constants使用方法
  16. 淘宝彩票移动项目开发实践
  17. jQuery Mobile 列表视图
  18. Redis入门(2):五大数据类型(key,string,list,set,sortset)将其实战,配置文件详解,发布与订阅
  19. 解决方案丨智慧写字楼:EasyCVR智能视频平台助力写字楼智慧化运营升级
  20. 访问网站报错‘您目前无法访问XXXX 因为此网站使用了 HSTS

热门文章

  1. mysql修改添加数字_mysql数据库插入将所有ID更改为4294967295
  2. 零基础,是怎么开始写Python爬虫的
  3. 什么是电力系统,以及电力系统的相关概念
  4. vb.net ACCESS压缩数据库
  5. 用c语言编程最简单的烟花代码,C语言实现放烟花的程序
  6. python制作个人信息管理系统_python-员工信息管理系统
  7. HTTP 1.1 400 Bad Request 11ms
  8. 计算机简单构图,新手必读 简单8招让你的构图更精彩
  9. LeetCode 962. 最大宽度坡 题解 C/C++
  10. 现在python 流行哪个版本好_python3哪个版本稳定-女性时尚流行美容健康娱乐mv-ida网...