video analysis2.0拆分,ffmpeg封装go接口库
zhangmeng
2019-09-18 b73029149580370e62dd6c14a270aea902f85cf2
csrc/wrapper.cpp
@@ -21,12 +21,20 @@
#include "buz/recorder.hpp"
#include "stream.hpp"
#include "decoder.hpp"
#include "rec.hpp"
#include "worker/stream.hpp"
#include "worker/decoder.hpp"
#include "worker/rec.hpp"
using namespace logif;
using namespace ffwrapper;
#define DELETE_POINTER(p) \
do \
{ \
if(NULL != p) \
delete p; \
p = NULL; \
}while(0)
namespace cffmpeg_wrap{
    using namespace buz;
@@ -38,12 +46,11 @@
    ,scale_f_(SWS_POINT)
    ,gb_(0)
    ,cpu_(0)
    ,use_decoder_(false)
    ,thread_(nullptr)
    ,stop_stream_(false)
    ,stream_(nullptr)
    ,decoder_(nullptr)
    ,rec_(nullptr)
    ,rec_(new rec)
    {
        makeTheWorld();
    }
@@ -57,6 +64,7 @@
                stop_stream_.store(true);
                thread_->join();
            }
            DELETE_POINTER(rec_);
        }
        catch(const std::exception& e)
        {
@@ -70,11 +78,11 @@
        scale_h_ = h;
    }
    void Wrapper::UseGB28181(){
    void Wrapper::GB28181(){
        gb_ = 1;
    }
    void Wrapper::UseCPU(){
    void Wrapper::CPUDec(){
        cpu_ = 1;
    }
@@ -123,19 +131,24 @@
        return 0;
    }
    void Wrapper::init_stream(){
        if (stream_) delete stream_;
        stream_ = new stream;
    void Wrapper::init_worker(ffwrapper::FormatIn *in){
        if (rec_->Loaded() && stream_ && decoder_) return;
        stream_ = new stream(3 * 25);
        decoder_ = new decoder(in, scale_w_, scale_h_, scale_f_);
        rec_->Load(in);
        if(fn_rec_lazy_) fn_rec_lazy_(in);
    }
    void Wrapper::run_worker(std::shared_ptr<ffwrapper::CodedData> data, int64_t &id){
        if (stream_) stream_->SetPacket(data);
        if (decoder_) decoder_->SetFrame(data, id);
        if (rec_->Loaded()) rec_->SetPacket(data, id);
    }
    void Wrapper::init_decoder(ffwrapper::FormatIn *in){
        if (decoder_) delete decoder_;
        decoder_ = new decoder(in, scale_w_, scale_h_,scale_f_);
    }
    void Wrapper::init_rec(ffwrapper::FormatIn *in){
        if (rec_) delete rec_;
        rec_ = new rec(in);
    void Wrapper::deinit_worker(){
        DELETE_POINTER(stream_);
        DELETE_POINTER(decoder_);
        rec_->Unload();
    }
    void Wrapper::run_stream_thread(){
@@ -148,11 +161,8 @@
                usleep(200000);
                continue;
            }
            init_stream();
            if (use_decoder_){
                init_decoder(in.get());
            }
            init_rec(in.get());
            init_worker(in.get());
            int64_t id = 0;
            while(!stop_stream_.load()){
@@ -161,24 +171,28 @@
                    logIt("read packet error");
                    break;
               }
                if (stream_) stream_->SetPacket(data);
                if (use_decoder_ && decoder_) decoder_->SetFrame(data, id);
                if (rec_) rec_->SetPacket(data, id);
                run_worker(data, id);
                id++;
            }
            deinit_worker();
        }
    }
    void Wrapper::BuildRecorder(const char* id, const char *output, const int mindur, const int maxdur){
        
        if (rec_){
        if (rec_->Loaded()){
            rec_->NewRec(id, output, mindur, maxdur);
        }else{
            std::string rid(id), dir(output);
            fn_rec_lazy_ =
            [=](ffwrapper::FormatIn *in){rec_->NewRec(rid.c_str(), dir.c_str(), mindur, maxdur);};
        }
    }
    int Wrapper::FireRecorder(const char* sid,const int64_t &id){
        if (rec_){
        if (rec_->Loaded()){
            rec_->FireRecSignal(sid, id);
        }
    }
@@ -190,7 +204,7 @@
    }
    ////////decoder
    void Wrapper::BuildDecoder(){
        use_decoder_ = true;
        // use_decoder_ = true;
    }
    void Wrapper::GetPicDecoder(unsigned char **data, int *w, int *h, int64_t *id){