imx VPU解码分析2-hantro

本文详细介绍了Linux下IMX-VPU的Hantro解码器驱动,涉及hantrodec.c文件、H264解码流程,从NAL单元解析到宏块解码,以及多线程处理的复杂架构。
摘要由CSDN通过智能技术生成

为什么叫hantro,因为这玩意在芬兰语中意思就是视频。最开始搞这一套的就是Hantro公司。

今天来总结下imx-vpu-hantro的具体实现。

先看看hantro的驱动,位置在linux-imx/drivers/mxc/hantro。主要有hantrodec.c文件,驱动的主要入口点,包括驱动的初始化、设备注册和请求处理函数等。对应有个hantrodec.h头文件,放在系统<linux/>目录下。

hantro架构相当复杂,这里从h264的解码看看。在

/decoder_sw/software/source/h264high中可以看到如下文件:

在legacy下有:

这里从简单的应用看。我下载版本是imx-vpuhantro-1.17.0,直接编译Makefile_test文件,可以生成几个测试程序,在bin目录下。使用指令./hx170dec -Oout.yuv frames.h264运行,即可将h264文件解码为yuv文件。这表明此hantro是work的。

h264的示例程序在imx-vpu-hantro-1.17.0/decoder_sw/software/test/h264high。主函数是dectestbench.c。

从main开始看看核心的解码。

H264DecDecode函数,定义是H264DecRet H264DecDecode(H264DecInst dec_inst, const H264DecInput * input, H264DecOutput * output) ,在h264decapi.c文件里面。解码一帧成功返回H264DEC_PIC_DECODED。

再下一层是调用的h264bsdDecode,u32 h264bsdDecode(decContainer_t * dec_cont, const u8 * byte_strm, u32 len, u32 pic_id, u32 * read_bytes),在h264hwd_decoder.c文件。这个函数是解码的核心函数,包含解码器的顶级控制逻辑,负责具体的解码过程。在函数描述中写了功能是:             

  1. extract and decode NAL unit from the byte stream
  2. decode parameter sets
  3. decode slice header and slice data
  4.  conceal errors in the picture
  5. perform deblocking filtering

先是解析NAL数据,h264bsdDecodeNalUnit。然后就是解码图像参数h264bsdDecodePicParamSet,接着就是码流每帧的头数据,h264bsdDecodeSliceHeader。再就是解码每一帧数据,h264bsdDecodeSliceData,在h264hwd_slice_data.c文件。

再下一层就是宏块解码,h264bsdDecodeMacroblock,每一帧有多个宏块,在h264hwd_macroblock_layer.c文件。在这里区分是I帧还是P帧。

这里还有一个线程h264_output_thread,用来写解码后的数据。H264DEC_PIC_RDY这个信号表示解码一帧完成。

开了个多线程h264_output_thread(),当DEC_PIC_RDY时,即一帧解码完成,写入一帧数据到输出文件。

这个架构真是相当复杂,这次就写这么多,下次接着解读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值