160 lines
5.8 KiB
C++
160 lines
5.8 KiB
C++
/**
|
|
* 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 <vector>
|
|
#include <string>
|
|
#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<const void *> &pic_buffer_list, const std::vector<size_t> &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
|