iosobjective-cswiftmetalcore-video

Cant get a valid MTLTexture from CVMetalTextureGetTexture function


I am new to metal. I want to make MTLTexture from CVImageBufferRef. I am using following code sample to do that.

guard
        let unwrappedImageTexture = imageTexture,
        let texture = CVMetalTextureGetTexture(unwrappedImageTexture),
        result == kCVReturnSuccess
    else {
        throw MetalCameraSessionError.failedToCreateTextureFromImage
    }

Here, imageTexture:CVMetalTexture. Here is my code in Obj C.

CVMetalTextureRef inputTexture;
NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey;
NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];
AVAssetReaderTrackOutput track = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:video
                                                        outputSettings:@{
                                                            (NSString *)kCVPixelBufferMetalCompatibilityKey: @YES,
                                                            key:value
                                                        }];
sampleBuffer = [track copyNextSampleBuffer];
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
if(kCVReturnSuccess != CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, _context.textureCache , imageBuffer, NULL, MTLPixelFormatBGRA8Unorm, width, height, 0, &inputTexture)){
    __VMLog(@"Texture Creation Error");
}

id<MTLTexture> it = CVMetalTextureGetTexture(inputTexture); //Returns nil

I am always getting nil on my MTLTexture variable. Even Texture creation error is not happening. but MTLTexture is not generated.


Solution

  • I found out the solution. Seems like it needs an array of id to get MTLTexture.

        //Wrong approach
        id<MTLTexture> it = CVMetalTextureGetTexture(inputTexture);
    
        //Right approach
        id<MTLTexture> it[1];
        it[0] = CVMetalTextureGetTexture(inputTexture);