How to convert MTLTexture to CVMetalTextureRef or CMSampleBufferRef to Metal?

I ran into a problem converting MTLTexture to CVMetalTextureRef or CVPixelBufferRef, my code is this:

CVPixelBufferLockBaseAddress(_screenPixelBuffer, 0);//必须锁定内存

    id <MTLTexture> outputTexture = drawable.texture;

    MTLRegion region = MTLRegionMake2D(0, 0, drawable.layer.drawableSize.width, drawable.layer.drawableSize.height);

    int bytesPerPixel = 4;
    int bytesPerRow = bytesPerPixel * drawable.layer.drawableSize.width;

    NSLog(@"drawable.layer.drawableSize.width = %f, drawable.layer.drawableSize.height = %f", drawable.layer.drawableSize.width, drawable.layer.drawableSize.height);
    NSLog(@"textureType = %lu, width = %lu, height = %lu, depth = %lu, arrayLength = %lu, mipmapLevelCount = %lu, sampleCount = %lu", outputTexture.textureType, outputTexture.width, outputTexture.height, outputTexture.depth, outputTexture.arrayLength, outputTexture.mipmapLevelCount, outputTexture.sampleCount);

    void *tmpBuffer = CVPixelBufferGetBaseAddress(_screenPixelBuffer);

    [outputTexture getBytes:tmpBuffer bytesPerRow:bytesPerRow fromRegion:region mipmapLevel:0];


    [_iv setImage:[self imageFromPixelBuffer:_screenPixelBuffer]];

    CVPixelBufferUnlockBaseAddress(_screenPixelBuffer, 0);//解锁内存

But the image displayed by UIImageview is incorrect. Full code here .

+4
source share

Source: https://habr.com/ru/post/1598885/


All Articles