ConnClient: speedup play in case of udp connections

This commit is contained in:
aler9
2020-08-15 22:12:59 +02:00
parent 7f40a9331b
commit 6975ef8a96

View File

@@ -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()")
}
_, err := c.Do(&Request{
Method: PLAY,
Url: u,
SkipResponse: true,
})
if err != nil {
return nil, err
}
res, err := func() (*Response, error) {
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 *c.streamProtocol == StreamProtocolUdp {
res, err := c.Do(&Request{
Method: PLAY,
Url: u,
})
if err != nil {
return nil, err
}
if res, ok := recv.(*Response); ok {
if res.StatusCode != StatusOK {
return nil, fmt.Errorf("bad status code: %d (%s)", res.StatusCode, res.StatusMessage)
return res, nil
} 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
}
if res.StatusCode != StatusOK {
return nil, fmt.Errorf("bad status code: %d (%s)", res.StatusCode, res.StatusMessage)
}
c.receiverReportTerminate = make(chan struct{})
c.receiverReportDone = make(chan struct{})