DXVA ビデオ処理は、圧縮されていないビデオ 画像の処理に専念するグラフィックス ハードウェアの機能をカプセル化します。 ビデオ処理サービスには、インターレース解除とビデオ ミキシングが含まれます。
このトピックには、次のセクションが含まれています。
概要
グラフィックス ハードウェアでは、グラフィックス処理装置 (GPU) を使用して、圧縮されていないビデオ イメージを処理できます。 ビデオ処理装置は、これらの機能をカプセル化するソフトウェア コンポーネントです。 アプリケーションでは、ビデオ処理装置を使用して、次のような機能を実行できます。
- デインターレースと逆テレシネ
- メインビデオ画像へのビデオサブストリームのミキシング
- 色調整 (ProcAmp) と画像フィルター処理
- イメージのスケーリング
- 色空間変換
- アルファ ブレンド
次の図は、ビデオ処理パイプラインのステージを示しています。 この図は、実際の実装を示すものではありません。 たとえば、グラフィックス ドライバーでは、複数のステージを 1 つの操作に組み合わせることができます。 これらの操作はすべて、ビデオ処理装置への 1 回の呼び出しで実行できます。 ノイズや詳細フィルター処理など、ここに示す一部のステージは、ドライバーでサポートされていない可能性があります。
ビデオ処理パイプラインへの入力には、常に プライマリ ビデオ ストリームが含まれ、メインの画像データが含まれます。 プライマリ ビデオ ストリームは、出力ビデオのフレーム レートを決定します。 出力ビデオの各フレームは、プライマリ ビデオ ストリームからの入力データを基準にして計算されます。 プライマリ ストリーム内のピクセルは常に不透明であり、ピクセル単位のアルファ データはありません。 プライマリ ビデオ ストリームは、プログレッシブまたはインターレースできます。
必要に応じて、ビデオ処理パイプラインは最大 15 個のビデオ サブストリームを受信できます。 サブストリームには、クローズド キャプションや DVD サブ画像などの補助イメージ データが含まれています。 これらの画像はプライマリ ビデオ ストリーム上に表示され、通常は単独で表示されるものではありません。 サブストリーム画像にはピクセル単位のアルファ データを含めることができます。これは常にプログレッシブ フレームです。 ビデオ処理装置は、プライマリ ビデオ ストリームからの現在のインターレース解除フレームとサブストリーム イメージをアルファブレンドします。
このトピックの残りの部分では、ビデオ処理装置への入力データに 画像 という用語が使用されます。 図は、プログレッシブ フレーム、1 つのフィールド、または 2 つのインターリーブフィールドで構成される場合があります。 出力は常にインターレース解除されたフレームです。
ビデオ ドライバーは、複数のビデオ処理デバイスを実装して、さまざまなビデオ処理機能のセットを提供できます。 デバイスは GUID で識別されます。 次の GUID が事前に定義されています。
- DXVA2_VideoProcBobDevice。 このデバイスは、bob deinterlacing を実行します。
- DXVA2_VideoProcProgressiveDevice。 このデバイスは、ビデオにプログレッシブ フレームのみが含まれている場合に使用され、インターレース フレームはありません。 (一部のビデオ コンテンツには、プログレッシブ フレームとインターレース フレームが混在しています。この種の "混合" ビデオ コンテンツにはプログレッシブ デバイスを使用できません。インターレース解除手順はインターレースフレームに必要であるためです)。
DXVA ビデオ処理をサポートするすべてのグラフィックス ドライバーは、少なくともこれら 2 つのデバイスを実装する必要があります。 グラフィックス ドライバーは、ドライバー固有の GUID によって識別される他のデバイスを提供することもできます。 たとえば、ドライバーは、bob deinterlacing よりも品質の高い出力を生成する独自のインターレース解除アルゴリズムを実装する場合があります。 一部のインターレース解除アルゴリズムでは、プライマリ ストリームからの前方または後方参照画像が必要になる場合があります。 その場合、呼び出し元は、このセクションの後半で説明するように、正しい順序でドライバーにこれらの画像を提供する必要があります。
参照ソフトウェア デバイスも提供されます。 ソフトウェア デバイスは速度ではなく品質に最適化されており、リアルタイムのビデオ処理には適していない可能性があります。 参照ソフトウェア デバイスは、DXVA2_VIDEOPROCSOFTWAREDEVICE GUID 値を使用します。
ビデオ処理デバイスの作成
DXVA ビデオ処理を使用する前に、アプリケーションでビデオ処理装置を作成する必要があります。 このセクションの残りの部分で詳しく説明する手順の簡単な概要を次に示します。
- IDirectXVideoProcessorService インターフェイスへのポインターを取得します。
- プライマリ ビデオ ストリームのビデオ形式の説明を作成します。 この説明を使用して、ビデオ形式をサポートするビデオ処理デバイスの一覧を取得します。 デバイスは GUID で識別されます。
- 特定のデバイスの場合は、デバイスでサポートされているレンダー ターゲット形式の一覧を取得します。 形式は、 D3DFORMAT 値の一覧として返されます。 サブストリームを混在させる場合は、サポートされているサブストリーム形式の一覧も取得します。
- 各デバイスの機能を照会します。
- ビデオ処理デバイスを作成します。
これらの手順の一部を省略できる場合があります。 たとえば、レンダー ターゲット形式の一覧を取得する代わりに、好みの形式でビデオ処理デバイスを作成して、成功したかどうかを確認するだけです。 D3DFMT_X8R8G8B8などの一般的な形式が成功する可能性があります。
このセクションの残りの部分では、これらの手順について詳しく説明します。
IDirectXVideoProcessorService ポインターを取得する
IDirectXVideoProcessorService インターフェイスは、Direct3D デバイスから取得されます。 このインターフェイスへのポインターを取得するには、次の 2 つの方法があります。
- Direct3D デバイスから。
- Direct3D デバイス マネージャーから。
Direct3D デバイスへのポインターがある場合は、DXVA2CreateVideoService 関数を呼び出すことによって、IDirectXVideoProcessorService ポインターを取得できます。 次のコードに示すように、デバイスの IDirect3DDevice9 インターフェイスへのポインターを渡し、riid パラメーターのIID_IDirectXVideoProcessorServiceを指定します。
// Create the DXVA-2 Video Processor service.
hr = DXVA2CreateVideoService(g_pD3DD9, IID_PPV_ARGS(&g_pDXVAVPS));
場合によっては、1 つのオブジェクトが Direct3D デバイスを作成し、 Direct3D デバイス マネージャーを使用して他のオブジェクトと共有します。 このような場合は、次のコードに示すように、デバイス マネージャーで IDirect3DDeviceManager9::GetVideoService を呼び出して IDirectXVideoProcessorService ポインターを取得できます。
HRESULT GetVideoProcessorService(
IDirect3DDeviceManager9 *pDeviceManager,
IDirectXVideoProcessorService **ppVPService
)
{
*ppVPService = NULL;
HANDLE hDevice;
HRESULT hr = pDeviceManager->OpenDeviceHandle(&hDevice);
if (SUCCEEDED(hr))
{
// Get the video processor service
HRESULT hr2 = pDeviceManager->GetVideoService(
hDevice,
IID_PPV_ARGS(ppVPService)
);
// Close the device handle.
hr = pDeviceManager->CloseDeviceHandle(hDevice);
if (FAILED(hr2))
{
hr = hr2;
}
}
if (FAILED(hr))
{
SafeRelease(ppVPService);
}
return hr;
}
ビデオ処理デバイスを列挙する
ビデオ処理デバイスの一覧を取得するには、プライマリ ビデオ ストリームの形式で DXVA2_VideoDesc 構造体を入力し、この構造体を IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids メソッドに 渡します。 このメソッドは、このビデオ形式で使用できるビデオ処理装置ごとに 1 つずつ、GUID の配列を返します。
YUV カラーの BT.709 定義を使用して、1 秒あたり 29.97 フレームのフレーム レートで、YUY2 形式でビデオ ストリームをレンダリングするアプリケーションを考えてみましょう。 ビデオ コンテンツが完全にプログレッシブ フレームで構成されているとします。 次のコード フラグメントは、書式の説明を入力し、デバイス GUID を取得する方法を示しています。
// Initialize the video descriptor.
g_VideoDesc.SampleWidth = VIDEO_MAIN_WIDTH;
g_VideoDesc.SampleHeight = VIDEO_MAIN_HEIGHT;
g_VideoDesc.SampleFormat.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_MPEG2;
g_VideoDesc.SampleFormat.NominalRange = DXVA2_NominalRange_16_235;
g_VideoDesc.SampleFormat.VideoTransferMatrix = EX_COLOR_INFO[g_ExColorInfo][0];
g_VideoDesc.SampleFormat.VideoLighting = DXVA2_VideoLighting_dim;
g_VideoDesc.SampleFormat.VideoPrimaries = DXVA2_VideoPrimaries_BT709;
g_VideoDesc.SampleFormat.VideoTransferFunction = DXVA2_VideoTransFunc_709;
g_VideoDesc.SampleFormat.SampleFormat = DXVA2_SampleProgressiveFrame;
g_VideoDesc.Format = VIDEO_MAIN_FORMAT;
g_VideoDesc.InputSampleFreq.Numerator = VIDEO_FPS;
g_VideoDesc.InputSampleFreq.Denominator = 1;
g_VideoDesc.OutputFrameFreq.Numerator = VIDEO_FPS;
g_VideoDesc.OutputFrameFreq.Denominator = 1;
// Query the video processor GUID.
UINT count;
GUID* guids = NULL;
hr = g_pDXVAVPS->GetVideoProcessorDeviceGuids(&g_VideoDesc, &count, &guids);
この例のコードは、 DXVA2_VideoProc SDK サンプルから取得します。
この例の pGuids 配列は GetVideoProcessorDeviceGuids メソッドによって割り当てられるため、アプリケーションは CoTaskMemFree を呼び出して配列を解放する必要があります。 残りの手順は、このメソッドによって返されるデバイス GUID のいずれかを使用して実行できます。
Render-Target 形式を列挙する
デバイスでサポートされているレンダー ターゲット形式の一覧を取得するには、次のコードに示すように、デバイス GUID と DXVA2_VideoDesc 構造体を IDirectXVideoProcessorService::GetVideoProcessorRenderTargets メソッドに渡します。
// Query the supported render-target formats.
UINT i, count;
D3DFORMAT* formats = NULL;
HRESULT hr = g_pDXVAVPS->GetVideoProcessorRenderTargets(
guid, &g_VideoDesc, &count, &formats);
if (FAILED(hr))
{
DBGMSG((L"GetVideoProcessorRenderTargets failed: 0x%x.\n", hr));
return FALSE;
}
for (i = 0; i < count; i++)
{
if (formats[i] == VIDEO_RENDER_TARGET_FORMAT)
{
break;
}
}
CoTaskMemFree(formats);
if (i >= count)
{
DBGMSG((L"The device does not support the render-target format.\n"));
return FALSE;
}
このメソッドは、D3DFORMAT値の配列 を 返します。 この例では、入力の種類が YUY2 の場合、一般的な形式の一覧は D3DFMT_X8R8G8B8 (32 ビット RGB) とD3DMFT_YUY2 (入力形式) です。 ただし、正確な一覧はドライバーによって異なります。
サブストリームで使用できる形式の一覧は、レンダー ターゲットの形式と入力形式によって異なる場合があります。 サブストリーム形式の一覧を取得するには、次のコードに示すように、デバイス GUID、形式構造、およびレンダー ターゲット形式を IDirectXVideoProcessorService::GetVideoProcessorSubStreamFormats メソッドに渡します。
// Query the supported substream formats.
formats = NULL;
hr = g_pDXVAVPS->GetVideoProcessorSubStreamFormats(
guid, &g_VideoDesc, VIDEO_RENDER_TARGET_FORMAT, &count, &formats);
if (FAILED(hr))
{
DBGMSG((L"GetVideoProcessorSubStreamFormats failed: 0x%x.\n", hr));
return FALSE;
}
for (i = 0; i < count; i++)
{
if (formats[i] == VIDEO_SUB_FORMAT)
{
break;
}
}
CoTaskMemFree(formats);
if (i >= count)
{
DBGMSG((L"The device does not support the substream format.\n"));
return FALSE;
}
このメソッドは、D3DFORMAT値の別の配列 を 返します。 一般的なサブストリーム形式は AYUV と AI44 です。
デバイス機能のクエリを実行する
特定のデバイスの機能を取得するには、デバイス GUID、形式構造、およびレンダー ターゲット形式を IDirectXVideoProcessorService::GetVideoProcessorCaps メソッドに渡します。 このメソッドは、 DXVA2_VideoProcessorCaps 構造体にデバイス機能を入力します。
// Query video processor capabilities.
hr = g_pDXVAVPS->GetVideoProcessorCaps(
guid, &g_VideoDesc, VIDEO_RENDER_TARGET_FORMAT, &g_VPCaps);
if (FAILED(hr))
{
DBGMSG((L"GetVideoProcessorCaps failed: 0x%x.\n", hr));
return FALSE;
}
デバイスを作成する
ビデオ処理デバイスを作成するには、 IDirectXVideoProcessorService::CreateVideoProcessor を呼び出します。 このメソッドへの入力は、デバイス GUID、形式の説明、レンダー ターゲットの形式、およびミックスする予定のサブストリームの最大数です。 このメソッドは、ビデオ処理デバイスを表す IDirectXVideoProcessor インターフェイスへのポインターを返します。
// Finally create a video processor device.
hr = g_pDXVAVPS->CreateVideoProcessor(
guid,
&g_VideoDesc,
VIDEO_RENDER_TARGET_FORMAT,
SUB_STREAM_COUNT,
&g_pDXVAVPD
);
Video Process Blit
メインのビデオ処理操作は、 ビデオ処理 blit です。 ( blit は、2 つ以上のビットマップを 1 つのビットマップに結合する任意の操作です。ビデオ処理 blit では、入力画像を組み合わせて出力フレームを作成します)。ビデオ処理 blit を実行するには、 IDirectXVideoProcessor::VideoProcessBlt を呼び出します。 このメソッドは、一連のビデオ サンプルをビデオ処理装置に渡します。 これに対して、ビデオ処理装置は入力画像を処理し、1 つの出力フレームを生成します。 処理には、インターレース解除、色空間変換、サブストリームの混合を含めることができます。 出力は、呼び出し元によって提供される宛先サーフェスに書き込まれます。
VideoProcessBlt メソッドは、次のパラメーターを受け取ります。
- pRT は、処理されたビデオ フレームを受け取る IDirect3DSurface9 レンダー ターゲット サーフェスを指します。
- pBltParams は、blit のパラメーターを指定する DXVA2_VideoProcessBltParams 構造体を指します。
- pSamples は、 DXVA2_VideoSample 構造体の配列のアドレスです。 これらの構造体には、blit の入力サンプルが含まれています。
- NumSamples は pSamples 配列のサイズを示します。
- Reserved パラメーターは予約済みであり、NULL に設定する必要があります。
pSamples 配列では、呼び出し元は次の入力サンプルを提供する必要があります。
- プライマリ ビデオ ストリームの現在の画像。
- インターレース解除アルゴリズムで必要な場合は、前方と後方の参照図。
- 0 個以上のサブストリーム画像(最大 15 サブストリーム)。
ドライバーは、「 入力サンプルの順序」で説明されているように、この配列が特定の順序であると想定しています。
Blit パラメーター
DXVA2_VideoProcessBltParams構造体には、blit の一般的なパラメーターが含まれています。 最も重要なパラメーターは、構造体の次のメンバーに格納されます。
TargetFrame は、出力フレームの表示時間です。 プログレッシブ コンテンツの場合、この時間はプライマリ ビデオ ストリームからの現在のフレームの開始時刻と等しい必要があります。 今回は、その入力サンプルのDXVA2_VideoSample構造体の Start メンバーで指定されます。
インターレースされたコンテンツの場合、2 つのインターリーブ フィールドを持つフレームは、2 つのインターレース解除された出力フレームを生成します。 最初の出力フレームでは、プレゼンテーション時間は、プログレッシブ コンテンツと同様に、プライマリ ビデオ ストリーム内の現在の画像の開始時刻と等しい必要があります。 2 番目の出力フレームでは、開始時刻は、プライマリ ビデオ ストリーム内の現在の画像の開始時刻とストリーム内の次の画像の開始時刻の中間点と等しい必要があります。 たとえば、入力ビデオが 25 フレーム/秒 (1 秒あたり 50 フィールド) の場合、出力フレームには次の表に示すタイムスタンプが表示されます。 タイムスタンプは 100 ナノ秒単位で表示されます。
入力画像 TargetFrame (1) TargetFrame (2) 0 0 200000 400000 0 600000 800000 800000 1000000 1200000 1200000 1400000 インターレースコンテンツがインターリーブされたフィールドではなく単一のフィールドで構成されている場合、出力時間は常にプログレッシブコンテンツと同様に入力時間と一致します。
TargetRect は、ターゲット サーフェス内の四角形領域を定義します。 blit はこのリージョンに出力を書き込みます。 具体的には、 TargetRect 内のすべてのピクセルが変更され、 TargetRect の外部のピクセルは変更されません。 ターゲット四角形は、すべての入力ビデオ ストリームの外接する四角形を定義します。 その四角形内での個々のストリームの配置は、IDirectXVideoProcessor::VideoProcessBlt の pSamples パラメーターを使用して制御されます。
BackgroundColor は、ビデオ 画像が表示されない場所の背景の色を示します。 たとえば、16 x 9 のビデオ 画像が 4 x 3 領域内 (レターボックス化) 内に表示される場合、レターボックス化された領域は背景色で表示されます。 背景色は、ターゲットの四角形 (TargetRect) 内でのみ適用されます。 TargetRect 以外のピクセルは変更されません。
DestFormat は、出力ビデオの色空間 (BT.709 または BT.601 の色 ITU-R 使用するかどうかなど) を記述します。 この情報は、イメージの表示方法に影響を与える可能性があります。 詳細については、「拡張カラー情報 を参照してください。
その他のパラメーターについては、 DXVA2_VideoProcessBltParams 構造体のリファレンス ページで説明します。
入力サンプル
IDirectXVideoProcessor::VideoProcessBlt の pSamples パラメーターは、DXVA2_VideoSample構造体の配列を指します。 これらの各構造体には、1 つの入力サンプルに関する情報と、サンプルを含む Direct3D サーフェスへのポインターが含まれています。 各サンプルは、次のいずれかです。
- プライマリ ストリームの現在の画像。
- インターレース解除に使用される、プライマリ ストリームからの前方参照図または後方参照図。
- サブストリーム画像。
サンプルが配列に出現する必要がある正確な順序については、後の「 入力サンプル順序」セクションで説明します。
最大 15 個のサブストリーム画像を提供できますが、ほとんどのビデオ アプリケーションで必要なサブストリームは最大で 1 つだけです。 VideoProcessBlt の呼び出しごとに、サブストリームの数を変更できます。 サブストリーム図は、DXVA2_VideoSample構造体の SampleFormat.SampleFormat メンバーを DXVA2_SampleSubStream と等しく設定することによって示されます。 プライマリ ビデオ ストリームの場合、このメンバーは入力ビデオのインターレースについて説明します。 詳細については、「DXVA2_SampleFormat列挙型」 を 参照してください。
プライマリ ビデオ ストリームの場合、DXVA2_VideoSample構造体の Start メンバーと End メンバーは、入力サンプルの開始時刻と終了時刻を示します。 サブストリーム画像の場合、プレゼンテーション時間は常にプライマリ ストリームから計算されるため、これらの値を 0 に設定します。 アプリケーションは、各サブストリーム画像を提示する必要があるタイミングを追跡し、適切なタイミングで VideoProcessBlt に送信する必要があります。
2 つの四角形は、ストリームごとにソース ビデオを配置する方法を定義します。
- DXVA2_VideoSample構造体の SrcRect メンバーは、合成出力フレームに表示されるソース図の四角形領域であるソース四角形を指定します。 図をトリミングするには、フレーム サイズより小さい値に設定します。 それ以外の場合は、フレーム サイズと同じ値に設定します。
- 同じ構造の DstRect メンバーは、ビデオ フレームが表示される宛先サーフェスの四角形領域である ターゲット四角形を指定します。
ドライバーは、ソース四角形からコピー先の四角形にピクセルを blits します。 2 つの四角形は、異なるサイズまたは縦横比を持つことができます。ドライバーは、必要に応じてイメージをスケーリングします。 さらに、各入力ストリームで異なるスケール ファクターを使用できます。 実際、出力フレームで正しい縦横比を生成するには、スケーリングが必要になる場合があります。 ドライバーはソースのピクセル縦横比を考慮に入れないので、ソースイメージが非正方形ピクセルを使用する場合は、正しいターゲットの四角形を計算するのはアプリケーションにかかっています。
推奨されるサブストリーム形式は、AYUV と AI44 です。 後者は、16色のパレット化されたフォーマットです。 パレット エントリは、DXVA2_VideoSample構造の Pal メンバーで指定されます。 (ソース ビデオ形式が最初に Media Foundation メディア タイプとして表現されている場合、パレット エントリは MF_MT_PALETTE 属性に格納されます)。パレット化されていない形式の場合は、この配列を 0 にクリアします。
イメージコンポジション
すべての blit 操作は、次の 3 つの四角形によって定義されます。
- ターゲット四角形 (TargetRect) は、出力が表示されるターゲット サーフェス内の領域を定義します。 出力イメージは、この四角形にクリップされます。
- 各ストリームの 変換先 の四角形 (DstRect) は、入力ストリームが複合イメージ内で表示される場所を定義します。
- 各ストリームの ソース 四角形 (SrcRect) は、ソース イメージのどの部分を表示するかを定義します。
ターゲットとターゲットの四角形は、ターゲット サーフェスを基準にして指定されます。 ソースの四角形は、ソース イメージに対して相対的に指定されます。 すべての四角形はピクセル単位で指定されます。
ビデオ処理装置のアルファは、次のいずれかのアルファ データ ソースを使用して、入力画像をブレンドします。
- サブストリームからのピクセル単位のアルファ データ。
- DXVA2_VideoSample構造体の PlanarAlpha メンバーで指定された、各ビデオ ストリームの平面アルファ値。
- DXVA2_VideoProcessBltParams構造体のアルファ メンバーで指定された複合画像の平面アルファ値。 この値は、合成イメージ全体を背景色とブレンドするために使用されます。
このセクションでは、ビデオ処理装置が出力イメージを作成する方法を示す一連の例を示します。
例 1: レターボックス化
次の使用例は、コピー先の四角形をターゲットの四角形よりも小さく設定して、ソース イメージをレターボックス化する方法を示しています。 この例のプライマリ ビデオ ストリームは 720 × 480 の画像であり、16:9 の縦横比で表示されます。 宛先サーフェスは 640 × 480 ピクセル (4:3 縦横比) です。 正しい縦横比を実現するには、ターゲットの四角形を 640 × 360 にする必要があります。 わかりやすくするために、この例にはサブストリームは含まれません。 次の図は、ソースとターゲットの四角形を示しています。
上の図は、次の四角形を示しています。
ターゲット四角形: { 0, 0, 640, 480 }
プライマリ ビデオ:
- ソース四角形: { 0, 0, 720, 480 }
- 変換先の四角形: { 0,60, 640, 420 }
ドライバーはビデオのインターレースを解除し、インターレース解除されたフレームを 640 × 360 に縮小し、フレームを宛先の四角形に Blit します。 ターゲットの四角形は移動先の四角形よりも大きいので、ドライバーは背景色を使用して、フレームの上下の水平バーを塗りつぶします。 背景色は 、DXVA2_VideoProcessBltParams 構造体で指定します。
例 2: サブストリーム イメージのストレッチ
サブストリーム画像は、プライマリ ビデオ画像を超えて拡張できます。 たとえば、DVD ビデオでは、プライマリ ビデオ ストリームの縦横比は 4:3 ですが、サブストリームは 16:9 です。 この例では、両方のビデオ ストリームに同じソース ディメンション (720 × 480) がありますが、サブストリームは 16:9 の縦横比で表示することを意図しています。 この縦横比を実現するために、サブストリームイメージは水平方向に引き伸ばされます。 次の図に、ソースとターゲットの四角形を示します。
上の図は、次の四角形を示しています。
ターゲット四角形: { 0, 0, 854, 480 }
プライマリ ビデオ:
- ソース四角形: { 0, 0, 720, 480 }
- 変換先の四角形: { 0, 107, 474, 480 }
サブストリーム:
- ソース四角形: { 0, 0, 720, 480 }
- 変換先の四角形: { 0, 0, 854, 480 }
これらの値は、イメージの高さを維持し、両方のイメージを水平方向にスケーリングします。 両方のイメージが表示される領域では、アルファ ブレンドされます。 サブストリーム画像がプライマリ ビデオを超えて拡張される場合、サブストリームはアルファと背景色がブレンドされます。 このアルファ ブレンドでは、図の右側にある変更された色が考慮されます。
例 3: 不一致のストリームの高さ
前の例では、サブストリームとプライマリ ストリームの高さは同じです。 この例に示すように、ストリームの高さが一致しない場合もあります。 ビデオが表示されないターゲット四角形内の領域は、背景色 (この例では黒) を使用して描画されます。 次の図に、ソースとターゲットの四角形を示します。
上の図は、次の四角形を示しています。
- ターゲット四角形: { 0, 0, 150, 85 }
- プライマリ ビデオ:
- ソース四角形: { 0, 0, 150, 50 }
- 変換先の四角形: { 0, 17, 150, 67 }
- サブストリーム:
- ソース四角形: { 0, 0, 100, 85 }
- 変換先の四角形: { 25, 0, 125, 85 }
例 4: ターゲットの四角形がターゲットサーフェスより小さい
次の使用例は、ターゲットの四角形がターゲット サーフェスよりも小さい場合を示しています。
上の図は、次の四角形を示しています。
- 宛先サーフェス: { 0, 0, 300, 200 }
- ターゲット四角形: { 0, 0, 150, 85 }
- プライマリ ビデオ:
- ソース四角形: { 0, 0, 150, 50 }
- 変換先の四角形: { 0, 17, 150, 67 }
- サブストリーム:
- ソース四角形: { 0, 0, 100, 85 }
- 変換先の四角形: { 25, 0, 125, 85 }
ターゲットの四角形の外側のピクセルは変更されないため、背景色はターゲットの四角形内にのみ表示されます。 点線の領域は、blit の影響を受けなかった目的地サーフェスの部分を示します。
例 5: ソース四角形
ソース図よりも小さいソース四角形を指定すると、ドライバーは図のその部分だけを照らします。 この例では、ソースの四角形は、プライマリ ビデオ ストリームの右下のクアドラントとサブストリームの左下のクアドラント (図のハッシュ マークで示されます) を指定します。 変換先の四角形はソース四角形と同じサイズであるため、ビデオは拡大されません。 次の図に、ソースとターゲットの四角形を示します。
上の図は、次の四角形を示しています。
- ターゲット四角形: { 0, 0, 720, 576 }
- プライマリ ビデオ:
- ソースサーフェスサイズ: { 0, 0, 720, 480 }
- ソース四角形: { 360、240、720、480 }
- 変換先の四角形: { 0, 0, 360, 240 }
- サブストリーム:
- ソースサーフェスサイズ: { 0, 0, 640, 576 }
- ソース四角形: { 0, 288, 320, 576 }
- 変換先の四角形: { 400, 0, 720, 288 }
例 6: 交差する宛先の四角形
この例は前の四角形に似ていますが、コピー先の四角形は交差します。 サーフェスの寸法は前の例と同じですが、ソース四角形とコピー先の四角形は同じではありません。 ここでも、ビデオはトリミングされますが、拡大されません。 次の図に、ソースとターゲットの四角形を示します。
上の図は、次の四角形を示しています。
- ターゲット四角形: { 0, 0, 720, 576 }
- プライマリ ビデオ:
- ソースサーフェスサイズ: { 0, 0, 720, 480 }
- ソース四角形: { 260、92、720、480 }
- 変換先の四角形: { 0, 0, 460, 388 }
- サブストリーム:
- ソースサーフェスサイズ: { 0, 0, 640, 576 }
- ソース四角形: { 0, 0, 460, 388 }
- 変換先の四角形: { 260、188、720、576 }
例 7: ビデオのストレッチとトリミング
この例では、ビデオはトリミングと同様に拡大されます。 各ストリームからの 180 × 120 領域は、宛先の四角形内の 360 × 240 領域をカバーするように引き伸ばされます。
上の図は、次の四角形を示しています。
- ターゲット四角形: { 0, 0, 720, 480 }
- プライマリ ビデオ:
- ソースサーフェスサイズ: { 0, 0, 360, 240 }
- ソース四角形: { 180、120、360、240 }
- 変換先の四角形: { 0, 0, 360, 240 }
- サブストリーム:
- ソースサーフェスサイズ: { 0, 0, 360, 240 }
- ソース四角形: { 0, 0, 180, 120 }
- 変換先の四角形: { 360、240、720、480 }
入力サンプルの順序
VideoProcessBlt メソッドの pSamples パラメーターは、入力サンプルの配列へのポインターです。 プライマリ ビデオ ストリームのサンプルが最初に表示され、次にサブストリーム画像が Z オーダーで表示されます。 サンプルは、次の順序で配列に配置する必要があります。
- プライマリ ビデオ ストリームのサンプルは、一時的な順序で配列の最初に表示されます。 デインターレース モードによっては、ドライバーがプライマリ ビデオ ストリームからの 1 つ以上の参照サンプルを必要とする場合があります。 DXVA2_VideoProcessorCaps構造体の NumForwardRefSamples および NumBackwardRefSamples メンバーは、必要な前方参照サンプルと下位参照サンプルの数を指定します。 ビデオ コンテンツがプログレッシブであり、インターレース解除を必要としない場合でも、呼び出し元はこれらの参照サンプルを提供する必要があります。 (これは、たとえば、ソースにインターレースフレームとプログレッシブ フレームの両方が混在している場合など、デインターレース デバイスにプログレッシブ フレームが与えられる場合に発生する可能性があります)。
- プライマリ ビデオ ストリームのサンプルの後に、配列には、Z オーダーで下から上に配置された最大 15 個のサブストリーム サンプルを含めることができます。 サブストリームは常にプログレッシブであり、参照画像は必要ありません。
プライマリ ビデオ ストリームは、いつでもインターレースコンテンツとプログレッシブコンテンツを切り替え、サブストリームの数を変更できます。
DXVA2_VideoSample構造体の SampleFormat.SampleFormat メンバーは、図の種類を示します。 サブストリーム画像の場合は、この値を DXVA2_SampleSubStream に設定します。 プログレッシブピクチャの場合、値はDXVA2_SampleProgressiveFrame。 インターレースされた図の場合、値はフィールドレイアウトによって異なります。
ドライバーで前方参照サンプルと後方参照サンプルが必要な場合は、ビデオ シーケンスの開始時に完全な数のサンプルを使用できない可能性があります。 その場合は、 pSamples 配列にエントリを含めますが、不足しているサンプルは型DXVA2_SampleUnknownを持つものとしてマークします。
DXVA2_VideoSample構造体の Start メンバーと End メンバーは、各サンプルの一時的な位置を示します。 これらの値は、プライマリ ビデオ ストリームのサンプルにのみ使用されます。 サブストリーム画像の場合は、両方のメンバーを 0 に設定します。
次の例は、これらの要件を明確にするのに役立ちます。
例 1
最も簡単なケースは、サブストリームがなく、インターレース解除アルゴリズムに参照サンプルが必要ない場合に発生します (NumForwardRefSamples と NumBackwardRefSamples は両方とも 0 です)。 Bob のインターレース解除は、このようなアルゴリズムの一例です。 この場合、次の表に示すように、 pSamples 配列には 1 つの入力サーフェスが含まれている必要があります。
| インデックス | サーフェスの種類 | 一時的な場所 |
|---|---|---|
| pSamples[0] | インターレースされた画像。 | T |
時間値 T は、現在のビデオ フレームの開始時刻と見なされます。
例 2
この例では、アプリケーションは 2 つのサブストリームとプライマリ ストリームを混在しています。 インターレース解除アルゴリズムでは、参照サンプルは必要ありません。 次の表に、これらのサンプルを pSamples 配列に配置する方法を示します。
| インデックス | サーフェスの種類 | 一時的な場所 | Z順序 |
|---|---|---|---|
| pSamples[0] | インターレース画像 | T | 0 |
| pSamples[1] | サブストリーム | 0 | 1 |
| pSamples[2] | サブストリーム | 0 | 2 |
例 3
ここで、インターレース解除アルゴリズムには、1 つの後方参照サンプルと 1 つの前方参照サンプルが必要であるとします。 さらに、合計 5 つのサーフェスに対して 2 つのサブストリーム画像が提供されます。 正しい順序を次の表に示します。
| インデックス | サーフェスの種類 | 一時的な場所 | Z順序 |
|---|---|---|---|
| pSamples[0] | インターレース画像 (リファレンス) | T -1 | 適用なし |
| pSamples[1] | インターレース画像 | T | 0 |
| pSamples[2] | インターレース画像 (リファレンス) | T +1 | 適用なし |
| pSamples[3] | サブストリーム | 0 | 1 |
| pSamples[4] | サブストリーム | 0 | 2 |
時刻 T -1 は現在のフレームより前のフレームの開始時刻、 T +1 は次のフレームの開始時刻です。
同じデインターレース モードを使用してビデオ ストリームがプログレッシブ コンテンツに切り替わる場合、アプリケーションは次の表に示すように同じ数のサンプルを提供する必要があります。
| インデックス | サーフェスの種類 | 一時的な場所 | Z順序 |
|---|---|---|---|
| pSamples[0] | プログレッシブ画像 (リファレンス) | T -1 | 適用なし |
| pSamples[1] | プログレッシブ画像 | T | 0 |
| pSamples[2] | プログレッシブ画像 (リファレンス) | T +1 | 適用なし |
| pSamples[3] | サブストリーム | 0 | 1 |
| pSamples[4] | サブストリーム | 0 | 2 |
例 4
ビデオ シーケンスの開始時に、前方参照と後方参照のサンプルが使用できない場合があります。 この場合、不足しているサンプルのエントリは pSamples 配列に含まれており、サンプル型はDXVA2_SampleUnknown。
デインターレース モードに前方参照サンプルと下位参照サンプルが 1 つ必要であると仮定すると、 VideoProcessBlt への最初の 3 回の呼び出しでは、次の 3 つの表に示す入力シーケンスが含まれます。
| インデックス | サーフェスの種類 | 一時的な場所 |
|---|---|---|
| pSamples[0] | 未知 | 0 |
| pSamples[1] | 未知 | 0 |
| pSamples[2] | インターレース画像 (リファレンス) | T +1 |
| インデックス | サーフェスの種類 | 一時的な場所 |
|---|---|---|
| pSamples[0] | 未知 | 0 |
| pSamples[1] | インターレース画像 | T |
| pSamples[2] | インターレース画像 (リファレンス) | T +1 |
| インデックス | サーフェスの種類 | 一時的な場所 |
|---|---|---|
| pSamples[0] | インターレース画像 | T -1 |
| pSamples[1] | インターレース画像 | T |
| pSamples[2] | インターレース画像 (リファレンス) | T +1 |
関連トピック