Blame view

src/decoder/gb28181/GB28181Provider.h 2.16 KB
c8285c8d   Hu Chunming   GB28181 UDP 有重大进展...
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
  #ifndef _GB28181_DECODER_H_

  #define _GB28181_DECODER_H_

  

  #include "RTPReceiver.h"

  

  #include "common_header.h"

  #include "../interface/AbstractDecoder.h"

  

  #include <atomic>

  #include <mutex>

  

  struct AVFormatContext;

  struct AVCodecContext;

  struct AVCodec;

  struct AVFrame;

  struct AVDictionary;

  

  using namespace std;

  

  class FFGB28181Decoder: public AbstractDecoder

  {

  public:

  	FFGB28181Decoder();

  	~FFGB28181Decoder();

  

      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);

  

      int getCachedQueueLength();

  

  	float fps();

  

      DECODER_TYPE getDecoderType(){ return DECODER_TYPE_GB28181; }

  

      FFImgInfo* snapshot();

  

      void setName(string nm){

          m_dec_name = nm;

      }

  

      string getName(){

          return m_dec_name;

      }

  

      void setPostDecArg(const void* postDecArg);

      void setFinishedDecArg(const void* finishedDecArg);

  

  public:

      void stream_callback(int videoType, char* data, int len, int isKey, uint64_t pts, uint64_t localPts);

  	void stream_end_callback();

      void post_decode_thread();

  

  private:

      DeviceRgbMemory* convert2bgr(AVFrame * gpuFrame);

      int ff_decode();

      

  private:

      string m_dec_name;

      FFDecConfig m_cfg;

  

  	RTPReceiver* m_rtpPtr;

      int m_port;

  

      uint64_t  m_startPts {};

      uint64_t  m_lastPts {};   //上一次pts的值

  	uint64_t  m_curPts {};    //当前的pts	

  	uint64_t  m_diffPts {};

  

      uint32_t frameW {}, frameH {};

  	float m_fps {};

      int m_frameSkip {};

  	

      int log_count {};

      

      std::atomic_int m_status {};

  

      pthread_t m_post_decode_thread;

      const void * m_postDecArg;

      POST_DECODE_CALLBACK post_decoded_cbk;  // 解码数据回调接口

  

      const void * m_finishedDecArg;

      DECODE_FINISHED_CALLBACK decode_finished_cbk;

  

      queue<AVFrame*> mFrameQueue;

      mutex m_queue_mutex;

      mutex m_snapshot_mutex;

  

      bool m_dec_keyframe;

  };

  

  #endif // _GB28181_DECODER_H_