From 1ca362aaad94f5017fa4607a881b80ef327679ba Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期一, 30 十二月 2019 13:15:51 +0800
Subject: [PATCH] Merge branch 'master' of ssh://192.168.5.5:29418/valib/goffmpeg
---
csrc/ffmpeg/bridge/cvbridge.cpp | 131 ++++++++++++++++++-------------------------
1 files changed, 54 insertions(+), 77 deletions(-)
diff --git a/csrc/ffmpeg/bridge/cvbridge.cpp b/csrc/ffmpeg/bridge/cvbridge.cpp
index 0ab95d5..0749f12 100644
--- a/csrc/ffmpeg/bridge/cvbridge.cpp
+++ b/csrc/ffmpeg/bridge/cvbridge.cpp
@@ -2,6 +2,7 @@
#include <string.h>
#include <stdexcept>
+#include <memory>
extern "C"{
#include <libavcodec/avcodec.h>
@@ -22,7 +23,6 @@
double *param/*=NULL*/)
:scale_(new swscale_wrapper)
,pic_(new PicData(dstW, dstH, dstFmt))
- ,buff_fill_(NULL)
{
bool flag = !!scale_ && !!pic_;
flag = scale_->initContext(srcW, srcH, srcFmt, dstW, dstH, dstFmt, flags) && flag;
@@ -39,106 +39,83 @@
if(pic_){
delete pic_;
}
- if(buff_fill_){
- free(buff_fill_);
- }
}
- bool cvbridge::copyPicture(uint8_t *out, AVFrame *in){
+ uint8_t* cvbridge::convert2Data(AVFrame *in){
if(!scale_ || !pic_){
- return false;
+ return NULL;
}
if(!scale_->scaleFrame(in, pic_->getAVFrame())){
- return false;
+ return NULL;
}
+ uint8_t *out = (uint8_t*)malloc(pic_->getAVPictureSize());
memcpy(out, pic_->getAVPictureData(),
pic_->getAVPictureSize());
- return true;
+ return out;
}
- bool cvbridge::getAVFrame(uint8_t *in, const int w, const int h, AVFrame * &output){
- int width = w;
- int height = h;
- AVFrame *temp_rgb_frame = av_frame_alloc();
- temp_rgb_frame->format = (AVPixelFormat)scale_->srcFmt_;
- temp_rgb_frame->width = width;
- temp_rgb_frame->height = height;
-
- //create a AVPicture frame from the opencv Mat input image
- int ret = avpicture_fill((AVPicture *)temp_rgb_frame,
- (uint8_t *)in,
- (AVPixelFormat)scale_->srcFmt_,
- width,
- height);
- if(ret < 0){
- av_frame_free(&temp_rgb_frame);
- return false;
+ AVFrame* cvbridge::convert2Frame(AVFrame *in){
+ if(!scale_ || !pic_){
+ return NULL;
+ }
+
+ uint8_t *out = convert2Data(in);
+ AVFrame *frm = NULL;
+ if (out){
+ frm = fillFrame(out, scale_->dstW_, scale_->dstH_, scale_->dstFmt_);
}
- // temp_rgb_frame->linesize[0] = frame.step;
-
-
- output->format = (AVPixelFormat)scale_->dstFmt_;
- output->width = width;
- output->height = height;
-
- ret = scale_->scaleFrame(temp_rgb_frame, output);
-
- av_frame_free(&temp_rgb_frame);
-
- if(ret)
- return true;
-
- return false;
+ free(out);
+ return frm;
}
- AVFrame *cvbridge::getAVFrame(uint8_t *in, const int w, const int h){
+/////////////////////////////////////////////////////////////////
+
+ AVFrame *cvbridge::fillFrame(uint8_t *in, const int w, const int h, const int f){
int width = w;
int height = h;
+ int format = f;
- if(!buff_fill_){
- int size = avpicture_get_size((AVPixelFormat)scale_->dstFmt_, width, height);
- buff_fill_ = (uint8_t *) malloc(size);
- }
- AVFrame * output = av_frame_alloc();
- const int ret = avpicture_fill((AVPicture*)output, buff_fill_,
- (AVPixelFormat)scale_->dstFmt_, width, height);
+ AVFrame *frame = av_frame_alloc();
+ frame->format = format;
+ frame->width = width;
+ frame->height = height;
+
+ // int size = avpicture_get_size((enum AVPixelFormat)frame->format, frame->width, frame->height);
+ // if (size <= 0){
+ // return NULL;
+ // }
+ // printf("size: %d, res: %dx%d, format: %d\n", size, w, h, f);
+ // uint8_t *spare = (uint8_t*)malloc(size);
+ // memcpy(spare, in, size);
+
+ int ret = avpicture_fill((AVPicture *)frame,
+ (uint8_t *)in,
+ (AVPixelFormat)frame->format,
+ frame->width,
+ frame->height);
if(ret < 0){
- av_frame_free(&output);
+ av_frame_free(&frame);
return NULL;
}
+ return frame;
+ }
- if(getAVFrame(in, w, h, output)){
- return output;
+ uint8_t* cvbridge::extractFrame(AVFrame *in, int *length){
+ *length = avpicture_get_size((enum AVPixelFormat)in->format, in->width, in->height);
+ if (*length <= 0){
+ return NULL;
}
- av_frame_free(&output);
- return NULL;
- }
-//////////////////////////////////////////////////////////////////////////////////
- AVFrame *cvbridge::getAVFrame(AVFrame *in){
-
- int size = avpicture_get_size((enum AVPixelFormat)in->format, in->width, in->height);
- uint8_t *buff = (uint8_t*)malloc(size);
- avpicture_layout((const AVPicture *)in, (enum AVPixelFormat)in->format,
- in->width, in->height, (unsigned char *)buff, size);
-
- AVFrame *output = getAVFrame(buff, in->width, in->height);
- free(buff);
- return output;
- }
-
- bool cvbridge::getAVFrame(AVFrame *in, AVFrame * &output){
-
- int size = avpicture_get_size((enum AVPixelFormat)in->format, in->width, in->height);
- uint8_t *buff = (uint8_t*)malloc(size);
- avpicture_layout((const AVPicture *)in, (enum AVPixelFormat)in->format,
- in->width, in->height, (unsigned char *)buff, size);
-
- bool flag = getAVFrame(buff, in->width, in->height, output);
- free(buff);
- return flag;
+ uint8_t *buff = (uint8_t*)malloc(*length);
+ int ret = avpicture_layout((const AVPicture *)in, (enum AVPixelFormat)in->format,
+ in->width, in->height, (unsigned char *)buff, *length);
+ if (ret < 0){
+ free(buff);
+ return NULL;
+ }
+ return buff;
}
}
--
Gitblit v1.8.0