video analysis2.0拆分,ffmpeg封装go接口库
chenshijun
2019-09-10 a6dd7933e0bd8ae1fd083639758f7fee9fc7a151
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#ifndef _cffmpeg_wrapper_hpp_
#define _cffmpeg_wrapper_hpp_
 
extern "C"{
#include <libavcodec/avcodec.h>
}
 
#include <stdint.h>
 
#include <string>
#include <list>
#include <thread>
#include <atomic>
#include <mutex>
#include <unordered_map>
#include <memory>
#include "common/callback.hpp"
 
 
namespace ffwrapper{
    class FormatIn;
    class FormatOut;
    
    class VideoProp;
    class CodedData;
    class FrameData;
 
    class cvbridge;
}
 
namespace cffmpeg_wrap{
 
 
    typedef struct _pic_bgr24{
        unsigned char *data;
        int w;
        int h;
 
        int64_t id;
    }pic_bgr24;
 
    namespace buz{
        class Recorder;
        struct avpacket;
    }
 
    // typedef std::function<std::shared_ptr<buz::Recorder>(ffwrapper::FormatIn*)> FN_REC;
 
    typedef struct _fn_rec{
        std::string rid;
        std::string dir;
        int min;
        int max;
        std::unique_ptr<buz::Recorder> rec;    
    }FnRec;
 
    class Wrapper{
        public:
            Wrapper();
            ~Wrapper ();
 
        private: 
            std::unique_ptr<ffwrapper::FormatIn> init_reader(const char* input);
            // ffwrapper::FormatIn* init_reader_gb28181(const char* input);
            void run_worker(ffwrapper::FormatIn *in, buz::avpacket &pkt);
            std::unique_ptr<buz::Recorder> init_recorder(ffwrapper::FormatIn *in, std::string id,std::string dir, const int mind, const int maxd);
 
            void cache_rec_info(std::string &id, int &index, std::string &path);
            void cache_pic(std::shared_ptr<ffwrapper::FrameData> &frame, int64_t &id);
 
            void cacheAVPacket(const AVPacket &pkt);
        public: 
            int RunStream(const char* input);
        private: 
            void run_stream_thread();
 
        public: //recorder
            void BuildRecorder(const char* id,const char *dir, const int mind, const int maxd);
            int FireRecorder(const char* sid,const int64_t &id);
            void GetInfoRecorder(int &index, std::string &path);
            std::string GetRecorderID(const std::string &path);
 
            void ScalePicture(const int w, const int h, const int flags);
            void UseGB28181();
            void UseCPU();
        public: //decoder
            void BuildDecoder();
            void GetPicDecoder(unsigned char **data, int *w, int *h, int64_t *id);
            void GetPacket(unsigned char **pktData, int *size, int *key);
            //active api
 
        private:
 
            std::string input_url_;
 
            std::unique_ptr<std::thread> thread_;
            std::atomic_bool    stop_stream_;
 
            ffwrapper::cvbridge *bridge_;
 
            bool use_decoder_;
            std::unordered_map<std::string, FnRec> map_rec_;
 
            //passive api
            struct record_file_info{
                int file_frame_index;
                std::string file_path;
                std::string rec_id;
            };
            std::list<struct record_file_info>  list_rec_;
            std::unordered_map<std::string, std::string> list_rec_map_;
 
            std::mutex mutex_rec_;
 
            std::list<pic_bgr24> list_pic_;
            std::mutex mutex_pic_;
 
            std::list<AVPacket> list_avpkt_;
            std::mutex mutex_avpkt_;
 
            int scale_w_, scale_h_, scale_f_;
            int gb_, cpu_;
 
            typedef struct recpkt{
                std::shared_ptr<ffwrapper::CodedData> data;
                int64_t id;
            }recpkt;
            std::list<recpkt> list_rec_pkt_;
            std::mutex mtx_rec_pkt_;
            int cache_rec_pkt(const buz::avpacket &pkt);
            void maybe_dump_rec_pkt();
            int     maxduration;
            int     minduration;
 
        //////////////////test frame to bgr24
        public:
            uint8_t *decodeJPEG(const char *file, int *w, int *h);
 
    };
 
    void *CreateEncoder(const int w, const int h, const int fps, const int br, const int scale_flag, const int gi);
    void DestroyEncoder(void *h);
    int Encode(void *hdl, uint8_t *in, const int w, const int h, uint8_t **out, int *size, int *key);
 
}
 
#endif