mirror of
https://github.com/livekit/livekit.git
synced 2026-04-06 03:35:38 +00:00
* Set publisher codec preferences after setting remote description Munging SDP prior to setting remote description was becoming problematic in single peer connection mode. In that mode, it is possible that a subscribe track m-section is added which sets the fmtp of H.265 to a value that is different from when that client publishes. That gets locked in as negotiated codecs when pion processes remote description. Later when the client publishes H.265, the H.265 does only partial match. So, if we munge offer and send it to SetRemoteDescription, the H.265 does only a partial match due to different fmtp line and that gets put at the end of the list. So, the answer does not enforce the preferred codec. Changing pion to put partial match up front is more risky given other projects. So, switch codec preferences to after remote description is set and directly operate on transceiver which is a better place to make these changes without munging SDP. This fixes the case of - firefox joins first - Chrome preferring H.265 joining next. This causes a subscribe track m-section (for firefox's tracks) to be created first. So, the preferred codec munging was not working. Works after this change. * clean up * mage generate * test * clean up
81 lines
3.4 KiB
Go
81 lines
3.4 KiB
Go
// Copyright 2024 LiveKit, Inc.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package transport
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"github.com/pion/webrtc/v4"
|
|
|
|
"github.com/livekit/livekit-server/pkg/rtc/types"
|
|
"github.com/livekit/livekit-server/pkg/sfu/streamallocator"
|
|
"github.com/livekit/protocol/livekit"
|
|
)
|
|
|
|
//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -generate
|
|
|
|
var (
|
|
ErrNoICECandidateHandler = errors.New("no ICE candidate handler")
|
|
ErrNoOfferHandler = errors.New("no offer handler")
|
|
ErrNoAnswerHandler = errors.New("no answer handler")
|
|
)
|
|
|
|
//counterfeiter:generate . Handler
|
|
type Handler interface {
|
|
OnICECandidate(c *webrtc.ICECandidate, target livekit.SignalTarget) error
|
|
OnInitialConnected()
|
|
OnFullyEstablished()
|
|
OnFailed(isShortLived bool, iceConnectionInfo *types.ICEConnectionInfo)
|
|
OnTrack(track *webrtc.TrackRemote, rtpReceiver *webrtc.RTPReceiver)
|
|
OnDataMessage(kind livekit.DataPacket_Kind, data []byte)
|
|
OnDataMessageUnlabeled(data []byte)
|
|
OnDataSendError(err error)
|
|
OnOffer(sd webrtc.SessionDescription, offerId uint32) error
|
|
OnSetRemoteDescriptionOffer()
|
|
OnAnswer(sd webrtc.SessionDescription, answerId uint32) error
|
|
OnNegotiationStateChanged(state NegotiationState)
|
|
OnNegotiationFailed()
|
|
OnStreamStateChange(update *streamallocator.StreamStateUpdate) error
|
|
OnUnmatchedMedia(numAudios uint32, numVideos uint32) error
|
|
}
|
|
|
|
type UnimplementedHandler struct{}
|
|
|
|
func (h UnimplementedHandler) OnICECandidate(c *webrtc.ICECandidate, target livekit.SignalTarget) error {
|
|
return ErrNoICECandidateHandler
|
|
}
|
|
func (h UnimplementedHandler) OnInitialConnected() {}
|
|
func (h UnimplementedHandler) OnFullyEstablished() {}
|
|
func (h UnimplementedHandler) OnFailed(isShortLived bool) {}
|
|
func (h UnimplementedHandler) OnTrack(track *webrtc.TrackRemote, rtpReceiver *webrtc.RTPReceiver) {}
|
|
func (h UnimplementedHandler) OnDataMessage(kind livekit.DataPacket_Kind, data []byte) {}
|
|
func (h UnimplementedHandler) OnDataMessageUnlabeled(data []byte) {}
|
|
func (h UnimplementedHandler) OnDataSendError(err error) {}
|
|
func (h UnimplementedHandler) OnOffer(sd webrtc.SessionDescription, offerId uint32) error {
|
|
return ErrNoOfferHandler
|
|
}
|
|
func (h UnimplementedHandler) OnSetRemoteDescriptionOffer() {}
|
|
func (h UnimplementedHandler) OnAnswer(sd webrtc.SessionDescription, answerId uint32) error {
|
|
return ErrNoAnswerHandler
|
|
}
|
|
func (h UnimplementedHandler) OnNegotiationStateChanged(state NegotiationState) {}
|
|
func (h UnimplementedHandler) OnNegotiationFailed() {}
|
|
func (h UnimplementedHandler) OnStreamStateChange(update *streamallocator.StreamStateUpdate) error {
|
|
return nil
|
|
}
|
|
func (h UnimplementedHandler) OnUnmatchedMedia(numAudios uint32, numVideos uint32) error {
|
|
return nil
|
|
}
|