IDirectDrawVideo
COM公式ドキュメント
IDirectDrawVideo インターフェイスは、Video Renderer フィルターに対して DirectDraw サーフェスとハードウェア機能を照会します。アプリケーションはこのインターフェイスを使用して、Video Renderer が利用する DirectDraw の機能を制御できます。
メソッド 16
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GetSwitches メソッドは、レンダラーが使用を許可されているサーフェスの種類を取得します。
| pSwitches | DWORD* | out | 次の DirectShow DirectDraw Surface (AMDDS) サーフェスタイプのうち、1 つ以上を含むビットマスクへのポインター。
|
戻り値
HRESULT 値を返します。
SetSwitches メソッドは、レンダラーが使用を許可されるサーフェスの種類を設定します。
| Switches | DWORD | in | 次の DirectShow DirectDraw Surface (AMDDS) サーフェスタイプのうち、1 つ以上を含むビットマスク。
|
戻り値
HRESULT 値を返します。
解説(Remarks)
このメソッドは、Video Renderer が接続される前に呼び出す必要があります。
GetCaps メソッドは、ハードウェア機能を格納した DirectDraw 定義の DDCAPS 構造体を取得します。
| pCaps | DDCAPS_DX7* | out | ハードウェア機能を格納した DDCAPS 構造体へのポインター。 |
戻り値
HRESULT 値を返します。
解説(Remarks)
レンダラーが DirectDraw を読み込んでいない場合、このメソッドは E_FAIL を返します。
GetEmulatedCaps メソッドは、エミュレートされた機能を格納した DirectDraw 定義の DDCAPS 構造体を取得します。
| pCaps | DDCAPS_DX7* | out | エミュレートされた機能を格納した DDCAPS 構造体へのポインター。 |
戻り値
HRESULT 値を返します。レンダラーが DirectDraw を読み込んでいない場合、このメソッドは E_FAIL を返します。
GetSurfaceDesc メソッドは、現在の DirectDraw サーフェスを記述する DDSURFACEDESC 構造体を取得します。
| pSurfaceDesc | DDSURFACEDESC* | inout | 現在の DirectDraw サーフェスを記述する DDSURFACEDESC 構造体へのポインター。 |
戻り値
HRESULT 値を返します。サーフェスが割り当てられていない場合、このメソッドは E_FAIL を返します。DCI プライマリサーフェスが使用中の場合、DDSURFACEDESC 構造体は設定されず、呼び出しは S_FALSE を返します。
解説(Remarks)
サーフェスは、レンダラーが一時停止しているときにのみ割り当てられます。レンダラーが一時停止された後は、停止時にサーフェスを解放できません。
GetFourCCCodes メソッドは、マルチメディア形式の種類を取得します。
| pCount | DWORD* | out | pCodes 配列内の FOURCC コードの数へのポインター。 |
| pCodes | DWORD* | out | 以前 Microsoft マルチメディア型に使用されていた DWORD メディアタグの配列へのポインター。 |
戻り値
HRESULT 値を返します。
解説(Remarks)
元の Windows マルチメディア API では、メディア型は 4 つの 8 ビット文字から作成された 32 ビット値でタグ付けされ、FOURCC コードとして知られていました。FOURCC コードは一意であるため、FOURCC を表す 40 億個の GUID の範囲を割り当てることで、1 対 1 のマッピングが可能になっています。
このメソッドは、現在のディスプレイドライバーがサポートできる FOURCC コードを取得します。利用可能な数は、有効な pCount ポインターを指定し、pCodes を NULL に設定してメソッドを呼び出すことで取得できます。この場合、pCount 変数に利用可能な FOURCC コードの数が設定されます。アプリケーションはその後、この数の FOURCC コードに十分な DWORD 値を割り当て、pCodes に配列ポインターを指定して再度メソッドを呼び出すことができます。
SetDirectDraw メソッドは、IDirectDraw インターフェイスを読み込まれたドライバーに渡します。
| pDirectDraw | IDirectDraw* | in | 渡す IDirectDraw インターフェイスへのポインター。 |
戻り値
HRESULT 値を返します。
解説(Remarks)
以前 SetDirectDraw を通じて渡した DirectDraw インターフェイスをレンダラーに解放させるには、アプリケーションは SetDirectDraw を呼び出して NULL を渡すことができます。ただし、レンダラーは切断されるまでその DirectDraw インターフェイスを使用し続けます。したがって、NULL パラメーターを指定して SetDirectDraw を呼び出しても、レンダラーがすぐにその使用を停止するわけではありません。
このメソッドは、DirectX 7.0 より前のバージョンの DirectDraw では、プロセスごとに 1 つの IDirectDraw インスタンスしか読み込めなかったために作成されました。DirectX 7.0 以降を使用している場合、このメソッドを呼び出す必要はまったくありません。アプリケーションが IDirectDraw を読み込みつつ、Video Renderer にもサーフェスの割り当てを許可したい場合、アプリケーションは自身で IDirectDraw を開き、そのインターフェイスを IDirectDrawVideo::SetDirectDraw を通じて読み込まれたドライバーに渡すことができます。あるいは、レンダラーに DirectDraw を読み込ませ、IDirectDrawVideo::GetDirectDraw を通じて参照カウントがインクリメントされたインターフェイスを取得することもできます。ただし、DirectShow には最新バージョンの DirectDraw が同梱されているため、アプリケーションが自身でディスプレイモードを変更し、レンダラーがサーフェスの割り当てに使用できる DirectDraw オブジェクトを渡したい場合を除いて、このメソッドは必要ありません。
GetDirectDraw メソッドは、IDirectDraw インターフェイスを取得します。
| ppDirectDraw | IDirectDraw** | out | IDirectDraw インターフェイスへのポインターのアドレス。 |
戻り値
HRESULT 値を返します。
解説(Remarks)
アプリケーションが DirectDraw を読み込みつつ、レンダラーにもサーフェスの割り当てを許可したい場合、レンダラーに DirectDraw を読み込ませ、このメソッドを通じて参照カウントがインクリメントされたインターフェイスを取得できます。返されたインターフェイスは、使用が終わったらアプリケーションが解放する必要があります。
GetSurfaceType メソッドは、実際のサーフェスタイプを DirectShow DirectDraw Surface (AMDDS) 定義として取得します。
| pSurfaceType | DWORD* | out | 次の値のうち 1 つ以上のビットごとの OR を受け取る変数へのポインター。
|
戻り値
HRESULT 値を返します。
解説(Remarks)
DDSURFACEDESC 構造体を見ても、どの種類のサーフェスが使用されているかを判別するのは必ずしも容易ではありません。そのため、アプリケーションは GetSurfaceType を呼び出してサーフェスタイプを取得できます。このフィールドには、前述の AMDDS 定義の一覧から選択された 1 つのビット設定が設定されます。
SetDefault メソッドは、現在のプロパティ設定をグローバルな既定値にします。
戻り値
HRESULT 値を返します。
解説(Remarks)
IDirectDrawVideo を通じて設定されるすべてのプロパティは、その特定のインスタンスに固有です。このメソッドを呼び出すと、この IDirectDrawVideo インスタンスに設定されたプロパティを、このインターフェイスのすべての DirectShow インスタンスのグローバルな既定値にできます。呼び出された後、現在のプロパティ設定は、その後の他の DirectShow フィルターグラフの開始時やコンピューターの再起動後も保持されます。
UseScanLine メソッドは、ビデオの描画時にレンダラーが現在の走査線をチェックするかどうかを決定します。
| UseScanLine | INT | in | 走査線情報を使用するかどうかを指定する長整数値。走査線情報を使用する場合は OATRUE を、無視する場合は OAFALSE を設定します。 |
戻り値
引数が無効な場合は E_INVALIDARG を、それ以外の場合は S_OK を返します。
解説(Remarks)
モニターの走査線が画面の表示部分を走査している間にビデオメモリへ画像を BLT すると、完成した画像は古い画像と新しい画像の合成になります。この合成はティアリング(torn video image)として知られています。新しい画像を BLT する前に前の画像が完成するまで待つことで、ティアリングを回避できます。一部のビデオカードは走査線の現在位置を取得できます。この情報が利用できる場合、走査線が画面外にあるまで待ってから新しい画像を BLT することで、DirectShow にティアリングの軽減を試みさせることができます。走査線の位置をチェックするとプロセッサの負荷が増加し、画面に配信されるビデオフレーム数が減少する可能性があることに注意してください。走査線情報が利用できる場合、DirectShow は既定でそれを使用します。わずかな画質の低下と引き換えに処理時間を節約したい場合は、UseScanLine を OAFALSE に設定してください。
CanUseScanLine メソッドは、描画時にレンダラーが現在の走査線をチェックするかどうかを判定します。
| UseScanLine | INT* | out | レンダラーが走査線情報を使用するかどうかを示す値へのポインター。OATRUE はレンダラーが描画時に現在の走査線をチェックすることを示し、OAFALSE はチェックしないことを示します。 |
戻り値
HRESULT 値を返します。
解説(Remarks)
DirectShow ビデオレンダラーにおける走査線検出の使用に関する説明については、IDirectDrawVideo::UseScanLine を参照してください。
UseOverlayStretch メソッドは、レンダラーがオーバーレイのストレッチ制限をチェックするかどうかを決定します。
| UseOverlayStretch | INT | in | レンダラーがオーバーレイのストレッチをチェックするかどうかを指定する値。レンダラーにオーバーレイのストレッチをチェックさせるには OATRUE を、それ以外の場合は OAFALSE を設定します。 |
戻り値
HRESULT 値を返します。
解説(Remarks)
一部のディスプレイカードは、DirectDraw を通じてオーバーレイサーフェスの使用を提供します。オーバーレイサーフェスとは、モニターの垂直リフレッシュ中にその内容がディスプレイ上に重ね合わされるビデオメモリのブロックです。オーバーレイサーフェスは通常、より高品質のビデオと非常に高速なパフォーマンスを提供するため、DirectShow は可能な限り利用可能なすべてのオーバーレイサーフェスを使用します。比較的高いビット深度に設定された一部のディスプレイカードでは、(特定のディスプレイハードウェアの帯域幅制限に対応するために)オーバーレイを実際のサイズより大きく画面に表示する必要があります。オーバーレイが十分に大きく表示されない場合、ディスプレイ上に望ましくない効果(「ちらつき(fleeting shimmering)」効果と表現されることがあります)が現れることがあります。
UseOverlayStretch が OATRUE(オン、既定)に設定されている場合、DirectShow は表示前にオーバーレイが適切にストレッチされていることを保証します。OAFALSE(オフ)に設定されている場合、DirectShow はオーバーレイが適切にストレッチされているかどうかをチェックせず、ユーザーは画面上でアーティファクトを経験する可能性が高くなります(ただし、可能であればオーバーレイが使用されることも保証されます)。
CanUseOverlayStretch メソッドは、レンダラーがオーバーレイの制限をチェックするかどうかを判定します。
| UseOverlayStretch | INT* | out | レンダラーがオーバーレイの制限を使用できるかどうかを示す値へのポインター。OATRUE はレンダラーがオーバーレイの制限をチェックすることを示し、OAFALSE はチェックしないことを示します。 |
戻り値
HRESULT 値を返します。
解説(Remarks)
オーバーレイのストレッチに関する説明については、IDirectDrawVideo::UseOverlayStretch を参照してください。
UseWhenFullScreen メソッドは、フルスクリーンモードに移行するときに DirectShow がディスプレイモードを変更するかどうかを決定します。
| UseWhenFullScreen | INT | in | ディスプレイモードを変更するかどうかを指定する値。レンダラーにフルスクリーンモードで DirectShow を使用させるには OATRUE を、それ以外の場合は OAFALSE を設定します。 |
戻り値
HRESULT 値を返します。
解説(Remarks)
フルスクリーンモードへの移行を求められた場合、DirectShow にはいくつかの選択肢があります。最初の選択肢は、グラフ内のいずれかのフィルターがフルスクリーン再生を直接サポートできるかどうかを判断することです。サポートできるフィルターがある場合、そのフィルターにフルスクリーン再生が要求されます。
2 番目の選択肢は、DirectDraw のモード変更サービスを使用してビデオを再生する特別なフルスクリーンレンダラーを、フィルターグラフに自動的に追加することです。ディスプレイモードを変更することで、ビデオはディスプレイのより広い部分(必ずしも全体ではありません)を効果的に埋めます。たとえば、現在のモードが 1024 x 768 ピクセルの場合、ビデオは比較的小さく見えるかもしれませんが、320 x 240 のディスプレイモードで表示すると非常に見栄えよく表示される場合があります。
3 番目で最後の選択肢は、単に IVideoWindow インターフェイスをサポートする任意のレンダラーを使用し、そのウィンドウをフルスクリーンにストレッチすることです。これは通常、2 番目の選択肢(フルスクリーン対応の DirectDraw レンダラーへの切り替え)よりも低いパフォーマンスとなります。UseWhenFullScreen パラメーターがオン(OATRUE)に設定されている場合、フルスクリーン再生時にウィンドウは常にフルスクリーンにストレッチされます。オフ(既定)に設定されている場合、フィルターグラフマネージャーは自由に DirectDraw 対応のフルスクリーンレンダラーに切り替えることができます。
WillUseFullScreen メソッドは、フルスクリーンモードに移行するときに DirectShow がディスプレイモードを変更するかどうかを判定します。
| UseWhenFullScreen | INT* | out | DirectShow がフルスクリーンモードで DirectX を使用するかどうかを示す値へのポインター。OATRUE はフルスクリーンモードを使用することを示し、OAFALSE は使用しないことを示します。 |
戻り値
HRESULT 値を返します。
解説(Remarks)
この機能に関する説明については、IDirectDrawVideo::UseWhenFullScreen を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDirectDrawVideo "{36D39EB0-DD75-11CE-BF0E-00AA0055595A}" #usecom global IDirectDrawVideo IID_IDirectDrawVideo "{}" #comfunc global IDirectDrawVideo_GetSwitches 3 var #comfunc global IDirectDrawVideo_SetSwitches 4 int #comfunc global IDirectDrawVideo_GetCaps 5 var #comfunc global IDirectDrawVideo_GetEmulatedCaps 6 var #comfunc global IDirectDrawVideo_GetSurfaceDesc 7 var #comfunc global IDirectDrawVideo_GetFourCCCodes 8 var,var #comfunc global IDirectDrawVideo_SetDirectDraw 9 sptr #comfunc global IDirectDrawVideo_GetDirectDraw 10 sptr #comfunc global IDirectDrawVideo_GetSurfaceType 11 var #comfunc global IDirectDrawVideo_SetDefault 12 #comfunc global IDirectDrawVideo_UseScanLine 13 int #comfunc global IDirectDrawVideo_CanUseScanLine 14 var #comfunc global IDirectDrawVideo_UseOverlayStretch 15 int #comfunc global IDirectDrawVideo_CanUseOverlayStretch 16 var #comfunc global IDirectDrawVideo_UseWhenFullScreen 17 int #comfunc global IDirectDrawVideo_WillUseFullScreen 18 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IDirectDrawVideo "{36D39EB0-DD75-11CE-BF0E-00AA0055595A}" #usecom global IDirectDrawVideo IID_IDirectDrawVideo "{}" #comfunc global IDirectDrawVideo_GetSwitches 3 sptr #comfunc global IDirectDrawVideo_SetSwitches 4 int #comfunc global IDirectDrawVideo_GetCaps 5 sptr #comfunc global IDirectDrawVideo_GetEmulatedCaps 6 sptr #comfunc global IDirectDrawVideo_GetSurfaceDesc 7 sptr #comfunc global IDirectDrawVideo_GetFourCCCodes 8 sptr,sptr #comfunc global IDirectDrawVideo_SetDirectDraw 9 sptr #comfunc global IDirectDrawVideo_GetDirectDraw 10 sptr #comfunc global IDirectDrawVideo_GetSurfaceType 11 sptr #comfunc global IDirectDrawVideo_SetDefault 12 #comfunc global IDirectDrawVideo_UseScanLine 13 int #comfunc global IDirectDrawVideo_CanUseScanLine 14 sptr #comfunc global IDirectDrawVideo_UseOverlayStretch 15 int #comfunc global IDirectDrawVideo_CanUseOverlayStretch 16 sptr #comfunc global IDirectDrawVideo_UseWhenFullScreen 17 int #comfunc global IDirectDrawVideo_WillUseFullScreen 18 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。