Microsoft DirectX 8.0

CImageAllocator クラス

CImageAllocator クラスの階層

CImageAllocator クラスは、共有メモリでサンプル バッファを割り当てる CBaseAllocator クラスを継承する。ブロックの数、サイズ、およびアラインメントは、接続された出力ピンCImageAllocator::SetProperties (IMemAllocator::SetProperties を実装する) を呼び出したときに決定される。共有メモリ ブロックは、それ以降の Microsoft® Win32® CreateDIBSection 関数の呼び出しで使用される。出力ピンはこれらのバッファにデータを格納することができ、このバッファは BitBlt を使用して GDI に渡される。

プロテクト データ メンバ

m_pFilter このオブジェクトを所有するフィルタ。
m_pMediaType 現在のメディア タイプ フォーマット。

メンバ関数

Alloc CreateDIBSection を使用してサンプルを割り当てる。
CheckSizes アロケータの条件をチェックする。
CImageAllocator CImageAllocator オブジェクトを作成する。
CreateDIB デバイスに依存しないビットマップ (DIB) を作成する。
Free 割り当てられたすべてのサンプルのリソースを解放して削除する。
NotifyMediaType 合意されたメディア タイプをアロケータに通知する。

オーバーライド可能なメンバ関数

CreateImageSample サンプルを作成する。

実装される INonDelegatingUnknown メソッド

NonDelegatingAddRef インターフェイスの参照カウントをインクリメントする。
NonDelegatingRelease インターフェイスの参照カウントをデクリメントする。

実装される IMemAllocator メソッド

SetProperties アロケータのバッファリングの条件を指定する。

CImageAllocator::Alloc

CImageAllocator クラス

CreateDIBSection に基づいてイメージ サンプルを作成する。

構文

HRESULT Alloc(void);

戻り値

HRESULT 値を返す。

注意

フィルタは、CImageAllocator::SetProperties メンバ関数を使用して、必要なバッファのサイズおよび数を定義する。このアロケータが派生したベース アロケータ クラスは、実際にメモリをコミットする必要があるときに、この内部仮想メンバ関数を呼び出す。このアロケータは、作成する各サンプルについて、Microsoft Win32 CreateDIBSection 関数を使用して DIBSECTION オブジェクトを作成する。この呼び出しから取得した情報を使用し、バッファのポインタおよび長さを渡して仮想メンバ関数 CreateImageSample を呼び出す。イメージ サンプルの作成に成功すると、その他の情報の中から、DIBSECTION 構造体を使ってイメージ サンプルを初期化する。

これはプロテクト メンバ関数である。

CImageAllocator::CheckSizes

CImageAllocator クラス

必要なバッファリングのプロパティをチェックする内部メンバ関数。

構文

HRESULT CheckSizes(
  ALLOCATOR_PROPERTIES *pRequest
  );

パラメータ

pRequest
要求されたアロケータのプロパティへのポインタ。

戻り値

HRESULT 値を返す。

注意

イメージ アロケータは、Microsoft Win32 CreateDIBSection 関数を使用してサンプルを割り当てる。CreateDIBSection 関数は、必要なビットマップが記述された BITMAPINFO 構造体へのポインタを入力として受け入れる。ビットマップのサイズは、ビデオの BITMAPINFO 構造体に応じて固定されるので、これよりも大きいバッファをアロケータに要求しても受け付けられない。したがって、このメンバ関数は、要求されたサイズがビットマップのサイズよりも大きくならないように、要求されたサイズを調整する。要求されたサイズがビットマップのサイズよりも小さい場合は、E_INVALIDARG を返す。

これはプロテクト メンバ関数である。

CImageAllocator::CImageAllocator

CImageAllocator クラス

CImageAllocator オブジェクトを作成する。

構文

CImageAllocator(
  CBaseFilter *pFilter,
  TCHAR *pName,
  HRESULT *phr
  );

パラメータ

pFilter
所有するフィルタ オブジェクトへのポインタ。
pName
デバッグ専用の文字列の記述へのポインタ。
phr
COM 戻りコードへのポインタ。

戻り値

戻り値なし。

注意

CImageAllocatorCImageSample、および CDrawImage クラスは、すべて密接に関連している。イメージ アロケータが使用するバッファは、Microsoft Win32 CreateDIBSection 関数を使用して作成される。次に、アロケータは CImageSample クラスに基づいて独自のサンプルを作成する。イメージ サンプルは、バッファ ポインタとその長さを使って初期化される。サンプルは、CreateDIBSection の呼び出しから取得されたさまざまな情報を保持する構造体 (DIBDATA 構造体) にも渡される。

これらのサンプルを描画オブジェクトに渡すことができる。描画オブジェクトは、サンプルのプライベート フォーマット、およびサンプルから DIBDATA 構造体を取得する方法を認識している。描画オブジェクトは、この情報を取得した後、サンプルに含まれるイメージを描画するときに、DIBDATA 構造体に格納されたビットマップ ハンドルを GDI に渡すことができる。描画時にバッファ ポインタ (サンプルが CImageSample ではない場合に使用される) ではなく、サンプルから取得したビットマップ ハンドルを使用することによって、パフォーマンスが若干向上する。

これはプロテクト メンバ関数である。

CImageAllocator::CreateDIB

CImageAllocator クラス

Win32 CreateDIBSection 関数を呼び出して、デバイスに依存しないビットマップ (DIB) を作成する。

構文

HRESULT CreateDIB(
  LONG InSize,
  DIBDATA &DibData
  );

パラメータ

InSize
必要なビットマップのサイズ。
DibData
詳細を格納する構造体。

戻り値

HRESULT 値を返す。

注意

これはプロテクト メンバ関数である。

CImageAllocator::CreateImageSample

CImageAllocator クラス

CImageSample オブジェクトを作成する。

構文

virtual CImageSample *CreateImageSample(
  LPBYTE pData,
  LONG Length
  );

パラメータ

pData
サンプルが処理するデータ バッファへのポインタ。
Length
関連付けられたバッファの長さ。

戻り値

新しい CImageSample サンプル オブジェクトを返す。

注意

この仮想メンバ関数は、アロケータの実際のサンプルを作成する。サンプルには、データ バッファと格納する長さが渡される。IMediaSample::GetPointer を使用して、サンプルに追加のバッファを要求すると、このポインタが返される。これが別の仮想メンバ関数に分割されている主な理由は、CImageAllocator の派生クラスが CImageSample からもクラスを派生させて、サンプルを作成するための場所を確保できるようにするためである。

これはプロテクト メンバ関数である。

CImageAllocator::Free

CImageAllocator クラス

サンプルを削除し、そのリソースを解放する。

構文

void Free(void);

戻り値

戻り値なし。

注意

ベース アロケータは、このアロケータをデコミットするときに、この内部仮想メンバ関数を呼び出す。

これはプロテクト メンバ関数である。

CImageAllocator::NonDelegatingAddRef

CImageAllocator クラス

所有するフィルタの参照カウントをインクリメントする。

構文

HRESULT NonDelegatingAddRef(void);

戻り値

HRESULT 値を返す。

注意

アロケータは、アロケータを作成するフィルタとは概念的に独立したオブジェクトである。ただし、イメージ アロケータは、アロケータを作成したフィルタに依存して、接続されたメディア タイプなどの追加情報を提供する。したがって、アロケータはそれ自体の NonDelegatingQueryInterface 関数を処理するが、すべての参照カウントを所有するフィルタに委任する。このため、たとえば、アロケータが NonDelegatingAddRef 関数の対象となる場合、実際に参照がカウントされるのは、このアロケータを所有するフィルタである。

CImageAllocator::NonDelegatingRelease

CImageAllocator クラス

所有するフィルタの参照カウントをデクリメントする。

構文

HRESULT NonDelegatingRelease(void);

戻り値

HRESULT 値を返す。

注意

アロケータは、アロケータを作成するフィルタとは概念的に独立したオブジェクトである。ただし、イメージ アロケータは、アロケータを作成したフィルタに依存して、接続されたメディア タイプなどの追加情報を提供する。したがって、アロケータはそれ自体の NonDelegatingQueryInterface 関数を処理するが、すべての参照カウントを所有するフィルタに委任する。このため、たとえば、アロケータが解放される場合、実際に NonDelegatingRelease 関数によって解放されるのは、このアロケータを所有するフィルタである。

CImageAllocator::NotifyMediaType

CImageAllocator クラス

フィルタからアロケータにメディア タイプを渡す。

構文

void NotifyMediaType(
  CMediaType *pMediaType
  );

パラメータ

pMediaType
フィルタが確立したメディア タイプへのポインタ。

戻り値

戻り値なし。

注意

イメージ アロケータが作成するバッファは、CreateDIBSection に基づいており、この関数には、フィルタが作成する必要があるビットマップの種類を指示しなければならない。フィルタは、アロケータについてこのメンバ関数を呼び出すことによってこれを処理する。フィルタは、通常、ピンの接続時にメディア タイプについて合意した後、このメンバ関数を呼び出す。このメンバ関数に渡されるメディア タイプはポインタである。アロケータは、メディア タイプのコピーではなく、このポインタを格納する。これは、メディア タイプをコピーするには時間がかかるというパフォーマンス上の理由からである。したがって、このメンバ関数を呼び出すフィルタは、このアロケータについて次にメディア タイプを設定するか、NULL 型を指定して呼び出されるまで、メディア タイプが常に有効であることを確認する必要がある。

CImageAllocator::SetProperties

CImageAllocator クラス

サイズ、数、およびブロックのアラインメントを判断する。

構文

HRESULT SetProperties(

  ALLOCATOR_PROPERTIES *pRequest,
  ALLOCATOR_PROPERTIES *pActual
  );

パラメータ

pRequest
要求されたアロケータのプロパティへのポインタ。
pActual
実際に設定されたアロケータのプロパティへのポインタ。

戻り値

HRESULT 値を返す。

注意

pRequest パラメータには、ALLOCATOR_PROPERTIES 構造体によって指定されているカウント、数、およびアラインメントについて要求された値が、呼び出し元によって格納される。pActual パラメータには、要求に対して提供可能な最も近い値がアロケータによって格納される。このメンバ関数は、アロケータが IMemAllocator::Decommit メソッドを使用してデコミットされるまで呼び出すことができない。