video analysis2.0拆分,ffmpeg封装go接口库
zhangmeng
2019-11-13 64fed650d429fdbdfa4011956a2c057dd0348914
bug fix
9个文件已修改
75 ■■■■ 已修改文件
cffmpeg.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/cffmpeg.cpp 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/ffmpeg/bridge/cvbridge.cpp 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/wrapper.cpp 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/wrapper.hpp 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
goconv.go 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
goenc.go 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libcffmpeg.c 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libcffmpeg.h 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cffmpeg.h
@@ -32,7 +32,7 @@
void* c_ffmpeg_decode(const char *file, const int gb, int *wid, int *hei);
// 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 scale_flag, const int gi, const int fmt, const char *file);
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
@@ -115,8 +115,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 scale_flag, const int gi, const int fmt, const char *file){
    return CreateEncoder(w, h, fps, br, scale_flag, gi, fmt, file);
}
void c_ffmpeg_destroy_encoder(void *h){
csrc/ffmpeg/bridge/cvbridge.cpp
@@ -62,11 +62,13 @@
            return NULL;
        }
        if(!scale_->scaleFrame(in, pic_->getAVFrame())){
            return NULL;
        }
        return av_frame_clone(pic_->getAVFrame());
        uint8_t *out = convert2Data(in);
        AVFrame *frm = NULL;
        if (out){
            frm = fillFrame(out, scale_->dstW_, scale_->dstH_, scale_->dstFmt_);
        }
        free(out);
        return frm;
    }
/////////////////////////////////////////////////////////////////
csrc/wrapper.cpp
@@ -370,10 +370,14 @@
        int br;
        int gi;
        int flag;
        int fmt;
        cvbridge *bridge;
    } PicEncoder;
    void *CreateEncoder(const int w, const int h, const int fps, const int br, const int scale_flag, const int gi){
    void *CreateEncoder(const int w, const int h, const int fps, const int br,
                        const int scale_flag, const int gi, const int fmt, const char *file){
        if (fmt < 0) return NULL;
        PicEncoder *e = (PicEncoder*)malloc(sizeof(PicEncoder));
        e->enc = NULL;
@@ -383,6 +387,7 @@
        e->br = br;
        e->gi = gi;
        e->flag = scale_flag;
        e->fmt = fmt;
        e->bridge = NULL;
        VideoProp prop_;
@@ -392,7 +397,10 @@
        prop_.bit_rate_ = br;
        gi < 0 ? prop_.gpu_acc_ = false : prop_.gpu_acc_ = true;
        FormatOut *enc = new FormatOut(prop_, "./88.mp4");
        std::string filename("./88.mp4");
        if (file) filename = file;
        FormatOut *enc = new FormatOut(prop_, filename.c_str());
        e->enc = enc;
        return e;
@@ -415,14 +423,17 @@
        PicEncoder *e = (PicEncoder*)hdl;
        auto ctx = e->enc->getCodecContext();
        AVPixelFormat pix_fmt = AV_PIX_FMT_BGR24;
        // AVPixelFormat pix_fmt = AV_PIX_FMT_BGR24;
        if (e->bridge == NULL){
            e->bridge = new cvbridge(
                    w, h, AV_PIX_FMT_BGR24,
                    w, h, e->fmt,
                    e->w, e->h, ctx->pix_fmt, e->flag);
        }
        AVFrame *frame = cvbridge::fillFrame(in, w, h, pix_fmt);
        AVFrame *bgr_frame = cvbridge::fillFrame(in, w, h, e->fmt);
        AVFrame *frame = e->bridge->convert2Frame(bgr_frame);
        av_frame_free(&bgr_frame);
        AVPacket *pkt = av_packet_alloc();
    
        auto flag = e->enc->encode(pkt, frame);
csrc/wrapper.hpp
@@ -81,7 +81,8 @@
    uint8_t* Decode(const char *file, const int gb, int *w, int *h);
    void *CreateEncoder(const int w, const int h, const int fps, const int br, const int scale_flag, const int gi);
    void *CreateEncoder(const int w, const int h, const int fps, const int br,
                        const int scale_flag, const int gi, const int fmt, const char *file);
    void DestroyEncoder(void *h);
    int Encode(void *hdl, uint8_t *in, const int w, const int h, uint8_t **out, int *size, int *key);
goconv.go
@@ -34,7 +34,7 @@
    ScaleSpline = 0x400
)
// SrcFormat format
// SrcFormat format NV
const SrcFormat = 23
// DstFormat format
goenc.go
@@ -21,7 +21,7 @@
    }
    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(sFlag), C.int(gi), C.int(DstFormat), nil),
    }
}
@@ -53,3 +53,22 @@
    }
    return nil, 0, false
}
// NewJpegEncoder encoder
func NewJpegEncoder(w, h, fps, br, sFlag, gi, fmt int, file string) *GoEncoder {
    if w <= 0 || h <= 0 {
        return nil
    }
    cfile := C.CString(file)
    defer C.free(unsafe.Pointer(cfile))
    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), C.int(fmt), cfile),
    }
}
// EncodeJpeg bgr->jpg
func (e *GoEncoder) EncodeJpeg(bgr []byte, w, h int) ([]byte, error) {
    return nil, nil
}
libcffmpeg.c
@@ -153,12 +153,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 scale_flag, const int gi, const int fmt, const char *file){
    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, scale_flag, gi, fmt, file);
}
void wrap_fn_destroy_encoder(void *lib, const cencoder h){
@@ -177,7 +177,7 @@
    
    uint8_t *out = NULL;
    const int flag = fn_encode(hdl, (uint8_t*)in, w, h, &out, out_size, key);
    if (flag > 0 && out != NULL) {
    if (flag == 0 && out != NULL) {
        return out;
    }
    *out_size = 0;
libcffmpeg.h
@@ -63,7 +63,7 @@
void* wrap_fn_decode(void *lib, const char* file, const int gb, int* wid, int* hei);
// 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 scale_flag, const int gi, const int fmt, const char *file);
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);
@@ -71,7 +71,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 scale_flag, const int gi, const int fmt, const char *file);
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);