一种AVS2并行编码处理系统及方法与流程

文档序号:12279709阅读:290来源:国知局
一种AVS2并行编码处理系统及方法与流程

本发明涉及音视频编解码技术,尤其涉及一种AVS2并行编码处理系统及方法。



背景技术:

技术词解释:

TLS:Thread Local Storage的简称,中文为线程局部存储。

AVS2是继AVS之后我国自主研发的新一代音视频编码标准,是《信息技术高效多媒体编码》标准的简称。它的目标是:在主流技术可以实现的条件下,当重建视频的主观质量一致时,AVS2对高清或更高分辨率视频编码效率至少要比AVS1的最好性能提高1倍。在主流的编码配置下,效率要高于最新的国际标准HEVC/H.265。AVS2与最新的国际编码标准HEVC/H.265对于常规视频的编码效率相当,比国际标准H.264/AVC以及第一代国家标准AVSl的编码效率提高近1倍;而对于监控等场景类视频,AVS2的压缩效率是H.264/AVC的4倍。因此,作为我国制定的第二代具有自主知识产权的音视频编解码标准,AVS2直接影响着我国在国际视频领域的核心竞争力,关系着未来我国在信息领域的战略部署,对于我国信息化产业的快速发展具有重大意义。然而,由于AVS2引入了很多最新的视频编码技术,编码计算复杂度也明显增加,给实时编码实现带来了新的挑战。

根据AVS2标准可知,AVS2编码器在编码一帧图像时,是以LCU(即最大编码单元)为基本单位串行进行的,而其具体原理为:在编码每一个LCU时,首先对当前LCU的相关变量进行初始化,然后判断该LCU是否属于新的条带,若是属于新的条带,则对当前条带的相关变量进行初始化,并把条带头信息输入码流,而后再对当前LCU进行编码;最后经过熵编码得到需要传输的码流,包括条带头数据、残差信息、分块信息等;其中,在存储码流的时候,码流是不断叠加存储在一个总的码流存储器中的,直到所有LCU编码完成,则输出总码流,一帧图像编码完毕。由此可见,传统的AVS2编码处理技术存有处理效率低下、无法满足AVS2实时编码要求等缺点。



技术实现要素:

为了解决上述技术问题,本发明的目的是提供一种编码处理效率高的AVS2并行编码处理系统。

本发明的另一目的是提供一种编码处理效率高的AVS2并行编码处理方法。

本发明所采用的技术方案是:一种AVS2并行编码处理系统,该系统包括:

编码单元,用于以条带作为基本编码单元对帧图像进行条带划分,然后对划分后得到的多个条带进行并行编码处理。

进一步,所述编码单元包括:

划分模块,用于以条带作为基本编码单元对帧图像进行条带划分,从而得到该帧图像的多个条带;

编码控制处理模块,用于将当前帧图像的所有条带依次放入任务队列中,然后利用线程池来对多个条带进行并行编码处理。

进一步,所述利用线程池来对多个条带进行并行编码处理,其具体包括:

当任务队列中每放入一个条带时,则唤醒线程池中一个空闲工作线程,令该被唤醒的工作线程对当前被放入任务队列的条带进行编码处理;

当任务队列中存有未进行编码的条带,且所有的工作线程均处于忙碌状态时,则创建新的工作线程来对该未进行编码的条带进行编码处理,或者,使任务队列中未进行编码的条带处于等待状态,直到结束任务之后重新返回线程池的工作线程来对该未进行编码的条带进行编码处理;

当工作线程完成一个条带的编码处理后,则重新返回线程池,并将当前已完成编码处理的条带的数量加1,然后判断任务队列中是否存有未进行编码的条带,若是,则令该工作线程对该未进行编码的条带进行编码处理,反之,则将该工作线程置为阻塞状态,等待下一个任务的到来;

当已完成编码处理的条带的数量与帧图像的总条带数量相同时,则唤醒主线程进行数据串行处理。

进一步,所述对条带进行编码处理,其具体为:

对条带的条带头信息进行存储,然后对条带内的LCU依次进行编码,直到条带内的所有LCU编码完成。

进一步,所述利用线程池来对多个条带进行并行编码处理,其具体还包括:

当工作线程需要进行全局变量访问时,则对其自身存有的全局变量的副本进行操作,从而实现全局变量的访问。

进一步,还包括码流缓冲单元,所述码流缓冲单元包括一个总码流存储器和多个子码流存储器;

所述总码流存储器,用于存储帧图像的图像头信息;

所述子码流存储器,用于存储条带的条带头信息以及条带内所有LCU的编码信息。

本发明所采用的另一技术方案是: 一种AVS2并行编码处理方法,该方法包括:

以条带作为基本编码单元对帧图像进行条带划分,然后对划分后得到的多个条带进行并行编码处理。

进一步,所述以条带作为基本编码单元对帧图像进行条带划分,然后对划分后得到的多个条带进行并行编码处理这一步骤具体包括:

以条带作为基本编码单元对帧图像进行条带划分,从而得到该帧图像的多个条带;

将当前帧图像的所有条带依次放入任务队列中,然后利用线程池来对多个条带进行并行编码处理。

进一步,所述利用线程池来对多个条带进行并行编码处理这一步骤,其具体包括:

当任务队列中每放入一个条带时,则唤醒线程池中一个空闲工作线程,令该被唤醒的工作线程对当前被放入任务队列的条带进行编码处理;

当任务队列中存有未进行编码的条带,且所有的工作线程均处于忙碌状态时,则创建新的工作线程来对该未进行编码的条带进行编码处理,或者,使任务队列中未进行编码的条带处于等待状态,直到结束任务之后重新返回线程池的工作线程来对该未进行编码的条带进行编码处理;

当工作线程完成一个条带的编码处理后,则重新返回线程池,并将当前已完成编码处理的条带的数量加1,然后判断任务队列中是否存有未进行编码的条带,若是,则令该工作线程对该未进行编码的条带进行编码处理,反之,则将该工作线程置为阻塞状态,等待下一个任务的到来;

当已完成编码处理的条带的数量与帧图像的总条带数量相同时,则唤醒主线程进行数据串行处理。

进一步,所述利用线程池来对多个条带进行并行编码处理这一步骤,其具体还包括:

当工作线程需要进行全局变量访问时,则对其自身存有的全局变量的副本进行操作,从而实现全局变量的访问。

本发明的有益效果是:本发明的系统是以条带作为基本编码单元对帧图像进行条带划分,然后对划分后得到的多个条带进行并行编码处理,从而实现帧图像的编码处理的,因此,相较于传统的AVS2编码处理,本发明的系统则无需在编码过程中对每一个LCU进行判断,判断该LCU是否属于新的条带,这样则能节省大量重复的冗余步骤,大大提高AVS2编码处理的效率。而且,本发明的系统是以数据并行处理方式来对多个条带进行编码处理的,因此,相较于传统的串行方式,本发明系统的数据处理效率更高,更能满足AVS2实时编码的需要。

本发明的另一有益效果是:本发明的方法是以条带作为基本编码单元对帧图像进行条带划分,然后对划分后得到的多个条带进行并行编码处理,从而实现帧图像的编码处理的,因此,相较于传统的AVS2编码处理,本发明的方法则无需在编码过程中对每一个LCU进行判断,判断该LCU是否属于新的条带,这样则能节省大量重复的冗余步骤,而且本发明的方法是采用并行方式来进行条带编码的,因此通过使用本发明的方法,则能大大提高AVS2的编码处理效率,满足AVS2实时编码的需要。

附图说明

下面结合附图对本发明的具体实施方式作进一步说明:

图1是本发明一种AVS2并行编码处理系统的结构框图;

图2是本发明一种AVS2并行编码处理方法的步骤流程图。

具体实施方式

如图1所示,一种AVS2并行编码处理系统,该系统包括:

编码单元,用于以条带作为基本编码单元对帧图像进行条带划分,然后对划分后得到的多个条带进行并行编码处理。所述编码单元可优选应用在AVS2编码器中。

作为本实施例系统的优选实施方式,所述编码单元包括:

划分模块,用于以条带作为基本编码单元对帧图像进行条带划分,从而得到该帧图像的多个条带;

编码控制处理模块,用于将当前帧图像的所有条带依次放入任务队列中,然后利用线程池来对多个条带进行并行编码处理。

作为本实施例系统的优选实施方式,所述利用线程池来对多个条带进行并行编码处理,其具体包括:

当任务队列中每放入一个条带时,则唤醒线程池中一个空闲工作线程,令该被唤醒的工作线程对当前被放入任务队列的条带进行编码处理;

当任务队列中存有未进行编码的条带,且所有的工作线程均处于忙碌状态时,则创建新的工作线程来对该未进行编码的条带进行编码处理,或者,使任务队列中未进行编码的条带处于等待状态,直到结束任务之后重新返回线程池的工作线程来对该未进行编码的条带进行编码处理;

当工作线程完成一个条带的编码处理后,则重新返回线程池,并将当前已完成编码处理的条带的数量加1,然后判断任务队列中是否存有未进行编码的条带,若是,则令该工作线程对该未进行编码的条带进行编码处理,反之,则将该工作线程置为阻塞状态,等待下一个任务的到来;

当已完成编码处理的条带的数量与帧图像的总条带数量相同时,则唤醒主线程进行数据串行处理。

作为本实施例系统的优选实施方式,所述对条带进行编码处理,其具体为:

对条带的条带头信息进行存储,然后对条带内的LCU依次进行编码,直到条带内的所有LCU编码完成。

作为本实施例系统的优选实施方式,所述利用线程池来对多个条带进行并行编码处理,其具体还包括:

当工作线程需要进行全局变量访问时,则对其自身存有的全局变量的副本进行操作,从而实现全局变量的访问。

作为本实施例系统的优选实施方式,所述利用线程池来对多个条带进行并行编码处理,其具体还包括:

创建线程池,并在线程池内创建多个工作线程,通常,所述工作线程的个数默认为当前处理器的核数;然后,将所述多个工作线程放入到空闲线程队列中。

优选地,对于所述的工作线程,其无需执行任务时使其置为阻塞状态,而其需要执行任务时则使其置为可调度状态,这样在工作线程无工作项目时则不会占用处理器资源,只占用少量内存空间,大大提高操作的灵活度。

作为本实施例系统的优选实施方式,还包括码流缓冲单元,所述码流缓冲单元包括一个总码流存储器和多个子码流存储器;

所述总码流存储器,用于存储帧图像的图像头信息;

所述子码流存储器,用于存储条带的条带头信息以及条带内所有LCU的编码信息。待所有条带编码完成后,各个子码流存储器中所存储的码流按照条带顺序依次合并到总码流中,最终得到的码流就是一进行编码的帧图像码流。

优选地,所述子码流存储器的个数为N,并且每个子码流存储器被分配的内存大小为总码流存储器的内存大小的1/N。

如图 2所示,一种AVS2并行编码处理方法,该方法包括:

以条带作为基本编码单元对帧图像进行条带划分,然后对划分后得到的多个条带进行并行编码处理。

作为本实施例方法的优选实施方式,所述以条带作为基本编码单元对帧图像进行条带划分,然后对划分后得到的多个条带进行并行编码处理这一步骤具体包括:

以条带作为基本编码单元对帧图像进行条带划分,从而得到该帧图像的多个条带;

将当前帧图像的所有条带依次放入任务队列中,然后利用线程池来对多个条带进行并行编码处理。

作为本实施例方法的优选实施方式,所述利用线程池来对多个条带进行并行编码处理这一步骤,其具体包括:

当任务队列中每放入一个条带时,则唤醒线程池中一个空闲工作线程,令该被唤醒的工作线程对当前被放入任务队列的条带进行编码处理;

当任务队列中存有未进行编码的条带,且所有的工作线程均处于忙碌状态时,则创建新的工作线程来对该未进行编码的条带进行编码处理,或者,使任务队列中未进行编码的条带处于等待状态,直到结束任务之后重新返回线程池的工作线程来对该未进行编码的条带进行编码处理;

当工作线程完成一个条带的编码处理后,则重新返回线程池,并将当前已完成编码处理的条带的数量加1,然后判断任务队列中是否存有未进行编码的条带,若是,则令该工作线程对该未进行编码的条带进行编码处理,反之,则将该工作线程置为阻塞状态,等待下一个任务的到来;

当已完成编码处理的条带的数量与帧图像的总条带数量相同时,则唤醒主线程进行数据串行处理。

作为本实施例方法的优选实施方式,所述对条带进行编码处理,其具体为:

对条带的条带头信息进行存储,然后对条带内的LCU依次进行编码,直到条带内的所有LCU编码完成。

作为本实施例方法的优选实施方式,所述利用线程池来对多个条带进行并行编码处理这一步骤,其具体还包括:

当工作线程需要进行全局变量访问时,则对其自身存有的全局变量的副本进行操作,从而实现全局变量的访问。

作为本实施例方法的优选实施方式,所述利用线程池来对多个条带进行并行编码处理这一步骤,其具体还包括:

创建线程池,并在线程池内创建多个工作线程,通常,所述工作线程的个数默认为当前处理器的核数;然后,将所述多个工作线程放入到空闲线程队列中。

本发明一具体实施例

AVS2标准中,在编码一帧图像时,每一个条带都会在开始编码之前对其二元符号模型和熵编码器进行初始化,而且条带内的每个LCU编码时只会参考到本条带内的其它LCU,不会使用到帧图像内其它条带的数据。因此由此可见,帧图像中的各个条带间的编码是相互独立的,这样以条带作为基本编码单元来实现并行编码处理,能达到快速提高编码速度的目的。

基于条带作为基本编码单元的AVS2视频并行编码优化算法,其具体包括以下四个组成部分:

一、并行编码器的架构设计

若想实现基于条带的AVS2并行编码,则首先编码器框架必须要以条带作为基本编码单元进行编码,这就需要对原编码器中以LCU为基本单元的编码框架进行调整。调整后的编码器,在编码一帧图像时,是以条带作为基本编码单元进行编码的,一个条带内的所有LCU编码完成之后,再对下一个条带进行编码,直到该帧图像中的所有条带编码完成。在编码条带时,首先对条带进行初始化并存储该条带的条带头信息,这样则不再需要像之前那样编码每一个LCU时都要判断其是否属于新的条带。对条带进行初始化完成之后,再对条带内的LCU依次进行编码,直到条带内的所有LCU编码完成。

由上述可见,本实施例中的编码系统可具体为AVS2编码器,而所述编码器包含一编码单元,所述编码单元具体用于以条带作为基本编码单元对帧图像进行条带划分,然后对划分后得到的多个条带进行并行编码处理;

其中,所述对条带进行编码处理,其具体为:对条带进行初始化并对条带头信息进行存储,然后对条带内的LCU依次进行编码,直到条带内的所有LCU编码完成。

二、码流缓冲区设计

在调整后的并行编码框架基础上,需要对码流缓冲区进行调整,在编码一帧含有N个条带的图像时,编码器在码流缓冲区建立1个总码流存储器(GlobalBitStream)和N个子码流存储器(SliceBitStream[i]),并为各个存储器分配一定的内存空间,其中子码流存储器被分配到的内存大小为总码流存储器被分配到的内存大小的1/N。在编码过程中,首先把图像头信息存储到总码流存储器中,然后在编码每一个条带时,把各条带的条带头信息和条带内所有LCU的编码信息存储在码流缓冲区内对应的子码流存储器中,即相当于一子码流存储中存储一条带的条带头信息及该条带内所有LCU的编码信息。待所有条带编码完成后,再把各个子码流存储器中的码流按照条带顺序依次合并到总码流中,则最终得到的码流就是编码一帧图像的码流。

由上述可见,本实施例中编码器还包括码流缓冲单元,所述码流缓冲单元包括一个总码流存储器和多个子码流存储器;

所述总码流存储器,用于存储帧图像的图像头信息;

所述子码流存储器,用于存储条带的条带头信息以及条带内所有LCU的编码信息。

其中,所述子码流存储器被分配到的内存大小为总码流存储器被分配到的内存大小的1/N,N为子码流存储器的总个数。

三、线程池设计

本实施例中的线程池是一种多线程处理形式,采用的是事先创建线程的技术。而通过采用线程池技术来对多个条带进行并行编码处理,能够节省编码每个条带时需要不断创建、销毁线程所占用的 CPU 时间。具体地,所述利用线程池来对多个条带进行并行编码处理的具体步骤包括:

1、在AVS2编码器启动后,首先创建一个线程池,并在线程池内创建一定数量的工作线程(默认为当前处理器的核数),然后把这些工作线程放入到一个空闲线程队列;并且当无工作项目时使这些工作线程处于阻塞状态,这样在无工作项目时,工作线程则不占用处理器资源,只占用少量内存空间,而有工作项目时才为可调度的;

2、当主程序执行到对一帧图像进行编码时,首先把当前帧图像的所有条带依次放入一个任务队列中,QueueWork(encode_one_slice,(void *)& CurrentMbNumber),当所有条带都放入到任务队列中后,创建一个事件对象,其事件信号设为无信号状态,WorkFinished = CreateEvent(NULLTRUE,FALSE,NULL);然后,主线程设为阻塞状态,WaitForSingleObject(WorkFinished ,INFINITE),等待事件信号转为有信号状态;

3、与此同时,当任务队列中每放入一个条带,则唤醒线程池中的一个空闲工作线程,令该工作线程对当前条带开始编码,在工作线程中调用任务时使用的是函数指针,函数指针作为参数调用来传递相关数据,而用于调用的任务函数定义为void ThreadFun (void * context);当任务队列中存有未编码完成的条带,而所有的工作线程均处于忙碌状态,即没有空闲的线程来执行编码处理时,线程池管理器可以额外创建一定数量的工作线程,来执行更多的任务,也可以让任务队列中等待编码的条带先处于等待状态,等待结束任务之后重新返回线程池的线程来执行;

4、每个工作线程完成一个条带的编码,则重新回到线程池,并把完成条带的数量加1;而回到线程池的工作线程则不需要退出,若任务队列仍存在未执行编码的条带,则工作线程继续对该条带进行编码,否则就置为阻塞状态,等待下一个任务的到来;当完成编码的条带的数量和当前帧图像内的总条带数量相同时,则将所述事件对象,其事件信号WorkFinished置为有信号状态,SetEvent(WorkFinished),从而唤醒主线程,主线程进入到接下来的串行部分,包括同步数据和合并码流等;

5、完成一帧图像的编码之后,若视频序列仍没有结束,则重新回到步骤2,继续进行编码。若视频序列结束,则销毁线程,销毁线程池。

由上述可见,本实施例中编码单元所包含的编码控制处理模块具体用于将当前帧图像的所有条带依次放入任务队列中,然后利用线程池来对多个条带进行并行编码处理。

其中,所述利用线程池来对多个条带进行并行编码处理,其具体包括:

创建一个线程池,并在线程池内创建多个工作线程,通常,所述工作线程的个数可优选默认为当前处理器的核数;然后,将所述多个工作线程放入到空闲线程队列中;其中,当工作线程无需执行任务时则使其置为阻塞状态,而其需要执行任务时则使其置为可调度状态;

当执行帧图像编码时,将当前帧图像中的所有条带依次放入一个任务队列中;而当所有条带都放入到任务队列中后,则创建事件对象,并使其事件信号设为无信号状态,然后将主线程设为阻塞状态,等待事件信号转为有信号状态;

当任务队列中每放入一个条带时,则唤醒线程池中一个空闲工作线程,令该被唤醒的工作线程对当前被放入任务队列的条带进行编码处理;

当任务队列中存有未进行编码的条带,且所有的工作线程均处于忙碌状态时,则创建新的工作线程来对该未进行编码的条带进行编码处理,或者,使任务队列中未进行编码的条带处于等待状态,直到结束任务之后重新返回线程池的工作线程来对该未进行编码的条带进行编码处理;

当工作线程完成一个条带的编码处理后,则重新返回线程池,并将当前已完成编码处理的条带的数量加1,然后判断任务队列中是否存有未进行编码的条带,若是,则令该工作线程对该未进行编码的条带进行编码处理,反之,则将该工作线程置为阻塞状态,等待下一个任务的到来;

当已完成编码处理的条带的数量与帧图像的总条带数量相同时,则唤醒主线程进行后续的数据串行处理,如包括后续的数据同步处理、码流合并处理等;

当完成一帧图像的编码处理后,则判断视频序列中所包含的帧图像是否均已进行编码,若是,则表示视频序列的编码处理已结束,此时,则销毁线程及销毁线程池;反之,则将未进行编码的一帧图像的所有条带依次放入任务队列中,从而利用线程池来对多个条带进行编码处理。

四、数据本地存储实现

本实施例中,AVS2编码器利用TLS技术从而实现不同工作线程同时访问共享资源。使用TLS之后,并行编码的工作线程可以同时对全局变量进行访问,而且能够单独享有全局变量,也就是说使用了TLS的每个工作线程都可以拥有全局变量的一个副本,对全局变量访问时只对这一副本进行操作,线程之间相互独立,互不干扰,因此这样能进一步提高并行编码处理的工作效率。而隐式使用TLS是由编译器、加载器和链接器共同协作实现的,具体操作就是在需要用到线程本地存储的变量前加上修饰符__declspec(thread)。这种方法比较简单,而且比较适用于AVS2编码器中大量的局部存储变量以及频繁的调用现状。

优选地,本算法在对AVS2编码中的关键模块深入了解,并对编码器具体代码细致分析之后,共对155个全局变量设置了线程本地存储,首先创建了TlsData 数据结构,并把155个需要线程局部存储化的变量放入其中,然后执行__declspec(thread) TlsData *TlsInfo操作,从而生成一个线程局部存储的指针,每次需要使用到某个变量时,例如current_mb_nr,只需要执行TlsInfo->current_mb_nr,代表的就是当前工作线程所使用的变量为current_mb_nr,这样工作线程之间则不会有所影响。另外,主线程把各个条带的编码任务放到任务队列之后,工作线程接收到编码任务,首先对*TlsInfo指针分配一个TlsData大小的内存空间,然后利用tlsmalloc()函数,对所有线程局部存储的变量分配所需的内存空间,最后在对一个条带完成编码之后则利用tlsfree()函数将所有工作线程中分配的内存空间进行释放。

由上述可见,所述利用线程池来对多个条带进行并行编码处理,其具体还包括:

当工作线程需要进行全局变量访问时,则对其自身存有的全局变量的副本进行操作,从而实现全局变量的访问;

而这一步骤具体包括:

对相对应的多个全局变量设置线程本地存储,具体地,首先创建TlsData 数据结构,并将多个全局变量放入其中,然后执行__declspec(thread) TlsData *TlsInfo操作,从而生成一个线程局部存储的指针;其中,所述全局变量前设有修饰符__declspec(thread);

当工作线程接收到条带编码任务后,首先对*TlsInfo指针分配一个TlsData大小的内存空间,然后利用tlsmalloc()函数,对所有线程局部存储的变量分配所需的内存空间;

当工作线程对全局变量进行访问时,则执行TlsInfo->变量这一指令;

当工作线程对条带完成编码后则利用tlsfree()函数将所有工作线程中分配的内存空间进行释放。

以上是对本发明的较佳实施进行了具体说明,但本发明创造并不限于所述实施例,熟悉本领域的技术人员在不违背本发明精神的前提下还可做作出种种的等同变形或替换,这些等同的变形或替换均包含在本申请权利要求所限定的范围内。

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