RK3568笔记十一:mpp编解码

若该文为原创文章,转载请注明原文出处。

主要是想测试MPP的解码,为后续做测试。

一、环境

1、平台:rk3568

2、开发板:ATK-RK3568正点原子板子

3、环境:buildroot

二、编译

使用的是正点原子提供的虚拟机,搭建好环境后,编译SDK,原子的手册有详细的编译过程。

接下来编译mpp

进入/home/alientek/rk3568_linux_sdk目录

cd /home/alientek/rk3568_linux_sdk

执行

./build.sh external/mpp/

可以看出编译的可执行文件在/home/alientek/rk3568_linux_sdk/buildroot/output/rockchip_rk3568/target/usr/bin/目录下

进入/home/alientek/rk3568_linux_sdk/buildroot/output/rockchip_rk3568/target/usr/bin/目录,

给开发板上电,通过adb把可执行文件上传到开发板

adb push mpi_dec_test /userdata/aidemo

三、测试

在测试执行,需要准备一个h264文件,把文件放到和mpi_dec_test同目录。

执行

mpi_dec_test -i output.h264 -t 7 -n 200 -o decode.yuv -w 640 -h 480

看出,解码也yuv文件,通过YUV播放器播放,显示正常。

四、mpi_dec_test的命令参数

命令参数的描述说明如下:

-i

输入的码流文件。

-o

输出的图像文件。

-w

图像宽度,单位为像素。

-h

图像高度,单位为像素。

-t

码流文件的协议类型。

-f

图像色彩空间格式以及内存排布方式,默认为NV12。

-n

最大解码帧数。测试时若码流较长,可仅输出前n帧。

-s

MPP实例数,默认为1。

-v

日志选项:q为静默标志;f为fps显示标志。

-slt

输出帧对应的校验文件。

-help

打开帮助文档。

1、mpi_dec_test的命令参数中,输入文件(i)和码流类型(t)为强制要求配置的参数,其他参数如输出文件(o)、图像宽度(w)、图像高度(h)和解码帧数(n)等为可选参数,可以根据不同的测试需求进行配置。

2、mpi_dec_test的命令参数中,输出帧对应的校验文件(slt)将输出帧数据转换为对应的循环冗余校验码(具体逻辑见utils/utils.c)。校验文件的大小往往只有几kB,在芯片的slt测试中,将输出帧文件的对比转换成校验文件的对比,可以显著缩短测试周期。

MPP支持的解码类型:

1、MPP库支持的输入文件的编码格式(t)为MPEG2/4、H.263/4/5、VP8/9和JPEG等,id后的数字为不同编码格式对应的参数值。参数值来源于OMX的定义,值得注意的是,HEVC和AVS格式的参数值与其他格式的有显著区别。

五、mpp解码流程解析

  • mpp_create :获取 MppCtx 实例以及 MppApi 结构体
  • mpp_init: 初始化MppCtx 的编解码类型与格式
  • mpi->control:通过相应的命令来配置解码参数
  • decode_put_packet:输入码流:编码数据 MppPacke,例如264、265数据
  • decode_get_frame: 获取解码的数据存放到MppFrame,例如YUV、RGB数据
  • mpi->reset:使解码器恢复为正常初始化后的状态。
  • mpp_destroy:释放申请的内存空间,做销毁善后工作

重要函数解析

mpp_init函数:初始化MppCtx 的编解码类型与格式

mpp_init函数原型:

MPP_RET mpp_init(MppCtx ctx, MppCtxType type, MppCodingType coding)

mpp_init函数调用实例:

ret = mpp_init(ctx, MPP_CTX_DEC, MppCodingType::MPP_VIDEO_CodingAVC);
if (ret){mpp_err("mpp_init failed ret %d\n", ret);goto MPP_TEST_OUT;}

mpp_init函数参数解析:

  • MppCtxType 参数:初始化编码还是解码
    MPP_CTX_DEC : 解码
    MPP_CTX_ENC : 编码
  • MppCodingType 参数:编解码的格式
    MPP_VIDEO_CodingAVC : H.264
    MPP_VIDEO_CodingHEVC: H.265
    MPP_VIDEO_CodingVP8 : VP8
    MPP_VIDEO_CodingVP9 : VP9
    MPP_VIDEO_CodingMJPEG : MJPEG

mpi_dec_test 流程解析:

main(  ) ---> dec_decode(  ) ---> thread_decode(  ) ---> dec_simple(  ) ---> mpp_destroy(  )
  • main函数根据传进来的参数(参数char **argv 对应命令中的 -i output.h264 -t 7 -n 200 -o decode.yuv -w 640-h 480)对参数进行解析保存到 MpiDecTestCmd * cmd 结构体中
  • dec_decode(cmd) 函数是封装好的解码函数,传入 MpiDecTestCmd * cmd 结构体即可完成解码
  • dec_decode 函数执行了一些MPP的初始化操作:mpp_create() mpp_init() ,mpp_dec_cfg_init() , mpi->control。初始化之后创建解码线程: thread_decode 进行解码。
  • 解码线程: thread_decode 线程根据 cmd->simple 变量判断是使用 dec_simple 解码还是 dec_advanced 解码
  • 解码完最后一帧之后执行 pthread_join() 函数等待解码线程: thread_decode 结束后做线程释放工作
  • 线程释放完毕之后执行reset复位操作:mpi->reset(ctx)把解码器恢复为正常初始化后的状态。
  • 解码器复位之后通过mpp_destroy()释放申请的内存空间,进行一些销毁操作防止内存泄漏。

接下来独立编写一个demo测试为后续增加RTSP解码做准备。

如有侵权,或需要完整代码,请及时联系博主。

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

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

相关文章

yolov5 opencv dnn部署自己的模型

yolov5 opencv dnn部署自己的模型 github开源代码地址使用github源码结合自己导出的onnx模型推理自己的视频推理条件c部署c 推理结果 github开源代码地址 yolov5官网还提供的dnn、tensorrt推理链接本人使用的opencv c github代码,代码作者非本人,也是上面作者推荐的…

mysql进阶-执行计划

目录 1. 概念 2. 使用 3. 具体相关字段含义 3.1 id 3.2 select_type 3.3 table 3.4 partition 3.5 type 3.6 possible_key 3.7 key 3.8 key_len 3.9 ref 3.10 row 3.11 filtered 3.12 extra 1. 概念 一条语句通过优化器之后,会生成具体的执行计划用…

HuoCMS|免费开源可商用CMS建站系统HuoCMS 2.0下载(thinkphp内核)

HuoCMS是一套基于ThinkPhp6.0Vue 开发的一套HuoCMS建站系统。 HuoCMS是一套内容管理系统同时也是一套企业官网建设系统,能够帮过用户快速搭建自己的网站。可以满足企业站,外贸站,个人博客等一系列的建站需求。HuoCMS的优势: 可以使用统一后台…

VSCode Python Windows环境下创建虚拟环境,隔离每个项目的依赖pip包,推荐使用!

VSCode Python Windows环境下创建虚拟环境 Visual Studio Code 可以隔离不同项目的pip依赖包,防止不同版本的干扰**(推荐使用)** 先在python官网https://www.python.org/downloads/下载需要的python版本(我选择了3.9.8&#xff09…

JDK8新特性(一)集合之 Stream 流式操作

1.Stream流由来 首先我们应该知道:Stream流的出现,主要是用在集合的操作上。在我们日常的工作中,经常需要对集合中的元素进行相关操作。诸如:增加、删除、获取元素、遍历。 最典型的就是集合遍历了。接下来我们先举个例子来看看 J…

《WebKit 技术内幕》学习之九(2): JavaScript引擎

2 V8引擎 2.1 基础 V8是一个开源项目,也是一个JavaScript引擎的实现。它最开始是由一些语言方面的专家设计出来的,后被Google收购,成为了JavaScript引擎和众多相关技术的引领者。其目的很简单,就是为了提高性能。因为在当时之前…

【学习】focal loss 损失函数

focal loss用于解决正负样本的不均衡情况 通常我们需要预测的正样本要少于负样本,正负样本分布不均衡会带来什么影响?主要是两个方面。 样本不均衡的话,训练是低效不充分的。因为困难的正样本数量较少,大部分时间都在学习没有用…

216. 组合总和 III - 力扣(LeetCode)

题目描述 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 输入示例 k 3, n 7输出示例 [[1,2,…

深入理解Kubernetes探针和.NET服务健康检查机制

前言 随着越来越多的软件采用云原生和微服务架构,我们面临着更多的技术挑战,比如: Kubernetes如何在容器服务异常终止、死锁等情况下,发现并自动重启服务;当服务依赖的关键服务(例如数据库,Red…

Dockerfile-xxxx

1、Dockerfile-server FROM openjdk:8-jdk-alpine WORKDIR /app COPY . . CMD java -Xms1536M -Xmx1536M -XX:UseG1GC -jar -Dlog4j2.formatMsgNoLookupstrue -Dloader.pathresources,lib -Duser.timezoneGMT-05 /app/server-main-1.0.0.jar 2、Dockerfile-bgd #FROM openjdk…

8. UE5 RPG创建UI(上)

UI是显示角色的一部分属性玩家可以直接查看的界面,通过直观的形式在屏幕上显示角色的各种信息。如何使用一种可扩展,可维护的形式来制作,这不得不说到耳熟能详的MVC架构。 MVC(Model-View-Controller)是一种常见的软件…

如何在Linux上部署Nexus私服

如何在Linux上部署Nexus私服 Nexus 是一个强大的仓库管理解决方案,由Sonatype公司开发。它主要用于软件开发中各种依赖包和构件的存储、管理和分发。 1、为什么要部署nexus? 统一管理依赖:在软件开发过程中,项目通常会依赖大量的…

[Linux 杂货铺] —— 权限(文件权限和目录配置)

目录 🌈前言 📁 文件的属性 📁 权限的概念 📂拥有者和所属组(角色): 📂用户(具体的人): 📁 权限的管理 📂1. chmod…

如何让亚马逊,速卖通,美客多店铺排名和流量稳定爬升

一、关键词优化 关键词是亚马逊店铺排名的关键。通过合理的关键词优化,可以提高店铺的曝光率。卖家需要研究消费者的搜索习惯和行为,了解他们使用哪些关键词进行搜索,然后将这些关键词用于商品描述、标题和元数据中。此外,还可以…

Linux - 安装字体库解决乱码问题

文章目录 问题描述步骤资源 问题描述 该安装方法,不区分中文和英文字体 Java在linux上转word文档为pdf, linux的字体缺失,导致了转出的pdf为乱码。 ● Linux将word转为pdf后出现乱码? ● 在linux上将word转为pdf 是乱码 ● 在lin…

第一篇【传奇开心果短博文系列】Python的库OpenCV技术点案例示例:cv2常用功能和方法

传奇开心果短博文系列 短博文系列目录Python的库OpenCV技术点案例示例系列 短博文目录一、前言二、常用功能和方法示例三、归纳总结 短博文系列目录 Python的库OpenCV技术点案例示例系列 短博文目录 一、前言 cv2是Python中常用的第三方库,也称为OpenCV库&#…

在全志H616核桃派上实现USB摄像头的OpenCV颜色检测

在给核桃派开发板用OpenCV读取图像并显示到pyqt5的窗口上并加入颜色检测功能,尝试将图像中所有蓝色的东西都用一个框标记出来。 颜色检测核心api 按照惯例,先要介绍一下opencv中常用的hsv像素格式。颜色还是那个颜色,只是描述颜色用的参数变…

【C语言编程之旅 7】刷题篇-函数

第1题 解析 A:错误,一个函数只能返回一个结果 B:正确,将形参存在数组中,修改数组中内容,可以通过数组将修改结果带出去 C:正确,形参如果用指针,最终指向的是外部的实参…

SpringBoot3.1.7集成Kafka和Kafka安装

一、背景 我们在很多系统开发都需要用到消息中间件,目前来说Kafka凭借其优秀的性能,使得它的使用率已经是名列前茅了,所以今天我们将它应用到我们的系统 二、版本选择 在使用一个中间件一定要考虑版本的兼容性,否则后面会遇到很…

[足式机器人]Part2 Dr. CAN学习笔记- 最优控制Optimal Control Ch07-3 线性二次型调节器(LQR)

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记 - 最优控制Optimal Control Ch07-3 线性二次型调节器(LQR) 1. 数学推导2. 案例反洗与代码详解 1. 数学推导 2. 案例反洗与代码详解