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

IMediaObject

COM
IIDd8ad0f58-5494-4102-97c5-ec798e59bcf4継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

IMediaObject インターフェイスは、Microsoft DirectX Media Object (DMO) を操作するためのメソッドを提供します。

メソッド 21

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

vtbl 3 HRESULT GetStreamCount(DWORD* pcInputStreams, DWORD* pcOutputStreams)

GetStreamCount メソッドは、入力ストリームと出力ストリームの数を取得します。

pcInputStreamsDWORD*out入力ストリーム数を受け取る変数へのポインター。NULL は指定できません。
pcOutputStreamsDWORD*out出力ストリーム数を受け取る変数へのポインター。NULL は指定できません。

戻り値

HRESULT 値を返します。指定できる値には次の表の値が含まれます。

戻り値 説明
E_POINTER
NULL ポインター引数です
S_OK
成功

解説(Remarks)

DMO の入力ストリーム数または出力ストリーム数は 0 の場合があります。ストリーム数は変化しません。DMO が動的にストリームを追加したり削除したりすることはできません。

vtbl 4 HRESULT GetInputStreamInfo(DWORD dwInputStreamIndex, DWORD* pdwFlags)

GetInputStreamInfo メソッドは、バッファーあたりのサンプル数に関する制約や、ストリームが入力データの先読み (ルックアヘッド) を行うかどうかなど、入力ストリームに関する情報を取得します。この情報が変化することはありません。

dwInputStreamIndexDWORDinDMO 上の入力ストリームの 0 から始まるインデックス。
pdwFlagsDWORD*out0 個以上の DMO_INPUT_STREAM_INFO_FLAGS フラグのビットごとの組み合わせを受け取る変数へのポインター。

戻り値

HRESULT 値を返します。指定できる値には次の表の値が含まれます。

戻り値 説明
DMO_E_INVALIDSTREAMINDEX
無効なストリームインデックスです
E_POINTER
NULL ポインター引数です
S_OK
成功

解説(Remarks)

DMO_INPUT_STREAMF_HOLDS_BUFFERS フラグは、DMO が入力データに対して先読みを行うことを示します。

アプリケーションは、DMO が入力を処理できるだけの十分なバッファーを確実に割り当てる必要があります。バッファー要件を調べるには、IMediaObject::GetInputSizeInfo メソッドを呼び出してください。

vtbl 5 HRESULT GetOutputStreamInfo(DWORD dwOutputStreamIndex, DWORD* pdwFlags)

GetOutputStreamInfo メソッドは、ストリームが破棄可能かどうか、固定サンプルサイズを使用するかどうかなど、出力ストリームに関する情報を取得します。この情報が変化することはありません。

dwOutputStreamIndexDWORDinDMO 上の出力ストリームの 0 から始まるインデックス。
pdwFlagsDWORD*out0 個以上の DMO_OUTPUT_STREAM_INFO_FLAGS フラグのビットごとの組み合わせを受け取る変数へのポインター。

戻り値

HRESULT 値を返します。指定できる値には次の表の値が含まれます。

戻り値 説明
DMO_E_INVALIDSTREAMINDEX
無効なストリームインデックスです
E_POINTER
NULL ポインター引数です
S_OK
成功
vtbl 6 HRESULT GetInputType(DWORD dwInputStreamIndex, DWORD dwTypeIndex, DMO_MEDIA_TYPE* pmt)

GetInputType メソッドは、指定した入力ストリームで優先されるメディアタイプを取得します。

dwInputStreamIndexDWORDinDMO 上の入力ストリームの 0 から始まるインデックス。
dwTypeIndexDWORDin受け入れ可能なメディアタイプの集合に対する 0 から始まるインデックス。
pmtDMO_MEDIA_TYPE*outoptional呼び出し元が割り当てた DMO_MEDIA_TYPE 構造体へのポインター、または NULL。このパラメーターが NULL 以外の場合、メソッドは構造体にメディアタイプを設定します。NULL を指定すると、戻り値を確認することでタイプインデックスが範囲内かどうかをテストできます。

戻り値

HRESULT 値を返します。指定できる値には次の表の値が含まれます。

戻り値 説明
DMO_E_INVALIDSTREAMINDEX
無効なストリームインデックスです。
DMO_E_NO_MORE_ITEMS
タイプインデックスが範囲外です。
E_OUTOFMEMORY
メモリが不足しています。
E_POINTER
NULL ポインター引数です。
S_OK
成功。

解説(Remarks)

入力ストリームで優先されるメディアタイプを列挙するには、このメソッドを呼び出します。DMO は各メディアタイプに優先順にインデックス値を割り当てます。最も優先されるタイプのインデックスは 0 です。すべてのタイプを列挙するには、メソッドが DMO_E_NO_MORE_ITEMS を返すまで、タイプインデックスを増やしながら繰り返し呼び出します。DMO がサポートするすべてのメディアタイプを列挙するとは限りません。

返されるタイプのフォーマットブロックは NULL の場合があります。その場合、フォーマットタイプは GUID_NULL です。フォーマットブロックを参照する前に、フォーマットタイプを確認してください。

メソッドが成功した場合は、MoFreeMediaType を呼び出してフォーマットブロックを解放してください。(この関数はフォーマットブロックが NULL のときに呼び出しても安全です。)

メディアタイプを設定するには、IMediaObject::SetInputType メソッドを呼び出します。あるストリームにメディアタイプを設定すると、別のストリームで優先されるタイプが変化することがあります。実際、あるストリームは別のストリームにタイプが設定されるまで優先タイプを持たない場合があります。たとえば、デコーダーは入力タイプが設定されるまで優先される出力タイプを持たないことがあります。ただし、DMO がこのように優先タイプを動的に更新することは必須ではありません。したがって、このメソッドが返すタイプが有効である保証はなく、SetInputType メソッドで使用すると失敗する可能性があります。

特定のメディアタイプが受け入れられるかどうかをテストするには、DMO_SET_TYPEF_TEST_ONLY フラグを指定して SetInputType を呼び出します。

dwTypeIndex パラメーターが範囲内かどうかをテストするには、pmtNULL を設定します。インデックスが範囲内であればメソッドは S_OK を返し、範囲外であれば DMO_E_NO_MORE_ITEMS を返します。

vtbl 7 HRESULT GetOutputType(DWORD dwOutputStreamIndex, DWORD dwTypeIndex, DMO_MEDIA_TYPE* pmt)

GetOutputType メソッドは、指定した出力ストリームで優先されるメディアタイプを取得します。

dwOutputStreamIndexDWORDinDMO 上の出力ストリームの 0 から始まるインデックス。
dwTypeIndexDWORDin受け入れ可能なメディアタイプの集合に対する 0 から始まるインデックス。
pmtDMO_MEDIA_TYPE*outoptional呼び出し元が割り当てた DMO_MEDIA_TYPE 構造体へのポインター、または NULL。このパラメーターが NULL 以外の場合、メソッドは構造体にメディアタイプを設定します。NULL を指定すると、戻り値を確認することでタイプインデックスが範囲内かどうかをテストできます。

戻り値

HRESULT 値を返します。指定できる値には次の表の値が含まれます。

戻り値 説明
DMO_E_INVALIDSTREAMINDEX
無効なストリームインデックスです。
DMO_E_NO_MORE_ITEMS
タイプインデックスが範囲外です。
E_OUTOFMEMORY
メモリが不足しています。
E_POINTER
NULL ポインター引数です。
S_OK
成功。

解説(Remarks)

出力ストリームで優先されるメディアタイプを列挙するには、このメソッドを呼び出します。DMO は各メディアタイプに優先順にインデックス値を割り当てます。最も優先されるタイプのインデックスは 0 です。すべてのタイプを列挙するには、メソッドが DMO_E_NO_MORE_ITEMS を返すまで、タイプインデックスを増やしながら繰り返し呼び出します。DMO がサポートするすべてのメディアタイプを列挙するとは限りません。

返されるタイプのフォーマットブロックは NULL の場合があります。その場合、フォーマットタイプは GUID_NULL です。フォーマットブロックを参照する前に、フォーマットタイプを確認してください。

メソッドが成功した場合は、MoFreeMediaType を呼び出してフォーマットブロックを解放してください。(この関数はフォーマットブロックが NULL のときに呼び出しても安全です。)

メディアタイプを設定するには、IMediaObject::SetOutputType メソッドを呼び出します。あるストリームにメディアタイプを設定すると、別のストリームで優先されるタイプが変化することがあります。実際、あるストリームは別のストリームにタイプが設定されるまで優先タイプを持たない場合があります。たとえば、デコーダーは入力タイプが設定されるまで優先される出力タイプを持たないことがあります。ただし、DMO がこのように優先タイプを動的に更新することは必須ではありません。したがって、このメソッドが返すタイプが有効である保証はなく、SetOutputType メソッドで使用すると失敗する可能性があります。

特定のメディアタイプが受け入れられるかどうかをテストするには、DMO_SET_TYPEF_TEST_ONLY フラグを指定して SetOutputType を呼び出します。

dwTypeIndex パラメーターが範囲内かどうかをテストするには、pmtNULL を設定します。インデックスが範囲内であればメソッドは S_OK を返し、範囲外であれば DMO_E_NO_MORE_ITEMS を返します。

vtbl 8 HRESULT SetInputType(DWORD dwInputStreamIndex, DMO_MEDIA_TYPE* pmt, DWORD dwFlags)

SetInputType メソッドは、入力ストリームにメディアタイプを設定するか、メディアタイプが受け入れ可能かどうかをテストします。

dwInputStreamIndexDWORDinDMO 上の入力ストリームの 0 から始まるインデックス。
pmtDMO_MEDIA_TYPE*inoptionalメディアタイプを指定する DMO_MEDIA_TYPE 構造体へのポインター。
dwFlagsDWORDinDMO_SET_TYPE_FLAGS 列挙型の 0 個以上のフラグのビットごとの組み合わせ。

戻り値

HRESULT 値を返します。指定できる値には次の表の値が含まれます。

戻り値 説明
DMO_E_INVALIDSTREAMINDEX
無効なストリームインデックスです
DMO_E_TYPE_NOT_ACCEPTED
メディアタイプが受け入れられませんでした
S_FALSE
メディアタイプは受け入れ可能ではありません
S_OK
メディアタイプが正常に設定された、または受け入れ可能です

解説(Remarks)

入力ストリームのメディアタイプをテスト、設定、またはクリアするには、このメソッドを呼び出します。

他のストリームに現在設定されているメディアタイプによって、メディアタイプが受け入れ可能かどうかが変わることがあります。
vtbl 9 HRESULT SetOutputType(DWORD dwOutputStreamIndex, DMO_MEDIA_TYPE* pmt, DWORD dwFlags)

SetOutputType メソッドは、出力ストリームにメディアタイプを設定するか、メディアタイプが受け入れ可能かどうかをテストします。

dwOutputStreamIndexDWORDinDMO 上の出力ストリームの 0 から始まるインデックス。
pmtDMO_MEDIA_TYPE*inoptionalメディアタイプを指定する DMO_MEDIA_TYPE 構造体へのポインター。
dwFlagsDWORDinDMO_SET_TYPE_FLAGS 列挙型の 0 個以上のフラグのビットごとの組み合わせ。

戻り値

HRESULT 値を返します。指定できる値には次の表の値が含まれます。

戻り値 説明
DMO_E_INVALIDSTREAMINDEX
無効なストリームインデックスです
DMO_E_TYPE_NOT_ACCEPTED
メディアタイプが受け入れられませんでした
S_FALSE
メディアタイプは受け入れ可能ではありません
S_OK
メディアタイプが正常に設定された、または受け入れ可能です

解説(Remarks)

出力ストリームのメディアタイプをテスト、設定、またはクリアするには、このメソッドを呼び出します。

他のストリームに現在設定されているメディアタイプによって、メディアタイプが受け入れ可能かどうかが変わることがあります。
vtbl 10 HRESULT GetInputCurrentType(DWORD dwInputStreamIndex, DMO_MEDIA_TYPE* pmt)

GetInputCurrentType メソッドは、入力ストリームに設定されているメディアタイプがあれば、それを取得します。

dwInputStreamIndexDWORDinDMO 上の入力ストリームの 0 から始まるインデックス。
pmtDMO_MEDIA_TYPE*out呼び出し元が割り当てた DMO_MEDIA_TYPE 構造体へのポインター。メソッドはこの構造体にメディアタイプを設定します。

戻り値

HRESULT 値を返します。指定できる値には次の表の値が含まれます。

戻り値 説明
DMO_E_INVALIDSTREAMINDEX
無効なストリームインデックスです。
DMO_E_TYPE_NOT_SET
メディアタイプが設定されていません。
E_OUTOFMEMORY
メモリが不足しています。
S_OK
成功。

解説(Remarks)

呼び出し元は、このメソッドを呼び出す前にストリームのメディアタイプを設定しておく必要があります。メディアタイプを設定するには、IMediaObject::SetInputType メソッドを呼び出します。

メソッドが成功した場合は、MoFreeMediaType を呼び出してフォーマットブロックを解放してください。

vtbl 11 HRESULT GetOutputCurrentType(DWORD dwOutputStreamIndex, DMO_MEDIA_TYPE* pmt)

GetOutputCurrentType メソッドは、出力ストリームに設定されているメディアタイプがあれば、それを取得します。

dwOutputStreamIndexDWORDinDMO 上の出力ストリームの 0 から始まるインデックス。
pmtDMO_MEDIA_TYPE*out呼び出し元が割り当てた DMO_MEDIA_TYPE 構造体へのポインター。メソッドはこの構造体にメディアタイプを設定します。

戻り値

HRESULT 値を返します。指定できる値には次の表の値が含まれます。

戻り値 説明
DMO_E_INVALIDSTREAMINDEX
無効なストリームインデックスです。
DMO_E_TYPE_NOT_SET
メディアタイプが設定されていません。
E_OUTOFMEMORY
メモリが不足しています。
S_OK
成功。

解説(Remarks)

呼び出し元は、このメソッドを呼び出す前にストリームのメディアタイプを設定しておく必要があります。メディアタイプを設定するには、IMediaObject::SetOutputType メソッドを呼び出します。

メソッドが成功した場合は、MoFreeMediaType を呼び出してフォーマットブロックを解放してください。

vtbl 12 HRESULT GetInputSizeInfo(DWORD dwInputStreamIndex, DWORD* pcbSize, DWORD* pcbMaxLookahead, DWORD* pcbAlignment)

GetInputSizeInfo メソッドは、指定した入力ストリームのバッファー要件を取得します。

dwInputStreamIndexDWORDinDMO 上の入力ストリームの 0 から始まるインデックス。
pcbSizeDWORD*outこのストリームの入力バッファーの最小サイズ (バイト単位) を受け取る変数へのポインター。
pcbMaxLookaheadDWORD*outDMO が先読みのために保持するデータの最大量 (バイト単位) を受け取る変数へのポインター。DMO がそのストリームで先読みを行わない場合、値は 0 です。
pcbAlignmentDWORD*out必要なバッファーのアラインメント (バイト単位) を受け取る変数へのポインター。入力ストリームにアラインメント要件がない場合、値は 1 です。

戻り値

HRESULT 値を返します。指定できる値には次の表の値が含まれます。

戻り値 説明
DMO_E_INVALIDSTREAMINDEX
無効なストリームインデックスです。
DMO_E_TYPE_NOT_SET
メディアタイプが設定されていません。
S_OK
成功。

解説(Remarks)

バッファー要件は、各ストリームのメディアタイプに依存する場合があります。このメソッドを呼び出す前に、IMediaObject::SetInputType および IMediaObject::SetOutputType メソッドを呼び出して各ストリームのメディアタイプを設定してください。メディアタイプが設定されていない場合、このメソッドはエラーを返すことがあります。

DMO が入力ストリームで先読みを行う場合、IMediaObject::GetInputStreamInfo メソッドで DMO_INPUT_STREAMF_HOLDS_BUFFERS フラグを返します。処理中、DMO は pcbMaxLookahead パラメーターで示されるバイト数まで保持します。アプリケーションは、DMO がこの量のデータを保持できるだけの十分なバッファーを割り当てる必要があります。

バッファーの開始アドレスが *pcbAlignment の倍数である場合、そのバッファーはアラインされているといいます。アラインメントは 2 のべき乗でなければなりません。マイクロプロセッサによっては、アラインされたバッファーへの読み書きは、アラインされていないバッファーへの読み書きより高速な場合があります。また、アラインされていない読み書きをサポートしないマイクロプロセッサもあります。

vtbl 13 HRESULT GetOutputSizeInfo(DWORD dwOutputStreamIndex, DWORD* pcbSize, DWORD* pcbAlignment)

GetOutputSizeInfo メソッドは、指定した出力ストリームのバッファー要件を取得します。

dwOutputStreamIndexDWORDinDMO 上の出力ストリームの 0 から始まるインデックス。
pcbSizeDWORD*outこのストリームの出力バッファーの最小サイズ (バイト単位) を受け取る変数へのポインター。
pcbAlignmentDWORD*out必要なバッファーのアラインメント (バイト単位) を受け取る変数へのポインター。出力ストリームにアラインメント要件がない場合、値は 1 です。

戻り値

HRESULT 値を返します。指定できる値には次の表の値が含まれます。

戻り値 説明
DMO_E_INVALIDSTREAMINDEX
無効なストリームインデックスです。
DMO_E_TYPE_NOT_SET
メディアタイプが設定されていません。
S_OK
成功。

解説(Remarks)

バッファー要件は、各ストリームに設定されたメディアタイプに依存する場合があります。

このメソッドを呼び出す前に、IMediaObject::SetInputType および IMediaObject::SetOutputType メソッドを呼び出して各ストリームのメディアタイプを設定してください。メディアタイプが設定されていない場合、このメソッドはエラーを返すことがあります。ただし、ストリームが省略可能で、アプリケーションがそのストリームを使用しない場合は、そのストリームのメディアタイプを設定する必要はありません。

バッファーの開始アドレスが *pcbAlignment の倍数である場合、そのバッファーはアラインされているといいます。マイクロプロセッサのアーキテクチャによっては、アラインされたバッファーへの読み書きの方が、アラインされていないバッファーへの読み書きより高速です。一部のマイクロプロセッサでは、アラインされていないバッファーへの読み書きはサポートされておらず、プログラムがクラッシュする可能性があります。0 は有効なアラインメントではありません。

vtbl 14 HRESULT GetInputMaxLatency(DWORD dwInputStreamIndex, LONGLONG* prtMaxLatency)

GetInputMaxLatency メソッドは、指定した入力ストリームの最大レイテンシを取得します。

dwInputStreamIndexDWORDinDMO 上の入力ストリームの 0 から始まるインデックス。
prtMaxLatencyLONGLONG*out最大レイテンシを受け取る変数へのポインター。

戻り値

HRESULT 値を返します。指定できる値には次の表の値が含まれます。

戻り値 説明
DMO_E_INVALIDSTREAMINDEX
無効なストリームインデックスです。
E_FAIL
失敗。
E_NOTIMPL
実装されていません。レイテンシは 0 とみなしてください。
S_OK
成功。

解説(Remarks)

レイテンシとは、入力ストリーム上のタイムスタンプと、それに対応する出力ストリーム上のタイムスタンプとの差です。最大レイテンシは、タイムスタンプの差として起こりうる最大値です。DMO の最大レイテンシは、次のようにして求めます。

この定義では、レイテンシにサンプルの処理に要する時間は含まれません。また、入力バッファーのサイズによって生じるレイテンシも含まれません。

DMO が一度に 1 サンプルのみを処理する特別なケースでは、最大レイテンシは単にタイムスタンプの差になります。

レイテンシは、サンプルにタイムスタンプがあり、そのタイムスタンプが単調に増加または減少している場合にのみ定義されます。最大レイテンシは、入力ストリームおよび出力ストリームのメディアタイプに依存する場合があります。

vtbl 15 HRESULT SetInputMaxLatency(DWORD dwInputStreamIndex, LONGLONG rtMaxLatency)

SetInputMaxLatency メソッドは、指定した入力ストリームの最大レイテンシを設定します。最大レイテンシの定義については、IMediaObject::GetInputMaxLatency を参照してください。

dwInputStreamIndexDWORDinDMO 上の入力ストリームの 0 から始まるインデックス。
rtMaxLatencyLONGLONGin最大レイテンシ。

戻り値

HRESULT 値を返します。指定できる値には次の表の値が含まれます。

戻り値 説明
DMO_E_INVALIDSTREAMINDEX
無効なストリームインデックスです
E_FAIL
失敗
E_NOTIMPL
実装されていません
S_OK
成功
vtbl 16 HRESULT Flush()

Flush メソッドは、内部にバッファリングされているすべてのデータをフラッシュします。

戻り値

成功した場合は S_OK を返します。それ以外の場合は、エラーの原因を示す HRESULT 値を返します。

解説(Remarks)

このメソッドが呼び出されると、DMO は次の処理を行います。

メディアタイプ、最大レイテンシ、ロック状態は変更されません。

メソッドから復帰すると、すべての入力ストリームがデータを受け入れる状態になります。アプリケーションが少なくとも 1 つの入力ストリームに対して IMediaObject::ProcessInput メソッドを呼び出すまで、出力ストリームはデータを生成できません。

vtbl 17 HRESULT Discontinuity(DWORD dwInputStreamIndex)

Discontinuity メソッドは、指定した入力ストリームでの不連続 (ディスコンティニュイティ) を通知します。

dwInputStreamIndexDWORDinDMO 上の入力ストリームの 0 から始まるインデックス。

戻り値

HRESULT 値を返します。指定できる値には次の表の値が含まれます。

戻り値 説明
DMO_E_INVALIDSTREAMINDEX
無効なストリームインデックスです
DMO_E_NOTACCEPTING
DMO は入力を受け入れていません。
DMO_E_TYPE_NOT_SET
入力タイプと出力タイプが設定されていません。
S_OK
成功

解説(Remarks)

不連続とは、入力の途切れを表します。不連続は、これ以上データが見込まれない場合、フォーマットが変更される場合、またはデータに欠落がある場合などに発生します。不連続の後、DMO は保留中のデータをすべて処理し終えるまで、そのストリームでさらなる入力を受け入れません。アプリケーションは、いずれのストリームも DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE フラグを返さなくなるまで、IMediaObject::ProcessOutput メソッドを呼び出してください。

クライアントが DMO に入力タイプと出力タイプを設定する前にこのメソッドを呼び出すと、失敗する場合があります。

vtbl 18 HRESULT AllocateStreamingResources()

AllocateStreamingResources メソッドは、DMO が必要とするリソースを割り当てます。このメソッドの呼び出しは常に省略可能です。

戻り値

成功した場合は S_OK を返します。それ以外の場合は、エラーの原因を示す HRESULT 値を返します。

解説(Remarks)

アプリケーションは、ストリーミングの最適化としてこのメソッドを呼び出すことができます。これにより、ストリーミング開始前に時間のかかる初期化を行う機会が DMO に与えられます。このメソッドを呼び出す場合は、DMO にメディアタイプを設定した後、かつ ProcessInput または ProcessOutput を最初に呼び出す前に行ってください。

このメソッドは、次の意味で省略可能です。

DMO がこのメソッドをサポートする場合は、IMediaObject::FreeStreamingResources メソッドもサポートする必要があります。
vtbl 19 HRESULT FreeStreamingResources()

FreeStreamingResources メソッドは、DMO が割り当てたリソースを解放します。このメソッドの呼び出しは常に省略可能です。

戻り値

成功した場合は S_OK を返します。それ以外の場合は、エラーの原因を示す HRESULT 値を返します。

解説(Remarks)

このメソッドは、IMediaObject::AllocateStreamingResources メソッドが初期化したリソースを解放します。

DMO がこのメソッドをサポートしていない場合、メソッドは S_OK を返します。ストリーミング中にこのメソッドを呼び出した場合、メソッドは失敗し、DMO はリソースを解放しません。

メソッドが失敗しても成功しても、アプリケーションは DMO の他のメソッドを引き続き呼び出すことができます。DMO は、以前に解放したリソースを再初期化する必要が生じる場合があります。

vtbl 20 HRESULT GetInputStatus(DWORD dwInputStreamIndex, DWORD* dwFlags)

GetInputStatus メソッドは、入力ストリームがさらに入力データを受け入れられるかどうかを問い合わせます。

dwInputStreamIndexDWORDinDMO 上の入力ストリームの 0 から始まるインデックス。
dwFlagsDWORD*out0 または DMO_INPUT_STATUSF_ACCEPT_DATA を受け取る変数へのポインター。

戻り値

HRESULT 値を返します。指定できる値には次の表の値が含まれます。

戻り値 説明
DMO_E_INVALIDSTREAMINDEX
無効なストリームインデックスです
S_OK
成功

解説(Remarks)

入力ストリームがさらにデータを受け入れられる場合、メソッドは dwFlags パラメーターに DMO_INPUT_STATUSF_ACCEPT_DATA フラグを返します。そうでない場合は、このパラメーターを 0 に設定します。ストリームがさらにデータを受け入れられる場合、アプリケーションは IMediaObject::ProcessInput メソッドを呼び出すことができます。

入力ストリームの状態は、次のいずれかのメソッド呼び出しの結果としてのみ変化します。

メソッド 説明
IMediaObject::Discontinuity 指定した入力ストリームでの不連続を通知します。
IMediaObject::Flush 内部にバッファリングされているすべてのデータをフラッシュします。
IMediaObject::ProcessInput 指定した入力ストリームにバッファーを渡します。
IMediaObject::ProcessOutput 現在の入力データから出力を生成します。
vtbl 21 HRESULT ProcessInput(DWORD dwInputStreamIndex, IMediaBuffer* pBuffer, DWORD dwFlags, LONGLONG rtTimestamp, LONGLONG rtTimelength)

ProcessInput メソッドは、指定した入力ストリームにバッファーを渡します。

dwInputStreamIndexDWORDinDMO 上の入力ストリームの 0 から始まるインデックス。
pBufferIMediaBuffer*inバッファーの IMediaBuffer インターフェイスへのポインター。
dwFlagsDWORDinDMO_INPUT_DATA_BUFFER_FLAGS 列挙型の 0 個以上のフラグのビットごとの組み合わせ。
rtTimestampLONGLONGinバッファー内のデータの開始時刻を指定するタイムスタンプ。バッファーに有効なタイムスタンプがある場合は、dwFlags パラメーターに DMO_INPUT_DATA_BUFFERF_TIME フラグを設定します。そうでない場合、DMO はこの値を無視します。
rtTimelengthLONGLONGinバッファー内のデータの継続時間を指定する参照時間。この値が有効な場合は、dwFlags パラメーターに DMO_INPUT_DATA_BUFFERF_TIMELENGTH フラグを設定します。そうでない場合、DMO はこの値を無視します。

戻り値

HRESULT 値を返します。指定できる値には次の表の値が含まれます。

戻り値 説明
DMO_E_INVALIDSTREAMINDEX
無効なストリームインデックスです。
DMO_E_NOTACCEPTING
データを受け入れられません。
S_FALSE
処理する出力がありません。
S_OK
成功。

解説(Remarks)

pBuffer パラメーターで指定する入力バッファーは読み取り専用です。DMO がこのバッファー内のデータを変更することはありません。書き込み操作はすべて出力バッファーに対して行われ、出力バッファーは IMediaObject::ProcessOutput メソッドの呼び出しで別途渡されます。

DMO がバッファー内のデータをすべて処理しない場合、DMO はそのバッファーの参照カウントを保持します。データの先読みを行う必要がある場合を除き、すべての出力を生成した時点でバッファーを解放します。(DMO が先読みを行うかどうかを調べるには、IMediaObject::GetInputStreamInfo メソッドを呼び出します。)

このメソッドが DMO_E_NOTACCEPTING を返した場合は、入力ストリームがさらにデータを受け入れられるようになるまで ProcessOutput を呼び出してください。ストリームがさらにデータを受け入れられるかどうかを調べるには、IMediaObject::GetInputStatus メソッドを呼び出します。

メソッドが S_FALSE を返した場合、この入力からは出力が生成されておらず、アプリケーションが ProcessOutput を呼び出す必要はありません。ただし、この状況で DMO が S_FALSE を返すことは必須ではなく、S_OK を返す場合もあります。

vtbl 22 HRESULT ProcessOutput(DWORD dwFlags, DWORD cOutputBufferCount, DMO_OUTPUT_DATA_BUFFER* pOutputBuffers, DWORD* pdwStatus)

ProcessOutput メソッドは、現在の入力データから出力を生成します。

dwFlagsDWORDinDMO_PROCESS_OUTPUT_FLAGS 列挙型の 0 個以上のフラグのビットごとの組み合わせ。
cOutputBufferCountDWORDin出力バッファーの数。
pOutputBuffersDMO_OUTPUT_DATA_BUFFER*out出力バッファーを格納する DMO_OUTPUT_DATA_BUFFER 構造体の配列へのポインター。配列のサイズは cOutputBufferCount パラメーターで指定します。
pdwStatusDWORD*out予約値 (0) を受け取る変数へのポインター。アプリケーションはこの値を無視してください。

戻り値

HRESULT 値を返します。指定できる値には次の表の値が含まれます。

戻り値 説明
E_FAIL
失敗
E_INVALIDARG
無効な引数です
E_POINTER
NULL ポインター引数です
S_FALSE
出力は生成されませんでした
S_OK
成功

解説(Remarks)

pOutputBuffers パラメーターは、DMO_OUTPUT_DATA_BUFFER 構造体の配列を指します。アプリケーションは出力ストリームごとに 1 つの構造体を割り当てる必要があります。出力ストリームの数を調べるには、IMediaObject::GetStreamCount メソッドを呼び出します。cOutputBufferCount パラメーターにはこの数を設定します。

DMO_OUTPUT_DATA_BUFFER 構造体には、バッファーの IMediaBuffer インターフェイスへのポインターが含まれます。これらのバッファーはアプリケーションが割り当てます。構造体の他のメンバーはステータスフィールドです。メソッドが成功した場合、DMO はこれらのフィールドを設定します。メソッドが失敗した場合、これらの値は未定義です。

アプリケーションが ProcessOutput を呼び出すと、DMO は可能な限り多くの入力データを処理します。DMO は各バッファー内のデータの末尾から出力データを書き込みます。(データの末尾を調べるには、IMediaBuffer::GetBufferAndLength メソッドを呼び出します。) DMO が出力バッファーの参照カウントを保持することはありません。

DMO が出力バッファーをすべて埋めてもなお処理すべき入力データが残っている場合、DMO は DMO_OUTPUT_DATA_BUFFER 構造体に DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE フラグを返します。アプリケーションは、各構造体の dwStatus メンバーを調べてこのフラグを確認してください。

メソッドが S_FALSE を返した場合、出力は生成されていません。ただし、この状況で DMO が S_FALSE を返すことは必須ではなく、S_OK を返す場合もあります。

データの破棄:

dwFlags パラメーターに DMO_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER フラグを設定すると、ストリームのデータを破棄できます。破棄したいストリームごとに、DMO_OUTPUT_DATA_BUFFER 構造体の pBuffer メンバーを NULL に設定します。

pBufferNULL である各ストリームについて、次のように動作します。

ストリームが破棄可能または省略可能かどうかを確認するには、IMediaObject::GetOutputStreamInfo メソッドを呼び出します。
vtbl 23 HRESULT Lock(INT bLock)

Lock メソッドは、DMO のロックを取得または解放します。複数の操作を行う際に DMO の直列化 (シリアル化) を維持するには、このメソッドを呼び出します。

bLockINTinロックを取得するか解放するかを指定する値。値が 0 以外の場合、ロックが取得されます。値が 0 の場合、ロックが解放されます。

戻り値

HRESULT 値を返します。指定できる値には次の表の値が含まれます。

戻り値 説明
E_FAIL
失敗
S_OK
成功

解説(Remarks)

このメソッドは、他のスレッドが DMO のメソッドを呼び出すことを防ぎます。他のスレッドが DMO のメソッドを呼び出すと、そのスレッドはロックが解放されるまでブロックされます。

Active Template Library (ATL) を使用して DMO を実装する場合、Lock メソッドの名前が CComObjectRootEx::Lock メソッドと衝突します。この問題を回避するには、ヘッダーファイル Dmo.h をインクルードする前に、プリプロセッサシンボル FIX_LOCK_NAME を定義してください。


#define FIX_LOCK_NAME
#include <dmo.h>

このディレクティブにより、プリプロセッサは IMediaObject のメソッド名を DMOLock に変更します。ご自身の DMO では、このメソッドを DMOLock として実装してください。実装内では、bLock の値に応じて ATL の Lock または Unlock メソッドを呼び出します。vtable の順序は変わらないため、アプリケーションは引き続き Lock という名前でメソッドを呼び出すことができます。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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_IMediaObject "{D8AD0F58-5494-4102-97C5-EC798E59BCF4}"
#usecom global IMediaObject IID_IMediaObject "{}"
#comfunc global IMediaObject_GetStreamCount              3 var,var
#comfunc global IMediaObject_GetInputStreamInfo          4 int,var
#comfunc global IMediaObject_GetOutputStreamInfo         5 int,var
#comfunc global IMediaObject_GetInputType                6 int,int,var
#comfunc global IMediaObject_GetOutputType               7 int,int,var
#comfunc global IMediaObject_SetInputType                8 int,var,int
#comfunc global IMediaObject_SetOutputType               9 int,var,int
#comfunc global IMediaObject_GetInputCurrentType         10 int,var
#comfunc global IMediaObject_GetOutputCurrentType        11 int,var
#comfunc global IMediaObject_GetInputSizeInfo            12 int,var,var,var
#comfunc global IMediaObject_GetOutputSizeInfo           13 int,var,var
#comfunc global IMediaObject_GetInputMaxLatency          14 int,var
#comfunc global IMediaObject_SetInputMaxLatency          15 int,int64
#comfunc global IMediaObject_Flush                       16
#comfunc global IMediaObject_Discontinuity               17 int
#comfunc global IMediaObject_AllocateStreamingResources  18
#comfunc global IMediaObject_FreeStreamingResources      19
#comfunc global IMediaObject_GetInputStatus              20 int,var
#comfunc global IMediaObject_ProcessInput                21 int,sptr,int,int64,int64
#comfunc global IMediaObject_ProcessOutput               22 int,int,var,var
#comfunc global IMediaObject_Lock                        23 int
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。