VDEC功能
功能及约束说明
功能及约束说明
VDEC(video decoder)实现视频的解码,VDEC内部经过VPC处理后,输出YUV420SP格式(包括NV12和NV21)的图片。
- VDEC输入的约束:
- 输入码流分辨率:
最大分辨率4096 * 4096,最小分辨率128 * 128。
- 输入码流格式:
H264 bp/mp/hp level5.1 YUV420编码的码流,当前只支持annex-B的裸码流。
H265 8/10bit level5.1 YUV420编码的码流,当前只支持annex-B的裸码流。
- 输入内存:
支持调用aclrtMalloc/aclrtFree接口或aclrtMallocHost/aclrtFreeHost接口申请/释放内存,也支持调用acldvppMalloc/acldvppFree接口申请/释放内存。
- 输入码流分辨率:
- VDEC输出的约束:
- 输出图像分辨率:
最大分辨率4096 * 4096,最小分辨率10 * 6。
- 输出图像的格式:
- YUV420SP NV12
- YUV420SP NV21
- 输出内存:
- 输出的内存首地址要求16对齐。调用acldvppMalloc接口/acldvppFree接口申请或释放内存。
- 输出内存大小与图片数据的格式相关,计算公式如下:
YUV420SP:大于或等于widthStride*heightStride*3/2
- 输出图片的宽stride、高stride对齐要求为:
- YUV420SP(包括NV12和NV21)
输出图片的widthStride(对齐后的宽度),对齐到16。如果用户设置的输出图片宽度小于16,则widthStride必须对齐到32,不能对齐到16。
输出图片的heightStride(对齐后的高度),对齐到2。
- YUV420SP(包括NV12和NV21)
- 输出图像分辨率:
- 其它约束:
- VDEC只支持按帧输入码流进行解码。
- 若码流中有坏帧、缺帧等情况,解码器VDEC可能会丢帧。
- 通过隔行扫描方式编码出来的码流,VDEC仅支持解码H264 8bit编码的码流。
性能指标说明(昇腾310 AI处理器)
- 针对如下典型场景下各分辨率的码流,单个Device的VDEC解码的路数(n)推荐如下值:720p指分辨率为1280*720的图片;1080p指分辨率为1920*1080的图片;4K指分辨率为3840*2160的图片。
分辨率
总性能
单路性能(n路)
每路VDEC解码的最大内存消耗(参考值,以实际码流为准)
4k
120fps
120fps/n(推荐n=4,每路30fps)
约266MB
1080p
480fps
480fps/n(推荐n=16,每路30fps)
约118MB
≤720p
960fps
960fps/n(推荐n=32,每路30fps)
约86MB
- 关于解码路数与帧率的建议
注意:下表中给出的规格建议供参考,如果单进程内启动的路数超过下表中的建议,则可能出现内存不足或性能不够的问题,进而导致创建解码通道失败或执行解码缓慢。
720p指分辨率为1280*720的图片;1080p指分辨率为1920*1080的图片;4K指分辨率为3840*2160的图片。
典型分辨率
单进程内各启动路数时的规格建议(依据输入帧率得出)
-
输入帧率≥25fps
20fps<输入帧率<25fps
15fps<输入帧率≤20fps
10fps<输入帧率≤15fps
输入帧率≤10fps
≤720p
32路
32路
32路
32路
32路
1080p
16路
19路
24路
32路
32路
4K
4路
4路
6路
8路
12路
上述性能指标,基于CtrlCPU与AI CPU的配比是4:4。
性能指标说明(昇腾910 AI处理器)
1080p指分辨率为1920*1080的图片;4K指分辨率为3840*2160的图片。单个Device的基本场景性能指标参考如下:
场景举例 |
总帧率 |
---|---|
1080p * n路 * 2进程 (n≤20) |
n*30*2fps |
4k * n路 * 2进程 (n≤5) |
n*30*2fps |
上述性能指标,基于CtrlCPU与AI CPU的配比是4:4。
aclvdecSendFrame
函数功能
将待解码的输入内存和解码输出内存一起传到解码器进行解码,异步接口。
约束说明
- 发送数据前必须保证通道已经被创建,否则返回错误。
- 发送码流时须按帧发送,一次只发送完整的一帧码流。
- 不能发送eos为0的空码流包(码流长度为0或码流地址为空)。
- 发送完所有码流后,可以发送eos为1的帧,表示当前码流文件结束。发送eos后,本接口会等待已发送帧全部解码并且用户的回调函数处理完成后才返回。
- aclvdecSendFrame接口内部封装了aclrtLaunchCallback接口,用于在Stream的任务队列中增加一个需要在Host/板端环境上执行的回调函数。用户在实现VDEC功能时,无需再单独调用aclrtLaunchCallback接口。
函数原型
aclError aclvdecSendFrame(aclvdecChannelDesc *channelDesc,
acldvppStreamDesc *input,
acldvppPicDesc *output,
aclvdecFrameConfig *config,
void* userData);
参数说明
参数名 |
输入/输出 |
说明 |
---|---|---|
channelDesc |
输入 |
指定通道描述信息,与调用aclvdecCreateChannel接口创建通道时指定的channelDesc保持一致。 调用aclvdecSetChannelDesc系列接口设置通道描述信息的属性,包括解码通道号、线程、回调函数、视频编码协议等。 说明:
在昇腾310 AI处理器上,在昇腾910 AI处理器上,由于软件约束,不支持调用aclvdecSetChannelDescRefFrameNum接口设置通道描述信息的对应属性,若调用,则会返回报错。 |
input |
输入 |
输入码流描述信息,输入内存用户需提前申请。
|
output |
输入&输出 |
输出图片描述信息,输出内存用户需提前申请。 output参数作为输入时,需要用户调用如下接口:
output参数作为输出时,用户需在回调函数中获取解码后的输出图片数据。隔行码流场景下,隔行码流每帧发送两场,解码时其中一场无图像输出,属于正常现象,会返回ERR_DECODE_NOPIC = 0x20000错误码;隔行码流的解码输出数据都在奇数场对应的输出buffer中。 |
config |
输入 |
解码配置,预留,当前可填NULL。 |
userData |
输入 |
用户自定义数据。 如果用户需要获取解码的帧序号,则可以在userData参数处定义,然后解码的帧序号可以通过userData参数传递给VDEC的回调函数,用于确定回调函数中处理的是第几帧数据。 |
返回值说明
返回0表示成功,返回非0表示失败。
aclvdecSendSkippedFrame
函数功能
如果不想获取某一帧的解码结果, 可以调用本接口, 将待解码的码流(输入内存)传到解码器进行解码,此时,解码结果最终不会输出,解码完成的回调函数中返回的output为nullptr。异步接口。
约束说明
- 发送数据前必须保证通道已经被创建,否则返回错误。
- 发送码流时须按帧发送,一次只发送完整的一帧码流。
- 不能发送eos为0的空码流包(码流长度为0或码流地址为空)。
- 不可以发送eos为1的帧。
- aclvdecSendSkippedFrame接口内部封装了aclrtLaunchCallback接口,用于在Stream的任务队列中增加一个需要在Host/板端环境上执行的回调函数。用户在实现VDEC功能时,无需再单独调用aclrtLaunchCallback接口。
函数原型
aclError aclvdecSendSkippedFrame(aclvdecChannelDesc *channelDesc,
acldvppStreamDesc *input,
aclvdecFrameConfig *config,
void *userData);
参数说明
参数名 |
输入/输出 |
说明 |
---|---|---|
channelDesc |
输入 |
指定通道描述信息,与调用aclvdecCreateChannel接口创建通道时指定的channelDesc保持一致。 调用aclvdecSetChannelDesc系列接口设置通道描述信息的属性,包括解码通道号、线程、回调函数、视频编码协议等。 说明:
在昇腾310 AI处理器上,在昇腾910 AI处理器上,由于软件约束,不支持调用aclvdecSetChannelDescRefFrameNum接口设置通道描述信息的对应属性,若调用,则会返回报错。 |
input |
输入 |
输入码流描述信息,输入内存用户需提前申请。
|
config |
输入 |
解码配置,预留,当前可填NULL。 |
userData |
输入 |
用户自定义数据。 如果用户需要获取解码的帧序号,则可以在userData参数处定义,然后解码的帧序号可以通过userData参数传递给VDEC的回调函数,用于确定回调函数中处理的是第几帧数据。 |
返回值说明
返回0表示成功,返回非0表示失败。
aclvdecCallback
函数功能
视频解码回调函数,同步接口。用户需自定义该回调函数。
约束说明
- 在回调函数中不能执行销毁通道操作,否则会导致程序执行死锁。
- 回调函数处理的时延应满足发帧帧率要求,否则会影响aclvdecSendFrame接口进行视频帧处理的实时性。
- 注销回调线程要在所有Callback执行完成后(即注销送码流线程之后)。
- 当使用了抽帧功能后,回调相应帧的output为null。
函数原型
void (* aclvdecCallback) (acldvppStreamDesc * input, acldvppPicDesc * output, void* userData)
参数说明
参数名 |
输入/输出 |
说明 |
---|---|---|
input |
输入 |
与aclvdecSendFrame接口中的input一致,表示输入码流描述信息。 |
output |
输入 |
VDEC解码后的输出图片描述信息,输出内存用户需提前申请。 |
userData |
输入 |
用户自定义数据。 |
返回值说明
无