| | |
| | | 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, const int fmt, const char *file){ |
| | | |
| | | if (fmt < 0) return NULL; |
| | | const int scale_flag, const int gi){ |
| | | |
| | | PicEncoder *e = (PicEncoder*)malloc(sizeof(PicEncoder)); |
| | | e->enc = NULL; |
| | |
| | | e->br = br; |
| | | e->gi = gi; |
| | | e->flag = scale_flag; |
| | | e->fmt = fmt; |
| | | e->bridge = NULL; |
| | | |
| | | VideoProp prop_; |
| | |
| | | prop_.bit_rate_ = br; |
| | | gi < 0 ? prop_.gpu_acc_ = false : prop_.gpu_acc_ = true; |
| | | |
| | | std::string filename("./88.mp4"); |
| | | if (file) filename = file; |
| | | |
| | | FormatOut *enc = new FormatOut(prop_, filename.c_str()); |
| | | FormatOut *enc = new FormatOut(prop_, "./88.mp4"); |
| | | e->enc = enc; |
| | | |
| | | return e; |
| | |
| | | |
| | | if (e->bridge == NULL){ |
| | | e->bridge = new cvbridge( |
| | | w, h, e->fmt, |
| | | w, h, AV_PIX_FMT_BGR24, |
| | | e->w, e->h, ctx->pix_fmt, e->flag); |
| | | } |
| | | |
| | | AVFrame *bgr_frame = cvbridge::fillFrame(in, w, h, e->fmt); |
| | | AVFrame *bgr_frame = cvbridge::fillFrame(in, w, h, AV_PIX_FMT_BGR24); |
| | | AVFrame *frame = e->bridge->convert2Frame(bgr_frame); |
| | | av_frame_free(&bgr_frame); |
| | | |
| | |
| | | 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; |
| | | } |
| | | } |
| | | |