Convert video APIs to use video.Reader

This commit is contained in:
Lukas Herman
2020-01-21 23:11:24 -08:00
parent 3671db8e62
commit e1365d8811
9 changed files with 135 additions and 96 deletions
+33 -6
View File
@@ -11,7 +11,10 @@ import "C"
import (
"fmt"
"io"
"github.com/pion/mediadevices/pkg/codec"
mio "github.com/pion/mediadevices/pkg/io"
"github.com/pion/mediadevices/pkg/io/video"
"github.com/pion/webrtc/v2"
"image"
"unsafe"
@@ -19,16 +22,17 @@ import (
type encoder struct {
engine *C.Encoder
r video.Reader
buff []byte
}
var _ codec.VideoEncoder = &encoder{}
var _ codec.VideoEncoderBuilder = codec.VideoEncoderBuilder(NewEncoder)
func init() {
codec.Register(webrtc.H264, codec.VideoEncoderBuilder(NewEncoder))
}
func NewEncoder(s codec.VideoSetting) (codec.VideoEncoder, error) {
func NewEncoder(r video.Reader, s codec.VideoSetting) (io.ReadCloser, error) {
cEncoder, err := C.enc_new(C.EncoderOptions{
width: C.int(s.Width),
height: C.int(s.Height),
@@ -41,10 +45,27 @@ func NewEncoder(s codec.VideoSetting) (codec.VideoEncoder, error) {
return nil, fmt.Errorf("failed in creating encoder")
}
return &encoder{cEncoder}, nil
return &encoder{
engine: cEncoder,
r: r,
}, nil
}
func (e *encoder) Encode(img image.Image) ([]byte, error) {
func (e *encoder) Read(p []byte) (n int, err error) {
if e.buff != nil {
n, err = mio.Copy(p, e.buff)
if err == nil {
e.buff = nil
}
return n, err
}
img, err := e.r.Read()
if err != nil {
return 0, err
}
// TODO: Convert img to YCbCr since openh264 only accepts YCbCr
// TODO: Convert img to 4:2:0 format which what openh264 accepts
yuvImg := img.(*image.YCbCr)
@@ -58,10 +79,16 @@ func (e *encoder) Encode(img image.Image) ([]byte, error) {
})
if err != nil {
// TODO: better error message
return nil, fmt.Errorf("failed in encoding")
return 0, fmt.Errorf("failed in encoding")
}
return C.GoBytes(unsafe.Pointer(s.data), s.data_len), nil
encoded := C.GoBytes(unsafe.Pointer(s.data), s.data_len)
n, err = mio.Copy(p, encoded)
if err != nil {
e.buff = encoded
}
return n, err
}
func (e *encoder) Close() error {