Blame view

src/dvpp/DvppDecoder.h 2.21 KB
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
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
  #include<string>
  #include <pthread.h>
  
  #include "dvpp_headers.h"
  #include "depend_headers.h"
  #include "user_mem.h"
  #include "CircularQueue.hpp"
  #include "VpcPicConverter.h"
  
  #include <queue>
  
  using namespace std;
  
  #define TEST_DECODER
  
  
  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);
  
      int getCachedQueueLength();
  
      float fps();
  
      DECODER_TYPE getDecoderType(){ return DECODER_TYPE_DVPP; }
  
      void setName(string nm){
          m_dec_name = nm;
      }
  
      string getName(){
          return m_dec_name;
      }
  
      FFImgInfo* snapshot();
  
      void setPostDecArg(const void* postDecArg);
      void setFinishedDecArg(const void* finishedDecArg);
  
  public:
      void doProcessReport();
      void doVdppVdecCallBack(acldvppStreamDesc *input, acldvppPicDesc *output, DvppDecoder *self);
  
  private:
      void decode_thread();
      void post_decode_thread();
      void releaseFFmpeg();
      void releaseResource();
      bool init_FFmpeg(const char* uri, bool force_tcp);
      bool init_vdpp(int _deviceId);
  
      bool sendVdecEos(aclvdecChannelDesc *vdecChannelDesc);
  
  private:
      AVStream* stream;
      int stream_index;
      AVFormatContext *fmt_ctx;
      AVPixelFormat pix_fmt;
      uint32_t m_vdec_out_size{0};
      int frame_width{0};
  	int frame_height{0};
  
      int m_dvpp_deviceId {-1};
      int m_dvpp_channel {-1};
  
      pthread_t m_decode_thread;
      pthread_t m_post_decode_thread;
      
      bool m_bRunning;
      bool m_bFinished;
  
      bool m_bPause;
  
      bool m_bReal; // 是否实时流
  
      float m_fps;
  
      FFDecConfig m_cfg;
      string m_dec_name;
      bool m_dec_keyframe;
  
      AVBSFContext * h264bsfc{nullptr};
  
      aclrtContext m_context;
      acldvppStreamFormat enType;
  
      vector<void*> m_vec_vdec;
      CircularQueue<void *> m_vdecQueue;
  
      const void * m_postDecArg;
      POST_DECODE_CALLBACK post_decoded_cbk;
      const void * m_finishedDecArg;
      DECODE_FINISHED_CALLBACK decode_finished_cbk;
  
      VpcPicConverter picConverter;
  };