一种基于uvd的hevc视频解码方法
【技术领域】
[0001]本发明涉及视频解码领域,特别涉及一种基于UVD的HEVC视频解码方法。
【背景技术】
[0002]DirectShow是针对基于微软Windows平台的流媒体应用的框架,能完美提供高质量的多媒体流的数据采集和回放处理。它能为常见的高性能多媒体应用如文件播放器、TV和DVD播放器、视频编辑软件、格式转换器、音视频采集软件、解码器、编码器、数字信号处理器等提供完美的解决方案。DirectShow支持丰富的流媒体数据格式和压缩格式,包括 ASF、MPEG、AV1、MP3、WAV 音频文件等,和 ACC、DV、H.264、MJPEG-1、MPEG-2 等压缩格式。DirectShow的出现,一方面帮助简化了多媒体应用开发过程中涉及的播放、格式转换、捕获等任务;同时它还提供了可定制的解决方案来访问底层流媒体架构,开发人员甚至还可以通过创建自己的DirectShow组件来支持不同的新格式和定制处理效果。
[0003]高效率视频编码(High Efficiency Video Coding,简称HEVC)是一种视频压缩标准,被视为是ITU-T H.264/MPEG-4AVC标准的继任者。2004年开始由IS0/IEC MovingPicture Experts Group (MPEG)和 ITU-T Video Coding Experts Group (VCEG)作为 ISO/IEC 23008-2MPEG-H Part 2 或称作 ITU-T H.265 开始制定。第一版的 HEVC/H.265 视频压缩标准在2013年4月13日被接受为国际电信联盟(ITU-T)的正式标准。HEVC被认为不仅提升视频质量,同时也能达到H.264/MPEG-4AVC两倍之压缩率(等同于同样画面质量下比特率减少了 50 % ),可支持4K分辨率甚至到超高清电视(UHDTV),最高分辨率可达到8192 X 4320 (8K分辨率)。HEVC能够显著减少文件的存储和分发成本,为更高清晰度的内容进入消费层应用铺平了道路。
[0004]FFmpeg是一个集录制、转换、音视频编解码功能为一体的、完整的开源解决方案,采用LGPL或GPL许可证,包含了非常先进的音视频编解码库libavcodec。FFmpeg是音视频编解码领域的权威项目,其中对于HEVC解码,其提供了软件解码方法和基于DXVA2的硬件加速解码方法。开源项目LAVFilters将FFmpeg的大部分解码功能封装为DirectShowFilter。软件解码方法虽通用性和兼容性较好,但其解码效率和CPU计算资源占用较高;而硬件解码方法虽解码效率相对较高,但对图像数据传输有特殊要求,其通用性和兼容性较差。
【发明内容】
[0005]本发明的目的在于克服现有技术的缺点与不足,提供一种基于UVD的HEVC视频解码方法,针对Windows桌面系统进行设计,基于DirectShow系统将HEVC视频解码功能封装为一个 DirectShow Filter。
[0006]本发明的目的通过以下的技术方案实现:
[0007]—种基于UVD的HEVC视频解码方法,包含以下顺序的步骤:
[0008]利用AMD Media SDK 1.1对AMD异构计算平台中的UVD视频硬解码模块进行调用,将接收到的HEVC视频数据进行解析和处理后投放到UVD中,同时不断从UVD中获取解码后图像并推送出去。
[0009]所述的UVD视频硬解码模块为基于UVD的HEVC解码功能的DirectShow Filter,DirectShow Filter 命名为 UVD HEVC Decoder,属于 Transform Filter,其具有一个输入Pin和一个输出Pin,主媒体类型均为视频流MEDIATYPE_Video ;在爪0) HEVC Decoder中,输入Pin暂时仅接受HEVC视频的两种媒体类型(MEDIASUBTYPE_HEVC和MEDIASUBTYPE_HVC1)的上游输出Pin与之连接,输出Pin仅提供MEDIASUBTYPE_NV12 —种媒体类型的输出Pin连接;UVD HEVC Decoder的整体对外功能为接收从上游Filter输入的HEVC视频流,并将其解码为YUV 4:2:0图像数据的NV12格式码流,输出到下游Filter中。
[0010]所述的UVD HEVC Decoder 继承自 DirectShow Filter 的基类库中 CtransformFilter,利用其中的输入和输出Pin实现Pin的连接和数据传输和其他DirectShow Filter基本功能的实现,数据传输方式属于Push模式。
[0011 ] 所述的利用AMD Media SDK 1.1对AMD异构计算平台中的UVD视频硬解码模块进行调用,具体包含以下步骤:
[0012](1)初始化UVD:调用Media SDK相关API,创建AMF上下文和AMF HEVC硬件解码器;之后以AMF上下文和解码器作为初始化参数创建解码流输出线程;
[0013](2)将视频流输入到UVD:将接收到的视频流数据封装成AMFData类型数据,并设置时间戳信息;之后将封装好的AMFData数据输入到UVD解码器中;如果解码器中的输入队列已满,则循环等待并尝试输入,直到将视频流数据输入到UVD解码器中后返回。若解码器中的输入队列已满,则循环等待并尝试输入,直到将视频流数据输入到UVD解码器中后返回,对上游Filter的数据传输起到阻塞的效果。
[0014]所述的不断从UVD中获取解码后图像并推送出去,具体如下:
[0015]A、OutputThread 类定义
[0016]OutputThread类继承AMFThread 类,AMFThread类的定义与实现在 AMD Media SDK的示例代码中通用类集中。OutputThread类中有三个指针成员属性,将用来分别指向AMF上下文对象和AMF解码器对象和HEVCDecoder对象。其中成员函数Run是OutputThread对象线程启动后会调用执行的线程计算逻辑函数。
[0017]B、解码图像输出
[0018]OutputThread对象线程启动后,其成员函数Run将会被调用执行;
[0019]在Run函数中,不断循环访问AMF解码器对象指针指向的UVD解码器,尝试从中取出解码图像;如果从UVD解码器中取出的数据非空,即成功取出解码图像,则将解码图像数据从显存转换到系统内存中存放,并转换成AMFSurface类型;之后根据输出媒体类型创建一个输出Sample,根据解码图像数据中的时间戳信息设置输出Sample的时间戳,并将解码图像数据从AMFSurface对象中复制填充到输出Sample对象中;
[0020]最后将封装好的输出Sample对象通过输出Pin传输到下游Filter中;如果从UVD解码器中取出的数据为空,即仍未有解码数据输出,则循环等待并进行下一次尝试从UVD解码器中取出解码数据;如果访问UVD解码器取出解码数据时遇到文件结束符,并返回AMF_E0F值,则结束循环,Run函数将返回,线程将会终结。
[0021]本发明与现有技术相比,具有如下优点和有益效果:
[0022]在传统的HEVC视频解码方法中,软件解码方法虽通用性和兼容性较好,但其解码效率和CPU计算资源占用较高;而硬件解码方法虽解码效率相对较高,但对图像数据传输有特殊要求,其通用性和兼容性较差。相比之下,本发明利用AMD异构计算平台中的UVD视频硬解码模块,对HEVC视频进行高效实时解码,并且使用了通用图像数据传输方法,具有较高的HEVC解码效率和更好的通用性和兼容性。
[0023]本发明利用AMD异构计算平台中的UVD视频硬解码模块,对HEVC视频进行高效实时解码,充分利用了异构计算平台中的计算资源,降低了 CPU资源的占用和总体功耗。本专利提高了 HEVC视频解码的效率,支持高质量HEVC视频的实时解码,并且使用了通用图像数据传输方法,具有更好的通用性和兼容性,对AMD异构计算平台下的HEVC视频解码有重要的实践指导价值。
【附图说明】
[0024]图1为UVD HEVC Decoder的功能示意图。
[0025]图2为UVD HEVC Decoder的输入线程工作流程图。
[0026]图3为UVD HEVC Decoder的输出线程工作流程图。
【具体实施方式】
[0027]下面结合实施例及附图对本发明作进一步详细的描述,但本发明的实施方式不限于此。
[0028]—种基于UVD的HEVC视频解码方法,包含以下顺序的步骤:
[0029]利用AMD Media SDK 1.1对AMD异构计算平台中的UVD视频硬解码模块进行调用,将接收到的HEVC视频数据进行解析和处理后投放到UVD中,同时不断从UVD中获取解码后图像并推送出去。
[0030]具体如下:
[0031 ] (一)HEVC 视频解码 FiIter 设计
[0032]基于UVD 的 HEVC 解码功能的 DirectShow Filter 命名为 “UVD HEVC Decoder”,属于Transform Filter,具有一个输入Pin和一个输出Pin,主媒体类型均为视频流MEDIATYPE_Video。如图1,在UVD HEVC Decoder中,输入Pin暂时仅接受HEVC视频的两种媒体类型(MEDIASUBTYPE_HEVC和MEDIASUBTYPE_HVC1)的上游输出Pin与之连接,输出Pin仅提供MEDIASUBTYPE_NV12—种媒体类型的输出Pin连接。UVD HEVC Decoder的整体对外功能为接收从上游Filter输入的HEVC视频流,并将其解码为YUV4:2:0图像数据的NV12格式码流,输出到下游Fi 1 ter中。
[0033]UVD HEVC Decoder 继承自 DirectShow Filter 的基类库中的 Ctransform Filter,利用其中的输入和输出Pin实现Pin的连接和数据传输和其他DirectShow Filter基本功能的实现,数据传输方式属于Push模式。
[0034]继承自CTransformFilter的媒体Transform Filter的基本开发中,除了实现 CTransformFilter 中的 4