Blame view

src/decoder/dvpp/DvppDecoder.cpp 2.97 KB
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
  #include "DvppDecoder.h"
  
  void receiver_finish_cbk(const void* userPtr){
      if(userPtr != nullptr){
          DvppDecoder* self = (DvppDecoder*)userPtr;
          self->taskFinishing();
      }
  }
  
  DvppDecoder::DvppDecoder(){
      m_pktQueueptr = new CircularQueue<AVPacket *>();
  }
  
  DvppDecoder::~DvppDecoder(){
      delete m_pktQueueptr;
      m_pktQueueptr = nullptr;
  }
  
  bool DvppDecoder::init(FFDecConfig cfg){
  
      m_dec_name = cfg.dec_name;
      
      ReceiverConfig receiver_config;
      receiver_config.uri = cfg.uri.c_str();
      receiver_config.dec_name = cfg.dec_name;
      receiver_config.force_tcp = cfg.force_tcp;
      receiver_config.pktQueueptr = m_pktQueueptr;
      receiver_config.receiver_finished_cbk = receiver_finish_cbk;
      AVCodecContext* avctx = m_receiver.init_FFmpeg(receiver_config);
      if(avctx == nullptr){
          return false;
      }
      m_receiver.setFinishCbkArg(this);
  
      DvppDecConfig dec_cfg;
      if(avctx->codec_id == AV_CODEC_ID_H264){
          dec_cfg.codec_id = 0;
      }else if(avctx->codec_id == AV_CODEC_ID_HEVC){
          dec_cfg.codec_id = 1;
      }else {
          return false;
      }
      dec_cfg.dec_name = cfg.dec_name;
      dec_cfg.post_decoded_cbk = cfg.post_decoded_cbk;
      dec_cfg.dev_id = cfg.gpuid;
      dec_cfg.force_tcp = cfg.force_tcp;
      dec_cfg.skip_frame = cfg.skip_frame;
      dec_cfg.profile = avctx->profile;
      dec_cfg.pktQueueptr = m_pktQueueptr;
      dec_cfg.width = avctx->width;
      dec_cfg.height = avctx->height;
      bool bRet = m_decoder.init_vdpp(dec_cfg);
      if(!bRet){
          return false;
      }
  
      m_cfg = cfg;
  
      decode_finished_cbk = cfg.decode_finished_cbk;
  
      m_bFinished = false;
  
      return true;
  }
  
  bool DvppDecoder::isSurport(FFDecConfig& cfg){
      return true;
  }
  
  bool DvppDecoder::start(){
      m_receiver.start();
      m_decoder.start();
      return true;
  }
  
  void DvppDecoder::close(){
      m_receiver.close();
  }
  
  void DvppDecoder::setPostDecArg(const void* postDecArg){
      m_decoder.setPostDecArg(postDecArg);
  }
  
  void DvppDecoder::setFinishedDecArg(const void* finishedDecArg){
      m_finishedDecArg = finishedDecArg;
  }
  
  void DvppDecoder::pause(){
      m_receiver.pause();
  }
  
  void DvppDecoder::resume(){
      m_receiver.resume();
  }
  
  void DvppDecoder::setDecKeyframe(bool bKeyframe){
      m_receiver.setDecKeyframe(bKeyframe);
  }
  
  bool DvppDecoder::isRunning(){
      return m_receiver.isRunning();
  }
  
  bool DvppDecoder::isFinished(){
      return m_bFinished;
  }
  
  bool DvppDecoder::isPausing(){
      return m_receiver.isPausing();
  }
  
  bool DvppDecoder::getResolution(int &width, int &height){
      return m_receiver.getResolution(width, height);
  }
  
  float DvppDecoder::fps(){
      return m_receiver.fps();
  }
  
9b4d4adf   Hu Chunming   添加定时抓拍;
120
121
122
  DeviceMemory* DvppDecoder::snapshot(){
      // 注意内部有锁
  	return m_decoder.snapshot();
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
  }
  
  int DvppDecoder::getCachedQueueLength(){
      return 0;
  }
  
  void DvppDecoder::taskFinishing(){
      // receiver 中读取线程结束时执行
      m_decoder.close();
      decode_finished_cbk(m_finishedDecArg);
  
      m_bFinished = true;
  
      LOG_INFO("[{}]- task finished.", m_dec_name);
  }