Add MultiCamCaptureSetting#cornerRadius option.

This commit is contained in:
shogo4405
2022-12-04 22:26:43 +09:00
parent cb22d0edb1
commit 7b658fbe37
13 changed files with 151 additions and 121 deletions
@@ -102,7 +102,7 @@ extension CMSampleBuffer {
return self
}
func over(_ sampleBuffer: CMSampleBuffer?, regionOfInterest roi: CGRect = .zero) -> CMSampleBuffer {
func over(_ sampleBuffer: CMSampleBuffer?, regionOfInterest roi: CGRect = .zero, radius: CGFloat = 0.0) -> CMSampleBuffer {
guard var inputImageBuffer = vImage_Buffer(cvPixelBuffer: sampleBuffer?.imageBuffer, format: &CMSampleBuffer.format) else {
return self
}
@@ -118,12 +118,13 @@ extension CMSampleBuffer {
let xScale = Float(roi.width) / Float(inputImageBuffer.width)
let yScale = Float(roi.height) / Float(inputImageBuffer.height)
let scaleFactor = (xScale < yScale) ? xScale : yScale
var scaledInputImageBuffer = inputImageBuffer.scale(scaleFactor )
var scaledInputImageBuffer = inputImageBuffer.scale(scaleFactor)
scaledInputImageBuffer.cornerRadius(radius)
defer {
scaledInputImageBuffer.free()
}
_ = srcImageBuffer.over(&scaledInputImageBuffer, origin: roi.origin)
_ = srcImageBuffer.copy(to: imageBuffer, format: &CMSampleBuffer.format)
srcImageBuffer.over(&scaledInputImageBuffer, origin: roi.origin)
srcImageBuffer.copy(to: imageBuffer, format: &CMSampleBuffer.format)
return self
}
@@ -179,7 +180,7 @@ extension CMSampleBuffer {
vImage_Flags(kvImageLeaveAlphaUnchanged)) == kvImageNoError else {
return
}
_ = destinationBuffer.copy(to: imageBuffer, format: &CMSampleBuffer.format)
destinationBuffer.copy(to: imageBuffer, format: &CMSampleBuffer.format)
}
#endif
}
@@ -33,6 +33,7 @@ extension vImage_Buffer {
}
}
@discardableResult
mutating func copy(to cvPixelBuffer: CVPixelBuffer, format: inout vImage_CGImageFormat) -> vImage_Error {
let cvImageFormat = vImageCVImageFormat_CreateWithCVPixelBuffer(cvPixelBuffer).takeRetainedValue()
vImageCVImageFormat_SetColorSpace(cvImageFormat, CGColorSpaceCreateDeviceRGB())
@@ -45,6 +46,7 @@ extension vImage_Buffer {
vImage_Flags(kvImageNoFlags))
}
@discardableResult
mutating func scale(_ factor: Float) -> Self {
var imageBuffer = vImage_Buffer()
guard vImageBuffer_Init(
@@ -65,6 +67,35 @@ extension vImage_Buffer {
return imageBuffer
}
@discardableResult
mutating func cornerRadius(_ radius: CGFloat) -> Self {
guard 0 < radius else {
return self
}
let buffer = data.assumingMemoryBound(to: Pixel_8.self)
for x in 0 ..< Int(width) {
for y in 0 ..< Int(height) {
let index = y * rowBytes + x * 4
var dx = CGFloat(min(x, Int(width) - x))
var dy = CGFloat(min(y, Int(height) - y))
if dx == 0 && dy == 0 {
buffer[index] = 0
continue
}
if radius < dx || radius < dy {
continue
}
dx = radius - dx
dy = radius - dy
if radius < round(sqrt(dx * dx + dy * dy)) {
buffer[index] = 0
}
}
}
return self
}
@discardableResult
mutating func over(_ src: inout vImage_Buffer, origin: CGPoint = .zero) -> Self {
let start = Int(origin.y) * rowBytes + Int(origin.x) * 4
var destination = vImage_Buffer(