函数:vdec_send_skipped_frame
功能及约束说明
功能说明
VDEC(Video Decoder)实现视频的解码,VDEC内部经过VPC处理后,输出指定格式的图片,参见码流/图片格式、宽高对齐、内存约束。
分辨率约束
-
输入码流分辨率:
昇腾AI处理器 分辨率范围 Atlas 200/500 A2推理产品 对于H264输入码流,最大分辨率8192*8192,最小分辨率128*128。 对于H265输入码流,最大分辨率5400*8192,最小分辨率128*128。 -
输出图片分辨率:
昇腾AI处理器 分辨率范围 Atlas 200/500 A2推理产品 输出图片最大分辨率8192*8192;当输入码流宽度小于或等于4096时,输出图片最小分辨率为10*6,当输入码流宽度大于4096时,输出图片最小分辨率为128*128。
码流/图片格式、宽高对齐、内存约束
实现VDEC视频解码功能时,输入或输出内存的生命周期由用户自行管理:
-
输入内存
调用acl.media.dvpp_malloc/acl.media.dvpp_free接口申请/释放内存或调用acl.rt.malloc/acl.rt.free接口申请/释放内存,内存大小就是指实际的输入码流所占用的大小。
调用acl.media.dvpp_malloc接口申请的内存为媒体数据处理的专用内存,但专用内存的地址空间有限,若关注内存规划或内存资源有限时,使用VDEC视频解码功能时,建议调用acl.rt.malloc接口申请内存。
-
输出内存
需调用acl.media.dvpp_malloc接口申请Device上的输出内存,调用acl.media.dvpp_free接口释放输出内存,内存大小请参见下表中的计算公式。
:::note 说明 输出图片格式的定义请参见acldvppPixelFormat,宽stride、高stride等概念请参见基本概念。 :::
VDEC视频解码时,输入码流支持如下格式:
- H264 bp/mp/hp level5.1 YUV420编码的码流,当前只支持annex-B的裸码流。
- H265 8/10bit level5.1 YUV420编码的码流,当前只支持annex-B的裸码流。
VDEC视频解码时,输出图片格式、宽高对齐要求等如下表所示:
表1 码流/图片格式、宽高对齐、内存大小约束
版本 | 输出图片格式 | 输出图片宽、高对齐要求 | 输出图片宽stride、高stride、内存大小要求 Atlas 200/500 A2推理产品 |
|---|---|---|---|
通用格式,各版本都支持 | YUV420SP NV12 8bit | 宽2对齐 高2对齐 | 宽stride无对齐要求,与宽相同即可,最小10,最大24576。 高stride无对齐要求,与高相同即可,最小6,最大24576。 内存大小(单位Byte)≥ 宽stride * 高stride * 3/2 |
YUV420SP NV21 8bit | |||
该部分格式仅以下版本支持: Atlas 200/500 A2推理产品 | RGB888 | 无对齐要求 | 宽stride为宽乘以3的值,最小30,最大24576。 高stride无对齐要求,最小6,最大24576。 内存大小(单位Byte)≥ 宽stride * 高stride |
BGR888 |
其它约束
- VDEC只支持按帧输入码流进行解码。
- 若码流中有坏帧、缺帧等情况,解码器VDEC可能会丢帧。
- 通过隔行扫描方式编码出来的码流,VDEC仅支持解码H264 8bit编码的码流。
父主题: VDEC功能
性能指标说明
性能指标说明
1080p指分辨率为1920*1080的图片。单个Device的基本场景性能指标参考如下(1路对应一个通道,一个通道对应一个线程):
| 场景举例 | 总帧率 |
|---|---|
| 720p*n路(1≤n≤4) | n*600fps |
| 720p*n路(n>4) | 2400fps |
| 1080p*n路(1≤n≤4) | n*300fps |
| 1080p*n路(n>4) | 1200fps |
| 4k*n路(1≤n≤4) | n*75fps |
| 4k*n路(n>4) | 300fps |
下表说明了典型场景下每路VDEC解码的内存消耗,在内存消耗的计算公式中:
- 输入码流缓存大小:等于输入码流的宽*高*2。
- 解码图像帧存大小:1080P分辨率的输入码流,该参数值为3MB。其它分辨率时参数值可等量折算。
- 视频解码图像Tmv缓存大小:H264格式、1080P分辨率的输入码流,该参数值为0.5MB;H265格式、1080P分辨率的输入码流,该参数值为1MB。其它分辨率时参数值可等量折算。
- 参考帧数量可由用户调用acl.media.vdec_set_channel_desc_ref_frame_num接口设置。
- 解码后缓存图像帧数固定为2个。
每路VDEC解码的内存消耗计算公式 | 场景举例 | 内存消耗(单位为MB) |
|---|---|---|
16MB + 输入码流缓存大小 * 2 + (解码图像帧存大小 + 视频解码图像Tmv缓存大小) * (参考帧数量 + 解码后缓存图像帧数 +1 ) | 62.5MB(参考帧数量8个) 41.5MB(参考帧数量2个) | |
68MB(参考帧数量8个) 44MB(参考帧数量2个) |
父主题: VDEC功能
函数:vdec_send_frame
| C函数原型 | aclError aclvdecSendFrame(aclvdecChannelDesc *channelDesc, acldvppStreamDesc *input, acldvppPicDesc *output, aclvdecFrameConfig *config, void* userData) |
|---|---|
| Python函数 | ret = acl.media.vdec_send_frame(vdec_channel_desc, dvpp_stream_desc, dvpp_pic_desc, vdec_frame_config, user_data) |
| 函数功能 | 将待解码的输入内存和解码输出内存一起传到解码器进行解码,异步接口。 |
| 输入说明 | vdec_channel_desc:int,指定通道描述信息的指针地址。 与调用acl.media.dvpp_create_channel接口创建通道时指定的dvpp_channel_desc保持一致。 调用acl.media.vdec_set_channel_desc系列接口设置通道描述信息的属性,包括解码通道号、线程、回调函数、视频编码协议等。 dvpp_stream_desc:int,输入码流描述信息的指针地址,输入内存用户需提前申请。 - 调用acl.media.dvpp_create_stream_desc接口创建码流描述信息。调用acl.media.dvpp_set_stream_desc系列接口设置视频码流信息的属性(例如,码流格式)。输入码流格式以通道描述信息中设置的格式为准,调用acl.media.dvpp_set_stream_desc_format接口设置输入码流格式无效。 - 输入视频码流的分辨率、视频格式的要求,请参见功能及约束说明。 dvpp_pic_desc:int,输出图片描述信息的指针地址,输出内存用户需提前申请。 dvpp_pic_desc参数作为输入时,需要用户调用如下接口: - 调用acl.media.dvpp_create_pic_desc接口创建图片描述信息。 - 调用acl.media.dvpp_set_pic_desc系列接口设置输出图片的数据内存、内存大小、宽、高、格式。 - 如果此处设置输出图片的宽高,则需要同时设置width、height、width_stride、height_stride这4个参数,且当width<16时,width_stride必须对齐到32,不能对齐到16;如果这4个参数都不设置,则以输入码流的宽高为准;如果设置部分参数,则接口返回错误。 - 如果此处设置输出图片的格式,则以此处为准;如果此处不设置,则以通道描述信息中设置的为准。 - 输出图像格式的要求,请参见功能及约束说明。 dvpp_pic_desc参数作为输出时,用户需在回调函数中调用acl.media.dvpp_get_pic_desc系列接口获取解码后的输出图片数据。隔行码流场景下,隔行码流每帧发送两场,解码时其中一场无图像输出,属于正常现象,会返回ERR_DECODE_NOPIC = 0x20000错误码;隔行码流的解码输出数据都在奇数场对应的输出buffer中。 vdec_frame_config:int,解码配置的指针地址,预留,当前可填0。 user_data:python对象,用户自定义数据的指针地址。 如果用户需要获取解码的帧序号,则可以在user_data参数处定义,然后解码的帧序号可以通过user_data参数传递给VDEC的回调函数,用于确定回调函数中处理的是第几帧数据。 |
| 返回值说明 | ret:int,错误码。 - 返回0表示成功。 - 返回其它值表示失败。 |
| 约束说明 | - 发送数据前必须保证通道已经被创建,否则返回错误。 - 发送码流时须按帧发送,一次只发送完整的一帧码流。 - 不能发送eos为0的空码流包(码流长度为0或码流地址为空)。 - 发送完所有码流后,可以发送eos为1的空码流包,表示当前码流文件结束。发送eos后,本接口会等待已发送帧全部解码并且用户的回调函数处理完成后才返回。 - 由于码流异常、解码超时等原因,可能导致acl.media.vdec_send_frame接口发送帧或发送eos失败,建议用户在编写代码时,获取该接口的返回码,当该接口调用失败时,进行异常处理。 - acl.media.vdec_send_frame接口内部封装了acl.rt.launch_callback接口,用于在Stream的任务队列中增加一个需要执行的回调函数。用户在实现VDEC功能时,无需再单独调用acl.rt.launch_callback接口。 |
| 参考资源 | 接口调用流程及示例,参见VDEC视频解码。 |
父主题: VDEC功能
函数:vdec_send_skipped_frame
| C函数原型 | aclError aclvdecSendSkippedFrame(aclvdecChannelDesc *channelDesc, acldvppStreamDesc *input, aclvdecFrameConfig *config, void *userData) |
|---|---|
| Python函数 | ret = acl.media.vdec_send_skipped_frame(vdec_channel_desc, dvpp_stream_desc, vdec_frame_config, user_data) |
| 函数功能 | 如果不想获取某一帧的解码结果, 可以调用本接口, 将待解码的码流(输入内存)传到解码器进行解码,此时,解码结果最终不会输出,解码完成的回调函数中返回的dvpp_pic_desc为0。异步接口。 |
| 输入说明 | vdec_channel_desc:int,指定通道描述信息的指针地址。 与调用acl.media.dvpp_create_channel接口创建通道时指定的dvpp_channel_desc保持一致。 调用acl.media.vdec_set_channel_desc系列接口设置通道描述信息的属性,包括解码通道号、线程、回调函数、视频编码协议等。 dvpp_stream_desc:int,输入码流描述信息的指针地址,输入内存用户需提前申请。 - 调用acl.media.dvpp_create_stream_desc接口创建码流描述信息,调用acl.media.dvpp_set_stream_desc系列接口设置视频码流信息的属性(例如,码流格式)。 输入码流格式以通道描述信息中设置的格式为准,调用acl.media.dvpp_set_stream_desc_format接口设置输入码流格式无效。 - 输入视频码流的分辨率、视频格式的要求,请参见功能及约束说明。 vdec_frame_config:int,解码配置的指针地址,预留,当前可填0。 user_data:python对象,用户自定义数据的指针地址。 如果用户需要获取解码的帧序号,则可以在“user_data”参数处定义,然后解码的帧序号可以通过“user_data”参数传递给VDEC的回调函数,用于确定回调函数中处理的是第几帧数据。 |
| 返回值说明 | ret:int,错误码。 - 返回0表示成功。 - 返回其它值表示失败。 |
| 约束说明 | - 发送数据前必须保证通道已经被创建,否则返回错误。 - 发送码流时须按帧发送,一次只发送完整的一帧码流。 - 不能发送eos为0的空码流包(码流长度为0或码流地址为空)。 - 不可以发送eos为1的帧。 - 由于码流异常、解码超时等原因,可能导致acl.media.vdec_send_frame接口发送帧或发送eos失败,建议用户在编写代码时,获取该接口的返回码,当该接口调用失败时,进行异常处理。 - acl.media.vdec_send_skipped_frame接口内部封装了acl.rt.launch_callback接口,用于在Stream的任务队列中增加一个需要在Host上执行的回调函数。用户在实现VDEC功能时,无需再单独调用acl.rt.launch_callback接口。 |
父主题: VDEC功能
函数:vdec_create_frame_config
| C函数原型 | aclvdecFrameConfig *aclvdecCreateFrameConfig() |
|---|---|
| Python函数 | vdec_frame_config = acl.media.vdec_create_frame_config() |
| 函数功能 | 创建aclvdecFrameConfig类型的数据,表示创建VDEC解码时的单帧解码配置参数。同步接口。 如需销毁aclvdecFrameConfig类型的数据,请参见acl.media.vdec_destroy_frame_config。 |
| 返回值说明 | vdec_frame_config:int,vdec_frame_config的指针地址。 - 返回非0值,表示成功。 - 返回0,表示失败。 |
父主题: VDEC功能
函数:vdec_destroy_frame_config
| C函数原型 | aclError aclvdecDestroyFrameConfig(aclvdecFrameConfig *vdecFrameConfig) |
|---|---|
| Python函数 | ret = acl.media.vdec_destroy_frame_config(vdec_frame_config) |
| 函数功能 | 销毁通过acl.media.vdec_create_frame_config接口创建的配置数据。同步接口。 |
| 输入说明 | vdec_frame_config:int,指定待销毁的数据。 |
| 返回值说明 | ret:int,错误码。 - 返回0表示成功。 - 返回其它值表示失败。 |
父主题: VDEC功能
函数:vdec_create_channel_desc
| C函数原型 | aclvdecChannelDesc *aclvdecCreateChannelDesc() |
|---|---|
| Python函数 | vdec_channel_desc = acl.media.vdec_create_channel_desc() |
| 函数功能 | 创建vdec_channel_desc类型的数据,表示创建视频数据解码处理通道时的通道描述信息。该接口为同步接口。 如需销毁aclvdecChannelDesc类型的数据,请参见acl.media.vdec_destroy_channel_desc。 |
| 返回值说明 | vdec_channel_desc:int,vdec通道描述地址对象。 - 返回vdec_channel_desc类型数据,表示成功。 - 返回0,表示失败。 |
父主题: VDEC功能
在线提单