赞
踩
为什么叫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文件。这个函数是解码的核心函数,包含解码器的顶级控制逻辑,负责具体的解码过程。在函数描述中写了功能是:
先是解析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时,即一帧解码完成,写入一帧数据到输出文件。
这个架构真是相当复杂,这次就写这么多,下次接着解读。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。