2012年2月14日火曜日

Core Video の基本的な処理構造 4

QTCoreVideo101 の MyOpenGLView.m では,QTKit で読み込まれた動画などを Display Link によって適時読み込んでいます. drawRect メソッド内で,

    GLenum target = CVOpenGLTextureGetTarget(currentFrame);
    GLint name = CVOpenGLTextureGetName(currentFrame);
    CVOpenGLTextureGetCleanTexCoords(currentFrame, bottomLeft, bottomRight, topRight, topLeft);

といった処理で,テクスチャとして動画のフレームを読み込んでいます.ただし,動画の再生に応じて動画を次々読み込まなければなりません.この役目を果たすのが Display Link です.既にこの説明はしていますので,詳細は割愛し,テクスチャの更新を行っている getFrameForTime について見ていきます.

- (CVReturn)getFrameForTime:(const CVTimeStamp*)timeStamp flagsOut:(CVOptionFlags*)flagsOut
{
NSAutoreleasePool *pool = [NSAutoreleasePool new];
if (textureContext != NULL && QTVisualContextIsNewImageAvailable(textureContext, timeStamp)) {
    
if (NULL != currentFrame) {
        CVOpenGLTextureRelease(currentFrame);
        currentFrame = NULL;
         }
        
OSStatus status = QTVisualContextCopyImageForTime(textureContext, NULL, timeStamp, &currentFrame);
if ((noErr == status) && (NULL != currentFrame)) {
        [self drawRect:NSZeroRect];
}
}
    
[pool release];

return kCVReturnSuccess;
}

読み込み処理は, QTVisualContextCopyImageForTime です.その他はスレッド処理とエラー処理です.この処理が毎回コールバック関数で呼び出され,動画からOpenGL へと橋渡しをしています.

0 件のコメント:

コメントを投稿