video analysis2.0拆分,ffmpeg封装go接口库
zhangmeng
2020-09-01 e62936fa4a4b626a359bce8981ebbbaddcd4aada
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include "swscale_wrapper.hpp"
 
extern "C" {      
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>  
#include <libavutil/opt.h>  
#include <libavutil/imgutils.h>  
}
 
#include "../log/log.hpp"
#include "../configure/conf.hpp"
 
using namespace logif;
 
namespace ffwrapper{
    swscale_wrapper::swscale_wrapper()
    :ctx_(nullptr)
    ,srcW_(0)
    ,srcH_(0)
    ,srcFmt_(0)
    ,dstW_(0)
    ,dstH_(0)
    ,dstFmt_(0)
    ,flags_(0)
    {
 
    }
 
    swscale_wrapper::~swscale_wrapper(){
        if(ctx_){
            sws_freeContext(ctx_);
        }
    }
 
    bool swscale_wrapper::initContext(int srcW, int srcH, int srcFmt, 
                     int dstW, int dstH, int dstFmt, int flags,
                     SwsFilter *srcFilter/*=NULL*/,
                     SwsFilter *dstFilter/*=NULL*/,
                     double *param/*=NULL*/){
 
        ctx_ = sws_getContext(srcW, srcH, (AVPixelFormat)srcFmt, 
            dstW, dstH, ( AVPixelFormat )dstFmt, flags, 
            srcFilter, dstFilter, param);
 
        if(!ctx_){
            logIt("sws_getContext failed");
            return false;
        }
 
        srcW_ = srcW;
        srcH_ = srcH;
        srcFmt_ = srcFmt;
        dstW_ = dstW;
        dstH_ = dstH;
        dstFmt_ = dstFmt;
        flags_ = flags;
        
        return true;
    }
 
    bool swscale_wrapper::scaleFrame(AVFrame* &in, AVFrame* &out){
        AVPicture *src = (AVPicture*)in;
        AVPicture *dst = (AVPicture*)out;
 
        const int ret = sws_scale(ctx_, src->data, src->linesize, 0,
                 in->height, dst->data, dst->linesize);
 
        if (ret < 0){
            logIt("sws_scale error:%s", getAVErrorDesc(ret).c_str());
            return false;
        }
        return true;
    }
}