mirror of
https://github.com/aler9/gortsplib
synced 2025-10-09 00:50:24 +08:00
ConnClient: speedup play in case of udp connections
This commit is contained in:
@@ -485,35 +485,44 @@ func (c *ConnClient) Play(u *url.URL) (*Response, error) {
|
|||||||
return nil, fmt.Errorf("Play() can be called only after SetupUDP() or SetupTCP()")
|
return nil, fmt.Errorf("Play() can be called only after SetupUDP() or SetupTCP()")
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err := c.Do(&Request{
|
|
||||||
Method: PLAY,
|
|
||||||
Url: u,
|
|
||||||
SkipResponse: true,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
res, err := func() (*Response, error) {
|
res, err := func() (*Response, error) {
|
||||||
frame := &InterleavedFrame{
|
if *c.streamProtocol == StreamProtocolUdp {
|
||||||
Content: make([]byte, 0, clientTcpReadBufferSize),
|
res, err := c.Do(&Request{
|
||||||
}
|
Method: PLAY,
|
||||||
|
Url: u,
|
||||||
// v4lrtspserver sends frames before the response.
|
})
|
||||||
// ignore them and wait for the response.
|
|
||||||
for {
|
|
||||||
frame.Content = frame.Content[:cap(frame.Content)]
|
|
||||||
recv, err := c.ReadFrameOrResponse(frame)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if res, ok := recv.(*Response); ok {
|
return res, nil
|
||||||
if res.StatusCode != StatusOK {
|
|
||||||
return nil, fmt.Errorf("bad status code: %d (%s)", res.StatusCode, res.StatusMessage)
|
} else {
|
||||||
|
_, err := c.Do(&Request{
|
||||||
|
Method: PLAY,
|
||||||
|
Url: u,
|
||||||
|
SkipResponse: true,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
frame := &InterleavedFrame{
|
||||||
|
Content: make([]byte, 0, clientTcpReadBufferSize),
|
||||||
|
}
|
||||||
|
|
||||||
|
// v4lrtspserver sends frames before the response.
|
||||||
|
// ignore them and wait for the response.
|
||||||
|
for {
|
||||||
|
frame.Content = frame.Content[:cap(frame.Content)]
|
||||||
|
recv, err := c.ReadFrameOrResponse(frame)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return res, nil
|
if res, ok := recv.(*Response); ok {
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
@@ -521,6 +530,10 @@ func (c *ConnClient) Play(u *url.URL) (*Response, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if res.StatusCode != StatusOK {
|
||||||
|
return nil, fmt.Errorf("bad status code: %d (%s)", res.StatusCode, res.StatusMessage)
|
||||||
|
}
|
||||||
|
|
||||||
c.receiverReportTerminate = make(chan struct{})
|
c.receiverReportTerminate = make(chan struct{})
|
||||||
c.receiverReportDone = make(chan struct{})
|
c.receiverReportDone = make(chan struct{})
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user