解码方法及装置、存储介质、处理器与流程

文档序号:13482180阅读:117来源:国知局

本发明涉及视频解码领域,具体而言,涉及一种解码方法及装置、存储介质、处理器。



背景技术:

近年来,视频应用向以下几个方向发展的趋势愈加明显:高清晰度(higherdefinition):数字视频的应用格式从720p向1080p全面升级,在一些视频应用领域甚至出现了4k*2k、8k*4k的数字视频格式;高帧率(higherframerate):数字视频帧率从30fps向60fps、120fps甚至240fps的应用场景升级;高压缩率(highercompressionrate):传输带宽和存储空间一直是视频应用中最为关键的资源,因此,在有限的空间和管道中获得最佳的视频体验一直是用户的不懈追求。

基于以上应用发展趋势和h.264的局限性,面向更高清晰度、更高帧率、更高压缩率的高效视频编码标准(highefficiencyvideocoding)hevc(h.265)协议标准应运而生。h.265的核心目标是在h.264/avchighprofile的基础上,保证相同视频质量的前提下,视频流的码率减少50%;在提高压缩效率的同时,允许编码端适当提高复杂度(三倍计算复杂性)。目前标准的h.265解码都是采用图1所示流程,解析一帧sliceheader,然后申请空闲的帧缓冲区开始解码,最后等待解码结束后才开始解析新一帧sliceheader。这种做法存在以下问题:(1)由于h.265编码复杂度高,采用这种串行的解码流程会导致解码速度慢而出现播放卡顿现象;(2)这种串行的解码流程导致硬件长时间处理空闲状态,不利用于充分发挥硬件性能。



技术实现要素:

本发明实施例提供了一种解码方法及装置、存储介质、处理器,以优化相关技术中的解码流程。

根据本申请实施例的一个方面,提供了一种解码方法,包括:在对待解码视频数据中当前帧进行解码的过程中,检测在解码过程中设置的状态机的状态,其中,状态用于指示解码过程中所执行的动作;通过执行状态所对应的动作和切换状态机的状态,执行以下操作:采用乒乓缓存的方式存储硬件解码配置参数;并对下一帧的片头进行解析,得到下一帧的硬件解码配置参数,并将下一帧的硬件解码配置参数存储至乒乓缓存中;以及在用于硬件解码的中断处理函数中,触发使用乒乓缓存中的硬件解码配置参数对待解码视频数据进行硬件解码。

可选地,通过执行状态所对应的动作和切换状态机的状态,执行操作,包括:在检测到状态机处于第一状态时,解析下一帧的片头,并切换为第二状态;在第二状态下,判断是否存在空闲的帧缓冲区,如果是,将状态机切换为第三状态,否则,判断硬件是否处于空闲状态;在硬件处于空闲状态时,开始硬件解码;在状态机切换为第三状态时,判断是否存在空闲的命令队列内存,如果否,则判断硬件是否处于空闲状态;在硬件处于空闲状态时,开始硬件解码。

可选地,在状态机处于第三状态,且存在空闲的命令队列内存时,方法还包括:将下一帧的硬件解码配置参数存储至空闲的命令队列内存中。

可选地,方法还包括:在用于硬件解码的中断处理函数中释放命令队列内存;并判断是否存在可读状态的命令队列,如果存在,开始进行硬件解码。

根据本申请实施例的另一方面,还提供了另外一种解码方法,包括:在对当前帧进行解码过程中,检测第一缓冲区和第二缓冲区的状态,其中,状态包括:只读状态和可写状态;在第一缓冲区处于只读状态且第二缓冲区处于可写状态时,从第一缓冲区中读取用于对当前帧进行硬件解码的硬件解码配置参数;并获取下一帧的硬件解码配置参数,将下一帧的硬件解码配置参数存储至第二缓冲区中;在用于解码的硬件设备处于空闲状态时,使用从指定缓冲区读取的硬件解码配置参数对当前帧进行硬件解码,其中,指定缓冲区为第一缓冲区和第二缓冲区中当前处于只读状态的缓冲区。

可选地,检测第一缓冲区和第二缓冲区的状态之前,方法还包括:对当前帧的片头进行解析,得到当前帧的硬件解码配置参数。

可选地,使用从指定缓冲区读取的硬件解码配置参数对当前帧进行硬件解码之前,方法还包括:通过以下至少之一方式触发检测硬件设备是否处于空闲状态:检测到帧缓冲区申请失败,其中,帧缓冲区用于存储对当前帧进行解码后的图像数据;检测到用于存储硬件解码配置参数的命令队列内存申请失败;以及检测到以下情况:在用于硬件解码的中断处理函数中,释放用于存储硬件解码配置参数的命令队列内存,以及命令队列内存从可写状态变为只读状态。

可选地,将下一帧的硬件解码配置参数存储至第二缓冲区中,包括:在检测到帧缓冲区申请成功时,触发申请命令队列内存;在检测到命令队列内存申请成功时,将下一帧的硬件解码配置参数存储至命令队列内存中。

可选地,方法还包括:在第一缓冲区由只读状态变为可写状态,第二缓冲区由可写状态变为只读状态时,并且在用于解码的硬件设备处于空闲状态时,使用从第二缓冲区读取的下一帧的硬件解码配置参数对下一帧进行硬件解码。

根据本申请实施例的又一方面,提供了一种解码装置,包括:检测模块,用于在对待解码视频数据中当前帧进行解码的过程中,检测在解码过程中设置的状态机的状态,其中,状态用于指示解码过程中所执行的动作;执行模块,用于通过执行状态所对应的动作和切换状态机的状态,执行以下操作:采用乒乓缓存的方式存储硬件解码配置参数;并对下一帧的片头进行解析,得到下一帧的硬件解码配置参数,并将下一帧的硬件解码配置参数存储至乒乓缓存中;以及在用于硬件解码的中断处理函数中,触发使用乒乓缓存中的硬件解码配置参数对待解码视频数据进行硬件解码。

根据本申请实施例的再一方面,提供了一种存储介质,存储介质包括存储的程序,其中,在程序运行时控制存储介质所在设备执行以上的解码方法。

根据本申请实施例的再一方面,提供了一种处理器,处理器用于运行程序,其中,程序运行时执行以上的解码方法。

在本发明实施例中,采用在对待解码视频数据中当前帧进行解码的过程中,检测在解码过程中设置的状态机的状态,通过执行状态所对应的动作和切换状态机的状态,从而实现在硬件解码同时,可以对下一帧的硬件解码所使用的配置参数进行提前配置,从而减少了硬件空闲资源的浪费,可以充分发挥硬件性能,加快了解码速度,改善了视频播放的流畅度,进而支持高码率的视频文件的播放,解决了优化相关技术中的解码流程的技术问题。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1是根据相关技术的一种解码方法的流程示意图;

图2是根据本发明实施例的一种解码方法的流程示意图;

图3a是根据本发明实施例的一种解码过程的流程示意图;

图3b是根据本发明实施例的另一种解码过程的流程示意图;

图4是根据本发明实施例的一种解码装置的结构框图;

图5是根据本发明实施例的另一种解码方法的流程示意图;

图6是根据本发明实施例的另一种解码装置的结构框图。

具体实施方式

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。

需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

为了更好地理解本申请实施例,以下将本申请实施例中所涉及的技术术语解释如下:

硬件解码:是图形芯片厂家提出的用gpu资源解码视频流的方案——与之相对的是软解,也就是传统的用cpu承担解码工作的方案;

帧缓冲区(显存):是由像素组成的二维数组,每一个存储单元对应屏幕上的一个像素,整个帧缓冲对应一帧图像即当前屏幕画面。

根据本发明实施例,提供了一种解码方法的方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

图2是根据本发明实施例的一种解码方法的流程示意图。如图2所示,该方法包括:

步骤s202,在对待解码视频数据中当前帧进行解码的过程中,检测在上述解码过程中设置的状态机的状态,其中,上述状态用于指示解码过程中所执行的动作。

在一个可选实施例中,上述状态机的状态可以包括但不限于用于解析新的片头的parse_new_slice、用于请求帧缓冲区的req_fb、用于请求命令队列的req_cq以及用于执行硬件解码的hw_decoding。

步骤s204,通过执行上述状态所对应的动作和切换上述状态机的状态,执行以下操作:采用乒乓缓存的方式存储硬件解码配置参数;并对下一帧的片头(sliceheader)进行解析,得到下一帧的硬件解码配置参数,并将上述下一帧的硬件解码配置参数存储至乒乓缓存中;以及在用于硬件解码的中断处理函数中,触发使用上述乒乓缓存中的硬件解码配置参数对上述待解码视频数据进行硬件解码。

可选地,通过执行上述状态所对应的动作和切换上述状态机的状态,执行上述操作,可以通过以下方式实现,但不限于此:在检测到上述状态机处于第一状态时,解析下一帧的片头,并切换为第二状态;

在上述第二状态下,判断是否存在空闲的帧缓冲区,如果是,将上述状态机切换为第三状态,否则,判断硬件是否处于空闲状态;在上述硬件处于空闲状态时,开始硬件解码;

在上述状态机切换为第三状态时,判断是否存在空闲的命令队列内存,如果否,则判断硬件是否处于空闲状态;在上述硬件处于空闲状态时,开始硬件解码。

可选地,在上述状态机处于第三状态,且存在空闲的命令队列内存时,将上述下一帧的硬件解码配置参数存储至上述空闲的命令队列内存中。作为本申请的一个可选实施例,在用于硬件解码的中断处理函数中释放命令队列内存;并判断是否存在可读状态的命令队列,如果存在,开始进行硬件解码。

为便于理解上述实施例,以下结合图3a和图3b详细说明。以下实施例采用状态机的方法,通过两个命令队列作为ping-pongbuffer,储存配置硬件寄存器的数据,预先解析一帧sliceheader,然后在硬件解码结束中断处理函数中启动硬件解码,减少硬件空闲的时间,从而达到加快解码速度的目的。具体地:

如图3a所示,采用状态机的方式,设定四种状态:parse_new_slice、req_fb、req_cq、hw_decoding;然后在解码任务和帧解码结束中断处理函数切换状态机。

在解码任务中,根据状态机完成相应流程。如果当前状态机是parse_new_slice,则解析一帧sliceheader,然后把状态机切换为req_fb,开始判断有没空闲的帧缓冲区用作解码,如果成功申请到帧缓冲区,则把状态机切换为req_cq,开始判断有没空闲的命令队列内存;如果申请帧缓冲区失败,则查询硬件是否处空闲状态以及是否已经有准备好的命令队列,如果两个条件都满足,则启动硬件解码。

如果当前状态机是req_cq,开始判断有没空闲的命令队列内存,如果成功申请到命令队列内存,则把需要配置硬件解码的参数储存到命令队列;如果申请命令队列内存失败,则查询硬件是否处空闲状态以及是否已经有准备好的命令队列,如果两个条件都满足,则启动硬件解码。

如图3b所示,在硬件帧解码结束中断处理函数中,把储存当前解码帧参数的命令队列内存释放,然后查询是否已经在准备好的命令队列,如果有,则启动硬件解码。

图4是根据本发明实施例的一种解码装置的结构框图。如图4所示,该装置包括:

检测模块40,用于在对待解码视频数据中当前帧进行解码的过程中,检测在上述解码过程中设置的状态机的状态,其中,上述状态用于指示解码过程中所执行的动作;

执行模块42,耦合连接至检测模块40,用于通过执行上述状态所对应的动作和切换上述状态机的状态,执行以下操作:采用乒乓缓存的方式存储硬件解码配置参数;并对下一帧的片头进行解析,得到下一帧的硬件解码配置参数,并将上述下一帧的硬件解码配置参数存储至乒乓缓存中;以及在用于硬件解码的中断处理函数中,触发使用上述乒乓缓存中的硬件解码配置参数对上述待解码视频数据进行硬件解码。

需要说明的是,上述各个模块是可以通过软件或硬件的方式来实现的,对于后者,可以表现为以下实现方式,但不限于此:上述各个模块位于同一处理器中;或者,上述各个模块以任意组合的方式位于不同的处理器中。

需要说明的是,图4所示装置的优选实施方式可以参见图2所示方法实施例中的相关描述,此处不再赘述。

图5是根据本发明实施例的另一种解码方法的流程示意图,如图5所示,该方法包括如下步骤:

步骤s502,在对当前帧进行解码过程中,检测第一缓冲区和第二缓冲区的状态,其中,上述状态包括:只读状态和可写状态;可选地,在检测第一缓冲区和第二缓冲区的状态之前,还可以对上述当前帧的片头进行解析,得到上述第一配置参数;在一个可选实施例中,上述第一配置参数也可以从其它设备中获取,该其他设备为具有解析帧图像功能的设备。

步骤s504,在上述第一缓冲区处于只读状态且上述第二缓冲区处于可写状态时,从上述第一缓冲区中读取用于对当前帧进行硬件解码的硬件解码配置参数;并获取下一帧的硬件解码配置参数,将上述下一帧的硬件解码配置参数存储至第二缓冲区中;

上述硬件解码配置参数包括但不限于:压缩率、视频格式等。

步骤s506,在用于解码的硬件设备处于空闲状态时,使用从指定缓冲区读取的硬件解码配置参数对上述当前帧进行硬件解码,其中,上述指定缓冲区为上述第一缓冲区和第二缓冲区中当前处于只读状态的缓冲区。

通过以下至少之一方式触发检测上述硬件设备是否处于空闲状态:检测到帧缓冲区申请失败,其中,上述帧缓冲区用于存储对上述当前帧进行解码后的图像数据;检测到用于存储硬件解码配置参数的命令队列内存申请失败;以及检测到以下情况:在用于硬件解码的中断处理函数中,释放用于存储硬件解码配置参数的命令队列内存,以及上述命令队列内存从可写状态变为只读状态。

在一个可选实施例中,可以通过以下方式将下一帧的硬件解码配置参数存储值命令队列内存中,具体地,可以通过以下方式实现,但不限于此:将在检测到上述帧缓冲区申请成功时,触发申请上述命令队列内存;在检测到上述命令队列内存申请成功时,将上述下一帧的硬件解码配置参数存储至上述命令队列内存中。

可选地,在上述第一缓冲区由只读状态变为可写状态,上述第二缓冲区由可写状态变为上述只读状态时,并且在上述用于解码的硬件设备处于空闲状态时,使用从上述第二缓冲区读取的上述下一帧的硬件解码配置参数对下一帧进行硬件解码。

需要说明的是,上述第一缓冲区和第二缓冲区的状态是可以变化的,并且,在不同的状态其参与的动作也是不同的,例如:在上述第一缓冲区由只读状态变为可写状态,上述第二缓冲区由可写状态变为上述只读状态时,并且在上述用于解码的硬件设备处于空闲状态时,使用从上述第二缓冲区读取的上述第二配置参数对上述当前帧的下一帧进行硬件解码。从上述内容也可以看出,由于可以在当前帧进行解码时,可以预先获取下一帧的配置参数,因此,减少了硬件的空闲时间,有助于提高解码效率。

本发明实施例还提供一种解码装置,该解码装置用于实现图5所示的解码方法,图6是根据本发明实施例的另一种解码装置的结构框图。如图6所示,该装置包括:

检测模块60,用于在对当前帧进行解码过程中,检测第一缓冲区和第二缓冲区的状态,其中,上述状态包括:只读状态和可写状态;

处理模块62,用于在上述第一缓冲区处于只读状态且上述第二缓冲区处于可写状态时,从上述第一缓冲区中读取用于对当前帧进行硬件解码的硬件解码配置参数;并获取下一帧的硬件解码配置参数,将上述下一帧的硬件解码配置参数存储至第二缓冲区中;

解码模块66,在用于解码的硬件设备处于空闲状态时,使用从指定缓冲区读取的硬件解码配置参数对上述当前帧进行硬件解码,其中,上述指定缓冲区为上述第一缓冲区和第二缓冲区中当前处于只读状态的缓冲区。

需要说明的是,上述各个模块是可以通过软件或硬件的方式来实现的,对于后者,可以表现为以下实现方式,但不限于此:上述各个模块位于同一处理器中;或者,上述各个模块以任意组合的方式位于不同的处理器中。

需要说明的是,图6所示装置的优选实施方式可以参见图2和5所示方法实施例中的相关描述,此处不再赘述。

本实施例还提供一种存储介质,上述存储介质包括存储的程序,其中,在上述程序运行时控制上述存储介质所在设备执行图2或图6所示的解码方法。

以执行图2所示方法为例,上述存储介质至少用于存储执行以下功能的程序:在对待解码视频数据中当前帧进行解码的过程中,检测在解码过程中设置的状态机的状态,其中,状态用于指示解码过程中所执行的动作;通过执行状态所对应的动作和切换状态机的状态,执行以下操作:采用乒乓缓存的方式存储硬件解码配置参数;并对下一帧的片头进行解析,得到下一帧的硬件解码配置参数,并将下一帧的硬件解码配置参数存储至乒乓缓存中;以及在用于硬件解码的中断处理函数中,触发使用乒乓缓存中的硬件解码配置参数对待解码视频数据进行硬件解码。

可选地,上述存储介质还用于执行以下功能的程序:在检测到状态机处于第一状态时,解析下一帧的片头,并切换为第二状态;在第二状态下,判断是否存在空闲的帧缓冲区,如果是,将状态机切换为第三状态,否则,判断硬件是否处于空闲状态;在硬件处于空闲状态时,开始硬件解码;在状态机切换为第三状态时,判断是否存在空闲的命令队列内存,如果否,则判断硬件是否处于空闲状态;在硬件处于空闲状态时,开始硬件解码。

可选地,上述存储介质还用于存储执行以下功能的程序:在状态机处于第三状态,且存在空闲的命令队列内存时,将下一帧的硬件解码配置参数存储至空闲的命令队列内存中。

本实施例还提供一种处理器,上述处理器用于运行程序,其中,上述程序运行时执行图2或图4所示的解码方法

以执行图2所示方法为例,上述处理器在运行时,执行以下功能的程序:在对待解码视频数据中当前帧进行解码的过程中,检测在解码过程中设置的状态机的状态,其中,状态用于指示解码过程中所执行的动作;通过执行状态所对应的动作和切换状态机的状态,执行以下操作:采用乒乓缓存的方式存储硬件解码配置参数;并对下一帧的片头进行解析,得到下一帧的硬件解码配置参数,并将下一帧的硬件解码配置参数存储至乒乓缓存中;以及在用于硬件解码的中断处理函数中,触发使用乒乓缓存中的硬件解码配置参数对待解码视频数据进行硬件解码。

可选地,上述处理器还用于执行以下功能的程序:在第一缓冲区由只读状态变为可写状态,第二缓冲区由可写状态变为只读状态时,并且在用于解码的硬件设备处于空闲状态时,使用从第二缓冲区读取的第二配置参数对当前帧的下一帧进行硬件解码。

可选地,上述处理器还用于执行以下功能的程序:在检测到状态机处于第一状态时,解析下一帧的片头,并切换为第二状态;在第二状态下,判断是否存在空闲的帧缓冲区,如果是,将状态机切换为第三状态,否则,判断硬件是否处于空闲状态;在硬件处于空闲状态时,开始硬件解码;在状态机切换为第三状态时,判断是否存在空闲的命令队列内存,如果否,则判断硬件是否处于空闲状态;在硬件处于空闲状态时,开始硬件解码。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1