Skip to content

Commit e3c81ac

Browse files
committed
refactor: 仅对callbacks加锁,防止影响性能
1 parent 246dd83 commit e3c81ac

File tree

1 file changed

+16
-13
lines changed

1 file changed

+16
-13
lines changed

binding/go/gcrp/gcrp.go

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,16 @@ var lastId = 0
9999
func goCallback(event C.enum_Event, data unsafe.Pointer, userData unsafe.Pointer) {
100100
id := int(uintptr(userData))
101101
mutex.RLock()
102-
defer mutex.RUnlock()
102+
callback, ok := callbacks[id]
103+
mutex.RUnlock()
104+
if !ok {
105+
return
106+
}
103107

104108
if event == C.CRP_EV_NEW_FRAME {
105109
frame := (*C.struct_Frame)(data)
106110
height := C.frame_get_height(frame)
107-
callbacks[id].OnFrame(false, Frame{
111+
callback.OnFrame(false, Frame{
108112
int(C.frame_get_width(frame)),
109113
int(height),
110114
0, 0,
@@ -120,7 +124,7 @@ func goCallback(event C.enum_Event, data unsafe.Pointer, userData unsafe.Pointer
120124
})
121125
} else if event == C.CRP_EV_NEW_AUDIO {
122126
frame := (*C.struct_Frame)(data)
123-
callbacks[id].OnFrame(true, Frame{
127+
callback.OnFrame(true, Frame{
124128
0, 0,
125129
int(C.frame_get_width(frame)),
126130
int(C.frame_get_height(frame)),
@@ -136,9 +140,9 @@ func goCallback(event C.enum_Event, data unsafe.Pointer, userData unsafe.Pointer
136140
})
137141
} else if event == C.CRP_EV_VIDEO_EXTRADATA || event == C.CRP_EV_AUDIO_EXTRADATA {
138142
ed := (*C.struct_ExtraData)(data)
139-
callbacks[id].OnEvent(Event(event), C.GoBytes(unsafe.Pointer(ed.data), C.int(ed.size)))
143+
callback.OnEvent(Event(event), C.GoBytes(unsafe.Pointer(ed.data), C.int(ed.size)))
140144
} else {
141-
callbacks[id].OnEvent(Event(event), int64(uintptr(data)))
145+
callback.OnEvent(Event(event), int64(uintptr(data)))
142146
}
143147
}
144148

@@ -151,8 +155,8 @@ func (player Player) Destroy() {
151155
player.handle = nil
152156

153157
mutex.Lock()
154-
defer mutex.Unlock()
155158
delete(callbacks, player.callbackId)
159+
mutex.Unlock()
156160
}
157161

158162
func (player Player) Auth(username, password string, isMd5 bool) {
@@ -167,17 +171,16 @@ func (player Player) Auth(username, password string, isMd5 bool) {
167171
func (player Player) Play(url string, option Option, callback Callback) {
168172
curl := C.CString(url)
169173
defer C.free(unsafe.Pointer(curl))
170-
171-
cHWDevice := C.CString(option.HWDevice)
172-
defer C.free(unsafe.Pointer(cHWDevice))
174+
chwdevice := C.CString(option.HWDevice)
175+
defer C.free(unsafe.Pointer(chwdevice))
173176

174177
coption := C.struct_Option{
175178
transport: C.int(option.Transport),
176179
video: C.struct___1{
177180
width: C.int(option.Width),
178181
height: C.int(option.Height),
179182
format: C.int(option.VideoFormat),
180-
hw_device: *(*[32]C.char)(unsafe.Pointer(cHWDevice)),
183+
hw_device: *(*[32]C.char)(unsafe.Pointer(chwdevice)),
181184
},
182185
enable_audio: C.bool(option.EnableAudio),
183186
audio: C.struct___2{
@@ -189,12 +192,12 @@ func (player Player) Play(url string, option Option, callback Callback) {
189192
}
190193

191194
mutex.Lock()
192-
defer mutex.Unlock()
193-
194195
player.callbackId = lastId
195196
callbacks[lastId] = callback
196-
C.crp_play(player.handle, curl, &coption, C.crp_callback(C.goCallback), unsafe.Pointer(uintptr(lastId)))
197197
lastId += 1
198+
mutex.Unlock()
199+
200+
C.crp_play(player.handle, curl, &coption, C.crp_callback(C.goCallback), unsafe.Pointer(uintptr(id)))
198201
}
199202

200203
func (player Player) Replay() {

0 commit comments

Comments
 (0)