c - 如何在 Swift 中处理 c 枚举回调函数
问题描述
我想像这样设置一个自定义的快速回调函数
codecCtx.get_format = negotiatePixelFormat
其中 C 回调函数get_format
声明为 this
var get_format: (@convention(c) (UnsafeMutablePointer<AVCodecContext>?, UnsafePointer<AVPixelFormat>?) -> AVPixelFormat)!
我的自定义 swift 函数函数看起来像这样
private func negotiatePixelFormat(codecContext:AVCodecContext,pixelFormat:AVPixelFormat)->AVPixelFormat{
while pixelFormat == AV_PIX_FMT_NONE {
if pixelFormat == AV_PIX_FMT_VIDEOTOOLBOX{
if codecContext.hwaccel_context == nil{
return codecContext.pix_fmt //TBD
}
}
return pixelFormat //TBD
}
return AV_PIX_FMT_NONE //TBD
}
但我不知道如何将这些类型的函数合并在一起,也不能在哪里搜索某种文档。
原始的所有C代码如下
codecCtx->get_format = negotiatePixelFormat
自定义回调函数在哪里
static enum AVPixelFormat negotiate_pixel_format(struct AVCodecContext *s, const enum AVPixelFormat *fmt) {
while (*fmt != AV_PIX_FMT_NONE) {
if (*fmt == AV_PIX_FMT_VIDEOTOOLBOX) {
if (s->hwaccel_context == NULL) {
int result = av_videotoolbox_default_init(s);
if (result < 0) {
return s->pix_fmt;
}
}
return *fmt;
}
++fmt;
}
return s->pix_fmt;
}
解决方案
当您知道回调的类型被导入为:
var get_format: (@convention(c) (UnsafeMutablePointer<AVCodecContext>?, UnsafePointer<AVPixelFormat>?) -> AVPixelFormat)!
你需要定义一个函数(UnsafeMutablePointer<AVCodecContext>?, UnsafePointer<AVPixelFormat>?)
,并返回AVPixelFormat
。
因此,您可能需要声明一个 Swift 函数,例如:
func negotiatePixelFormat(_ s: UnsafeMutablePointer<AVCodecContext>?, _ fmt: UnsafePointer<AVPixelFormat>?) -> AVPixelFormat {
//...
}
据我所知,您在 C 中的回调函数在 Swift 中如下所示:
func negotiatePixelFormat(_ s: UnsafeMutablePointer<AVCodecContext>?, _ fmt: UnsafePointer<AVPixelFormat>?) -> AVPixelFormat {
guard let s = s, var fmt = fmt else {
return AV_PIX_FMT_NONE
}
while fmt.pointee != AV_PIX_FMT_NONE {
if fmt.pointee == AV_PIX_FMT_VIDEOTOOLBOX {
if s.pointee.hwaccel_context == nil {
let result = av_videotoolbox_default_init(s)
if result < 0 {
return s.pointee.pix_fmt
}
}
return fmt.pointee
}
fmt += 1
}
return s.pointee.pix_fmt
}
您显示的信息缺少一些细节,因此您可能需要修复此代码的某些部分。
推荐阅读
- c++ - 如何在 QTextEdit 中禁用光标?
- typescript - 为什么 audio.pause() 不能使用 TypeScript,但是 audio.play(); 效果很好?
- reactjs - 从生成器函数内部调用函数
- sql-server - 如何在 centos7 主机上使用 docker-compose .yml 将 JBoss 服务器容器与 SQL 服务器一链接?
- java - Set 引用变量中的 TreeSet 实例
- android - 如何在android studio中添加轮廓材质图标?
- sql-server - 多部分标识符无法绑定 WITH 子句
- sql - 如何在 hive 中找到 hh:mm:ss 的平均值
- python - 没有名为 PIP 的模块 || PIP 命令不起作用(PIP 3.7)
- c# - 如何通过mvc中的join选择列值并计算记录?