Blame view

src/decoder/dvpp/DvppDecoder.h 2.84 KB
09c2d08c   Hu Chunming   arm交付版
1
2
3
4
5
6
7
8
  #include<string>
  
  #include "depend_headers.h"
  #include "dvpp_headers.h"
  #include "DvppDataMemory.hpp"
  
  #include <queue>
  #include <mutex>
bc01d0b6   Hu Chunming   代码优化;主要是修改了截图逻辑,避...
9
10
  #include <thread>
  #include <chrono>
09c2d08c   Hu Chunming   arm交付版
11
  
746db74c   Hu Chunming   实现recode
12
  #include "FFRecoderTaskManager.h"
09c2d08c   Hu Chunming   arm交付版
13
14
15
16
17
  
  using namespace std;
  
  typedef void(*RECEIVER_FINISHED_CALLBACK)(const void* userPtr);
  
bc01d0b6   Hu Chunming   代码优化;主要是修改了截图逻辑,避...
18
19
  
  struct Vdec_CallBack_UserData;
09c2d08c   Hu Chunming   arm交付版
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
  
  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
57
58
      void doRecode(RecoderInfo& recoderInfo);
  
d9fc3e82   Hu Chunming   recode添加colse功能和mq功能
59
60
      void set_mq_callback(mq_callback_t cb);
  
09c2d08c   Hu Chunming   arm交付版
61
  public:
8dc2e224   Hu Chunming   根据解码用时优化数据送给解码器的频...
62
      void doVdppVdecCallBack(acldvppStreamDesc *input, acldvppPicDesc *output, void *pUserData);
09c2d08c   Hu Chunming   arm交付版
63
64
65
66
67
68
69
70
      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小站上因...
71
      int sendPkt(aclvdecChannelDesc *vdecChannelDesc, AVPacket* pkt, unsigned long long frame_nb);
09c2d08c   Hu Chunming   arm交付版
72
73
74
      bool sendVdecEos(aclvdecChannelDesc *vdecChannelDesc);
      void release_dvpp();
  
b83a105d   Hu Chunming   1. 修正是否实时流判断错误的问题;
75
76
      void display_thread();
  
25a4a277   Hu Chunming   简化解码器线程,解决500小站上因...
77
78
      int getVdecType(int videoType, int profile);
  
09c2d08c   Hu Chunming   arm交付版
79
80
81
82
  private:
      FFDecConfig m_cfg;
      string m_dec_name;
  
bc01d0b6   Hu Chunming   代码优化;主要是修改了截图逻辑,避...
83
      const void * m_finishedDecArg {nullptr};
09c2d08c   Hu Chunming   arm交付版
84
85
86
87
88
      DECODE_FINISHED_CALLBACK decode_finished_cbk {nullptr};
  
      bool m_bFinished{false};
      bool m_bRunning{false};
      bool m_bPause{false};
294ef5bc   Hu Chunming   修复解码器内因线程退出顺序错误导致...
89
  
09c2d08c   Hu Chunming   arm交付版
90
      bool m_bExitReportThd{false};
294ef5bc   Hu Chunming   修复解码器内因线程退出顺序错误导致...
91
      bool m_bExitDisplayThd{false};
09c2d08c   Hu Chunming   arm交付版
92
93
  
      // 读取数据
09c2d08c   Hu Chunming   arm交付版
94
95
96
97
98
99
100
101
      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};
bc01d0b6   Hu Chunming   代码优化;主要是修改了截图逻辑,避...
102
      bool m_bReal {false}; // 是否实时流
09c2d08c   Hu Chunming   arm交付版
103
104
      float m_fps{0.0};
  
bc01d0b6   Hu Chunming   代码优化;主要是修改了截图逻辑,避...
105
      std::thread* m_read_thread{nullptr};
09c2d08c   Hu Chunming   arm交付版
106
  
bc01d0b6   Hu Chunming   代码优化;主要是修改了截图逻辑,避...
107
      bool m_dec_keyframe {false};
09c2d08c   Hu Chunming   arm交付版
108
  
09c2d08c   Hu Chunming   arm交付版
109
110
111
112
      // 解码
      int m_dvpp_deviceId {-1};
      int m_dvpp_channel {-1};
      aclrtContext m_context{nullptr};
25a4a277   Hu Chunming   简化解码器线程,解决500小站上因...
113
      acldvppStreamFormat m_enType;
09c2d08c   Hu Chunming   arm交付版
114
  
bc01d0b6   Hu Chunming   代码优化;主要是修改了截图逻辑,避...
115
      const void * m_postDecArg {nullptr};
09c2d08c   Hu Chunming   arm交付版
116
117
118
119
      POST_DECODE_CALLBACK post_decoded_cbk {nullptr};
  
      int m_vdec_out_size {-1};
  
746db74c   Hu Chunming   实现recode
120
      FFRecoderTaskManager m_recoderManager;
b83a105d   Hu Chunming   1. 修正是否实时流判断错误的问题;
121
122
123
124
125
  
      queue<DvppDataMemory*> m_decoded_data_queue;
      mutex m_decoded_data_queue_mtx;
  
      long long last_ts {0};
bc01d0b6   Hu Chunming   代码优化;主要是修改了截图逻辑,避...
126
  
8dc2e224   Hu Chunming   根据解码用时优化数据送给解码器的频...
127
128
129
130
131
      uint64_t m_in_count {0};
      uint64_t m_out_count {0};
  
      int m_avg_decode_time{1};
      int m_decode_20_time{0};
09c2d08c   Hu Chunming   arm交付版
132
  };