mirror of
https://github.com/pion/mediadevices.git
synced 2024-05-31 14:03:35 +08:00
cd6aaa1393
Also make the ReadCloser an Controllable allows to uncouple the controller implementation from the encoder. This is not needed for the 2 codec controller already implemented (openh264 and vpx) but is more future proof in case it required for other codecs.
76 lines
1.6 KiB
Go
76 lines
1.6 KiB
Go
package mediadevices
|
|
|
|
import "github.com/pion/mediadevices/pkg/codec"
|
|
|
|
type EncodedBuffer struct {
|
|
Data []byte
|
|
Samples uint32
|
|
}
|
|
|
|
type EncodedReadCloser interface {
|
|
Read() (EncodedBuffer, func(), error)
|
|
Close() error
|
|
codec.Controllable
|
|
}
|
|
|
|
type encodedReadCloserImpl struct {
|
|
readFn func() (EncodedBuffer, func(), error)
|
|
closeFn func() error
|
|
controllerFn func() codec.EncoderController
|
|
}
|
|
|
|
func (r *encodedReadCloserImpl) Read() (EncodedBuffer, func(), error) {
|
|
return r.readFn()
|
|
}
|
|
|
|
func (r *encodedReadCloserImpl) Close() error {
|
|
return r.closeFn()
|
|
}
|
|
|
|
func (r *encodedReadCloserImpl) Controller() codec.EncoderController {
|
|
return r.controllerFn()
|
|
}
|
|
|
|
type encodedIOReadCloserImpl struct {
|
|
readFn func([]byte) (int, error)
|
|
closeFn func() error
|
|
controller func() codec.EncoderController
|
|
}
|
|
|
|
func newEncodedIOReadCloserImpl(reader EncodedReadCloser) *encodedIOReadCloserImpl {
|
|
var encoded EncodedBuffer
|
|
release := func() {}
|
|
return &encodedIOReadCloserImpl{
|
|
readFn: func(b []byte) (int, error) {
|
|
var err error
|
|
|
|
if len(encoded.Data) == 0 {
|
|
release()
|
|
encoded, release, err = reader.Read()
|
|
if err != nil {
|
|
reader.Close()
|
|
return 0, err
|
|
}
|
|
}
|
|
|
|
n := copy(b, encoded.Data)
|
|
encoded.Data = encoded.Data[n:]
|
|
return n, nil
|
|
},
|
|
closeFn: reader.Close,
|
|
controller: reader.Controller,
|
|
}
|
|
}
|
|
|
|
func (r *encodedIOReadCloserImpl) Read(b []byte) (int, error) {
|
|
return r.readFn(b)
|
|
}
|
|
|
|
func (r *encodedIOReadCloserImpl) Close() error {
|
|
return r.closeFn()
|
|
}
|
|
|
|
func (r *encodedIOReadCloserImpl) Controller() codec.EncoderController {
|
|
return r.controller()
|
|
}
|