0b4cd5d5
Hu Chunming
完成轨迹定时抓拍
|
1
2
3
4
|
#include <cstdio>
#include <cstdlib>
#include <memory>
#include "JpegUtil.h"
|
ca992942
Hu Chunming
优化图片保存
|
5
|
#include "../common/logger.hpp"
|
0b4cd5d5
Hu Chunming
完成轨迹定时抓拍
|
6
7
8
|
using namespace std;
|
0b4cd5d5
Hu Chunming
完成轨迹定时抓拍
|
9
|
|
e109b001
Hu Chunming
修正多显卡问题
|
10
11
|
int JpegUtil::jpeg_init(int32_t devId){
deviceId_ = devId;
|
0b4cd5d5
Hu Chunming
完成轨迹定时抓拍
|
12
|
|
e109b001
Hu Chunming
修正多显卡问题
|
13
14
15
16
17
|
aclError ret;
/* 2.Run the management resource application, including Device, Context, Stream */
aclrtSetDevice(deviceId_);
aclrtCreateContext(&context_, deviceId_);
aclrtCreateStream(&stream_);
|
0b4cd5d5
Hu Chunming
完成轨迹定时抓拍
|
18
|
|
e109b001
Hu Chunming
修正多显卡问题
|
19
20
21
|
// channel 准备
dvppChannelDesc_ = acldvppCreateChannelDesc();
ret = acldvppCreateChannel(dvppChannelDesc_);
|
ca992942
Hu Chunming
优化图片保存
|
22
23
24
25
|
if(ret != ACL_ERROR_NONE){
LOG_ERROR("acldvppCreateChannel failed!");
exit(-2);
}
|
9b4d4adf
Hu Chunming
添加定时抓拍;
|
26
27
28
29
30
|
// 创建图片编码配置数据,设置编码质量
// 编码质量范围[0, 100],其中level 0编码质量与level 100差不多,而在[1, 100]内数值越小输出图片质量越差。
jpegeConfig_ = acldvppCreateJpegeConfig();
acldvppSetJpegeConfigLevel(jpegeConfig_, 100);
|
ca992942
Hu Chunming
优化图片保存
|
31
32
|
return 0;
|
e109b001
Hu Chunming
修正多显卡问题
|
33
|
}
|
0b4cd5d5
Hu Chunming
完成轨迹定时抓拍
|
34
|
|
e109b001
Hu Chunming
修正多显卡问题
|
35
36
37
38
|
void JpegUtil::jpeg_release(){
aclError ret;
ret = aclrtSetDevice(deviceId_);
aclrtSetCurrentContext(context_);
|
0b4cd5d5
Hu Chunming
完成轨迹定时抓拍
|
39
|
|
e109b001
Hu Chunming
修正多显卡问题
|
40
41
42
|
ret = acldvppDestroyChannel(dvppChannelDesc_);
ret = acldvppDestroyChannelDesc(dvppChannelDesc_);
dvppChannelDesc_ = nullptr;
|
0b4cd5d5
Hu Chunming
完成轨迹定时抓拍
|
43
|
|
e109b001
Hu Chunming
修正多显卡问题
|
44
45
|
if (stream_ != nullptr) {
ret = aclrtDestroyStream(stream_);
|
0b4cd5d5
Hu Chunming
完成轨迹定时抓拍
|
46
|
if (ret != ACL_SUCCESS) {
|
e109b001
Hu Chunming
修正多显卡问题
|
47
|
printf("destroy stream failed");
|
0b4cd5d5
Hu Chunming
完成轨迹定时抓拍
|
48
|
}
|
e109b001
Hu Chunming
修正多显卡问题
|
49
|
stream_ = nullptr;
|
0b4cd5d5
Hu Chunming
完成轨迹定时抓拍
|
50
|
}
|
e109b001
Hu Chunming
修正多显卡问题
|
51
|
printf("end to destroy stream");
|
0b4cd5d5
Hu Chunming
完成轨迹定时抓拍
|
52
|
|
9b4d4adf
Hu Chunming
添加定时抓拍;
|
53
54
|
acldvppDestroyJpegeConfig(jpegeConfig_);
|
e109b001
Hu Chunming
修正多显卡问题
|
55
56
57
|
if (context_ != nullptr) {
ret = aclrtDestroyContext(context_);
if (ret != ACL_SUCCESS) {
|
ca992942
Hu Chunming
优化图片保存
|
58
|
LOG_ERROR("destroy context failed");
|
0b4cd5d5
Hu Chunming
完成轨迹定时抓拍
|
59
|
}
|
e109b001
Hu Chunming
修正多显卡问题
|
60
|
context_ = nullptr;
|
0b4cd5d5
Hu Chunming
完成轨迹定时抓拍
|
61
|
}
|
0b4cd5d5
Hu Chunming
完成轨迹定时抓拍
|
62
|
|
e109b001
Hu Chunming
修正多显卡问题
|
63
64
|
ret = aclrtResetDevice(deviceId_);
if (ret != ACL_SUCCESS) {
|
ca992942
Hu Chunming
优化图片保存
|
65
|
LOG_ERROR("reset device failed");
|
e109b001
Hu Chunming
修正多显卡问题
|
66
|
}
|
e109b001
Hu Chunming
修正多显卡问题
|
67
68
69
70
71
72
73
|
}
int32_t JpegUtil::jpege_save(char* pcData , uint32_t dataLen, string out_file_name)
{
FILE* fd = nullptr;
fd = fopen(out_file_name.c_str(), "wb");
if (fd == nullptr) {
|
ca992942
Hu Chunming
优化图片保存
|
74
|
LOG_ERROR("open output file error");
|
e109b001
Hu Chunming
修正多显卡问题
|
75
|
return 1;
|
0b4cd5d5
Hu Chunming
完成轨迹定时抓拍
|
76
77
|
}
|
e109b001
Hu Chunming
修正多显卡问题
|
78
79
80
81
82
83
84
|
fwrite(pcData, dataLen, 1, fd);
fflush(fd);
fclose(fd);
return 0;
}
|
ca992942
Hu Chunming
优化图片保存
|
85
86
87
88
89
90
|
bool JpegUtil::jpeg_encode(acldvppPicDesc *encodeInputDesc_, string out_file_name) {
if (nullptr == encodeInputDesc_) {
LOG_ERROR("encodeInputDesc_ is nullptr!");
return false;
}
|
e109b001
Hu Chunming
修正多显卡问题
|
91
92
93
94
95
|
aclError aclRet ;
aclRet = aclrtSetDevice(deviceId_);
aclrtSetCurrentContext(context_);
|
e109b001
Hu Chunming
修正多显卡问题
|
96
97
98
|
// 8. 申请输出内存,申请Device内存encodeOutBufferDev_,存放编码后的输出数据
uint32_t outBufferSize= 0;
int ret = acldvppJpegPredictEncSize(encodeInputDesc_, jpegeConfig_, &outBufferSize);
|
ca992942
Hu Chunming
优化图片保存
|
99
100
101
102
|
if (ret != ACL_SUCCESS || outBufferSize <= 0) {
LOG_ERROR("acldvppJpegPredictEncSize failed!");
return false;
}
|
e109b001
Hu Chunming
修正多显卡问题
|
103
104
|
void *encodeOutBufferDev_ = nullptr;
ret = acldvppMalloc(&encodeOutBufferDev_, outBufferSize);
|
ca992942
Hu Chunming
优化图片保存
|
105
106
107
108
|
if (ret != ACL_SUCCESS) {
LOG_ERROR("acldvppMalloc failed!");
return false;
}
|
e109b001
Hu Chunming
修正多显卡问题
|
109
|
|
ca992942
Hu Chunming
优化图片保存
|
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
bool bRet = false;
do {
// 9. 执行异步编码,再调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成
aclRet = acldvppJpegEncodeAsync(dvppChannelDesc_, encodeInputDesc_, encodeOutBufferDev_, &outBufferSize, jpegeConfig_, stream_);
if (ret != ACL_SUCCESS) {
LOG_ERROR("acldvppJpegEncodeAsync failed!");
break;
}
aclRet = aclrtSynchronizeStream(stream_);
if (ret != ACL_SUCCESS) {
LOG_ERROR("aclrtSynchronizeStream failed!");
break;
}
// 申请Host内存outputHostBuffer
void* outputHostBuffer = malloc(outBufferSize);
if(outputHostBuffer == nullptr) {
LOG_ERROR("malloc failed!");
break;
}
// 通过aclrtMemcpy接口将Device的处理结果数据传输到Host
aclRet = aclrtMemcpy(outputHostBuffer, outBufferSize, encodeOutBufferDev_, outBufferSize, ACL_MEMCPY_DEVICE_TO_HOST);
if (ret != ACL_SUCCESS) {
free(outputHostBuffer);
outputHostBuffer = nullptr;
LOG_ERROR("aclrtMemcpy failed!");
break;
}
// 数据使用完成后,释放内存
ret = jpege_save((char*)outputHostBuffer, outBufferSize, out_file_name);
free(outputHostBuffer);
outputHostBuffer = nullptr;
if(ret != 0) {
LOG_ERROR("jpege_save failed!");
break;
}
|
e109b001
Hu Chunming
修正多显卡问题
|
148
|
|
ca992942
Hu Chunming
优化图片保存
|
149
150
151
|
bRet = true;
} while (0);
|
e109b001
Hu Chunming
修正多显卡问题
|
152
153
154
|
// 释放掉输入输出的device内存
(void)acldvppFree(encodeOutBufferDev_);
encodeOutBufferDev_ = nullptr;
|
ca992942
Hu Chunming
优化图片保存
|
155
156
|
aclRet = aclrtResetDevice(deviceId_);
return bRet;
|
0b4cd5d5
Hu Chunming
完成轨迹定时抓拍
|
157
|
}
|