video analysis2.0拆分,ffmpeg封装go接口库
zhangmeng
2019-11-20 dc65b072a13994ff02cc7b54f3b00ba087e7f86a
add zerocopy
6个文件已修改
127 ■■■■■ 已修改文件
goconv.go 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
godec.go 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
godecjpeg.go 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
goenc.go 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
goffmpeg.go 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
gostream.go 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
goconv.go
@@ -124,4 +124,28 @@
    return c.ConvToPicture(src)
}
/////////////// for conv
///////////////
// ConvToPicture2 second
func (c *GoConv) ConvToPicture2(src []byte) (unsafe.Pointer, []byte) {
    if c.conv == nil {
        return nil, nil
    }
    bgr := C.wrap_fn_conv(unsafe.Pointer(libcffmpeg), c.conv, (*C.uchar)(unsafe.Pointer(&src[0])))
    if bgr != nil {
        const maxLen = 0x7fffffff
        size := int(c.size)
        data := (*[maxLen]byte)(unsafe.Pointer(bgr))[:size:size]
        return bgr, data
    }
    return nil, nil
}
// Resize2 resize2
func (c *GoConv) Resize2(src []byte) (unsafe.Pointer, []byte) {
    if c.SrcW == c.DstW && c.SrcH == c.DstH {
        return nil, src
    }
    return c.ConvToPicture2(src)
}
godec.go
@@ -19,10 +19,27 @@
    var srcW, srcH, srcF C.int
    p := C.wrap_fn_decoder_pic(unsafe.Pointer(libcffmpeg), h.ffmpeg, &srcW, &srcH, &srcF, &length, &fid)
    if srcW == 0 || srcH == 0 {
    if p == nil || length == 0 || srcW == 0 || srcH == 0 {
        return nil, 0, 0, 0
    }
    defer C.free(unsafe.Pointer(p))
    return C.GoBytes(p, length), int(srcW), int(srcH), int64(fid)
}
// GetYUV2 get yuv data
func (h *GoFFMPEG) GetYUV2() (unsafe.Pointer, []byte, int, int, int64) {
    var fid C.long
    var length C.int
    var srcW, srcH, srcF C.int
    p := C.wrap_fn_decoder_pic(unsafe.Pointer(libcffmpeg), h.ffmpeg, &srcW, &srcH, &srcF, &length, &fid)
    if p == nil || length == 0 || srcW == 0 || srcH == 0 {
        return nil, nil, 0, 0, 0
    }
    const maxLen = 0x7fffffff
    size := int(length)
    data := (*[maxLen]byte)(unsafe.Pointer(p))[:size:size]
    return unsafe.Pointer(p), data, int(srcW), int(srcH), int64(fid)
}
godecjpeg.go
@@ -34,3 +34,30 @@
    }
    return nil, int(width), int(height)
}
// Decode2 decode jpeg file
// return val: -1 open error; -2, find stream error; -3, converter create error
func Decode2(input string, gb bool) (unsafe.Pointer, []byte, int, int) {
    in := C.CString(input)
    defer C.free(unsafe.Pointer(in))
    withGB := 0
    if gb {
        withGB = 1
    }
    var width C.int
    var height C.int
    p := C.wrap_fn_decode(unsafe.Pointer(libcffmpeg), in, C.int(withGB), &width, &height)
    if width > 0 && height > 0 {
        wid := int(width)
        hei := int(height)
        const maxLen = 0x7fffffff
        size := int(width * height * 3)
        data := (*[maxLen]byte)(unsafe.Pointer(p))[:size:size]
        return p, data, wid, hei
    }
    return nil, nil, 0, 0
}
goenc.go
@@ -37,10 +37,8 @@
    var size C.int
    var key C.int
    cin := C.CBytes(in)
    defer C.free(cin)
    p := C.wrap_fn_encode(unsafe.Pointer(libcffmpeg), e.enc, cin, C.int(w), C.int(h), &size, &key)
    p := C.wrap_fn_encode(unsafe.Pointer(libcffmpeg), e.enc, unsafe.Pointer(&in[0]), C.int(w), C.int(h), &size, &key)
    defer C.free(p)
    if p != nil && size > 0 {
        b := C.GoBytes(p, size)
@@ -53,3 +51,25 @@
    }
    return nil, 0, false
}
// Encode2 pic
func (e *GoEncoder) Encode2(in []byte, w, h int) (unsafe.Pointer, []byte, int, bool) {
    var size C.int
    var key C.int
    p := C.wrap_fn_encode(unsafe.Pointer(libcffmpeg), e.enc, unsafe.Pointer(&in[0]), C.int(w), C.int(h), &size, &key)
    if p != nil && size > 0 {
        isKey := false
        if key > 0 {
            isKey = true
        }
        const maxLen = 0x7fffffff
        length := int(size)
        data := (*[maxLen]byte)(unsafe.Pointer(p))[:length:length]
        return p, data, length, isKey
    }
    return nil, nil, 0, false
}
goffmpeg.go
@@ -99,3 +99,11 @@
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))
}
gostream.go
@@ -14,13 +14,32 @@
    var size C.int
    p := C.wrap_fn_get_avpacket(unsafe.Pointer(libcffmpeg), h.ffmpeg, &size, &key)
    defer C.free(unsafe.Pointer(p))
    if size <= 0 {
        return nil, 0, -1
    }
    defer C.free(unsafe.Pointer(p))
    d := C.GoBytes(p, size)
    s := int(size)
    k := int(key)
    return d, s, k
}
//GetAVPacket2 get AVPacket
func (h *GoFFMPEG) GetAVPacket2() (unsafe.Pointer, []byte, int, int) {
    var key C.int
    var size C.int
    p := C.wrap_fn_get_avpacket(unsafe.Pointer(libcffmpeg), h.ffmpeg, &size, &key)
    if size <= 0 {
        return nil, nil, 0, -1
    }
    const maxLen = 0x7fffffff
    length := int(size)
    data := (*[maxLen]byte)(unsafe.Pointer(p))[:length:length]
    k := int(key)
    return p, data, length, k
}