基于事件和共享内存机制的多进程编码方法、系统及装置与流程

文档序号:17009108发布日期:2019-03-02 02:10阅读:212来源:国知局
基于事件和共享内存机制的多进程编码方法、系统及装置与流程

本发明涉及视频编解码领域,具体来说,涉及到一种基于事件和共享内存机制的多进程编码方法。



背景技术:

随着移动互联网、大数据、人工智能的发展,视频处理尤其是视频编码处理在直播、网络传输、安防、交通监管、游戏等众多领域的需求与日俱增。如何实现视频编码系统的高性能、高通量、高能效、易扩展等特性,如何支持海量视频流数据的实时处理是该领域面临的新挑战。传统编码方法一般使用ffmpeg等软件进行编码,导致编码实时性较低,并且功耗较大,所使用的编码方法由于缺乏有效的调度机制容易产生负载不均衡和不稳定的问题,而且不容易适配特定的视频编解码硬件加速器,硬件可扩展性差。



技术实现要素:

本发明的目的是解决海量视频编码时遇到的编码效率低、支持的路数少、功耗大、不能随用户流量变化充分利用每一台编码设备等问题。为了解决传统方法的这些不足,本发明通过对各种编码方法和硬件接口的研究提出了一种基于事件和共享内存机制的多进程编码方法,通过在上层应用与底层硬件之间增加一层虚拟层,实现了上层不同用户之间的隔离,提高了编码系统稳定性,并且提出了一种通过共享内存和互斥锁尽可能提高进程之间并发度的调度方法,从而支持多用户能够同时高效地访问底层编码设备,底层编码设备使用硬件机制来实现多路视频同时编码,从而充分挖掘每一台编码设备的性能。包括以下内容:

一方面,本发明提供了一种基于事件和共享内存机制的多进程编码方法,所述方法包括:

在上层应用与底层硬件之间设置虚拟层;

将每路编码实体分割为读取待编码数据流、更新编码参数、编码、关闭四个步骤,上层应用依次调用所述读取待编码数据流、更新编码参数、编码、关闭四个步骤对应的接口,虚拟层依据所述依次调用,管理底层硬件编码资源,实现多进程编码;

其中,每路编码实体要求顺序调用所述读取待编码数据流、更新编码参数、编码、关闭四个步骤对应的接口。

优选地,所述读取待编码数据流步骤,包括打开一路编码实体,初始化并填充编码参数;

所述更新编码参数步骤,包括在编码过程中,通过更改当前的编码参数,实现上层应用的用户进程更改编码模式;

所述编码步骤,包括根据已设置的编码参数,上层应用的用户进程循环调用该步骤对应的接口进行编码;

所述关闭步骤,包括关闭该路编码实体,虚拟层释放相应的硬件编码资源。

优选地,不同路编码实体之间互斥调用读取待编码数据流、更新编码参数、关闭所对应的接口。

优选地,所述虚拟层允许多路编码实体同时执行编码步骤,当新的一路编码实体执行读取待编码数据流步骤时,虚拟层创建一个新的线程;

线程之间以事件的方式实现同步,其中,生产者进程生成数据触发事件,唤醒消费者进程,若消费者进程获取不到事件,则令该进程进入休眠状态。

优选地,所述虚拟层允许多路编码实体并发执行编码步骤;

设置线程池,将并发执行的编码任务传递给所述线程池;

当线程池中有空闲线程,则将一编码任务分配给所述空闲线程执行。

优选地,在所述线程池内,所述编码任务被插入一阻塞队列,所述线程池里的线程从所述阻塞队列中获取所述编码任务。

优选地,以共享内存方式实现编码步骤中,多个进程之间传递待编码数据以及编码完成后的码流;

其中,多个进程之间对一个给定存储区的访问是互斥的。

优选地,创建控制锁执行所述互斥调用;

其中,当所述底层硬件进行编码时,不同的进出层需要首先获取访问区控制锁,才能访问读取待编码数据流、更新编码参数、关闭步骤中的临界资源;当所述访问操作完成后,释放访问区控制锁。

优选地,所述共享内存方式还包括:当一进程向共享的内存区域写入数据后,共享这一内存区域的其他进程对该数据可见;

所述多个进程之间对一个给定存储区的访问是互斥的,包括:当一进程在向共享的内存区域写数据时,在其完成写操作前,禁止其他进程读、写该数据。

另一方面,本发明还提供了一种基于事件和共享内存机制的多进程编码系统,所述系统包括:上层应用模块、虚拟层模块、底层硬件模块;

所述上层应用模块用于与用户的交互,并依次调用编码实体对应的读取待编码数据流、更新编码参数、编码、关闭四个步骤对应的接口;

所述虚拟层模块用于依据所述依次调用,管理底层硬件模块的编码资源,实现多进程编码;

所述底层硬件模块用于实现运算和编码。

优选地,所述虚拟层模块创建控制锁,

当所述底层硬件模块执行编码时,不同的进程需要首先获取访问区控制锁,才能访问读取待编码数据流、更新编码参数、关闭步骤中的临界资源;当所述访问操作完成后,释放访问区控制锁。

优选地,所述系统还包括存储模块,所述存储模块包括共享访问区;

当一进程向共享的内存区域写入数据后,共享这一内存区域的其他进程对该数据可见;

当一进程在向共享的内存区域写数据时,在其完成写操作前,禁止其他进程读、写该数据。

再一方面,本发明还提供了一种基于事件和共享内存机制的多进程编码装置,其特征在于,所述装置包括至少一个处理器以及至少一个可读写存储装置;

所述可读写存储装置中包含一共享访问区;所述共享访问区满足:当一进程向共享的内存区域写入数据后,共享这一内存区域的其他进程对该数据可见;当一进程在向共享的内存区域写数据时,在其完成写操作前,禁止其他进程读、写该数据;

所述可读写存储装置存储有指令代码,所述处理器调用所述指令代码,以执行如上所述的任一方法。

相比于现有技术,本发明的技术方案具有高性能、高通量、高能效、易维护、易扩展、易优化等特性。实现了上层不同用户之间的隔离,提高了编码系统稳定性,支持多用户能够同时高效地访问底层编码设备,底层编码设备使用硬件机制来实现多路视频同时编码,从而充分挖掘每一台编码设备的性能。

附图说明:

图1为本发明实施过程中每路视频的生命周期;

图2为本发明中编码接口调用流程图;

图3为本发明中编码框架图;

图4为本发明实施过程中高通量调度流程描述图。

具体实施方式:

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

需要指出的是,本发明的所有实施例中的实施方式之间是可以相互借鉴或者相互结合使用的,各实施例仅作为优选的方式举例使用,除非本说明书中明确指出,否则下述各实施例之间的技术方案的步骤或实施方式可以进行相互调用或共同执行。

实施例1

在一个具体的实施例中,以编码实体为视频编码对象为例,详细阐述本发明的技术方案实施方式。需要指出的是,虽然本实施例中的数据处理对象为视频数据,但是,本发明的技术方案所适用的数据处理对象不限于视频流数据,还可以适用于其他多路编码对象的数据处理。

如图1所示,每路编码实体的生命周期抽象为读取待编码数据流、更新编码参数、进行编码、关闭此路视频四个步骤,并封装为open101、update102、encode103、close104四个接口。

其中open101为打开一路编码视频,初始化并填充编码参数,参数包括视频类型为h.264还是mpeg2、画质级别profile、每一帧的宽高信息、码率模式为固定编码cbr还是可变码率vbr、视频帧率、每一帧包含的片(slice)数、帧间间隔(gopsize)大小等。该参数仅在初始化编码时设置一次,在编码过程中不会被修改。

update102为更新编码参数,在编码过程中如果想更改编码模式可以通过update去更改编码参数,可以更改的参数有像素格式、编码图像宽度、编码图像高度、是否将当前帧编码为i帧、编码码率,该接口可以多次调用,在编码视频初始化的时候至少调用一次,随后参数可以设置多次。

encode103为调用底层设备进行编码,比如使用中科睿芯ai芯片,功能强大丰富的api,该解决方案支持多种图形平台(graphicsplatforms),实现了通用功能,能对数字视频进行预处理、编解码、以及不同编码格式的转换,可以作为底层编码设备处理视频编码。

close104为完成此路视频的编码后关闭这一路视频。

这四个接口的调用流程图如图2所示,编码开始时先调用open接口201打开待编码的数据流,在编码视频初始化的时候至少调用一次update接口202,随后当编码参数改变的时候再次调用update接口202,如果不需要改变编码参数则直接调用encode编码接口203进行编码,当编码完成时调用close接口204关闭此路视频。

编码开始时先调用open接口201打开待编码的数据流,在编码视频初始化的时候至少调用一次update接口202随后当编码参数改变的时候再次调用update接口202,如果不需要改变编码参数则直接调用encode编码接口203进行编码,当编码完成时调用close接口204关闭此路视频。

如图3中所示,系统的整体框架部署为底层编码设备301和用户进程304之间通过pcie通道302相互通信。在pcie通道302和用户进程304之间虚拟层303实现允许多路视频同时进行encode编码。其中open、update、close接口在整个编码流程中只调用一次,update接口虽然多次调用但是仅仅进行为数不多的编码参数传递,因此这三个接口的数据传输量非常有限,可以共用一个pcie通道302,我们可以通过互斥锁的方式互斥访问pcie通道302。而encode接口需要多路视频同时进行yuv数据的传输还需要回传编码完成的bs码流,因此独自使用一个或多个pcie通路302。

图4为整个系统的详细流程描述图,将编码步骤划分为读取待编码数据流、更新编码参数、进行编码、关闭此路视频四个步骤,并封装为open()401、update()402、encode()403、close()404四个接口。第i路客户进程顺序调用open401、update402、encode403、close404接口,第i路客户进程对应一路视频编码,其生命周期为open401、update402、encode403、close404。同样,底层编码服务进程中每一路视频的生命周期也为open412、update413、encode414、close415,同样要求顺序调用open412、update413、encode414、close415接口。

要求不同路视频之间需要互斥调用open412、update413、close415接口,底层编码驱动等底层实现决定了open412、update413、close415使用的资源是临界资源,需要保证不同进程之间进行互斥访问。

不同路视频之间需要互斥调用open412、update413、close415接口,针对该需求,这里需要创建互斥锁,用于进程间互斥访问临界资源。不同路视频之间需要先获取控制区访问锁411,只有拿到锁,才能访问open412、update413、close415中的临界资源。当编码完成时close调用结束以后,释放控制区访问锁416。

在保证同一路视频顺序调用上述四个接口以及不同路视频之间互斥访问的基础上,尽可能提高进程之间的并发度。底层编码实现允许多路视频同时进行encode414编码,每当新的一路视频open412时,底层编码设备会创建一个新的线程,专门用于与客户端进行编码时的数据交互。如图4,上层用户进程的编码过程如下:

步骤s401:第i路客户进程调用encode,向虚拟层服务线程传送yuv数据。

步骤s402:触发底层编码设备第i路视频yuv写完成事件。唤醒底层编码设备进行第i路视频编码,让其对yuv进行处理。

步骤s403:客户进程进入休眠状态并等待底层编码设备第i路视频的编码完成事件。

步骤s404:底层编码设备第i路视频的线程等待第i路客户进程的yuv写完成事件,如果收不到此事件底层编码设备第i路视频的线程就会被阻塞随后进入休眠状态,从而减少资源消耗。等待直到收到第i路客户进程的yuv写完成事件。

步骤s405:唤醒底层编码设备第i路视频的线程并进行编码处理。

步骤s406:编码完成之后触发第i路视频编码写完成事件。

步骤s407:第i路视频编码完成事件唤醒休眠中的第i路客户进程,第i路客户进程向上层应用回传bs码流,完成一帧数据的编码。

不同路视频之间编码是可以并发执行的,因此对于每一路视频编码可以发起一个线程,为了便于实现线程管理,本发明通过线程池的方式去管理众多的线程。

本发明通过共享内存的方式实现底层编码服务主进程和客户进程之间传递大块的数据,此方式是进程间共享数据的一种最快的方法,需要配合进程互斥、进程同步使用。将共享内存按照进程的个数划分,每个进程独享一片内存,即为图4中的i路独占bs/yuv数据区406、407……….,因为是两个进程对一个给定存储区进行访问,若一个进程正在向共享内存区写数据,则在它做完这一步操作前,另一个进程不应当去读、写这些数据。所以需要一个控制区405去保证对每一个数据区的互斥访问。

实施例2

该实施例仍然以视频编码作为举例,进一步阐述本发明的实施原理。

具体实施方式1:每路编码实体抽象。将每路编码实体的生命周期抽象为读取待编码数据流、更新编码参数、进行编码、关闭此路视频四个步骤,并封装为open()、update()、encode()、close()四个接口,四个接口由上层用户进程依次调用,虚拟层根据每路的生命周期对底层编码资源进行管理。

open接口为打开一路编码视频,初始化并填充编码参数,参数包括视频类型为h.264还是mpeg2、画质级别profile、每一帧的宽高信息、码率模式为固定编码cbr还是可变码率vbr、视频帧率、每一帧包含的片(slice)数、帧间间隔(gopsize)大小等。该参数仅在初始化编码时设置一次,在编码过程中不会被修改。

update接口为更新编码参数,在编码过程中上层用户进程如果想更改编码模式可以通过update去更改当前编码参数,可以更改的参数包括像素格式、编码图像宽度、编码图像高度、是否将当前帧编码为i帧、编码码率,该接口可以多次调用,在编码视频初始化的时候至少调用一次,随后参数可以设置多次。

encode接口实现编码过程,根据已经设置的编码参数,上层用户进程循环调用该接口进行编码,虚拟层每接收一帧原始数据(yuv、rgb等),通过底层编码设备编码为相应的bs码流,并将编好的视频码流回传给用户进程。

close为完成此路视频的编码后关闭这一路视频,虚拟层释放相应的硬件编码资源。

编码开始时先调用open接口打开待编码的数据流,在编码视频初始化的时候至少调用一次update接口,随后当编码参数改变的时候再次调用update接口,如果不需要改变编码参数则直接调用encode编码接口进行编码,当编码完成时调用close接口关闭此路视频。

要求同一路视频需要保证顺序调用open、update、encode、close接口,每个用户进程对应一路视频编码,其生命周期为open、update、encode、close。同样,底层编码服务进程中每一路视频的生命周期也为open、update、encode、close,同样要求每一路视频需要保证顺序调用open、update、encode、close接口。

具体实施方式2:不同路视频之间需要互斥调用open、update、close接口,因为这个三个周期在每路编码生命周期中占得比例非常小,与编码硬件的通信量少,为了提高硬件通道的利用率,实现较高的性能,不同编码路数的这三个阶段使用一个通道进行传输,底层编码驱动等底层实现决定了open、update、close使用的资源是临界资源,因此需要保证这三个阶段可以互斥的访问信道资源。针对该需求,虚拟层需要创建互斥锁,用于进程间互斥访问临界资源。虚拟层的主进程会根据用户进程的个数创建相对应的编码线程,每一路视频对应一个线程,底层编码设备进行编码时不同进程之间需要先获取控制区访问锁,只有拿到锁,才能访问open、update、close中的临界资源。在访问操作完成后释放访问区控制锁,其它进程才能访问临界资源。

具体实施方式3:通过事件的方式实现进程间的同步,生产者进程生成数据触发事件,唤醒消费者进程,让其对该数据进行处理。消费者进程如果获取不到事件就会被阻塞,进入休眠状态,减少进程资源消耗。

在保证同一路视频顺序调用上述四个接口以及不同路视频之间互斥访问的基础上,尽可能提高进程之间的并发度。虚拟层实现允许多路视频同时进行encode编码。每当新的一路视频open时,虚拟层会创建一个新的线程,专门用于与客户端进行编码时的数据交互。过程如下:

第i路客户进程调用encode,先准备yuv数据,当第i路客户进程的yuv数据准备好后,触发底层编码设备第i路视频yuv写完成事件,唤醒底层编码设备进行第i路视频编码,让其对yuv进行处理,随后客户进程进入休眠状态并等待底层编码设备第i路视频的编码完成事件。

底层编码设备第i路视频的线程等待第i路客户进程的yuv写完成事件,如果收不到此事件底层编码设备第i路视频的线程就会被阻塞随后进入休眠状态,从而减少资源消耗。当收到第i路客户进程的yuv写完成事件后唤醒底层编码设备第i路视频的线程并进行编码处理,编码完成之后触发第i路视频编码写完成事件。

第i路视频编码写完成事件唤醒休眠中的第i路客户进程,第i路客户进程向上层应用回传bs码流,完成这一帧数据的编码。

具体实施方式4:不同路视频之间编码是可以并发执行的,因此对于每一路视频编码可以发起一个线程,当我们待处理的编码任务数目较小时,我们可以自己创建几个线程来处理相应的任务,但当有大量的编码任务时,由于创建、销毁线程需要很大的开销,运用线程池这些问题就大大的缓解了,为了减少开销同时便于实现线程管理,本发明通过线程池的方式去管理众多的编码线程。

我们可以把并发执行的编码任务传递给一个线程池,来替代为每个并发执行的任务都创建一个新的线程。只要池里有空闲的线程,编码任务就会分配给一个线程执行。在线程池的内部,编码任务被插入到一个阻塞队列(blockingqueue),线程池里的线程会去取这个队列里的任务。当一个新任务插入队列时,一个空闲线程就会成功的从队列中取出任务并且执行它。线程池(threadpool)对于限制应用程序中同一时刻运行的线程数很有用,因为每启动一个新线程都会有相应的性能开销,每个线程都需要给栈分配一些内存等等。

具体实施方式5:本发明通过共享内存的方式实现底层编码服务主进程和客户进程之间传递待编码数据以及编码完成后的码流,共享内存是进程间共享数据的一种最快的方法,访问共享内存区域和访问进程独有的内存区域一样快,并不需要通过系统调用或者其它需要切入内核的过程来完成,同时它也避免了对数据的各种不必要的复制。一个进程向共享的内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。使用共享内存要注意的是多个进程之间对一个给定存储区访问的互斥,因此需要配合进程互斥、进程同步使用,因为是多个进程对一个给定存储区进行访问,若一个进程正在向共享内存区写数据,则在它做完这一步操作前,别的进程不应当去读、写这些数据。

实施例3

在又一个实施例中,本发明还提供了一种基于事件和共享内存机制的多进程编码系统,该系统可以执行具体如实施例1、实施例2中的方法。所述系统包括:上层应用模块、虚拟层模块、底层硬件模块;

所述上层应用模块用于与用户的交互,并依次调用编码实体对应的读取待编码数据流、更新编码参数、编码、关闭四个步骤对应的接口;

所述虚拟层模块用于依据所述依次调用,管理底层硬件模块的编码资源,实现多进程编码;

所述底层硬件模块用于实现运算和编码。

优选地,所述虚拟层模块创建控制锁,

当所述底层硬件模块执行编码时,不同的进程需要首先获取访问区控制锁,才能访问读取待编码数据流、更新编码参数、关闭步骤中的临界资源;当所述访问操作完成后,释放访问区控制锁。

优选地,所述系统还包括存储模块,所述存储模块包括共享访问区;

当一进程向共享的内存区域写入数据后,共享这一内存区域的其他进程对该内容可见;

当一进程在向共享的内存区域写数据时,在其完成写操作前,禁止其他进程读、写该数据。

实施例4

在另一个实施例中,本发明还提供了一种基于事件和共享内存机制的多进程编码装置,所述装置包括至少一个处理器以及至少一个可读写存储装置;

所述可读写存储装置中包含一共享访问区;所述共享访问区满足:当一进程向共享的内存区域写入数据后,共享这一内存区域的其他进程对该内容可见;当一进程在向共享的内存区域写数据时,在其完成写操作前,禁止其他进程读、写该数据;

所述可读写存储装置存储有指令代码,所述处理器调用所述指令代码,以执行如上所述的实施例1、2的方法。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(read-onlymemory,rom)或随机存储记忆体(randomaccessmemory,ram)等。

本发明参照本发明实施例的方法、方框图、单线图、仿真图进行描述的,以上所述仅为本发明的实施例而已,并不限定本发明,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。

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