-
Notifications
You must be signed in to change notification settings - Fork 50
/
cgo_exports.go
144 lines (131 loc) · 3.33 KB
/
cgo_exports.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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package app
// #include "gst.go.h"
import "C"
import (
"unsafe"
"github.com/go-gst/go-glib/glib"
"github.com/go-gst/go-gst/gst"
gopointer "github.com/mattn/go-pointer"
)
func getSinkCbsFromPtr(userData C.gpointer) *SinkCallbacks {
ptr := gopointer.Restore(unsafe.Pointer(userData))
cbs, ok := ptr.(*SinkCallbacks)
if !ok {
gopointer.Unref(unsafe.Pointer(userData))
return nil
}
return cbs
}
func getSrcCbsFromPtr(userData C.gpointer) *SourceCallbacks {
ptr := gopointer.Restore(unsafe.Pointer(userData))
cbs, ok := ptr.(*SourceCallbacks)
if !ok {
gopointer.Unref(unsafe.Pointer(userData))
return nil
}
return cbs
}
func wrapCSink(sink *C.GstAppSink) *Sink {
return wrapAppSink(&gst.Element{
Object: &gst.Object{
InitiallyUnowned: &glib.InitiallyUnowned{
Object: &glib.Object{
GObject: glib.ToGObject(unsafe.Pointer(sink)),
},
},
},
})
}
func wrapCSource(src *C.GstAppSrc) *Source {
return wrapAppSrc(&gst.Element{
Object: &gst.Object{
InitiallyUnowned: &glib.InitiallyUnowned{
Object: &glib.Object{
GObject: glib.ToGObject(unsafe.Pointer(src)),
},
},
},
})
}
//export goNeedDataCb
func goNeedDataCb(src *C.GstAppSrc, length C.guint, userData C.gpointer) {
cbs := getSrcCbsFromPtr(userData)
if cbs == nil {
return
}
if cbs.NeedDataFunc == nil {
return
}
gosrc := wrapCSource(src)
gosrc.WithTransferOriginal(func() { cbs.NeedDataFunc(gosrc, uint(length)) })
}
//export goEnoughDataDb
func goEnoughDataDb(src *C.GstAppSrc, userData C.gpointer) {
cbs := getSrcCbsFromPtr(userData)
if cbs == nil {
return
}
if cbs.EnoughDataFunc == nil {
return
}
gosrc := wrapCSource(src)
gosrc.WithTransferOriginal(func() { cbs.EnoughDataFunc(gosrc) })
}
//export goSeekDataCb
func goSeekDataCb(src *C.GstAppSrc, offset C.guint64, userData C.gpointer) C.gboolean {
cbs := getSrcCbsFromPtr(userData)
if cbs == nil {
return gboolean(false)
}
if cbs.SeekDataFunc == nil {
return gboolean(true)
}
gosrc := wrapCSource(src)
var ret C.gboolean
gosrc.WithTransferOriginal(func() { ret = gboolean(cbs.SeekDataFunc(gosrc, uint64(offset))) })
return ret
}
//export goSinkEOSCb
func goSinkEOSCb(sink *C.GstAppSink, userData C.gpointer) {
cbs := getSinkCbsFromPtr(userData)
if cbs == nil {
return
}
if cbs.EOSFunc == nil {
return
}
gosink := wrapCSink(sink)
gosink.WithTransferOriginal(func() { cbs.EOSFunc(gosink) })
}
//export goSinkNewPrerollCb
func goSinkNewPrerollCb(sink *C.GstAppSink, userData C.gpointer) C.GstFlowReturn {
cbs := getSinkCbsFromPtr(userData)
if cbs == nil {
return C.GstFlowReturn(gst.FlowError)
}
if cbs.NewPrerollFunc == nil {
return C.GstFlowReturn(gst.FlowOK)
}
gosink := wrapCSink(sink)
var ret C.GstFlowReturn
gosink.WithTransferOriginal(func() { ret = C.GstFlowReturn(cbs.NewPrerollFunc(gosink)) })
return ret
}
//export goSinkNewSampleCb
func goSinkNewSampleCb(sink *C.GstAppSink, userData C.gpointer) C.GstFlowReturn {
cbs := getSinkCbsFromPtr(userData)
if cbs == nil {
return C.GstFlowReturn(gst.FlowError)
}
if cbs.NewSampleFunc == nil {
return C.GstFlowReturn(gst.FlowOK)
}
gosink := wrapCSink(sink)
var ret C.GstFlowReturn
gosink.WithTransferOriginal(func() { ret = C.GstFlowReturn(cbs.NewSampleFunc(gosink)) })
return ret
}
//export goAppGDestroyNotifyFunc
func goAppGDestroyNotifyFunc(ptr C.gpointer) {
gopointer.Unref(unsafe.Pointer(ptr))
}