将指针元组转换为指针指针

问题描述 投票:3回答:1

我有一段C代码:

#define AV_NUM_DATA_POINTERS 8
uint8_t *data[AV_NUM_DATA_POINTERS];

在swift生成的界面中,这看起来像:

var data: (UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?)

有一个函数需要这个data变量。它在C中的表示如下:

int sws_scale(..., const uint8_t *const srcSlice[], ...);

然而,swift产生以下签名:

func sws_scale(..., _ srcSlice: UnsafePointer<UnsafePointer<UInt8>?>!, ...) -> Int32

将巨大的元组转换为适用于sws_scale函数的类型的最佳方法是什么?

swift ffmpeg libav
1个回答
1
投票

来自Swift.org - UnsafeRawPointer Migration的示例:

var bytes: (CChar, CChar, CChar, CChar) = (0x61, 0x62, 0x63, 0)
let name: String = withUnsafePointer(to: &bytes) { ptr -> String in
   return String(cString: UnsafeRawPointer(ptr).assumingMemoryBound(to: CChar.self))
}

适用于sws_scale

var data: (UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?)
withUnsafePointer(to: data) { dataPointer in
   let dataPointer =
      UnsafeRawPointer(dataPointer)
         .assumingMemoryBound(to: UnsafePointer<UInt8>?.self)

   sws_scale(…, dataPointer, …)
}

请勿执行以下操作:

withUnsafePointer(to: &data.0)

在优化版本中使用上述内容时,我遇到了内存对齐问题。

© www.soinside.com 2019 - 2024. All rights reserved.