在C 标题中纳入OBJC线

incorporating a line of objC in C++ header

本文关键字:OBJC 标题      更新时间:2023-10-16

我正在使用Siphon框架将视频帧提供给客户端。我需要使用一行代码来通过服务器使用帧,我被困在试图将其写入我的C 代码中。

这里的虹吸文档给出了此示例:

[myServer publishFrameTexture:myTex textureTarget:GL_TEXTURE_RECTANGLE_EXT imageRegion:NSMakeRect(0, 0, width, height) textureDimensions:NSMakeSize(width, height) flipped:NO];

我如何将其纳入我的C 标题?我已经将Xcode编译器标志设置为"其他C标志"设置为" -x Objective-C"answers"其他C 标志",为" -x Objective-C "。

给出一些上下文,我的其余代码当前看起来像这样(并且它构建):

class OpencvMat2Syphon {
    // hack to call glut to create opengl context (one only so they don't wipe out each other)
    static bool haveGLContext;
    uint texId;
    CGLContextObj ctx;
    static SyphonServer *syphonServer;
public:
    OpencvMat2Syphon() {
        if (!haveGLContext) {
            char* str[1];  // glut hack for faking passing CLI parameters from main
            int argc = 1;
            str[0] = "app";
            glutInit(&argc, str);
            glutCreateWindow("imageGrabber");
            glutDisplayFunc([]{});
            glutHideWindow();
            haveGLContext = true;
        }
        ctx = CGLGetCurrentContext();
        std::cout << "cgl context: " << ctx << std::endl;
        SyphonServer *syphonServer = [[SyphonServer alloc] initWithName:@"imageGrabberOutput" context:ctx options:nil];
        glGenTextures(1, &texId);
        glBindTexture(GL_TEXTURE_2D, texId);
        glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
        glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
        glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
    }
    ~OpencvMat2Syphon() {
        glDeleteTextures(1, &texId);
    }
    uint getTexId() {
        return texId;
    }
    void uploadTexture(cv::Mat mat) {
        glBindTexture(GL_TEXTURE_2D, texId);
        // can do swizzling/channel-flipping here? see https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2D.xhtml
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, mat.cols, mat.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, mat.data);

// ??            [syphonServer publishFrameTexture:texId textureTarget:GL_TEXTURE_2D imageRegion:NSMakeRect(0, 0, 1280, 720) textureDimensions:NSMakeSize(1280, 720) flipped:NO];
    }
};
bool OpencvMat2Syphon::haveGLContext = false;

您是否能够将其分解出来?一种非常简单的方法是:

  • 写一个具有普通c签名的函数,该函数执行syphonServer调用;
  • 将该功能的声明放入普通的C标头文件中;
  • 将该函数的实现放入包含标题的Objective-C文件中;
  • 从您的C 类调用C函数。

如果您可以重命名包含标题为.mm的文件,则还可以实现说服编译器将您的文件(并通过扩展程序)视为Objection-C 的所需结果。