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

IStreamSample

COM
IIDb502d1be-9a57-11d0-8fde-00c04fd9189d継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

メモ このインターフェイスは非推奨です。

メソッド 5

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

vtbl 3 HRESULT GetMediaStream(IMediaStream** ppMediaStream)

メモ このインターフェイスは非推奨です。新しいアプリケーションでは使用しないでください。現在のサンプルを作成したメディアストリームオブジェクトへのポインターを取得します。

ppMediaStreamIMediaStream**in現在のサンプルを作成したメディアストリームを指す IMediaStream インターフェイスへのポインターのアドレス。

戻り値

成功した場合は S_OK を、ppMediaStream が無効な場合は E_POINTER を返します。

解説(Remarks)

成功した場合、このメソッドは ppMediaStream で指定されたメディアストリームの参照カウントをインクリメントします。

vtbl 4 HRESULT GetSampleTimes(LONGLONG* pStartTime, LONGLONG* pEndTime, LONGLONG* pCurrentTime)

メモ このインターフェイスは非推奨です。新しいアプリケーションでは使用しないでください。現在のサンプルの開始時刻と終了時刻を取得します。サンプルが更新中の場合、このメソッドは更新完了後の時刻を返します。

pStartTimeLONGLONG*outサンプルの開始時刻を格納する STREAM_TIME 値へのポインター。
pEndTimeLONGLONG*outサンプルの終了時刻を格納する STREAM_TIME 値へのポインター。
pCurrentTimeLONGLONG*outメディアストリームの現在のメディア時刻を格納する STREAM_TIME 値へのポインター。

戻り値

成功した場合は S_OK を、いずれかのパラメーターが無効な場合は E_POINTER を返します。

解説(Remarks)

クロックを持つストリームの場合、開始時刻と終了時刻はストリームの現在時刻を基準とした相対値になります。ストリームがクロックを持たない場合、これらの時刻はメディアを基準とした相対値となり、現在時刻は 0 になります。

pCurrentTime パラメーターを使用すると、メディアストリームの現在時刻を手軽に追跡できるため、IMultiMediaStream::GetTime を呼び出す必要がありません。ただし GetTime とは異なり、ストリームがクロックを持たない場合、このメソッドは S_OK を返します(GetTimeS_FALSE を返します)。pCurrentTime に代入される値は、次のコード断片が生成する値と同じです。


IMediaStream *pMediaStream = 0;
hr = pSample->GetMediaStream(&pMediaStream);
if (SUCCEEDED(hr))
{
  IMultiMediaStream *pMultiMediaStream = 0;
  hr = pMediaStream->GetMultiMediaStream(&pMultiMediaStream);
  pMediaStream->Release();
  if (SUCCEEDED(hr))
  {
    STREAM_TIME CurrentTime = 0;
    hr = pMultiMediaStream->GetTime(&CurrentTime);
    pMultiMediaStream->Release();
  }
}
vtbl 5 HRESULT SetSampleTimes(LONGLONG* pStartTime, LONGLONG* pEndTime)

メモ このインターフェイスは非推奨です。新しいアプリケーションでは使用しないでください。現在のサンプルの開始時刻と終了時刻を設定します。このメソッドはサンプルを更新する前に呼び出すことができます。

pStartTimeLONGLONG*inサンプルの新しい開始時刻を格納する STREAM_TIME 値へのポインター。
pEndTimeLONGLONG*inサンプルの新しい終了時刻を格納する STREAM_TIME 値へのポインター。

戻り値

成功した場合は S_OK を、いずれかのパラメーターが NULL の場合は E_POINTER を返します。

解説(Remarks)

クロックを持つストリームの場合、これらの時刻はストリームの現在時刻を基準とした相対値でなければなりません。ストリームがクロックを持たない場合、これらの時刻はメディアを基準とした相対値にする必要があります。

このメソッドは書き込み可能なストリームにのみ適用されます。

vtbl 6 HRESULT Update(DWORD dwFlags, HANDLE hEvent, PAPCFUNC pfnAPC, UINT_PTR dwAPCData)

メモ このインターフェイスは非推奨です。新しいアプリケーションでは使用しないでください。現在のサンプルに対して同期更新または非同期更新を実行します。

dwFlagsDWORDin更新を同期で行うか非同期で行うかを指定するフラグ。SSUPDATE_ASYNC フラグは非同期更新を指定し、hEventpfnAPC の両方が NULL の場合に設定できます。IStreamSample::CompletionStatus メソッドを呼び出すまでサンプルを継続的に更新するには、SSUPDATE_CONTINUOUS を使用します。
hEventHANDLEin更新が完了したときにこのメソッドがシグナル状態にするイベントのハンドル。
pfnAPCPAPCFUNCinサンプルの更新を完了した後にこのメソッドが呼び出す Win32 非同期プロシージャ呼び出し (APC) 関数へのポインター。
dwAPCDataUINT_PTRinこのメソッドが pfnAPC パラメーターで指定された関数に渡す値。

戻り値

次のいずれかの値を返します。

戻り値 説明
E_ABORT
更新が中止されました。
E_INVALIDARG
いずれかのパラメーターが無効です。
E_POINTER
いずれかのパラメーターが無効です。
MS_E_BUSY
このサンプルには既に保留中の更新があります。
MS_S_ENDOFSTREAM
ストリームの終端に達しました。サンプルは更新されませんでした。
MS_S_PENDING
非同期更新が保留中です。
S_OK
成功しました。
VFW_E_NOT_COMMITTED
アロケーターがコミットされていないため、サンプルを割り当てることができません。

解説(Remarks)

このメソッドは、サンプルの同期更新または非同期更新を実行するために使用できます。hEventpfnAPC の両方が NULL の場合、SSUPDATE_ASYNC または SSUPDATE_CONTINUOUS フラグのいずれかが指定されていない限り、更新は同期で行われます。同期更新が復帰すると、関数の結果には I/O 完了ステータスが格納されます。

hEventpfnAPC の両方に値を指定することはできません。指定した場合、このメソッドは失敗します。

非同期更新は、更新が復帰する前に完了する場合があります。その場合、戻り値は S_OK になります。イベントを指定していて更新が S_OK を返す場合、このメソッドは復帰時にそのイベントをシグナル状態にします。APC 関数を指定していて更新が S_OK を返す場合、APC はキューに登録されず、関数は呼び出されません。

復帰前に完了しない非同期更新は、MS_S_PENDING の値を返します。

アプリケーションが複数のストリームを作成する場合は、各ストリームに対して非同期更新を実行する必要があります。次の更新を行う前に、各ストリームの更新が完了するのを待つには WaitForMultipleObjects を呼び出します。そうしないと、アプリケーションがブロックされる可能性があります。

vtbl 7 HRESULT CompletionStatus(DWORD dwFlags, DWORD dwMilliseconds)

メモ このインターフェイスは非推奨です。新しいアプリケーションでは使用しないでください。現在のサンプルの最新の非同期更新のステータスを取得します。更新が完了していない場合は、強制的に完了させることができます。

dwFlagsDWORDin

更新を強制的に完了させるかどうかを指定する値。この値は、次のフラグの 1 つ以上を組み合わせたものです。

説明
COMPSTAT_NOUPDATEOK (0x01) サンプルの更新がまだ完了していない場合でも、更新をできるだけ早く完了させます。サンプルが更新中で COMPSTAT_WAIT フラグを設定していない場合、このメソッドは MS_S_PENDING を返します。サンプルが更新待ちの状態にある場合、このメソッドはそれをキューから削除し、MS_S_NOTUPDATED を返します。
COMPSTAT_WAIT (0x02) サンプルの更新が完了するまで待ってから、このメソッドから復帰します。
COMPSTAT_ABORT (0x04) 現在更新中であっても、更新を強制的に完了させます。これにより、サンプルデータは未定義の状態のままになります。更新が確実にキャンセルされるようにするには、この値を COMPSTAT_WAITFORCOMPLETION フラグと組み合わせます。
dwMillisecondsDWORDindwFlags パラメーターが COMPSTAT_WAIT の場合、この値は更新の完了を待つミリ秒数です。この呼び出しが復帰する前にサンプルが更新されるまで待機することを示すには、INFINITE を指定します。

戻り値

次のいずれかの値を返します。

戻り値 説明
E_ABORT
更新が中止されました。
MS_S_ENDOFSTREAM
ストリームの終端に達したため、サンプルは更新されませんでした。
MS_S_NOUPDATE
更新が強制的に完了されました。サンプルはストリームによって更新されませんでした。
MS_S_PENDING
非同期更新が保留中です。
S_OK
成功しました。
出典・ライセンス: 上記「公式ドキュメント」の内容は 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_IStreamSample "{B502D1BE-9A57-11D0-8FDE-00C04FD9189D}"
#usecom global IStreamSample IID_IStreamSample "{}"
#comfunc global IStreamSample_GetMediaStream    3 sptr
#comfunc global IStreamSample_GetSampleTimes    4 var,var,var
#comfunc global IStreamSample_SetSampleTimes    5 var,var
#comfunc global IStreamSample_Update            6 int,sptr,sptr,sptr
#comfunc global IStreamSample_CompletionStatus  7 int,int
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。