IAVIStream
COM公式ドキュメント
IAVIStream インターフェイスは、ファイル内のデータストリームの作成と操作をサポートします。IUnknown::QueryInterface、IUnknown::AddRef、IUnknown::Release に加えて、次のカスタムメソッドを使用します。
メソッド 11
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
Create メソッドは、どのファイルにも関連付けられていないストリームハンドラーを初期化します。アプリケーションが AVIStreamCreate 関数を使用したときに呼び出されます。
| lParam1 | LPARAM | in | ストリームハンドラー固有のデータ。 |
| lParam2 | LPARAM | in | ストリームハンドラー固有のデータ。 - psストリームへのインターフェイスへのポインター。 |
戻り値
OLE で定義された HRESULT を返します。
解説(Remarks)
C++ で記述されたハンドラーの場合、Create の構文は次のとおりです。
HRESULT Create(LONG lParam1, LONG lParam2)
Info メソッドは、ストリームに関する情報を AVISTREAMINFO 構造体に格納して返します。アプリケーションが AVIStreamInfo 関数を使用したときに呼び出されます。
| psi | AVISTREAMINFOW* | out | ストリーム情報を格納する AVISTREAMINFO 構造体へのポインター。 |
| lSize | INT | in | psi で指定された構造体のサイズ (バイト単位)。 - psストリームへのインターフェイスへのポインター。 |
戻り値
OLE で定義された HRESULT を返します。
解説(Remarks)
割り当てられたバッファーが構造体に対して小さすぎる場合、Info メソッドは AVIERR_BUFFERTOOSMALL を返して呼び出しを失敗させる必要があります。それ以外の場合は、構造体を格納し、そのサイズを返す必要があります。
C++ で記述されたハンドラーの場合、Info の構文は次のとおりです。
HRESULT Info(AVIFILEINFO *psi, LONG lSize)
FindSample メソッドは、ストリーム内のキーフレームまたは空でないフレームの位置を取得します。アプリケーションが AVIStreamFindSample 関数を使用したときに呼び出されます。
| lPos | INT | in | サンプルまたはフレームの位置。 | ||||||||||||
| lFlags | INT | in | 適用するフラグ。次の値が定義されています。
FIND_ANY、FIND_KEY、FIND_FORMAT の各フラグは相互排他的であり、FIND_NEXT と FIND_PREV も同様です。各グループから 1 つの値を指定する必要があります。 - psストリームへのインターフェイスへのポインター。 |
戻り値
アプリケーションが指定したフレームに対応するキーフレームの位置を返します。
解説(Remarks)
カスタムフォーマットにおいてキーフレームが重要でない場合は、lPos に指定された位置を返してください。
C++ で記述されたハンドラーの場合、FindSample の構文は次のとおりです。
LONG FindSample(LONG lPos, LONG lFlags)
ReadFormat メソッドは、ストリームからフォーマット情報を取得します。
| lPos | INT | in | サンプルまたはフレームの位置。 |
| lpFormat | void* | outoptional | フォーマットデータ用のバッファーへのポインター。必要なバッファーサイズを問い合わせるには NULL を指定します。 |
| lpcbFormat | INT* | inout | lpFormat で指定されたバッファーのサイズ (バイト単位) を受け取るバッファーへのポインター。このメソッドが呼び出されるとき、このパラメーターの内容は lpFormat で指定されたバッファーのサイズを示します。このメソッドがアプリケーションに制御を返すとき、このパラメーターの内容は読み取られたデータ量、または必要なバッファーサイズを示します。 - psストリームへのインターフェイスへのポインター。 |
戻り値
OLE で定義された HRESULT を返します。
解説(Remarks)
ストリームに格納されるデータの種類によって、フォーマット情報と、それを格納する構造体が決まります。ストリームハンドラーは、フォーマットがパレットを使用する場合のパレット情報を含め、適用されるすべてのフォーマット情報をこの構造体で返す必要があります。ストリームハンドラーは、この構造体でストリームデータを返してはなりません。
標準のビデオストリームハンドラーは、BITMAPINFOHEADER 構造体でフォーマット情報を提供します。標準のオーディオストリームハンドラーは、PCMWAVEFORMAT 構造体でフォーマット情報を提供します。その他のデータストリームは、ストリームデータを記述する別の構造体を使用できます。
C++ で記述されたハンドラーの場合、ReadFormat の構文は次のとおりです。
HRESULT ReadFormat(LONG lPos, LPVOID lpFormat,
LONG *lpcbFormat)
SetFormat メソッドは、ストリームにフォーマット情報を設定します。アプリケーションが AVIStreamSetFormat 関数を使用したときに呼び出されます。
| lPos | INT | in | ストリームへのインターフェイスへのポインター。 |
| lpFormat | void* | in | フォーマットデータ用のバッファーへのポインター。 |
| cbFormat | INT | in | lpFormat で指定されたバッファーのサイズ (バイト単位) を格納するアドレス。 |
戻り値
OLE で定義された HRESULT を返します。
解説(Remarks)
標準のビデオストリームハンドラーは、BITMAPINFOHEADER 構造体でフォーマット情報を提供します。標準のオーディオストリームハンドラーは、PCMWAVEFORMAT 構造体でフォーマット情報を提供します。その他のデータストリームは、ストリームデータを記述する別の構造体を使用できます。
C++ で記述されたハンドラーの場合、SetFormat の構文は次のとおりです。
HRESULT SetFormat(LONG lPos, LPVOID lpFormat, LONG cbFormat)
Read メソッドは、ストリームからデータを読み取り、アプリケーション定義のバッファーにコピーします。バッファーが指定されていない場合は、次のデータバッファーを取得するために必要なバッファーサイズを判定します。アプリケーションが AVIStreamRead 関数を使用したときに呼び出されます。
| lStart | INT | in | 読み取りを開始するサンプルまたはフレームの番号。 |
| lSamples | INT | in | 読み取るサンプル数。 |
| lpBuffer | void* | outoptional | ストリームデータを格納するアプリケーション定義のバッファーへのポインター。必要なバッファーサイズを問い合わせるために NULL を指定することもできます。多くのアプリケーションは、必要なバッファーの大きさを確認するため、各読み取り操作の前にバッファーサイズを問い合わせます。 |
| cbBuffer | INT | in | lpBuffer で指定されたバッファーのサイズ (バイト単位)。 |
| plBytes | INT* | outoptional | 読み取られたバイト数を受け取るバッファーへのポインター。 |
| plSamples | INT* | outoptional | 読み取られたサンプル数を受け取るバッファーへのポインター。 - psストリームへのインターフェイスへのポインター。 |
戻り値
成功した場合は AVIERR_OK を返し、バッファーがデータを保持するのに十分な大きさでない場合は AVIERR_BUFFERTOOSMALL を返します。成功した場合、Read はバッファーに含まれるフレーム (サンプル) 数を伴うデータバッファー、または必要なバッファーサイズ (バイト単位) のいずれかも返します。
解説(Remarks)
C++ で記述されたハンドラーの場合、Read の構文は次のとおりです。
HRESULT Read(LONG lStart, LONG lSamples,
LPVOID lpBuffer, LONG cbBuffer,
LONG *plBytes, LONG *plSamples);
Write メソッドは、ストリームにデータを書き込みます。アプリケーションが AVIStreamWrite 関数を使用したときに呼び出されます。
| lStart | INT | in | 書き込みを開始するサンプルまたはフレームの番号。 |
| lSamples | INT | in | 書き込むサンプル数。 |
| lpBuffer | void* | in | データ用のバッファーへのポインター。 |
| cbBuffer | INT | in | lpBuffer で指定されたバッファーのサイズ (バイト単位)。 |
| dwFlags | DWORD | in | 適用するフラグ。AVIF_KEYFRAME フラグが定義されており、このフレームが完全な画像に必要なすべての情報を含んでいることを示します。 |
| plSampWritten | INT* | outoptional | 書き込まれたサンプル数を格納するために使用されるバッファーへのポインター。 |
| plBytesWritten | INT* | outoptional | 書き込まれたバイト数を受け取るバッファーへのポインター。 - psストリームへのインターフェイスへのポインター。 |
戻り値
OLE で定義された HRESULT を返します。
解説(Remarks)
C++ で記述されたハンドラーの場合、Write の構文は次のとおりです。
HRESULT Write(LONG lStart, LONG lSamples, LPVOID lpBuffer,
LONG cbBuffer, DWORD dwFlags, LONG *plSampWritten,
LONG *plBytesWritten);
Delete メソッドは、ストリームからデータを削除します。
| lStart | INT | in | 削除を開始するサンプルまたはフレームの番号。 |
| lSamples | INT | in | 削除するサンプル数。 - psストリームへのインターフェイスへのポインター。 |
戻り値
OLE で定義された HRESULT を返します。
解説(Remarks)
C++ で記述されたハンドラーの場合、Delete の構文は次のとおりです。
HRESULT Delete(LONG lStart, LONG lSamples);
ReadData メソッドは、ストリームのデータヘッダーを読み取ります。アプリケーションが AVIStreamReadData 関数を使用したときに呼び出されます。
| fcc | DWORD | in | 読み取るストリームヘッダーの 4 文字コード。 |
| lp | void* | outoptional | ヘッダーデータを格納するバッファーへのポインター。 |
| lpcb | INT* | inout | lpBuffer で指定されたバッファーのサイズ (バイト単位)。このメソッドがアプリケーションに制御を返すとき、このパラメーターの内容は読み取られたデータ量を示します。 |
戻り値
OLE で定義された HRESULT を返します。
解説(Remarks)
C++ で記述されたハンドラーの場合、ReadData の構文は次のとおりです。
HRESULT ReadData(DWORD fcc, LPVOID lp, LONG *lpcb);
WriteData メソッドは、ストリームのヘッダーを書き込みます。アプリケーションが AVIStreamWriteData 関数を使用したときに呼び出されます。
| fcc | DWORD | in | 書き込むストリームヘッダーの 4 文字コード。 |
| lp | void* | in | 書き込むヘッダーデータを含むバッファーへのポインター。 |
| cb | INT | in | lpBuffer で指定されたバッファーのサイズ (バイト単位)。 |
戻り値
OLE で定義された HRESULT を返します。
解説(Remarks)
C++ で記述されたハンドラーの場合、WriteData の構文は次のとおりです。
HRESULT WriteData(DWORD fcc, LPVOID lpBuffer, LONG cbBuffer);
| lpInfo | AVISTREAMINFOW* | in | 設定するストリーム情報を格納したAVISTREAMINFOW構造体へのポインタ。 |
| cbInfo | INT | in | lpInfoのバイトサイズ。 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IAVIStream "{00020021-0000-0000-C000-000000000046}" #usecom global IAVIStream IID_IAVIStream "{}" #comfunc global IAVIStream_Create 3 sptr,sptr #comfunc global IAVIStream_Info 4 var,int #comfunc global IAVIStream_FindSample 5 int,int #comfunc global IAVIStream_ReadFormat 6 int,sptr,var #comfunc global IAVIStream_SetFormat 7 int,sptr,int #comfunc global IAVIStream_Read 8 int,int,sptr,int,var,var #comfunc global IAVIStream_Write 9 int,int,sptr,int,int,var,var #comfunc global IAVIStream_Delete 10 int,int #comfunc global IAVIStream_ReadData 11 int,sptr,var #comfunc global IAVIStream_WriteData 12 int,sptr,int #comfunc global IAVIStream_SetInfo 13 var,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IAVIStream "{00020021-0000-0000-C000-000000000046}" #usecom global IAVIStream IID_IAVIStream "{}" #comfunc global IAVIStream_Create 3 sptr,sptr #comfunc global IAVIStream_Info 4 sptr,int #comfunc global IAVIStream_FindSample 5 int,int #comfunc global IAVIStream_ReadFormat 6 int,sptr,sptr #comfunc global IAVIStream_SetFormat 7 int,sptr,int #comfunc global IAVIStream_Read 8 int,int,sptr,int,sptr,sptr #comfunc global IAVIStream_Write 9 int,int,sptr,int,int,sptr,sptr #comfunc global IAVIStream_Delete 10 int,int #comfunc global IAVIStream_ReadData 11 int,sptr,sptr #comfunc global IAVIStream_WriteData 12 int,sptr,int #comfunc global IAVIStream_SetInfo 13 sptr,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。