From 19aeddb7e383bf48a4005474e8a7549699784ddc Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期三, 13 十一月 2019 15:05:19 +0800 Subject: [PATCH] update --- csrc/wrapper.cpp | 102 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 97 insertions(+), 5 deletions(-) diff --git a/csrc/wrapper.cpp b/csrc/wrapper.cpp index 86662a1..803ebac 100644 --- a/csrc/wrapper.cpp +++ b/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,16 @@ PicEncoder *e = (PicEncoder*)hdl; auto ctx = e->enc->getCodecContext(); - 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); @@ -501,5 +511,87 @@ free(c); } +// mjpeg av pix fmt yuv420p + + static int save2PIC(uint8_t *data, const int w, const int h, const char *filename){ + AVPixelFormat src_fmt = AV_PIX_FMT_BGR24; + AVPixelFormat dst_fmt = AV_PIX_FMT_YUV420P; + + cvbridge *bridge = new cvbridge(w, h, src_fmt, w, h, dst_fmt, 16); + + AVFrame *bgr_frame = cvbridge::fillFrame(data, w, h, src_fmt); + AVFrame *frame_jpeg = bridge->convert2Frame(bgr_frame); + av_frame_free(&bgr_frame); + + AVFormatContext *ctx = avformat_alloc_context(); + ctx->oformat = av_guess_format("mjpeg", NULL, NULL); + if( avio_open(&ctx->pb, filename, AVIO_FLAG_READ_WRITE) < 0) { + printf("Couldn't open output file."); + avformat_free_context(ctx); + + delete bridge; + return -1; + } + AVStream* pAVStream = avformat_new_stream(ctx, 0); + if( pAVStream == NULL ){ + delete bridge; + return -1; + } + AVCodecContext* pCodecCtx = pAVStream->codec; + pCodecCtx->codec_id = ctx->oformat->video_codec; + pCodecCtx->codec_type = AVMEDIA_TYPE_VIDEO; + pCodecCtx->pix_fmt = dst_fmt; + pCodecCtx->width = w; + pCodecCtx->height = h; + pCodecCtx->time_base.num = 1; + pCodecCtx->time_base.den = 25; + AVCodec* pCodec = avcodec_find_encoder(pCodecCtx->codec_id); + if( !pCodec ) { + printf("Codec not found."); + avformat_free_context(ctx); + + delete bridge; + return -1; + } + if( avcodec_open2(pCodecCtx, pCodec, NULL) < 0 ){ + printf("Could not open codec."); + avformat_free_context(ctx); + avio_close(ctx->pb); + delete bridge; + return -1; + } + avformat_write_header(ctx, NULL); + int y_size = pCodecCtx->width * pCodecCtx->height; + AVPacket pkt; + av_new_packet(&pkt, y_size * 3); + int got_picture = 0; + int ret = avcodec_encode_video2(pCodecCtx, &pkt, frame_jpeg, &got_picture); + av_frame_free(&frame_jpeg); + delete bridge; + if( ret < 0 ) { + printf("Encode Error.\n"); + avformat_free_context(ctx); + if( pAVStream ) { + avcodec_close(pAVStream->codec); + } + avio_close(ctx->pb); + + return -1; + } + if( got_picture == 1 ) { + pkt.stream_index = pAVStream->index; + ret = av_write_frame(ctx, &pkt); + avio_flush(ctx->pb); + } + av_free_packet(&pkt); + //Write Trailer + av_write_trailer(ctx); + if( pAVStream ) { + avcodec_close(pAVStream->codec); + } + avio_close(ctx->pb); + avformat_free_context(ctx); + return 0; + } } -- Gitblit v1.8.0