Increase performance of YCbCr and RGBA encoding
This commit is contained in:
parent
9badc7c997
commit
478f64d264
63
avif.go
63
avif.go
|
@ -154,19 +154,56 @@ func Encode(w io.Writer, m image.Image, o *Options) error {
|
||||||
defer C.free(dataPtr)
|
defer C.free(dataPtr)
|
||||||
data := (*[1 << 30]byte)(dataPtr)[:dataSize:dataSize]
|
data := (*[1 << 30]byte)(dataPtr)[:dataSize:dataSize]
|
||||||
|
|
||||||
yPos := 0
|
switch img := m.(type) {
|
||||||
uPos := ySize
|
case *image.YCbCr:
|
||||||
for j := rec.Min.Y; j < rec.Max.Y; j++ {
|
yPos := 0
|
||||||
for i := rec.Min.X; i < rec.Max.X; i++ {
|
uPos := ySize
|
||||||
r16, g16, b16, _ := m.At(i, j).RGBA()
|
for y := rec.Min.Y; y < rec.Max.Y; y++ {
|
||||||
y, u, v := rgb2yuv(r16, g16, b16)
|
for x := rec.Min.X; x < rec.Max.X; x++ {
|
||||||
data[yPos] = y
|
r, g, b, _ := img.At(x, y).RGBA()
|
||||||
yPos++
|
Y, u, v := rgb2yuv(r, g, b)
|
||||||
// TODO(Kagami): Resample chroma planes with some better filter.
|
data[yPos] = Y
|
||||||
if (i-rec.Min.X)&1 == 0 && (j-rec.Min.Y)&1 == 0 {
|
yPos++
|
||||||
data[uPos] = u
|
// TODO(Kagami): Resample chroma planes with some better filter.
|
||||||
data[uPos+uSize] = v
|
if (x-rec.Min.X)&1 == 0 && (y-rec.Min.Y)&1 == 0 {
|
||||||
uPos++
|
data[uPos] = u
|
||||||
|
data[uPos+uSize] = v
|
||||||
|
uPos++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case *image.RGBA:
|
||||||
|
yPos := 0
|
||||||
|
uPos := ySize
|
||||||
|
for y := rec.Min.Y; y < rec.Max.Y; y++ {
|
||||||
|
for x := rec.Min.X; x < rec.Max.X; x++ {
|
||||||
|
r, g, b, _ := img.RGBAAt(x, y).RGBA()
|
||||||
|
Y, u, v := rgb2yuv(r, g, b)
|
||||||
|
data[yPos] = Y
|
||||||
|
yPos++
|
||||||
|
// TODO(Kagami): Resample chroma planes with some better filter.
|
||||||
|
if (x-rec.Min.X)&1 == 0 && (y-rec.Min.Y)&1 == 0 {
|
||||||
|
data[uPos] = u
|
||||||
|
data[uPos+uSize] = v
|
||||||
|
uPos++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
yPos := 0
|
||||||
|
uPos := ySize
|
||||||
|
for j := rec.Min.Y; j < rec.Max.Y; j++ {
|
||||||
|
for i := rec.Min.X; i < rec.Max.X; i++ {
|
||||||
|
r16, g16, b16, _ := img.At(i, j).RGBA()
|
||||||
|
y, u, v := rgb2yuv(r16, g16, b16)
|
||||||
|
data[yPos] = y
|
||||||
|
yPos++
|
||||||
|
// TODO(Kagami): Resample chroma planes with some better filter.
|
||||||
|
if (i-rec.Min.X)&1 == 0 && (j-rec.Min.Y)&1 == 0 {
|
||||||
|
data[uPos] = u
|
||||||
|
data[uPos+uSize] = v
|
||||||
|
uPos++
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue