forked from asticode/go-astiav
/
sws_scale.go
70 lines (65 loc) · 1.49 KB
/
sws_scale.go
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
package astiav
//#cgo pkg-config: libswscale
//#include <libswscale/swscale.h>
import "C"
type SwsFilter struct {
c *C.struct_SwsFilter
}
type SwsContext struct {
c *C.struct_SwsContext
}
func (c *SwsContext) Free() {
C.sws_freeContext(c.c)
}
func (c *SwsContext) Scale(srcFrame *Frame, dstFrame *Frame, srcSliceY int, srcSliceH int) error {
return newError(C.sws_scale(
c.c,
&srcFrame.c.data[0],
&srcFrame.c.linesize[0],
C.int(srcSliceY),
C.int(srcSliceH),
&dstFrame.c.data[0],
&dstFrame.c.linesize[0],
))
}
// func allocSwsContextSetOptionsFromDictionary(d *astiav.Dictionary) *SwsContext {
// var c *C.struct_SwsContext
// c = C.sws_alloc_context()
// if c == nil {
// return nil
// }
// astiav.NewDictionary()
// C.av_opt_set_dict(c.c, d)
// return &SwsContext{c: c}
// }
func GetSwsContext(srcW int, srcH int, srcFormat PixelFormat, dstW int, dstH int, dstFormat PixelFormat,
flags int, srcFilter *SwsFilter, dstFilter *SwsFilter, param []float64) *SwsContext {
var cParam *C.double
if len(param) > 0 {
cParam = (*C.double)(¶m[0])
}
var cSrcFilter *C.struct_SwsFilter
if srcFilter != nil {
cSrcFilter = srcFilter.c
}
var cDstFilter *C.struct_SwsFilter
if cDstFilter != nil {
cDstFilter = dstFilter.c
}
c := C.sws_getContext(
C.int(srcW),
C.int(srcH),
C.enum_AVPixelFormat(srcFormat),
C.int(dstW),
C.int(dstH),
C.enum_AVPixelFormat(dstFormat),
C.int(flags),
cSrcFilter,
cDstFilter,
cParam,
)
if c == nil {
return nil
}
return &SwsContext{c: c}
}