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 | 83 +++++++++++++++++++++++++++++++++++++++++
1 files changed, 82 insertions(+), 1 deletions(-)
diff --git a/csrc/wrapper.cpp b/csrc/wrapper.cpp
index 6e067d9..803ebac 100644
--- a/csrc/wrapper.cpp
+++ b/csrc/wrapper.cpp
@@ -423,7 +423,6 @@
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, e->fmt,
@@ -512,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