Blame view

src/dvpp/VpcPicConverter.cpp 2.87 KB
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
1
2
3
4
5
  #include "VpcPicConverter.h"
  #include "depend_headers.h"
  
  #define ALIGN_UP(val, align) (((val) % (align) == 0) ? (val) : (((val) / (align) + 1) * (align)))
  
d248da62   Hu Chunming   优化代码,修正dvpp的一些bug
6
  VpcPicConverter::VpcPicConverter(){
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
7
  
d248da62   Hu Chunming   优化代码,修正dvpp的一些bug
8
  }
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
9
  
d248da62   Hu Chunming   优化代码,修正dvpp的一些bug
10
11
12
  VpcPicConverter::~VpcPicConverter(){
      if(nullptr == stream_){
          aclrtDestroyStream(stream_);
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
13
      }
d248da62   Hu Chunming   优化代码,修正dvpp的一些bug
14
  }
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
15
  
d248da62   Hu Chunming   优化代码,修正dvpp的一些bug
16
17
18
19
20
21
  int VpcPicConverter::init(aclrtContext context, string dec_name){
  
      m_dec_name = dec_name;
  
      CHECK_AND_RETURN(aclrtSetCurrentContext(context), "aclrtSetCurrentContext failed");
      CHECK_AND_RETURN(aclrtCreateStream(&stream_), "aclrtCreateStream failed! ");
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
22
  
d248da62   Hu Chunming   优化代码,修正dvpp的一些bug
23
24
25
26
27
28
29
30
31
32
33
34
35
      dvppChannelDesc_ = acldvppCreateChannelDesc();
  
      int ret = ACL_ERROR_NONE;
      do
      {
          ret = acldvppCreateChannel(dvppChannelDesc_);
          CHECK_AND_BREAK(ret, "acldvppCreateChannel failed !");
  
          ret = acldvppSetChannelDescMode(dvppChannelDesc_, DVPP_CHNMODE_VPC);
          CHECK_AND_BREAK(ret, "acldvppSetChannelDescMode failed !");
      } while (0);
      
      return ret;
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
36
37
38
39
  }
  
  DvppRgbMemory* VpcPicConverter::convert2bgr(acldvppPicDesc *inputDesc_, int out_width, int out_height, bool key_frame){
  
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
      int out_buf_width = ALIGN_UP(out_width, 16) * 3;
      int out_buf_height = ALIGN_UP(out_height, 2);
      int out_buf_size = out_buf_width * out_buf_height;
  
      DvppRgbMemory* rgbMem = new DvppRgbMemory(3, out_buf_width, out_buf_height, out_buf_size, "", to_string(m_devId), key_frame);
      void *outBufferDev_ = (void*)rgbMem->getMem();
  
      acldvppPicDesc *outputDesc_= acldvppCreatePicDesc();
      acldvppSetPicDescData(outputDesc_, outBufferDev_);
      acldvppSetPicDescFormat(outputDesc_, PIXEL_FORMAT_BGR_888); 
      acldvppSetPicDescWidth(outputDesc_, out_width);
      acldvppSetPicDescHeight(outputDesc_, out_height);
      acldvppSetPicDescWidthStride(outputDesc_, out_buf_width);
      acldvppSetPicDescHeightStride(outputDesc_, out_buf_height);
      acldvppSetPicDescSize(outputDesc_, out_buf_size);
  
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
      aclError ret = ACL_ERROR_NONE;
      do{
          // 9. 执行异步色域转换,再调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成
          ret = acldvppVpcConvertColorAsync(dvppChannelDesc_, inputDesc_, outputDesc_, stream_);
          if(ret != ACL_ERROR_NONE){
              LOG_ERROR("acldvppVpcConvertColorAsync failed - out_width:{} out_height:{} out_buf_width:{}  out_buf_height:{} out_buf_size:{}", out_width, out_height, out_buf_width,  out_buf_height, out_buf_size);
              break;
          }
          ret = aclrtSynchronizeStream(stream_);
          if(ret != ACL_ERROR_NONE){
              LOG_ERROR("aclrtSynchronizeStream failed - out_width:{} out_height:{} out_buf_width:{}  out_buf_height:{} out_buf_size:{}", out_width, out_height, out_buf_width,  out_buf_height, out_buf_size);
              break;
          }
      }while(0);
  
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
71
72
73
74
75
76
77
78
      acldvppDestroyPicDesc(outputDesc_);
  
      if(ret != ACL_ERROR_NONE){
          delete rgbMem;
          rgbMem = nullptr;
      }
  
      return rgbMem;
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
79
  }