0

Now I am trying to convert pixelBuffer to CIImage, but fails.

When pixelBuffer type is kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, the following code can be executed without errors.

let sourceImage = CIImage.init(cvPixelBuffer: imageBuffer, options: nil)

However when pixelBuffer type is kCVPixelFormatType_420YpCbCr8Planar, it fails.

The log is as follows.

[api] -[CIImage initWithCVPixelBuffer:options:] failed because its pixel format y420 is not supported.

Therefore, I want to know how to convert pixelBuffer type or to convert pixelBuffer(kCVPixelFormatType_420YpCbCr8Planar) to CIImage.

Please teach me.

1 Answers1

0

Check out vImageConverter

With this you can convert to ARGB8888 vImageConvert_420Yp8_CbCr8ToARGB8888 and muss create a vImage_Buffer

Example for conversion matrix

/// This is the YCbCr to RGB conversion opaque object used by the convert function.
private var conversionMatrix: vImage_YpCbCrToARGB = {
    var pixelRange = vImage_YpCbCrPixelRange(Yp_bias: 0, CbCr_bias: 128, YpRangeMax: 255, CbCrRangeMax: 255, YpMax: 255, YpMin: 1, CbCrMax: 255, CbCrMin: 0)
    var matrix = vImage_YpCbCrToARGB()
    vImageConvert_YpCbCrToARGB_GenerateConversion(kvImage_YpCbCrToARGBMatrix_ITU_R_709_2, &pixelRange, &matrix, kvImage420Yp8_CbCr8, kvImageARGB8888, UInt32(kvImageNoFlags))
    return matrix
}()

Example code: CapturedImageSampler.swift

ZanderCodes
  • 122
  • 9