2014-06-24 8 views
6

w Objective-C można łatwo rzucić CVImageBufferRef jako CVPixelBufferRef:Swift - Jak rzucić CVImageBufferRef jako CVPixelBufferRef

CMSampleBufferRef sampleBuffer = some value 

CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

Jak mogę to zrobić w systemie SWIFT?


var pixelBuffer : CVPixelBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer) 

daje błąd: 'niezarządzalny <CVPixelBufferRef>' nie jest wymienialny na 'CVPixelBufferRef'


var pixelBuffer : CVPixelBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer).takeRetainedValue() 

daje błąd: 'CVImageBuffer' nie jest wymienialny na „CVPixelBufferRef "


var pixelBuffer : CVPixelBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer).takeRetainedValue() as CVPixelBufferRef 

daje błąd: nie można przekonwertować typu 'CVPixelBufferRef' wyrażenie, aby wpisać 'CVPixelBufferRef'

Odpowiedz

11

EDIT

Ta odpowiedź została podana w trakcie okresu testowego Swift beta. Wydaje się, że obecnie rozwiązanie jest prostsze, jak sugeruje Klinger

var pixelBuffer : CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) 

jednak zostawię poprzednią odpowiedź ze względów historycal :-)

poprzednią odpowiedź

spojrzeć na prerelease docs:

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html#//apple_ref/doc/uid/TP40014216-CH6-XID_40

Konkretnie to oświadczenie

Remapped Types

When Swift imports Core Foundation types, the compiler remaps the names of these types. The compiler removes Ref from the end of each type name because all Swift classes are reference types, therefore the suffix is redundant.

The Core Foundation CFTypeRef type completely remaps to the AnyObject type. Wherever you would use CFTypeRef, you should now use AnyObject in your code.

Pierwszą rzeczą, którą chcesz zrobić, to usunąć "ref" z każdego rodzaju. Jednak nie jest to konieczne, ponieważ "refs" są z natury rzeczy typowe dla typów "non-ref".

Następnie to oświadczenie powinno zadziałać. To może potrzebować strojenie przed Nigdy nie pracowałem z CMSampleBufferGetImageBuffer, i z tego powodu nie jestem pewien co do pierwszej linii (zainicjować bufor)

var buf : CMSampleBuffer = // initialize the buffer 
    var anUnmanaged : Unmanaged<CVImageBuffer> = CMSampleBufferGetImageBuffer(buf) 
    var returnValue = anUnmanaged.takeUnretainedValue() 

Lub krótko

var buf : CMSampleBuffer = // initialize the buffer 
    var anUnmanaged : CVImageBuffer = CMSampleBufferGetImageBuffer(buf).takeRetainedValue() 

jednak , poprosiłeś o CVPixelBuffer. Jeśli oba typy są w pełni kompatybilne (nie znam bazowego API, więc zakładam, że rzutowanie pomiędzy CVPixelBuffer i CVImageBuffer w objc jest zawsze bezpieczne), nie ma "automatyzmu", aby to zrobić, musisz przejść przez Unsafe Wskaźnik.

Kompletny kod jest następujący:

var buf : CMSampleBuffer = // initialize the buffer 
    var anUnmanaged : Unmanaged<CVImageBuffer> = CMSampleBufferGetImageBuffer(buf) 
    var returnValue = anUnmanaged.takeUnretainedValue() 

    var anOpaque = anUnmanaged.toOpaque() 
    var pixelBuffer : CVPixelBuffer = Unmanaged<CVPixelBuffer>.fromOpaque(anOpaque).takeUnretainedValue() 

użyłem takeUnretainedValue(), która nie zużywa się liczyć zachować, ponieważ CMSampleBufferGetImageBuffer() zwraca niezatrzymany obiektowi

+0

Dziękujemy! W cel-c CVImageBufferRef jest synonimem CVPixelBufferRef, więc to doprowadzało mnie do szału. – klinger

+0

W tym przypadku proponuję złożyć wniosek o funkcję błędu, aby mieć automatyczną obsadę w przyszłym wydaniu :-) Nie wykluczam, że istnieje jakaś funkcja mostkowania między dwoma ukrytymi gdzieś typami, jednak przechodzącymi przez nieprzezroczyste wskaźnik to pierwsze rozwiązanie, które przyszło mi do głowy :-) – LombaX

1

@ rozwiązania Lombax za nie działa dla mnie w najnowszej wersji Xcode Beta5. Oto, co nie działa:

let imageBuffer : CVImageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) 
let srcPtr = Unmanaged.passUnretained(imageBuffer).toOpaque() 
let pixelBuffer = Unmanaged<CVPixelBuffer>.fromOpaque(srcPtr).takeUnretainedValue() 
5

W Xcode 6 beta 6 to w końcu działa:

var pixelBuffer : CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)