2016-05-24 10 views
1

Мне нужно создать копию CVPixelBufferRef, чтобы иметь возможность манипулировать исходным буфером пикселей по-разному, используя значения из копии. Кажется, я не могу это сделать с CVPixelBufferCreate или с CVPixelBufferCreateWithBytes.Duplicate/Copy CVPixelBufferRef с CVPixelBufferCreate

Согласно this question, это также возможно сделать с помощью memcpy(). Однако нет никаких объяснений относительно того, как это будет достигнуто, и какие вызовы библиотеки Core Video будут необходимы независимо.

+0

Не можете вы просто 'memcpy' данные где-то еще? – jtbandes

+0

Это на самом деле то, что я имел в виду с «более простым способом», однако я не нашел примеров того, как это сделать, и я достаточно программирую на программирование C. Я бы просто определил новый пиксельный буфер 'CVPixelBufferRef newPixelBuffer = NULL', а затем использовал memcpy()? –

+0

Нет, вы просто хотите скопировать данные пикселя, а не копировать любую внутреннюю структуру, которую имеет CVPixelBufferRef. См. Документацию для CVPixelBufferGetBaseAddress. – jtbandes

ответ

3

Это похоже на работу:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { 

    CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

    // Get pixel buffer info 
    const int kBytesPerPixel = 4; 
    CVPixelBufferLockBaseAddress(pixelBuffer, 0); 
    int bufferWidth = (int)CVPixelBufferGetWidth(pixelBuffer); 
    int bufferHeight = (int)CVPixelBufferGetHeight(pixelBuffer); 
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer); 
    uint8_t *baseAddress = CVPixelBufferGetBaseAddress(pixelBuffer); 

    // Copy the pixel buffer 
    CVPixelBufferRef pixelBufferCopy = NULL; 
    CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, bufferWidth, bufferHeight, kCVPixelFormatType_32BGRA, NULL, &pixelBufferCopy); 
    CVPixelBufferLockBaseAddress(pixelBufferCopy, 0); 
    uint8_t *copyBaseAddress = CVPixelBufferGetBaseAddress(pixelBufferCopy); 
    memcpy(copyBaseAddress, baseAddress, bufferHeight * bytesPerRow); 

    // Do what needs to be done with the 2 pixel buffers 

} 
+0

kBytesPerPixel не используется и не нужен – tmm1

+0

Это не работает? Выходное изображение искажено. –