mpp解码详解

news2025/7/16 19:22:39

解码器数据流接口

一. 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 得到的内存空间。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PCIe 的 MSI 中断详解,寄存器级别的详细流程分析,完全搞懂硬件的工作流程

PCIe 的 MSI 中断 前言 什么是 MSI 中断 (Message Signaled Interrupts) 概念与内容介绍待补充 正文 对 EP 的初始化 需要对 EP 的配置空间 MSI 相关功能的寄存器进行初始化,主要有两个寄存器 Message Address 和 Message Data。它们分别的含义是 EP 产生 MSI …

关于JSON 字符串或对象互转

目录 1、 识别不了空数组,只能打印出来{__ob__: Observer} 2、遇到把字符串解析为对象 1、 识别不了空数组,只能打印出来{__ob__: Observer} 遇到了这种,可以使用 "JSON.stringify(JSON.parse(JSON.stringify(obj))" 解析成空对象…

B站数据质量保障体系建设与实践

本文将分享 B 站数据质量保障体系的建设和实践。文章将关注数仓和建模的相关方法论,讲解 B 站数仓平台团队在数仓建设和建模过程中所做的工作,并分享质量保障方面取得的成果。 一、背景目标 首先,分享一下 B 站数据质量保障的背景和目标。 …

onnx 模型加载部署运行方式

1.onnx文件加载方式在onnxruntime下是: env Ort::Env(OrtLoggingLevel::ORT_LOGGING_LEVEL_WARNING, "YOLOV8");sessionOptions Ort::SessionOptions();std::wstring w_modelPath charToWstring(mnnModelPath.c_str());session Ort::Session(env, w_modelPath.c_…

输入日期是当年的第n天

从键盘输入正确日期,程序输出是当年的第n天。 (本笔记适合熟悉循环和列表的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么…

Springboot整合Minio实现文件上传和下载

目录 1. Minio 1.1 Minio下载 2. Springboot和Minio实现文件存储 1. Minio Minio是一个灵活、高性能、开源的对象存储解决方案,适用于各种存储需求,并可以与云计算、容器化、大数据和应用程序集成。它为用户提供了自主控制和可扩展性,使其…

Redis系统学习(高级篇)-Redis持久化-RDB方式

目录 一、RDB是什么? 二、RDB的执行时机 三、RDB的其他命令 四、RDB的执行原理 五、RDB的优缺点 一、RDB是什么? RDB全称叫Redis Database Backup file(Redis数据备份文件) ,也叫Redis数据快照,就是将…

针对zkVM中Memory Consistency Checks的Polynomial IOPs

1. 引言 主要参考Yuncong Zhang等人2023年论文《Polynomial IOPs for Memory Consistency Checks in Zero-Knowledge Virtual Machines》。 在设计zkvm时,需检查其所有组件的功能一致性,包括: instruction fetcher寄存器文件算术化逻辑单元…

模型实际训练笔记1—AlexNet

1、AlexNet网络模型介绍: AlexNet 是一种深度卷积神经网络,由Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 在2012年开发。它是深度学习领域的重要里程碑,因为它在当年的 ImageNet 大规模图像分类竞赛(ILSVRC&#xff09…

【深度学习】pytorch——快速入门

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ pytorch快速入门 简介张量(Tensor)操作创建张量向量拷贝张量维度张量加法函数名后面带下划线 _ 的函数索引和切片Tensor和Numpy的数组之间的转换张量(tensor)与标量…

使用 for 和 mv 批量修改文件名

我们知道,linux 中可以使用 mv 命令来移动或者重命名文件和目录,且不会改变 inode 编号和时间戳。其语法如下: mv [-f | -i | -n] [-hv] source target mv [-f | -I | -n] [-v] source … directory 但是,mv 命令一次只能操作一个…

AXI总线实操

1.源码来源vivado xilinx官方实例 2.[2:0]M_AXI_ARSIZE:指的是一个 data transfer 里面有多少 Bytes——这里我写的是3(即2^38B)——8*864bit代表你想往axi总线的搬移数据的位宽。 3. Burst length: ARLEN[7:0]和AWLEN[7:0] 突发传输长度是指在一次突发…

模型实际训练笔记2-VGG

1、VGG简介: VGG网络是由牛津大学的视觉几何组(visual geometry group)首次提出来的。 VGG 网络,也称为Visual Geometry Group网络,是计算机视觉领域的一个深度卷积神经网络架构。它于2014年由牛津大学的研究团队开发…

PHP服务器端电商API原理及示例讲解(电商接口开发/接入)

下面小编就为大家分享一篇PHP服务器端API原理及示例讲解(接口开发),具有很好的参考价值,希望对大家有所帮助 相信大家都做过PHP请求电商API接口获取数据,比如淘宝平台商品API接口,订单接口,京东接口,1688接…

IDEA在service面板中不显示微服务的项目

在.idea文件夹下的workspace文件中的project标签内添加如下代码段&#xff0c;&#xff0c;重启idea即可看到所有服务出现在了service面板中 <component name"RunDashboard"><option name"configurationTypes"><set><option value&q…

[计算机提升] 系统软件:信息类

3.2 信息类&#xff1a;查看相关信息 3.2.1 检查windows版本&#xff1a;winver 用于查看Windows系统版本&#xff1a; 3.2.2 系统信息&#xff1a;msinfo32 用于查看系统相关信息&#xff0c;包括&#xff1a;系统摘要、硬件资源、组件、软件环境。 3.2.3 查看系统信息…

Qt 使用QtXlsx操作Excel表

1.环境搭建 QtXlsx是一个用于读写Microsoft Excel文件&#xff08;.xlsx&#xff09;的Qt库。它提供了一组简单易用的API&#xff0c;可以方便地处理电子表格数据。 Github下载&#xff1a;GitHub - dbzhang800/QtXlsxWriter: .xlsx file reader and writer for Qt5 官方文档…

Fetch库

scalaimport com.github.katongli.http.crawler.Fetchval fetchFetch()fetch.setProxyHost("jshk.com.cn//aa")fetch.setProxyPort(0126)val responsefetch(url)val imagesresponse.images//你可以使用println将获取的图片打印出来println(images) 解释&#xff1a;…

markdown增加目录索引,实现点击目录跳转到对应的内容目录标题

文章目录 1. 教程1.1 首先正常编写文章例如如下1.2 原理 2. 示例文件2.1 标题12.1.1 小标题12.1.1.1 小小标题12.1.1.2 小小标题2 2.1.2 小标题2 1. 教程 1.1 首先正常编写文章例如如下 如果使用的是typora则可以直接点击段落-》内容目录&#xff1b;则会自动生成目录 1.2 原理…

Linux之J2EE项目部署与发布(Linux版本)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《LInux实战开发》。&#x1f3af;&#x1f3af; …