mirror of
https://github.com/strukturag/nextcloud-spreed-signaling.git
synced 2025-04-11 14:21:18 +00:00
Add support for request offers to update subscriber connections
The "sid" parameter of "requestOffer" messages is now checked to update the current Janus connection when it matches the "sid" of the subscriber rather than closing it and creating a new one. Updating a connection is needed for clients to renegotiate their received media without interrupting the current connection. For example, to stop receiving video by triggering a new offer from Janus and then setting the video transceiver direction as inactive before creating the answer. Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
This commit is contained in:
parent
f8f2adb0e2
commit
86bad15337
1 changed files with 25 additions and 3 deletions
28
mcu_janus.go
28
mcu_janus.go
|
@ -1245,6 +1245,26 @@ retry:
|
|||
callback(nil, join_response.Jsep)
|
||||
}
|
||||
|
||||
func (p *mcuJanusSubscriber) update(ctx context.Context, callback func(error, map[string]interface{})) {
|
||||
handle := p.handle
|
||||
if handle == nil {
|
||||
callback(ErrNotConnected, nil)
|
||||
return
|
||||
}
|
||||
|
||||
configure_msg := map[string]interface{}{
|
||||
"request": "configure",
|
||||
"update": true,
|
||||
}
|
||||
configure_response, err := handle.Message(ctx, configure_msg, nil)
|
||||
if err != nil {
|
||||
callback(err, nil)
|
||||
return
|
||||
}
|
||||
|
||||
callback(nil, configure_response.Jsep)
|
||||
}
|
||||
|
||||
func (p *mcuJanusSubscriber) SendMessage(ctx context.Context, message *MessageClientMessage, data *MessageClientMessageData, callback func(error, map[string]interface{})) {
|
||||
statsMcuMessagesTotal.WithLabelValues(data.Type).Inc()
|
||||
jsep_msg := data.Payload
|
||||
|
@ -1256,9 +1276,11 @@ func (p *mcuJanusSubscriber) SendMessage(ctx context.Context, message *MessageCl
|
|||
msgctx, cancel := context.WithTimeout(context.Background(), p.mcu.mcuTimeout)
|
||||
defer cancel()
|
||||
|
||||
// TODO Only join the room if there is no sid or it does not match
|
||||
// the subscriber sid; otherwise configure/update the subscriber.
|
||||
p.joinRoom(msgctx, callback)
|
||||
if data.Sid == "" || data.Sid != p.Sid() {
|
||||
p.joinRoom(msgctx, callback)
|
||||
} else {
|
||||
p.update(msgctx, callback)
|
||||
}
|
||||
}
|
||||
case "answer":
|
||||
p.deferred <- func() {
|
||||
|
|
Loading…
Add table
Reference in a new issue