文章目录

  • 前言
  • 一、IMAX6 硬解码官方流程
  • 二、使用步骤
    • 1.初始化
    • 2.注册解码输出内存
    • 3.开始解码
  • 总结

前言

近期在做JPEG图像解码相关功能开发,记录IMAX6 调用芯片硬件解码功能开发过程,方便自己,也方便他人


一、IMAX6 硬解码官方流程

根据其官方文档,流程原文如下:

1. Call vpu_Init() to initialize the VPU.
2. Open a decoder instance by using vpu_DecOpen().
3. To provide the proper amount of bitstream, get the bitstream buffer address by using vpu_DecGetBitstreamBuffer().
4. After transferring the decoder input stream, inform the amount of bits transferred into the bitstream buffer by using
vpu_DecUpdateBitstreamBuffer().
5. Before starting a picture decoder operation, get the crucial parameters for decoder operations such as picture size,
frame rate, and required frame buffer size by using vpu_DecGetInitialInfo().
6. Using the returned frame buffer requirement, allocate the proper size of the frame buffers, and convey this data to i.MX
6 VPU by using vpu_DecRegisterFrameBuffer().
7. Start a picture decoder operation picture-by-picture by using vpu_DecStartOneFrame().
8. Wait for the completion of the picture decoder operation interrupt event.
9. Check the results of the decoder operation using vpu_DecGetOutputInfo().
10. After displaying nth frame buffer, clear the buffer display flag by using vpu_DecClrDispFlag().
11. If there is more bitstream to decode, go to Step 7, otherwise go to the next step.
12. Terminate the sequence operation by closing the instance by using vpu_DecClose()

总结一下,解码的主要流程有:

1、初始化模块
2、打开解码器
3、填充数据(输入一部分待解码数据)
4、根据先前填充的数据,解码器返回参数(如:解码图像长宽,输出解码内存块个数等信息)
5、根据获取到的参数注册内存参数(告诉解码器解码后的数据要放哪里)
6、填充数据(没错还要填充数据),(这一步开始就可以开始解码了)
7、开始解码
8、获取解码后的数据(第一次解码出来的图像为第3步输入图像的解码数据,第6步输入的需要下一次调用解码才能输出)
9、如果需要解码其他图像,则重复第6步骤继续解码;
10、解码完成,关闭解码器;

二、使用步骤

1.初始化

调用vpu_Init(),初始化VPU
调用vpu_DecOpen()打开解码器,
*注意!!!*打开解码器前需要调用IOGetPhyMem()和IOGetVirtMem()申请内存空间,用于存放待解码数据;

2.注册解码输出内存

  • 填充数据
    打开解码器后,还需要配置解码后图像的存储空间,基于此系统要求先输入一下些原始数据;主要流程如下
1、vpu_DecGetBitstreamBuffer(); //获取输入缓冲区地址及剩余可填充的空间;
2、根据获取到的数据地址信息,将待解码数据拷贝到目标地址
2、vpu_DecUpdateBitstreamBuffer(); //数据填充完毕后,通知系统数据已更新
  • 获取参数

    通过 vpu_DecGetInitialInfo() 函数获取数据输出的相关参数。需要注意的是,此次输入的原始数据会在接下来调用解码函数接口时被解码。

  • 注册内存

    根据前一步获取的参数,调用IOGetPhyMem()、IOGetVirtMem()申请内存空间,并将申请到的内存地址赋值给FrameBuffer结构体变量。通过vpu_DecRegisterFrameBuffer() 注册。

3.开始解码

解码可以简单分为3步,1、数据填充 2、等待解码完成 3、获取数据;具体流程如下:

  • 数据填充
1、vpu_DecGetBitstreamBuffer(); //获取输入缓冲区地址及剩余可填充的空间;
2、根据获取到的数据地址信息,将待解码数据拷贝到目标地址
2、vpu_DecUpdateBitstreamBuffer(); //数据填充完毕后,通知系统数据已更新
  • 解码
1、vpu_DecStartOneFrame(); 开始解码
2、检查vpu_IsBusy()状态,非忙时即解码完成
3、调用vpu_WaitForInt() 函数等待解码完成
4、vpu_DecGetOutputInfo(); //获取解码输出索引,只有调用该接口,系统才会在下一次解码下一帧图像

获取数据
从 第二步中- 注册内存的虚拟地址中直接拷贝已解码的数据
测试代码段

 ret = vpu_DecStartOneFrame(handle, decparam);if (ret == RETCODE_JPEG_BIT_EMPTY) {continue;}is_waited_int = 0;loop_id = 0;while (vpu_IsBusy()) {if (loop_id == 50) {vpu_SWReset(handle, 0);return FALSE;}vpu_WaitForInt(100);is_waited_int = 1;loop_id ++;}if (!is_waited_int)vpu_WaitForInt(100);ret = vpu_DecGetOutputInfo(handle, &outinfo);

例程中有调用vpu_WaitForInt() 函数等待解码完成。官方文档给的解释是,解码需要时间,在这当中你可以通过调用这个函数等待解码完成,同时你可以去做其他任务;这个函数具体的作用目前我还未弄明白,有看懂的童鞋烦请指教一二;
官方原文如下

Picture decoder operations take a certain amount of time, and the application can complete other tasks while calling vpu_WaitForInt() to wait for the completion of the picture decoding operation, such as display processing of the previously decoded output. The application can use two different schemes for detecting the completion of the picture decoding operation: polling a status register or waiting for an interrupt signal. When the application uses the polling scheme, the application checks the BusyFlag Register of the BIT processor. Calling vpu_IsBusy() gives the same result.

总结

VPU硬解码大致流程总结如下:
初始化-申请内存用于存放待解码数据-申请内存用于存放解码后数据-注册内存-存1帧或多帧入待解码数据-获取解码相关信息-循环解码(填入数据-解码-获取数据)-解码完成;
需要注意的是,注册内存后存入的数据将在后续正式解码的时候被解码,也就是说在循环解码时,解码后的数据是之前未被解码的数据,而非本次被填入的数据;
CSDN上有VPU相关的编解码源码,我的工程也是根据这份源代码裁剪而来的,非常感谢原作者;链接如下:
mxc_vpu_test

IMX6 VPU解码流程相关推荐

  1. [imx6 VPU]硬解码+示例[ffmpeg获取海康rtsp h264流 QT显示]

    0.说明: 1,代码基于imx6q.imx6dl已验证. 2,网上关于imx6 VPU的资料很少,遂从官方例程mxc_vpu_test里面活生生抽出来.主要是dec_test()里面提取,因为我只要解 ...

  2. imx6 vpu程序分析

    imx6 vpu程序分析 背景 最近公司需要将产品与外界的设备进行流媒体通信,经过一系列的方案研究确立,最终把功能完成,目前能够顺利的播放基于h264的流媒体文件,趁着闲暇时间对相关的东西做一些笔记记 ...

  3. ffmpeg解码流程 turorial5详解

    From: http://www.360doc.com/content/11/1117/09/8050095_165108638.shtml FFMPEG解码流程 1. 注册所有容器格式和CODEC: ...

  4. 264编码基本概念 FFMpeg的解码流程

    下面转自http://topic.csdn.net/u/20081020/16/7156e0b2-dbfb-4b4f-af59-2be04cf9a420.html 的8楼 1.NAL.Slice与fr ...

  5. H.264的编解码流程

    H.264是在MPEG-4技术的基础之上建立起来的,其编解码流程主要包括5个部分:帧间和帧内预测(Estimation).变换(Transform)和反变换.量化(Quantization)和反量化. ...

  6. [RK3288][Android6.0] StageFright解码流程小结

    原址 Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92以Gallery播放视频为例(只关注MediaPlayer相关部分): rk用的是ffplayer ...

  7. [Android6.0] StageFright解码流程小结

    Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 以Gallery播放视频为例(只关注MediaPlayer相关部分): rk用的是ffplayer,但 ...

  8. 视频编解码(十六):VE解码器解码demo解码流程

    一.VE解码器解码demo解码流程 解码器初始化.创建.读取码流.解码.显示

  9. 视频编解码(十二):播放器编解码流程source、demux、decoder、output

    一.播放器编解码流程source.demux.decoder.output 说白了播放器大致分为4大部分:source.demux.decoder.output. 1.source: 数据源,数据的来 ...

最新文章

  1. 收藏 | 提高数据处理效率的 Pandas 函数方法
  2. mysql删除数据库恢复_详解MySQL数据库恢复误删除数据
  3. 2021年春季学期-信号与系统-第十五次作业参考答案-第三小题参考答案
  4. python内置函数调用_Python中函数的基本定义与调用及内置函数详解
  5. websphere变成英文了
  6. python网格搜索核函数_机器学习笔记——模型调参利器 GridSearchCV(网格搜索)参数的说明...
  7. 构建LAMP平台(一)(软件版本:httpd-2.4.16,php-5.6.12,mysql-5.6.26)
  8. 【转】你没有变强是因为你一直很舒服
  9. listview嵌套gridview
  10. STM32基于SPI和AD7192的数据采集
  11. 高数学习笔记:利用矩阵设置密码
  12. 利用SCCM 2012 SP1为客户端进行软件批量自动安装
  13. select 中添加option的注意
  14. windows和android结合,Android和Windows 10可以很好地合作的10种方式
  15. [机器学习导论]——第三课——神经网络Ⅰ
  16. OBS+SRS+centos7搭建局域网直播推流服务器
  17. 信息系统项目管理师考试中涉及到的法律法规知识
  18. 保护海洋主题的微信公众号图文排版必备素材集锦
  19. win 11 大更新,新功能爱了爱了。
  20. BZOJ 1778 [Usaco2010 Hol] Dotp 驱逐猪猡

热门文章

  1. 32个c语言关键字发音,加注汉语发音的C语言32个语句和9种控制语
  2. 微信公众平台开发-java
  3. Artifact “xxx - xxxx“:war exploded:部署工件时出错。请参阅服务器日志了解详细信息
  4. 这些雷达书籍,你需要收藏~(终极大汇总)
  5. TokenGazer评级丨Storj:V3 升级方案带来更好前景,但仍面临技术和竞争上的挑战...
  6. 积分商城该如何帮助商家盈利
  7. java对接支付宝当面付支付和查询
  8. Druid连接池简介和配置
  9. 计算时间差 html,计算时间差的公式
  10. 电商路演投资计划融资报告PPT模板