2016-06-30 4 views
1

Я пытаюсь сделать i420 (YCbCr планировщик) с помощью MetalKitCVMetalTextureCacheCreateTextureFromImage всегда возвращают нуль

большинство примеров использования CMSampleBuffer, которые из камеры,

, но моя цель с помощью данной i420 байт.

я сделать что-то вроде этого:

let data = NSMutableData(contentsOfURL: NSBundle.mainBundle().URLForResource("yuv_640_360", withExtension: "yuv")!) 

// Cache for Y 

CVMetalTextureCacheCreate(kCFAllocatorDefault, nil, self.device!, nil, &videoTextureCache) 

var pixelBuffer: CVPixelBuffer? 

CVPixelBufferCreateWithBytes(kCFAllocatorDefault, Int(size.width), Int(size.height), kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, data.mutableBytes, Int(size.width), nil, nil, [ 
    "kCVPixelBufferMetalCompatibilityKey": true, 
    "kCVPixelBufferOpenGLCompatibilityKey": true, 
    "kCVPixelBufferIOSurfacePropertiesKey": [] 
    ] 
    , &pixelBuffer) 

// Y texture 

var yTextureRef : Unmanaged<CVMetalTexture>? 

let yWidth = CVPixelBufferGetWidthOfPlane(pixelBuffer, 0) 

let yHeight = CVPixelBufferGetHeightOfPlane(pixelBuffer, 0) 

let result = CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, (videoTextureCache?.takeUnretainedValue())!, pixelBuffer, nil, MTLPixelFormat.R8Unorm, yWidth, yHeight, 0, &yTextureRef); 

в основном код почти так же, как и другие примеры, но я создаю свое собственное CVPixelBuffer самого.

я не получил ошибку, когда я создания CVPixelBuffer и CVMetalTexture,

но всегда возвращают нуль для yTexture.

Как создать правильный CVPixelBuffer и использовать его для рендеринга?

ответ

3

проблема решена.

Важно знать, что iosurface всегда имеет значение null, если вы создаете CVPixelBuffer с помощью CVPixelBufferCreateWithBytes или CVPixelBufferCreateWithPlanarBytes.

Как только вы используете CVPixelBuffer, iosurface имеет значение NULL, тогда MetalTexture всегда имеет значение null.

должен сделать что-то вроде этого:

let result = CVPixelBufferCreate(kCFAllocatorDefault, width, height, kCVPixelFormatType_420YpCbCr8Planar, [ 
    String(kCVPixelBufferIOSurfacePropertiesKey): [ 
     "IOSurfaceOpenGLESFBOCompatibility": true, 
     "IOSurfaceOpenGLESTextureCompatibility": true, 
     "IOSurfaceCoreAnimationCompatibility": true, 
     ] 
    ], &self.pixelBuffer) 

CVPixelBufferLockBaseAddress(self.pixelBuffer!, 0) 

for index in 0...2 { 

    memcpy(CVPixelBufferGetBaseAddressOfPlane(self.pixelBuffer!, index), planesAddress[index], planesWidth[index] * planesHeight[index]) 

} 

CVPixelBufferUnlockBaseAddress(self.pixelBuffer!, 0) 
+0

Ты спас меня там. Благодаря! – Hexagons