Skip to content

Commit

Permalink
support creation of pixelbuffer from texture region
Browse files Browse the repository at this point in the history
  • Loading branch information
s1ddok committed Sep 7, 2022
1 parent 54f20bf commit 72c4ddc
Showing 1 changed file with 8 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -54,37 +54,37 @@ public extension MTLContext {

public extension MTLTexture {

var pixelBuffer: CVPixelBuffer? {
func pixelBuffer(region: MTLRegion? = nil) throws -> CVPixelBuffer {
guard let cvPixelFormat = self.pixelFormat
.compatibleCVPixelFormat
else { return nil }
else { throw MetalError.MTLTextureError.imageIncompatiblePixelFormat }

var pb: CVPixelBuffer? = nil
var status = CVPixelBufferCreate(nil,
self.width,
self.height,
region?.size.width ?? self.width,
region?.size.height ?? self.height,
cvPixelFormat,
nil,
&pb)
guard status == kCVReturnSuccess,
let pixelBuffer = pb
else { return nil }
else { throw MetalError.MTLTextureError.pixelBufferConversionFailed }

status = CVPixelBufferLockBaseAddress(pixelBuffer, [])
guard status == kCVReturnSuccess,
let pixelBufferBaseAdress = CVPixelBufferGetBaseAddress(pixelBuffer)
else { return nil }
else { throw MetalError.MTLTextureError.pixelBufferConversionFailed }

let bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer)

self.getBytes(pixelBufferBaseAdress,
bytesPerRow: bytesPerRow,
from: self.region,
from: region ?? self.region,
mipmapLevel: 0)

status = CVPixelBufferUnlockBaseAddress(pixelBuffer, [])
guard status == kCVReturnSuccess
else { return nil }
else { throw MetalError.MTLTextureError.pixelBufferConversionFailed }

return pixelBuffer
}
Expand Down

0 comments on commit 72c4ddc

Please sign in to comment.