package goffmpeg
|
|
/*
|
#cgo LDFLAGS: -ldl
|
#include <stdlib.h>
|
#include "libcffmpeg.h"
|
*/
|
import "C"
|
import (
|
"fmt"
|
"unsafe"
|
)
|
|
// GoFFMPEG handle for c
|
type GoFFMPEG struct {
|
lib C.libcffmpeg
|
ffmpeg C.cffmpeg
|
}
|
|
// New create handle
|
func New() *GoFFMPEG {
|
soFile := C.CString("./lib/libcffmpeg.so")
|
defer C.free(unsafe.Pointer(soFile))
|
lib := C.init_libcffmpeg(soFile)
|
if lib == nil {
|
fmt.Println("open libcffmpeg.so error")
|
return nil
|
}
|
return &GoFFMPEG{
|
lib: lib,
|
ffmpeg: C.wrap_fn_create(),
|
}
|
}
|
|
// Free free handle
|
func (h *GoFFMPEG) Free() {
|
C.wrap_fn_destroy(h.ffmpeg)
|
C.release_libcffmpeg(h.lib)
|
}
|
|
// Run ffmpeg
|
func (h *GoFFMPEG) Run(input string) {
|
in := C.CString(input)
|
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
|
}
|