本发明属于计算机软件开发,具体涉及基于内存访问特征分析的视频编码和解码方式检测方法。
背景技术:
1、在计算机系统上,视频编解码通常采用两种方式:一种是cpu编解码,一种是硬件编解码(如gpu等)。cpu编解码通用性强,支持的视频编码格式多,但是性能相对低(每秒编解码帧数相对少);硬件编解码,对于给定一款硬件,其编解码支持的编码格式相对固定,即出厂时其支持的编码格式已经确定,一般主要支持的就是主流视频编码格式,但是硬件编解码的性能相对高。
2、视频编解码api有可能是标准接口,如vaapi、vdapu等、也有可能是硬件厂商提供的非标准接口,通过这些接口的类型并不能判断视频是由cpu解码还是由硬件解码。
3、为了验证给定硬件(如gpu)的视频编解码能力,就需要甄别针对不同的视频编码格式,哪些是由cpu编解码、哪些是由硬件编解码。如果是cpu解码,一定会从cpu侧读取视频帧数据,并且cpu实现视频编解码时读取视频帧数据的方式是有规律的,通过监视内存访问操作如果能提取到此规律则可判断是cpu执行的视频编解码,反之,则不是cpu执行的视频编解码。
技术实现思路
1、有鉴于此,本发明提供了基于内存访问特征分析的视频编码和解码方式检测方法,针对指定视频编码格式,能够自动化地判断在当前计算机系统上执行实际编解码任务的到底是cpu还是其他硬件芯片(如gpu)。
2、本发明提供的一种基于内存访问特征分析的视频编码方式检测方法,所述方法包括:
3、步骤s1:构造由一张原始位图变化出的n个位图,所述n=视频时长*帧率;
4、步骤s2:构造编码程序,在编码程序中添加内存断点异常监视程序,修改视频编解码库的编码函数,调用修改后的视频编解码库,获取系统提供的硬件相关的视频编解码库的访问位图列表数据的特征;
5、步骤s3:调用当前系统提供的编解码的硬件相关的api执行编码;
6、步骤s4:监视相邻帧的差异块,如果差异块的首地址被cpu访存指令访问,则判定执行编码的是cpu。
7、进一步地,所述步骤s1具体包括:
8、步骤s11:将所述原始位图加入到位图列表imagelist的队列尾部,所述位图列表imagelist的初始值为空;
9、步骤s12:循环执行n-1次以下步骤:
10、1)针对当前循环索引i,0≤i<n-1,随机生成一个矩形,将该矩形作为差异块changedrect的初始值,所述矩形左上角坐标为x和y、宽w、高h,确保h<预先设置的所述原始位图高的10%,且w<预先设置的所述原始位图宽的10%,且确保此矩形位于所述原始位图区域内,即x<所述原始位图宽,y<所述原始位图高,(x+w)<所述原始位图宽且(y+h)<所述原始位图高;
11、2)将所述位图列表imagelist的第i个元素复制一份,记为currentimage;
12、3)修改currentimage中与所述差异块changedrect对应的矩形区域,修改方式为将该矩形区域内的所有像素的rgb值取反;
13、4)将修改后的currentimage添加到所述位图列表imagelist的队列尾部;
14、5)建立i与所述差异块changedrect的对应关系,并保存到imageindex2changedrect;
15、6)令i=i+1,循环执行步骤1)~步骤5),直到i=n-1。
16、进一步地,所述步骤s2具体包括:
17、将位图索引index设置为0,所述index的值为0到n-1,逐帧编码位图,包括以下步骤:
18、步骤s21:根据index从imageindex2changedrect获取对应的矩形信息,用该矩形信息更新所述差异块changedrect的值;
19、步骤s22:清除现有内存断点;
20、步骤s23:计算位图中所述差异块changedrect的左上角对应的内存地址,并计算出对应的内存页起始地址,为该内存页设置内存断点;
21、步骤s24:令位图索引index的值加1,循环执行步骤s21~步骤s24,直到位图索引index的值等于n-1。
22、进一步地,所述步骤s4具体包括:监视内存断点异常,如捕获到内存断点异常,则读取的内存地址为所述差异块changedrect的左上角对应的内存地址,如果内存读取的目标地址不在显存地址空间或者i/o地址空间范围内,则判定当前的编码是cpu编码,并输出判定结果。
23、进一步地,所述步骤s4之后还包括:
24、步骤s5:继续执行编码,将编码结果保存为视频文件videofile。
25、本发明提供的一种基于内存访问特征分析的视频解码方式检测方法,所述方法包括:
26、步骤一:构造解码程序,在解码程序中添加内存断点异常监视程序,修改视频编解码库的解码函数,调用修改后的视频编解码库,获取系统提供的视频编解码库的视频文件帧数据的特征;
27、步骤二:调用当前系统提供的编解码的硬件相关的api对权利要求5中生成的所述视频文件videofile执行解码;
28、步骤三:监视视频帧中的p帧或b帧的相对于i帧的残差块的访问,如果每个残差块的首地址被cpu访存指令访问,则判定执行解码的是cpu。
29、进一步地,所述步骤一具体包括:将位图索引index设置为0,所述index的值为0到n-1,逐帧解码视频,包括以下步骤:
30、步骤1.1:根据index从imageindex2changedrect获取对应的矩形信息,根据该矩形的位置计算出p帧或b帧的相对于i帧的残差块的位置;
31、步骤1.2:清除现有内存断点;
32、步骤1.3:根据残差块的左上角对应的内存地址,计算出对应的内存页起始地址,为该内存页设置内存断点;
33、步骤1.4:令位图索引index的值加1,循环执行步骤1.1~步骤1.4,直到位图索引index的值等于n-1。
34、进一步地,所述步骤三具体包括:监视内存断点异常,如捕获到内存断点异常,则读取的内存地址为残差块的左上角对应的内存地址,如果内存读取的目标地址不在显存地址空间或者i/o地址空间范围内,则判定当前的解码是cpu解码,并输出判定结果。
35、有益效果
36、本发明通过在构造的编解码程序中添加内存断点异常监视程序,监视指定内存,对于编码,监视相邻帧的差异块,如果差异块的首地址被cpu访存指令访问,则实际执行编码的是cpu,对于解码,监视p帧或b帧相对于i帧的残差块的访问,如果每个残差块的首地址被cpu访存指令访问,则实际执行解码的是cpu。通过上述方法,针对指定视频编码格式,本发明能够自动化地判断在当前计算机系统上执行实际编解码任务的到底是cpu还是其他硬件芯片(如gpu)。