■AVIファイル関数・マクロについて

(翻訳:がんぞう)

AVIファイル関数・マクロは、波形音声ファイル(WAVeform-audio、略してWAV)や音声
・映像がインターリーブ(相互挿入)されたファイル(Audio-Video Interleaved、
略してAVI)などの『Resource Information File Format(RIFFと略す。資源情報ファイ
ルフォーマットのこと)』を用いた時間基調のファイルアクセス環境を提供します。
これらの関数・マクロは、実際のRIFFアーキテクチャを管理・操作することなしにRIFF
ファイルの内在する機能を扱うことが出来ます。

AVIファイル関数・マクロは、時間基調ファイルの中の情報を、明示された「チャンク
(データ集合)」と呼ばれるデータ集合体の変わりに、1ないし複数のデータストリー
ム(データの流れ)として処理します。データストリームは時間基調ファイルの内容を
参照します。AVIファイルは、動画・英語音声トラック・フランス語音声トラックといっ
た、いくつかの違うデータタイプを保持することが出来ます。AVIファイルを使うことで
こういった構成要素を互いに別々にアクセスするアプリケーションが可能になります。

(注釈)AVIファイル関数・マクロはどんなRIFFファイルについても作業することが可能
ですが、この章ではAVIファイルにおける使用方法についてだけ説明します。
AVIファイルは、AVIファイル関数・マクロ上で使用する典型的な時間基調ファ
イルなのです。

AVIファイル関数・マクロはダイナミック・リンク・ライブラリ(動的結合ライブラリ、
DLLと略す)として存在します。ライブラリの初期化には AVIFileInit 関数を呼び出し
ます。初期化後は全てのAVIファイル関数・マクロが利用可能となります。ライブラリを
解放するには AVIFileExit 関数を呼び出します。AVIファイルライブラリは、アプリケ
ーションがライブラリを呼び出した参照回数を解放されるまで保持します。アプリケー
ションを作成する際は、アプリケーション終了時に完全に解放される様に、AVIFileInit
とAVIFileExitの使用回数を合わせる必要があります。

------------------------------------------------------------------------------
AVICOMPRESSOPTIONS   【構造体】
------------------------------------------------------------------------------

【定義】
typedef struct {
DWORD fccType;
DWORD fccHandler;
DWORD dwKeyFrameEvery;
DWORD dwQuality;
DWORD dwBytesPerSecond;
DWORD dwFlags;
LPVOID lpFormat;
DWORD cbFormat;
LPVOID lpParms;
DWORD cbParms;
DWORD dwInterleaveEvery;
} AVICOMPRESSOPTIONS;

【内容】
ストリームに関する情報や、圧縮・保存の方法などの方法についての情報を保持する。
この構造体は AVIMakeCompressedStream 関数(または、AVIMakeCompressedStream 関
数で用いられる AVISave 関数)にデータを引き渡す。

【メンバ】
fccType
  ストリームタイプを示す4キャラクター(4バイト)コード。
  AVI ストリームにおいて一般的なものは、以下の様に定数として定義されている。
streamtypeAUDIO オーディオ(音声)ストリームを示す
streamtypeMIDI MIDI(演奏データ)ストリームを示す
streamtypeTEXT テキスト(文章)ストリームを示す
streamtypeVIDEO ビデオ(映像)ストリームを示す

fccHandler
  圧縮ハンドラーを示す4キャラクター(4バイト)コード。
  このビデオストリームが保存されたときに用いられた圧縮形式を示す。
  (例として mmioFOURCC('M','S','V','C') など)
  このメンバはオーディオストリームでは使用しない。

dwKeyFrameEvery
  ビデオのキーフレーム間の最大値。
  このメンバは AVICOMPRESSF_KEYFRAMES フラグが立っている場合のみ使用される。
  その他の場合は全てのフレームがキーフレームとなる。

dwQuality
  ビデオ圧縮を通す際の品質を示す値。
  このメンバはオーディオストリームには使用しない。

dwBytesPerSecond
  ビデオ圧縮時のデータレート。このメンバは AVICOMPRESSF_DATARATE フラグが立っ
  ている場合のみ使用される。

dwFlags
  圧縮時に用いられるフラグ。
  以下の値が定義されている。

AVICOMPRESSF_DATARATE
  dwBytesPerSecond が示すデータ転送レートを用いて圧縮されたビデオスト
  リーム

AVICOMPRESSF_INTERLEAVE
  このビデオストリームに最初のストリームを dwInterleaveEvery が示すフ
  レーム数ごとに挟み込んでいる

AVICOMPRESSF_KEYFRAME
  dwKeyFrameEvery が示すキーフレーム値を最低キーフレーム数として保存
  されたビデオストリーム。通常、全フレームがキーフレームとなる。

AVICOMPRESSF_VALID
  AVISaveOptions で定義された圧縮初期値をこの構造体のデータとして用い
  る。このフラグが立っていない空の構造体が渡された場合、一部の初期値
  が選択される。

lpFormat
  データフォーマットが定義されている構造体のアドレス。オーディオストリームに
  用いられ、LPWAVEFORMAT 構造体である。

cbForamt
  lpFormat が参照するデータサイズ(バイト単位)

lpParms
  ビデオ圧縮特性データ。内部的に用いられる。

cbParms
  lpParms が参照するデータサイズ(バイト単位)

dwInterleaveEvery
  ストリームデータに最初のストリームからのデータを混在させるインターリーブ要
  素。AVICOMPRESSF_INTERLEAVE フラグが立っている場合のみ用いられる。

------------------------------------------------------------------------------
AVIFILEINFO   【構造体】
------------------------------------------------------------------------------

【定義】
typedef struct {
DWORD dwMaxBytesPerSec; // ファイルのデータレートのほぼ最大値
DWORD dwFlags; // 下記参照
DWORD dwCaps; // 下記参照
DWORD dwStreams; // 下記参照
DWORD dwSuggestedBufferSize; // 下記参照
DWORD dwWidth; // AVIファイル中の幅(ピクセル単位)
DWORD dwHeight; // AVIファイル中の高さ(ピクセル単位)
DWORD dwScale; // 下記参照
DWORD dwRate; // dwScale に併記
DWORD dwLength; // 下記参照
DWORD dwEditCount; // 下記参照
char szFileType[64]; // 下記参照
} AVIFILEINFO;

【内容】
完全なAVIファイルのグローバル情報を保持する。

【メンバ】
dwFlags
  拡張可能なフラグ。以下のフラグが定義されている。

AVIFILEINFO_HASINDEX
  指定のAVIファイルは、ファイルの末尾にインデックスを持つ。
  ※より良い実行のためには、全てのAVIファイルはインデックスを持つべき
   である。

AVIFILEINFO_MUSTUSEINDEX
  指定ファイルのインデックスに、ファイル中のチャンク(データ集合)の
  再生順序が含まれている。ファイル最盛時にチャンクの物理順序ではなく
  このインデックスを使う。編集時のフレームリストを作成するときなどに
  利用できる。

AVIFILEINFO_INTERLEAVED
  インターリーブ(複数ストリームが交互に挿入されている)AVIファイル

AVIFILEINFO_WASCAPTUREFILE
  リアルタイムビデオのために特別に割り当てられたAVIファイル
  アプリケーションは、ユーザーが恐らくこのファイルを整理してしまうこ
  とを踏まえて、上書きする際に警告すべきである。

AVIFILEINFO_COPYRIGHTED
  著作権情報を含むデータ・プログラムを含むAVIファイル
  このフラグが立っている場合、ソフトウェアは複製を許可してはならない。

dwCaps
  適応フラグ。以下のフラグが定義されている。

AVIFILECAPS_CANREAD
  アプリケーション上で読み込み許可のもとに開くことができる

AVIFILECAPS_CANWRITE
  アプリケーション上で書き込み許可のもとに開くことができる

AVIFILECAPS_ALLKEYFRAMES
  全てのフレームがキーフレームなAVIファイル

AVIFILECAPS_NOCOMPRESSION
  圧縮方式を用いていないAVIファイル

dwStreams
  ファイル中のストリーム数。例えば、音声と映像を含むファイルは、少なくとも2
  つのストリームを持つ。

dwSuggestedBufferSize
  読み込み時に必要となる予想されるバッファサイズ(バイト単位)
  一般的には、このサイズはファイル中の最大チャンク(データ集合)よりも充分に
  大きいべきである。インターリーブファイルの場合は、このサイズはチャンクでは
  なく、読み込む全レコードサイズよりも充分に大きい必要がある。
  もしこのバッファサイズが非常に小さい、または0が指定されている場合、再生ソ
  フトウェアは再生時にパフォーマンスに応じたメモリを再割り当てしなければなら
  ない。

dwScale
  全ファイルに適応できるタイムスケール
  (dwRate÷dwScale)は秒間サンプル数を表す。
  多くのストリームは、ストリーム自身のタイムスケールをファイルのタイムスケー
  ルに置き換えて定義することが出来る。

dwLength
  AVIファイルサイズ。単位は(dwRate÷dwScale)で表す。

dwEditCount
  AVIファイルに追加、またはAVIファイルから削除されたストリームの数

szFileType
  ファイルタイプ情報の記述を含む、ヌルで終わる文字列

------------------------------------------------------------------------------
AVIStreamDataSize   【マクロ】
------------------------------------------------------------------------------

【書式】
AVIStreamDataSize(pavi, fcc, plSize);

【機能】
指定ストリームの任意のヘッダーデータを検索するために必要なバッファサイズをバイ
ト単位で算出する。

【戻り値】
成功すれば0を、失敗するとそれ以外が戻る。
戻り値が AVIERR_NODATA の場合、指定した4文字コードではデータを発見出来なかった
ことを示す。

【引数】
pavi
  オープンされたストリームのハンドル。

fcc
  ストリームタイプを指定する4文字コード

plSize
  任意のヘッダーデータのバッファサイズを入れるアドレス

【補足】
AVIStreamDataSize マクロは次のように定義されている。

#define AVIStreamDataSize(pavi, fcc, plSize) \
AVIStreamReadData(pavi, fcc, NULL, plSize)

------------------------------------------------------------------------------
AVIStreamEnd   【マクロ】
------------------------------------------------------------------------------

【書式】
AVIStreamEnd(pavi);

【機能】
ストリームの最後に結合されたサンプルを算出する。

【戻り値】
ストリームの最後に結合されたサンプルを戻す。エラーが発生した場合、最初のサンプ
ル、あるいはストリームサイズより1小さい数値を戻す。

【引数】
pavi
  オープンされたストリームのハンドル。

【補足】
AVIStreamEnd マクロは次のように定義されている。

#define AVIStreamEnd(pavi) \
(AVIStreamStart(pavi) + AVIStreamLength(pavi))

------------------------------------------------------------------------------
AVIStreamEndTime   【マクロ】
------------------------------------------------------------------------------

【書式】
AVIStreamEndTime(pavi);

【機能】
ストリームの最後を表す時間を戻す。

【戻り値】
成功なら時間を、エラーなら−1を戻す。

【引数】
pavi
  オープンされたストリームハンドル

【補足】
AVIStreamEndTime マクロは次のように定義される。

#define AVIStreamEndTime(pavi) \
AVIStreamSampleToTime(pavi, AVIStreamEnd(pavi))

------------------------------------------------------------------------------
AVIBuildFilter    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI AVIBuildFilter(LPTSTR lpszFilter, LONG cbFilter, BOOL fSaving);

【機能】
フィルターの仕様を設定する。これは GetOpenFileName 及び GetSaveFileName 関数で
使用する。

【戻り値】
関数の呼び出しが成功すれば AVIERR_OK が、それ以外なら下記のエラー値が戻る。

AVIERR_BUFFERTOOSMALL
  cbFilter で指定されるバッファサイズが作成されるフィルターのサイズ
  よりも小さい
AVIERR_MEMORY
  読み込み操作を完了するのに充分なメモリがない

【引数】
lpszFilter
  フィルター文字列を代入したバッファのアドレス
cbFilter
  lpszFilter で指定されるバッファのサイズ(バイト単位)
fSaving
  フィルターが読み込み型か書き込み型のどちらかを示すフラグ
  True なら書き込み型、False なら読み込み型となる

【補足】
この関数は、全てのフィルター型について、AVIファイルライブラリがマルチメディアフ
ァイルを開く・読む・書くのに使用することが出来るということについてのレジストリ
操作を行う。ハードディスク内のフィルターDLLやフォーマットは検索しない。

------------------------------------------------------------------------------
AVIClearClipboard    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI AVIClearClipboard(VOID);

【機能】
クリップボードからのAVIファイルを解除する。

【戻り値】
成功すれば0、失敗するとそれ以外が戻る。

------------------------------------------------------------------------------
AVIFileAddRef    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI_(ULONG) AVIFileAddRef(PAVIFILE pfile);

【機能】
AVIファイルの参照回数を+1する。

【戻り値】
成功すれば更新されたファイルインターフェイスの参照カウンタを戻す。

【引数】
pfile
  オープンされたAVIファイルのハンドル

------------------------------------------------------------------------------
AVIFileCreateStream    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI AVIFileCreateStream(PAVIFILE pfile, PAVISTREAM FAR *ppavi,
AVISTREAMINFO FAR *psi);

【機能】
存在するファイルに新しいストリームを作成し、新しいストリームに対するインターフ
ェイスを確立する。

【戻り値】
成功すれば0、失敗するとそれ以外が戻る。ファイルが既に開かれていて書き込み許可
されている場合を除き、この関数は AVIERR_READONLY を戻す。

【引数】
pfile
  オープンされたAVIファイルのハンドル

ppavi
  新しいストリームインターフェースのアドレス

psi
  ストリームの種類やサンプルレートを含む、新しいストリームに関する情報を保持
  した構造体のアドレス

【補足】
この関数によって、新しいストリームの参照カウントを開始する。

------------------------------------------------------------------------------
AVIFileEndRecord    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI AVIFileEndRecord(PAVIFILE pfile);

【機能】
映像と音声データを1対1の比率で交互に挿入しているインターリーブファイルの書き
込みを行っているときに、登録終了コードを記録する。

【戻り値】
成功すれば0、失敗するとそれ以外が戻る。

【引数】
pfile
  オープンされたAVIファイルのハンドル

【補足】
AVIFileSave 関数はこの関数を内部的に呼び出している。一般的には、アプリケーショ
ンからこの関数を直接呼び出す必要はない。

------------------------------------------------------------------------------
AVIFileExit    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI_(VOID) AVIFileExit(VOID);

【機能】
AVIファイルライブラリの使用を終了し、ライブラリ参照カウンタを−1する。
この関数は旧ライブラリの AVIStreamExit 関数を継承している。

【戻り値】
成功すれば0、失敗するとそれ以外が戻る。

【引数】
pfile
  オープンされたAVIファイルのハンドル

------------------------------------------------------------------------------
AVIFileGetStream    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI AVIFileGetStream(PAVIFILE pfile, PAVISTREAM FAR *ppavi, DWORD fccType,
LONG lParam);

【機能】
指定されたAVIファイルに結合されたストリームインターフェイスアドレスを取得する。

【戻り値】
成功すれば0、失敗するとそれ以外が戻る。
以下のエラー値が戻る可能性がある。
AVIERR_NODATA
  指定したファイルは fccType や lParam の指定に一致するストリームを含
  んでいない

AVIERR_MEMORY
  メモリが不足している

【引数】
pfile
  オープンされたAVIファイルのハンドル

ppavi
  新しいストリームインターフェースのアドレス

fccType
  ストリームタイプを示す4キャラクター(4バイト)コード。
  0なら開かれた任意のストリームを示す。
  AVI ストリームにおいて一般的なものは、以下の様に定数として定義されている。
streamtypeAUDIO オーディオ(音声)ストリームを示す
streamtypeMIDI MIDI(演奏データ)ストリームを示す
streamtypeTEXT テキスト(文章)ストリームを示す
streamtypeVIDEO ビデオ(映像)ストリームを示す

lParam
  ストリームタイプのカウント
  特定ストリームタイプの中のどのストリームにアクセスするか指定する。

【用例】
指定ストリームが「VIDEO AUDIO-1 AUDIO-2」となっている場合に AUDIO-2 を指定する
には、

AVIFileGetStream(pfile, ppavi, streamtypeAUDIO, 1);

とする。

------------------------------------------------------------------------------
AVIFileInfo    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI AVIFileInfo(PAVIFILE pfile, AVIFILEINFO FAR *pfi, LONG lSize);

【機能】
AVIファイルに関する情報を取得する。

【戻り値】
成功すれば0、失敗するとそれ以外が戻る。

【引数】
pfile
  オープンされたAVIファイルのハンドル

pfi
  ファイル情報を取得するのに使用する構造体のアドレス
  通常は AVIFILEINFO 構造体を指す。

lSize
  構造体のサイズ(バイト単位)

------------------------------------------------------------------------------
AVIFileInit    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI_(VOID) AVIFileInit(VOID);

【機能】
AVIファイルライブラリを初期化する。

AVIファイルライブラリは初期化の回数は保持するが、解放した回数は保持しない。
AVIFileExit 関数を呼び出して解放した場合、AVIファイルライブラリは参照カウントを
−1する。
AVIFileInit は、AVIFile 関数を使用する前に呼び出す。

【補足】
この関数は、旧式の AVIStreamInit 関数を継承する。

------------------------------------------------------------------------------
AVIFileOpen    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI AVIFileOpen(PAVIFILE FAR *ppfile, LPCTSTR szFile, UINT mode,
CLSID FAR *pclsidHandler);

【機能】
AVIファイルを開き、アクセス時に使用するファイルインターフェースアドレスを返す。
AVIファイルライブラリは、ファイルを開いた回数を保持するが、解放された回数は保持
しない。AVIFileRelease 関数は、ファイルを解放してカウントを−1する。

【戻り値】
成功すれば0、失敗するとそれ以外が戻る。
以下のエラー値が戻る可能性がある。

AVIERR_BADFORMAT
  ファイルを読み込むことが出来ない。誤りを含んでいたり認識できないフ
  ァイルを示す。

AVIERR_MEMORY
  メモリが不充分なためファイルを開くことが出来ない。

AVIERR_FILEREAD
  ファイル読み込み中にディスクエラーが発生した。

AVIERR_FILEOPEN
  ファイルをオープン中にディスクエラーが発生した。

REGDB_E_CLASSNOTREG
  レジストリによると、AVIFileOpen で指定されたファイルタイプは処理す
  るハンドラが存在しない。

【引数】
ppfile
  オープンされたAVIファイルのインターフェースポインタを示すアドレス

szFile
  オープンするファイルの名前を含む、ヌルで終わる文字列

mode
  ファイルを開く際に使用するアクセスモード。
  デフォルトアクセスモードは「OF_READ」である。AVIFileOpen で指定できるモード
  は以下の通りである。

OF_CREATE
  新しいファイルを作成する。既に存在する場合はファイル長を0にする。

OF_SHARE_DENY_NONE
  ファイルを共有モードで開く。他のプロセスからこのファイルを開いて読
  み込み・書き込みすることが出来る。
  他のプロセスが互換モードで開いている場合、AVIFileOpen は失敗する。

OF_SHARE_DENY_READ
  ファイルを共有モードで開く。他のプロセスからこのファイルを開いて書
  き込むことが出来る。
  他のプロセスが互換モードで開いていたりファイルを読み込んでいる場合
  AVIFileOpen は失敗する。

OF_SHARE_DENY_WRITE
  ファイルを共有モードで開く。他のプロセスからこのファイルを開いて読
  み込むことが出来る。
  他のプロセスが互換モードで開いていたりファイルを書き込んでいる場合
  AVIFileOpen は失敗する。

OF_SHARE_EXCLUSIVE
  ファイルを開き、他のどんなプロセスからのどの様なアクセスも否定する。
  他のプロセスがこのファイルを開いている場合、AVIFileOpenは失敗する。

OF_READ
  ファイルを読み込みモードで開く。

OF_READWRITE
  ファイルを読み込み・書き込み共用モードで開く。

OF_WRITE
  ファイルを書き込みモードで開く。

pclsidHandler
  使用したい標準/カスタムハンドルのクラス特性のアドレス。
  ヌルが指定された場合、システムはファイル名の拡張子をもとにレジストリ内から
  か、またファイル内で指定されている RIFF タイプを選択する。

------------------------------------------------------------------------------
AVIFileReadData    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI AVIFileReadData(PAVIFILE pfile, DWORD ckid, LPVOID lpData,
LONG FAR *lpcbData);

【機能】
作者や著作権情報といった、全てのファイルについている任意のヘッダーデータを読み
込む。

【戻り値】
成功すれば0、失敗するとそれ以外が戻る。
要求されたデータチャンクが存在しない場合、戻り値は AVIERR_NODATA になる。

【引数】
pfile
  オープンされたAVIファイルのハンドル

ckid
  データのRIFF チャンク識別子(4文字コード)

lpData
  データを読み込む際に使用するバッファアドレス

lpcbData
  lpData が参照するメモリブロックのサイズを示すアドレス
  データ読み込みが成功した場合、この値は読み込まれたデータの実サイズに変更さ
  れる。

------------------------------------------------------------------------------
AVIFileRelease    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI_(ULONG) AVIFileRelase(PAVIFILE pfile);

【機能】

AVIファイルインターフェースハンドルの参照カウンタを−1する。カウンタが0になっ
た場合、ファイルを閉じる。

【戻り値】
ファイルの参照カウンタを戻す。
この戻り値は、デバッグ目的に限って使用すべきである。

【引数】
pfile
  オープンされたAVIファイルのハンドル

【補足】
この関数は、旧式の AVIFileClose 関数を継承する。

------------------------------------------------------------------------------
AVIFileWriteData    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI AVIFileWriteData(PAVIFILE pfile, DWORD ckid, LPVOID lpData,
LONG cbData);

【機能】
補足データ(標準的なヘッダー、フォーマット、ストリームデータ以外)を書きこむ。

【戻り値】
成功すれば0、失敗するとそれ以外が戻る。
アプリケーションが読み込み専用モードで開いている場合、戻り値は AVIERR_READONLY
になる。

【引数】
pfile
  オープンされたAVIファイルのハンドル

ckid
  データのRIFF チャンク識別子(4文字コード)

lpData
  書き込みデータバッファアドレス

cbData
  lpData が示すメモリブロックのサイズ(バイト単位)

【補足】
独自ストリームを挿入したデータを書き出すには AVIStreamWriteData 関数を用いる。

------------------------------------------------------------------------------
AVIGetFromClipboard    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI AVIGetFromClipboard(PAVIFILE *lppf);

【機能】
クリップボードからAVIファイルをコピーする。

【戻り値】
成功すれば0、失敗するとそれ以外が戻る。

【引数】
lppf
  作成されたAVIファイルのハンドルを戻すためのアドレス

【補足】
クリップボード中にAVIファイルが存在しない場合、AVIGetFromClipboard は CF_DIV や
CF_WAVE といったクリップボードフラグをAVIファイルとしてコピーすることも可能であ
る。この場合、本関数は1つの DIV ストリームと一つの波形音声ストリームによるAVI
ファイルを作成し、両方のストリームをクリップボードからのデータで埋める。

------------------------------------------------------------------------------
AVIMakeCompressedStream    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI AVIMakeCompressedStream(PAVISTREAM FAR *ppsCompressed,
PAVISTREAM psSource, AVICOMPRESSOPTIONS FAR *lpOptions,
CLSID FAR *pclsidHandler);

【機能】
非圧縮のストリームから圧縮フィルターに基づく圧縮ストリームを作成し、圧縮ストリ
ームアドレスを戻す。本関数は音声と映像の圧縮をサポートする。

【戻り値】
成功すればAVIERR_OKを、失敗するとそれ以外が戻る。
以下のエラー値が戻る可能性がある。
AVIERR_NOCOMPRESSOR
  適当な圧縮ルーチンが見つからない

AVIERR_MEMORY
  操作を完了するのに充分なメモリが確保できない

AVIERR_UNSUPPORTED
  指定した種類のデータの圧縮はサポートされていない。
  音声・映像以外のデータを圧縮しようとした場合などに発生する。

【引数】
ppsCompressed
  圧縮ストリームのポインタを入れるアドレス

psSource
  圧縮対象となるストリームのアドレス

lpOptions
  使用する圧縮タイプや用いるオプションなどを示す構造体の存在するアドレス
  AVICOMPRESSOPTIONS 構造体中で適当なハンドラが示す映像圧縮を指定することがで
  きる。音声圧縮には、圧縮データフォーマットを指定する。

pclsidHandler
  ストリーム作成に用いるクラス識別子のアドレス

【補足】
アプリケーションは圧縮ストリームを読み書きすることが出来る。

------------------------------------------------------------------------------
AVIMakeFileFromStream    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI AVIMakeFileFromStream(PAVIFILE FAR *ppfile, int nStreams,
PAVISTREAM FAR *papStreams);

【機能】
複数のストリームから1つのAVIFileインターフェースポインタを作成する。

【戻り値】
成功すれば0を、失敗するとそれ以外が戻る。

【引数】
ppfile
  新しいファイルのインターフェースポインタを戻すアドレス

nStreams
  papStreamsで参照するストリームインターフェースポインタ配列内のストリーム数

papStreams
  ストリームインターフェースポインタ配列アドレス

【補足】
AVIFileRelease 関数でファイルをクローズする。

他の関数からこの関数の作成した AVIFile インターフェースをコピーしたり、このイン
ターフェースと結合されたストリームを編集することが出来る。
例えば、ファイルインターフェースポインタに対し AVIFileGetStream を用いて特定の
ストリームを検索することが可能である。

------------------------------------------------------------------------------
AVIMakeStreamFromClipboard    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI AVIMakeStreamFromClipboard(UINT cfFormat, HANDLE hGlobal,
PAVISTREAM FAR *ppStream);

【機能】
クリップボード内のストリームデータから編集可能なストリームを作成する。

【戻り値】
成功すれば0を、失敗するとそれ以外が戻る。

【引数】
cfFormat
  クリップボードフラグ

hGlobal
  クリップボード内のストリームデータのハンドル

ppStreams
  作成されたストリームのハンドル

【補足】
アプリケーション上でこの編集可能なストリームを使い終えたら、ハンドルに結合され
たストリーム資源は解放しなければならない。

------------------------------------------------------------------------------
AVIPutFileOnClipboard    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI AVIPutFileOnClipboard(PAVIFILE pf);

【機能】
AVIファイルをクリップボードにコピーする。

【戻り値】
成功すれば0を、失敗するとそれ以外が戻る。

【引数】
pf
  オープンされたAVIファイルのハンドル

【補足】
本関数は、CF_DIV、CF_PALETTE、またはCF_WAVE クリップボードフラグが立ったデータ
を、最初のフレームに DIV などの映像ストリームや CF_WAVE の様な音声ストリームを
用いたクリップボード上にコピーすることも出来る。

------------------------------------------------------------------------------
AVISave    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI AVISave(LPCTSTR szFile, CLSID FAR *pclsidHandler,
AVISAVECALLBACK lpfnCallback, int nStreams, PAVISTREAM pavi,
LPAVICOMPRESSOPTIONS lpOptions, ...);

【機能】
他ファイルまたはメモリ上にある複数のストリームを結合させてファイルを作成する。

【戻り値】
成功すれば AVIERR_OK を、失敗するとそれ以外が戻る。

【引数】
szFile
  保存するファイルの名前を含む、ヌルで終わる文字列

pclsidHandler
  ファイル書き込み時に使用するハンドラアドレス
  このファイルは、このハンドラを用いて AVIFileOpen 関数を呼び出すことにより
  作成される。ハンドラを指定しなかった場合は、ファイル拡張子に基づいてレジス
  トリからの初期値が選択される。

lpfnCallback
  セーブ処理のためのコールバック関数アドレス

nStreams
  ファイルに保存するストリーム数

pavi
  AVIストリームのアドレス
  このパラメータはlpOptionsと共に用いられる。これらパラメータ一組は、nStream
  分だけ並べることが出来る。

lpOptions
  アプリケーションが定義する、pavi が示すストリームに関する圧縮オプションを含
  む AVICOMPRESSOPTIONS 構造体アドレス
  このパラメータは pavi と共に用いられる。これらパラメータ一組は、nStream 分
  だけ並べることが出来る。

【補足】
この関数は(1)ファイルを作成し、(2)ストリームデータをファイルにコピーし、(3)ファ
イルを閉じて、そして(4)新しいファイルによって使われたリソースを解放する。

この関数の最後の2つのパラメータは、ファイルでセーブするべきストリームを識別子
と、そのストリームの圧縮オプションを定義する。

AVI ファイルで1以上のストリームをセーブするとき、ファイル中のそれぞれのストリ
ームのためにこれらの2つのストリーム特定のパラメータを繰り返す。

(lpfnCallback により参照された)callback 関数はステータス情報を表示することが
可能で、そこでユーザーにセーブオペレーションを中止させることができる。

callback 関数は以下のフォーマットで用いる。

LONG FAR PASCAL SaveCallback(int nPercent);

nPercent パラメータは、セーブされたファイルのパーセンテージを指定する。

オペレーションを継続したなら、 callback 関数は AVIERR_OK を、またユーザーがセー
ブオペレーション中止を指定したなら、 callback 関数は AVIERR_USERABORT を返すべ
きである。

------------------------------------------------------------------------------
AVISaveOptions    【関数】
------------------------------------------------------------------------------

【書式】
BOOL AVISaveOptions(HWND hwnd, UINT uiFlags, int nStreams,
PAVISTREAM FAR * ppavi, LPAVICOMPRESSOPTIONS FAR * plpOptions);

【機能】
ファイルのための保存オプションを検索し、バッファからオプションを返す。

【戻り値】
成功すれば AVIERR_OK を、失敗するとそれ以外が戻る。

【引数】
hwnd
  圧縮オプションダイアログボックスのための親ウインドウのハンドル

uiFlags
  圧縮オプションダイアログボックスの表示フラグ。
  以下のフラグが定義されている。

ICMF_CHOOSE_KEYFRAME
  ビデオオプションの全てのダイアログボックスにキーフレームを表示
  これは ICCompressorChoose 関数で使われるものと同様である。

ICMF_CHOOSE_DATARATE
  ビデオオプションダイアログボックスにデータレートを表示
  これは ICCompressorChoose 関数で使われるものと同様である。

ICMF_CHOOSE_PREVIEW
  ビデオオプションにプレビューボタンを表示
  このボタンはストリーム中のフレームを用いて圧縮プレビューを行う。
  これは ICCompressorChoose 関数で使われるものと同様である。

nStreams
  ダイアログボックスによって設定されたオプションを持つストリーム数

ppavi
  ストリームインタフェースポインタのアドレス配列
  nStreams パラメータは配列中のポインタ数を示す。

plpOptions
  AVICOMPRESSOPTIONS 構造のポインタ配列アドレス
  これらの構造体はダイアログボックスによって設定された圧縮オプションを保持し
  ている。
  nStreams パラメータは配列中のポインタ数を示す。

【補足】
この関数は hwnd を親ウインドウハンドルとして標準圧縮オプションダイアログボック
スを表示する。ユーザーがそれぞれのストリームの圧縮オプションを設定して終了する
と、オプションは plpOptions の指すアドレスに AVICOMPRESSOPTIONS 構造体のポイン
タ配列として戻される。

呼び出したアプリケーションは ppavi によって参照される配列からストリームのインタ
フェースポインタを通さなければならない。

アプリケーションは AVICOMPRESSOPTIONS 構造体と、これらのポインタ配列のためのメ
モリを割り当てなければならない。

------------------------------------------------------------------------------
AVISaveOptionsFree    【関数】
------------------------------------------------------------------------------

【書式】
LONG AVISaveOptionsFree(int nStreams,
LPAVICOMPRESSOPTIONS FAR * plpOptions);


【機能】
AVISaveOptions 機能によって割り当てられたリソースを解放する。

【戻り値】
AVIERR_OK を戻す。

【引数】
nStreams
  plpOptions で参照する AVICOMPRESSOPTIONS 構造体の数

plpOptions
  AVICOMPRESSOPTIONS 構造体へのポインタアドレス配列
  これらの構造体はダイアログボックスによって設定された圧縮オプションを持つ。
  AVISaveOptions によって割り当てられたこれら全ての構造体のリソースは解放され
  る。

------------------------------------------------------------------------------
AVISaveV    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI AVISaveV(LPCTSTR szFile, CLSID FAR * pclsidHandler,
AVISAVECALLBACK lpfnCallback, int nStreams, PAVISTREAM FAR * ppavi,
LPAVICOMPRESSOPTIONS FAR * plpOptions);

【機能】
他のファイルまたはメモリ上からデータストリームを結合してファイルを構築する。

【戻り値】
成功すれば AVIERR_OK を、失敗するとそれ以外が戻る。

【引数】
szFile
  セーブするファイルの名前を含む、ヌルで終わる文字列

pclsidHandler
  ファイルの書き込みに使用するファイルハンドルのアドレス
  AVIFileOpen 関数は、このハンドラを用いてファイルを作成する。
  もしハンドラを指定しなければ、ファイル拡張子に基づいてレジストリからデフォ
  ルトが選択される。

lpfnCallback
  ステータス情報を表示したり、ユーザーによるセーブ処理中止を確認するための
  callback 関数のアドレス

nStreams
  セーブすべきストリームの数

この値はデバッグ作業のためにだけ使われるべきである。

【引数】
オープンしている AVI ストリームのハンドル

------------------------------------------------------------------------------
AVIStreamBeginStreaming    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI AVIStreamBeginStreaming(PAVISTREAM pavi, LONG lStart,
LONG lEnd, LONG lRate);

【機能】
ストリーミングで用いるパラメータを指定し、ストリームハンドラをストリーミング用
に準備する。

【戻り値】
成功すれば0を、失敗するとそれ以外が戻る。

【引数】
pavi
  ストリーミングアドレス

lStart
  ストリーミング開始フレーム

lEnd
  ストリーミング終了フレーム

lRate
  ファイル固有の再生スピードに対する読み込み速度
  1000を指定すると標準速度になる。1000より少なければ遅く、大きければ
  速くなる。

------------------------------------------------------------------------------
AVIStreamCreate    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI AVIStreamCreate(PAVISTREAM FAR * ppavi, LONG lParam1,
LONG lParam2, CLSID FAR * pclsidHandler);

【機能】
どのファイルとも結合されていないストリームを作成する。

【戻り値】
成功すれば0を、失敗するとそれ以外が戻る。

【引数】
ppavi
  新しいストリームインターフェースを持つアドレス

lParam1
  ストリームハンドラ固有情報

lParam2
  ストリームハンドラ固有情報

pclsidHandler
  ストリームに用いるクラス識別子のアドレス。

【補足】
この関数は極力使用しないことが望ましい。
CreateEditableStream や AVIMakeCompressedStream といった幾つかの関数は内部的に
この関数を呼び出す。

------------------------------------------------------------------------------
AVIStreamEndStreaming    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI AVIStreamEndStreaming(PAVISTREAM pavi);

【機能】
ストリーミングを終了する。

【戻り値】
成功すれば0を、失敗するとそれ以外が戻る。

【引数】
pavi
  ストリームアドレス

【補足】
多くのストリーム処理はこの関数を無視する。

------------------------------------------------------------------------------
AVIStreamFindSample    【関数】
------------------------------------------------------------------------------

【書式】
STDAPI_(LONG) AVIStreamFindSample(PAVISTREAM pavi, LONG lPos,
LONG lFlags);

【機能】
指定されたポジションに対するサンプルポジション(キーフレーム、空でないフレーム、
あるいはフォーマット変更されたフレーム)を戻す。

【戻り値】
成功なら検出された位置を、エラーなら−1を戻す。

【引数】
pavi
  オープンされたストリームのハンドル

lPos
  捜索開始フレーム

lFlags
  検出するフレームタイプ、ストリームの検索方向、リターン情報の種類を表すフラグ
  以下のフラグが定義されている。

FIND_ANY
  空でないフレームを検出する。
  このフラグは SEARCH_ANY フラグを継承する。

FIND_KEY
  キーフレームを検出する。
  このフラグは SEARCH_KEY フラグを継承する。

FIND_FORMAT
  フォーマット変更を検出する。

FIND_NEXT
  現在位置から一番近くにあるサンプル・フレーム・フォーマット変更を正
  方向に検索する。現在のサンプルも捜索対象となる。
  FIND_ANY・FIND_KEY・FIND_FORMAT フラグと共に使用する。
  このフラグは SEARCH_FORWARD フラグを継承する。

FIND_PREV
  現在位置から一番近くにあるサンプル・フレーム・フォーマット変更を逆
  方向に検索する。現在のサンプルも捜索対象となる。
  FIND_ANY・FIND_KEY・FIND_FORMAT フラグと共に使用する。
  このフラグは SEARCH_FORWARD・SEARCH_BACKWARD フラグを継承する。

FIND_FROM_START
  ストリームの先頭から一番近くにあるサンプル・フレーム・フォーマット
  変更を検索する。
  FIND_ANY・FIND_KEY・FIND_FORMAT フラグと共に使用する。

【補足】
FIND_KEY・FIND_ANY・FIND_FORMAT は同時に使用できない。
同様に FIND_NEXT と FIND_PREV も同時に使用できない。

この関数は、旧式の AVIStreamFindKeyFrame 関数を継承する。

------------------------------------------------------------------------------
AVI   【構造体】
------------------------------------------------------------------------------

【定義】

【内容】

【メンバ】

------------------------------------------------------------------------------
AVI   【マクロ】
------------------------------------------------------------------------------

【書式】

【機能】

【戻り値】

【引数】

【補足】

------------------------------------------------------------------------------
AVI    【関数】
------------------------------------------------------------------------------

【書式】

【機能】

【戻り値】

【引数】

【補足】