10.10 で vImage 変換ライブラリを使用して をCVPixelBufferRef
ビデオ ソースからに変換しようとしています。CGImageRef
これはほとんどの場合うまくいきます。vImage_Buffer
ただし、から新しいものを初期化するたびに、CVPixelBufferRef
返されることのないメモリがむさぼり食われます。
これは変換の簡略化されたバージョンで、理想的には 1 日の終わりにメモリを使用しないようにする必要があります。
CVPixelBufferRef pixelBuffer = ...; // retained CVPixelBufferRef from somewhere else
vImage_Buffer buffer;
vImage_CGImageFormat format = {.bitsPerComponent = 8, .bitsPerPixel = 32, .colorSpace = NULL, .bitmapInfo = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little, .version = 0, .decode = NULL, .renderingIntent = kCGRenderingIntentAbsoluteColorimetric};
vImage_Error imageError = vImageBuffer_InitWithCVPixelBuffer(&buffer, &format, pixelBuffer, NULL, NULL, kvImagePrintDiagnosticsToConsole);
// Do conversion here
free(buffer.data);
最後の 2 行 (init と free) をコメント アウトしても、最初に使用したメモリよりも多くのメモリを使用することはありません。ただし、そこに 2 行あるため、毎回 6 MB が消費されます。
のみをコメントアウトするとfree
、さらに多くのメモリが消費されているため、 free は間違いなく何かを実行していますが、想定vImageBuffer_InitWithCVPixelBuffer
よりも多くのメモリを使用しているとしか思えません。他の誰かがこれを見たことがありますか?
CVPixelBufferRef
完了するために、 toへの変換メソッド全体を次に示しますNSImage
。
CVPixelBufferRef pixelBuffer = ...; // retained CVPixelBufferRef from somewhere else
NSImage *image = nil;
vImage_Buffer buffer;
vImage_CGImageFormat format = {.bitsPerComponent = 8, .bitsPerPixel = 32, .colorSpace = NULL, .bitmapInfo = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little, .version = 0, .decode = NULL, .renderingIntent = kCGRenderingIntentAbsoluteColorimetric};
vImage_Error imageError = vImageBuffer_InitWithCVPixelBuffer(&buffer, &format, pixelBuffer, NULL, NULL, kvImagePrintDiagnosticsToConsole);
if (imageError != 0) {
NSLog(@"vImageBuffer_InitWithCVPixelBuffer Error: %zd", imageError);
} else {
CGImageRef imageRef = vImageCreateCGImageFromBuffer(&buffer, &format, NULL, NULL, kvImagePrintDiagnosticsToConsole|kvImageHighQualityResampling, &imageError);
if (!imageRef) {
NSLog(@"vImageCreateCGImageFromBuffer Error: %zd", imageError);
} else {
image = [[NSImage alloc] initWithCGImage:imageRef size:NSMakeSize(CGImageGetWidth(imageRef), CGImageGetHeight(imageRef))];
CGImageRelease(imageRef);
NSAssert(image != nil, @"Creating the image failed!");
}
}
free(buffer.data);