2012年1月25日水曜日

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

今回は,前回使ったサンプルコード QTCoreVideo101 の中身をみてみます.



Xcode でプロジェクトファイルを開くと,上記のような構成になっています.ここからは, MyController および MyOpenGLView の.h,.m ファイルを覗いていきます.

Objective-C では,最初に .h ファイルを見ることで各クラスがどのような働き・機能を持っているかを俯瞰的に見ることができます.たとえば, MyController.h を見てみると,

#import <Cocoa/Cocoa.h>
#import "MyOpenGLView.h"

@interface MyController : NSObject
{
    IBOutlet MyOpenGLView *myGLView;
}

// Actions
- (IBAction)open:(id)sender;
- (IBAction)teapot:(id)sender;
- (IBAction)quad:(id)sender;

// Open Panel callback
- (void)openPanelDidEnd:(NSOpenPanel*)sheet returnCode:(int)returnCode contextInfo:(void*)contextInfo;
@end

と記述されています.ここで目につくのは,  IBOutlet     IBAction   でしょう.(IB とは Interface Builder を意味していて, GUI ベースのインタフェース作成アプリケーションです.)詳しい説明は今は省きますが, Interface Builder を通して IBOutlet は 他のオブジェクトと結びつき, IBAction は外部からそのオブジェクトのメソッドにアクセスすることができます.言わば,オブジェクト間の架け橋の役目を果たしています.

MyController.h では, MyOpenGLView というクラスのオブジェクトの受け口を *myGLView という名前で保持しています.さらに, open , teapot , quad という IBAction,およびopenPanelDidEnd というメソッドを持ちます. contextInfo は単なる関数です.

続いて, MyOpenGLView.h を見てみます.

#import <Cocoa/Cocoa.h>
#import <QuickTime/QuickTime.h>
#import <QTKit/QTKit.h>
#import <OpenGL/OpenGL.h>
#import <OpenGL/gl.h>
#import <OpenGL/glu.h>
#import <glut/glut.h>

@interface MyOpenGLView : NSOpenGLView
{
    QTMovie     *movie;
    NSSize movieSize;
    CVDisplayLinkRef displayLink;
    QTVisualContextRef textureContext;
    CVOpenGLTextureRef  currentFrame;
    GLuint              teapotList;
    
    NSRecursiveLock *lock;
        
    BOOL drawTeapot;
}

// render clean up routine
-(void)cleanUp;

// Display Link handler
-(CVReturn)getFrameForTime:(const CVTimeStamp *)timeStamp flagsOut:(CVOptionFlags *)flagsOut;

// QuickTime Movie
-(void)openMovie:(NSString*)path;

// accessors
-(CVDisplayLinkRef)displayLink;
-(void)setDrawTeapotState:(BOOL)inState;
@end

このクラスは OpenGL で描画される View を担当しています.先ほど MyController.h で使われていたのはこのクラスです.特に外部との接続をする様子は無く,つまりは MyController.h の手の上で転がされる存在です.ざっとみると,動画を扱うコードのような気がしてきませんか.

Movie -> Visual context -> OpenGL transforms -> OpenGL rendering --> Hardware の流れは, MyOpenGLView のクラスで行われているようなので,次回はこの中身 MyOpenGLView.m を開いて, Core Video の使い方を追っていきます.

0 件のコメント:

コメントを投稿