mirror of
https://github.com/pion/mediadevices.git
synced 2026-04-23 00:07:29 +08:00
Convert video APIs to use video.Reader
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user