Blame view

src/decoder/dvpp/DvppDecoder.h 2.91 KB
09c2d08c   Hu Chunming   arm交付版
1
2
3
4
5
6
7
8
9
10
  #include<string>
  
  #include "depend_headers.h"
  #include "dvpp_headers.h"
  #include "DvppDataMemory.hpp"
  
  #include <queue>
  #include <mutex>
  #include <condition_variable>
  
746db74c   Hu Chunming   实现recode
11
  #include "FFRecoderTaskManager.h"
09c2d08c   Hu Chunming   arm交付版
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
  
  using namespace std;
  
  typedef void(*RECEIVER_FINISHED_CALLBACK)(const void* userPtr);
  
  const int g_pkt_size = 1024 * 1024;  // 单个AVPacket大小的最大值
  
  class DvppDecoder{
  public:
      DvppDecoder();
      ~DvppDecoder();
      bool init(FFDecConfig cfg);
      void close();
      bool start();
      void pause();
      void resume();
  
      void setDecKeyframe(bool bKeyframe);
  
      bool isRunning();
      bool isFinished();
      bool isPausing();
      bool getResolution( int &width, int &height );
  
      bool isSurport(FFDecConfig& cfg);
  
      float fps();
  
      void setName(string nm){
          m_dec_name = nm;
      }
  
      string getName(){
          return m_dec_name;
      }
  
      DeviceMemory* snapshot();
  
      void setPostDecArg(const void* postDecArg);
      void setFinishedDecArg(const void* finishedDecArg);
  
      int getCachedQueueLength();
  
746db74c   Hu Chunming   实现recode
55
56
      void doRecode(RecoderInfo& recoderInfo);
  
d9fc3e82   Hu Chunming   recode添加colse功能和mq功能
57
58
      void set_mq_callback(mq_callback_t cb);
  
09c2d08c   Hu Chunming   arm交付版
59
  public:
746db74c   Hu Chunming   实现recode
60
      void doVdppVdecCallBack(acldvppStreamDesc *input, acldvppPicDesc *output, unsigned long long frame_nb);
09c2d08c   Hu Chunming   arm交付版
61
62
63
64
65
66
67
68
      void doProcessReport();
  
  private:
      AVCodecContext* init_FFmpeg(FFDecConfig config);
      bool init_vdpp(FFDecConfig cfg, AVCodecContext* avctx);
      void release_ffmpeg();
      void read_thread();
      
25a4a277   Hu Chunming   简化解码器线程,解决500小站上因...
69
      int sendPkt(aclvdecChannelDesc *vdecChannelDesc, AVPacket* pkt, unsigned long long frame_nb);
09c2d08c   Hu Chunming   arm交付版
70
71
72
      bool sendVdecEos(aclvdecChannelDesc *vdecChannelDesc);
      void release_dvpp();
  
b83a105d   Hu Chunming   1. 修正是否实时流判断错误的问题;
73
74
      void display_thread();
  
25a4a277   Hu Chunming   简化解码器线程,解决500小站上因...
75
76
      int getVdecType(int videoType, int profile);
  
09c2d08c   Hu Chunming   arm交付版
77
78
79
80
81
82
83
84
85
86
  private:
      FFDecConfig m_cfg;
      string m_dec_name;
  
      const void * m_finishedDecArg;
      DECODE_FINISHED_CALLBACK decode_finished_cbk {nullptr};
  
      bool m_bFinished{false};
      bool m_bRunning{false};
      bool m_bPause{false};
294ef5bc   Hu Chunming   修复解码器内因线程退出顺序错误导致...
87
  
09c2d08c   Hu Chunming   arm交付版
88
      bool m_bExitReportThd{false};
294ef5bc   Hu Chunming   修复解码器内因线程退出顺序错误导致...
89
      bool m_bExitDisplayThd{false};
09c2d08c   Hu Chunming   arm交付版
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
  
      // 读取数据
      AVStream* stream{nullptr};
      int video_index{-1};
      AVFormatContext *fmt_ctx{nullptr};
      AVPixelFormat pix_fmt;
      AVCodecContext *avctx{nullptr};
      AVBSFContext * h264bsfc{nullptr};
  
      int frame_width{0};
  	int frame_height{0};
      bool m_bReal; // 是否实时流
      float m_fps{0.0};
  
      pthread_t m_read_thread{0};
  
      bool m_dec_keyframe;
  
09c2d08c   Hu Chunming   arm交付版
108
109
110
111
      // 解码
      int m_dvpp_deviceId {-1};
      int m_dvpp_channel {-1};
      aclrtContext m_context{nullptr};
25a4a277   Hu Chunming   简化解码器线程,解决500小站上因...
112
      acldvppStreamFormat m_enType;
09c2d08c   Hu Chunming   arm交付版
113
114
115
116
117
118
119
120
121
122
123
  
      const void * m_postDecArg;
      POST_DECODE_CALLBACK post_decoded_cbk {nullptr};
  
      int m_vdec_out_size {-1};
  
      // 截图
      bool m_bSnapShoting{false};
      DvppDataMemory* m_cached_mem{nullptr};
      mutex m_cached_mutex;
      condition_variable m_cached_cond;
746db74c   Hu Chunming   实现recode
124
125
  
      FFRecoderTaskManager m_recoderManager;
b83a105d   Hu Chunming   1. 修正是否实时流判断错误的问题;
126
127
128
129
130
  
      queue<DvppDataMemory*> m_decoded_data_queue;
      mutex m_decoded_data_queue_mtx;
  
      long long last_ts {0};
09c2d08c   Hu Chunming   arm交付版
131
  };