JPEGD图片解码
功能支持度说明
昇腾AI处理器对媒体数据处理V1版本各功能的支持度如下表所示。
| 昇腾AI处理器 | VPC | JPEGD | JPEGE | PNGD | VDEC | VENC |
|---|---|---|---|---|---|---|
| Atlas 200/500 A2推理产品 | √ | √ | √ | √ | √ | √ |
父主题: 媒体数据处理V1
VPC图像处理典型功能
VPC(Vision Preprocessing Core)负责图像处理功能,支持对图片做抠图、缩放、格式转换等操作。关于VPC功能的详细介绍请参见功能说明,关于VPC功能对输入、输出的约束要求,请参见约束说明。
本节以抠图、缩放为例说明VPC图像处理时的接口调用流程,同时配合以下典型功能的示例代码辅助理解该接口调用流程:
接口调用流程(以抠图、缩放为例)
开发应用时,如果涉及抠图、缩放等图片处理,则应用程序中必须包含图片处理的代码逻辑,关于图片处理的接口调用流程,请先参见pyACL接口调用流程了解整体流程,再查看本节中的流程说明。
图1 抠图缩放流程

关键接口的说明如下(以抠图、缩放处理为例):
-
调用acl.media.dvpp_create_channel_desc接口创建通道描述信息。
-
调用acl.media.dvpp_create_channel接口创建图片数据处理的通道。
-
调用acl.media.dvpp_create_roi_config接口、acl.media.dvpp_create_resize_config接口分别创建抠图区域位置的配置、缩放配置。
-
实现抠图、缩放功能前,若需要申请Device上的内存存放输入或输出数据,需调用acl.media.dvpp_malloc申请内存。
-
执行抠图、缩放。
- 关于抠图:
-
调用acl.media.dvpp_vpc_crop_async异步接口,按指定区域从输入图片中抠图,再将抠的图片存放到输出内存中,作为输出图片。
输出图片区域与抠图区域“crop_area”不一致时会对图片再做一次缩放操作。
-
当前系统还提供了acl.media.dvpp_vpc_crop_and_paste_async异步接口,支持按指定区域从输入图片中抠图,再将抠的图片贴到目标图片的指定位置,作为输出图片。
- 抠图区域“crop_area”的宽高与贴图区域“paste_area”宽高不一致时会对图片再做一次缩放操作。
- 如果用户需要将目标图片读入内存用于存放输出图片,将贴图区域叠加在目标图片上,则需要编写代码逻辑:在申请输出内存后,将目标图片读入输出内存。
-
- 关于缩放:
- 调用acl.media.dvpp_vpc_resize_async异步接口,将输入图片缩放到输出图片大小。
- 缩放后输出图片内存根据YUV420SP格式计算,计算公式:对齐后的宽 * 对齐后的高 * 3 / 2。
- 对于异步接口,还需调用acl.rt.synchronize_stream接口阻塞程序运行,直到指定Stream中的所有任务都完成。
- 关于抠图:
-
调用acl.media.dvpp_free接口释放输入、输出内存。
-
调用acl.media.dvpp_destroy_roi_config接口、acl.media.dvpp_destroy_resize_config接口分别销毁抠图区域位置的配置、缩放配置。
-
调用acl.media.dvpp_destroy_channel接口销毁图片数据处理的通道。
销毁图片数据处理的通道后,再调用acl.media.dvpp_destroy_channel_desc接口销毁通道描述信息。
图片缩放示例代码
-
调用acl.media.dvpp_create_channel接口创建图片数据处理的通道、调用acl.media.dvpp_destroy_channel接口销毁图片数据处理的通道。
-
调用acl.media.dvpp_vpc_resize_async异步接口,将输入图片缩放到输出图片大小。对于异步接口,还需调用acl.rt.synchronize_stream接口阻塞程序运行,直到指定Stream中的所有任务都完成。
-
调用acl.media.dvpp_create_resize_config接口创建图片缩放配置数据。
如果不想使用默认缩放算法,也可以调用acl.media.dvpp_set_resize_config_interpolation接口指定缩放算法。
您可以从获取样例中获取完整样例代码。
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考。
<br> 1<br> 2<br> 3<br> 4<br> 5<br> 6<br> 7<br> 8<br> 9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br>40<br>41<br>42<br>43<br>44<br>45<br>46<br>47<br>48<br>49<br>50<br>51<br>52<br>53<br>54<br>55<br>56<br>57<br>58<br>59<br>60<br>61<br>62<br>63<br>64<br>65<br>66<br>67<br>68<br>69<br>70<br>71<br>72<br>73<br>74<br>75<br>76<br> | python<br>import acl<br># ......<br># 1.ACL初始化。<br>ret = acl.init()<br># 2.运行管理资源申请,包括Device、Context、Stream。<br>self.device_id = 0<br>ret = acl.rt.set_device(self.device_id)<br>self.context, ret = acl.rt.create_context(self.device_id)<br>self.stream, ret = acl.rt.create_stream()<br># 3.创建图片缩放配置数据,不支持指定缩放算法,默认缩放算法为“最近邻插值”。<br># self.resize_config是acldvppResizeConfig类型。<br>self.resize_config = acl.media.dvpp_create_resize_config()<br># 4.创建图片数据处理通道时的通道描述信息,self.dvpp_channel_desc是acldvppChannelDesc类型。<br>self.dvpp_channel_desc = acl.media.dvpp_create_channel_desc()<br># 5.创建图片数据处理的通道。<br>ret = acl.media.dvpp_create_channel(self.dvpp_channel_desc)<br># 6.申请缩放输入内存,内存大小根据计算公式得出; w和h是输入图片的实际尺寸。<br>width_stride = ((w + 15) // 16) * 16<br>height_stride = ((h + 1) // 2) * 2<br>buffer_size = (width_stride * height_stride * 3) // 2<br>dev_in, ret = acl.media.dvpp_malloc(buffer_size )<br>self.dev_buffer['input_0'] = dev<br># 7.申请缩放输出内存,内存大小根据计算公式得出; w和h是输入图片的缩放尺寸。<br>width_stride = ((w + 15) // 16) * 16<br>height_stride = ((h + 1) // 2) * 2<br>buffer_size = (width_stride * height_stride * 3) // 2<br>dev_out, ret = acl.media.dvpp_malloc(buffer_size )<br>self.dev_buffer['output_0'] = dev<br># 8.创建缩放输入图片的描述信息,并设置各属性值。<br># self.input_desc是acldvppPicDesc类型。<br>self.input_desc = acl.media.dvpp_create_pic_desc()<br>ret = acl.media.dvpp_set_pic_desc_data(self.input_desc, buffer)<br>ret = acl.media.dvpp_set_pic_desc_format(self.input_desc, YUV420)<br>ret = acl.media.dvpp_set_pic_desc_width(self.input_desc, width)<br>ret = acl.media.dvpp_set_pic_desc_height(self.input_desc, height)<br>ret = acl.media.dvpp_set_pic_desc_width_stride(self.input_desc, wstride)<br>ret = acl.media.dvpp_set_pic_desc_height_stride(self.input_desc, hstride)<br>ret = acl.media.dvpp_set_pic_desc_size(self.input_desc, size)<br># 9.创建缩放输出图片的描述信息,并设置各属性值。<br># 如果缩放的输出图片作为模型推理的输入,则输出图片的宽高要与模型要求的宽高保持一致。<br># self.output_desc是acldvppPicDesc类型。<br>self.output_desc= acl.media.dvpp_create_pic_desc()<br>ret = acl.media.dvpp_set_pic_desc_data(self.output_desc, buffer)<br>ret = acl.media.dvpp_set_pic_desc_format(self.output_desc, YUV420)<br>ret = acl.media.dvpp_set_pic_desc_width(self.output_desc, width)<br>ret = acl.media.dvpp_set_pic_desc_height(self.output_desc, height)<br>ret = acl.media.dvpp_set_pic_desc_width_stride(self.output_desc, wstride)<br>ret = acl.media.dvpp_set_pic_desc_height_stride(self.output_desc, hstride)<br>ret = acl.media.dvpp_set_pic_desc_size(self.output_desc, size)<br># 10.执行异步缩放,再调用acl.rt.synchronize_stream接口阻塞Host运行,直到指定Stream中的所有任务都完成。<br>ret = acl.media.dvpp_vpc_resize_async(self.dvpp_channel_desc, self.input_desc,<br> self.output_desc, self.resize_config,<br> self.stream)<br>ret = acl.rt.synchronize_stream(self.stream)<br># 11.缩放结束后,释放资源,包括缩放输入/输出图片的描述信息、缩放输入/输出内存。<br>ret = acl.media.dvpp_destroy_pic_desc(self.output_desc)<br>ret = acl.media.dvpp_destroy_pic_desc(self.input_desc)<br>ret = acl.media.dvpp_free(self.dev_buffer['input_0'] )<br>ret = acl.media.dvpp_free(self.dev_buffer['output_0'] )<br># 12.释放运行管理资源。<br>ret = acl.rt.destroy_stream(self.stream)<br>ret = acl.rt.destroy_context(self.context)<br>ret = acl.rt.reset_device(self.device_id)<br>ret = acl.finalize()<br># ......<br> |
|---|
格式转换示例代码
格式转换支持以下两种实现方式:
- 在实现抠图、缩放等功能时,调用对应的接口(例如acl.media.dvpp_vpc_crop_async接口)时,通过将输入图片和输出图片的格式设置成不同的,达到转换图片格式的目的。
- 如果仅进行图片格式转换,也可以直接调用acl.media.dvpp_vpc_convert_color_async接口。
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。
<br> 1<br> 2<br> 3<br> 4<br> 5<br> 6<br> 7<br> 8<br> 9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br>40<br>41<br>42<br>43<br>44<br>45<br>46<br>47<br>48<br>49<br>50<br>51<br>52<br>53<br>54<br>55<br>56<br>57<br>58<br>59<br>60<br>61<br>62<br>63<br>64<br>65<br>66<br>67<br>68<br>69<br>70<br>71<br>72<br>73<br>74<br>75<br>76<br>77<br>78<br>79<br>80<br>81<br>82<br>83<br>84<br>85<br>86<br>87<br>88<br> | python<br>import acl<br># ......<br>ACL_MEMCPY_HOST_TO_DEVICE = 1<br>ACL_MEMCPY_DEVICE_TO_HOST = 2<br>PIXEL_FORMAT_YUV_400 = 0<br>PIXEL_FORMAT_YUV_SEMIPLANAR_420 = 1<br># 1.ACL初始化。<br>ret = acl.init()<br># 2.运行管理资源申请,包括Device、Context、Stream。<br>device_id = 0<br>ret = acl.rt.set_device(device_id)<br>context, ret = acl.rt.create_context(device_id)<br>stream, ret = acl.rt.create_stream()<br># 3.创建图片数据处理通道时的通道描述信息,dvpp_channel_desc是acldvppChannelDesc类型。<br>dvpp_channel_desc = acl.media.dvpp_create_channel_desc()<br># 4.创建图片数据处理的通道。<br>ret = acl.media.dvpp_create_channel(dvpp_channel_desc)<br># 5.申请输入内存。<br>input_width_stride = ((input_width + 15) // 16) * 16<br>input_height_stride = ((input_height + 1) // 2) * 2<br># input_width_stride、input_height_stride分别表示图片的对齐后宽、对齐后高,此处以YUV420SP格式的图片为例。<br>in_buffer_size = (input_width_stride * input_height_stride * 3) // 2<br>in_dev_buffer, ret = acl.media.dvpp_malloc(in_buffer_size)<br>np_yuv = np.fromfile(path, dtype=np.byte)<br>buffer_size = np_yuv.itemsize * np_yuv.size<br>bytes_data = np_yuv.tobytes()<br>np_yuv_ptr = acl.util.bytes_to_ptr(bytes_data)<br>ret = acl.rt.memcpy(in_dev_buffer, buffer_size, np_yuv_ptr,<br> buffer_size, ACL_MEMCPY_HOST_TO_DEVICE)<br># 6.申请色域转换输出内存。<br>output_width_stride = ((output_width + 15) // 16) * 16<br>output_height_stride = ((output_height + 1) // 2) * 2<br># output_width_stride、output_height_stride分别表示图片的对齐后宽、对齐后高,此处以YUV420SP格式的图片为例。<br>out_buffer_size = (output_width_stride * output_height_stride * 3) // 2<br>out_dev_buffer, ret = acl.media.dvpp_malloc(out_buffer_size)<br># 7.创建色域转换输入图片的描述信息,并设置各属性值。<br>input_desc = acl.media.dvpp_create_pic_desc()<br>ret = acl.media.dvpp_set_pic_desc_data(input_desc, in_dev_buffer)<br>ret = acl.media.dvpp_set_pic_desc_format(input_desc, PIXEL_FORMAT_YUV_SEMIPLANAR_420)<br>ret = acl.media.dvpp_set_pic_desc_width(input_desc, input_width)<br>ret = acl.media.dvpp_set_pic_desc_height(input_desc, input_height)<br>ret = acl.media.dvpp_set_pic_desc_width_stride(input_desc, input_width_stride)<br>ret = acl.media.dvpp_set_pic_desc_height_stride(input_desc, input_height_stride)<br>ret = acl.media.dvpp_set_pic_desc_size(input_desc, in_buffer_size)<br># 8.创建色域转换的输出图片的描述信息,并设置各属性值, 输出的宽和高要求和输入一致。<br># 如果色域转换的输出图片作为模型推理的输入,则输出图片的宽高要与模型要求的宽高保持一致。<br>output_desc = acl.media.dvpp_create_pic_desc()<br>ret = acl.media.dvpp_set_pic_desc_data(output_desc, out_dev_buffer)<br>ret = acl.media.dvpp_set_pic_desc_format(output_desc, PIXEL_FORMAT_YUV_400)<br>ret = acl.media.dvpp_set_pic_desc_width(output_desc, output_width)<br>ret = acl.media.dvpp_set_pic_desc_height(output_desc, output_height)<br>ret = acl.media.dvpp_set_pic_desc_width_stride(output_desc, output_width_stride)<br>ret = acl.media.dvpp_set_pic_desc_height_stride(output_desc, output_height_stride)<br>ret = acl.media.dvpp_set_pic_desc_size(output_desc, out_buffer_size)<br># 9.执行异步色域转换,再调用acl.rt.synchronize_stream接口阻塞程序运行,直到指定Stream中的所有任务都完成。<br>ret = acl.media.dvpp_vpc_convert_color_async(dvpp_channel_desc, input_desc,<br> output_desc, stream)<br>ret = acl.rt.synchronize_stream(stream)<br># 10.色域转换结束后,释放资源,包括输入/输出图片的描述信息、输入/输出内存。<br>ret = acl.media.dvpp_destroy_pic_desc(input_desc)<br>ret = acl.media.dvpp_destroy_pic_desc(output_desc)<br>np_output = np.zeros(out_buffer_size, dtype=np.byte)<br>bytes_data = np_output.tobytes()<br>np_output_ptr = acl.util.bytes_to_ptr(bytes_data)<br># 将Device的处理结果数据传输到Host。<br>ret = acl.rt.memcpy(np_output_ptr, out_buffer_size, out_dev_buffer,<br> out_buffer_size, ACL_MEMCPY_DEVICE_TO_HOST)<br>ret = acl.media.dvpp_free(in_dev_buffer)<br>ret = acl.media.dvpp_free(out_dev_buffer)<br># 11.释放运行管理资源。<br>ret = acl.rt.destroy_stream(self.stream)<br>ret = acl.rt.destroy_context(self.context)<br>ret = acl.rt.reset_device(self.device_id)<br>ret = acl.finalize()<br># ......<br> |
|---|
抠图(一图一框)示例代码
调用acl.media.dvpp_vpc_crop_async异步接口,按指定区域从输入图片中抠图,再将抠的图片存放到输出内存中,作为输出图片。
您可以从获取样例中获取完整样例代码。
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考。
<br> 1<br> 2<br> 3<br> 4<br> 5<br> 6<br> 7<br> 8<br> 9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br>40<br>41<br>42<br>43<br>44<br>45<br>46<br>47<br>48<br>49<br>50<br>51<br>52<br>53<br>54<br>55<br>56<br>57<br>58<br>59<br> | python<br>import acl<br># ......<br># 1.pyACL初始化。<br>ret = acl.init()<br># 2.运行管理资源申请,包括Device、Context、Stream。<br>self.device_id = 0<br>ret = acl.rt.set_device(self.device_id)<br>self.context, ret = acl.rt.create_context(self.device_id)<br>self.stream, ret = acl.rt.create_stream()<br># 3.指定抠图区域的位置、指定贴图区域的位置。<br># 按左上角为原点做偏移。w,h为图片原始宽高。<br>self.crop_area = acl.media.dvpp_create_roi_config(w // 2, w - 1, h // 2, h - 1)<br># 4.创建图片数据处理通道时的通道描述信息,dvpp_channel_desc 是acldvppChannelDesc类型。<br>self.dvpp_channel_desc = acl.media.dvpp_create_channel_desc()<br># 5.创建图片数据处理的通道。<br>ret = acl.media.dvpp_create_channel(self.dvpp_channel_desc)<br># 6.创建输入输出图片的描述信息,并设置各属性值。<br>self.input_desc = acl.media.dvpp_create_pic_desc()<br>assert self.input_desc is not None<br># 6.1 自定义方法 set_picture_desc 设置输入图片描述。<br># 根据计算公式计算内存大小存储图片数据,并设置到图片描述,同时设置其他属性。<br>self.set_picture_desc(self.input_desc, w, h, "input", 0)<br>self.output_desc = acl.media.dvpp_create_pic_desc()<br>assert self.output_desc is not None<br># 6.2 自定义方法 set_picture_desc 设置输出图片描述。<br>out_buffer_size = self.set_picture_desc(self.output_desc, w // 2, h // 2, "output", 0)<br># 7.执行异步抠图,再调用acl.rt.synchronize_stream接口阻塞Host运行,直到指定Stream中的所有任务都完成。<br>ret = acl.media.dvpp_vpc_crop_async(self.dvpp_channel_desc, self.input_desc, self.output_desc, self.crop_area, self.stream)<br>ret = acl.rt.synchronize_stream(self.stream)<br># 8.释放资源,包括输入/输出图片的描述信息、输入/输出内存、通道描述信息、通道等。<br>ret = acl.media.dvpp_destroy_pic_desc(self.input_desc)<br>ret = acl.media.dvpp_destroy_pic_desc(self.output_desc)<br># dev_buffer是字典对象,存储device侧申请内存。<br>for key in self.dev_buffer.keys():<br> if self.dev_buffer[key]:<br> ret = acl.media.dvpp_free(self.dev_buffer[key])<br>if self.dvpp_channel_desc:<br> ret = acl.media.dvpp_destroy_channel(self.dvpp_channel_desc)<br> assert ret == 0<br> ret = acl.media.dvpp_destroy_channel_desc(self.dvpp_channel_desc)<br> assert ret == 0<br># 9.释放运行管理资源。<br>ret = acl.rt.destroy_stream(self.stream)<br>ret = acl.rt.destroy_context(self.context)<br>ret = acl.rt.reset_device(self.device_id)<br># 10.pyACL去初始化。<br>ret = acl.finalize()<br># ......<br> |
|---|
抠图缩放(一图一框)示例代码
-
调用acl.media.dvpp_vpc_crop_resize_async异步接口,按指定区域从输入图片中抠图,再将抠的图片存放到输出内存中,作为输出图片。对于异步接口,还需调用acl.rt.synchronize_stream接口阻塞程序运行,直到指定Stream中的所有任务都完成。
调用acl.media.dvpp_vpc_crop_resize_async接口实现抠图缩放时,支持指定缩放算法。
-
输出图片区域与抠图区域“crop_area”不一致时会对图片再做一次缩放操作。
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考。
<br> 1<br> 2<br> 3<br> 4<br> 5<br> 6<br> 7<br> 8<br> 9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br>40<br>41<br>42<br>43<br>44<br>45<br>46<br>47<br>48<br>49<br>50<br>51<br>52<br>53<br>54<br>55<br>56<br>57<br>58<br>59<br>60<br>61<br>62<br>63<br>64<br> | python<br>import acl<br># ......<br># 1.pyACL初始化。<br>ret = acl.init()<br># 2.运行管理资源申请,包括Device、Context、Stream。<br>self.device_id = 0<br>ret = acl.rt.set_device(self.device_id)<br>self.context, ret = acl.rt.create_context(self.device_id)<br>self.stream, ret = acl.rt.create_stream()<br># 3.指定抠图区域的位置、指定贴图区域的位置。<br># 按左上角为原点做偏移。w,h为图片原始宽高。<br>self.crop_area = acl.media.dvpp_create_roi_config(w // 2, w - 1, h // 2, h - 1)<br># 4.创建图片数据处理通道时的通道描述信息,dvpp_channel_desc 是acldvppChannelDesc类型。<br>self.dvpp_channel_desc = acl.media.dvpp_create_channel_desc()<br># 5.创建图片数据处理的通道。<br>ret = acl.media.dvpp_create_channel(self.dvpp_channel_desc)<br># 6.创建输入输出图片的描述信息,并设置各属性值。<br>self.input_desc = acl.media.dvpp_create_pic_desc()<br>assert self.input_desc is not None<br># 6.1 自定义方法 set_picture_desc 设置输入图片描述。<br># 根据计算公式计算内存大小存储图片数据,并设置到图片描述,同时设置其他属性。<br>self.set_picture_desc(self.input_desc, w, h, "input", 0)<br>self.output_desc = acl.media.dvpp_create_pic_desc()<br>assert self.output_desc is not None<br># 6.2 自定义方法 set_picture_desc 设置输出图片描述。<br>resize_width = w // 4<br>resize_height = h // 4<br>out_buffer_size = self.set_picture_desc(self.output_desc, resize_width, resize_height, "output", 0)<br># 7.执行异步抠图,再调用acl.rt.synchronize_stream接口阻塞Host运行,直到指定Stream中的所有任务都完成。<br>self.resize_config = acl.media.dvpp_create_resize_config()<br>ret = acl.media.dvpp_vpc_crop_resize_async(self.dvpp_channel_desc, self.input_desc,<br> self.output_desc, self.crop_area, self.resize_config,<br> self.stream)<br>ret = acl.rt.synchronize_stream(self.stream)<br># 8.释放资源,包括输入/输出图片的描述信息、输入/输出内存、通道描述信息、通道等。<br>ret = acl.media.dvpp_destroy_pic_desc(self.input_desc)<br>ret = acl.media.dvpp_destroy_pic_desc(self.output_desc)<br># dev_buffer是字典对象,存储device侧申请内存。<br>for key in self.dev_buffer.keys():<br> if self.dev_buffer[key]:<br> ret = acl.media.dvpp_free(self.dev_buffer[key])<br>if self.dvpp_channel_desc:<br> ret = acl.media.dvpp_destroy_channel(self.dvpp_channel_desc)<br> assert ret == 0<br> ret = acl.media.dvpp_destroy_channel_desc(self.dvpp_channel_desc)<br> assert ret == 0<br># 9.释放运行管理资源。<br>ret = acl.rt.destroy_stream(self.stream)<br>ret = acl.rt.destroy_context(self.context)<br>ret = acl.rt.reset_device(self.device_id)<br># 10.pyACL去初始化。<br>ret = acl.finalize()<br># ......<br> |
|---|
抠图贴图(一图一框)示例代码
- 调用acl.media.dvpp_vpc_crop_and_paste_async异步接口,按指定区域从输入图片中抠图,再将抠的图片贴到目标图片的指定位置,作为输出图片。对于异步接口,还需调用acl.rt.synchronize_stream接口阻塞程序运行,直到指定Stream中的所有任务都完成。
- 抠图区域“crop_area”的宽高与贴图区域“paste_area”宽高不一致时会对图片再做一次缩放操作。
- 如果用户需要将目标图片读入内存用于存放输出图片,将贴图区域叠加在目标图片上,则需要编写代码逻辑:在申请输出内存后,将目标图片读入输出内存。
您可以从获取样例中获取完整样例代码。
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考。
<br> 1<br> 2<br> 3<br> 4<br> 5<br> 6<br> 7<br> 8<br> 9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br>40<br>41<br>42<br>43<br>44<br>45<br>46<br>47<br>48<br>49<br>50<br>51<br>52<br>53<br>54<br>55<br>56<br>57<br>58<br>59<br>60<br>61<br>62<br>63<br> | python<br>import acl<br># ......<br># 1.pyACL初始化。<br>ret = acl.init()<br># 2.运行管理资源申请,包括Device、Context、Stream。<br>self.device_id = 0<br>ret = acl.rt.set_device(self.device_id)<br>self.context, ret = acl.rt.create_context(self.device_id)<br>self.stream, ret = acl.rt.create_stream()<br># 3.指定抠图区域的位置、指定贴图区域的位置。<br># 按左上角为原点做偏移。w,h为图片原始宽高。<br>self.crop_area = acl.media.dvpp_create_roi_config(w // 2, w - 1, h // 2, h - 1)<br>self.paste_area = acl.media.dvpp_create_roi_config(w // 2, w - 1, h // 2, h - 1)<br># 4.创建图片数据处理通道时的通道描述信息,dvpp_channel_desc 是acldvppChannelDesc类型。<br>self.dvpp_channel_desc = acl.media.dvpp_create_channel_desc()<br># 5.创建图片数据处理的通道。<br>ret = acl.media.dvpp_create_channel(self.dvpp_channel_desc)<br># 6.创建输入输出图片的描述信息,并设置各属性值。<br>self.input_desc = acl.media.dvpp_create_pic_desc()<br>assert self.input_desc is not None<br># 6.1 自定义方法 set_picture_desc 设置输入图片描述。<br># 根据计算公式计算内存大小存储图片数据,并设置到图片描述,同时设置其他属性。<br>self.set_picture_desc(self.input_desc, w, h, "input", 0)<br>self.output_desc = acl.media.dvpp_create_pic_desc()<br>assert self.output_desc is not None<br># 6.2 自定义方法 set_picture_desc 设置输出图片描述。<br>out_buffer_size = self.set_picture_desc(self.output_desc, w, h, "output", 0)<br># 7.执行异步抠图粘贴,再调用acl.rt.synchronize_stream接口阻塞Host运行,直到指定Stream中的所有任务都完成。<br>ret = acl.media.dvpp_vpc_crop_and_paste_async(self.dvpp_channel_desc,<br> self.input_desc, self.output_desc,<br> self.crop_area, self.paste_area,<br> self.stream)<br>ret = acl.rt.synchronize_stream(self.stream)<br># 8.释放资源,包括输入/输出图片的描述信息、输入/输出内存、通道描述信息、通道等。<br>ret = acl.media.dvpp_destroy_pic_desc(self.input_desc)<br>ret = acl.media.dvpp_destroy_pic_desc(self.output_desc)<br># dev_buffer是字典对象,存储device侧申请内存。<br>for key in self.dev_buffer.keys():<br> if self.dev_buffer[key]:<br> ret = acl.media.dvpp_free(self.dev_buffer[key])<br>if self.dvpp_channel_desc:<br> ret = acl.media.dvpp_destroy_channel(self.dvpp_channel_desc)<br> assert ret == 0<br> ret = acl.media.dvpp_destroy_channel_desc(self.dvpp_channel_desc)<br> assert ret == 0<br># 9.释放运行管理资源。<br>ret = acl.rt.destroy_stream(self.stream)<br>ret = acl.rt.destroy_context(self.context)<br>ret = acl.rt.reset_device(self.device_id)<br># 10.pyACL去初始化。<br>ret = acl.finalize()<br># ......<br> |
|---|
抠图贴图缩放(一图一框)示例代码
-
调用acl.media.dvpp_vpc_crop_resize_paste_async异步接口,按指定区域从输入图片中抠图,再将抠的图片贴到目标图片的指定位置,作为输出图片。对于异步接口,还需调用acl.rt.synchronize_stream接口阻塞程序运行,直到指定Stream中的所有任务都完成。
调用acl.media.dvpp_vpc_crop_resize_paste_async实现抠图缩放贴图时,支持指定缩放算法。
-
抠图区域“crop_area”的宽高与贴图区域“paste_area”宽高不一致时会对图片再做一次缩放操作。
-
如果用户需要将目标图片读入内存用于存放输出图片,将贴图区域叠加在目标图片上,则需要编写代码逻辑:在申请输出内存后,将目标图片读入输出内存。
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考。
<br> 1<br> 2<br> 3<br> 4<br> 5<br> 6<br> 7<br> 8<br> 9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br>40<br>41<br>42<br>43<br>44<br>45<br>46<br>47<br>48<br>49<br>50<br>51<br>52<br>53<br>54<br>55<br>56<br>57<br>58<br>59<br>60<br>61<br>62<br>63<br>64<br>65<br>66<br>67<br>68<br>69<br>70<br>71<br>72<br>73<br>74<br>75<br>76<br>77<br>78<br>79<br>80<br> | python<br>import acl<br># ......<br># 1.pyACL初始化。<br>ret = acl.init()<br># 2.运行管理资源申请,包括Device、Context、Stream。<br>self.device_id = 0<br>ret = acl.rt.set_device(self.device_id)<br>self.context, ret = acl.rt.create_context(self.device_id)<br>self.stream, ret = acl.rt.create_stream()<br># 3.创建图片数据处理通道时的通道描述信息,dvpp_channel_desc 是acldvppChannelDesc类型。<br>self.dvpp_channel_desc = acl.media.dvpp_create_channel_desc()<br># 4.创建图片数据处理的通道。<br>ret = acl.media.dvpp_create_channel(self.dvpp_channel_desc)<br># 5.创建输出图片的描述信息,并设置各属性值。<br>self.output_desc = acl.media.dvpp_create_pic_desc()<br>assert self.output_desc is not None<br>out_buffer_size = self.set_picture_desc(self.output_desc, w // 2, h // 2, "output", 0)<br># 6.创建输入图片的描述信息,并设置各属性值。<br>self.input_desc = acl.media.dvpp_create_pic_desc()<br>assert self.input_desc is not None<br>self.set_picture_desc(self.input_desc, w, h, "input", 0)<br># 7.加载图片数据,并拷贝到Device侧。<br>np_yuv = np.fromfile(path, dtype=np.byte)<br>in_buffer_size = np_yuv.itemsize * np_yuv.size<br>bytes_data = np_yuv.tobytes()<br>np_yuv_ptr = acl.util.bytes_to_ptr(bytes_data)<br>ret = acl.rt.memcpy(self.dev_buffer["input_0"], in_buffer_size, np_yuv_ptr,<br> in_buffer_size, ACL_MEMCPY_HOST_TO_DEVICE)<br>assert ret == 0<br># 8.指定抠图、贴图区域的位置。<br>self.crop_area = acl.media.dvpp_create_roi_config(w // 2, w - 1, h // 2, h - 1)<br>self.paste_area = acl.media.dvpp_create_roi_config(w // 4, w // 2 - 1, h // 4, h // 2 - 1)<br># 9.执行异步抠图贴图缩放。<br>self.resize_config = acl.media.dvpp_create_resize_config()<br>ret = acl.media.dvpp_vpc_crop_resize_paste_async(self.dvpp_channel_desc,<br> self.input_desc, self.output_desc,<br> self.crop_area, self.paste_area,<br> self.resize_config, self.stream)<br>assert ret == 0<br>ret = acl.rt.synchronize_stream(self.stream)<br>assert ret == 0<br># 10.将输出数据拷贝到Host侧。<br>np_output = np.zeros(out_buffer_size, dtype=np.byte)<br>bytes_data = np_output.tobytes()<br>np_output_ptr = acl.util.bytes_to_ptr(bytes_data)<br>ret = acl.rt.memcpy(np_output_ptr, out_buffer_size, self.dev_buffer["output_0"],<br> out_buffer_size, ACL_MEMCPY_DEVICE_TO_HOST)<br>assert ret == 0<br># 11.释放资源,包括输入/输出图片的描述信息、输入/输出内存、通道描述信息、通道等。<br>ret = acl.media.dvpp_destroy_pic_desc(self.input_desc)<br>ret = acl.media.dvpp_destroy_pic_desc(self.output_desc)<br># dev_buffer是字典对象,存储device侧申请内存。<br>for key in self.dev_buffer.keys():<br> if self.dev_buffer[key]:<br> ret = acl.media.dvpp_free(self.dev_buffer[key])<br>if self.dvpp_channel_desc:<br> ret = acl.media.dvpp_destroy_channel(self.dvpp_channel_desc)<br> assert ret == 0<br> ret = acl.media.dvpp_destroy_channel_desc(self.dvpp_channel_desc)<br> assert ret == 0<br># 12.释放运行管理资源。<br>ret = acl.rt.destroy_stream(self.stream)<br>ret = acl.rt.destroy_context(self.context)<br>ret = acl.rt.reset_device(self.device_id)<br># 13.pyACL去初始化。<br>ret = acl.finalize()<br># ......<br> |
|---|
抠图贴图(一图多框)示例代码
- 调用dvpp_vpc_batch_crop_and_paste_async异步接口,按指定区域从输入图片中抠图,再将抠的图片贴到目标图片的指定位置,作为输出图片。对于异步接口,还需调用acl.rt.synchronize_stream接口阻塞程序运行,直到指定Stream中的所有任务都完成。
- 抠图区域“crop_area”的宽高与贴图区域“paste_area”宽高不一致时会对图片再做一次缩放操作。
- 如果用户需要将目标图片读入内存用于存放输出图片,将贴图区域叠加在目标图片上,则需要编写代码逻辑:在申请输出内存后,将目标图片读入输出内存。
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考。
<br> 1<br> 2<br> 3<br> 4<br> 5<br> 6<br> 7<br> 8<br> 9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br>40<br>41<br>42<br>43<br>44<br>45<br>46<br>47<br>48<br>49<br>50<br>51<br>52<br>53<br>54<br>55<br>56<br>57<br>58<br>59<br>60<br>61<br>62<br>63<br>64<br>65<br>66<br>67<br>68<br>69<br>70<br>71<br>72<br>73<br>74<br>75<br>76<br>77<br>78<br>79<br>80<br>81<br>82<br>83<br>84<br>85<br>86<br>87<br> | python<br>import acl<br># ......<br># 1.pyACL初始化。<br>ret = acl.init()<br># 2.运行管理资源申请,包括Device、Context、Stream。<br>self.device_id = 0<br>ret = acl.rt.set_device(self.device_id)<br>self.context, ret = acl.rt.create_context(self.device_id)<br>self.stream, ret = acl.rt.create_stream()<br># 3.创建图片批处理输入输出描述。<br>self.out_batch_pic_desc = acl.media.dvpp_create_batch_pic_desc(self.out_batch_size)<br>self.in_batch_pic_desc = acl.media.dvpp_create_batch_pic_desc(self.in_batch_size)<br># 3.1 指定批量抠图区域的位置、指定批量贴图区域的位置。<br># 3.2 设置输入输出图片描述:如果抠图贴图的输出图片作为模型推理的输入,则输出图片的宽高要与模型要求的宽高保持一致。<br>for i in range(self.in_batch_size):<br> input_desc = acl.media.dvpp_get_pic_desc(self.in_batch_pic_desc, i)<br> assert input_desc is not None<br> # 申请内存并设置输出图片描述。<br> self.set_picture_desc(input_desc, w, h, "input", i)<br> # copy from host to device.<br> key = "input" + '_' + str(i)<br> ret = acl.rt.memcpy(self.dev_buffer[key], in_buffer_size, np_yuv_ptr,<br> in_buffer_size, 1)<br> assert ret == 0<br> # 创建roiNums,每张图对应需要抠图和贴图的数量。<br> roiList.append(self.out_batch_size // self.in_batch_size)<br>for i in range(self.out_batch_size):<br> output_desc = acl.media.dvpp_get_pic_desc(self.out_batch_pic_desc, i)<br> assert output_desc is not None<br> # 自定义方法申请内存并设置输出图片描述。<br> self.set_picture_desc(output_desc, w, h, "output", i)<br> if i == 0:<br> crop_area = acl.media.dvpp_create_roi_config(w // 2, w - 1, h // 2, h - 1)<br> else:<br> crop_area = acl.media.dvpp_create_roi_config(0, w - 1, h // 2, h - 1)<br> paste_area = acl.media.dvpp_create_roi_config(w // 2, w - 1, h // 2, h - 1)<br> self.cropList.append(crop_area)<br> self.pasteList.append(paste_area)<br># 3.3 roiList,每张图对应需要抠图和贴图的数量。输出图片数相对输入多出来的,加到最后一张输入图片的输出。<br>total_num = 0<br>for i in range(self.in_batch_size):<br> total_num += roiList[i]<br>if self.out_batch_size % self.in_batch_size != 0:<br> roiList[-1] = self.out_batch_size - total_num + roiList[-1]<br># 4.创建图片数据处理通道时的通道描述信息,dvppChannelDesc_是acldvppChannelDesc类型。<br>self.dvpp_channel_desc = acl.media.dvpp_create_channel_desc()<br># 5.创建图片数据处理的通道。<br>ret = acl.media.dvpp_create_channel(self.dvpp_channel_desc)<br># 6.执行异步缩放,再调用acl.rt.synchronize_stream接口阻塞程序运行,直到指定Stream中的所有任务都完成。<br>_, ret = acl.media.dvpp_vpc_batch_crop_and_paste_async(self.dvpp_channel_desc, self.in_batch_pic_desc,<br> roiList, self.out_batch_pic_desc, self.cropList,<br> self.pasteList, self.stream)<br>ret = acl.rt.synchronize_stream(self.stream)<br># 7.释放资源,包括输入/输出图片的描述信息、输入/输出内存、通道描述信息、通道等。<br># 7.1 释放图片描述和批量图片描述。<br>self._free_pic_desc()<br>for i in range(len(self.cropList)):<br> ret = acl.media.dvpp_destroy_roi_config(self.cropList[i])<br> assert ret == 0<br>for i in range(len(self.pasteList)):<br> ret = acl.media.dvpp_destroy_roi_config(self.pasteList[i])<br> assert ret == 0<br>for key in self.dev_buffer.keys():<br> if self.dev_buffer[key]:<br> ret = acl.media.dvpp_free(self.dev_buffer[key])<br># 7.2 销毁通道和通道描述。<br>if self.dvpp_channel_desc:<br> ret = acl.media.dvpp_destroy_channel(self.dvpp_channel_desc)<br> assert ret == 0<br> ret = acl.media.dvpp_destroy_channel_desc(self.dvpp_channel_desc)<br> assert ret == 0<br># 8.释放运行管理资源。<br>ret = acl.rt.destroy_stream(self.stream)<br>ret = acl.rt.destroy_context(self.context)<br>ret = acl.rt.reset_device(self.device_id)<br>9.pyACL去初始化。<br>ret = acl.finalize()<br># ......<br> |
|---|
父主题: 媒体数据处理V1
JPEGD图片解码
JPEGD(JPEG Decoder)负责完成图像解码功能,将.jpg、.jpeg、.JPG、.JPEG图片解码成YUV格式图片。关于JPEGD功能的详细介绍及约束请参见功能及约束说明。
本节介绍JPEGD图片解码的接口调用流程,同时配合示例代码辅助理解该接口调用流程。
接口调用流程
开发应用时,如果涉及对JPEG图片的解码,则应用程序中必须包含图片解码的代码逻辑,关于图片解码的接口调用流程,请先参见pyACL接口调用流程了解整体流程,再查看本节中的流程说明。
图1 JPEG图片解码

当前系统支持.jpg、.jpeg、.JPG、.JPEG图片的解码,针对不同的源图编码格式,输出不同编码格式的图片,关键接口的说明如下:
-
调用acl.media.dvpp_create_channel_desc接口创建通道描述信息。
-
调用acl.media.dvpp_create_channel接口创建图片数据处理的通道。
-
实现JPEG图片解码功能前,若需要申请Device上的内存存放输入或输出数据,需调用acl.media.dvpp_malloc申请内存。
在申请输出内存前,可根据存放JPEG图片数据的内存,调用acl.media.dvpp_jpeg_predict_dec_size接口预估JPEG图片解码后所需的输出内存的大小。
-
调用acl.media.dvpp_jpeg_decode_async异步接口进行解码。
对于异步接口,还需调用acl.rt.synchronize_stream接口阻塞程序运行,直到指定Stream中的所有任务都完成。
-
在解码结束后,需及时调用acl.media.dvpp_free接口释放输入、输出内存。
-
调用acl.media.dvpp_destroy_channel接口销毁图片数据处理的通道。
销毁图片数据处理的通道后,再调用acl.media.dvpp_destroy_channel_desc接口销毁通道描述信息。
示例代码
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考。
<br> 1<br> 2<br> 3<br> 4<br> 5<br> 6<br> 7<br> 8<br> 9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br>40<br>41<br>42<br>43<br>44<br>45<br>46<br>47<br>48<br>49<br>50<br>51<br>52<br>53<br>54<br>55<br>56<br>57<br>58<br>59<br>60<br>61<br>62<br>63<br>64<br>65<br>66<br>67<br>68<br>69<br>70<br>71<br>72<br> | python<br>import acl<br># ......<br># 1.pyACL初始化。<br>ret = acl.init()<br># 2.运行管理资源申请,包括Device、Context、Stream。<br>self.device_id = 0<br>ret = acl.rt.set_device(self.device_id)<br>context, ret = acl.rt.create_context(self.device_id)<br>stream, ret = acl.rt.create_stream()<br># 3.创建图片数据处理通道时的通道描述信息,self.dvpp_channel_desc是acldvppChannelDesc类型。<br>self.dvpp_channel_desc = acl.media.dvpp_create_channel_desc()<br># 4.创建图片数据处理的通道。<br>ret = acl.media.dvpp_create_channel(self.dvpp_channel_desc)<br># 5.申请内存。<br># 加载 YUV格式的图片数据。<br># 申请Device内存inputDevBuff。<br># 将通过acl.rt.memcpy接口将Host的图片数据传输到Device,数据传输完成后,需及时释放Host内存。<br>np_jpg = np.fromfile(self.path, dtype=np.byte)<br>self.in_buffer_size = np_jpg.itemsize * np_jpg.size<br>bytes_data = np_jpg.tobytes()<br>np_jpg_ptr = acl.util.bytes_to_ptr(bytes_data)<br>self.in_buffer_dev, ret = acl.media.dvpp_malloc(self.in_buffer_size)<br>ret = acl.rt.memcpy(self.in_buffer_dev, self.in_buffer_size, np_jpg_ptr,<br> self.in_buffer_size, 1)<br># 6 输出内存,按16对齐方式计算并申请Device内存self.out_buffer_dev,存放编码后的输出数据。<br>height_stride = ((h + 1) // 2) * 2<br>width_stride = ((w + 15) // 16) * 16<br># malloc for output<br>self.out_buffer_size = (width_stride * height_stride * 3) // 2<br>self.out_buffer_dev, ret = acl.media.dvpp_malloc(self.out_buffer_size)<br># 7. 创建解码输出图片的描述信息,设置各属性值。<br># 解码设置输出内存和size到图片描述,用于数据占位。<br>self.pic_desc = acl.media.dvpp_create_pic_desc()<br>ret = acl.media.dvpp_set_pic_desc_data(self.pic_desc, self.out_buffer_dev)<br>ret = acl.media.dvpp_set_pic_desc_size(self.pic_desc, self.out_buffer_size)<br>ret = acl.media.dvpp_set_pic_desc_format(<br> self.pic_desc, PIXEL_FORMAT_YUV_SEMIPLANAR_420)<br>ret = acl.media.dvpp_set_pic_desc_width(self.pic_desc, w)<br>ret = acl.media.dvpp_set_pic_desc_height(self.pic_desc, h)<br>ret = acl.media.dvpp_set_pic_desc_width_stride(self.pic_desc, width_stride)<br>ret = acl.media.dvpp_set_pic_desc_height_stride(self.pic_desc, height_stride)<br># 8. 执行异步解码,再调用acl.rt.synchronize_stream接口阻塞Host运行,直到指定Stream中的所有任务都完成。<br>ret = acl.media.dvpp_jpeg_decode_async(self.dvpp_channel_desc,<br> self.in_buffer_dev,<br> self.in_buffer_size,<br> self.pic_desc, self.stream)<br>ret = acl.rt.synchronize_stream(self.stream)<br># 9. 解码结束后,释放资源,包括解码输出图片的描述信息、解码输出内存、通道描述信息、通道等。<br>ret = acl.media.dvpp_destroy_pic_desc(self.pic_desc)<br>ret = acl.media.dvpp_free(self.in_buffer_dev)<br>ret = acl.media.dvpp_free(self.out_buffer_dev)<br>ret = acl.media.dvpp_destroy_channel(self.dvpp_channel_desc)<br>ret = acl.media.dvpp_destroy_channel_desc(self.dvpp_channel_desc)<br># 10. 释放运行管理资源。<br>ret = acl.rt.destroy_stream(self.stream)<br>ret = acl.rt.destroy_context(self.context)<br>ret = acl.rt.reset_device(self.device_id)<br>ret = acl.finalize()<br># 11. pyACL去初始化。<br># ......<br> |
|---|
父主题: 媒体数据处理V1
JPEGE图片编码
JPEGE(JPEG Encoder)负责完成图像编码功能,将YUV格式图片编码成.jpg图片。关于JPEGE功能的详细介绍及约束请参见功能及约束说明。
本节介绍JPEGE图片编码的接口调用流程,同时配合示例代码辅助理解该接口调用流程。
接口调用流程
开发应用时,如果涉及将YUV格式图片编码成JPEG压缩格式的图片文件,则应用程序中必须包含图片编码的代码逻辑,关于图片编码的接口调用流程,请先参见pyACL接口调用流程了解整体流程,再查看本节中的流程说明。
图1 JPEG图片编码

当前系统支持将YUV格式图片编码成.jpg图片,关键接口的说明如下:
-
调用acl.media.dvpp_create_channel_desc接口创建通道描述信息。
-
调用acl.media.dvpp_create_channel接口创建图片数据处理的通道。
-
调用acl.media.dvpp_create_jpege_config接口创建图片编码配置数据。
-
实现JPEG图片编码功能前,若需要申请Device上的内存存放输入或输出数据,需调用acl.media.dvpp_malloc申请内存。
在申请输出内存前,可调用acl.media.dvpp_jpeg_predict_enc_size接口根据输入图片描述信息、图片编码配置数据预估图片编码后所需的输出内存的大小。
-
调用acl.media.dvpp_jpeg_encode_async异步接口进行编码。
对于异步接口,还需调用acl.rt.synchronize_stream接口阻塞程序运行,直到指定Stream中的所有任务都完成。
-
调用acl.media.dvpp_destroy_jpege_config接口销毁图片编码配置数据。
-
在编码结束后,需及时调用acl.media.dvpp_free接口释放输入、输出内存。
-
调用acl.media.dvpp_destroy_channel接口销毁图片数据处理的通道。
销毁图片数据处理的通道后,再调用acl.media.dvpp_destroy_channel_desc接口销毁通道描述信息。
示例代码
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考。
<br> 1<br> 2<br> 3<br> 4<br> 5<br> 6<br> 7<br> 8<br> 9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br>40<br>41<br>42<br>43<br>44<br>45<br>46<br>47<br>48<br>49<br>50<br>51<br>52<br>53<br>54<br>55<br>56<br>57<br>58<br>59<br>60<br>61<br>62<br>63<br>64<br>65<br>66<br>67<br>68<br>69<br>70<br>71<br>72<br>73<br>74<br>75<br>76<br>77<br>78<br>79<br>80<br>81<br>82<br>83<br>84<br>85<br>86<br>87<br>88<br>89<br>90<br>91<br> | python<br>import acl<br># ......<br># 1.pyACL初始化。<br>ret = acl.init()<br># 2.运行管理资源申请,包括Device、Context、Stream。<br>self.device_id = 0<br>ret = acl.rt.set_device(self.device_id)<br>self.context, ret = acl.rt.create_context(self.device_id)<br>self.stream, ret = acl.rt.create_stream()<br># 3.创建图片数据处理通道时的通道描述信息,self.dvpp_channel_desc是acldvppChannelDesc类型。<br>self.dvpp_channel_desc = acl.media.dvpp_create_channel_desc()<br># 4.创建图片数据处理的通道。<br>ret = acl.media.dvpp_create_channel(self.dvpp_channel_desc)<br># 5.申请内存。<br># 5.1 输入内存。<br># 加载 YUV格式的图片数据,将通过acl.rt.memcpy接口将Host的图片数据传输到Device。<br>np_jpg = np.fromfile(self.path, dtype=np.byte)<br>self.in_buffer_size = np_jpg.itemsize * np_jpg.size<br>bytes_data = np_jpg.tobytes()<br>np_jpg_ptr = acl.util.bytes_to_ptr(bytes_data)<br>self.in_buffer_dev, ret = acl.media.dvpp_malloc(self.in_buffer_size)<br>ret = acl.rt.memcpy(self.in_buffer_dev, self.in_buffer_size, np_jpg_ptr,<br> self.in_buffer_size, 1)<br># 5.2 输出内存,按16对齐方式计算并申请Device内存self.out_buffer_dev,存放编码后的输出数据。<br>height_stride = ((h + 1) // 2) * 2<br>width_stride = ((w + 15) // 16) * 16<br># malloc for output<br>self.out_buffer_size = (width_stride * height_stride * 3) // 2<br>self.out_buffer_dev, ret = acl.media.dvpp_malloc(self.out_buffer_size<br># 6. 创建编码输入图片的描述信息,并设置各属性值。<br># jpeg 编码设置输入yuv图片数据及size到图片描述。<br>self.pic_desc = acl.media.dvpp_create_pic_desc()<br>ret = acl.media.dvpp_set_pic_desc_data(self.pic_desc, self.in_buffer_dev)<br>ret = acl.media.dvpp_set_pic_desc_size(self.pic_desc, self.in_buffer_size)<br>ret = acl.media.dvpp_set_pic_desc_format(self.pic_desc, PIXEL_FORMAT_YUV_SEMIPLANAR_420)<br>ret = acl.media.dvpp_set_pic_desc_width(self.pic_desc, w)<br>ret = acl.media.dvpp_set_pic_desc_height(self.pic_desc, h)<br>ret = acl.media.dvpp_set_pic_desc_width_stride(self.pic_desc, width_stride)<br>ret = acl.media.dvpp_set_pic_desc_height_stride(self.pic_desc, height_stride)<br># 7. 创建图片编码配置数据,设置编码质量, 预测输出的图片尺寸并分配内存。<br># 编码质量范围[0, 100],其中level 0编码质量与level 100相近,而在[1, 100]内数值越小输出图片质量越差。<br>self.jpege_config = acl.media.dvpp_create_jpege_config()<br>ret = acl.media.dvpp_set_jpege_config_level(self.jpege_config, 100)<br>self.out_buffer_size, ret = acl.media.dvpp_jpeg_predict_enc_size(<br> self.pic_desc, self.jpege_config)<br>self.out_buffer_dev, ret = acl.media.dvpp_malloc(self.out_buffer_size)<br># 8. 执行异步编码,再调用acl.rt.synchronize_stream接口阻塞Host运行,直到指定Stream中的所有任务都完成。<br>acl.rt.set_context(self.context)<br>np_out_size = np.array([self.out_buffer_size], dtype=np.int32)<br>bytes_data = np_out_size.tobytes()<br>np_out_size_ptr = acl.util.bytes_to_ptr(bytes_data)<br>ret = acl.media.dvpp_jpeg_encode_async(self.dvpp_channel_desc, self.pic_desc,<br> self.out_buffer_dev, np_out_size_ptr,<br> self.jpege_config, self.stream)<br>ret = acl.rt.synchronize_stream(self.stream)<br># 9.申请Host内存hostPtr。<br># 9.1 将编码后的输出图片回传到Host,再将Host内存中的数据写入文件,写完文件后,需及时调用acl.rt.free_host接口释放Host内存。<br># 9.2 创建numpy对象并转成host侧数据存储输出内容。<br>np_output = np.zeros(size, dtype=np.byte)<br>bytes_data = np_output.tobytes()<br>np_output_ptr = acl.util.bytes_to_ptr(bytes_data)<br>size = int(np_out_size[0])<br>ret = acl.rt.memcpy(np_output_ptr, size, self.out_buffer_dev, size, 2)<br># 10. 编码结束后,释放资源,包括编码输入/输出图片的描述信息、编码输入/输出内存、通道描述信息、通道等。<br>ret = acl.media.dvpp_destroy_jpege_config(self.jpege_config)<br>ret = acl.media.dvpp_destroy_pic_desc(self.pic_desc)<br>ret = acl.media.dvpp_free(self.in_buffer_dev)<br>ret = acl.media.dvpp_free(self.out_buffer_dev)<br>ret = acl.media.dvpp_destroy_channel(self.dvpp_channel_desc)<br>ret = acl.media.dvpp_destroy_channel_desc(self.dvpp_channel_desc)<br># 11. 释放运行管理资源。<br>ret = acl.rt.destroy_stream(self.stream)<br>ret = acl.rt.destroy_context(self.context)<br>ret = acl.rt.reset_device(self.device_id);<br>ret = acl.finalize()<br># 12.pyACL去初始化。<br># ....<br> |
|---|
父主题: 媒体数据处理V1
PNGD图片解码
PNGD(PNG decoder)负责PNG格式图片的解码。关于PNGD功能的详细介绍及约束请参见功能及约束说明。
本节介绍PNGD图片编码的接口调用流程,同时配合示例代码辅助理解该接口调用流程。
接口调用流程
开发应用时,如果涉及对PNG图片的解码,则应用程序中必须包含图片解码的代码逻辑,关于图片解码的接口调用流程,请先参见pyACL接口调用流程了解整体流程,再查看本节中的流程说明。
图1 PNG图片解码

当前系统支持PNG图片的解码,支持输出RGB、RGBA编码格式的图片,关键接口的说明如下:
-
调用acl.media.dvpp_create_channel_desc接口创建通道描述信息。
-
调用acl.media.dvpp_create_channel接口创建图片数据处理的通道。
-
实现PNG图片解码功能前,若需要申请Device上的内存存放输入或输出数据,需调用acl.media.dvpp_malloc申请内存。
在申请输出内存前,可调用acl.media.dvpp_png_predict_dec_size接口根据存放PNG图片数据的内存预估出PNG图片解码后所需的输出内存的大小。
-
调用acl.media.dvpp_png_decode_async异步接口进行解码。
对于异步接口,还需调用acl.rt.synchronize_stream接口阻塞程序运行,直到指定Stream中的所有任务都完成。
-
在解码结束后,需及时调用acl.media.dvpp_free接口释放输入、输出内存。
-
调用acl.media.dvpp_destroy_channel接口销毁图片数据处理的通道。
销毁图片数据处理的通道后,再调用acl.media.dvpp_destroy_channel_desc接口销毁通道描述信息。
示例代码
调用接口后,需增加异常处理的分支,同时通过“ERROR_LOG”记录报错日志、通过“INFO_LOG”记录各动作的提示日志,示例代码中不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考。
<br> 1<br> 2<br> 3<br> 4<br> 5<br> 6<br> 7<br> 8<br> 9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br>40<br>41<br>42<br>43<br>44<br>45<br>46<br>47<br>48<br>49<br>50<br>51<br>52<br>53<br>54<br>55<br>56<br>57<br>58<br>59<br>60<br>61<br>62<br>63<br>64<br> | python<br>import acl<br># ......<br># 1.pyACL初始化。<br>ACL_CONFIG_PATH = "../src/acl.json"<br>ret = acl.init(ACL_CONFIG_PATH)<br># 2.运行管理资源申请,包括Device、Context、Stream。<br>device_id = 0<br>ret = acl.rt.set_device(device_id)<br>context, ret = acl.rt.create_context(device_id)<br>stream, ret = acl.rt.create_stream()<br># 3.创建图片数据处理通道时的通道描述信息,dvpp_channel_desc是acldvppChannelDesc类型对象。<br>dvpp_channel_desc = acl.media.dvpp_create_channel_desc()<br># 4.创建图片数据处理的通道。<br>ret = acl.media.dvpp_create_channel(dvpp_channel_desc)<br># 5.申请输入内存。<br>pic_name = "../data/test_png_dec.png"<br>np_png = np.fromfile(pic_name, dtype=np.byte)<br>in_buffer_size = np_png.itemsize * np_png.size<br>bytes_data = np_png.tobytes()<br>np_png_ptr = acl.util.bytes_to_ptr(bytes_data)<br>in_dev_buffer, ret = acl.media.dvpp_malloc(in_buffer_size)<br>ACL_MEMCPY_HOST_TO_DEVICE = 1<br>ret = acl.rt.memcpy(in_dev_buffer, in_buffer_size, np_png_ptr, in_buffer_size,<br> ACL_MEMCPY_HOST_TO_DEVICE)<br># 6.申请解码输出内存。<br>PIXEL_FORMAT_RGB_888 = 12<br>out_buffer_size, ret = acl.media.dvpp_png_predict_dec_size(np_png_ptr, in_buffer_size,<br> PIXEL_FORMAT_RGB_888)<br>out_dev_buffer, ret = acl.media.dvpp_malloc(out_buffer_size)<br># 7.创建解码输出图片的描述信息,设置各属性值。<br>output_desc = acl.media.dvpp_create_pic_desc()<br>width, height, components, ret = acl.media.dvpp_png_get_image_info(np_png_ptr, in_buffer_size)<br>ret = acl.media.dvpp_set_pic_desc_data(output_desc, out_dev_buffer)<br>ret = acl.media.dvpp_set_pic_desc_size(output_desc, out_buffer_size)<br>ret = acl.media.dvpp_set_pic_desc_format(output_desc, PIXEL_FORMAT_RGB_888)<br># 8.执行异步解码,再调用acl.rt.synchronize_stream接口阻塞程序运行,直到指定Stream中的所有任务都完成。<br>ret = acl.media.dvpp_png_decode_async(dvpp_channel_desc, in_dev_buffer, in_buffer_size,<br> output_desc, stream)<br>ret = acl.rt.synchronize_stream(stream)<br># 9.解码结束后,释放资源,包括解码输出图片的描述信息、解码输出内存、通道描述信息、通道等。<br>ret = acl.media.dvpp_destroy_pic_desc(output_desc)<br>ret = acl.media.dvpp_free(in_dev_buffer)<br>ret = acl.media.dvpp_free(out_dev_buffer)<br>ret = acl.media.dvpp_destroy_channel(dvpp_channel_desc)<br>ret = acl.media.dvpp_destroy_channel_desc(dvpp_channel_desc)<br># 10.释放运行管理资源。<br>ret = acl.rt.destroy_stream(stream)<br>ret = acl.rt.destroy_context(context)<br>ret = acl.rt.reset_device(device_id)<br>ret = acl.finalize()<br># 11.pyACL去初始化。<br># ....<br> |
|---|
父主题: 媒体数据处理V1
VDEC视频解码
VDEC(Video Decoder)负责将H264/H265格式的视频码流解码为YUV/RGB格式的图片。关于VDEC功能的详细介绍及约束请参见功能及约束说明。
本节介绍VDEC视频编码的接口调用流程,同时配合示例代码辅助理解该接口调用流程。
接口调用流程
开发应用时,如果涉及视频解码,则应用程序中必须包含视频解码的代码逻辑,关于视频解码的接口调用流程,请先参见pyACL接口调用流程了解整体流程,再查看本节中的流程说明。
图1 视频解码流程

实现视频的解码,关键接口的说明如下:
- 调用acl.media.vdec_create_channel接口创建视频解码处理的通道。
- 创建视频解码处理通道前,需先执行以下操作:
-
调用acl.media.vdec_create_channel_desc接口创建通道描述信息。
-
调用acl.media.vdec_set_channel_desc系列接口设置通道描述信息的属性,包括解码通道号、线程、回调函数、视频编码协议等,其中:
-
回调函数需由用户提前创建,用于在视频解码后,获取解码数据,并及时释放相关资源,回调函数的原型前参见函数:vdec_set_channel_desc_callback。
在回调函数内,用户需调用acl.media.dvpp_get_pic_desc_ret_code接口获取“ret_code”返回码判断是否解码成功,“ret_code”为“0”表示解码成功,为“1”表示解码失败。如果解码失败,需要根据日志中的返回码判断具体的问题,返回码请参见返回码说明。
解码结束后,建议用户在回调函数内及时释放VDEC的输入码流内存、输出图片内存以及相应的视频码流描述信息、图片描述信息。
-
线程需由用户提前创建,并自定义线程函数,在线程函数内调用acl.rt.process_report接口,等待指定时间后,触发1.b.i中的回调函数。
如果不调用acl.media.vdec_set_channel_desc_out_pic_format接口设置输出格式,则默认使用“YUV420SP NV12”。
-
-
- acl.media.vdec_create_channel接口内部封装了如下接口,无需用户单独调用:
- acl.rt.create_stream接口:显式创建Stream,VDEC内部使用。
- acl.rt.subscribe_report接口:指定处理Stream上回调函数的线程,回调函数和线程是由用户调用acl.media.vdec_set_channel_desc系列接口时指定的。
- 创建视频解码处理通道前,需先执行以下操作:
- 调用acl.media.vdec_send_frame接口将视频码流解码成YUV420SP格式的图片。
-
视频解码前,需先执行以下操作:
- 调用acl.media.dvpp_create_stream_desc接口创建输入视频码流描述信息,并调用acl.media.dvpp_set_stream_desc系列接口设置输入视频的内存地址、内存大小、码流格式等属性。
- 调用acl.media.dvpp_create_pic_desc接口创建输出图片描述信息,并调用acl.media.dvpp_set_pic_desc系列接口设置输出图片的内存地址、内存大小、图片格式等属性。
-
视频解码时:
- acl.media.vdec_send_frame接口内部封装了acl.rt.launch_callback接口,用于在Stream的任务队列中增加一个需要执行的回调函数。用户无需单独调用acl.rt.launch_callback接口。
-
视频解码后,视频解码的结果数据通过回调函数获取:
获取解码数据前,先获取“ret_code”的值,判断解码是否成功,0表示解码成功,1表示解码失败。如果解码失败,需要根据日志中的返回码判断具体的问题,返回码请参见返回码说明。
如果用户需要获取解码的帧序号,则可以在acl.media.vdec_send_frame接口的“user_data”参数处定义,然后解码的帧序号可以通过“user_data”参数传递给VDEC的回调函数,用于确定回调函数中处理的是第几帧数据。
如果不想获取某一帧的解码结果, 可以调用acl.media.vdec_send_skipped_frame接口, 将待解码的码流(输入内存)传到解码器进行解码,此时,解码结果最终不会输出,解码完成的回调函数中返回的“dvpp_pic_desc”为0。
-
- 调用acl.media.vdec_destroy_channel接口销毁视频处理的通道。
- 系统会等待已发送帧解码完成且用户的回调函数处理完成后再销毁通道。
- acl.media.vdec_destroy_channel接口内部封装了如下接口,无需用户单独调用。
- acl.rt.unsubscribe_report接口:取消线程注册(Stream上的回调函数不再由指定线程处理)。
- acl.rt.destroy_stream接口:销毁Stream。
- 销毁通道后,需调用acl.media.vdec_destroy_channel_desc接口销毁通道描述信息。
- 销毁通道描述信息后,用户才可以销毁1.b.ii中创建的线程。
示例代码
您可以从样例介绍中获取完整样例代码。
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考。
<br> 1<br> 2<br> 3<br> 4<br> 5<br> 6<br> 7<br> 8<br> 9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br>40<br>41<br>42<br>43<br>44<br>45<br>46<br>47<br>48<br>49<br>50<br>51<br>52<br>53<br>54<br>55<br>56<br>57<br>58<br>59<br>60<br>61<br>62<br>63<br>64<br>65<br>66<br>67<br>68<br>69<br>70<br>71<br>72<br>73<br>74<br>75<br>76<br>77<br>78<br>79<br>80<br>81<br>82<br>83<br>84<br>85<br>86<br>87<br>88<br>89<br>90<br>91<br>92<br>93<br>94<br>95<br>96<br>97<br>98<br> | python<br>import acl<br># ......<br># 1.pyACL初始化。<br>ret = acl.init()<br># 2.运行管理资源申请,包括Device、Context、Stream。<br>ret = acl.rt.set_device(self.device_id)<br>self.context, ret = acl.rt.create_context(self.device_id)<br>self.stream, ret = acl.rt.create_stream()<br># 3.创建回调函数。<br>def _callback(self, input_stream_desc, output_pic_desc, user_data):<br> # 输入码流描述。<br> if input_stream_desc:<br> ret = acl.media.dvpp_destroy_stream_desc(input_stream_desc)<br> if ret != 0:<br> print("acl.media.dvpp_destroy_stream_desc failed")<br> # 输出图片描述。<br> if output_pic_desc:<br> vdec_out_buffer = acl.media.dvpp_get_pic_desc_data(output_pic_desc)<br> ret_code = acl.media.dvpp_get_pic_desc_ret_code(output_pic_desc)<br> data_size = acl.media.dvpp_get_pic_desc_size(output_pic_desc)<br> self.images_buffer.append(dict({"buffer": vdec_out_buffer,<br> "size": data_size}))<br> ret = acl.media.dvpp_destroy_pic_desc(output_pic_desc)<br> if ret != 0:<br> print("acl.media.dvpp_destroy_pic_desc failed")<br> self.output_count += 1<br> print("[Vdec] [_callback] _callback exit success")<br> # 在此样例中,释放vdec_out_buffer在vdec流程之后处理。<br># 4.创建回调处理线程,并提交注册由此线程执行回调函数。<br>timeout = 100<br>cb_thread_id, ret = acl.util.start_thread(self._thread_func, [timeout])<br>acl.rt.subscribe_report(cb_thread_id, self.stream)<br># 5.创建视频码流处理通道时的通道描述信息,设置视频处理通道描述信息的属性,其中线程、callback回调函数需要用户提前创建。<br>def init_resource(self, cb_thread_id):<br> print("[Vdec] class Vdec init resource stage:")<br> self.vdec_channel_desc = acl.media.vdec_create_channel_desc()<br> acl.media.vdec_set_channel_desc_channel_id(self.vdec_channel_desc, self._channel_id)<br> acl.media.vdec_set_channel_desc_thread_id(self.vdec_channel_desc, cb_thread_id) <br> acl.media.vdec_set_channel_desc_callback(self.vdec_channel_desc, self._callback)<br> acl.media.vdec_set_channel_desc_entype(self.vdec_channel_desc, self._en_type)<br> acl.media.vdec_set_channel_desc_out_pic_format(self.vdec_channel_desc, self._format)<br> acl.media.vdec_create_channel(self.vdec_channel_desc)<br> print("[Vdec] class Vdec init resource stage success")<br># 6.创建视频码流处理的通道。<br>ret = acl.media.vdec_create_channel(self.vdec_channel_desc)<br># ......<br># 7.申请Device内存dataDev,存放视频解码的输入视频数据。<br># 将通过acl.rt.memcpy接口将Host的图片数据传输到Device,数据传输完成后,需及时调用acl.rt.free_host接口释放Host内存。<br># 输出图片尺寸对齐方式设置。<br>output_pic_size = (self.input_width * self.input_height * 3) // 2<br>img = np.fromfile(img_path, dtype=self.dtype)<br>input_stream_size = img.size<br>bytes_data = img.tobytes()<br>img_ptr = acl.util.bytes_to_ptr(bytes_data)<br>self.input_stream_mem, ret = acl.media.dvpp_malloc(input_stream_size)<br>ret = acl.rt.memcpy(self.input_stream_mem,<br> input_stream_size,<br> img_ptr,<br> input_stream_size,<br> ACL_MEMCPY_HOST_TO_DEVICE)<br># 8.循环10次执行视频解码,输出10张YUV420SP NV12格式的图片。<br>def forward(self, output_pic_size, input_stream_size):<br> self.frame_config = acl.media.vdec_create_frame_config()<br> for i in range(self.rest_len):<br> print("[Vdec] forward index:{}".format(i))<br> # 8.1 创建输入视频码流描述信息,设置码流信息的属性。<br> self._set_input(input_stream_size)<br> # 8.2 创建输出图片描述信息,设置图片描述信息的属性。<br> self._set_pic_output(output_pic_size)<br> # 8.3 执行视频码流解码,解码每帧数据后,系统自动调用callback回调函数将解码后的数据写入文件,再及时释放相关资源。<br> ret = acl.media.vdec_send_frame(self.vdec_channel_desc,<br> self.dvpp_stream_desc,<br> self.dvpp_pic_desc,<br> self.frame_config,<br> None)<br> check_ret("acl.media.vdec_send_frame", ret)<br> print('[Vdec] vdec_send_frame stage success')<br># 9.释放图片处理通道、图片描述信息。<br>ret = acl.media.vdec_destroy_channel(self.vdec_channel_desc)<br>acl.media.vdec_destroy_channel_desc(self.vdec_channel_desc)<br># 10. 释放运行管理资源。<br>ret = acl.rt.destroy_dtream(self.stream)<br>ret = acl.rt.destroy_context(self.context)<br>ret = acl.rt.reset_device(self.device_id)<br>ret = acl.finalize()<br># 11.pyACL去初始化。<br># ....<br> |
|---|
返回码说明
| 返回码 | 含义 | 可能原因及解决方法 |
|---|---|---|
| AICPU_DVPP_KERNEL_STATE_SUCCESS = 0 | 解码成功。 | - |
| AICPU_DVPP_KERNEL_STATE_FAILED = 1 | 其它错误。 | - |
| AICPU_DVPP_KERNEL_STATE_DVPP_ERROR = 2 | AscendCL内部调用其它模块的接口失败。 | - |
| AICPU_DVPP_KERNEL_STATE_PARAM_INVALID = 3 | 参数校验失败。 | 请检查接口的参数是否符合接口要求。 |
| AICPU_DVPP_KERNEL_STATE_OUTPUT_SIZE_INVALID = 4 | 输出内存大小校验失败。 | 请检查输出内存大小是否符合接口要求。 |
| AICPU_DVPP_KERNEL_STATE_INTERNAL_ERROR = 5 | 系统内部错误。 | - |
| AICPU_DVPP_KERNEL_STATE_QUEUE_FULL = 6 | 系统内部队列满。 | - |
| AICPU_DVPP_KERNEL_STATE_QUEUE_EMPTY = 7 | 系统内部队列空。 | - |
| AICPU_DVPP_KERNEL_STATE_QUEUE_NOT_EXIST = 8 | 系统内部队列不存在。 | - |
| AICPU_DVPP_KERNEL_STATE_GET_CONTEX_FAILED = 9 | 获取系统内部上下文失败。 | - |
| AICPU_DVPP_KERNEL_STATE_SUBMIT_EVENT_FAILED = 10 | 提交系统内部事件失败。 | - |
| AICPU_DVPP_KERNEL_STATE_MEMORY_FAILED = 11 | 系统内部申请内存失败。 | 请检查系统是否有可用内存。 |
| AICPU_DVPP_KERNEL_STATE_SEND_NOTIFY_FAILED = 12 | 发送系统内部通知失败。 | - |
| AICPU_DVPP_KERNEL_STATE_VPC_OPERATE_FAILED = 13 | 系统内部接口处理失败。 | - |
| AICPU_DVPP_KERNEL_STATE_CHANNEL_ABNORMAL = 14 | 当前通道异常。 | - |
| ERR_INVALID_STATE = 0x10001 | VDEC解码器状态异常错误。 | - |
| ERR_HARDWARE = 0x10002 | 硬件错误,包含解码器启动、执行、停止等异常。 | - |
| ERR_SCD_CUT_FAIL = 0x10003 | 将视频码流分解成多帧图片异常。 | 请检查输入的视频流数据是否正确。 |
| ERR_VDM_DECODE_FAIL = 0x10004 | 解码某一帧异常。 | 请检查输入的视频流数据是否正确。 |
| ERR_ALLOC_MEM_FAIL = 0x10005 | 内部申请内存失败。 | 请检查系统是否有可用内存,若忽略错误,则可能导致用户持续送入码流却无任何解码结果输出。 |
| ERR_ALLOC_DYNAMIC_MEM_FAIL = 0x10006 | 包括输入视频分辨率超范围、内部动态申请内存失败等异常。 | 请检查输入视频流的分辨率、系统是否有可用内存,若忽略错误,则可能导致用户持续送入码流却无任何解码结果输出。 |
| ERR_ALLOC_IN_OR_OUT_PORT_MEM_FAIL = 0x10007 | 系统内部申请VDEC的输入、输出buffer异常。 | 请检查系统是否有可用内存,若忽略错误,则可能导致用户持续送入码流却无任何解码结果输出。 |
| ERR_BITSTREAM = 0x10008 | 码流错误(如语法解析失败、重发eos或首帧即发送eos)。 | 请检查输入的视频流数据是否正确。 |
| ERR_VIDEO_FORMAT = 0x10009 | 输入视频格式错误。 | 请检查输入视频的格式是否为h264或h265。 |
| ERR_IMAGE_FORMAT = 0x1000a | 输出格式配置错误。 | 请检查输出图像的格式是否为nv12或nv21。 |
| ERR_CALLBACK = 0x1000b | 回调函数为空。 | 请检查配置的回调函数是否为空。 |
| ERR_INPUT_BUFFER = 0x1000c | 输入内存为空。 | 请检输入内存是否为空。 |
| ERR_INBUF_SIZE = 0x1000d | 输入内存大小<=0。 | 请检查输入内存大小是否小于等于0。 |
| ERR_THREAD_CREATE_FBD_FAIL = 0x1000e | 系统内部将解码结果通过回调函数返回给用户的线程异常。 | 请检查系统中资源(例如:线程、内存等)是否可用。 |
| ERR_CREATE_INSTANCE_FAIL = 0x1000f | 创建解码实例失败。 | - |
| ERR_INIT_DECODER_FAIL = 0x10010 | 初始化解码器失败,例如解码实例个数超出范围(最大16)。 | - |
| ERR_GET_CHANNEL_HANDLE_FAIL = 0x10011 | 系统内部获取某路视频流的解码句柄失败。 | - |
| ERR_COMPONENT_SET_FAIL = 0x10012 | 系统内部设置解码实例异常。 | 请检查解码的入参值是否正确,例如输入视频格式video_format、输出帧格式image_format等。 |
| ERR_COMPARE_NAME_FAIL = 0x10013 | 系统内部设置解码实例名称异常。 | 请检查解码的入参值是否正确,例如输入视频格式video_format、输出帧格式image_format等。 |
| ERR_OTHER = 0x10014 | 其它错误。 | - |
| ERR_DECODE_NOPIC = 0x20000 | 隔行码流场景下使用,隔行码流每帧发送两场,解码时其中一块无图像输出,属于正常现象,会返回该错误码;隔行码流的解码输出数据都在奇数场对应的输出buffer中。 | - |
| 0x20001 | 参考帧个数设置错误。 | 请检查码流实际参考帧个数与用户设置的参考帧个数是否一致。 |
| 0x20002 | VDEC解码帧存大小设置错误。 | 请检查输入码流实际宽、高与用户设置的宽、高是否一致。 |
| 0xA0058001 | 无效的Device ID。 | 请检查Device ID。 |
| 0xA0058002 | 无效的channel ID。 | 请检查传入接口的通道号是否正确,或者检查通道总数是否达到上限。 |
| 0xA0058003 | 参数不合法,例如不合法的枚举值。 | 请根据日志检查出错的参数。 |
| 0xA0058004 | 资源已存在。 | 请检查是否重复创建通道。 |
| 0xA0058005 | 通道资源不存在。 | 请检查是否使用了不存在的通道号或通道句柄。 |
| 0xA0058006 | 函数参数中有空指针。 | 请根据日志检查接口的入参。 |
| 0xA0058007 | 使能系统、Device或通道前未配置对应的参数。 | 请根据日志检查接口的入参。 |
| 0xA0058008 | 不支持的参数或者功能。 | 请根据日志检查接口的入参。 |
| 0xA0058009 | 该操作不允许,如试图修改静态配置参数。 | - |
| 0xA005800C | 分配内存失败,如系统内存不足。 | 请检查系统是否有可用内存,若忽略错误,则可能导致用户持续送入码流却无任何解码结果输出。 |
| 0xA005800D | 分配缓存失败,如申请的数据缓冲区太大。 | - |
| 0xA005800E | 缓冲区中无数据。 | 系统未完成解码,缓冲区中无解码结果数据,需等待缓冲区中有数据后,再尝试获取数据。 |
| 0xA005800F | 缓冲区中数据满。 | 用户发送输入码流数据的速度太快,导致输入缓冲区数据满,请尝试降低发送输入码流数据的速度,或者在创建通道时将缓冲区大小设置为较大值。 |
| 0xA0058010 | 系统没有初始化或者相关依赖的模块没有加载。 | 请检查是否调用系统初始化接口。 |
| 0xA0058011 | 地址错误。 | - |
| 0xA0058012 | 系统忙。 | 请检查VDEC解码总路数是否达到上限。 |
| 0xA0058013 | 缓存小于实际需要的大小。 | - |
| 0xA0058014 | 硬件或软件处理超时。 | - |
| 0xA0058015 | 内部系统错误。 | - |
| 0xA005803F | 最大的返回码,该模块的错误码必须小于该值。 | - |
父主题: 媒体数据处理V1
在线提单