3

I have piece of C code:

#define AV_NUM_DATA_POINTERS 8
uint8_t *data[AV_NUM_DATA_POINTERS];

In the swift generated interface this looks like:

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

There's a function that needs this data variable. It's representation in C is as follows:

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

However swift produces the following signature:

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

What's the best way to cast the huge tuple to a type that would work for the sws_scale function?

carlossless
  • 1,171
  • 8
  • 23
  • This might help: https://stackoverflow.com/questions/29469158/how-to-pass-an-array-of-swift-strings-to-a-c-function-taking-a-char-parameter – Martin R May 26 '17 at 13:05

1 Answers1

2

Example from 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))
}

Applied to 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, …)
}

DO NOT do the following:

withUnsafePointer(to: &data.0)

I ran into a memory alignment issue when using the above in an optimized build.

fumoboy007
  • 5,345
  • 4
  • 32
  • 49