video analysis2.0拆分,ffmpeg封装go接口库
zhangmeng
2019-07-26 bfded635a544a1ab5d252739f4be4f7f30b39b7f
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
#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;
    }pic_bgr24;
 
    namespace buz{
        class Recorder;
        struct avpacket;
    }
 
    typedef std::function<std::shared_ptr<buz::Recorder>(ffwrapper::FormatIn*)> FN_REC;
 
    typedef struct _fn_rec{
        FN_REC fn_init;
        std::shared_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::shared_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);
 
            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);
            // active api
            void ActiveRecorder(const char *dir, const int mind, const int maxd,
                                FUNC_REC func);
 
            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);
            void GetPacket(unsigned char **pktData, int *size, int *key);
            //active api
            void ActiveDecoder(FUNC_DEC fn);
 
        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::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_;
 
            // active api
            FUNC_REC func_rec_;
            FUNC_DEC func_dec_;
 
            int scale_w_, scale_h_, scale_f_;
            int gb_, cpu_;
        //////////////////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