我正在使用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;
答案 0 :(得分:2)
你能分辨出来吗?一个非常简单的方法是:
syphonServer
调用的普通C签名编写函数; 如果您可以将包含标题的文件重命名为.mm,那么在说服编译器将您的文件(以及扩展名为标题)视为Objective-C ++时,也可以获得所需的结果。