video analysis2.0拆分,ffmpeg封装go接口库
zhangmeng
2019-11-21 9b12b43b25fd5a476205bc693be0cf836c281bc1
csrc/wrapper.cpp
@@ -299,69 +299,6 @@
// return val: -1 open error; -2, find stream error; -3, converter create
namespace cffmpeg_wrap{ // start test functions
    uint8_t* Decode(const char *file, const int gb, int *w, int *h){
        VideoProp prop;
        prop.url_ = file;
        prop.gpu_acc_ = false;
        std::unique_ptr<FormatIn> in(new FormatIn(prop.gpuAccl()));
        int flag = -1;
        if (gb){
            flag = in->openGb28181(file, NULL);
        }else{
            flag = in->open(file, NULL);
        }
        std::unique_ptr<cvbridge> bridge_(nullptr);
        if(flag == 0){
            if(!in->findStreamInfo(NULL)){
                logIt("yolo can't find video stream\n");
                *w = *h = -2;
                return NULL;
            }
            auto flag = in->openCodec(NULL);
            if(flag){
                auto dec_ctx = in->getCodecContext();
                AVPixelFormat pix_fmt = AV_PIX_FMT_BGR24;
                bridge_.reset(new cvbridge(
                        dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt,
                        dec_ctx->width, dec_ctx->height, pix_fmt, SWS_BICUBIC));
            }else{
                logIt("FormatIn openCodec Failed!");
                *w = *h = -3;
                return NULL;
            }
        }else{
            logIt("open %s error", file);
            *w = *h = -1;
            return NULL;
        }
        uint8_t *pic = NULL;
        *w = *h = 0;
        int tryTime = 0;
        while (tryTime++ < 100){
            auto data(std::make_shared<CodedData>());
            if (in->readPacket(&data->getAVPacket()) == 0){
                auto frame(std::make_shared<FrameData>());
                AVFrame *frm = frame->getAVFrame();
                if(in->decode(frm, &data->getAVPacket()) == 0){
                    *w = frm->width;
                    *h = frm->height;
                    pic = bridge_->convert2Data(frm);
                    break;
                }
            }
        }
        return pic;
    }
/////// for encoder
    typedef struct _PicEncoder{
        FormatOut *enc;
@@ -453,57 +390,5 @@
        return flag;
    }
///////////////////////////////////////////////////////////
    typedef struct _conv
    {
        int srcW;
        int srcH;
        int srcF;
        int dstW;
        int dstH;
        cvbridge *b;
    }Conv;
    void *CreateConvertor(const int srcW, const int srcH, const int srcFormat,
                          const int dstW, const int dstH, const int dstFormat, const int flag){
        auto bridge = new cvbridge(
                srcW, srcH, srcFormat,
                dstW, dstH, dstFormat, flag);
        if (!bridge) return NULL;
        Conv *c = (Conv*)malloc(sizeof(Conv));
        c->b = bridge;
        c->dstW = dstW;
        c->dstH = dstH;
        c->srcW = srcW;
        c->srcH = srcH;
        c->srcF = srcFormat;
        return c;
    }
    uint8_t *Convert(void *h, uint8_t *src){
        Conv *c = (Conv*)h;
        auto b = c->b;
        AVFrame *tmp_frm = cvbridge::fillFrame(src, c->srcW, c->srcH, c->srcF);
        if (!tmp_frm) return NULL;
        unsigned char *picData = b->convert2Data(tmp_frm);
        av_frame_free(&tmp_frm);
        return picData;
    }
    void DestoryConvertor(void *h){
        Conv *c = (Conv*)h;
        delete c->b;
        free(c);
    }
}