У меня есть использование проблемы CGBitmapContextCreateImage в моем приложении для iPhone.
Я использую Платформу Основы AV для захвата кадров камеры с помощью этого метода:
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer,0);
uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
CGImageRef newImage = CGBitmapContextCreateImage(newContext);
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
CGContextRelease(newContext);
CGColorSpaceRelease(colorSpace);
UIImage *image= [UIImage imageWithCGImage:newImage scale:1.0 orientation:UIImageOrientationRight];
self.imageView.image = image;
CGImageRelease(newImage);
}
Однако я вижу ошибку в консоли отладки как ее выполнения:
<Error>: CGDataProviderCreateWithCopyOfData: vm_copy failed: status 2.
Кто-либо когда-либо видел это? Путем комментирования строк я сузился, проблема намечают к:
CGImageRef newImage = CGBitmapContextCreateImage(newContext);
но я не уверен, как избавиться от него. Функционально, это работает отлично. Так ясно CGImage создается, но я должен знать то, что вызывает ошибку, таким образом, это не влияет на другие части.
Большое спасибо. Любая справка/совет была бы большой! Brett
Отказ от ответственности: это чистое предположение. Больше нет.
vm_copy ()
- это вызов ядра для копирования виртуальной памяти из одного места в другое ( справочная страница ).
Возвращаемое значение - KERN_PROTECTION_FAILURE, «Исходная область защищена от чтения или целевая область защищена от записи».
По какой-то причине CGDataProviderCreateWithCopyOfData вызывает это, чтобы скопировать часть памяти, и терпит неудачу. возможно он просто сначала пробует vm_copy как быстрый метод, а затем возвращается к более медленному методу (поскольку вы говорите, что все работает).
Если вы malloc
фрагмент памяти, запишите память из baseAddress в свою собственную память и используйте ее для создания изображения, предупреждение исчезнет. Итак:
uint8_t *tmp = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer);
int bytes = ... // determine number of bytes from height * bytesperrow
uint8_t *baseAddress = malloc(bytes);
memcpy(baseAddress,tmp,bytes);
// unlock the memory, do other stuff, but don't forget:
free(baseAddress);