client: add clientconn.Seek()

This commit is contained in:
aler9
2021-05-28 18:04:06 +02:00
committed by Alessandro Ros
parent a9995fb228
commit e9ef8d739f
3 changed files with 44 additions and 3 deletions

View File

@@ -19,12 +19,12 @@ Features:
* Read streams from servers with UDP, TCP or TLS (RTSPS) * Read streams from servers with UDP, TCP or TLS (RTSPS)
* Switch protocol automatically (switch to TCP in case of server error or UDP timeout) * Switch protocol automatically (switch to TCP in case of server error or UDP timeout)
* Read only selected tracks of a stream * Read only selected tracks of a stream
* Pause reading without disconnecting from the server * Pause or seek without disconnecting from the server
* Generate RTCP receiver reports automatically * Generate RTCP receiver reports automatically
* Publish * Publish
* Publish streams to servers with UDP, TCP or TLS (RTSPS) * Publish streams to servers with UDP, TCP or TLS (RTSPS)
* Switch protocol automatically (switch to TCP in case of server error) * Switch protocol automatically (switch to TCP in case of server error)
* Pause publishing without disconnecting from the server * Pause without disconnecting from the server
* Generate RTCP sender reports automatically * Generate RTCP sender reports automatically
* Server * Server
* Handle requests from clients * Handle requests from clients

View File

@@ -1826,6 +1826,32 @@ func TestClientReadSeek(t *testing.T) {
}.Write(bconn.Writer) }.Write(bconn.Writer)
require.NoError(t, err) require.NoError(t, err)
req, err = readRequest(bconn.Reader)
require.NoError(t, err)
require.Equal(t, base.Pause, req.Method)
err = base.Response{
StatusCode: base.StatusOK,
}.Write(bconn.Writer)
require.NoError(t, err)
req, err = readRequest(bconn.Reader)
require.NoError(t, err)
require.Equal(t, base.Play, req.Method)
err = ra.Read(req.Header["Range"])
require.NoError(t, err)
require.Equal(t, headers.Range{
Value: &headers.RangeNPT{
Start: headers.RangeNPTTime(6400 * time.Millisecond),
},
}, ra)
err = base.Response{
StatusCode: base.StatusOK,
}.Write(bconn.Writer)
require.NoError(t, err)
req, err = readRequest(bconn.Reader) req, err = readRequest(bconn.Reader)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, base.Teardown, req.Method) require.Equal(t, base.Teardown, req.Method)
@@ -1868,5 +1894,10 @@ func TestClientReadSeek(t *testing.T) {
}) })
require.NoError(t, err) require.NoError(t, err)
// asdasdasd _, err = conn.Seek(&headers.Range{
Value: &headers.RangeNPT{
Start: headers.RangeNPTTime(6400 * time.Millisecond),
},
})
require.NoError(t, err)
} }

View File

@@ -1574,6 +1574,16 @@ func (cc *ClientConn) Pause() (*base.Response, error) {
} }
} }
// Seek asks the server to re-start the stream from a specific timestamp.
func (cc *ClientConn) Seek(ra *headers.Range) (*base.Response, error) {
_, err := cc.Pause()
if err != nil {
return nil, err
}
return cc.Play(ra)
}
// ReadFrames starts reading frames. // ReadFrames starts reading frames.
func (cc *ClientConn) ReadFrames(onFrame func(int, StreamType, []byte)) error { func (cc *ClientConn) ReadFrames(onFrame func(int, StreamType, []byte)) error {
cc.readCBMutex.Lock() cc.readCBMutex.Lock()