| | |
| | | ) |
| | | |
| | | const ( |
| | | // ScaleNone self add no scale raw frame data |
| | | ScaleNone = 0 |
| | | // ScaleFastBilinear SWS_FAST_BILINEAR |
| | | ScaleFastBilinear = 1 |
| | | // ScaleBilinear SWS_BILINEAR |
| | |
| | | // ScaleSpline SWS_SPLINE |
| | | ScaleSpline = 0x400 |
| | | ) |
| | | |
| | | // SrcFormat format NV |
| | | const SrcFormat = 23 |
| | | |
| | | // DstFormat format |
| | | const DstFormat = 3 |
| | | |
| | | var libcffmpeg C.libcffmpeg |
| | | |
| | |
| | | ffmpeg C.cffmpeg |
| | | } |
| | | |
| | | // New create handle |
| | | func New() *GoFFMPEG { |
| | | // 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: 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)) |
| | | // 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() { |
| | | C.wrap_fn_destroy(h.ffmpeg) |
| | | if h.ffmpeg != nil { |
| | | C.wrap_fn_destroy(unsafe.Pointer(libcffmpeg), h.ffmpeg) |
| | | } |
| | | } |
| | | |
| | | // Run ffmpeg |
| | |
| | | in := C.CString(input) |
| | | defer C.free(unsafe.Pointer(in)) |
| | | |
| | | C.wrap_fn_run(h.ffmpeg, in) |
| | | C.wrap_fn_run(unsafe.Pointer(libcffmpeg), h.ffmpeg, in) |
| | | } |
| | | |
| | | // DecodeJPEG decode jpeg file |
| | | func (h *GoFFMPEG) DecodeJPEG(input string) ([]byte, int, int) { |
| | | // Run2 ffmpeg |
| | | func (h *GoFFMPEG) Run2(input string, minDuration 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 |
| | | C.wrap_fn_run(unsafe.Pointer(libcffmpeg), h.ffmpeg, in) |
| | | } |
| | | |
| | | ///////////////for encoder |
| | | |
| | | // GoEncoder encoder |
| | | type GoEncoder struct { |
| | | enc C.cencoder |
| | | // FPS fps |
| | | func (h *GoFFMPEG) FPS() int { |
| | | return int(C.wrap_fn_fps(unsafe.Pointer(libcffmpeg), h.ffmpeg)) |
| | | } |
| | | |
| | | // NewEncoder encoder |
| | | func NewEncoder(w, h, fps, br, sFlag, gi int) *GoEncoder { |
| | | if w <= 0 || h <= 0 { |
| | | return nil |
| | | // ReleaseC release c memory |
| | | func ReleaseC(p unsafe.Pointer) { |
| | | if p == nil { |
| | | return |
| | | } |
| | | |
| | | return &GoEncoder{ |
| | | enc: C.wrap_fn_create_encoder(C.int(w), C.int(h), C.int(fps), C.int(br), C.int(sFlag), C.int(gi)), |
| | | } |
| | | C.free(unsafe.Pointer(p)) |
| | | } |
| | | |
| | | // Free free |
| | | func (e *GoEncoder) Free() { |
| | | C.wrap_fn_destroy_encoder(e.enc) |
| | | } |
| | | // 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 |
| | | |
| | | // Encode pic |
| | | func (e *GoEncoder) Encode(in []byte, w, h int) ([]byte, int, bool) { |
| | | pic := C.wrap_fn_get_gb28181_pic(unsafe.Pointer(libcffmpeg), rtsp, &jpgLen, C.int(maxTry)) |
| | | defer C.free(unsafe.Pointer(pic)) |
| | | |
| | | var size C.int |
| | | var key C.int |
| | | cin := C.CBytes(in) |
| | | defer C.free(cin) |
| | | |
| | | p := C.wrap_fn_encode(e.enc, cin, C.int(w), C.int(h), &size, &key) |
| | | defer C.free(p) |
| | | if p != nil && size > 0 { |
| | | b := C.GoBytes(p, size) |
| | | |
| | | isKey := false |
| | | if key > 0 { |
| | | isKey = true |
| | | } |
| | | return b, int(size), isKey |
| | | } |
| | | return nil, 0, false |
| | | retJpg := C.GoBytes(unsafe.Pointer(pic), jpgLen) |
| | | return retJpg |
| | | } |