高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Note TN2111
Idling Movie Importers

このテクニカルノートでは、アイドリングムービーインポータ(Idling Movie Importer)コンポーネントを作成する方法について説明します。アイドリングムービーインポータは、通常のムービーインポータとは異なり、定期的に呼び出されてインポート中にムービーデータを処理する特別なルーチン MovieImportIdle を実装しています。





アイドリングムービーインポータとは?

「Movie Data Exchange Components」で述べているように、ムービーインポータコンポーネントはムービー以外のソースから、QuickTime ムービーにデータをインポートします。たとえば、CD オーディオトラックを QuickTime ムービーにインポートすることができます。一般に、これはインポータの MovieImportFileMovieImportHandle、または MovieImportDataRef ルーチンのいずれかを 1 回呼び出すことで実現されます。その際に、インポータコンポーネントはすべてのムービーデータをダウンロードして処理し、インポートしたムービーデータを呼び出し側プログラムに返します(実際のインポータコンポーネントの例については、ElectricImage のサンプルコードを参照)。

アイドリングムービーインポータは、定期的に呼び出されてインポート中にインポータにムービーデータを処理させる特別なルーチン MovieImportIdleMovieImportIdle を参照)を実装している点で、非アイドリングインポータコンポーネントとは異なります。つまり、このインポートは通常、インポータの MovieImportFileMovieImportHandle、または MovieImportDataRef ルーチンのいずれかを 1 回呼び出すだけでは完了しないということです。代わりに、このインポータの MovieImportFileMovieImportHandle、または MovieImportDataRef ルーチンはアイドル状態にする必要があることを示す値 movieImportResultNeedIdles を返し(MovieImportDataRefを参照)、その後ムービーデータの処理が完了するまで、インポータの MovieImportIdle ルーチンが定期的に呼び出されます。

定期的に呼び出されるため、アイドリングムービーインポータは、データを完全にダウンロードした後ではなく、ムービーデータをダウンロードしながら表示する機会が与えられ、ファストスタートムービーを表示する方法に似ています。

先頭に戻る

インポータをアイドリングインポータとして指定

MovieImportIdle 関数を呼び出すには、ムービーインポータをアイドリングムービーインポータとして指定する必要があります。ムービーインポータをアイドリングインポータとして指定するには、コンポーネントの ComponentDescription 構造体の componentFlags フィールドで canMovieImportWithIdle コンポーネントフラグ(QuickTimeComponents.h を参照)を特定します。

リスト 1: canMovieImportWithIdle コンポーネントフラグ

canMovieImportWithIdle        = 1L << 20

先頭に戻る

MovieImportIdle

ここでは、アイドリングインポータの新しい MovieImportIdle 関数について説明します。QuickTime はこのルーチンを定期的に呼び出し、ムービーインポートのためにムービーデータを処理できるようにします。

リスト 2: MovieImportIdle

MovieImportIdle


定期的なタスクを処理するムービーデータインポートコンポーネントを呼び出します。

ComponentResult MovieImportIdle (                               // IV-2677
    MovieImportComponent    ci,                                 // IV-2677
    long                    inFlags,
    long                    *outFlags );

ci

ムービーデータインポートコンポーネントのインスタンス。ソフトウェアは OpenComponent 
または OpenDefaultComponent からこの参照を取得します。

inFlags

インポートを統括する制御情報を指定するフラグ(下記を参照)。

outFlags

インポートに関するステータス情報を受け取るフィールドを特定するフラグ(下記を参照)。
インポートが完了すると、コンポーネントがこのフィールドに適切なフラグを設定します。

関数の結果:  エラーがない場合は noErr を返します。

inFlags 定数

現在は使用されていません。0 に設定されています。

outFlags 定数

movieImportResultComplete

コンポーネントがデータのインポートを完了したかどうかを示します。コンポーネントが
データのインポートを完了した場合は、このフラグを 1 に設定します。

バージョンに関する注意

QuickTime 4 で導入。

プログラミング情報

C インタフェースファイル: QuickTimeComponents.h
使用可能:
    非 Carbon CFM: QuickTimeLib 4.0 以降
    CarbonLib:          CarbonLib 1.0.2 以降
    Mac OS X:           バージョン 10.0 以降
    Windows:            qtmlClient.lib 4.0 以降

先頭に戻る

ムービーの変化をムービーコントローラに通知

アイドリングインポータは(通常は AddMediaSampleReferences64InsertMediaIntoTrack を呼び出すことによって)新しく処理したメディアをムービーに追加した後で、ムービーの再生時間と状態を更新し、すべてのメディアを再生できるように、ムービーコントローラに通知する必要があります。これを行うには、以下のようなコードを使用して、ムービーのワイヤードアクション kActionMovieChanged 関数と MovieExecuteWiredActions 関数を実行します。

リスト 3: ムービーの変化をムービーコントローラに通知

QTAtomContainer container;
Movie           theMovie;

// ムービーが変化したことをムービーコントローラに通知する必要があるため、
// kActionMovieChanged ワイヤードアクションを送信する

if (QTNewAtomContainer(&container) == noErr)
{
    QTAtom anAction;
    OSType whichAction = EndianU32_NtoB(kActionMovieChanged);

    OSErr err = QTInsertChild(container, kParentAtomIsContainer,
                            kAction, 1, 0, 0, NULL, &anAction);
    if (err == noErr)
    {
        err = QTInsertChild(container, anAction, kWhichAction, 1, 0,
                                sizeof (whichAction), &whichAction, NULL);
    }
    
    if (err == noErr)
    {
        err = MovieExecuteWiredActions(theMovie, 0, container);
    }
    
    err = QTDisposeAtomContainer(container);
}

注意: このアクションは、1 秒間に 2 〜 3 回より頻繁に実行しないでください。このアクションを通じてムービーの状態が頻繁にリセットされると、同時再生が不規則になる可能性があります。

以下に、MovieExecuteWiredActions 関数について説明します。

リスト 4: MovieExecuteWiredActions 関数

MovieExecuteWiredActions

ムービーを対象とした、指定されたワイヤードアクションを実行する

OSErr MovieExecuteWiredActions (
   Movie              theMovie,
   long               flags,
   QTAtomContainer    actions );


パラメータの説明

theMovie

ムービー識別子。アプリケーションは、NewMovie、NewMovieFromFile、および 
NewMovieFromHandle などの関数を使ってこの識別子を取得します。

flags

実行するワイヤードアクションの制御情報を指定するフラグ(下記を参照)。

actions

アトムコンテナと実行するワイヤードアクション。

関数の結果

関数の結果だけでなく、GetMoviesError と GetMoviesStickyError によって 
Movie Toolbox が返すエラーにアクセスできます。
 「エラーコード」を参照してください。

フラグ定数

movieExecuteWiredActionDontExecute

ワイヤードアクションのコールバックプロシージャはすべて、アクションを実行する
ことはできませんが、参照することはできます。AddMovieExecuteWiredActionsProc 関数を
使用すると、コールバックをムービーに追加して、ワイヤードアクションを実行できます。

RemoveMovieExecuteWiredActionsProc を使用するとコールバックを削除できます。

バージョンに関する注意

QuickTime 4 で導入。

プログラミング情報

C インタフェースファイル: Movies.h
Carbon ステータス: サポート

関連 Java メソッド

quicktime.std.movies.Movie.executeWiredActions()

先頭に戻る

MovieImportSetIdleManager

QuickTime 6 には、新しい Idle Manager API がいくつか導入されています。これらについては、「What's New in QuickTime 6」で説明しています。中でも、MovieImportSetIdleManager API は QuickTime 6 のために書かれた Movie Importer で、この関数を実装し、次にいつアイドル状態になるかを Idle Manager に伝えます。追加情報についてはこのドキュメントを参照してください。

先頭に戻る

MovieImportDataRef/MovieImportFile/MovieImportHandle に関する特別な配慮

Movie Importer コンポーネントはもちろん、MovieImportDataRefMovieImportFile、および MovieImportHandle 関数を実装することを選択できます。インポータは、コンポーネントの ComponentDescription 構造体の componentFlags フィールドで適切なフラグ(canMovieImportDataReferencescanMovieImportFiles、および canMovieImportHandles)を指定することによって、これらのルーチンをサポートしているかどうかを示します。

上記のルーチンのいずれかをサポートする アイドリングムービーインポータは、MovieImportIdle ルーチンを定期的に呼び出してムービーデータを処理したいことを示すために movieImportResultNeedIdlesoutFlags パラメータに返すか、インポートが完了したことを示すために movieImportResultComplete を返す必要があります。

先頭に戻る

MovieImportDataRef

インポートコンポーネントは(一般に)、データ参照(ハンドルなど)をインポートのソースとして受け入れられる場合は、MovieImportDataRef を実装する必要があります。

インポートコンポーネントは、コンポーネントの ComponentDescription 構造体の componentFlags フィールドに canMovieImportDataReferences フラグを指定することで、MovieImportDataRef をサポートしているかどうかを示します。

以下に、MovieImportDataRef 関数について説明します。

リスト 5: MovieImportDataRef 関数

MovieImportDataRef

ムービーデータをデータ参照からインポートします。

ComponentResult MovieImportDataRef (                      // IV-2677
    MovieImportComponent    ci,                           // IV-2677
    Handle                  dataRef,                      // IV-2683
    OSType                  dataRefType,                  // IV-2695
    Movie                   theMovie,                     // IV-2685
    Track                   targetTrack,                  // IV-2685
    Track                   *usedTrack,                   // IV-2685
    TimeValue               atTime,                       // IV-2697
    TimeValue               *addedDuration,               // IV-2697
    long                    inFlags,
    long                    *outFlags );

ci
ムービーインポートコンポーネントのインスタンス。
ソフトウェアはこの参照を OpenComponent (II-1161) または
 OpenDefaultComponent (II-1163) から取得します。

dataRef
インポートするデータへのデータ参照。

dataRefType
dataRef パラメータのデータ参照のタイプ。

theMovie
ムービー識別子。アプリケーションは、この識別子を NewMovie (II-1098)、
NewMovieFromFile (II-1110)、および NewMovieFromHandle (II-1113) などの
関数から取得します。

targetTrack
インポートしたデータを受け取るトラック。このトラック識別子は Movie Toolbox 
によって提供され、inFlags パラメータの movieImportMustUseTrack フラグが 1 に
設定されている場合にのみ有効です。

usedTrack
インポートしたデータを受け取るトラックのポインタ。コンポーネントは、
このトラック識別子を Movie Toolbox に返します。単一のトラックを操作する場合、
または新しいトラックを作成する場合にのみ、コンポーネントはこのパラメータを
設定する必要があります。

複数のトラックを変更する場合は、このパラメータによって参照されるフィールドは
無変更のまま残しておきます。

atTime
コンポーネントがインポートしたデータを配置する位置に対応する時間。
この時間値は、ムービーの時間座標システムで表示されます。

addedDuration
コンポーネントがムービーに追加したデータの再生時間のポインタ。
 コンポーネントは、この値をムービーの時間座標システムで指定する必要があります。

inFlags
この関数の動作を制御するフラグ(下記を参照)。

outFlags
この関数が戻り値に設定するフラグ(下記を参照)。

関数の結果: 「エラーコード」(IV-2718) を参照してください。
エラーがない場合は noErr を返します。

inFlags 定数

movieImportCreateTrack
インポートしたデータを受け取るために、コンポーネントが新しいトラックを
作成する必要があることを示します。コンポーネントの製造元コードに指定した
メディアタイプに対応するタイプ値のトラックを作成する必要があります。
複数のトラックを作成しない限り、この新しいトラックのトラック識別子は、
usedTrack パラメータによって参照されるフィールドに返す必要があります。
複数のトラックを作成する場合は、outFlags パラメータによって参照される
フィールドの movieImportResultUsedMultipleTracks フラグを必ず 1 に
設定します。movieImportCreateTrack フラグを 1 に設定した場合は、
movieImportMustUseTrack フラグを 0 に設定します。

movieImportMustUseTrack
コンポーネントが既存のトラックを使用する必要があることを示しています。
そのトラックは targetTrack パラメータによって識別されます。
 複数のトラックを作成する場合は、outFlags パラメータによって参照される
フィールドの movieImportResultUsedMultipleTracks フラグを必ず 1 に設定します。
 movieImportMustUseTrack フラグを 1 に設定した場合は、movieImportCreateTrack 
フラグを 0 に設定します。movieImportCreateTrack および movieImportMustUseTrack 
フラグを 0 に設定した場合は、ムービーの既存トラックを自由に使用するか、
必要に応じて新しいトラックを作成します。

movieImportInParallel
挿入またはペーストのどちらの操作を実行するかを示します。
 このフラグを 0 に設定した場合は、インポートしたデータをターゲットトラックに
挿入する必要があります。このフラグを 1 に設定した場合は、インポートした
データをトラックに追加し、現在トラック上にある空間を上書きする必要があります。
アプリケーションは、ムービーにペーストするデータ量を制御するために
、MovieImportSetDuration (II-982) を使用できます。movieImportMustUseTrack 
フラグを 1 に設定した場合は、targetTrack パラメータで指定したトラックを
使用する必要があります。これができない場合は、適切な Movie Toolbox 
結果コードを返します。

movieImportWithIdle
アイドリングインポータとしてインポートを実行する必要があることを示しています。
outFlags パラメータの movieImportResultNeedIdles フラグを 1 に設定すると、
MovieImportIdle ルーチンが定期的に呼び出されてムービーデータを処理します。

outFlags 定数

movieImportResultUsedMultipleTracks
コンポーネントがムービーの複数トラックを変更したことを示します。
コンポーネントがインポートしたデータを複数のトラックに配置する場合は、
このフラグを 1 に設定します。この場合、usedTrack パラメータによって
参照されるフィールドを更新する必要はありません。

movieImportResultNeedIdles
コンポーネントがその MovieImportIdle ルーチンを定期的に呼び出して、
ムービーデータを処理することを示しています。

movieImportResultComplete
コンポーネントがムービーデータの処理を完了したことを示します。

バージョンに関する注意

QuickTime 3 以前に導入。

プログラミング情報

C インタフェースファイル: QuickTimeComponents.h
Carbon ステータス: サポート

関連 Java メソッド

quicktime.std.movies.Track.fromMovieImporterDataRef(), quicktime.std.qtcomponents.MovieImporter.fromDataRef()

先頭に戻る

MovieImportGetLoadState

アイドリングインポータは、ムービーインポータの MovieImportGetLoadState 関数を実装することを選択できます。MovieImportGetLoadState 関数は、ムービーの非同期ロードプロセスの状態を示す値を返します。

非同期のムービーのロードプロセス(および高レベル関数 GetMovieLoadState)に関するドキュメントは、「What's New in QuickTime 4.1」に含まれています。その他のロード状態は、「What's New in QuickTime 5」に含まれています。

以下に、MovieImportGetLoadState 関数について簡単に説明します。

リスト 6: MovieImportGetLoadState

ムービーの非同期ロード状態を返します。

ComponentResult
MovieImportGetLoadState(
  MovieImportComponent   ci,
  long *                 importerLoadState)

ci
ムービーインポートコンポーネントのインスタンス。

importerLoadState
ムービーの現在のロード状態を受け取るポインタ。
ロードプロセスの値は以下のとおりです:

kMovieLoadStateLoading
インポータがムービーリソースを検索していることを示します。

kMovieLoadStatePlayable
ムービーが完全に形成され、ファストスタートが機能することを示します。

kmovieLoadStatePlaythroughOK
再生が完了する前に、ダウンロードが完了することを示します。
 この値は、ムービーが再生可能になってから返されます。


kMovieLoadStateComplete
すべてのメディアデータが利用可能であることを示します。

関数の結果: 「エラーコード」(IV-2718) を参照してください。
エラーがない場合は noErr を返します。

解説

コンポーネントが低速接続での非同期のムービーのロードをサポートしている場合は、
この関数を実装できます。これを使用して、ムービーの現在のロード状態を
レポートします。

バージョンに関する注意

使用可能:
     非 Carbon CFM:   QuickTimeLib 4.1 以降
     CarbonLib:         CarbonLib 1.1 以降
     Mac OS X:         バージョン 10.0 以降
     Windows:          qtmlClient.lib 4.1 以降


プログラミング情報

C インタフェースファイル: QuickTimeComponents.h
プログラミングの概要情報: "Importing Movie Data" (V-2910)
Carbon ステータス: サポート

先頭に戻る

アイドリングインポータとムービーコントローラ

アイドリングインポータで、インポートするムービーに使用するムービーコントローラのタイプに関するヒントを提供したくなることがあります。たとえば、インポータが静止画フォーマットを実装する場合に、ムービーがどのようなコントローラも表示しないことを確実にしたい場合などです。これを実現するには、ムービーの優先ムービーコントローラとして、インタフェースのないコントローラ(None Movie Controller ともいいます)を指定します。インタフェースなしのムービーコントローラは、コントロールバーが表示されず、キーボードイベントが渡されないことを除き、標準のムービーコントローラと同様に動作します。

アプリケーションがムービーコントローラをアタッチする NewMovieController を呼び出すと、NewMovieController はまず kUserDataMovieControllerType タイプのムービーユーザデータ項目を探し、見つかった場合は、その項目のデータで指定したサブタイプを持っているムービーコントローラコンポーネントのインスタンスを開こうとします。これは、アプリケーションに認識されることなく行われます。

インポータは次のように、SetUserDataItem 関数を呼び出し、データパラメータに希望のコントローラタイプを渡し、udType パラメータに kUserDataMovieControllerType を渡すことによって、ムービーにとって推奨されるコントローラを指定することができます。

リスト 7: インタフェースなしのムービーコントローラヒントを指定

OSErr err;
OSType  noneType = FOUR_CHAR_CODE('none');

/* このムービーにコントローラ「なし」を設定する */
err = SetUserDataItem(GetMovieUserData(theMovie), &noneType, sizeof(noneType),
          kUserDataMovieControllerType, 1);

ムービーにムービーコントローラヒントを提供するには、インポータの MovieImportDataRef ルーチンで SetUserDataItem を呼び出す必要があります。

先頭に戻る

要約

アイドリングムービーインポータは、定期的に呼び出されてムービーデータを処理する特別なルーチン MovieImportIdle を実装していることを除き、通常のムービーインポータと同じです。ムービーインポートコンポーネント をアイドリングムービーインポートコンポーネントとして指定するには、コンポーネントの ComponentDescription 構造体の componentFlags フィールドで canMovieImportWithIdle コンポーネントフラグ(QuickTimeComponents.h を参照)を特定します。アイドリングムービーインポートコンポーネントは、定期的に呼び出されてムービーデータを処理するために、MovieImportIdle ルーチンを実装する必要があります。アイドリングムービーインポータは、SetUserDataItem 関数を通じて kUserDataMovieControllerType ユーザデータ項目をムービーに追加することで、ムービーに適したムービーコントローラヒントを指定することもできます。

先頭に戻る

ドキュメントの改訂履歴

日付メモ
2004-11-12初版

掲載日: 2004-11-12