mpp解码详解

解码器数据流接口

一. decode_put_packet

在这里插入图片描述
输入码流的形式:分帧与不分帧
MPP 的输入都是没有封装信息的裸码流,裸码流输入有两种形式:

  1. 不分帧
    这种方式是已经按帧分段的数据,即每一包输入给 decode_put_packet 函数的 MppPacket 数据都已经包含完整的一帧,不多也不少。在这种情况下,MPP 可以直接按包处理码流,是 MPP 的默认运行情况。

  2. 分帧
    按长度读取的数据,这样的数据无法判断一包 MppPacket 数据是否是完整的一帧,需要
    MPP 内部进行分帧处理。MPP 也可以支持这种形式的输入,但需要在 mpp_init 之前,通过 control
    接口的 MPP_DEC_SET_PARSER_SPLIT_MODE 命令,MPP 内的 need_split 标志打开。

    	// NOTE: decoder split mode need to be set before init
        // 按帧输入码流
        RK_U32 need_split   = 1;
        mpi_cmd = MPP_DEC_SET_PARSER_SPLIT_MODE;
        param = &need_split;
        ret = mpi->control(ctx, mpi_cmd, param);
        if (MPP_OK != ret) {
            mpp_err("mpi->control failed\n");
            deInit(&packet, &frame, ctx, buf, data);
        }
    

这样,调用 decode_put_packet 输入的 MppPacket 就会被 MPP 重新分帧,进入到情况一的处理。

如果这两种情况出现了混用,会出现码流解码出错的问题。

  • 分帧方式处理效率高,但需要输入码流之前先进行解析与分帧;
  • 不分帧方式使用简单,但效率会受影响。
  • 在 mpi_dec_test 的测试用例中,使用的是方式不分帧的方式。在瑞芯微的 Android SDK 中,使用的是分帧的方式。用户可以根据自己的应用场景和平台条件进行选择

二. decode_get_frame

在这里插入图片描述

2.1 给解码器提供足够大小的保存像素数据的内存空间

解码器在解码时,需要为输出图像获取保存像素数据的内存空间,用户需要给解码器提供足够大小,这个空间大小的需求,会在 MPP 解码器内部根据不同的芯片平台以及不同的视频格式需求进行计算,计算后的内存空间需求会通过MppFrame 的成员变量 buf_size 提供给用户。用户需要按 buf_size的大小进行内存分配,即可满足解码器的要求。

RK_U32 buf_size = mpp_frame_get_buf_size(frame);

ret = mpp_buffer_group_limit_config(data->frm_grp, buf_size, 24);
if (ret) 
{
    mpp_err("%p limit buffer group failed ret %d\n", ctx, ret);
    break;
}

2.2 输出图像的变宽高信息(Info change)

当码流的宽高,格式,像素位深等信息发生变化时,需要反馈给用户,用户需要更新解码器使用的
内存池,把新的内存更新给解码器。这里涉及到解码内存分配与使用模式。
图像内存分配以及交互模式:

模式一:纯内部分配模式
模式二:半内部分配模式
模式三:纯外部分配模式: 直接使用外部显示用的内存,容易实现零拷贝。

模式一:纯内部分配模式

图像内存直接从 MPP 解码器内部分配,内存由解码器直接分配,用户得到解码器输出图像,在使用
完成之后直接释放。
在这种方式下,用户不需要调用解码器 control 接口的 MPP_DEC_SET_EXT_BUF_GROUP 命令,只
需要在解码器上报 info change 时直接调用 control 接口的 MPP_DEC_SET_INFO_CHANGE_READY
命令即可。解码器会自动在内部进行内存分配,用户需要把获取到的每帧数据直接释放。

模式二:半内部分配模式

用户需要根据get_frame返回的MppFrame的buf_size
来创建 MppBufferGroup,并通过 control 接口的 MPP_DEC_SET_EXT_BUF_GROUP 配置给解码器。用户可以通过 mpp_buffer_group_limit_config 接口来限制解码器的内存使用量。

模式三:纯外部分配模式

这种模式通过创建空的 external 模式的 MppBufferGroup,从用户那里导入外部分配器分析的内存块
文件句柄(一般是 dmabuf/ion/drm)。在 Android 平台上,Mediaserver 通过 gralloc 从 SurfaceFlinger
获取显示用内存,把 gralloc 得到的文件句柄提交(commit)到 MppBufferGroup 里,再把
MppBufferGroup 通过 control 接口 MPP_DEC_SET_EXT_BUF_GROUP 命令配置给解码器,然后 MPP
解码器将循环使用 gralloc 得到的内存空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/111891.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring事务失效的几种情况及其解决方案

Spring事务失效的几种情况及其解决方案 方法权限修饰符不是public Transactional 使用的是 Spring AOP 实现的,而 Spring AOP 是通过动态代理实现的,而 Transactional 在生成代理时会判断,如果方法为非 public 修饰的方法,则不生…

皮肤渲染方法总结

一、皮肤次表面光照 HDRP用的延迟管线,镜面和散射分开进行计算 UE有透射开启和关闭的效果 (一)镜面反射 BRDF和Kelemen方法 (二)次表面散射与透射 1.散射:BRDF与BRSSDF(从反射点附近的点进行…

2023-11-01 LeetCode每日一题(参加会议的最多员工数)

2023-11-01每日一题 一、题目编号 2127. 参加会议的最多员工数二、题目链接 点击跳转到题目位置 三、题目描述 一个公司准备组织一场会议,邀请名单上有 n 位员工。公司准备了一张 圆形 的桌子,可以坐下 任意数目 的员工。 员工编号为 0 到 n - 1 。…

MongoDB——MongoDB删除系统自带的local数据库

一、MongoDB删除系统自带的local数据库 1.1、linux环境进入mongo客户端 输入 mongo 命令,进入命令行客户端 进入admin库,并登录,查看所有数据库 #进入admin库 use admin #并登录admin db.auth("username","password")…

【论文笔记】Unifying Large Language Models and Knowledge Graphs:A Roadmap

(后续更新完善) 2. KG-ENHANCED LLMS 2.1 KG-enhanced LLM Pre-training 以往将KGs集成到大型语言模型的工作主要分为三个部分:1)将KGs集成到训练目标中,2)将KGs集成到LLM输入中,3)将KGs集成到附加的融合模块中。 2.1.1 Integr…

大语言模型(LLM)综述(五):使用大型语言模型的主要方法

A Survey of Large Language Models 前言6 UTILIZATION6.1 In-Context Learning6.1.1 提示公式6.1.2 演示设计6.1.3 底层机制 6.2 Chain-of-Thought Prompting6.2.1 CoT的上下文学习6.2.2 关于CoT的进一步讨论 6.3 Planning for Complex Task Solving6.3.1 整体架构6.3.2 计划生…

基于松鼠算法的无人机航迹规划-附代码

基于松鼠算法的无人机航迹规划 文章目录 基于松鼠算法的无人机航迹规划1.松鼠搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用松鼠算法来优化无人机航迹规划。 1.松鼠搜索算法 …

pytorch复现_NMS

NMS(非极大值抑制)阈值是用于控制在一组重叠的边界框中保留哪些边界框的参数。当检测或识别算法生成多个边界框可能涵盖相同物体时,NMS用于筛选出最相关的边界框,通常是根据它们的置信度分数。 具体来说,NMS的工作原理…

Linux系统jdkTomcatMySQL安装以及J2EE后端接口部署

目录 一、jdk&Tomcat安装 1.1 上传安装包到服务器 1.2 解压对应工具包 1.3 配置环境变量并测试jdk安装 1.4 启动tomcat 1.5 防火墙设置 1.5.1 开启/关闭防火墙以及防火墙状态查看 1.5.2 开放防火墙端口 二、MySQL安装 2.1 卸载mariadb 2.2 在线下载MySQL安装包(…

2015年美亚杯全国电子数据取证大赛个人

做题 1.请找出如下windows XP系统信息:(10分) a. 系统安装时间 (YYYY/MM/DD) 考时间 我们先去看看该电脑的时区 都是东八区 那我们直接看时间 因为题目没有要求我们时间 答案为 2015-08-07 16:45:52 转为格式 201…

【zip密码】如何取消zip压缩包的密码?

我们想要对压缩包进行加密,但是当我们不需要加密压缩包的时候,该如何取消zip压缩包密码呢?那么zip压缩包密码取消都有什么方法呢?今天将方法总结分享给大家。 最原始的方法,就是通过解压文件,将解压出的文…

uniapp 微信小程序 授权隐私流程 网上没有的踩坑记录!

首先什么时候我们需要授权操作,比如下图我们调用这些接口时候首先必须让用户授权,这个政策是2022年2月21日24时起对一下接口增加用户授权操作,详情可以看微信文档 授权的逻辑按照官网的意思是: 这个时候就踩坑了,我把…

这个电力问题难倒90%的人,但我只用一招就搞定!

随着现代社会对电力需求的不断增加,配电系统的可靠性和安全性变得至关重要。为了确保电力系统的稳定运行,配电柜监控系统应运而生。 配电柜监控系统通过实时监测和控制电力分配,提供了对电力系统状态的详细洞察,以帮助运维人员及时…

编程助手DevChat:让开发更轻松

#AI编程助手哪家好?DevChat“真”好用 # 目录 前言一、安装Vscode1、下载链接2、安装 二、注册DevChat1、打开注册页2、验证成功完成邮箱绑定3、绑定微信可获得8元 三、安装插件四、配置Access Key1、获取Access Key2、设置Access Key①、点击左下角管理&#xff08…

linux jdk配置

1.下载jdk ,以jdk1.8为例子 Java Downloads | Oracle JDK 8 Update Release Notes (oracle.com) 2.配置环境变量 1.下载相关jdk版本,执行以下命令安装jdk tar -zxvf jdk-8u144-linux-x64.tar.gz 2.编辑命令 vi /etc/profile 3.在最后加入下面配置 e…

Kafka - 3.x 消费者 生产经验不完全指北

文章目录 生产经验之Consumer事务生产经验—数据积压(消费者如何提高吞吐量) 生产经验之Consumer事务 Kafka引入了消费者事务(Consumer Transactions)来确保在消息处理期间维护端到端的数据一致性。这使得消费者能够以事务的方式…

JAVA 实现PDF转图片(pdfbox版)

依赖: pdf存放路径 正文开始: pdf转换多张图片、长图 Test void pdf2Image() {String dstImgFolder "";String PdfFilePath "";String relativelyPathSystem.getProperty("user.dir");PdfFilePath relativelyPath &qu…

4.4 多态

思维导图: 4.4 多态 在深入研究对象的世界后,我们已经学到了封装和继承。接下来,我们要讨论的是面向对象编程的另一个核心概念:多态。 4.4.1 多态概述 多态是面向对象的三大特性之一,它允许我们以统一的方式处理不同…

518抽奖软件,可从Excel~Word~Pdf~网页导入名单

518抽奖软件简介 518抽奖软件,518我要发,超好用的年会抽奖软件,简约设计风格。 包含文字号码抽奖、照片抽奖两种模式,支持姓名抽奖、号码抽奖、数字抽奖、照片抽奖。(www.518cj.net) 从Excel、WPS表格导入 整列: 用鼠…

Vue路由(router)的安装和使用

Vue路由(router)的安装和使用 安装vue-router插件 第一步:在CMD窗口中,使用命令跳转到vue的安装路径下第二步:输入命令:npm i vue-router3 vue2 要安装 vue-router3 npm i vue-router3 vu3 要安装 vue-ro…