Browse Source

HLS client: send out TS data as soon as it is available

pull/372/head
aler9 4 years ago
parent
commit
9350019262
  1. 26
      internal/clienthls/multiaccessbuffer.go
  2. 14
      internal/clienthls/multiaccessbuffer_test.go

26
internal/clienthls/multiaccessbuffer.go

@ -12,27 +12,19 @@ type multiAccessBufferReader struct { @@ -12,27 +12,19 @@ type multiAccessBufferReader struct {
}
func (r *multiAccessBufferReader) Read(p []byte) (int, error) {
newReadPos := r.readPos + len(p)
r.m.mutex.Lock()
defer r.m.mutex.Unlock()
curBuf, err := func() ([]byte, error) {
r.m.mutex.Lock()
defer r.m.mutex.Unlock()
if r.m.closed && r.readPos >= r.m.writePos {
return nil, io.EOF
}
for !r.m.closed && newReadPos >= r.m.writePos {
r.m.cond.Wait()
}
if r.m.closed && r.m.writePos == r.readPos {
return 0, io.EOF
}
return r.m.buf.Bytes(), nil
}()
if err != nil {
return 0, err
for !r.m.closed && r.m.writePos == r.readPos {
r.m.cond.Wait()
}
n := copy(p, curBuf[r.readPos:])
buf := r.m.buf.Bytes()
n := copy(p, buf[r.readPos:])
r.readPos += n
return n, nil

14
internal/clienthls/multiaccessbuffer_test.go

@ -1,6 +1,7 @@ @@ -1,6 +1,7 @@
package clienthls
import (
"io"
"testing"
"github.com/stretchr/testify/require"
@ -18,10 +19,21 @@ func TestMultiAccessBuffer(t *testing.T) { @@ -18,10 +19,21 @@ func TestMultiAccessBuffer(t *testing.T) {
require.NoError(t, err)
require.Equal(t, []byte{0x01, 0x02, 0x03, 0x04}, buf[:n])
buf = make([]byte, 10)
n, err = r.Read(buf)
require.NoError(t, err)
require.Equal(t, []byte{0x05, 0x06, 0x07, 0x08}, buf[:n])
m.Write([]byte{0x09, 0x0a, 0x0b, 0x0c})
m.Close()
buf = make([]byte, 10)
n, err = r.Read(buf)
require.NoError(t, err)
require.Equal(t, []byte{0x05, 0x06, 0x07, 0x08}, buf[:n])
require.Equal(t, []byte{0x09, 0x0a, 0x0b, 0x0c}, buf[:n])
buf = make([]byte, 10)
_, err = r.Read(buf)
require.Equal(t, io.EOF, err)
}

Loading…
Cancel
Save