import Foundation /// The in-band SPS (type 7) and PPS (type 8) NAL units extracted from an /// access unit. The sender repeats both ahead of every keyframe, so any /// keyframe carries them; they are the source for the VideoToolbox format /// description. struct NalSets { let sps: [UInt8] let pps: [UInt8] } /// Extracts parameter sets from an Annex-B access unit. enum NalExtractor { static func parameterSets(_ annexB: [UInt8]) -> NalSets? { var sps: [UInt8]? var pps: [UInt8]? for nal in AvccConverter.nalUnits(annexB) { guard !nal.isEmpty else { continue } let type = Int(nal[0]) & 0x1F if type == 7 && sps == nil { sps = nal } else if type == 8 && pps == nil { pps = nal } } guard let s = sps, let p = pps else { return nil } return NalSets(sps: s, pps: p) } }