¿Cuál es la forma más eficiente de mostrar CVImageBufferRef en iOS?

Tengo CMSampleBufferRef (s) que decodifico usando VTDecompressionSessionDecodeFrame, lo que da como resultado CVImageBufferRef una vez que se ha completado la deencoding de un marco, por lo que mis preguntas son …

¿Cuál sería la forma más eficiente de mostrar estos CVImageBufferRefs en UIView?

He logrado convertir CVImageBufferRef a CGImageRef y mostrarlos mediante la configuration CGImageRef como contenido de CALayer, pero luego DecompressionSession se ha configurado con @ {(id) kCVPixelBufferPixelFormatTypeKey: [NSNumber numberWithInt: kCVPixelFormatType_32BGRA]};

Aquí hay un ejemplo / código de cómo he convertido CVImageBufferRef a CGImageRef (nota: los datos cvpixelbuffer deben estar en formatting 32BGRA para que esto funcione)

CVPixelBufferLockBaseAddress(cvImageBuffer,0); // get image properties uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(cvImageBuffer); size_t bytesPerRow = CVPixelBufferGetBytesPerRow(cvImageBuffer); size_t width = CVPixelBufferGetWidth(cvImageBuffer); size_t height = CVPixelBufferGetHeight(cvImageBuffer); /*Create a CGImageRef from the CVImageBufferRef*/ CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef cgContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); CGImageRef cgImage = CGBitmapContextCreateImage(cgContext); // release context and colorspace CGContextRelease(cgContext); CGColorSpaceRelease(colorSpace); // now CGImageRef can be displayed either by setting CALayer content // or by creating a [UIImage withCGImage:geImage] that can be displayed on // UIImageView ... 

La session # WWDC14 513 ( https://developer.apple.com/videos/wwdc/2014/#513 ) sugiere que se puede evitar la conversión de espacio de colors YUV -> RGB (usando CPU?) Y si se usa la magia GLES con capacidad de YUV – ¿Se pregunta qué podría ser y cómo podría lograrse esto?

Apple's iOS SampleCode GLCameraRipple muestra un ejemplo de visualización de YUV CVPixelBufferRef capturado desde la camera usando 2 OpenGLES con texturas separadas para componentes Y y UV y un fragment de progtwig de sombreado que realiza los cálculos de conversión del espacio de colors YUV a RGB usando GPU – ¿Hay alguna manera más directa de cómo se puede hacer esto?

NOTA: en mi caso de uso, no puedo usar AVSampleBufferDisplayLayer, debido a la forma en que la input a la descompression está disponible.

Si obtiene su CVImageBufferRef de CMSampleBufferRef , que está recibiendo desde captureOutput:didOutputSampleBuffer:fromConnection: no necesita realizar esa conversión y puede get directamente imageData de CMSampleBufferRef . Aquí está el código:

 NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:sampleBuffer]; UIImage *frameImage = [UIImage imageWithData:imageData]; 

La descripción de la API no proporciona ninguna información sobre si su 32BGRA es compatible o no, y produce imageData, junto con cualquier metadatos, en formatting jpeg sin aplicar ninguna compression. Si su objective es mostrar la image en la pantalla o usarla con UIImageView , esta es la manera rápida.