Невозможно распаковать кадры 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"

0 ответов

Другие вопросы по тегам