video analysis2.0拆分,ffmpeg封装go接口库
zhangmeng
2019-11-21 dbf2d66ef422388631509b06243b194319c813bf
update
8个文件已修改
43 ■■■■ 已修改文件
cffmpeg.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/cffmpeg.cpp 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/wrapper.cpp 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/wrapper.hpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
goenc.go 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
goffmpeg.go 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libcffmpeg.c 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libcffmpeg.h 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cffmpeg.h
@@ -29,7 +29,7 @@
void* c_ffmpeg_get_avpacket(const cffmpeg h, int *size, int *key);
// pic encoder
void *c_ffmpeg_create_encoder(const int w, const int h, const int fps, const int br, const int scale_flag, const int gi);
void *c_ffmpeg_create_encoder(const int w, const int h, const int fps, const int br, const int pix_fmt, const int scale_flag, const int gi);
void c_ffmpeg_destroy_encoder(void *h);
int c_ffmpeg_encode(void *hdl, uint8_t *in, const int w, const int h, uint8_t **out, int *size, int *key);
csrc/cffmpeg.cpp
@@ -110,8 +110,8 @@
}
// pic encoder
void *c_ffmpeg_create_encoder(const int w, const int h, const int fps, const int br, const int scale_flag, const int gi){
    return CreateEncoder(w, h, fps, br, scale_flag, gi);
void *c_ffmpeg_create_encoder(const int w, const int h, const int fps, const int br, const int pix_fmt, const int scale_flag, const int gi){
    return CreateEncoder(w, h, fps, br, pix_fmt, scale_flag, gi);
}
void c_ffmpeg_destroy_encoder(void *h){
csrc/wrapper.cpp
@@ -307,12 +307,13 @@
        int fps;
        int br;
        int gi;
        int pix_fmt;
        int flag;
        cvbridge *bridge;
    } PicEncoder;
    void *CreateEncoder(const int w, const int h, const int fps, const int br, 
                        const int scale_flag, const int gi){
                        const int pix_fmt, const int scale_flag, const int gi){
        PicEncoder *e = (PicEncoder*)malloc(sizeof(PicEncoder));
        e->enc = NULL;
@@ -321,6 +322,7 @@
        e->fps = fps;
        e->br = br;
        e->gi = gi;
        e->pix_fmt = pix_fmt;
        e->flag = scale_flag;
        e->bridge = NULL;
@@ -356,11 +358,11 @@
        if (e->bridge == NULL){
            e->bridge = new cvbridge(
                    w, h, AV_PIX_FMT_BGR24,
                    w, h, e->pix_fmt,
                    e->w, e->h, ctx->pix_fmt, e->flag);
        }
        AVFrame *bgr_frame = cvbridge::fillFrame(in, w, h, AV_PIX_FMT_BGR24);
        AVFrame *bgr_frame = cvbridge::fillFrame(in, w, h, e->pix_fmt);
        AVFrame *frame = e->bridge->convert2Frame(bgr_frame);
        av_frame_free(&bgr_frame);
csrc/wrapper.hpp
@@ -80,7 +80,7 @@
    };
    void *CreateEncoder(const int w, const int h, const int fps, const int br, 
                        const int scale_flag, const int gi);
                        const int pix_fmt, const int scale_flag, const int gi);
    void DestroyEncoder(void *h);
    int Encode(void *hdl, uint8_t *in, const int w, const int h, uint8_t **out, int *size, int *key);
}
goenc.go
@@ -21,7 +21,18 @@
    }
    return &GoEncoder{
        enc: C.wrap_fn_create_encoder(unsafe.Pointer(libcffmpeg), C.int(w), C.int(h), C.int(fps), C.int(br), C.int(sFlag), C.int(gi)),
        enc: C.wrap_fn_create_encoder(unsafe.Pointer(libcffmpeg), C.int(w), C.int(h), C.int(fps), C.int(br), C.int(DstFormat), C.int(sFlag), C.int(gi)),
    }
}
// NewEncoderWithPixFmt origin pix_fmt
func NewEncoderWithPixFmt(w, h, fps, br, pixFmt, sFlag, gi int) *GoEncoder {
    if w <= 0 || h <= 0 {
        return nil
    }
    return &GoEncoder{
        enc: C.wrap_fn_create_encoder(unsafe.Pointer(libcffmpeg), C.int(w), C.int(h), C.int(fps), C.int(br), C.int(pixFmt), C.int(sFlag), C.int(gi)),
    }
}
goffmpeg.go
@@ -39,6 +39,12 @@
    ScaleSpline = 0x400
)
// SrcFormat format NV
const SrcFormat = 23
// DstFormat format
const DstFormat = 3
var libcffmpeg C.libcffmpeg
// InitFFmpeg init ffmepg
libcffmpeg.c
@@ -144,12 +144,12 @@
}
// for encoder
cencoder wrap_fn_create_encoder(void *lib, const int w, const int h, const int fps, const int br, const int scale_flag, const int gi){
cencoder wrap_fn_create_encoder(void *lib, const int w, const int h, const int fps, const int br, const int pix_fmt, const int scale_flag, const int gi){
    if (!fn_create_encoder){
        fn_create_encoder = (lib_cffmpeg_create_encoder)dlsym(lib, "c_ffmpeg_create_encoder");
        release_if_err(fn_create_encoder, lib);
    }
    return fn_create_encoder(w, h, fps, br, scale_flag, gi);
    return fn_create_encoder(w, h, fps, br, pix_fmt, scale_flag, gi);
}
void wrap_fn_destroy_encoder(void *lib, const cencoder h){
libcffmpeg.h
@@ -60,7 +60,7 @@
void* wrap_fn_get_avpacket(void *lib, const cffmpeg h, int* size, int* key);
// for encoder
typedef void* cencoder;
typedef cencoder (*lib_cffmpeg_create_encoder)(const int w, const int h, const int fps, const int br, const int scale_flag, const int gi);
typedef cencoder (*lib_cffmpeg_create_encoder)(const int w, const int h, const int fps, const int br, const int pix_fmt, const int scale_flag, const int gi);
typedef void (*lib_cffmpeg_destroy_encoder)(cencoder h);
typedef int (*lib_cffmpeg_encode)(cencoder hdl, uint8_t *in, const int w, const int h, uint8_t **out, int *size, int *key);
@@ -68,7 +68,7 @@
static lib_cffmpeg_destroy_encoder fn_destroy_encoder = NULL;
static lib_cffmpeg_encode fn_encode = NULL;
cencoder wrap_fn_create_encoder(void *lib, const int w, const int h, const int fps, const int br, const int scale_flag, const int gi);
cencoder wrap_fn_create_encoder(void *lib, const int w, const int h, const int fps, const int br, const int pix_fmt, const int scale_flag, const int gi);
void wrap_fn_destroy_encoder(void *lib, const cencoder h);
void* wrap_fn_encode(void *lib, cencoder hdl, void *in, const int w, const int h, int *out_size, int *key);