在C ++头文件中包含一行objC

时间:2017-09-26 19:02:32

标签: c++ objective-c

我正在使用Siphon框架向客户端提供视频帧。我需要使用一行代码来通过服务器为框架提供服务,而且我很难将其写入我的c ++代码中。

Siphon文档here给出了这个例子:

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

如何将其合并到我的c ++标题中?我已经设置了我的xcode编译器标志,以便“Other C Flags”设置为“-x objective-c”,“Other C ++ Flags”设置为“-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;

1 个答案:

答案 0 :(得分:2)

你能分辨出来吗?一个非常简单的方法是:

  • 使用执行syphonServer调用的普通C签名编写函数;
  • 将该函数的声明放入普通的C头文件中;
  • 将该函数的实现放入包含标题的Objective-C文件中;
  • 从C ++类调用C函数。

如果您可以将包含标题的文件重命名为.mm,那么在说服编译器将您的文件(以及扩展名为标题)视为Objective-C ++时,也可以获得所需的结果。