当前位置:   article > 正文

imx VPU解码分析2-hantro

hantro

为什么叫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时,即一帧解码完成,写入一帧数据到输出文件。

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/395589
推荐阅读
相关标签
  

闽ICP备14008679号