CVPixelBufferLockBaseAddress почему? Захват неподвижных изображений с помощью AVFoundation


Я пишу приложение для iPhone, которое создает неподвижные изображения с камеры с помощью AVFoundation. Читая руководство по программированию, я нашел код, который мне почти нужен, поэтому я пытаюсь «произвести обратный инжиниринг» и понять его.
У меня возникли некоторые трудности с пониманием той части, которая преобразует CMSampleBuffer в изображение.
Вот что я понял, а затем и код.
CMSampleBuffer представляет собой буфер в памяти, где хранится изображение с дополнительными данными. Позже я вызываю функцию CMSampleBufferGetImageBuffer (), чтобы получить обратно CVImageBuffer только с данными изображения.
Теперь есть функция, которую я не понял и могу только представить ее функцию: CVPixelBufferLockBaseAddress (imageBuffer, 0); Я не могу понять, является ли это «блокировкой потока», чтобы избежать множественных операций с ним, или блокировкой адреса буфера, чтобы избежать изменений во время работы (и почему он должен меняться? .. другой кадр, данные не копируются в другом месте?). Остальной код мне понятен.
Пытался поискать в Google, но ничего полезного не нашел.
Может кто-нибудь принести свет?

-(UIImage*) getUIImageFromBuffer:(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); 

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);
}

Спасибо, Andrea

7
задан Andrea 24 June 2011 в 21:10
поделиться