RockChip MPP编码
概述
瑞芯微提供的媒体处理软件平台(Media Process Platform,简称 MPP)是适用于瑞芯微芯片系列的
通用媒体处理软件平台。该平台对应用软件屏蔽了芯片相关的复杂底层处理,其目的是为了屏蔽不
同芯片的差异,为使用者提供统一的视频媒体处理接口(Media Process Interface,缩写 MPI)。MPP
提供的功能包括:
视频解码:
H.265 / H.264 / H.263 / VP9 / VP8 / MPEG-4 / MPEG-2 / MPEG-1 / VC1 / MJPEG
视频编码:
H.264 / VP8 / MJPEG
视频处理:
视频拷贝,缩放,色彩空间转换,场视频解交织(Deinterlace)
MPP源码下载
git clone https://github.com/rockchip-linux/mpp.git编码demo测试
mpi_enc_test -w 720 -h 480 -t 7 -i /sdcard/soccer_720x480_30fps.yuv -o /sdcard/out.h264 -n 1000mpi_enc_test 的命令参数中,图像宽度(w)图像高度(h),码流类型(t)为强制要求参数,其他参
数如输入文件(i),输出文件(o),编码帧数(n)等为可选参数。
执行完测试程序在/sdcard目录下会生成out.h264文件。
将out.h264在VLC media player播放器播放:

MPI接口使用流程

创建 MPP context 和 MPP api 接口
ret = mpp_create(&p->ctx, &p->mpi);初始化 MPP
ret = mpp_init(p->ctx, MPP_CTX_ENC, p->type); // 初始化MPP设置一些MPP的模式
ret = mpi->control(ctx, MPP_ENC_SET_SEI_CFG, &p->sei_mode);编码就是喂MppFrame,输出MppPacket;
输入frame
ret = mpi->encode_put_frame(ctx, frame); 输出packet
ret = mpi->encode_get_packet(ctx, &packet); RK官方编码demo mpi_enc_test.c简化
#if defined(_WIN32)
#include "vld.h"
#endif#define MODULE_TAG "mpi_enc_test"#include <string.h>
#include "rk_mpi.h"
#include "mpp_mem.h"
#include "mpp_common.h"
#include "utils.h"
#include "mpi_enc_utils.h"#include <stdio.h>typedef struct {// base flow contextMppCtx ctx;MppApi *mpi;// global flow control flagRK_U32 frm_eos;RK_U32 pkt_eos;RK_S32 frame_count;// src and dstFILE *fp_output;/* encoder config set */MppEncCfg cfg;// input / outputMppBufferGroup buf_grp;MppBuffer frm_buf;MppBuffer pkt_buf;MppBuffer md_info;MppEncSeiMode sei_mode;MppEncHeaderMode header_mode;// paramter for resource mallocRK_U32 width;RK_U32 height;RK_U32 hor_stride;RK_U32 ver_stride;MppFrameFormat fmt;MppCodingType type;// resourcessize_t header_size;size_t frame_size;size_t mdinfo_size;} MpiEncTestData;/* For each instance thread return value */
typedef struct {RK_S32 frame_count;
} MpiEncMultiCtxRet;typedef struct {MpiEncTestArgs *cmd; // pointer to global command line infoconst char *name;pthread_t thd; // thread for for each instanceMpiEncTestData ctx; // context of encoderMpiEncMultiCtxRet ret; // return of encoder
} MpiEncMultiCtxInfo;MPP_RET test_ctx_init(MpiEncMultiCtxInfo *info)
{MpiEncTestArgs *cmd = info->cmd;MpiEncTestData *p = &info->ctx;MPP_RET ret = MPP_OK;// 设置编码宽高、对齐后宽高参数p->width = cmd->width;p->height = cmd->height;p->hor_stride = (cmd->hor_stride) ? (cmd->hor_stride) :(MPP_ALIGN(cmd->width, 16));p->ver_stride = (cmd->ver_stride) ? (cmd->ver_stride) :(MPP_ALIGN(cmd->height, 16));p->fmt = cmd->format;p->type = cmd->type;p->mdinfo_size = (MPP_VIDEO_CodingHEVC == cmd->type) ?(MPP_ALIGN(p->hor_stride, 64) >> 6) *(MPP_ALIGN(p->ver_stride, 64) >> 6) * 32 :(MPP_ALIGN(p->hor_stride, 64) >> 6) *(MPP_ALIGN(p->ver_stride, 16) >> 4) * 8;p->frame_size = MPP_ALIGN(p->hor_stride, 64) * MPP_ALIGN(p->ver_stride, 64) * 4;return ret;
}MPP_RET test_ctx_deinit(MpiEncTestData *p)
{if (p) {if (p->fp_output) {fclose(p->fp_output);p->fp_output = NULL;}}return MPP_OK;
}MPP_RET test_mpp_enc_cfg_setup(MpiEncMultiCtxInfo *info)
{MpiEncTestData *p = &info->ctx;MppApi *mpi = p->mpi;MppCtx ctx = p->ctx;MppEncCfg cfg = p->cfg;MPP_RET ret;mpp_enc_cfg_set_s32(cfg, "prep:width", p->width);mpp_enc_cfg_set_s32(cfg, "prep:height", p->height);mpp_enc_cfg_set_s32(cfg, "prep:hor_stride", p->hor_stride);mpp_enc_cfg_set_s32(cfg, "prep:ver_stride", p->ver_stride);mpp_enc_cfg_set_s32(cfg, "prep:format", p->fmt);ret = mpi->control(ctx, MPP_ENC_SET_CFG, cfg); //创建 MPPp->sei_mode = MPP_ENC_SEI_MODE_ONE_FRAME;ret = mpi->control(ctx, MPP_ENC_SET_SEI_CFG, &p->sei_mode); //设置一些MPP的模式if (p->type == MPP_VIDEO_CodingAVC || p->type == MPP_VIDEO_CodingHEVC) {p->header_mode = MPP_ENC_HEADER_MODE_EACH_IDR;ret = mpi->control(ctx, MPP_ENC_SET_HEADER_MODE, &p->header_mode);}return ret;
}MPP_RET test_mpp_run(MpiEncMultiCtxInfo *info) //图像编码函数
{MpiEncTestData *p = &info->ctx;MppApi *mpi = p->mpi;MppCtx ctx = p->ctx;MPP_RET ret = MPP_OK;MppMeta meta = NULL;MppFrame frame = NULL;MppPacket packet = NULL; // 存放编码数据void *buf = mpp_buffer_get_ptr(p->frm_buf);ret = fill_image(buf, p->width, p->height, p->hor_stride,p->ver_stride, p->fmt, p->frame_count);ret = mpp_frame_init(&frame);mpp_frame_set_width(frame, p->width);mpp_frame_set_height(frame, p->height);mpp_frame_set_hor_stride(frame, p->hor_stride);mpp_frame_set_ver_stride(frame, p->ver_stride);mpp_frame_set_fmt(frame, p->fmt);mpp_frame_set_eos(frame, p->frm_eos);mpp_frame_set_buffer(frame, p->frm_buf);meta = mpp_frame_get_meta(frame);mpp_packet_init_with_buffer(&packet, p->pkt_buf);mpp_packet_set_length(packet, 0);mpp_meta_set_packet(meta, KEY_OUTPUT_PACKET, packet);mpp_meta_set_buffer(meta, KEY_MOTION_INFO, p->md_info);ret = mpi->encode_put_frame(ctx, frame); //输入frameif (ret) {mpp_frame_deinit(&frame);}mpp_frame_deinit(&frame);ret = mpi->encode_get_packet(ctx, &packet); //输出packetmpp_assert(packet);void *ptr = mpp_packet_get_pos(packet);size_t len = mpp_packet_get_length(packet);p->pkt_eos = mpp_packet_get_eos(packet);fwrite(ptr, 1, len, p->fp_output);mpp_packet_deinit(&packet); return ret;
}void *enc_test(void *arg) //编码器初始化函数
{MpiEncMultiCtxInfo *info = (MpiEncMultiCtxInfo *)arg;MpiEncTestData *p = &info->ctx;MppPollType timeout = MPP_POLL_BLOCK;MPP_RET ret = MPP_OK;ret = test_ctx_init(info);ret = mpp_buffer_group_get_internal(&p->buf_grp, MPP_BUFFER_TYPE_DRM);ret = mpp_buffer_get(p->buf_grp, &p->frm_buf, p->frame_size + p->header_size);ret = mpp_buffer_get(p->buf_grp, &p->pkt_buf, p->frame_size);ret = mpp_buffer_get(p->buf_grp, &p->md_info, p->mdinfo_size);ret = mpp_create(&p->ctx, &p->mpi); //创建 MPP context 和 MPP api 接口ret = p->mpi->control(p->ctx, MPP_SET_OUTPUT_TIMEOUT, &timeout);ret = mpp_init(p->ctx, MPP_CTX_ENC, p->type); // 初始化MPPret = mpp_enc_cfg_init(&p->cfg);ret = test_mpp_enc_cfg_setup(info);ret = test_mpp_run(info);ret = p->mpi->reset(p->ctx);test_ctx_deinit(p);return NULL;
}int enc_test_multi(MpiEncTestArgs* cmd, const char *name)
{MpiEncMultiCtxInfo *ctxs = NULL;RK_S32 ret = MPP_NOK;RK_S32 i = 0;ctxs = mpp_calloc(MpiEncMultiCtxInfo, cmd->nthreads);ctxs[i].cmd = cmd;ctxs[i].name = name;ret = pthread_create(&ctxs[i].thd, NULL, enc_test, &ctxs[i]);pthread_join(ctxs[i].thd, NULL);MPP_FREE(ctxs);return ret;
}int main(int argc,char **argv)
{argc = 13;char* argvv[] = {"mpi_enc_test","-w","720","-h","480","-t","7","-i","/sdcard/soccer_720x480_30fps.yuv","-o","/sdcard/out.h264","-n","10"};RK_S32 ret = MPP_NOK;MpiEncTestArgs* cmd = mpi_enc_test_cmd_get();// parse the cmd optionret = mpi_enc_test_cmd_update_by_args(cmd, argc, argvv);mpi_enc_test_cmd_show_opt(cmd);ret = enc_test_multi(cmd, argvv[0]);return ret;
}
相关文章:
RockChip MPP编码
概述瑞芯微提供的媒体处理软件平台(Media Process Platform,简称 MPP)是适用于瑞芯微芯片系列的通用媒体处理软件平台。该平台对应用软件屏蔽了芯片相关的复杂底层处理,其目的是为了屏蔽不同芯片的差异,为使用者提供统…...
【学习笔记】NOIP暴零赛2
细思极恐,我的能力已经退步到这个地步了吗? 数据结构 这题的修改是强行加进去迷惑你的。 考虑怎么求树的带权重心。 完了我只会树形dp 完了完了 结论:设uuu的子树和为szusz_uszu,所有点权值和为sss,那么树的带…...
linux基本功系列之hostname实战
文章目录前言一. hostname命令介绍二. 语法格式及常用选项三. 参考案例3.1 显示本机的主机名3.2 临时修改主机名3.3 显示短格式的主机名3.4 显示主机的ip地址四. 永久修改主机名4.1 centos6 修改主机名的方式4.2 centos7中修改主机名永久生效总结前言 大家好,又见面…...
Easy-Es框架实践测试整理 基于ElasticSearch的ORM框架
文章目录介绍(1)Elasticsearch java 客户端种类(2)优势和特性分析(3)性能、安全、拓展、社区(2)ES版本及SpringBoot版本说明索引处理(一)索引别名策略&#x…...
【数据结构】双向链表的模拟实现(无头)
目录 前言: 1、认识双向链表中的结点 2、认识并创建无头双向链表 3、实现双向链表当中的一些方法 3.1、遍历输出方法(display) 3.2、得到链表的长度(size) 3.3、查找关键字key是否包含在双链表中(contains) 3.…...
vue自定义指令---处理加载图片失败时出现的碎图,onerror事件
目录 一、自定义指令 1、局部注册和使用 2、全局注册和使用 二、自定义指令处理图片加载失败(碎图) 一、自定义指令 vue中除v-model、v-show等内置指令之外,还允许注册自定义指令,获取DOM元素,扩展额外的功能。 1、局…...
加盟管理系统挑选法则,看完不怕被坑!
经营服装连锁店铺究竟有多难?小编已经不止一次听到身边的老板,抱怨加盟连锁店铺难以管理了,但同时呢,也听到了很多作为加盟商的老板,抱怨总部给的支持和管理不到位。服装加盟店铺管理,到底有哪些难点呢&…...
alertmanager笔记
1 prometheus的思想 所有告警都应该立刻处理掉,不应该存在长时间未解决的告警。所以具体的表现就是高频的数据采集,和告警的自动恢复(默认5分钟) 2 alertmanager API调用 使用如下命令即可手工制造告警,注意startsA…...
Android Jetpack组件之WorkManager后台任务管理的介绍与使用(二)
一、介绍 通过上一篇文,Android Jetpack组件之WorkManager后台任务管理的介绍与使用(一)_蜗牛、Z的博客-CSDN博客 我们可以弄清楚workmanager从接入到使用的基本流程。基本可以满足我们日常。那只是简单的入门。如果遇到更复杂的功能,那简单的就无法满…...
【MySQL】第十七部分 约束
【MySQL】第十七部分 约束 文章目录【MySQL】第十七部分 约束17. 约束17.1 约束的分类17.2 非空约束17.3 唯一性约束17.4 主键约束17.5 自增列约束17.6 外键约束17.7 默认约束17.8 check约束总结17. 约束 约束: 可以在创建表的时候规定约束,也可以在表创建之后添加,约束顾名思…...
java ssm集装箱码头TOS系统调度模块的设计与实现
由于历史和经济体制的原因,国内码头物流企业依然保持大而全的经营模式。企业自己建码头、场地、经营集装箱运输车辆。不过近几年来随着经济改革的进一步深入和竞争的激烈,一些大型的码头物流企业逐步打破以前的经营模式,其中最明显的特征就是…...
MS14-064(OLE远程代码执行漏洞复现)
✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :内网安全-漏洞复现 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台…...
【C++深陷】之shared_ptr
0. 什么是智能指针 使用new 和delete 手动进行动态内存管理很容易出现内存泄漏等问题。C11为了更安全、更方便的管理动态内存,新的标准库提供了两种智能指针(smart pointer):shared_ptr和unique_ptr,以及一个伴随类we…...
SpringMVC中遇到的错误
SpringMVC中遇到的错误1.web.xml中配置SpringMVC核心类: DispatcherServlet 报错解决方案:添加Tomcat包2. not declaration can be found for element--------‘mvc:annotation-driven‘通配符的匹配很全面, 但无法找到元素 mvc:annotation-driven 的声明解决方案&a…...
姿态估计端到端新方案 | DirectMHP:用于全范围角度2D多人头部姿势估计
前言 现有的头部姿势估计主要集中在具有预先检测到的正面头部的单个人,这依赖于单独训练的面部检测器,不能很好地泛化到完整的视点。在本文中,作者关注全范围 MPHPE 问题,并提出了一个名为 DirectMHP 的直接端到端简单基线&#x…...
jvm学习的核心(五)---垃圾回收算法和常见垃圾回收器
文章目录1.垃圾回收算法**1.1. 标记阶段****1.2. 清除阶段**1.2.1.标记清除算法1.2.2.标记复制算法1.2.3.标记整理算法1.3.引用2.常见的垃圾回收器2.1.Serial回收器2.2.ParNew回收器2.3.Parallel回收器2.4.CMS回收器<font color red>2.5.G1垃圾回收器ZGC回收器ÿ…...
亿级高并发电商项目-- 实战篇 --万达商城项目 二(Zookeeper、Docker、Dubbo-Admin等搭建工作
👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者 📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 Ǵ…...
【C#基础】 C# 数据类型总结
序号系列文章0【C#基础】初识编程语言C#1【C#基础】C# 程序通用结构总结2【C#基础】C# 程序基础语法解析文章目录前言数据类型一. 值类型(Value types)二. 引用类型(Reference types)三. 指针类型(Pointer types&#…...
格子玻尔兹曼法介绍
1 LBM简介格子玻尔兹曼法(Lattice Boltzmann Method)简称LBM,是一种CFD算法,可求解流动、传热等常见CFD问题。LBM基于格子玻尔兹曼方程(LBE),从介观尺度(mesoscope)描述了…...
活动星投票在时间的河流上造园分组怎么设置如何进行分组报名
“在时间的河流上造园”网络评选投票_免费小程序运行系统_企业有关的投票_微信投票的应用小程序投票活动如何做?很多企业在运营当中,都会通过投票活动来进行推广,从而达到吸粉、增加用户粘度等效果。而此类投票活动,通过小程序就可…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...
node.js的初步学习
那什么是node.js呢? 和JavaScript又是什么关系呢? node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说, 需要在node.js的环境上进行当JavaScript作为前端开发语言来说,需要在浏览器的环境上进行 Node.js 可…...
CppCon 2015 学习:REFLECTION TECHNIQUES IN C++
关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…...
RabbitMQ 各类交换机
为什么要用交换机? 交换机用来路由消息。如果直发队列,这个消息就被处理消失了,那别的队列也需要这个消息怎么办?那就要用到交换机 交换机类型 1,fanout:广播 特点 广播所有消息:将消息…...
Spring Boot 与 Kafka 的深度集成实践(二)
3. 生产者实现 3.1 生产者配置 在 Spring Boot 项目中,配置 Kafka 生产者主要是配置生产者工厂(ProducerFactory)和 KafkaTemplate 。生产者工厂负责创建 Kafka 生产者实例,而 KafkaTemplate 则是用于发送消息的核心组件&#x…...
DeepSeek11-Ollama + Open WebUI 搭建本地 RAG 知识库全流程指南
🛠️ Ollama Open WebUI 搭建本地 RAG 知识库全流程指南 💻 一、环境准备 # 1. 安装 Docker 和 Docker Compose sudo apt update && sudo apt install docker.io docker-compose -y# 2. 添加用户到 docker 组(避免 sudo 权限&…...
