Blame view

src/util/JpegUtil.cpp 4.64 KB
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
  }