使用OpenGL绘制QTMovie的纹理两次

时间:2013-09-13 19:51:19

标签: opengl quicktime nsopenglview openglcontext

我目前正在使用OpenGL将我的QTMovie的帧显示到NSOpenGLView中。 为此,我使用以下代码创建纹理上下文:

// Called from a subclass of NSOpenGLView
QTOpenGLTextureContextCreate(kCFAllocatorDefault,
                             (CGLContextObj)[[self openGLContext] CGLContextObj],
                             (CGLPixelFormatObj)[[self pixelFormat] CGLPixelFormatObj],
                             NULL, &_textureContext);

然后我将视觉上下文分配给电影,以便将帧绘制到该上下文中。 我正在用这个位获得实际的框架:

OSStatus status = QTVisualContextCopyImageForTime(_textureContext, kCFAllocatorDefault,
                                                      NULL, &_currentFrameTex);

其中_currentFrameTex是CVOpenGLTextureRef。

所有这一切都适用于一个视图,但我想在第二个视图上绘制相同的帧,我无法想象如何做到这一点。

最简单的方法是什么?当然它也应该是高效的,因为它被称为每秒60次(至少)。

1 个答案:

答案 0 :(得分:1)

我建议你在创建NSOpenGLViews时使用上下文共享。

不幸的是,我没有很多使用cocoa(NeXTSTEP)OpenGL窗口系统界面(我使用CGL / AGL)的经验,所以我无法告诉你具体如何做到这一点。但是,initWithFormat:shareContext的API参考可能会指向正确的方向。

我建议上下文共享的原因是因为您可以在CVOpenGLTextureRef个实例中重复使用NSOpenGLView为您提供的纹理句柄。否则,您可能必须获得CVOpenGLTextureRef每个上下文(视图)。

每个上下文执行此操作的开销可能没有您想象的那么高,Core Video不必通过系统内存复制视频内容来为您提供OpenGL纹理 - 它已经在GPU上有一个表面它可以复制/参考。