Microsoft DirectX 8.0

IMediaObject インターフェイス

このインターフェイスは、Microsoft® DirectX® Media Object (DMO) を操作するためのメソッドを備えている。

Vtable 順のメソッド

IUnknown メソッド説明
QueryInterfaceサポートされているインターフェイスを指すポインタを取得する。
AddRef参照カウントをインクリメントする。
Release参照カウントをデクリメントする。
IMediaObject メソッド説明
GetStreamCount入力ストリームと出力ストリームの数を取得する。
GetInputStreamInfo指定された入力ストリームに関する情報を取得する。
GetOutputStreamInfo指定された出力ストリームに関する情報を取得する。
GetInputType指定された入力ストリームの優先メディア タイプを取得する。
GetOutputType指定された出力ストリームの優先メディア タイプを取得する。
SetInputType入力ストリームのメディア タイプを設定する、または特定のメディア タイプが使用可能かどうかをテストする。
SetOutputType出力ストリームのメディア タイプを設定する、または特定のメディア タイプが使用可能かどうかをテストする。
GetInputCurrentType前に設定された入力ストリームのメディア タイプがあれば、それを取得する。
GetOutputCurrentType前に設定された出力ストリームのメディア タイプがあれば、それを取得する。
GetInputSizeInfo指定された入力ストリームのバッファ要件を取得する。
GetOutputSizeInfo指定された出力ストリームのバッファ要件を取得する。
GetInputMaxLatency指定された入力ストリームの最大待機時間を取得する。
SetInputMaxLatency指定された入力ストリームの最大待機時間を設定する。
Flush内部でバッファリングされたすべてのデータをフラッシュする。
Discontinuity指定された入力ストリームの途切れを知らせる。
AllocateStreamingResourcesDMO が必要とするすべてのリソースを割り当てる。
FreeStreamingResourcesDMO が割り当てたリソースを解放する。
GetInputStatus指定された入力ストリームが入力データをこれ以上受け入れられるかどうかを問い合わせる。
ProcessInput指定された入力ストリームにバッファを配布する。
ProcessOutput現在の入力データから出力を生成する。
LockDMO のロックを取得または解除する。

IMediaObject::GetStreamCount

IMediaObject インターフェイス

入力ストリームと出力ストリームの数を取得する。

構文

HRESULT GetStreamCount(
    DWORD *pcInputStreams,
    DWORD *pcOutputStreams
);

パラメータ

pcInputStreams
[out] 入力ストリームの数を受け取る変数を指すポインタ。NULL は指定できない。
pcOutputStreams
[out] 出力ストリームの数を受け取る変数を指すポインタ。NULL は指定できない。

戻り値

HRESULT 値を返す。以下の値をとる。

S_OK成功
E_POINTERNULL ポインタ引数

注意

DMO は入力ストリームまたは出力ストリームをまったく持っていないことがある。ストリームの数は変わらない。DMO はストリームを動的に追加または削除できない。

IMediaObject::GetInputStreamInfo

IMediaObject インターフェイス

バッファあたりのサンプル数に関する制限、ストリームが入力データに対してルックアヘッドを実行するかどうかなど、入力ストリームに関する情報を取得する。この情報が変わることはない。

構文

HRESULT GetInputStreamInfo(
DWORD dwInputStreamIndex,
DWORD *pdwFlags
);

パラメータ

dwInputStreamIndex
DMO の入力ストリームのゼロベースのインデックス。
pdwFlags
[out] 0 個以上の DMO_INPUT_STREAM_INFO_FLAGS フラグのビット単位の論理和を受け取る変数を指すポインタ。

戻り値

HRESULT 値を返す。以下の値をとる。

S_OK成功
DMO_E_INVALIDSTREAMINDEX無効なストリーム インデックス
E_POINTERNULL ポインタ引数

注意

DMO_INPUT_STREAMF_HOLDS_BUFFERS フラグは、DMO が入力データに対してルックアヘッドを実行することを示す。

アプリケーションは、DMO が入力を処理するのに十分なバッファを割り当てる必要がある。バッファ要件を調べるには、GetInputSizeInfo メソッドを呼び出す。

IMediaObject::GetOutputStreamInfo

IMediaObject インターフェイス

ストリームが破棄できるかどうか、ストリームが固定サンプル サイズを使うかどうかなど、出力ストリームに関する情報を取得する。この情報が変わることはない。

構文

HRESULT GetOutputStreamInfo(
DWORD dwOutputStreamIndex,
DWORD *pdwFlags
);

パラメータ

dwOutputStreamIndex
DMO の出力ストリームのゼロベースのインデックス。
pdwFlags
[out] 0 個以上の DMO_OUTPUT_STREAM_INFO_FLAGS フラグのビット単位の論理和を受け取る変数を指すポインタ。

戻り値

HRESULT 値を返す。以下の値をとる。

S_OK成功
DMO_E_INVALIDSTREAMINDEX無効なストリーム インデックス
E_POINTERNULL ポインタ引数

IMediaObject::GetInputType

IMediaObject インターフェイス

指定された入力ストリームの優先メディア タイプを取得する。

構文

HRESULT GetInputType(
DWORD dwInputStreamIndex,
DWORD dwTypeIndex,
DMO_MEDIA_TYPE *pmt
);

パラメータ

dwInputStreamIndex
DMO の入力ストリームのゼロベースのインデックス。
dwTypeIndex
使用可能なメディア タイプのセットのゼロベースのインデックス。
pmt
[out] 呼び出し元によって割り当てられた DMO_MEDIA_TYPE 構造体を指すポインタ。メソッドは構造体にメディア タイプを格納する。フォーマット ブロックは NULL になることがある。その場合のフォーマット タイプ GUID は GUID_NULL である。

戻り値

HRESULT 値を返す。以下の値をとる。

S_OK成功。
DMO_E_INVALIDSTREAMINDEX無効なストリーム インデックス。
DMO_E_NO_MORE_ITEMSタイプ インデックスが範囲外である。
E_OUTOFMEMORYメモリ不足。
E_POINTERNULL ポインタ引数。

注意

このメソッドを呼び出して、入力ストリームの優先メディア タイプを列挙する。DMO は、優先順位に従って、個々のメディア タイプにインデックス値を割り当てる。最優先タイプのインデックスは 0 になる。すべてのタイプを列挙するには、メソッドが DMO_E_NO_MORE_ITEMS を返すまで、タイプ インデックスをインクリメントしながら、呼び出しを繰り返す。

メソッドが成功したら、MoFreeMediaType を呼び出してフォーマット ブロックを解放する。

メディア タイプを設定するには、SetInputType メソッドを呼び出す。1 つのストリームのメディア タイプを設定すると、別のストリームの優先タイプが変わることがある。実際、ストリームは、別のストリームのタイプが設定されるまで、優先タイプを持たないことがある。たとえば、デコーダは、入力タイプが設定されるまで優先出力タイプを持たないことがある。ただし、DMO は、この方法で動的に優先タイプを更新する必要はない。したがって、このメソッドによって返されるタイプが有効であることは保証されない。返されるタイプを SetInputType メソッドで使用すると、失敗することがある。逆に、DMO が、サポートするすべてのメディア タイプを列挙することも保証されない。特定のメディア タイプが使用可能かどうかをテストするには、DMO_SET_TYPEF_TEST_ONLY フラグを設定して SetInputType を呼び出す。

pmt パラメータは NULL を取り得る。この場合、タイプ インデックスが範囲内なら、メソッドは S_OK を返す。それ以外なら、DMO_E_NO_MORE_ITEMS かほかのエラー コードを返す。

IMediaObject::GetOutputType

IMediaObject インターフェイス

指定された出力ストリームの優先メディア タイプを取得する。

構文

HRESULT GetOutputType(
DWORD dwOutputStreamIndex,
DWORD dwTypeIndex,
DMO_MEDIA_TYPE *pmt
);

パラメータ

dwOutputStreamIndex
DMO の出力ストリームのゼロベースのインデックス。
dwTypeIndex
使用可能なメディア タイプのセットのゼロベースのインデックス。
pmt
[out] 呼び出し元によって割り当てられた DMO_MEDIA_TYPE 構造体を指すポインタ。メソッドは構造体にメディア タイプを格納する。フォーマット ブロックは NULL になることがある。その場合のフォーマット タイプ GUID は GUID_NULL である。

戻り値

HRESULT 値を返す。以下の値をとる。

S_OK成功。
DMO_E_INVALIDSTREAMINDEX無効なストリーム インデックス。
DMO_E_NO_MORE_ITEMSタイプ インデックスが範囲外である。
E_OUTOFMEMORYメモリ不足。
E_POINTERNULL ポインタ引数。

注意

このメソッドを呼び出して、出力ストリームの優先メディア タイプを列挙する。DMO は、優先順位に従って、個々のメディア タイプにインデックス値を割り当てる。最優先タイプのインデックスは 0 になる。すべてのタイプを列挙するには、メソッドが DMO_E_NO_MORE_ITEMS を返すまで、タイプ インデックスをインクリメントしながら、呼び出しを繰り返す。

メソッドが成功したら、MoFreeMediaType を呼び出してフォーマット ブロックを解放する。

メディア タイプを設定するには、SetOutputType メソッドを呼び出す。1 つのストリームのメディア タイプを設定すると、別のストリームの優先タイプが変わることがある。実際、ストリームは、別のストリームのタイプが設定されるまで、優先タイプを持たないことがある。たとえば、デコーダは、入力タイプが設定されるまで優先出力タイプを持たないことがある。ただし、DMO は、この方法で動的に優先タイプを更新する必要はない。したがって、このメソッドによって返されるタイプが有効であることは保証されない。返されるタイプを SetOutputType メソッドで使用すると、失敗することがある。逆に、DMO が、サポートするすべてのメディア タイプを列挙することも保証されない。特定のメディア タイプが使用可能かどうかをテストするには、DMO_SET_TYPEF_TEST_ONLY フラグを設定して SetOutputType を呼び出す。

pmt パラメータは NULL を取り得る。この場合、タイプ インデックスが範囲内なら、メソッドは S_OK を返す。それ以外なら、DMO_E_NO_MORE_ITEMS かほかのエラー コードを返す。

IMediaObject::SetInputType

IMediaObject インターフェイス

入力ストリームのメディア タイプを設定する、またはメディア タイプが使用可能かどうかをテストする。

構文

HRESULT SetInputType(
DWORD dwInputStreamIndex,
const DMO_MEDIA_TYPE *pmt,
DWORD dwFlags
);

パラメータ

dwInputStreamIndex
DMO の入力ストリームのゼロベースのインデックス。
pmt
[in] メディア タイプを指定する DMO_MEDIA_TYPE 構造体を指すポインタ。
dwFlags
DMO_SET_TYPE_FLAGS 列挙の 0 個以上のフラグのビット単位の論理和。

戻り値

HRESULT 値を返す。以下の値をとる。

S_OKメディア タイプが正しく設定された、または使用可能である。
S_FALSEメディア タイプが使用できない。
DMO_E_INVALIDSTREAMINDEX無効なストリーム インデックス。
DMO_E_TYPE_NOT_ACCEPTEDメディア タイプが受け入れられなかった。

注意

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

現在ほかのストリームに対して設定されているメディア タイプによって、メディア タイプが使用可能かどうかが影響を受けることがある。

IMediaObject::SetOutputType

IMediaObject インターフェイス

出力ストリームのメディア タイプを設定する、またはメディア タイプが使用可能かどうかをテストする。

構文

HRESULT SetOutputType(
DWORD dwOutputStreamIndex,
const DMO_MEDIA_TYPE *pmt,
DWORD dwFlags
);

パラメータ

dwOutputStreamIndex
DMO の出力ストリームのゼロベースのインデックス。
pmt
[in] メディア タイプを指定する DMO_MEDIA_TYPE 構造体を指すポインタ。
dwFlags
DMO_SET_TYPE_FLAGS 列挙の 0 個以上のフラグのビット単位の論理和。

戻り値

HRESULT 値を返す。以下の値をとる。

S_OKメディア タイプが正しく設定された、または使用可能である。
S_FALSEメディア タイプが使用できない。
DMO_E_INVALIDSTREAMINDEX無効なストリーム インデックス。
DMO_E_TYPE_NOT_ACCEPTEDメディア タイプが受け入れられなかった。

注意

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

現在ほかのストリームに対して設定されているメディア タイプによって、メディア タイプが使用可能かどうかが影響を受けることがある。

IMediaObject::GetInputCurrentType

IMediaObject インターフェイス

設定された入力ストリームのメディア タイプがあれば、それを取得する。

構文

HRESULT GetInputCurrentType(
DWORD dwInputStreamIndex,
DMO_MEDIA_TYPE *pmt
);

パラメータ

dwInputStreamIndex
DMO の入力ストリームのゼロベースのインデックス。
pmt
[out] 呼び出し元によって割り当てられた DMO_MEDIA_TYPE 構造体を指すポインタ。メソッドは構造体にメディア タイプを格納する。

戻り値

HRESULT 値を返す。以下の値をとる。

S_OK成功。
DMO_E_INVALIDSTREAMINDEX無効なストリーム インデックス。
DMO_E_TYPE_NOT_SETメディア タイプが設定されなかった。
E_OUTOFMEMORYメモリ不足。

注意

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

メソッドが成功したら、MoFreeMediaType を呼び出してフォーマット ブロックを解放する。

IMediaObject::GetOutputCurrentType

IMediaObject インターフェイス

設定された出力ストリームのメディア タイプがあれば、それを取得する。

構文

HRESULT GetOutputCurrentType(
DWORD dwOutputStreamIndex,
DMO_MEDIA_TYPE *pmt
);

パラメータ

dwOutputStreamIndex
DMO の出力ストリームのゼロベースのインデックス。
pmt
[out] 呼び出し元によって割り当てられた DMO_MEDIA_TYPE 構造体を指すポインタ。メソッドは構造体にメディア タイプを格納する。

戻り値

HRESULT 値を返す。以下の値をとる。

S_OK成功。
DMO_E_INVALIDSTREAMINDEX無効なストリーム インデックス。
DMO_E_TYPE_NOT_SETメディア タイプが設定されなかった。
E_OUTOFMEMORYメモリ不足。

注意

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

メソッドが成功したら、MoFreeMediaType を呼び出してフォーマット ブロックを解放する。

IMediaObject::GetInputSizeInfo

IMediaObject インターフェイス

指定された入力ストリームのバッファ要件を取得する。

構文

HRESULT GetInputSizeInfo(
DWORD dwInputStreamIndex,
DWORD *pcbSize,
    DWORD *pcbMaxLookahead,
DWORD *pcbAlignment
);

パラメータ

dwInputStreamIndex
DMO の入力ストリームのゼロベースのインデックス。
pcbSize
[out] このストリームの入力バッファの最小サイズをバイト単位で受け取る変数を指すポインタ。
pcbMaxLookahead
[out] DMO がルックアヘッド用に保持する最大データ量をバイト単位で受け取る変数を指すポインタ。DMO がストリームに対してルックアヘッドを実行しない場合の値は 0 である。
pcbAlignment
[out] 必要なバッファ アラインメントをバイト単位で受け取る変数を指すポインタ。入力ストリームにアラインメント要件がない場合の値は 1 である。

戻り値

HRESULT 値を返す。以下の値をとる。

S_OK成功。
DMO_E_INVALIDSTREAMINDEX無効なストリーム インデックス。
DMO_E_TYPE_NOT_SETメディア タイプが設定されなかった。

注意

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

DMO が入力ストリームに対してルックアヘッドを実行する場合、DMO は GetInputStreamInfo メソッドで DMO_INPUT_STREAMF_HOLDS_BUFFERS フラグを返す。DMO は、処理中に、pcbMaxLookahead パラメータが示す数を最大バイト数とするデータを保持する。アプリケーションは、DMO がそれだけの量のデータを保持するのに十分なバッファを割り当てる必要がある。

バッファの開始アドレスが *pcbAlignment の倍数であれば、バッファは "アライン" されている。アラインメントは、2 の累乗でなければならない。マイクロプロセッサによっては、アラインされているバッファに対する読み取り、書き込みの方が、アラインされていないバッファに対する読み取り、書き込みより速い。また、一部のマイクロプロセッサは、アラインされていない読み取りと書き込みをサポートしていない。

IMediaObject::GetOutputSizeInfo

IMediaObject インターフェイス

指定された出力ストリームのバッファ要件を取得する。

構文

HRESULT GetOutputSizeInfo(
DWORD dwOutputStreamIndex,
DWORD *pcbSize,
DWORD *pcbAlignment
);

パラメータ

dwOutputStreamIndex
DMO の出力ストリームのゼロベースのインデックス。
pcbSize
[out] このストリームの出力バッファの最小サイズをバイト単位で受け取る変数を指すポインタ。
pcbAlignment
[out] 必要なバッファ アラインメントをバイト単位で受け取る変数を指すポインタ。出力ストリームにアラインメント要件がない場合の値は 1 である。

戻り値

HRESULT 値を返す。以下の値をとる。

S_OK成功。
DMO_E_INVALIDSTREAMINDEX無効なストリーム インデックス。
DMO_E_TYPE_NOT_SETメディア タイプが設定されなかった。

注意

バッファ要件は、各ストリームに対して設定されているメディア タイプによって異なることがある。

このメソッドを呼び出す前に、SetInputType メソッドと SetOutputType メソッドを呼び出すことによって、各ストリームのメディア タイプを設定する。メディア タイプが設定されていない場合、このメソッドはエラーを返すことがある。ただし、ストリームがオプション ストリームであれば、アプリケーションはストリームを使用しないし、ストリームのメディア タイプを設定する必要もない。

バッファの開始アドレスが *pcbAlignment の倍数であれば、バッファは "アライン" されている。 マイクロプロセッサのアーキテクチャによっては、アラインされたバッファに対する読み取り、書き込みの方が、アラインされていないバッファに対する読み取り、書き込みより速い。一部のマイクロプロセッサでは、アラインされていないバッファに対する読み取り、書き込みがサポートされていないため、これを実行するとプログラムがクラッシュすることがある。0 は有効なアラインメントではない。

IMediaObject::GetInputMaxLatency

IMediaObject インターフェイス

指定された入力ストリームの最大待機時間を取得する。

構文

HRESULT GetInputMaxLatency(
DWORD dwInputStreamIndex,
    REFERENCE_TIME *prtMaxLatency
);

パラメータ

dwInputStreamIndex
DMO の入力ストリームのゼロベースのインデックス。
prtMaxLatency
[out] 最大待機時間を受け取る変数を指すポインタ。

戻り値

HRESULT 値を返す。以下の値をとる。

S_OK成功。
DMO_E_INVALIDSTREAMINDEX無効なストリーム インデックス。
E_FAIL失敗。
E_NOTIMPL実装されていない。待機時間ゼロと見なす。

待機時間とは、入力ストリーム上のタイム スタンプと、それに対応する出力ストリーム上のタイム スタンプとの差である。最大待機時間は、2 つのタイム スタンプ間で生じる可能性のある最大の差異である。DMO の場合は、次のようにして最大待機時間を調べる。

この定義によれば、待機時間にはサンプルを処理する時間は含まれない。また、入力バッファのサイズが要因となる待機時間も含まれない。

DMO が一度に 1 つのサンプルだけを処理する特殊な場合の最大待機時間は、単にタイム スタンプ間の差異である。

待機時間は、サンプルがタイム スタンプを持っており、タイム スタンプが単調増加あるいは単調減少する場合にのみ定義される。最大待機時間は、入力ストリームおよび出力ストリームのメディア タイプによって異なることがある。

IMediaObject::SetInputMaxLatency

IMediaObject インターフェイス

指定された入力ストリームの最大待機時間を設定する。最大待機時間の定義については、「GetInputMaxLatency」を参照すること。

構文

HRESULT SetInputMaxLatency(
DWORD dwInputStreamIndex,
    REFERENCE_TIME rtMaxLatency
);

パラメータ

dwInputStreamIndex
DMO の入力ストリームのゼロベースのインデックス。
rtMaxLatency
最大待機時間。

戻り値

HRESULT 値を返す。以下の値をとる。

S_OK成功
DMO_E_INVALIDSTREAMINDEX無効なストリーム インデックス
E_FAIL失敗
E_NOTIMPL実装されていない

IMediaObject::Flush

IMediaObject インターフェイス

内部でバッファリングされたすべてのデータをフラッシュする。

構文

HRESULT Flush(void);

戻り値

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

注意

このメソッドが呼び出されると、DMO は以下の操作を行う。

メディア タイプ、最大待機時間、およびロック状態は変わらない。

メソッドが終了すると、すべての入力ストリームはデータを受け入れる。出力ストリームは、アプリケーションが少なくとも 1 つの入力ストリームに対して ProcessInput メソッドを呼び出すまで、データを生成できない。

IMediaObject::Discontinuity

IMediaObject インターフェイス

指定された入力ストリームの途切れを知らせる。

構文

HRESULT Discontinuity(
    DWORD dwInputStreamIndex
);

パラメータ

dwInputStreamIndex
DMO の入力ストリームのゼロベースのインデックス。

戻り値

HRESULT 値を返す。以下の値をとる。

S_OK成功
DMO_E_INVALIDSTREAMINDEX無効なストリーム インデックス

注意

途切れは入力の中断に相当する。途切れは、入力データがなくなった、フォーマットが変更された、データにギャップがある、などの理由で発生する。途切れが発生すると、DMO は、保留されているすべてのデータが処理されるまで、そのストリームの入力をそれ以上受け入れなくなる。アプリケーションは、DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE フラグを返すストリームがなくなるまで、ProcessOutput メソッドを呼び出す必要がある。

IMediaObject::AllocateStreamingResources

IMediaObject インターフェイス

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

構文

HRESULT AllocateStreamingResources(void);

戻り値

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

注意

アプリケーションは、ストリーミング最適化としてこのメソッドを呼び出すことができる。このメソッドを利用して、DMO は、ストリーミングが始まる前に、時間のかかるすべての初期化を実行できる。このメソッドを呼び出す場合は、DMO のメディア タイプを設定した後、最初に ProcessInput または ProcessOutput を呼び出す前に、メソッドを呼び出すこと。

このメソッドは、次の意味でオプションである。

DMO がこのメソッドをサポートする場合、その DMO は FreeStreamingResources メソッドもサポートする必要がある。

IMediaObject::FreeStreamingResources

IMediaObject インターフェイス

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

構文

HRESULT FreeStreamingResources(void);

戻り値

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

注意

このメソッドは、AllocateStreamingResources メソッドが初期化するすべてのリソースを解放する。

DMO がこのメソッドをサポートしない場合、メソッドは S_OK を返す。ストリーミングの最中にこのメソッドを呼び出すと、メソッドは失敗し、DMO はいずれのリソースも解放しない。

メソッドが成功するか、失敗するかにかかわらず、アプリケーションは、DMO に対するほかのメソッドの呼び出しを続けることができる。DMO が前に解放されたリソースを再初期化することが必要になることもある。

IMediaObject::GetInputStatus

IMediaObject インターフェイス

入力ストリームが入力データをこれ以上受け入れられるかどうかを問い合わせる。

構文

HRESULT GetInputStatus(
DWORD dwInputStreamIndex,
    DWORD *dwFlags
);

パラメータ

dwInputStreamIndex
DMO の入力ストリームのゼロベースのインデックス。
dwFlags
[out] ゼロまたは DMO_INPUT_STATUSF_ACCEPT_DATA を受け取る変数を指すポインタ。

戻り値

HRESULT 値を返す。以下の値をとる。

S_OK成功
DMO_E_INVALIDSTREAMINDEX無効なストリーム インデックス

注意

入力ストリームがデータをこれ以上受け入れる場合、メソッドは、dwFlags パラメータによって DMO_INPUT_STATUSF_ACCEPT_DATA フラグを返す。それ以外の場合、メソッドはこのパラメータをゼロに設定する。ストリームがデータをこれ以上受け入れる場合、アプリケーションは ProcessInput メソッドを呼び出すことができる。

入力ストリームの状態が変わるのは、以下のいずれかのメソッドを呼び出したときに限られる。

IMediaObject::ProcessInput

IMediaObject インターフェイス

指定された入力ストリームにバッファを配布する。

構文

HRESULT ProcessInput(
DWORD dwInputStreamIndex,
    IMediaBuffer *pBuffer,
DWORD dwFlags,
    REFERENCE_TIME rtTimestamp, 
    REFERENCE_TIME rtTimelength 
);

パラメータ

dwInputStreamIndex
DMO の入力ストリームのゼロベースのインデックス。
pBuffer
バッファの IMediaBuffer インターフェイスを指すポインタ。
dwFlags
DMO_INPUT_DATA_BUFFER_FLAGS 列挙の 0 個以上のフラグのビット単位の論理和。
rtTimestamp
バッファ内のデータの開始タイムを指定するタイム スタンプ。バッファが有効なタイム スタンプを持っている場合は、dwFlags パラメータで DMO_INPUT_DATA_BUFFERF_TIME フラグを設定する。それ以外の場合、DMO はこの値を無視する。
rtTimelength
バッファ内のデータの時間幅を指定する基準時間。この値が有効である場合は、dwFlags パラメータで DMO_INPUT_DATA_BUFFERF_TIMELENGTH フラグを設定する。それ以外の場合、DMO はこの値を無視する。

戻り値

HRESULT 値を返す。以下の値をとる。

S_FALSE処理する出力がない
S_OK成功。
DMO_E_INVALIDSTREAMINDEX無効なストリーム インデックス。
DMO_E_NOTACCEPTINGデータを受け入れられない。

注意

DMO がバッファ内のすべてのデータを処理しない場合、その DMO はバッファの参照カウントを保持する。DMO は、データに対してルックアヘッドを実行する必要がある場合を除いて、すべての出力を生成した後、バッファを解放する。DMO がルックアヘッドを実行するかどうかを調べるには、GetInputStreamInfo メソッドを呼び出す。

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

メソッドが S_FALSE を返した場合、この入力から出力は生成されていない。その場合、アプリケーションは ProcessOutput を呼び出す必要はない。ただし、この場合、DMO は S_FALSE を返す必要はない。DMO は S_OK を返すことがある。

IMediaObject::ProcessOutput

IMediaObject インターフェイス

現在の入力データから出力を生成する。

構文

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

パラメータ

dwFlags
DMO_PROCESS_OUTPUT_FLAGS 列挙の 0 個以上のフラグのビット単位の論理和。
cOutputBufferCount
出力バッファの数。
pOutputBuffers
[in, out] 出力バッファが格納された DMO_OUTPUT_DATA_BUFFER 構造体の配列を指すポインタ。cOutputBufferCount パラメータで配列のサイズを指定する。
pdwStatus
[out] 予約済みの値 (ゼロ) を受け取る変数を指すポインタ。アプリケーションはこの値を無視する必要がある。

戻り値

HRESULT 値を返す。以下の値をとる。

S_FALSE出力が生成されなかった。
S_OK成功。
E_FAIL失敗。
E_INVALIDARG無効な引数。
E_POINTERNULL ポインタ引数。

注意

pOutputBuffers パラメータは、DMO_OUTPUT_DATA_BUFFER 構造体の配列を指す。アプリケーションは、各出力ストリームに対して 1 つの構造体を割り当てる必要がある。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 を返す必要はない。DMO は S_OK を返すことがある。

データの破棄

dwFlags パラメータで DMO_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER フラグを設定することにより、ストリームのデータを破棄することができる。破棄する各ストリームに対して、DMO_OUTPUT_DATA_BUFFER 構造体の pBuffer メンバを NULL に設定する。

pBuffer が NULL である個々のストリームは、以下のように処理される。

ストリームが破棄可能またはオプション ストリームであるかどうかを確認するには、GetOutputStreamInfo メソッドを呼び出す。

IMediaObject::Lock

IMediaObject インターフェイス

DMO のロックを取得または解除する。複数の操作を実行するときに、このメソッドを呼び出して、DMO を継続して処理された状態に保つ。

構文

HRESULT Lock(
    LONG bLock
);

パラメータ

bLock
ロックを取得するか解除するかを指定する値。値が 0 以外の場合はロックが取得される。値が 0 の場合はロックが解除される。

戻り値

HRESULT 値を返す。以下の値をとる。

S_OK成功
E_FAIL失敗

注意

このメソッドは、ほかのスレッドが DMO に対するメソッドを呼び出さないようにする。ほかのスレッドが DMO に対するメソッドを呼び出すと、そのスレッドはロックが解除されるまで動作を停止する。