4

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

0 に答える 0