mirror of
https://github.com/pion/mediadevices.git
synced 2026-04-23 00:07:29 +08:00
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:
+1
-35
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user