2017-09-26 28 views
1

我正在使用Siphon框架向客戶端提供視頻幀。我需要使用一行代碼來通過服務器爲框架提供服務,並且我試圖將其寫入到我的C++代碼中。在C++頭文件中包含一行objC

虹吸文檔here給出了這樣的例子:

[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」和「其他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; 

回答

2

您能因素說出來?一個非常簡單的方法是:

  • 用一個普通的C簽名來執行syphonServer調用;
  • 將該函數的聲明放入一個普通的C頭文件中;
  • 將該函數的實現放入包含頭文件的Objective-C文件中;
  • 從你的C++類調用C函數。

如果您可以將包含頭文件的文件重命名爲.mm,那麼在說服編譯器將您的文件(以及擴展名爲頭)作爲Objective-C++對待時,也可以達到所需的結果。