title: kCVPixelFormatType_420YpCbCr8BiPlanarFullRange frame to UIImage conversion
body: <p>I have an app that capture live video in kCVPixelFormatType_420YpCbCr8BiPlanarFullRange format to process Y channel. According to Apple's documentation:</p>
  
  <blockquote>
    <p>kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
    Bi-Planar Component Y'CbCr 8-bit 4:2:0, full-range (luma=[0,255] chroma=[1,255]). baseAddr points to a big-endian CVPlanarPixelBufferInfo_YCbCrBiPlanar struct.</p>
  </blockquote>
  
  <p>I want to present some of these frames in a UIViewController, is there any API to make the conversion to kCVPixelFormatType_32BGRA format? Can you give some hint to tune this method provided by Apple?</p>
  
  <pre><code>// Create a UIImage from sample buffer data
  - (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer  {
      // Get a CMSampleBuffer's Core Video image buffer for the media data
      CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
      // Lock the base address of the pixel buffer
      CVPixelBufferLockBaseAddress(imageBuffer, 0);
  
      // Get the number of bytes per row for the pixel buffer
      void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
  
      // Get the number of bytes per row for the pixel buffer
      size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
      // Get the pixel buffer width and height
      size_t width = CVPixelBufferGetWidth(imageBuffer);
      size_t height = CVPixelBufferGetHeight(imageBuffer);
  
      // Create a device-dependent RGB color space
      CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  
      // Create a bitmap graphics context with the sample buffer data
      CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8,
                                                   bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
      // Create a Quartz image from the pixel data in the bitmap graphics context
      CGImageRef quartzImage = CGBitmapContextCreateImage(context);
      // Unlock the pixel buffer
      CVPixelBufferUnlockBaseAddress(imageBuffer,0);
  
      // Free up the context and color space
      CGContextRelease(context);
      CGColorSpaceRelease(colorSpace);
  
      // Create an image object from the Quartz image
      UIImage *image = [UIImage imageWithCGImage:quartzImage];
  
      // Release the Quartz image
      CGImageRelease(quartzImage);
  
      return (image);
  }
  </code></pre>
  
  <p>Thank you!</p>