Skip to content

Instantly share code, notes, and snippets.

@rampadc
Created February 21, 2021 09:24
Show Gist options
  • Save rampadc/79c01eb3fa4eba0b941befa7c55f4e13 to your computer and use it in GitHub Desktop.
Save rampadc/79c01eb3fa4eba0b941befa7c55f4e13 to your computer and use it in GitHub Desktop.
Create a CMSampleBuffer from CVPixelBuffer
// Usage
let pixelBuffer: CVImageBuffer? = createPixelBufferFrom(image: image) // see https://gist.github.com/rampadc/10a7dc257552f1fb86c1fcc2d1671bd9
let sampleBuffer: CMSampleBuffer? = createSampleBufferFrom(pixelBuffer: pixelBuffer)
// Function
func createSampleBufferFrom(pixelBuffer: CVPixelBuffer) -> CMSampleBuffer? {
var sampleBuffer: CMSampleBuffer?
var timimgInfo = CMSampleTimingInfo()
var formatDescription: CMFormatDescription? = nil
CMVideoFormatDescriptionCreateForImageBuffer(allocator: kCFAllocatorDefault, imageBuffer: pixelBuffer, formatDescriptionOut: &formatDescription)
let osStatus = CMSampleBufferCreateReadyWithImageBuffer(
allocator: kCFAllocatorDefault,
imageBuffer: pixelBuffer,
formatDescription: formatDescription!,
sampleTiming: &timimgInfo,
sampleBufferOut: &sampleBuffer
)
// Print out errors
if osStatus == kCMSampleBufferError_AllocationFailed {
print("osStatus == kCMSampleBufferError_AllocationFailed")
}
if osStatus == kCMSampleBufferError_RequiredParameterMissing {
print("osStatus == kCMSampleBufferError_RequiredParameterMissing")
}
if osStatus == kCMSampleBufferError_AlreadyHasDataBuffer {
print("osStatus == kCMSampleBufferError_AlreadyHasDataBuffer")
}
if osStatus == kCMSampleBufferError_BufferNotReady {
print("osStatus == kCMSampleBufferError_BufferNotReady")
}
if osStatus == kCMSampleBufferError_SampleIndexOutOfRange {
print("osStatus == kCMSampleBufferError_SampleIndexOutOfRange")
}
if osStatus == kCMSampleBufferError_BufferHasNoSampleSizes {
print("osStatus == kCMSampleBufferError_BufferHasNoSampleSizes")
}
if osStatus == kCMSampleBufferError_BufferHasNoSampleTimingInfo {
print("osStatus == kCMSampleBufferError_BufferHasNoSampleTimingInfo")
}
if osStatus == kCMSampleBufferError_ArrayTooSmall {
print("osStatus == kCMSampleBufferError_ArrayTooSmall")
}
if osStatus == kCMSampleBufferError_InvalidEntryCount {
print("osStatus == kCMSampleBufferError_InvalidEntryCount")
}
if osStatus == kCMSampleBufferError_CannotSubdivide {
print("osStatus == kCMSampleBufferError_CannotSubdivide")
}
if osStatus == kCMSampleBufferError_SampleTimingInfoInvalid {
print("osStatus == kCMSampleBufferError_SampleTimingInfoInvalid")
}
if osStatus == kCMSampleBufferError_InvalidMediaTypeForOperation {
print("osStatus == kCMSampleBufferError_InvalidMediaTypeForOperation")
}
if osStatus == kCMSampleBufferError_InvalidSampleData {
print("osStatus == kCMSampleBufferError_InvalidSampleData")
}
if osStatus == kCMSampleBufferError_InvalidMediaFormat {
print("osStatus == kCMSampleBufferError_InvalidMediaFormat")
}
if osStatus == kCMSampleBufferError_Invalidated {
print("osStatus == kCMSampleBufferError_Invalidated")
}
if osStatus == kCMSampleBufferError_DataFailed {
print("osStatus == kCMSampleBufferError_DataFailed")
}
if osStatus == kCMSampleBufferError_DataCanceled {
print("osStatus == kCMSampleBufferError_DataCanceled")
}
guard let buffer = sampleBuffer else {
print("Cannot create sample buffer")
return nil
}
return buffer
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment