QTMovieのcurrentFrameImageを改善する

QTKitのQTMovieの

- (NSImage *)currentFrameImage;
- (NSImage *)frameImageAtTime:(QTTime)time;

あたりは,使うたびにメモリリークする。数回呼ぶくらいならどうってことないけど,大量に呼ぶと大変なことに。


この問題を回避するには,QuickTimeAPIを使わなければいけない??。
MovieとかGWorldとかよく分からないんだけど…。


とりあえず,いろいろ試行錯誤してできたのが,フレーム画像を大量に呼び出しても大丈夫なクラス。
でもなぜこれでいいのかは,謎(SetMovieGWorldすると,それが開放されないような?)。

@interface QTFastMovie : QTMovie
{
    GWorldPtr gworld;
}
- (NSImage *)fastCurrentFrameImage;
@end

@implementation QTFastMovie
- (GWorldPtr)offScreenGWorld
{
    if(!gworld){
        Rect srcRect;
        GetMovieBox([self quickTimeMovie],&srcRect);
        
        NewGWorld(&gworld,
                    k32ARGBPixelFormat,
                    &srcRect,
                    NULL,
                    NULL,
                    0);
        
        SetMovieGWorld([self quickTimeMovie], gworld,NULL);
    }
    return gworld;
}
- (NSImage *)fastCurrentFrameImage
{
    Movie movie = [self quickTimeMovie];    
    GWorldPtr offscreen = [self offScreenGWorld];
    
    MoviesTask(movie, 0);
    NSImage *image = imageFromGworld(offscreen);
    
    return image;
}
@end


imageFromGWorld()は,
HMDT > Cocoa Programming Tips 1001 > GWorldをNSImageに変換する
のもの。


でもTigerで使うと,いくつもDeprecatedって警告がでる。
Leopardでは,そもそもQTKitのメモリリークの問題がなおるのか,TigerからはCoreVideoを使えということなのか…?。