【问题标题】:Is there a way to utilize Swift commands within a low-level C method call?有没有办法在低级 C 方法调用中使用 Swift 命令?
【发布时间】:2020-06-23 01:56:12
【问题描述】:

我正在维护从AVCaptureSynchronizedData 获得的一组数据。我使用的一种方法是修改从AVCaptureSynchronizedData 获得的CVPixelBuffers。修改时。 CVPixelBuffer,我通过

创建了CVPixelBuffer 的副本
let status = CVPixelBufferCreateWithBytes(nil, scaleWidth, scaleHeight,
                                                  pixelFormat, destData,
                                                  destBytesPerRow, releaseCallback,
                                                  nil, nil, &dstPixelBuffer)

releaseCallBack 被引用为

let releaseCallback: CVPixelBufferReleaseBytesCallback = { _, ptr in
    if let ptr = ptr {
        free(UnsafeMutableRawPointer(mutating: ptr))
    }
}

但是,我希望能够跟上这被调用的次数。但是,如果我添加类似

var num:Int = 0
let releaseCallback: CVPixelBufferReleaseBytesCallback = { _, ptr in
    if let ptr = ptr {
        num += 1
        free(UnsafeMutableRawPointer(mutating: ptr))
    }
}

我得到了错误

不能从捕获上下文的闭包中形成 C 函数指针

不确定是否有可能,但能够记录指针被销毁的次数会非常有用

【问题讨论】:

  • 可能有帮助:stackoverflow.com/a/33262376/1187415。 – 问题是(我假设)num 是一个实例变量,因此闭包实际上捕获了self
  • 正确。它是隐含的 self.num
  • 问题是,我无法更改回调类型,因为它严格来说是在 Swift 中创建的类型。它正在寻找那个特定的回调。我相信其他解决方案对其进行了一些修改

标签: swift unsafe-pointers cvpixelbuffer unsafemutablepointer


【解决方案1】:

在闭包中引用实例变量num会捕获self,而这在纯C函数的回调中是不可能的。

How to use instance method as callback for function which takes only func or literal closure 类似,您必须使用自定义指针(此处为:releaseRefCon)才能传递给回调:

let releaseCallback: CVPixelBufferReleaseBytesCallback = { releaseRefCon, ptr in
    let mySelf = Unmanaged<YourClass>.fromOpaque(releaseRefCon!).takeUnretainedValue()
    if let ptr = ptr {
        free(UnsafeMutableRawPointer(mutating: ptr))
        mySelf.num += 1
    }
}

let releaseRefCon = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())
let status = CVPixelBufferCreateWithBytes(nil, scaleWidth, scaleHeight,
                                          pixelFormat, destData,
                                          destBytesPerRow,
                                          releaseCallback, releaseRefCon,
                                          nil, &dstPixelBuffer)

关于从实例指针(此处:self)到 void 指针并返回到实例指针(此处:mySelf)的转换,请参见 How to cast self to UnsafeMutablePointer<Void> type in swift

【讨论】:

  • 啊,我明白了。我看到了参数 releaseRefCon,我知道它是实例变量,但不确定你如何创建一个 UnsafeMutableRawPointer 来让我获得对 self 或其他任何东西的引用。非常感谢!
  • 我很快就会在这里测试一下,假设一切顺利的话,我会给你检查
猜你喜欢
  • 2011-12-05
  • 1970-01-01
  • 2021-08-28
  • 2015-05-06
  • 2023-04-10
  • 1970-01-01
  • 2022-12-12
  • 2019-06-30
  • 1970-01-01
相关资源
最近更新 更多