Blame view

src/util/JpegUtil.cpp 3.54 KB
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
1
2
3
4
5
6
7
  #include <cstdio>
  #include <cstdlib>
  #include <memory>
  #include "JpegUtil.h"
  
  using namespace std;
  
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
8
  
e109b001   Hu Chunming   修正多显卡问题
9
10
  int JpegUtil::jpeg_init(int32_t devId){
      deviceId_ = devId;
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
11
  
e109b001   Hu Chunming   修正多显卡问题
12
13
14
15
16
      aclError ret;
      /* 2.Run the management resource application, including Device, Context, Stream */
      aclrtSetDevice(deviceId_);
      aclrtCreateContext(&context_, deviceId_);
      aclrtCreateStream(&stream_);
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
17
  
e109b001   Hu Chunming   修正多显卡问题
18
19
20
21
      // channel  准备
      dvppChannelDesc_ = acldvppCreateChannelDesc();
      ret = acldvppCreateChannel(dvppChannelDesc_);
  }
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
22
  
e109b001   Hu Chunming   修正多显卡问题
23
24
25
26
  void JpegUtil::jpeg_release(){
      aclError ret;
      ret = aclrtSetDevice(deviceId_);
      aclrtSetCurrentContext(context_);
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
27
  
e109b001   Hu Chunming   修正多显卡问题
28
29
30
      ret = acldvppDestroyChannel(dvppChannelDesc_);
      ret = acldvppDestroyChannelDesc(dvppChannelDesc_);
      dvppChannelDesc_ = nullptr;
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
31
  
e109b001   Hu Chunming   修正多显卡问题
32
33
      if (stream_ != nullptr) {
          ret = aclrtDestroyStream(stream_);
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
34
          if (ret != ACL_SUCCESS) {
e109b001   Hu Chunming   修正多显卡问题
35
              printf("destroy stream failed");
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
36
          }
e109b001   Hu Chunming   修正多显卡问题
37
          stream_ = nullptr;
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
38
      }
e109b001   Hu Chunming   修正多显卡问题
39
      printf("end to destroy stream");
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
40
  
e109b001   Hu Chunming   修正多显卡问题
41
42
43
44
      if (context_ != nullptr) {
          ret = aclrtDestroyContext(context_);
          if (ret != ACL_SUCCESS) {
              printf("destroy context failed");
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
45
          }
e109b001   Hu Chunming   修正多显卡问题
46
          context_ = nullptr;
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
47
      }
e109b001   Hu Chunming   修正多显卡问题
48
      printf("end to destroy context");
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
49
  
e109b001   Hu Chunming   修正多显卡问题
50
51
52
53
54
55
56
57
58
59
60
61
62
63
      ret = aclrtResetDevice(deviceId_);
      if (ret != ACL_SUCCESS) {
          printf("reset device failed");
      }
      printf("end to reset device is %d", deviceId_);
  }
  
  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) {
          printf("open output file err\n");
          return 1;
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
64
65
      }
  
e109b001   Hu Chunming   修正多显卡问题
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
      fwrite(pcData, dataLen, 1, fd);
      fflush(fd);
  
      fclose(fd);
      return 0;
  }
  
  void JpegUtil::jpeg_encode(acldvppPicDesc *encodeInputDesc_, string out_file_name){
  
      aclError aclRet ;
      aclRet = aclrtSetDevice(deviceId_);
      aclrtSetCurrentContext(context_);
  
      // 7. 创建图片编码配置数据,设置编码质量
      // 编码质量范围[0, 100],其中level 0编码质量与level 100差不多,而在[1, 100]内数值越小输出图片质量越差。
      acldvppJpegeConfig *jpegeConfig_ = acldvppCreateJpegeConfig();
      acldvppSetJpegeConfigLevel(jpegeConfig_, 100);
  
      // 8. 申请输出内存,申请Device内存encodeOutBufferDev_,存放编码后的输出数据
      uint32_t outBufferSize= 0;
      int ret = acldvppJpegPredictEncSize(encodeInputDesc_, jpegeConfig_, &outBufferSize);
      void *encodeOutBufferDev_ = nullptr;
      ret = acldvppMalloc(&encodeOutBufferDev_, outBufferSize);
  
      // 9. 执行异步编码,再调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成
      aclRet = acldvppJpegEncodeAsync(dvppChannelDesc_, encodeInputDesc_, encodeOutBufferDev_, &outBufferSize, jpegeConfig_, stream_);
      aclRet = aclrtSynchronizeStream(stream_);
  
      // 该模式下,由于处理结果在Device侧,因此需要调用内存复制接口传输结果数据后,再释放Device侧内存
      // 申请Host内存outputHostBuffer 
      void* outputHostBuffer = malloc(outBufferSize);
      // 通过aclrtMemcpy接口将Device的处理结果数据传输到Host
      aclRet = aclrtMemcpy(outputHostBuffer, outBufferSize, encodeOutBufferDev_, outBufferSize, ACL_MEMCPY_DEVICE_TO_HOST);
      // 释放掉输入输出的device内存
      (void)acldvppFree(encodeOutBufferDev_);
      encodeOutBufferDev_ = nullptr;
      // 数据使用完成后,释放内存
      jpege_save((char*)outputHostBuffer, outBufferSize, out_file_name);
      free(outputHostBuffer);
      outputHostBuffer = nullptr;
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
106
  }