Merge pull request #272 from ZSC714725/rtsp-transport

[opt] rtsp: client端使用UDP收到461则切换成TCP(反之也然)
pull/273/head
yoko 2 years ago committed by GitHub
commit 7214afda48
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -39,6 +39,10 @@ const (
CcstPushSession
)
var (
ErrUnsupportedTransport = fmt.Errorf("Unsupported Transport")
)
type ClientCommandSessionOption struct {
DoTimeoutMs int
OverTcp bool
@ -389,29 +393,49 @@ func (session *ClientCommandSession) writeAnnounce() error {
}
func (session *ClientCommandSession) writeSetup() error {
if session.sdpCtx.HasVideoAControl() {
uri := session.sdpCtx.MakeVideoSetupUri(session.urlCtx.RawUrlWithoutUserInfo)
setup := func(setupUri string) error {
if session.option.OverTcp {
if err := session.writeOneSetupTcp(uri); err != nil {
return err
if err := session.writeOneSetupTcp(setupUri); err != nil {
// 461情况下尝试切换UDP重试
if err == ErrUnsupportedTransport {
if err := session.writeOneSetup(setupUri); err != nil {
return err
}
session.option.OverTcp = false
} else {
return err
}
}
} else {
if err := session.writeOneSetup(uri); err != nil {
return err
if err := session.writeOneSetup(setupUri); err != nil {
// 461情况尝试切换TCP重试
if err == ErrUnsupportedTransport {
if err = session.writeOneSetupTcp(setupUri); err != nil {
return err
}
session.option.OverTcp = true
} else {
return err
}
}
}
return nil
}
if session.sdpCtx.HasVideoAControl() {
uri := session.sdpCtx.MakeVideoSetupUri(session.urlCtx.RawUrlWithoutUserInfo)
if err := setup(uri); err != nil {
return err
}
}
// can't else if
if session.sdpCtx.HasAudioAControl() {
uri := session.sdpCtx.MakeAudioSetupUri(session.urlCtx.RawUrlWithoutUserInfo)
if session.option.OverTcp {
if err := session.writeOneSetupTcp(uri); err != nil {
return err
}
} else {
if err := session.writeOneSetup(uri); err != nil {
return err
}
if err := setup(uri); err != nil {
return err
}
}
return nil
@ -438,6 +462,12 @@ func (session *ClientCommandSession) writeOneSetup(setupUri string) error {
return err
}
if ctx.StatusCode == "461" {
// 切换transport尝试继续
err = ErrUnsupportedTransport
return err
}
session.sessionId = strings.Split(ctx.Headers.Get(HeaderSession), ";")[0]
rRtpPort, rRtcpPort, err := parseServerPort(ctx.Headers.Get(HeaderTransport))
@ -508,6 +538,11 @@ func (session *ClientCommandSession) writeOneSetupTcp(setupUri string) error {
return err
}
if ctx.StatusCode == "461" {
err = ErrUnsupportedTransport
return err
}
session.sessionId = strings.Split(ctx.Headers.Get(HeaderSession), ";")[0]
// TODO chef: 这里没有解析回传的channel id了因为我假定了它和request中的是一致的

Loading…
Cancel
Save