Win32 API 日本語リファレンス
ホームMedia.Multimedia › IAVIStream

IAVIStream

COM
IID00020021-0000-0000-c000-000000000046継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

IAVIStream インターフェイスは、ファイル内のデータストリームの作成と操作をサポートします。IUnknown::QueryInterface、IUnknown::AddRef、IUnknown::Release に加えて、次のカスタムメソッドを使用します。

メソッド 11

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT Create(LPARAM lParam1, LPARAM lParam2)

Create メソッドは、どのファイルにも関連付けられていないストリームハンドラーを初期化します。アプリケーションが AVIStreamCreate 関数を使用したときに呼び出されます。

lParam1LPARAMinストリームハンドラー固有のデータ。
lParam2LPARAMin

ストリームハンドラー固有のデータ。

- ps

ストリームへのインターフェイスへのポインター。

戻り値

OLE で定義された HRESULT を返します。

解説(Remarks)

C++ で記述されたハンドラーの場合、Create の構文は次のとおりです。


HRESULT Create(LONG lParam1, LONG lParam2) 
 
vtbl 4 HRESULT Info(AVISTREAMINFOW* psi, INT lSize)

Info メソッドは、ストリームに関する情報を AVISTREAMINFO 構造体に格納して返します。アプリケーションが AVIStreamInfo 関数を使用したときに呼び出されます。

psiAVISTREAMINFOW*outストリーム情報を格納する AVISTREAMINFO 構造体へのポインター。
lSizeINTin

psi で指定された構造体のサイズ (バイト単位)。

- ps

ストリームへのインターフェイスへのポインター。

戻り値

OLE で定義された HRESULT を返します。

解説(Remarks)

割り当てられたバッファーが構造体に対して小さすぎる場合、Info メソッドは AVIERR_BUFFERTOOSMALL を返して呼び出しを失敗させる必要があります。それ以外の場合は、構造体を格納し、そのサイズを返す必要があります。

C++ で記述されたハンドラーの場合、Info の構文は次のとおりです。


HRESULT Info(AVIFILEINFO *psi, LONG lSize) 
 
vtbl 5 INT FindSample(INT lPos, INT lFlags)

FindSample メソッドは、ストリーム内のキーフレームまたは空でないフレームの位置を取得します。アプリケーションが AVIStreamFindSample 関数を使用したときに呼び出されます。

lPosINTinサンプルまたはフレームの位置。
lFlagsINTin

適用するフラグ。次の値が定義されています。

説明
FIND_ANY 空でないフレームを検索します。
FIND_FORMAT フォーマットの変更を検索します。
FIND_KEY キーフレームを検索します。
FIND_NEXT 現在のフレームを起点に、ストリームを前方に向かって検索します。
FIND_PREV 現在のフレームを起点に、ストリームを後方に向かって検索します。

FIND_ANYFIND_KEYFIND_FORMAT の各フラグは相互排他的であり、FIND_NEXTFIND_PREV も同様です。各グループから 1 つの値を指定する必要があります。

- ps

ストリームへのインターフェイスへのポインター。

戻り値

アプリケーションが指定したフレームに対応するキーフレームの位置を返します。

解説(Remarks)

カスタムフォーマットにおいてキーフレームが重要でない場合は、lPos に指定された位置を返してください。

C++ で記述されたハンドラーの場合、FindSample の構文は次のとおりです。


LONG FindSample(LONG lPos, LONG lFlags) 
 
vtbl 6 HRESULT ReadFormat(INT lPos, void* lpFormat, INT* lpcbFormat)

ReadFormat メソッドは、ストリームからフォーマット情報を取得します。

lPosINTinサンプルまたはフレームの位置。
lpFormatvoid*outoptionalフォーマットデータ用のバッファーへのポインター。必要なバッファーサイズを問い合わせるには NULL を指定します。
lpcbFormatINT*inout

lpFormat で指定されたバッファーのサイズ (バイト単位) を受け取るバッファーへのポインター。このメソッドが呼び出されるとき、このパラメーターの内容は lpFormat で指定されたバッファーのサイズを示します。このメソッドがアプリケーションに制御を返すとき、このパラメーターの内容は読み取られたデータ量、または必要なバッファーサイズを示します。

- ps

ストリームへのインターフェイスへのポインター。

戻り値

OLE で定義された HRESULT を返します。

解説(Remarks)

ストリームに格納されるデータの種類によって、フォーマット情報と、それを格納する構造体が決まります。ストリームハンドラーは、フォーマットがパレットを使用する場合のパレット情報を含め、適用されるすべてのフォーマット情報をこの構造体で返す必要があります。ストリームハンドラーは、この構造体でストリームデータを返してはなりません。

標準のビデオストリームハンドラーは、BITMAPINFOHEADER 構造体でフォーマット情報を提供します。標準のオーディオストリームハンドラーは、PCMWAVEFORMAT 構造体でフォーマット情報を提供します。その他のデータストリームは、ストリームデータを記述する別の構造体を使用できます。

C++ で記述されたハンドラーの場合、ReadFormat の構文は次のとおりです。


HRESULT ReadFormat(LONG lPos, LPVOID lpFormat, 
    LONG *lpcbFormat) 
 
vtbl 7 HRESULT SetFormat(INT lPos, void* lpFormat, INT cbFormat)

SetFormat メソッドは、ストリームにフォーマット情報を設定します。アプリケーションが AVIStreamSetFormat 関数を使用したときに呼び出されます。

lPosINTinストリームへのインターフェイスへのポインター。
lpFormatvoid*inフォーマットデータ用のバッファーへのポインター。
cbFormatINTinlpFormat で指定されたバッファーのサイズ (バイト単位) を格納するアドレス。

戻り値

OLE で定義された HRESULT を返します。

解説(Remarks)

標準のビデオストリームハンドラーは、BITMAPINFOHEADER 構造体でフォーマット情報を提供します。標準のオーディオストリームハンドラーは、PCMWAVEFORMAT 構造体でフォーマット情報を提供します。その他のデータストリームは、ストリームデータを記述する別の構造体を使用できます。

C++ で記述されたハンドラーの場合、SetFormat の構文は次のとおりです。


HRESULT SetFormat(LONG lPos, LPVOID lpFormat, LONG cbFormat) 
 
vtbl 8 HRESULT Read(INT lStart, INT lSamples, void* lpBuffer, INT cbBuffer, INT* plBytes, INT* plSamples)

Read メソッドは、ストリームからデータを読み取り、アプリケーション定義のバッファーにコピーします。バッファーが指定されていない場合は、次のデータバッファーを取得するために必要なバッファーサイズを判定します。アプリケーションが AVIStreamRead 関数を使用したときに呼び出されます。

lStartINTin読み取りを開始するサンプルまたはフレームの番号。
lSamplesINTin読み取るサンプル数。
lpBuffervoid*outoptionalストリームデータを格納するアプリケーション定義のバッファーへのポインター。必要なバッファーサイズを問い合わせるために NULL を指定することもできます。多くのアプリケーションは、必要なバッファーの大きさを確認するため、各読み取り操作の前にバッファーサイズを問い合わせます。
cbBufferINTinlpBuffer で指定されたバッファーのサイズ (バイト単位)。
plBytesINT*outoptional読み取られたバイト数を受け取るバッファーへのポインター。
plSamplesINT*outoptional

読み取られたサンプル数を受け取るバッファーへのポインター。

- ps

ストリームへのインターフェイスへのポインター。

戻り値

成功した場合は AVIERR_OK を返し、バッファーがデータを保持するのに十分な大きさでない場合は AVIERR_BUFFERTOOSMALL を返します。成功した場合、Read はバッファーに含まれるフレーム (サンプル) 数を伴うデータバッファー、または必要なバッファーサイズ (バイト単位) のいずれかも返します。

解説(Remarks)

C++ で記述されたハンドラーの場合、Read の構文は次のとおりです。


HRESULT Read(LONG lStart, LONG lSamples, 
    LPVOID lpBuffer, LONG cbBuffer, 
    LONG *plBytes, LONG *plSamples); 
 
vtbl 9 HRESULT Write(INT lStart, INT lSamples, void* lpBuffer, INT cbBuffer, DWORD dwFlags, INT* plSampWritten, INT* plBytesWritten)

Write メソッドは、ストリームにデータを書き込みます。アプリケーションが AVIStreamWrite 関数を使用したときに呼び出されます。

lStartINTin書き込みを開始するサンプルまたはフレームの番号。
lSamplesINTin書き込むサンプル数。
lpBuffervoid*inデータ用のバッファーへのポインター。
cbBufferINTinlpBuffer で指定されたバッファーのサイズ (バイト単位)。
dwFlagsDWORDin適用するフラグ。AVIF_KEYFRAME フラグが定義されており、このフレームが完全な画像に必要なすべての情報を含んでいることを示します。
plSampWrittenINT*outoptional書き込まれたサンプル数を格納するために使用されるバッファーへのポインター。
plBytesWrittenINT*outoptional

書き込まれたバイト数を受け取るバッファーへのポインター。

- ps

ストリームへのインターフェイスへのポインター。

戻り値

OLE で定義された HRESULT を返します。

解説(Remarks)

C++ で記述されたハンドラーの場合、Write の構文は次のとおりです。


HRESULT Write(LONG lStart, LONG lSamples, LPVOID lpBuffer, 
    LONG cbBuffer, DWORD dwFlags, LONG *plSampWritten, 
    LONG *plBytesWritten); 
 
vtbl 10 HRESULT Delete(INT lStart, INT lSamples)

Delete メソッドは、ストリームからデータを削除します。

lStartINTin削除を開始するサンプルまたはフレームの番号。
lSamplesINTin

削除するサンプル数。

- ps

ストリームへのインターフェイスへのポインター。

戻り値

OLE で定義された HRESULT を返します。

解説(Remarks)

C++ で記述されたハンドラーの場合、Delete の構文は次のとおりです。


HRESULT Delete(LONG lStart, LONG lSamples); 
 
vtbl 11 HRESULT ReadData(DWORD fcc, void* lp, INT* lpcb)

ReadData メソッドは、ストリームのデータヘッダーを読み取ります。アプリケーションが AVIStreamReadData 関数を使用したときに呼び出されます。

fccDWORDin読み取るストリームヘッダーの 4 文字コード。
lpvoid*outoptionalヘッダーデータを格納するバッファーへのポインター。
lpcbINT*inoutlpBuffer で指定されたバッファーのサイズ (バイト単位)。このメソッドがアプリケーションに制御を返すとき、このパラメーターの内容は読み取られたデータ量を示します。

戻り値

OLE で定義された HRESULT を返します。

解説(Remarks)

C++ で記述されたハンドラーの場合、ReadData の構文は次のとおりです。


HRESULT ReadData(DWORD fcc, LPVOID lp, LONG *lpcb); 
 
vtbl 12 HRESULT WriteData(DWORD fcc, void* lp, INT cb)

WriteData メソッドは、ストリームのヘッダーを書き込みます。アプリケーションが AVIStreamWriteData 関数を使用したときに呼び出されます。

fccDWORDin書き込むストリームヘッダーの 4 文字コード。
lpvoid*in書き込むヘッダーデータを含むバッファーへのポインター。
cbINTinlpBuffer で指定されたバッファーのサイズ (バイト単位)。

戻り値

OLE で定義された HRESULT を返します。

解説(Remarks)

C++ で記述されたハンドラーの場合、WriteData の構文は次のとおりです。


HRESULT WriteData(DWORD fcc, LPVOID lpBuffer, LONG cbBuffer); 
 
vtbl 13 HRESULT SetInfo(AVISTREAMINFOW* lpInfo, INT cbInfo)
lpInfoAVISTREAMINFOW*in設定するストリーム情報を格納したAVISTREAMINFOW構造体へのポインタ。
cbInfoINTinlpInfoのバイトサイズ。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 指定が可能。