| | |
| | | "unsafe" |
| | | ) |
| | | |
| | | const ( |
| | | // 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 |
| | | ) |
| | | |
| | | var libcffmpeg C.libcffmpeg |
| | | |
| | | // InitFFmpeg init ffmepg |
| | |
| | | ffmpeg C.cffmpeg |
| | | } |
| | | |
| | | // New create handle |
| | | func New() *GoFFMPEG { |
| | | // New 2nd new |
| | | func New(GB, CPU bool) *GoFFMPEG { |
| | | |
| | | f := C.wrap_fn_create() |
| | | |
| | | if f == nil { |
| | | return nil |
| | | } |
| | | if GB { |
| | | C.wrap_fn_run_gb28181(f) |
| | | } |
| | | if CPU { |
| | | C.wrap_fn_use_cpu(f) |
| | | } |
| | | |
| | | return &GoFFMPEG{ |
| | | ffmpeg: C.wrap_fn_create(), |
| | | ffmpeg: f, |
| | | } |
| | | } |
| | | |
| | | // NewWithScale scale out pic |
| | | func NewWithScale(w, h int, flag int) *GoFFMPEG { |
| | | f := C.wrap_fn_create() |
| | | if f != nil { |
| | | C.wrap_fn_scale(f, C.int(w), C.int(h), C.int(flag)) |
| | | // 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(lf) |
| | | if f == nil { |
| | | return nil |
| | | } |
| | | if GB { |
| | | C.wrap_fn_run_gb28181(f) |
| | | } |
| | | if CPU { |
| | | C.wrap_fn_use_cpu(f) |
| | | } |
| | | |
| | | return &GoFFMPEG{ |
| | | ffmpeg: f, |
| | | } |
| | |
| | | |
| | | // Free free handle |
| | | func (h *GoFFMPEG) Free() { |
| | | C.wrap_fn_destroy(h.ffmpeg) |
| | | if h.ffmpeg != nil { |
| | | C.wrap_fn_destroy(h.ffmpeg) |
| | | } |
| | | } |
| | | |
| | | // Run ffmpeg |
| | |
| | | defer C.free(unsafe.Pointer(in)) |
| | | |
| | | C.wrap_fn_run(h.ffmpeg, in) |
| | | } |
| | | |
| | | // DecodeJPEG decode jpeg file |
| | | func (h *GoFFMPEG) DecodeJPEG(input string) ([]byte, int, int) { |
| | | in := C.CString(input) |
| | | defer C.free(unsafe.Pointer(in)) |
| | | |
| | | var width C.int |
| | | var height C.int |
| | | p := C.wrap_fn_decode_jpeg(h.ffmpeg, in, &width, &height) |
| | | defer C.free(p) |
| | | |
| | | if width > 0 && height > 0 { |
| | | data := C.GoBytes(p, width*height*3) |
| | | wid := int(width) |
| | | hei := int(height) |
| | | return data, wid, hei |
| | | } |
| | | return nil, 0, 0 |
| | | } |