package mpp /* #cgo CFLAGS: -I/usr/include/rockchip/mpp #cgo LDFLAGS: -L/usr/lib -lv4l2 -lrockchip_mpp #include "mpp.h" #include #include #include #include #include #include #include #include #include #include #include #include #include */ import "C" import ( "errors" "fmt" "unsafe" ) var mpp *MPP type MPP struct { } func New(device string, fps int, bitrate int) (*MPP, error) { cDevice := C.CString(device) defer C.free(unsafe.Pointer(cDevice)) if C.video_init(cDevice) != 0 { return nil, errors.New("failed to initialize video capture") } if C.mpp_init_wrapper(C.int(fps), C.int(bitrate)) != 0 { return nil, errors.New("failed to initialize MPP") } return &MPP{}, nil } func GetSPS() ([]byte, error) { output := make([]byte, 64) // Allocate buffer for SPS var outputLen C.int ret := C.get_sps((*C.uchar)(unsafe.Pointer(&output[0])), &outputLen) if ret != 0 { return nil, fmt.Errorf("failed to retrieve SPS: %v", ret) } return output[:outputLen], nil } func (m *MPP) CaptureAndEncode() ([]byte, error) { output := make([]byte, 1024*1024) // 1MB buffer var outputLen C.int ret := C.capture_and_encode((*C.uchar)(unsafe.Pointer(&output[0])), &outputLen) if ret != 0 { return nil, errors.New("failed to capture and encode frame") } return output[:outputLen], nil } func (m *MPP) Close() { C.cleanup() } func NewTest(device string) error { var err error mpp, err = New(device, 60, 10000*1000) return err } func GetInstance() *MPP { return mpp }