Невозможно распаковать кадры H.264 с помощью VideoToolbox при жестком кодировании параметров PPS и SPS
Я написал декодер H.264, который прекрасно работает. Однако по соображениям производительности я пытаюсь жестко программировать параметры PPS и SPS (они никогда не меняются).
Для справки вот как они выглядят как база 10 [UInt8]:
- SPS [103, 66, 0, 40, 244, 5, 1, 236, 128]
- PPS [104, 206, 9, 136]
Странно то, что когда я декодирую параметры PPS и SPS из кадров, которые я получаю, и использую их для создания описания формата и сеанса декомпрессии, это прекрасно работает; но когда я жестко их кодирую, это не работает, и я получаю ошибку VT -12909 (неверные данные), когда пытаюсь распаковать кадры. Насколько я могу судить, байтовые массивы точно такие же.
Чтобы жестко их кодировать, я просто написал свое createFormatDescription так:
func createFormatDescription(sps: [UInt8]?, pps: [UInt8]?) -> Bool {
self.formatDesc = nil
let sps = sps ?? [103, 66, 0, 40, 244, 5, 1, 236, 128] as [UInt8]
let pps = pps ?? [104, 206, 9, 136] as [UInt8]
let pointerSPS = UnsafePointer<UInt8>(sps)
let pointerPPS = UnsafePointer<UInt8>(pps)
let dataParamArray = [pointerSPS, pointerPPS]
let parameterSetPointers = UnsafePointer<UnsafePointer<UInt8>>(dataParamArray)
let sizeParamArray = [sps.count, pps.count]
let parameterSetSizes = UnsafePointer<Int>(sizeParamArray)
let status = CMVideoFormatDescriptionCreateFromH264ParameterSets(kCFAllocatorDefault, 2, parameterSetPointers, parameterSetSizes, 4, &formatDesc)
if status == noErr {
print("===== Format description created")
return true
} else {
return false
}
}
И позвони в мой init()
метод. Кроме этого, я не сделал никаких изменений; кадры интерпретируются точно так же.
Для справки вот как выглядит мой обратный вызов VT:
private var callback: VTDecompressionOutputCallback = {(
decompressionOutputRefCon: UnsafeMutableRawPointer?,
sourceFrameRefCon: UnsafeMutableRawPointer?,
status: OSStatus,
infoFlags: VTDecodeInfoFlags,
imageBuffer: CVPixelBuffer?,
presentationTimeStamp: CMTime,
duration: CMTime) in
let decoder: VideoFrameDecoder = Unmanaged<VideoFrameDecoder>.fromOpaque(decompressionOutputRefCon!).takeUnretainedValue()
if imageBuffer != nil && status == noErr {
decoder.imageDecompressed(image: imageBuffer!)
} else {
decoder.delegate?.frameDecodingFailed()
print("***** FAILED TO DECOMPRESS. VT ERROR \(status)")
}
}
Довольно простой. И просто повторюсь, я всегда получаю "VT ERROR -12909"