/** * Copyright 2020 Huawei Technologies Co., Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef INC_DVPP_PROCESS_ACL #define INC_DVPP_PROCESS_ACL #include #include #include "acl/acl.h" #include "acl/acl_mdl.h" #include "acl/acl_rt.h" #include "acl/ops/acl_dvpp.h" #include "include/inference.h" namespace mindspore::inference { struct DvppDecodePara { acldvppPixelFormat pixel_format = PIXEL_FORMAT_YUV_SEMIPLANAR_420; }; struct DvppResizePara { uint32_t output_width = 0; uint32_t output_height = 0; }; enum DvppCropType { // crop left,top,right,bottom is given in config kDvppCropTypeOffset = 0, // crop left,top,right,bottom is calculated by image width/height and output crop width/height kDvppCropTypeCentre = 1, }; struct DvppRoiArea { uint32_t left = 0; uint32_t top = 0; uint32_t right = 0; uint32_t bottom = 0; }; struct DvppCropInfo { DvppCropType crop_type = kDvppCropTypeOffset; DvppRoiArea crop_area; // when kDvppCropTypeOffset uint32_t crop_width = 0; // when kDvppCropTypeCentre uint32_t crop_height = 0; // when kDvppCropTypeCentre }; struct DvppCropPara { DvppCropInfo crop_info; uint32_t output_width = 0; uint32_t output_height = 0; }; struct DvppCropAndPastePara { DvppCropInfo crop_info; DvppRoiArea paste_area; uint32_t output_width = 0; uint32_t output_height = 0; }; class DvppProcess { public: DvppProcess(); ~DvppProcess(); Status InitResource(aclrtStream stream); void Finalize(); Status InitJpegDecodePara(const DvppDecodePara &decode_para); // jpeg decode + (resize | crop) Status InitResizePara(const DvppResizePara &resize_para); // jpeg decode + resize Status InitCropPara(const DvppCropPara &crop_para); // jpeg decode + crop Status InitCropAndPastePara(const DvppCropAndPastePara &crop_and_paste_para); // jpeg decode + crop&paste Status InitWithJsonConfig(const std::string &json_config); // output device buffer will be destroy by DvppProcess itself. Status Process(const void *pic_buffer, size_t pic_buffer_size, void *&output_device_buffer, size_t &output_size); Status Process(const std::vector &pic_buffer_list, const std::vector &pic_buffer_size_list, void *&output_device_buffer, size_t &output_size); private: uint32_t pic_width_ = 0; uint32_t pic_height_ = 0; DvppDecodePara decode_para_; DvppResizePara resize_para_; DvppCropPara crop_para_; DvppCropAndPastePara crop_and_paste_para_; // only one of the resize or crop flag can be true bool to_resize_flag_ = false; bool to_crop_flag_ = false; bool to_crop_and_paste_flag_ = false; void *input_pic_dev_buffer_ = nullptr; uint32_t input_pic_buffer_size_ = 0; uint32_t decode_output_buffer_size_ = 0; void *decode_output_buffer_dev_ = nullptr; acldvppPicDesc *decode_output_desc_ = nullptr; acldvppResizeConfig *resize_config_ = nullptr; acldvppRoiConfig *crop_area_ = nullptr; acldvppRoiConfig *paste_area_ = nullptr; acldvppPicDesc *vpc_output_desc_ = nullptr; void *vpc_output_buffer_dev_ = nullptr; // vpc_output_buffer_size_ length uint32_t vpc_output_buffer_size_ = 0; void *batch_vpc_output_buffer_dev_ = nullptr; // batch_size_ * vpc_output_buffer_size_ length uint32_t batch_size_ = 0; aclrtStream stream_ = nullptr; acldvppChannelDesc *dvpp_channel_desc_ = nullptr; uint32_t AlignmentHelper(uint32_t org_size, uint32_t alignment) const; uint32_t GetImageBufferSize(uint32_t stride_width, uint32_t stride_height, acldvppPixelFormat pixel_format) const; Status GetPicDescStride(uint32_t width, uint32_t height, uint32_t &stride_width, uint32_t &stride_height); Status GetPicDescStrideDecode(uint32_t width, uint32_t height, uint32_t &stride_width, uint32_t &stride_height); Status InputInputBuffer(const void *pic_buffer, size_t pic_buffer_size); Status InitDecodeOutputDesc(uint32_t image_width, uint32_t image_height); // decode_output_desc_, decode_output_buffer_dev_ Status CheckRoiAreaWidthHeight(uint32_t width, uint32_t height); Status CheckAndAdjustRoiArea(DvppRoiArea &area); Status UpdateCropArea(uint32_t image_width, uint32_t image_height); Status CheckResizeImageInfo(uint32_t image_width, uint32_t image_height) const; void DestroyDecodeDesc(); Status InitVpcOutputDesc(uint32_t output_width, uint32_t output_height, acldvppPixelFormat pixel_format); // vpc_output_desc_, vpc_output_buffer_dev_batch_ Status InitRoiAreaConfig(acldvppRoiConfig *&roi_area, const DvppRoiArea &init_para); Status InitCommonCropPara(DvppCropInfo &crop_info, uint32_t out_width, uint32_t out_height); Status InitResizeOutputDesc(); // vpc_output_desc_, vpc_output_buffer_dev_, resize_config Status InitCropOutputDesc(); // vpc_output_desc_, vpc_output_buffer_dev_, crop_area_ Status InitCropAndPasteOutputDesc(); // vpc_output_desc_, vpc_output_buffer_dev_, crop_area_, paste_area_ void DestroyVpcOutputDesc(); Status ProcessDecode(); Status ProcessResize(); Status ProcessCrop(); Status ProcessCropAndPaste(); void DestroyResource(); Status GetJpegWidthHeight(const void *pic_buffer, size_t pic_buffer_size, uint32_t &image_width, uint32_t &image_height); }; } // namespace mindspore::inference #endif // INC_DVPP_PROCESS_ACL