video analysis2.0拆分,ffmpeg封装go接口库
zhangmeng
2019-09-20 be9c1d1f659b0ff31f656424c478e83a4f7c53b5
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;
@@ -36,14 +44,14 @@
    ,scale_w_(0)
    ,scale_h_(0)
    ,scale_f_(SWS_POINT)
    ,audio_(false)
    ,gb_(0)
    ,cpu_(0)
    ,use_decoder_(false)
    ,thread_(nullptr)
    ,stop_stream_(false)
    ,stream_(nullptr)
    ,decoder_(nullptr)
    ,rec_(nullptr)
    ,rec_(new rec)
    {
        makeTheWorld();
    }
@@ -57,25 +65,12 @@
                stop_stream_.store(true);
                thread_->join();
            }
            DELETE_POINTER(rec_);
        }
        catch(const std::exception& e)
        {
            logIt("WRAPPER EXCEPTION: ", e.what());
        }
    }
    void Wrapper::ScalePicture(const int w, const int h, const int flags){
        scale_w_ = w;
        scale_f_ = flags;
        scale_h_ = h;
    }
    void Wrapper::UseGB28181(){
        gb_ = 1;
    }
    void Wrapper::UseCPU(){
        cpu_ = 1;
    }
    std::unique_ptr<ffwrapper::FormatIn> Wrapper::init_reader(const char* input){
@@ -98,7 +93,7 @@
       }
        if(flag == 0){
            if(!in->findStreamInfo(NULL)){
                logIt("yolo can't find video stream\n");
                logIt("can't find video stream\n");
                return nullptr;
            }
            
@@ -123,19 +118,35 @@
        return 0;
    }
    void Wrapper::init_stream(){
        if (stream_) delete stream_;
        stream_ = new stream;
    void Wrapper::AudioSwitch(const bool a){
        audio_ = a;
        if (stream_){
            stream_->AudioSwitch(a);
        }
    }
    void Wrapper::init_decoder(ffwrapper::FormatIn *in){
        if (decoder_) delete decoder_;
        decoder_ = new decoder(in, scale_w_, scale_h_,scale_f_);
    void Wrapper::init_worker(ffwrapper::FormatIn *in){
        if (rec_->Loaded() && stream_ && decoder_) return;
        stream_ = new stream(in, 3 * 25);
        stream_->AudioSwitch(audio_);
        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(ffwrapper::FormatIn *in, 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_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 +159,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 +169,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(in.get(), data, id);
                id++;
            }
            deinit_worker();
        }
    }
    void Wrapper::BuildRecorder(const char* id, const char *output, const int mindur, const int maxdur){
    void Wrapper::BuildRecorder(const char* id, const char *output, const int mindur, const int maxdur, const bool audio){
        
        if (rec_){
            rec_->NewRec(id, output, mindur, maxdur);
        if (rec_->Loaded()){
            rec_->NewRec(id, output, mindur, maxdur, audio);
        }else{
            std::string rid(id), dir(output);
            fn_rec_lazy_ =
            [=](ffwrapper::FormatIn *in){rec_->NewRec(rid.c_str(), dir.c_str(), mindur, maxdur, audio);};
        }
    }
    int Wrapper::FireRecorder(const char* sid,const int64_t &id){
        if (rec_){
        if (rec_->Loaded()){
            rec_->FireRecSignal(sid, id);
        }
    }
@@ -190,7 +202,7 @@
    }
    ////////decoder
    void Wrapper::BuildDecoder(){
        use_decoder_ = true;
        // use_decoder_ = true;
    }
    void Wrapper::GetPicDecoder(unsigned char **data, int *w, int *h, int64_t *id){