视频编码方法和装置
技术领域
本发明的实施方式涉及视频编码,并且具体而言,涉及支持多路编码通道的视频编码中的应用层编码线程唤醒。
背景技术
当前,硬件编码器件能够支持多个独立的编码通道,从而实现了多路并行编码,满足了不同应用层编码线程同时需要进行视频编码的需求。
当完成了一个编码通道上的数据编码后,该编码通道会产生中断通知,以通知其驱动模块,驱动模块需要唤醒应用层编码线程,以读取该编码通道的码流。当前,对于多路编码,多采用线程唤醒后查询的方式。当一次编码成功后,所有的应用层编码线程都被唤醒,然后通过查询可以得知分配给自己的编码通路没有编码数据,然后再次进入休眠等待。这样使***浪费在了很多无谓的工作上,使***效率下降。
例如,图1示出了根据现有技术的在一个编码通道编码完成后、唤醒应用层编码线程的示意图。硬件编码器件120可以支持多个编码通道122-1、122-2、……122-n。硬件编码器件120的驱动模块124针对应用层110的编码线程1 112分配编码通道1 122-1,针对应用层110的编码线程2 114分配编码通道2 122-2,并且维持了这样的分配关系。如图1所示,假如在编码通道1完成数据编码,则编码通道1将产生中断以通知驱动模块124,如图中的箭头130所示,驱动模块124将唤醒所有的应用层编码线程,即112和114,如图中的箭头132和134所示。之后,应用层编码线程112和114都将向驱动模块124查询分配给它自己的编码通路有没有编码数据。如图1所示,编码线程2 114在被唤醒后,经过查询,发现在分配给自己的编码通道上尚无可用编码码流,再次进入休眠等待状态。编码线程2 114的此次唤醒和再次休眠,无疑是***资源的浪费。
举例而言,在硬件编码器件120的驱动模块采用Linux***进行开发的情形下,对于多路编码,多采用select函数查询,当该函数被唤醒返回后,通过***调用来查询该路是否有编码好的数据产生,如果有,则将数据读走处理,如果没有,则将继续休眠等待。在驱动程序中的处理一般为当有一路编码生成后,通过poll函数唤醒所有在该器件上等待的线程,对于所有的n路编码,只有一路是真正能获取数据的,其他n-1路都被唤醒,查询无数据后再次休眠。这样,其他n-1路的被唤醒和查询都是无效率的和无谓的,加重的***的负载而没有实际的效率。
发明内容
因此,本发明的目的在于解决前述的一个或多个问题,提供一种创新性的支持多路编码通道的视频编码中的应用层编码线程唤醒。
根据本发明的一个方面,提供一种视频编码方法,利用硬件编码器件的多个编码通道支持对多个应用层编码线程的同时编码。该方法包括:将所述多个应用层编码线程中的至少一个应用层编码线程与所述多个编码通道中的一个编码通道相绑定;激活所述多个编码通道中的所述被绑定的编码通道,以便对视频进行编码;以及在所述多个编码通道中的一个编码通道完成编码后,唤醒与所述多个编码通道中的所述一个编码通道相绑定的至少一个应用层编码线程。
根据本发明的有一个方面,提供一种视频编码装置,利用硬件编码器件的多个编码通道支持对多个应用层编码线程的同时编码。所述视频编码装置包括:绑定模块,用于将所述多个应用层编码线程中的至少一个应用层编码线程与所述多个编码通道中的一个编码通道相绑定;编码模块,用于激活所述多个编码通道中的所述被绑定的编码通道,以便对视频进行编码;以及唤醒模块,用于在所述多个编码通道中的一个编码通道完成编码后,唤醒与所述多个编码通道中的所述一个编码通道相绑定的至少一个应用层编码线程。
根据本发明的实施方式,能够在硬件编码器件的编码通道完成编码后,精确地唤醒该次编码所对应的应用层编码线程,而不影响其他线程。
附图说明
结合附图并参考以下详细说明,本发明各实施方式的特征、优点及其他方面将变得更加明显。在附图中:
图1示出了根据现有技术的唤醒应用层编码线程的示意图;
图2示出了根据本发明的实施方式的唤醒应用层编码线程的示意图;
图3示出了根据本发明的实施方式的视频编码方法的流程图;以及
图4示出了根据本发明的实施方式的视频编码装置的方框图。
具体实施方式
下文将结合附图参考若干示例性实施方式来描述本发明的原理和精神。应当理解,给出这些实施方式仅仅是为了使本领域技术人员能够更好地理解进而实现本发明,而并非以任何方式限制本发明的范围。
图2示出了根据本发明的实施方式的在一个编码通道编码完成后应用层编码线程被唤醒的示意图。与图1所示的现有技术的处理方式不同,本发明的实施方式在为一个应用层编码线程打开一个编码通道时,建立应用层编码线程和硬件编码通道的绑定关系。这样,当硬件编码器件完成一帧码流的编码后,驱动程序根据该绑定关系,可以精确地唤醒等待在该路上的线程,以便该编码线程可以获取编好的码流。
如图2所示,驱动模块124例如可以在接收到应用层编码线程1 112的编码请求时,为该编码线程分配并打开编码通道1 122-1,并且记录与应用层编码线程1 112的绑定关系。假如在编码通道1完成数据编码,则编码通道1将产生中断以通知驱动模块124,如图中的箭头130所示。驱动模块124获悉编码通道1与应用层编码线程1 112的绑定关系,则只唤醒该应用层编码线程1 112,而不会去唤醒应用层编码线程2 114。与图1的现有技术的唤醒方案相比,也有可能省略应用层编码线程1和2对驱动模块124的查询过程。
图3示出了根据本发明的实施方式的视频编码方法300的流程图。该方法开始于步骤S300。
步骤S310,将多个应用层编码线程中的一个应用层编码线程与多个编码通道中的一个编码通道相绑定。通常,硬件编码器件所能支持的最大编码路数是固定,例如,如果同时支持16路编码,那么就有16个编码通道,一个通道可以支持一个应用线程获取码流。可以在驱动模块为一个应用层编码线程打开硬件编码器件中的一个编码通道时,建立该应用层编码线程与该编码通道的绑定关系。
步骤S320,激活所述多个编码通道中的所述被绑定的编码通道,以便对视频进行编码。
步骤S330,在所述多个编码通道中的一个编码通道完成编码后,根据所述绑定,唤醒与所述多个编码通道中的所述一个编码通道相绑定的应用层编码线程。
至此,方法300在步骤S340结束。
在一个实施例中,一个编码通道只与一个应用层编码线程绑定,在该编码通道完成编码后,解除其与该应用层编码线程的绑定。这特别适合于期望同时编码的应用层编码线程的数量小于硬件编码器件所能支持的编码通道的数量的情形。
在一个实施例中,可以针对一个编码通道建立编码线程队列,该编码通道与多个应用层编码线程绑定,该多个应用层编码线程构成了该编码线程队列。这特别适合于存活的应用层编码线程的数量大于硬件编码器件所能支持的编码通道的数量的情形。在此情形下,可以在一个编码通道上的编码完成之后,唤醒针对该编码通道的编码线程队列中的所有应用层编码线程。
编码线程队列可以采用先入先出队列,在队列头的应用层编码线程读取出编码通道的码流中,可以将该应用层编码线程从编码线程队列中删除。
下面描述根据本发明实施方式的一个例子,其驱动模块采用Linux***进行开发。但是,应当理解,本发明的实施方式还可以适用于采用其他操作***或者编程环境进行开发的硬件编码器件的驱动模块。
硬件编码器件的驱动工作在Linux内核(kernel)部分。硬件编码器件底层能够提供多路同时编码,比如,出16路不同分辨率的码流。而编码线程是工作在应用层的程序,对应于硬件的16路编码,可以有16个应用线程同时运行,来获取不同分辨率的16路码流。举例而言,用户A启动了一个应用,需要编码一路640×480的码流,这算一个编码线程;用户B又启动了一个应用,需要编码一路720×576的码流,这也算一个编码线程。这两个线程看上去是同时在获取码流的,它们工作在应用层,所以称为应用层的编码线程。而这两路编码都是由底层的编码驱动模块通过一个硬件来完成。
当用户A启动应用开始编码时,用户A的编码线程需要调用底层硬件编码器件,并且从底层硬件编码器件获取编码完毕的码流。用户A的编码线程通过***调用函数Open()来获取硬件编码器件的驱动模块分配的句柄,该句柄用于编码线程和驱动模块之间的交互信息,然后,用户A的编码线程调用其自己的select函数进行等待。例如,驱动模块把句柄a分配给用户A的编码线程,并且把16路编码通道中的编码通道1分配给它。这样,在驱动模块中建立了句柄a和编码通道1的绑定。换而言之,对于驱动模块而言,句柄a就代表了用户A的应用层编码线程,而硬件编码器件的编码通道1就是句柄a绑定的通道。同样,用户B的编码线程所分配的句柄b和编码通道2也可以被绑定。
进行绑定后,所有编码通道1的数据只和句柄a相关,而所有编码通道2的数据只和句柄b相关。
当有一个编码通道上的数据压缩好了之后,驱动模块根据编码通道发送的编码完毕的中断信号可以判断出是那个物理通道的数据。比如,如果判断出编码通道1的数据已经压缩好了,则通过绑定可以得知是句柄a的数据,那么驱动模块将只唤醒句柄a对应的select函数。这样,只有用户A的编码线程会被唤醒以便获取数据,而其他用户的应用层编码线程不被唤醒。
当用户A的应用层编码线程因其select函数被调用而被唤醒后,其可以向驱动模块查询分配给其的编码通道的完成状况,并且调用***函数Read()来读取所分配的编码通道上的数据。
在上述用户A和用户B的应用层编码线程的实施例中,硬件编码器件所支持的一个编码通道仅被分配给一个应用层编码线程。可选地,例如,用户A的应用层编码线程在被唤醒后,也可以直接调用***函数Read()来读取所分配的编码通道上的码流。
在另一个实施例中,也可以针对多个应用层编码线程分配一个编码通道。这样,可以针对该编码通道建立与其绑定的应用层编码线程队列。每当该编码通道完成编码后,唤醒与该编码通道绑定的所有应用层编码线程。每个被唤醒的应用层编码线程可以查询驱动模块,获取分配给其的句柄在队列中的位置,以便获得此次完成的编码码流是否是针对自己的。如果是,则可以调用***函数Read()来读取该编码通道上的码流,并且,将该应用线程的句柄a移出队列。
现在参考图4,其示意性示出了根据本发明一个实施方式的视频编码装置400,能够利用硬件编码器件的多个编码通道支持对多个应用层编码线程的同时编码。装置400包括:绑定模块410,用于将所述多个应用层编码线程中的至少一个应用层编码线程与所述多个编码通道中的一个编码通道相绑定;编码模块420,用于激活所述多个编码通道中的所述被绑定的编码通道,以便对视频进行编码;以及唤醒模块430,用于在所述多个编码通道中的一个编码通道完成编码后,唤醒与所述多个编码通道中的所述一个编码通道相绑定的至少一个应用层编码线程。
在一个实施例中,装置400可以进一步包括解除模块,用于在所述多个编码通道中的一个编码通道完成编码后,解除其与所述多个应用层编码线程中的一个应用层编码线程的绑定。
在一个实施例中,装置400可以进一步包括编码线程队列建立模块,用于针对所述多个编码通道中的每个编码通道建立编码线程队列。唤醒模块420还可以包括:编码线程队列唤醒模块,用于唤醒与所述多个编码通道中的所述一个编码通道相绑定的编码线程队列的所有应用层编码线程。
装置400可以进一步包括:读取模块,用于使得与完成编码的所述多个编码通道中的一个编码通道相绑定的位于所述编码线程队列头的应用层编码线程读取完成编码的所述一个编码通道中码流;以及删除模块,用于将所述位于所述编码线程队列头的应用层编码线程从所述应用层编码线程中删除。
应当理解,装置400中记载的每个单元与参考图3描述的方法300中的每个步骤相对应。由此,上文针对图3描述的操作和特征同样适用于装置40及其中包含的单元,在此不再赘述。
还应当理解,可以利用各种方式来实现装置400,例如,在某些实施方式中,装置400可以利用软件和/或固件模块来实现。此外,装置400也可以利用硬件模块来实现。现在已知或者将来开发的其他方式也是可行的,本发明的范围在此方面不受限制。
本领域技术人员理解,附图中的流程图和框图,仅仅是按照本发明各种实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作的示意性图示。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,所述模块、程序段、或代码的一部分包含一个或多个用于实现预定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的***来实现,或者可以用专用硬件与计算机指令的组合来实现。
根据本发明的实施方式,当硬件编码器件编好了一帧码流后,其驱动模块可以精确的唤醒等待在该路上的应用层编码线程,以便该线程可以获取编好的码流而不影响其他编码通路。
已经出于示出和描述的目的给出了本发明的说明书,但是其并不意在是穷举的或者限制于所公开形式的发明。本领域技术人员可以想到很多修改和变体。在不脱离本发明精神的前提下,做出的所有修改和替换都将落入所附权利要求定义的本发明保护范围内。