| | |
| | | void* c_ffmpeg_get_avpacket(const cffmpeg h, int *size, int *key); |
| | | int c_ffmpeg_get_avpacket2(const cffmpeg h, unsigned char **data, int *size, int *key); |
| | | |
| | | int c_ffmpeg_set_devid(const cffmpeg h, const int devid); |
| | | |
| | | void c_ffmpeg_release_buf(void* buf); |
| | | |
| | | // pic encoder |
| | |
| | | return s->GetPacket(data, size, key); |
| | | } |
| | | |
| | | int c_ffmpeg_set_devid(const cffmpeg h, const int devid){ |
| | | Wrapper *s = (Wrapper*)h; |
| | | return s->SetDevID(devid); |
| | | } |
| | | |
| | | void c_ffmpeg_release_buf(void* buf){ |
| | | if (buf){ |
| | | free(buf); |
| | |
| | | ,dec_ctx_(NULL) |
| | | ,vs_idx_(-1) |
| | | ,as_idx_(-1) |
| | | ,prop_(NULL) |
| | | ,hw_accl_(hw) |
| | | ,io_ctx_(NULL) |
| | | ,read_io_buff_(NULL) |
| | |
| | | ,fps_(25.0) |
| | | {} |
| | | |
| | | FormatIn::FormatIn(const VideoProp &prop, bool hw/*=true*/) |
| | | :ctx_(NULL) |
| | | ,dec_ctx_(NULL) |
| | | ,vs_idx_(-1) |
| | | ,as_idx_(-1) |
| | | ,prop_(NULL) |
| | | ,hw_accl_(hw) |
| | | ,io_ctx_(NULL) |
| | | ,read_io_buff_(NULL) |
| | | ,read_io_buff_size_(32768) |
| | | ,handle_gb28181(NULL) |
| | | ,fps_(25.0) |
| | | { |
| | | prop_ = new VideoProp; |
| | | *prop_ = prop; |
| | | } |
| | | |
| | | FormatIn::~FormatIn() |
| | | { |
| | | logIt("free format in"); |
| | | if (prop_) delete prop_; |
| | | |
| | | if(dec_ctx_){ |
| | | avcodec_close(dec_ctx_); |
| | | avcodec_free_context(&dec_ctx_); |
| | |
| | | if(hw_accl_){ |
| | | // idle_gpu = gpu::getGPUPrior(300, 1024, 0); |
| | | idle_gpu = gpu::getGPU(300); |
| | | if (prop_->gpu_index_ > -1){ |
| | | idle_gpu = prop_->gpu_index_; |
| | | } |
| | | if(idle_gpu < 0){ |
| | | logIt("NO GPU RESOURCE TO DECODE"); |
| | | hw_accl_ = false; |
| | |
| | | { |
| | | public: |
| | | explicit FormatIn(bool hw=true); |
| | | explicit FormatIn(const VideoProp &prop, bool hw=true); |
| | | ~FormatIn(); |
| | | |
| | | public: |
| | |
| | | int vs_idx_; |
| | | int as_idx_; |
| | | |
| | | VideoProp *prop_; |
| | | bool hw_accl_; |
| | | double fps_; |
| | | private: |
| | |
| | | ,audio_(false) |
| | | ,gb_(0) |
| | | ,cpu_(0) |
| | | ,devid_(-1) |
| | | ,run_dec_(false) |
| | | ,run_stream_(true) |
| | | ,run_rec_(false) |
| | |
| | | ,audio_(false) |
| | | ,gb_(0) |
| | | ,cpu_(0) |
| | | ,devid_(-1) |
| | | ,run_dec_(false) |
| | | ,run_stream_(true) |
| | | ,run_rec_(false) |
| | |
| | | prop.url_ = input; |
| | | prop.rtsp_tcp_ = true; |
| | | prop.gpu_acc_ = !cpu_; |
| | | prop.gpu_index_ = devid_; |
| | | |
| | | std::unique_ptr<FormatIn> in(new FormatIn(prop.gpuAccl())); |
| | | int flag = -1; |
| | |
| | | int GetPacket(unsigned char **pktData, int *size, int *key); |
| | | public: // recorder |
| | | void OpenRecorder(); |
| | | |
| | | public: |
| | | // set device id |
| | | int SetDevID(const int devid){ devid_ = devid; return 0;} |
| | | |
| | | private: |
| | | // stream 参数 |
| | | std::string input_url_; |
| | | bool audio_; |
| | | int gb_, cpu_; |
| | | int gb_, cpu_, devid_; |
| | | bool run_dec_; |
| | | bool run_stream_; |
| | | bool run_rec_; |
| | |
| | | } |
| | | } |
| | | |
| | | // NewWithDevID 2nd new |
| | | func NewWithDevID(GB, CPU bool, devID int) *GoFFMPEG { |
| | | |
| | | f := C.wrap_fn_create(unsafe.Pointer(libcffmpeg)) |
| | | |
| | | if f == nil { |
| | | return nil |
| | | } |
| | | if GB { |
| | | C.wrap_fn_run_gb28181(unsafe.Pointer(libcffmpeg), f) |
| | | } |
| | | if CPU { |
| | | C.wrap_fn_use_cpu(unsafe.Pointer(libcffmpeg), f) |
| | | } else if devID > -1 { |
| | | r := C.wrap_fn_set_devid(unsafe.Pointer(libcffmpeg), f, C.int(devID)) |
| | | if r != 0 { |
| | | if f != nil { |
| | | C.wrap_fn_destroy(unsafe.Pointer(libcffmpeg), f) |
| | | } |
| | | FreeFFmpeg() |
| | | } |
| | | return nil |
| | | } |
| | | |
| | | return &GoFFMPEG{ |
| | | ffmpeg: f, |
| | | } |
| | | } |
| | | |
| | | // NewWithLogAndDevID log |
| | | func NewWithLogAndDevID(GB, CPU bool, devID int, ffmpegLog string) *GoFFMPEG { |
| | | lf := C.CString(ffmpegLog) |
| | | defer C.free(unsafe.Pointer(lf)) |
| | | |
| | | f := C.wrap_fn_create2(unsafe.Pointer(libcffmpeg), lf) |
| | | if f == nil { |
| | | return nil |
| | | } |
| | | if GB { |
| | | C.wrap_fn_run_gb28181(unsafe.Pointer(libcffmpeg), f) |
| | | } |
| | | if CPU { |
| | | C.wrap_fn_use_cpu(unsafe.Pointer(libcffmpeg), f) |
| | | } else if devID > -1 { |
| | | r := C.wrap_fn_set_devid(unsafe.Pointer(libcffmpeg), f, C.int(devID)) |
| | | if r != 0 { |
| | | if f != nil { |
| | | C.wrap_fn_destroy(unsafe.Pointer(libcffmpeg), f) |
| | | } |
| | | FreeFFmpeg() |
| | | } |
| | | return nil |
| | | } |
| | | |
| | | return &GoFFMPEG{ |
| | | ffmpeg: f, |
| | | } |
| | | } |
| | | |
| | | // NewWithLog log |
| | | func NewWithLog(GB, CPU bool, ffmpegLog string) *GoFFMPEG { |
| | | lf := C.CString(ffmpegLog) |
| | |
| | | } |
| | | |
| | | // GetGBJpg Get GB28181 Jpg |
| | | func GetGBJpg(rtspUrl string) []byte { |
| | | func GetGBJpg(rtspURL string) []byte { |
| | | rtsp := C.CString(rtspUrl) |
| | | defer C.free(unsafe.Pointer(rtsp)) |
| | | var jpgLen C.int |
| | |
| | | return fn_get_avpacket2(h, data, size, key); |
| | | } |
| | | |
| | | int wrap_fn_set_devid(void *lib, const cffmpeg h, const int devid){ |
| | | if (!fn_set_devid){ |
| | | fn_set_devid = (lib_cffmpeg_devid)dlsym(lib, "c_ffmpeg_set_devid"); |
| | | if (!fn_set_devid) return -1; |
| | | } |
| | | return fn_set_devid(h, devid); |
| | | } |
| | | |
| | | void wrap_fn_release_buf(void *lib, void *buf){ |
| | | if (!fn_release_buf){ |
| | | fn_release_buf = (lib_cffmpeg_release_buf)dlsym(lib, "c_ffmpeg_release_buf"); |
| | |
| | | typedef void (*lib_cffmpeg_close_stream)(const cffmpeg); |
| | | typedef void*(*lib_cffmpeg_avpacket)(const cffmpeg, int*, int*); |
| | | typedef int (*lib_cffmpeg_avpacket2)(const cffmpeg, unsigned char**, int*, int*); |
| | | typedef int (*lib_cffmpeg_devid)(const cffmpeg, const int devid); |
| | | typedef void(*lib_cffmpeg_release_buf) (void*); |
| | | |
| | | static lib_cffmpeg_create fn_create = NULL; |
| | |
| | | static lib_cffmpeg_pic fn_decoder_pic = NULL; |
| | | static lib_cffmpeg_close_stream fn_close_stream = NULL; |
| | | static lib_cffmpeg_avpacket fn_get_avpacket = NULL; |
| | | static lib_cffmpeg_avpacket2 fn_get_avpacket2 = NULL; |
| | | static lib_cffmpeg_avpacket2 fn_get_avpacket2 = NULL; |
| | | static lib_cffmpeg_devid fn_set_devid = NULL; |
| | | static lib_cffmpeg_release_buf fn_release_buf = NULL; |
| | | |
| | | typedef void* libcffmpeg; |
| | |
| | | void wrap_fn_close_stream(void *lib, const cffmpeg h); |
| | | void* wrap_fn_get_avpacket(void *lib, const cffmpeg h, int* size, int* key); |
| | | int wrap_fn_get_avpacket2(void *lib, const cffmpeg h, unsigned char **data, int* size, int* key); |
| | | int wrap_fn_set_devid(void *lib, const cffmpeg h, const int devid); |
| | | void wrap_fn_release_buf(void *lib, void *buf); |
| | | |
| | | // for encoder |