package goffmpeg /* #cgo LDFLAGS: -ldl #include #include "libcffmpeg.h" */ import "C" import ( "errors" "fmt" "unsafe" ) const ( // ScaleNone self add no scale raw frame data ScaleNone = 0 // ScaleFastBilinear SWS_FAST_BILINEAR ScaleFastBilinear = 1 // ScaleBilinear SWS_BILINEAR ScaleBilinear = 2 // ScaleBicubic SWS_BICUBIC ScaleBicubic = 4 // ScaleX SWS_X ScaleX = 8 // ScalePoint SWS_POINT ScalePoint = 0x10 // ScaleArea SWS_AREA ScaleArea = 0x20 // ScaleBicublin SWS_BICUBLIN ScaleBicublin = 0x40 // ScaleGauss SWS_GAUSS ScaleGauss = 0x80 // ScaleSinc SWS_SINC ScaleSinc = 0x100 // ScaleLancZos SWS_LANCZOS ScaleLancZos = 0x200 // ScaleSpline SWS_SPLINE ScaleSpline = 0x400 ) // SrcFormat format NV const SrcFormat = 23 // DstFormat format const DstFormat = 3 var libcffmpeg C.libcffmpeg // InitFFmpeg init ffmepg func InitFFmpeg(soFileGo string) error { soFile := C.CString(soFileGo) defer C.free(unsafe.Pointer(soFile)) lib := C.init_libcffmpeg(soFile) if lib == nil { fmt.Println("open error: ", soFileGo) return errors.New("init ffmpeg error") } libcffmpeg = lib return nil } // FreeFFmpeg free ffmpeg func FreeFFmpeg() { if libcffmpeg != nil { C.release_libcffmpeg(libcffmpeg) } } // GoFFMPEG handle for c type GoFFMPEG struct { ffmpeg C.cffmpeg } // New 2nd new func New(GB, CPU bool) *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) } return &GoFFMPEG{ ffmpeg: f, } } // 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) 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) } return &GoFFMPEG{ ffmpeg: f, } } // Free free handle func (h *GoFFMPEG) Free() { if h.ffmpeg != nil { C.wrap_fn_destroy(unsafe.Pointer(libcffmpeg), h.ffmpeg) } } // Run ffmpeg func (h *GoFFMPEG) Run(input string) { in := C.CString(input) defer C.free(unsafe.Pointer(in)) C.wrap_fn_run(unsafe.Pointer(libcffmpeg), h.ffmpeg, in) } // Run2 ffmpeg func (h *GoFFMPEG) Run2(input string, minDuration int) { in := C.CString(input) defer C.free(unsafe.Pointer(in)) C.wrap_fn_run(unsafe.Pointer(libcffmpeg), h.ffmpeg, in) } // FPS fps func (h *GoFFMPEG) FPS() int { return int(C.wrap_fn_fps(unsafe.Pointer(libcffmpeg), h.ffmpeg)) } // ReleaseC release c memory func ReleaseC(p unsafe.Pointer) { if p == nil { return } C.free(unsafe.Pointer(p)) } // GetGBJpg Get GB28181 Jpg func GetGBJpg(rtspURL string, maxTry int) []byte { rtsp := C.CString(rtspURL) defer C.free(unsafe.Pointer(rtsp)) var jpgLen C.int pic := C.wrap_fn_get_gb28181_pic(unsafe.Pointer(libcffmpeg), rtsp, &jpgLen, C.int(maxTry)) defer C.free(unsafe.Pointer(pic)) retJpg := C.GoBytes(unsafe.Pointer(pic), jpgLen) return retJpg }