diff --git a/pkg/codec/openh264/openh264.go b/pkg/codec/openh264/openh264.go index 4a2e5a3..cd6c810 100644 --- a/pkg/codec/openh264/openh264.go +++ b/pkg/codec/openh264/openh264.go @@ -13,6 +13,7 @@ import ( "fmt" "image" "io" + "sync" "unsafe" "github.com/pion/mediadevices/pkg/codec" @@ -27,6 +28,9 @@ type encoder struct { engine *C.Encoder r video.Reader buff []byte + + mu sync.Mutex + closed bool } var _ codec.VideoEncoderBuilder = codec.VideoEncoderBuilder(NewEncoder) @@ -58,6 +62,13 @@ func NewEncoder(r video.Reader, p prop.Media) (io.ReadCloser, error) { } func (e *encoder) Read(p []byte) (n int, err error) { + e.mu.Lock() + defer e.mu.Unlock() + + if e.closed { + return 0, io.EOF + } + if e.buff != nil { n, err = mio.Copy(p, e.buff) if err == nil { @@ -96,6 +107,11 @@ func (e *encoder) Read(p []byte) (n int, err error) { } func (e *encoder) Close() error { + e.mu.Lock() + defer e.mu.Unlock() + + e.closed = true + C.enc_free(e.engine) return nil } diff --git a/pkg/codec/vpx/vpx.go b/pkg/codec/vpx/vpx.go index b9ea017..b0d9aec 100644 --- a/pkg/codec/vpx/vpx.go +++ b/pkg/codec/vpx/vpx.go @@ -51,6 +51,7 @@ import ( "fmt" "image" "io" + "sync" "time" "unsafe" @@ -72,6 +73,9 @@ type encoder struct { tStart int tLastFrame int frame []byte + + mu sync.Mutex + closed bool } func init() { @@ -139,6 +143,13 @@ func newEncoder(r video.Reader, p prop.Media, codecIface *C.vpx_codec_iface_t) ( } func (e *encoder) Read(p []byte) (int, error) { + e.mu.Lock() + defer e.mu.Unlock() + + if e.closed { + return 0, io.EOF + } + if e.buff != nil { n, err := mio.Copy(p, e.buff) if err == nil { @@ -204,6 +215,11 @@ func (e *encoder) Read(p []byte) (int, error) { } func (e *encoder) Close() error { + e.mu.Lock() + defer e.mu.Unlock() + + e.closed = true + C.free(unsafe.Pointer(e.raw)) defer C.free(unsafe.Pointer(e.codec))