基于加速模块的视频解码方法与流程

文档序号:32523681发布日期:2022-12-13 20:24阅读:27来源:国知局

1.本发明属于linux系统下视频解码技术领域,具体涉及一种基于加速模块的视频解码方法。


背景技术:

2.atlas 200 ai加速模块集成了昇腾310ai处理器,可以在端侧实现图像识别、图像分类等,可以实现图像、视频等多种数据分析和推理计算,广泛用于智能摄像机、机器人、无人机等端侧ai场景。
3.但是atlas 200 ai属于硬解码范畴,在协议帧不完全符合解码协议,或者错误帧比较多的情况下,解码效率比较低下或者不能解码,并且对于带有参数帧的图像信息,硬解码模块无法提取参数信息。


技术实现要素:

4.(一)要解决的技术问题
5.本发明要解决的技术问题是:在linux平台下,解决视频解码问题。
6.(二)技术方案
7.为了解决上述技术问题,本发明提供了一种基于加速模块的视频解码方法,包括以下步骤:
8.步骤1、接收网络组播数据并存入环形缓冲区
9.首先,根据配置文件获取传输中的ip和端口号信息;然后,阻塞等待网络发送的图像数据;最后将收到的图像数据存入环形缓冲区;
10.步骤2、过滤错误帧
11.对网络接收的图像帧进行分析,对不符合协议要求的数据进行动态过滤,得到完整数据包;
12.步骤3、基于加速模块完成硬解码过程
13.基于加速模块,对过滤后得到的完整数据包进行硬解码。
14.本发明还提供了一种用于实现所述方法的视频解码系统。
15.本发明还提供了一种所述方法在linux系统下视频解码技术领域中的应用。
16.(三)有益效果
17.本发明针对atlas200ai芯片特点,并结合硬件属性特点,设计实现了一种linux系统下基于加速模块的视频解码方法。该方法是在linux系统下,首先对网络接收的数据进行缓冲存储,然后针对协议类型筛选错误帧,传送可解码的数据包给硬解码模块,完成解码功能。
具体实施方式
18.为使本发明的目的、内容、和优点更加清楚,下面结合实施例,对本发明的具体实
施方式作进一步详细描述。
19.为了解决linux系统下视频解码问题,本发明采用基于加速模块的软硬结合解码方法。下面对本发明的内容作进一步描述。本发明的一种linux系统下基于加速模块的视频解码方法包括以下步骤:
20.1、接收网络组播数据并存入环形缓冲区(缓冲数组)
21.首先,根据配置文件获取传输中的ip和端口号信息;然后,阻塞等待网络发送的图像数据;最后将收到的图像数据存入环形
22.缓冲区;具体如下:
23.①
首先,获取配置文件中的接收ip和端口号信息;
24.②
然后,创建网络套接字;
25.③
其次,清零环形缓冲区(接收缓冲区),阻塞接收网络发
26.送的图像数据;
27.④
判断本次接收的数据长度是否大于零,如果大于零则执行下一步,否则返回到步骤


28.⑤
判断协议帧头是否符合协议要求,如不符合就丢弃该帧,否则执行下一步;
29.⑥
获取协议字段通道号chnnel;
30.⑦
根据协议去掉报文头,只留下图像数据;
31.⑧
判断传输通道号chnnel是否为解码的当前通道号,如果是则执行下一步,否则延时20ms,等待下一次网络接收数据;
32.⑨
判断当前环形缓冲区的数据长度cirlen与本次接收的数据长度len之和是否小于最大长度max_circle_len,如果是则执行下一步,否则跳转到步骤
33.⑩
将接收到的数据从去掉帧头的位置开始拷贝,存储到环形缓冲区,拷贝的数据长度为len;
34.将环形缓冲区的数据长度cirlen增加本次接收数据的数据长度len;
35.移动环形缓冲区接收指针putptr的位置,移动的次数为len;
36.将接收到的数据从去掉帧头的位置开始拷贝,存储到环形缓冲区,拷贝的长度为最大缓冲区长度max_circle_len减去cirlen的值value;
37.获取当前环形缓冲区的首指针cirbuf,并保存到接收指针putptr位置;
38.计算当前环形缓冲区还剩多少空间,即把最大缓冲区长度max_circle_len减去当前环形缓冲区的数据长度cirlen的值保存到temp中;
39.计算本次接收的数据长度len与value的差值,即拷贝一次后剩余的数据长度value2,将value2保存到当前环形缓冲区的数据长度cirelen中;
40.再次从网络接收数据(网络接收数组)中将环形缓冲区接收指针移动temp个位置,拷贝数据到环形缓冲区的putptr位置,拷贝的长度为cirlen;
41.2、过滤错误帧
42.对网络接收的图像帧进行分析,对不符合协议要求的数据进行动态过滤,并在过滤过程中对图像帧进行调整重组,得到完整数据包。具体步骤如下:
43.a.从环形缓冲区获取图像帧数据,即计算环形缓冲区首地址bufptr和长度buflen:
44.①
获取目前环形缓冲区接收指针(写指针)putptr位置和环形缓冲区的数据总长度cirlen;
45.②
判断读指针readptr与putptr是否一致,如果一致则延时1ms,返回到本流程的步骤

,否则执行下一步;
46.③
判断已读数据长度readlen是否小于cirlen,如果是则继续下一步,否则执行本流程的步骤


47.④
判断cirlen与readlen差值是否大于等于协议帧固定长度frame_len,如果是则继续下一步,如果不是则执行本流程的步骤


48.⑤
将当前readptr作为解码图像数据首地址bufptr,令长度buflen为frame_len,同时移动readptr,移动个数为frame_len,增加读取长度readlen,增加个数为frame_len;
49.⑥
将当前readptr作为解码图像数据首地址bufptr,令长度buflen为cirlen减去readlen,同时移动readptr,移动个数为(cirlen-readlen),增加读取长度readlen,增加个数为(cirlen-readlen);
50.⑦
判断readlen与frame_len的和是否小于max_len,如果是则执行下一步,如果不是则执行本流程的步骤


51.⑧
将当前readptr作为解码图像数据首地址bufptr,令数据长度buflen为frame_len,移动读指针,移动个数为frame_len,增加读数据长度readlen,增加个数为frame_len;
52.⑨
将当前readptr作为解码图像数据首地址bufptr,令数据长度buflen为max_len-readlen,移动读指针到环形缓冲区首地址,置已读数据长度readlen为0;
53.b.对图像帧数据进行过滤,具体如下:
54.①
判断当前的解码帧类型type是否与当前图像帧类型一致,如果不一致则执行下一步,否则跳转到本流程的步骤

;图像帧包含vps、pps、sps、sei、i帧、p帧这几种类型;
55.②
设置当前图像帧需要插入的标志inseridr为1;
56.③
判断当前图像帧类型是否为协议规定的类型(红外、可见光宽、可见光窄、融合之一),如果是则执行下一步,否则返回退出本流程;
57.④
将当前解码帧类型type修改为当前图像帧类型;
58.⑤
获取当前图像帧的数据长度,并保存到idrsize中;
59.⑥
从帧头开始遍历到idrsize减去3的位置,依次对帧数据进行判断,判断对应字段是否为h265协议帧头,如果是则执行下一步,否则移动遍历指针位置继续查找帧头,直到当前图像帧全部遍历完成,跳转到本流程的步骤
60.⑦
判断图像帧类型是否为vps,pps,sps三类帧之一,如果是则进行下一步,否则跳转到第9步;
61.⑧
判断sei帧(是参数帧,参数帧是图像帧的一种)标志seiflag是否为1,如果是则将本次解码的insertidr标志置1,并退出本次过滤过程,否则将插入帧标志idrflag置1;
62.⑨
判断帧类型是否为sei帧,如果是则执行下一步,否则跳转到本流程的步骤
63.⑩
判断sei帧标志seiflag是否为1,如果是则将本次解码的insertidr标志置1,并
退出本次过滤过程,否则将seiflag置1,记录当前位置为帧头位置,保存当前位置到u32start中,更新当前帧大小size为size减去u32start的值;
64.判断帧类型是否为p帧,如果是则执行下一步,否则跳转到本流程的步骤
65.判断seiflag是否为1,如果是则将本次解码的insertidr标志置1,并退出本次过滤过程,否则将插入帧的个数计数标志islicenumber增加1,并且清零帧个数标志framenumber;
66.将当前帧类型的值修改为0x02,即改为i帧;
67.判断当前帧类型的值是否为0x02,即是否为i帧,如果是则执行下一步,否则跳转到本流程的步骤
68.判断sei帧标志seiflag是否为零,如果是则将本次解码的insertidr标志置1,并退出本次过滤过程,否则执行下一步;
69.将p帧个数标识pslicenumber增加1;
70.判断本次解码的insertidr标志是否为1,如果是则执行下一步,否则跳转到本流程的步骤
71.修改当前帧类型为i帧,即将类型值改为0x26;
72.记录i帧个数标志islicenumber增加1;
73.判断当前解码类型是否为红外或者融合,如果是则执行下一步,否则跳转到本流程的步骤
74.设置当前帧类型值为0x26,即改为i帧;
75.判断p帧的个数标志pslicenumber是否为1,如果是则执行下一步,否则跳转到本流程的步骤
76.设置帧头偏移第6、7、8位置的数据内容为0xaf、0x06、0x58,并跳转到本流程的步骤
77.判断p帧的个数标志pslicenumber是否为2,如果是则执行下一步,否则跳转到本流程的步骤
78.设置帧头偏移第6、7、8、9位置的数据内容为0x25、0xaf、0x06、0x58,并跳转到本流程的步骤
79.判断当前解码类型是否为可见光,如果是则执行下一步,否则跳转到本流程的步骤
80.判断p帧的个数标志pslicenumber是否为1,如果是则设置帧头偏移第6、7、8位
置的数据内容为0xaf、0x04、0x58,否则继续判断p帧的个数标志pslicenumber是否为2,如果是则设置帧头偏移第6、7、8、9位置的数据内容为0x23、0x47、0x82、0x2c,否则继续判断p帧的个数标志pslicenumber是否为3,如果是则设置帧头偏移第6、7、8、9位置的数据内容为0x26、0x87、0x82、0x2c,否则继续判断p帧的个数标志pslicenumber是否为4,如果是则设置帧头偏移第6、7、8、9位置的数据内容为0x29、0xc7、0x82、0x2c,否则执行下一步;
81.设置帧个数framenumber为零;
82.判断当前帧类型是否为红外或者融合图像,如果是则执行下一步,否则跳转到本流程的步骤
83.对p帧的个数pslicenumber进行分类判断:若为1则将帧个数framenumber高低位取值赋值给当前帧的第6、7位;否则将帧个数framenumber高低位取值赋值给当前帧的第7、8位;
84.判断当前帧类型是否为可见光,如果是则执行下一步,否则跳转到本流程的步骤
85.对p帧的个数pslicenumber进行分类判断:若为1则将帧个数framenumber高低位取值赋值给当前帧的第6、7位;否则将帧个数framenumber高低位取值赋值给当前帧的第7、8位;
86.判断p帧的个数pslicenumber是否为0并且i帧个数是否为0,
87.同时满足参数帧标志seiflag是否为0,如果是则退出返回,否则执行下一步;
88.使用库函数根据图像大小动态申请图像帧存储空间;
89.判断插入帧标志idrflag和参数帧标志seiflag是否为1,或者本次解码帧的插入标志insertidr是否为1,如果满足前两个中的某一个条件,则执行下一步,否则跳转到本流程的步骤
90.判断当前帧类型是否为红外或者融合图像,如果是则执行下一步;否则跳转到本流程的步骤
91.拷贝红外或者融合图像的sps数据和当前帧图像数据到待解码数据结构idr_buf,同时增加帧大小size,将size增加sps数据大小;
92.判断当前帧类型是否为可见光,如果是则执行下一步;否则跳转到本流程的步骤
93.拷贝可见光图像的sps数据和当前帧图像数据到待解码数据结构idr_buf,同时增加帧大小size,将size增加sps数据大小;
94.设置当前帧起始位置u32start和本次待解码帧的插入标志insertidr为0;
95.判断i帧个数标志islicenumber是否为0,如果是则将帧个数framenumber增加
1;
96.将当前待解码帧数据大小size保存到inbuffersize中,使用库函数拷贝待解码图像数据内容idr_buf到动态申请的图像缓存inbufferdev,跳转到本流程的步骤
97.将帧个数framenumber增加1;
98.将当前待解码帧数据大小size保存到inbuffersize中,使用库函数拷贝待解码图像数据内容idr_buf到动态申请的图像缓存inbufferdev,执行下一步。
99.3、基于加速模块进行硬解码
100.将过滤后的完整数据包进行硬解码。具体步骤如下:
101.①
初始化包含硬解码模块的加速模块,具体操作如下:
102.a.创建解码通道属性,如果创建成功则执行下一步,否则报错退出;
103.b.设置解码通道id号,如果设置成功则执行下一步,否则报错退出;
104.c.设置解码线程号;
105.d.设置解码通道回调函数,如果设置成功则执行下一步,否则报错退出;
106.e.设置解码通道的解码类型,如果设置成功则执行下一步,否则报错退出;
107.f.设置解码通道的输出图像格式,如果设置成功则执行下一步,否则报错退出;
108.g.设置解码通道输出模式,如果设置成功则执行下一步,否则报错退出;
109.h.根据解码通道属性创建解码通道;
110.②
设置解码回调函数,具体如下:
111.a.使用库函数获取解码正常帧输出,如果获取结果为0,则执行下一步,否则跳转到本流程的步骤f;
112.b.清零本次解码帧的插入标志insertidr;
113.c.使用库函数获取图像属性数据output;
114.d.使用库函数从output里获取图像大小、宽和高度参数数据;
115.e.使用库函数将图像数据和参数数据发送到主机端口,结束此过程函数;
116.f.记录错误次数errcnt增加1,执行下一步;
117.g.对错误次数errcnt进行判断是否大于2,如果是则执行下一步;否则退出本流程;
118.h.对插入标志insertidr置1,并清零errcnt;
119.③
获取完整数据包;
120.④
将完整数据包发送给加速模块中的硬解码模块进行解码,具体如下:
121.a.使用库函数动态申请图像存储空间;
122.b.获取图像帧的参数信息;
123.c.将参数信息和图像解码后的数据整合成完整帧;
124.d.创建输入图像流属性对象;
125.e.设置输入图像流属性对象;
126.f.动态申请图像输出内存空间;
127.g.创建输出图像流属性对象;
128.h.根据图像的数据、大小、格式设置输出图像属性;
129.i.将解码通道属性、输入图像流属性、输出图像属性作为参数,使用库函数发送图像帧数据给硬解码模块;
130.j.释放申请的图像输出内存空间;
131.k.销毁输入图像流属性对象资源。
132.利用上述技术方案,采用上述操作步骤,本发明可以实现linux系统下视频解码和传输问题,该方法已经经过了算法验证,并进行了实验检验。结果标明,该方案可以为解决图像解码问题,采用软解码方法,组成包含图像帧和参数帧的完整数据包,再使用芯片的硬解码模块完成解码过程,有效减少解码时间。
133.以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1