Skip to content

Commit 09a6722

Browse files
Clayton McCraySean-Der
authored andcommitted
Add ResetReader func to IVFReader
Add ResetReader function for resetting the underlying file in IVFReader. This is for keeping the stream alive if the file is being encoded at the same time as it's being streamed. It takes in a function that returns an io.Reader. A sample function might look like: func(bytesRead int64) io.Reader { underlyingFile.Seek(bytesRead, io.SeekStart) return underlyingFile } and you would call it when ivf.ParseNextFrame(...) returns an error indicating incomplete data.
1 parent e7e1cf5 commit 09a6722

File tree

3 files changed

+17
-1
lines changed

3 files changed

+17
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ Check out the **[contributing wiki](https://github.com/pion/webrtc/wiki/Contribu
137137
* [Bao Nguyen](https://github.com/sysbot)
138138
* [Luke S](https://github.com/encounter)
139139
* [Hendrik Hofstadt](https://github.com/hendrikhofstadt)
140+
* [Clayton McCray](https://github.com/ClaytonMcCray)
140141

141142
### License
142143
MIT License - see [LICENSE](LICENSE) for full text

pkg/media/ivfreader/ivfreader.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ type IVFFrameHeader struct {
3737

3838
// IVFReader is used to read IVF files and return frame payloads
3939
type IVFReader struct {
40-
stream io.Reader
40+
stream io.Reader
41+
bytesReadSuccesfully int64
4142
}
4243

4344
// NewWith returns a new IVF reader and IVF file header
@@ -59,6 +60,13 @@ func NewWith(in io.Reader) (*IVFReader, *IVFFileHeader, error) {
5960
return reader, header, nil
6061
}
6162

63+
// ResetReader resets the internal stream of IVFReader. This is useful
64+
// for live streams, where the end of the file might be read without the
65+
// data being finished.
66+
func (i *IVFReader) ResetReader(reset func(bytesRead int64) io.Reader) {
67+
i.stream = reset(i.bytesReadSuccesfully)
68+
}
69+
6270
// ParseNextFrame reads from stream and returns IVF frame payload, header,
6371
// and an error if there is incomplete frame data.
6472
// Returns all nil values when no more frames are available.
@@ -67,6 +75,7 @@ func (i *IVFReader) ParseNextFrame() ([]byte, *IVFFrameHeader, error) {
6775
var header *IVFFrameHeader
6876

6977
bytesRead, err := i.stream.Read(buffer)
78+
headerBytesRead := bytesRead
7079
if err != nil {
7180
return nil, nil, err
7281
} else if bytesRead != ivfFrameHeaderSize {
@@ -87,6 +96,8 @@ func (i *IVFReader) ParseNextFrame() ([]byte, *IVFFrameHeader, error) {
8796
} else if bytesRead != int(header.FrameSize) {
8897
return nil, nil, fmt.Errorf("incomplete frame data")
8998
}
99+
100+
i.bytesReadSuccesfully += int64(headerBytesRead) + int64(bytesRead)
90101
return payload, header, nil
91102
}
92103

@@ -123,5 +134,6 @@ func (i *IVFReader) parseFileHeader() (*IVFFileHeader, error) {
123134
return nil, fmt.Errorf(errStr)
124135
}
125136

137+
i.bytesReadSuccesfully += int64(bytesRead)
126138
return header, nil
127139
}

pkg/media/ivfreader/ivfreader_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ func TestIVFReader_ParseValidFrames(t *testing.T) {
8989
0xDE, 0xAD, 0xBE, 0xEF,
9090
},
9191
"Payload value should be 0xDEADBEEF")
92+
assert.Equal(int64(ivfFrameHeaderSize+ivfFileHeaderSize+header.FrameSize), reader.bytesReadSuccesfully)
93+
previousBytesRead := reader.bytesReadSuccesfully
9294

9395
// Parse Frame #2
9496
payload, header, err = reader.ParseNextFrame()
@@ -103,6 +105,7 @@ func TestIVFReader_ParseValidFrames(t *testing.T) {
103105
0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF,
104106
},
105107
"Payload value should be 0xDEADBEEFDEADBEEF")
108+
assert.Equal(int64(ivfFrameHeaderSize+header.FrameSize)+previousBytesRead, reader.bytesReadSuccesfully)
106109
}
107110

108111
func TestIVFReader_ParseIncompleteFrameHeader(t *testing.T) {

0 commit comments

Comments
 (0)