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, } } // 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) } // 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)) }