Add ToI420 converter

Moved I420 converter from vpx.go, converted video.Reader in openh264.go
and created ToI420 to convert a video.Reader to a new video.Reader that
will emit images in I420 format.
This commit is contained in:
Lukas Herman
2020-02-08 23:05:21 -08:00
parent 2fd3907305
commit 152f15526b
3 changed files with 56 additions and 38 deletions
+1 -35
View File
@@ -98,7 +98,7 @@ func newEncoder(r video.Reader, p prop.Video, codecIface *C.vpx_codec_iface_t) (
return nil, fmt.Errorf("vpx_codec_enc_init failed (%d)", ec)
}
return &encoder{
r: r,
r: video.ToI420(r),
codec: codec,
raw: rawNoBuffer,
keyframeInterval: 30, // TODO: Set via prop.Video
@@ -126,40 +126,6 @@ func (e *encoder) Read(p []byte) (int, error) {
e.raw.stride[0] = C.int(yuvImg.YStride)
e.raw.stride[1] = C.int(yuvImg.CStride)
e.raw.stride[2] = C.int(yuvImg.CStride)
h := yuvImg.Rect.Max.Y - yuvImg.Rect.Min.Y
// Covert pixel format to I420
// TODO: maybe better to move it to a proper module
switch yuvImg.SubsampleRatio {
case image.YCbCrSubsampleRatio444:
for i := 0; i < h/2; i++ {
addrSrc := i * 2 * yuvImg.CStride
addrDst := i * yuvImg.CStride / 2
for j := 0; j < yuvImg.CStride/2; j++ {
cb := uint16(yuvImg.Cb[addrSrc+j]) + uint16(yuvImg.Cb[addrSrc+yuvImg.CStride+j]) +
uint16(yuvImg.Cb[addrSrc+j+1]) + uint16(yuvImg.Cb[addrSrc+yuvImg.CStride+j+1])
cr := uint16(yuvImg.Cr[addrSrc+j]) + uint16(yuvImg.Cr[addrSrc+yuvImg.CStride+j]) +
uint16(yuvImg.Cr[addrSrc+j+1]) + uint16(yuvImg.Cr[addrSrc+yuvImg.CStride+j+1])
yuvImg.Cb[addrDst+j] = uint8(cb / 4)
yuvImg.Cr[addrDst+j] = uint8(cr / 4)
}
}
yuvImg.CStride = yuvImg.CStride / 2
case image.YCbCrSubsampleRatio422:
for i := 0; i < h/2; i++ {
addrSrc := i * 2 * yuvImg.CStride
addrDst := i * yuvImg.CStride
for j := 0; j < yuvImg.CStride; j++ {
cb := uint16(yuvImg.Cb[addrSrc+j]) + uint16(yuvImg.Cb[addrSrc+yuvImg.CStride+j])
cr := uint16(yuvImg.Cr[addrSrc+j]) + uint16(yuvImg.Cr[addrSrc+yuvImg.CStride+j])
yuvImg.Cb[addrDst+j] = uint8(cb / 2)
yuvImg.Cr[addrDst+j] = uint8(cr / 2)
}
}
case image.YCbCrSubsampleRatio420:
default:
return 0, fmt.Errorf("unsupported pixel format: %s", yuvImg.SubsampleRatio)
}
var flags int
if e.frameIndex%e.keyframeInterval == 0 {