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解码做准备。

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

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

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

相关文章

【cucumber】cucumber-reporting生成测试报告

原始的cucumber report 比较粗糙 我们可以通过cucumber-reporting 插件对报告进去优化 在pom.xml里面添加cuccumber-reporting 插件 <!-- 根据 cucumber json文件 美化测试报告--><dependency><groupId>net.masterthought</groupId><artifactId>…

【博士每天一篇论文-综述】Deep Echo State Network (DeepESN)_ A Brief Survey

阅读时间&#xff1a;2023-11-22 1 介绍 年份&#xff1a;2017 作者&#xff1a;C. Gallicchio 比萨大学计算机科学系终身教授助理教授&#xff0c;A. Micheli&#xff0c;比萨大学计算机科学系 期刊&#xff1a; ArXiv 引用量&#xff1a;68 这是两个大牛的论文&#xff0c;…

charles mac抓包unknown问题

第一步&#xff1a;mac上安装Charles后&#xff0c;mac安装证书&#xff1a; 第二步&#xff1a;mac上信任证书 第三步&#xff1a;手机上安装证书 安装提示&#xff1a;电脑上通过help–>SSLProxying–> Install Charles Root Ceriticate on a Mobile Device or Remote …

hadoop必记知识点(2)

6. hadoop集群计算的时候&#xff0c;什么是集群的主要瓶颈&#xff1f;展开说一下&#xff0c;生产遇到了什么问题&#xff1f; 在 Hadoop 集群进行计算时&#xff0c;可能会遇到多个瓶颈&#xff0c;但最主要的通常包括网络带宽、存储以及 CPU 处理能力。 网络带宽&#xf…

如何制作自己的实景中国视频地图?

让每一个人都有自己的地图&#xff01; 我们在《水经微图Web版1.5.0发布》一文中&#xff0c;提到了水经微图&#xff08;简称“微图”&#xff09;Web版新增了视频气泡的功能。 现在&#xff0c;我们为你分享一下如何基于此功能&#xff0c;制作一个属于自己的实景中国视频地…

Axios取消请求:AbortController

AbortController AbortController() 构造函数创建了一个新的 AbortController 实例。MDN官网给出了一个利用AbortController取消下载视频的例子。 核心逻辑是&#xff1a;利用AbortController接口的只读属性signal标记fetch请求&#xff1b;然后在需要取消请求的时候&#xff0…

【XR806开发板试用】系列之一 - Linux环境下Ubuntu完全开发流程

前言 为了让极术社区开发者体验搭载安谋科技STAR-MC1处理器的面向IoT领域的全志XR806开发板&#xff0c;极术社区联合全志在线开发者社区共同推出XR806开发板免费试用活动。 极术社区特准备了200块XR806开发板作为2022年社区新年活动&#xff0c;申请的人数有600多&#xff0c…

分布式websocket IM聊天系统相关问题问答【第九期】

前言 上期视频讲解了自己关于聊天系统的设计的时候出现了一些不一样的声音。不了解情况的可以看上上期视频。这期主要是讨论。IM聊天系统设计方案多。我的先说明一下自己的技术背景互相之间才能更好的理解。 本期对应视频 目前已经写的文章有。并且有对应视频版本。 git项目地…

线性代数的学习和整理23:用EXCEL和python 计算向量/矩阵的:内积/点积,外积/叉积

目录 1 乘法 1.1 标量乘法(中小学乘法) 1.1.1 乘法的定义 1.1.2 乘法符合的规律 1.2 向量乘法 1.2.1 向量&#xff1a;有方向和大小的对象 1.2.2 向量的标量乘法 1.2.3 常见的向量乘法及结果 1.2.4 向量的其他乘法及结果 1.2.5 向量的模长&#xff08;长度&#xff0…

安装向量数据库milvus可视化工具attu

使用docker安装的命令和简单就一个命令&#xff1a; docker run -p 8000:3000 -e MILVUS_URL{milvus server IP}:19530 zilliz/attu:v2.3.5sunyuhuasunyuhua-HKF-WXX:~/dockercom/milvus$ docker run -p 8000:3000 -e MILVUS_URL127.0.0.1:19530 zilliz/attu:latest yarn run…

扫地机器人(二分算法+贪心算法)

1. if(robot[i]-len<sweep)这个代码的意思是——如果机器人向左移动len个长度后&#xff0c;比现在sweep的位置&#xff08;现在已经覆盖的范围&#xff09;还要靠左&#xff0c;就是覆盖连续不起来&#xff0c;呢么这个len就是有问题的&#xff0c;退出函数&#xff0c;再…

微信小程序-03

小程序官方把 API 分为了如下 3 大类&#xff1a; 事件监听 API 特点&#xff1a;以 on 开头&#xff0c;用来监听某些事件的触发 举例&#xff1a;wx.onWindowResize(function callback) 监听窗口尺寸变化的事件 同步 API 特点1&#xff1a;以 Sync 结尾的 API 都是同步 API 特…

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

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

【vscode】远程资源管理器自动登录服务器保姆级教程

远程资源管理器自动登录服务器 介绍如何配置本地生成rsa服务端添加rsa.pub配置config文件 介绍 vscode SSH 保存密码自动登录服务器 对比通过账号密码登录&#xff0c;自动连接能节约更多时间效率&#xff0c;且通过vim修改不容易发现一些换行或者引号导致的错误&#xff0c;v…

CentOS 7安装全解析:适合初学者的指导

目录 前言 一.centos安装 1.下载镜像文件 2.安装 二.远程连接&#xff0c;换源 1.下载并且使用MobaXtermMobaXterm free Xserver and tabbed SSH client for Windows (mobatek.net)https://mobaxterm.mobatek.net/ 远程连接 2.换源 前言 在当今的信息化时代&#xff0c…

使用Go语言编写简单的HTTP服务器

在Go语言中&#xff0c;我们可以使用标准库中的"net/http"包来编写HTTP服务器。下面是一个简单的示例&#xff0c;展示了如何使用Go编写一个基本的HTTP服务器。 go复制代码 package main import ( "fmt" "net/http" ) …

JavaScript DOM表单相关操作之获取表单数据的方式

在与表单相关的操作中&#xff0c;我们用的最多的就是获取表单中的数据。想要获取指定输入框的数据&#xff0c;首先就需要获取到这个输入框对象。 1、通过id属性获取表单数据 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><tit…

【论文阅读笔记】Swin-Unet: Unet-like Pure Transformer for Medical Image Segmentation

1.介绍 Swin-Unet: Unet-like Pure Transformer for Medical Image Segmentation Swin-Unet&#xff1a;用于医学图像分割的类Unet纯Transformer 2022年发表在 Computer Vision – ECCV 2022 Workshops Paper Code 2.摘要 在过去的几年里&#xff0c;卷积神经网络&#xff…

java程序cpu飙高如何排查

一、使用传统jstack手法来排查 如何使用原生top命令、jstack命令来做定位具体代码的位置处理 1、简单步骤有下面几步 执行top命令&#xff0c;查看CPU占用情况&#xff0c;找到进程的pid(12002)使用 top -Hp <pid> 命令&#xff08;为Java进程的id号&#xff09;查看该…

System.Data.SqlClient.SqlException:“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误

目录 背景: 过程: SQL Express的认识: 背景: 正在运行程序的时候&#xff0c;我遇到一个错误提示&#xff0c;错误信息如下&#xff0c;当我将错误信息仔细阅读了一番&#xff0c;信息提示的很明显&#xff0c;错误出现的来源就是连接数据库代码这块string connStr "s…