DXVA 視訊處理會封裝用於處理未壓縮視訊影像的圖形硬體功能。 視訊處理服務包括去交錯和視訊混合。
本主題包含下列幾節:
概觀
圖形硬體可以使用圖形處理單元 (GPU) 來處理未壓縮的視訊影像。 視訊處理裝置是封裝這些功能的軟體元件。 應用程式可以使用視訊處理裝置來執行下列功能:
- 反轉電視轉播
- 將視訊子串流混合到主要影片影像
- 色彩調整 (ProcAmp) 和影像篩選
- 影像縮放比例
- 色彩空間轉換
- Alpha 混合
下圖顯示影片處理管線中的階段。 此圖表並非用來顯示實際實作。 例如,圖形驅動程式可能會將數個階段合併成單一作業。 所有這些作業都可以在對視訊處理裝置的單一呼叫中執行。 驅動程式可能不支援此處顯示的一些階段,例如雜訊和詳細數據篩選。
視訊處理管線的輸入一律包含 主要 視訊數據流,其中包含主要影像數據。 主要視訊串流會決定輸出視訊的幀速率。 輸出視訊的每個畫面都會根據主要視訊數據流的輸入數據來計算。 主要數據流中的圖元一律不透明,沒有個別圖元 Alpha 數據。 主要視訊串流可以是漸進式或交錯。
視訊處理管線可以選擇性地接收最多 15 個視訊子數據流。 子數據流包含輔助影像數據,例如隱藏式輔助字幕或 DVD 子圖片。 這些影像會透過主要視訊串流顯示,通常不會自行顯示。 子數據流圖片可以包含每圖元 Alpha 數據,而且一律為漸進式畫面。 影片處理裝置 Alpha 會將子串流影像與主要視訊串流的目前反交集畫面混合。
在本主題的其餘部分, 圖片 一詞會用於視訊處理裝置的輸入數據。 圖片可能包含漸進式框架、單一字段或兩個交錯欄位。 輸出一律為無交錯框架。
視訊驅動程式可以實作多個視訊處理裝置,以提供不同的視訊處理功能集。 裝置是由 GUID 所識別。 下列 GUID 已預先定義:
- DXVA2_VideoProcBobDevice。 此裝置會執行bob deinterlacing。
- DXVA2_VideoProcProgressiveDevice。 如果視訊只包含漸進式畫面,且沒有交錯畫面,則會使用此裝置。 (部分視頻內容包含漸進式和交錯式畫面的混合。漸進式裝置無法用於這種「混合」視訊內容,因為交錯畫面需要反交錯步驟。
支援 DXVA 視訊處理的每個圖形驅動程式都必須至少實作這兩個裝置。 圖形驅動程式也可以提供其他裝置,這些裝置是由驅動程式特定的 GUID 所識別。 例如,驅動程式可能會實作專屬的去交錯演算法,以產生比bob deinterlacing更好的質量輸出。 某些反交錯演算法可能需要主要數據流中的向前或向後參考圖片。 若是如此,呼叫端必須以正確的順序將這些圖片提供給驅動程式,如本節稍後所述。
也會提供參考軟體裝置。 軟體裝置已針對品質而非速度進行優化,可能不足以處理即時視訊。 參考軟體裝置會使用 GUID 值DXVA2_VideoProcSoftwareDevice。
建立視訊處理裝置
使用 DXVA 視訊處理之前,應用程式必須建立視訊處理裝置。 以下是步驟的簡短概述,本節其餘部分會更詳細地說明:
- 取得 IDirectXVideoProcessorService 介面的指標。
- 建立主要視訊數據流的視訊格式描述。 使用此描述來取得支援視訊格式的視訊處理裝置清單。 裝置是由 GUID 所識別。
- 針對特定裝置,取得裝置支援的轉譯目標格式清單。 格式會以 D3DFORMAT 值的清單傳回。 如果您打算混合子數據流,也取得支援的子數據流格式清單。
- 查詢每個裝置的功能。
- 建立影片處理裝置。
有時候您可以省略其中一些步驟。 例如,您可以嘗試使用慣用的格式建立視訊處理裝置,並查看其是否成功,而不是取得轉譯目標格式的清單。 常見的格式,例如D3DFMT_X8R8G8B8可能會成功。
本節的其餘部分會詳細說明這些步驟。
取得 IDirectXVideoProcessorService 指標
IDirectXVideoProcessorService 介面是從 Direct3D 裝置取得。 有兩種方式可取得此介面的指標:
- 從 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));
n 在某些情況下,一個物件會建立 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 方法。 方法會傳回 GUID 陣列,每個視訊處理裝置各一個可搭配此視訊格式使用。
請考慮使用 YUV 色彩的 BT.709 定義,以 YUY2 格式轉譯視訊數據流的應用程式,每秒的幀速率為 29.97 個畫面。 假設影片內容完全由漸進式畫面所組成。 下列代碼段示範如何填入格式描述並取得裝置 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
);
視訊處理Blit
主要視訊處理作業是 視訊處理blit。 ( blit 是將兩個或多個位圖合併成單一位圖的任何作業。視訊處理blit會結合輸入圖片來建立輸出畫面。若要執行視訊處理blit,請呼叫 IDirectXVideoProcessor::VideoProcessBlt。 這個方法會將一組影片範例傳遞至影片處理裝置。 回應中,視訊處理裝置會處理輸入圖片併產生一個輸出畫面。 處理可以包含反交錯、色彩空間轉換和子數據流混合。 輸出會寫入呼叫端所提供的目的地介面。
VideoProcessBlt 方法會採用下列參數:
- pRT 指向將接收已處理視訊畫面的 IDirect3DSurface9 轉譯目標表面。
- pBltParams 指向指定blit 參數 的 DXVA2_VideoProcessBltParams 結構。
- pSamples 是 DXVA2_VideoSample 結構數位的位址。 這些結構包含blit的輸入範例。
- NumSamples 會提供 pSamples 陣列的大小。
- 保留的參數是保留的,而且應該設定為 NULL。
在 pSamples 陣列中,呼叫端必須提供下列輸入範例:
- 主要視訊串流的目前圖片。
- 如果反交錯演算法需要,向前和向後參考圖片。
- 零個或多個子串流圖片,最多15個子數據流。
驅動程式預期此陣列會依特定順序排列,如 輸入範例順序中所述。
Blit 參數
DXVA2_VideoProcessBltParams 結構包含blit的一般參數。 最重要的參數會儲存在 結構的下列成員中:
TargetFrame 是輸出框架的呈現時間。 對於漸進式內容,這次必須等於主要視訊串流中目前畫面的開始時間。 這次是在該輸入範例DXVA2_VideoSample結構的 Start 成員中指定。
對於交錯內容,具有兩個交錯欄位的框架會產生兩個無交錯的輸出畫面。 在第一個輸出畫面格上,簡報時間必須等於主要視訊數據流中目前圖片的開始時間,就像漸進式內容一樣。 在第二個輸出畫面格上,開始時間必須等於主要視訊數據流中目前圖片的開始時間與數據流中下一張圖片的開始時間之間的中間點。 例如,如果輸入視訊是每秒 25 個畫面格(每秒 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 會提供背景的色彩,無論沒有顯示任何視訊影像。 例如,在 4 x 3 區域內顯示 16 x 9 視訊影像時,會以背景色彩顯示信箱區域。 背景色彩僅適用於目標矩形 (TargetRect)。 TargetRect 以外的任何圖元都不會修改。
DestFormat 描述輸出視訊的色彩空間,例如,ITU-R BT.709 或 BT.601 色彩。 這項資訊可能會影響影像的顯示方式。 如需詳細資訊,請參閱 擴充色彩資訊。
DXVA2_VideoProcessBltParams 結構的參考 頁面上會描述其他參數。
輸入範例
IDirectXVideoProcessor::VideoProcessBlt 的 pSamples 參數指向DXVA2_VideoSample結構的數位。 每個結構都包含一個輸入範例的相關信息,以及包含樣本之 Direct3D 介面的指標。 每個範例都是下列其中一個:
- 主要數據流中的目前圖片。
- 來自主要數據流的正向或向後參考圖片,用於反交錯。
- 子數據流圖片。
稍後會在 輸入範例順序一節中描述範例必須出現在陣列中的確切順序。
最多可以提供15個子串流圖片,雖然大部分的視訊應用程式最多只需要一個子數據流。 子數據流數目可以隨著對 VideoProcessBlt 的每個呼叫而變更。 子數據流圖片的指示方式是將DXVA2_VideoSample結構的 SampleFormat.SampleFormat 成員設定為等於 DXVA2_SampleSubStream。 針對主要視訊串流,此成員描述輸入視訊的交錯。 如需詳細資訊,請參閱 DXVA2_SampleFormat 列舉。
針對主要影片串流,DXVA2_VideoSample 結構的開始和結束成員會提供輸入範例的開始和結束時間。 針對子數據流圖片,請將這些值設定為零,因為簡報時間一律會從主要數據流計算。 應用程式負責追蹤何時應該呈現每個子數據流圖片,並在適當時間將其提交至 VideoProcessBlt 。
兩個矩形會定義來源視訊針對每個數據流的位置:
- DXVA2_VideoSample 結構的 SrcRect 成員會指定來源矩形、來源圖片的矩形區域,其會出現在複合輸出框架中。 若要裁剪圖片,請將此值設定為小於畫面大小的值。 否則,請將它設定為等於框架大小。
- 相同結構的 DstRect 成員會指定 目的矩形,這是目標介面的矩形區域,其中會顯示視訊畫面。
驅動程式會將來源矩形中的圖元點入目的矩形。 這兩個矩形可以有不同的大小或外觀比例;驅動程式會視需要調整映像。 此外,每個輸入數據流都可以使用不同的縮放比例。 事實上,調整可能需要在輸出框架中產生正確的外觀比例。 驅動程式不會將來源的像素外觀比例納入考慮,因此如果來源影像使用非平方圖元,則由應用程式計算正確的目的地矩形。
慣用的子數據流格式為 AYUV 和 AI44。 後者是具有 16 種色彩的托盤化格式。 調色盤專案是在 DXVA2_VideoSample 結構的 Pal 成員中指定。 (如果您的來源視訊格式最初以媒體基礎媒體類型表示,調色盤專案會儲存在 MF_MT_PALETTE 屬性中。針對非托盤化格式,請將此數位子組清除為零。
影像組合
每個 blit 作業都是由下列三個矩形所定義:
- 目標矩形 (TargetRect) 會定義輸出將出現在目的地介面內的區域。 輸出影像會裁剪到這個矩形。
- 每個數據流的 目的地 矩形 (DstRect) 會定義輸入數據流出現在複合影像中的位置。
- 每個數據流 的來源 矩形 (SrcRect) 都會定義來源影像的哪個部分出現。
目標矩形和目的矩形是相對於目的介面所指定。 來源矩形是指定相對於來源影像的。 所有矩形都會以像素指定。
視訊處理裝置 Alpha 會使用下列任何 Alpha 數據來源來混合輸入圖片:
- 子數據流中的每圖元 Alpha 數據。
- DXVA2_VideoSample 結構之PlanarAlpha 成員中指定的每個視訊數據流的平面 Alpha 值。
- 複合影像的平面 Alpha 值,指定於 DXVA2_VideoProcessBltParams 結構的 Alpha 成員中。 這個值可用來將整個複合影像與背景色彩混合。
本節提供一系列範例,示範影片處理裝置如何建立輸出影像。
範例 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,並將框架點入目的地矩形。 目標矩形大於目的矩形,因此驅動程式會使用背景色彩來填滿框架上方和下方的水準橫條。 背景色彩是在 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 }
這些值會保留影像高度,並水平調整這兩個影像。 在這兩個影像出現的區域中,它們都是Alpha混合。 子串流圖片延伸超過主要影片的位置,子串流會與背景色彩混合。 這個 Alpha 混合會說明圖表右側已改變的色彩。
範例 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 順序的子串流圖片。 範例必須依下列順序放入陣列中:
- 主要視訊數據流的範例會先以時態順序出現在陣列中。 視非交錯模式而定,驅動程式可能需要主要視訊串流中的一或多個參考範例。 DXVA2_VideoProcessorCaps 結構的 NumForwardRefSamples 和 NumBackwardRefSamples 成員會指定需要多少向前和回溯參考樣本。 呼叫端必須提供這些參考範例,即使視訊內容是漸進式的,而且不需要反交錯。 (當將漸進式畫面提供給無交錯裝置時,例如當來源包含交錯式和漸進式畫面的混合時,就會發生這種情況。
- 在主要視訊數據流的範例之後,陣列最多可以包含15個子數據流樣本,依 Z 順序排列,從下到上。 子數據流一律為漸進式,不需要參考圖片。
隨時,主要視訊串流可以在交錯和漸進式內容之間切換,而子數據流的數目可能會變更。
DXVA2_VideoSample 結構的 SampleFormat.SampleFormat 成員表示圖片的類型。 針對子數據流圖片,請將此值設定為 DXVA2_SampleSubStream。 對於漸進式圖片,此值會DXVA2_SampleProgressiveFrame。 對於交錯式圖片,值取決於欄位配置。
如果驅動程式需要向前和向後參考範例,則視訊序列開頭可能無法使用完整數目的樣本。 在此情況下,請在 pSamples 陣列中包含這些專案,但會將遺漏的範例標示為具有類型DXVA2_SampleUnknown。
DXVA2_VideoSample 結構的開始和結束成員會提供每個範例的時態位置。 這些值僅用於主要視訊數據流中的範例。 針對子數據流圖片,請將這兩個成員設定為零。
下列範例可能有助於釐清這些需求。
範例 1
當沒有子數據流,且反交錯演算法不需要參考樣本時,就會發生最簡單的情況(NumForwardRefSamples 和 NumBackwardRefSamples 都是零)。 Bob deinterlacing 是這類演算法的範例。 在此情況下, pSamples 陣列應該包含單一輸入介面,如下表所示。
| 索引 | Surface 類型 | 時態位置 |
|---|---|---|
| pSamples[0] | 交錯圖片。 | T |
時間值 T 假設為目前視訊畫面的開始時間。
範例 2
在此範例中,應用程式會混合兩個子數據流與主要數據流。 反交錯演算法不需要參考範例。 下表顯示這些範例如何排列在 pSamples 陣列中。
| 索引 | Surface 類型 | 時態位置 | Z 順序 |
|---|---|---|---|
| pSamples[0] | 交錯圖片 | T | 0 |
| pSamples[1] | 子數據流 | 0 | 1 |
| pSamples[2] | 子數據流 | 0 | 2 |
範例 3
現在假設反交錯演算法需要一個回溯參考範例和一個向前參考範例。 此外,提供兩張子串流圖片,總共有五個表面。 下表顯示正確的排序。
| 索引 | Surface 類型 | 時態位置 | 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 是下列畫面的開始時間。
如果視訊串流切換為漸進式內容,使用相同的解交模式,應用程式必須提供相同數目的範例,如下表所示。
| 索引 | Surface 類型 | 時態位置 | 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。
假設反交錯模式需要一個向前參考和一個回溯參考範例,則對 VideoProcessBlt 的前三個呼叫會有下列三個數據表中顯示的輸入序列。
| 索引 | Surface 類型 | 時態位置 |
|---|---|---|
| pSamples[0] | 未知 | 0 |
| pSamples[1] | 未知 | 0 |
| pSamples[2] | 交錯圖片(參考) | T +1 |
| 索引 | Surface 類型 | 時態位置 |
|---|---|---|
| pSamples[0] | 未知 | 0 |
| pSamples[1] | 交錯圖片 | T |
| pSamples[2] | 交錯圖片(參考) | T +1 |
| 索引 | Surface 類型 | 時態位置 |
|---|---|---|
| pSamples[0] | 交錯圖片 | T •1 |
| pSamples[1] | 交錯圖片 | T |
| pSamples[2] | 交錯圖片(參考) | T +1 |
相關主題