diff --git a/server/dl_lib/libkvm.so b/server/dl_lib/libkvm.so index f1c774c..8cc0771 100644 Binary files a/server/dl_lib/libkvm.so and b/server/dl_lib/libkvm.so differ diff --git a/server/dl_lib/libopencv_video.so.409 b/server/dl_lib/libopencv_video.so.409 deleted file mode 100644 index 8a5b71e..0000000 Binary files a/server/dl_lib/libopencv_video.so.409 and /dev/null differ diff --git a/server/service/stream/h264_source.go b/server/service/stream/h264_source.go index 53ea16d..9617638 100644 --- a/server/service/stream/h264_source.go +++ b/server/service/stream/h264_source.go @@ -15,10 +15,11 @@ type H264Frame struct { } type H264Subscription struct { - frames chan H264Frame - done chan struct{} - closed atomic.Bool - once sync.Once + frames chan H264Frame + done chan struct{} + closed atomic.Bool + once sync.Once + waitingForKeyframe bool } type H264Source struct { @@ -147,11 +148,38 @@ func (s *H264Subscription) send(frame H264Frame) bool { if s.closed.Load() { return false } + if s.waitingForKeyframe { + if frame.Result != 3 { + return false + } + s.waitingForKeyframe = false + } select { case s.frames <- frame: return true case <-s.done: return false + default: + } + + for { + select { + case <-s.frames: + case <-s.done: + return false + default: + s.waitingForKeyframe = true + if frame.Result != 3 { + return false + } + s.waitingForKeyframe = false + select { + case s.frames <- frame: + return true + case <-s.done: + return false + } + } } } diff --git a/server/service/stream/webrtc/h264.go b/server/service/stream/webrtc/h264.go index 465bb5b..1225fc3 100644 --- a/server/service/stream/webrtc/h264.go +++ b/server/service/stream/webrtc/h264.go @@ -164,9 +164,16 @@ func createPeerConnection(iceServers []webrtc.ICEServer, mediaEngine *webrtc.Med apiOptions := []func(api *webrtc.API){ webrtc.WithSettingEngine(settingEngine), - webrtc.WithInterceptorRegistry(&interceptor.Registry{}), } if mediaEngine != nil { + registry := &interceptor.Registry{} + if err := webrtc.ConfigureNack(mediaEngine, registry); err != nil { + return nil, err + } + if err := webrtc.ConfigureRTCPReports(registry); err != nil { + return nil, err + } + apiOptions = append(apiOptions, webrtc.WithInterceptorRegistry(registry)) apiOptions = append(apiOptions, webrtc.WithMediaEngine(mediaEngine)) } diff --git a/server/service/stream/webrtc/manager.go b/server/service/stream/webrtc/manager.go index 2482dd5..df0f7ef 100644 --- a/server/service/stream/webrtc/manager.go +++ b/server/service/stream/webrtc/manager.go @@ -15,7 +15,7 @@ func NewWebRTCManager() *WebRTCManager { m := &WebRTCManager{ clients: make(map[*websocket.Conn]*Client), videoPacketizer: rtp.NewPacketizer( - 1450, + 1200, 100, 0x1234ABCD, &codecs.H264Payloader{}, diff --git a/support/sg2002/additional/kvm/CMakeLists.txt b/support/sg2002/additional/kvm/CMakeLists.txt index a97185c..c54183a 100644 --- a/support/sg2002/additional/kvm/CMakeLists.txt +++ b/support/sg2002/additional/kvm/CMakeLists.txt @@ -1,6 +1,7 @@ list(APPEND ADD_REQUIREMENTS vision basic peripheral) list(APPEND ADD_INCLUDE "include") +list(APPEND ADD_LINK_DEFINITIONS_PRIVATE -Wl,--as-needed) append_srcs_dir(ADD_SRCS "src") -register_component(DYNAMIC) \ No newline at end of file +register_component(DYNAMIC)