IMFASFSplitter
COM公式ドキュメント
Advanced Systems Format (ASF) ファイルからデータを読み取るためのメソッドを提供します。
解説(Remarks)
ASF スプリッターは ASF パケットを受け取り、そこから個々のストリームのサンプルを抽出します。他の ASF 基本コンポーネントと同様に、ASF スプリッターオブジェクトは使用前に ASF ContentInfo オブジェクトのデータで初期化する必要があります。
メソッド 9
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
Advanced Systems Format (ASF) スプリッターをリセットし、ASF データセクションからデータを解析するように構成します。
| pIContentInfo | IMFASFContentInfo* | in | 解析対象のデータを記述する ContentInfo オブジェクトの IMFASFContentInfo インターフェイスへのポインター。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表の値が含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| pIContentInfo パラメーターが NULL です。 |
Advanced Systems Format (ASF) スプリッターにオプションフラグを設定します。
| dwFlags | DWORD | in | MFASF_SPLITTERFLAGS 列挙型の 0 個以上のメンバーのビットごとの組み合わせ。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表の値が含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| スプリッターが初期化されていません。 | |
| dwFlags パラメーターに有効なフラグが含まれていません。 | |
| MFASF_SPLITTER_REVERSE フラグが設定されていますが、コンテンツを逆方向に解析できません。 |
解説(Remarks)
このメソッドは、スプリッターの初期化後にのみ呼び出すことができます。
ASF スプリッターに設定されているオプションフラグを取得します。
| pdwFlags | DWORD* | out | オプションフラグを受け取ります。この値は、MFASF_SPLITTERFLAGS 列挙型の 0 個以上のメンバーのビットごとの OR です。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表の値が含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| pdwFlags が NULL です。 |
Advanced Systems Format (ASF) スプリッターによって解析されるストリームを設定します。
| pwStreamNumbers | WORD* | in | 選択するストリーム番号の一覧を格納した変数の配列。 |
| wNumStreams | WORD | in | ストリーム番号配列内の有効な要素の数。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表の値が含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| pwStreamNumbers が NULL で、かつ wNumStreams に 0 より大きい値が含まれています。 | |
| 配列内に無効なストリーム番号が渡されました。 |
解説(Remarks)
このメソッドを呼び出すと、以前のストリーム選択はすべて上書きされます。pwStreamNumbers 配列で指定されたストリームのみが選択されます。
既定では、スプリッターによって選択されているストリームはありません。
現在選択されているストリームの一覧は、IMFASFSplitter::GetSelectedStreams メソッドを呼び出して取得できます。
現在選択されているストリームの一覧を取得します。
| pwStreamNumbers | WORD* | out | WORD の配列のアドレス。この配列は、選択されているストリームのストリーム番号を受け取ります。 このパラメーターは NULL にすることができます。 |
| pwNumStreams | WORD* | inout | 入力時には、pwStreamNumbers 配列内の要素数を格納した変数を指します。pwStreamNumbers が NULL の場合は、変数を 0 に設定してください。 出力時には、pwStreamNumbers にコピーされた要素の数を受け取ります。各要素は、選択されているストリームの識別子です。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表の値が含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 無効な引数です。 | |
| pwStreamNumbers 配列が、選択されているストリームの数より小さいです。 「解説」を参照してください。 |
解説(Remarks)
選択されているストリームの数を取得するには、pwStreamNumbers を NULL に設定します。メソッドは MF_E_BUFFERTOSMALL を返しますが、*pwNumStreams の値も選択されているストリームの数に設定します。次に、そのサイズの配列を割り当て、pwStreamNumbers パラメーターに配列を渡してメソッドを再度呼び出します。
次のコードは、これらの手順を示しています。
HRESULT DisplaySelectedStreams(IMFASFSplitter *pSplitter)
{
WORD count = 0;
HRESULT hr = pSplitter->GetSelectedStreams(NULL, &count);
if (hr == MF_E_BUFFERTOOSMALL)
{
WORD *pStreamIds = new (std::nothrow) WORD[count];
if (pStreamIds)
{
hr = pSplitter->GetSelectedStreams(pStreamIds, &count);
if (SUCCEEDED(hr))
{
for (WORD i = 0; i < count; i++)
{
printf("Selected stream ID: %d\n", pStreamIds[i]);
}
}
delete [] pStreamIds;
}
else
{
hr = E_OUTOFMEMORY;
}
}
return hr;
}
あるいは、ストリームの総数に等しい配列を割り当て、それを pwStreamNumbers に渡すこともできます。
このメソッドを呼び出す前に、*pwNumStreams を pwStreamNumbers 内の要素数に初期化してください。pwStreamNumbers が NULL の場合は、*pwNumStreams を 0 に設定します。
既定では、スプリッターによって選択されているストリームはありません。IMFASFSplitter::SelectStreams メソッドを呼び出してストリームを選択します。
パケット化された Advanced Systems Format (ASF) データを処理のために ASF スプリッターに送信します。
| pIBuffer | IMFMediaBuffer* | in | 解析対象のデータを含むバッファーオブジェクトの IMFMediaBuffer インターフェイスへのポインター。 |
| cbBufferOffset | DWORD | in | スプリッターが解析を開始するデータバッファー内のオフセット。この値は通常 0 に設定されます。 |
| cbLength | DWORD | in | 解析するデータの長さ (バイト単位)。この値は、cbBufferOffset で指定されたオフセットから測定されます。バッファーの終端まで処理するには 0 に設定します。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表の値が含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 | |
|
pIBuffer パラメーターが NULL です。
cbBufferOffset で指定されたオフセット値がバッファーの長さより大きいです。 cbBufferOffset と cbLength の合計値がバッファーの長さより大きいです。 |
|
| IMFASFSplitter::Initialize メソッドが呼び出されなかったか、その呼び出しが失敗しました。 | |
| スプリッターは現時点でこれ以上の入力を処理できません。 |
解説(Remarks)
このメソッドを使用してデータを解析した後は、IMFASFSplitter::GetNextSample を呼び出して、解析されたメディアサンプルを取得する必要があります。
ASF データに可変サイズのパケットが含まれている場合は、バッファーに MFASFSPLITTER_PACKET_BOUNDARY 属性を設定してサンプルの境界を示す必要があり、バッファーが複数のパケットにまたがることはできません。
メソッドが ME_E_NOTACCEPTING を返した場合は、GetNextSample を呼び出して出力サンプルを取得するか、IMFASFSplitter::Flush を呼び出してスプリッターをクリアします。
スプリッターは入力バッファーの参照カウントを保持している場合があります。したがって、このメソッドを呼び出した後は、バッファー内の有効なデータを上書きしないでください。
データが解析された後、Advanced Systems Format (ASF) スプリッターからサンプルを取得します。
| pdwStatusFlags | ASF_STATUSFLAGS* | out | 次のいずれかの値を受け取ります。
| ||||||
| pwStreamNumber | WORD* | out | メソッドが ppISample パラメーターでサンプルを返す場合、このパラメーターはそのサンプルが属するストリームの番号を受け取ります。 | ||||||
| ppISample | IMFSample** | out | 解析されたサンプルの IMFSample インターフェイスへのポインターを受け取ります。呼び出し元はインターフェイスを解放する必要があります。取得可能なサンプルがない場合、このパラメーターは値 NULL を受け取ります。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表の値が含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| バッファー内の ASF データが無効です。 | |
| ASF データにギャップがあります。 |
解説(Remarks)
このメソッドを呼び出す前に、IMFASFSplitter::ParseData を呼び出して、スプリッターに入力データを渡してください。入力に完全なサンプルを構成するのに十分なデータが含まれていない場合、GetNextSample メソッドは成功しますが、ppISample パラメーターに NULL を返します。
ASF スプリッターは、選択されていないストリームのサンプルをスキップします。ストリームを選択するには、IMFASFSplitter::SelectStreams を呼び出します。
Advanced Systems Format (ASF) スプリッターをリセットし、保留中のすべてのサンプルを解放します。
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表の値が含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 |
解説(Remarks)
Flush が呼び出されたときに取得待ちであったサンプルはすべて失われます。
最後に受信したサンプルの送信時刻を取得します。
| pdwLastSendTime | DWORD* | out | 最後に受信したサンプルの送信時刻を受け取ります。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には、次の表の値が含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| pdwLastSendTime が NULL です。 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFASFSplitter "{12558295-E399-11D5-BC2A-00B0D0F3F4AB}" #usecom global IMFASFSplitter IID_IMFASFSplitter "{}" #comfunc global IMFASFSplitter_Initialize 3 sptr #comfunc global IMFASFSplitter_SetFlags 4 int #comfunc global IMFASFSplitter_GetFlags 5 var #comfunc global IMFASFSplitter_SelectStreams 6 var,int #comfunc global IMFASFSplitter_GetSelectedStreams 7 var,var #comfunc global IMFASFSplitter_ParseData 8 sptr,int,int #comfunc global IMFASFSplitter_GetNextSample 9 var,var,sptr #comfunc global IMFASFSplitter_Flush 10 #comfunc global IMFASFSplitter_GetLastSendTime 11 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IMFASFSplitter "{12558295-E399-11D5-BC2A-00B0D0F3F4AB}" #usecom global IMFASFSplitter IID_IMFASFSplitter "{}" #comfunc global IMFASFSplitter_Initialize 3 sptr #comfunc global IMFASFSplitter_SetFlags 4 int #comfunc global IMFASFSplitter_GetFlags 5 sptr #comfunc global IMFASFSplitter_SelectStreams 6 sptr,int #comfunc global IMFASFSplitter_GetSelectedStreams 7 sptr,sptr #comfunc global IMFASFSplitter_ParseData 8 sptr,int,int #comfunc global IMFASFSplitter_GetNextSample 9 sptr,sptr,sptr #comfunc global IMFASFSplitter_Flush 10 #comfunc global IMFASFSplitter_GetLastSendTime 11 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。