合理选择VDEC视频解码输出格式和分辨率,性能更优
背景说明
如果用户需要借助DVPP进行视频解码,想要得到RGB格式图片,在Atlas 200/500 A2推理产品上,当前视频解码接口aclvdecSendFrame支持输出YUV420SP格式或RGB888格式,且支持在解码时对图片进行缩放,所以从提升性能的角度,可以优化代码逻辑,直接调用视频解码接口aclvdecSendFrame输出RGB888格式。
图1 VDEC解码输出的组合场景

基本原理
视频解码接口aclvdecSendFrame支持输出YUV420SP格式或RGB888格式,可设置接口参数输出不同的格式,省去调用acldvppVpcConvertColorAsync进行格式转换的步骤,减少接口调用。
若视频码流分辨率与模型输入图片的分辨率不一致,需要对解码后的图片进行缩放处理,也可以在视频解码接口aclvdecSendFrame中设置输出图片的分辨率,在解码的同时完成图片的缩放,省去单独调用缩放接口的步骤,减少接口调用。
总结下来,可以在视频解码接口aclvdecSendFrame中完成解码+缩放+色域转换三个功能,减少调用接口的数量,提升性能。
使用示例
如果视频解码需要输出RGB888格式,并且同时实现缩放功能,您需要设置aclvdecSendFrame接口的output参数(表示输出图片描述信息)中的图片格式、宽、高、宽Stride、高Stride,例如:
//创建输出图片描述信息 acldvppPicDesc picOutputDesc = acldvppCreatePicDesc(); //定义输出图片格式、宽、高、宽Stride、高Stride以及存放输出图片数据的内存 uint32_t width = 224; uint32_t height = 224; uint32_t widthStride = 224 * 3; uint32_t heightStride = 224; uint32_t size = widthStride * heightStride; void *picOutBufferDev = nullptr; acldvppMalloc(&picOutBufferDev, size); //设置输出图片格式、宽、高、宽Stride、高Stride以及存放输出图片数据的内存 acldvppSetPicDescData(picOutputDesc, picOutBufferDev); acldvppSetPicDescSize(picOutputDesc, size); acldvppSetPicDescFormat(picOutputDesc, PIXEL_FORMAT_RGB_888); acldvppSetPicDescWidth(picOutputDesc, width); acldvppSetPicDescHeight(picOutputDesc, height); acldvppSetPicDescWidthStride(picOutputDesc, widthStride); acldvppSetPicDescHeightStride(picOutputDesc, heightStride); //调用解码接口 aclvdecSendFrame(channelDesc, picInputDesc, picOutputDesc, nullptr, nullptr);
父主题: 使用媒体数据处理V1版本接口