I’m trying to capture the back facing camera on ios to texture, basically following the code from AVFMediaTracks using a MediaTexture as shown below (full code in this gist: header, source). The code runs without errors but the texture is black. Any ideas?
void FIOSCamera::HandleSampleBuffer(CMSampleBufferRef sampleBuffer)
{
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
size_t Width = CVPixelBufferGetWidth(pixelBuffer);
size_t Height = CVPixelBufferGetHeight(pixelBuffer);
if (TextureCache == nil)
{
id<MTLDevice> MetalDevice = (id<MTLDevice>)GDynamicRHI->RHIGetNativeDevice();
CVMetalTextureCacheCreate(NULL, NULL, MetalDevice, NULL, &TextureCache);
}
CVMetalTextureRef texture = NULL;
CVReturn status = CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, TextureCache, pixelBuffer, NULL, MTLPixelFormatBGRA8Unorm_sRGB, Width, Height, 0, &texture);
if(status == kCVReturnSuccess)
{
FRHIResourceCreateInfo CreateInfo;
auto Wrapper = new FAvfTexture2DResourceWrapper(texture);
CreateInfo.BulkData = Wrapper;
CFRelease(texture);
CreateInfo.ResourceArray = nullptr;
uint32 TexCreateFlags = TexCreate_SRGB;
TexCreateFlags |= TexCreate_Dynamic | TexCreate_NoTiling;
TRefCountPtr<FRHITexture2D> ShaderResource;
ShaderResource = RHICreateTexture2D(Width, Height, PF_B8G8R8A8, 1, 1, TexCreateFlags | TexCreate_ShaderResource, CreateInfo);
if (ShaderResource)
{
VideoSink->UpdateTextureSinkResource(ShaderResource, ShaderResource);
CMTime timestamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
FTimespan DisplayTime = FTimespan::FromSeconds(CMTimeGetSeconds(timestamp));
//UE_LOG(LogTemp, Log, TEXT("Display TextureSink %d, %d"), Width, Height);
VideoSink->DisplayTextureSinkBuffer(DisplayTime);
}
else
{
UE_LOG(LogTemp, Error, TEXT("IOSCamera: Couldn't create shader resource"));
delete Wrapper;
}
}
else
{
UE_LOG(LogTemp, Error, TEXT("IOSCamera:: Couldn't get texture from cache"));
}
}