Elaborazione video DXVA

L'elaborazione video DXVA incapsula le funzioni dell'hardware grafico dedicato all'elaborazione di immagini video non compresse. I servizi di elaborazione video includono la disincantazione e la combinazione di video.

Questo argomento include le sezioni seguenti:

Panoramica

L'hardware grafico può usare l'unità di elaborazione grafica (GPU) per elaborare immagini video non compresse. Un dispositivo di elaborazione video è un componente software che incapsula queste funzioni. Le applicazioni possono usare un dispositivo di elaborazione video per eseguire funzioni come:

  • Dinterlacing e telecine inversa
  • Combinazione di sottostream video nell'immagine video principale
  • Regolazione del colore (ProcAmp) e filtro delle immagini
  • Ridimensionamento delle immagini
  • Conversione dello spazio dei colori
  • Fusione alfa

Il diagramma seguente illustra le fasi della pipeline di elaborazione video. Il diagramma non è progettato per mostrare un'implementazione effettiva. Ad esempio, il driver grafico può combinare diverse fasi in una singola operazione. Tutte queste operazioni possono essere eseguite in una singola chiamata al dispositivo di elaborazione video. Alcune fasi illustrate di seguito, ad esempio il filtro del rumore e dei dettagli, potrebbero non essere supportate dal driver.

diagram showing the stages of dxva video processing.

L'input per la pipeline di elaborazione video include sempre un flusso video primario , che contiene i dati principali dell'immagine. Il flusso video primario determina la frequenza dei fotogrammi per il video di output. Ogni fotogramma del video di output viene calcolata in relazione ai dati di input del flusso video primario. I pixel nel flusso primario sono sempre opachi, senza dati alfa per pixel. Il flusso video principale può essere progressivo o interlacciato.

Facoltativamente, la pipeline di elaborazione video può ricevere fino a 15 sottostream video. Un sottostream contiene dati di immagine ausiliari, ad esempio didascalia chiuse o sottopicture DVD. Queste immagini vengono visualizzate sul flusso video principale e in genere non sono progettate per essere visualizzate da soli. Le immagini substream possono contenere dati alfa per pixel e sono sempre fotogrammi progressivi. Il dispositivo di elaborazione video combina le immagini del sottostream con il frame denterlaced corrente dal flusso video primario.

Nella parte restante di questo argomento, il termine immagine viene usata per i dati di input in un dispositivo di elaborazione video. Un'immagine può essere costituita da una cornice progressiva, da un singolo campo o da due campi interleavati. L'output è sempre un frame delimitato.

Un driver video può implementare più di un dispositivo di elaborazione video, per fornire diversi set di funzionalità di elaborazione video. I dispositivi vengono identificati dal GUID. I GUID seguenti sono predefiniti:

  • DXVA2_VideoProcBobDevice. Questo dispositivo esegue bob deinterlacing.
  • DXVA2_VideoProcProgressiveDevice. Questo dispositivo viene usato se il video contiene solo fotogrammi progressivi, senza fotogrammi interlacciati. Alcuni contenuti video contengono una combinazione di fotogrammi progressivi e interlacciati. Il dispositivo progressivo non può essere usato per questo tipo di contenuto video "misto", perché è necessario un passaggio di denterlacing per i fotogrammi interlacciati.

Ogni driver grafico che supporta l'elaborazione video DXVA deve implementare almeno questi due dispositivi. Il driver grafico può anche fornire altri dispositivi, identificati da GUID specifici del driver. Ad esempio, un driver potrebbe implementare un algoritmo proprietario di deinterlacing che produce un output di qualità migliore rispetto a bob deinterlacing. Alcuni algoritmi di deinterlacing possono richiedere immagini di riferimento avanti o indietro dal flusso primario. In tal caso, il chiamante deve fornire queste immagini al driver nella sequenza corretta, come descritto più avanti in questa sezione.

Viene inoltre fornito un dispositivo software di riferimento. Il dispositivo software è ottimizzato per la qualità anziché per la velocità e potrebbe non essere adeguato per l'elaborazione video in tempo reale. Il dispositivo software di riferimento usa il valore GUID DXVA2_VideoProcSoftwareDevice.

Creazione di un dispositivo di elaborazione video

Prima di usare l'elaborazione video DXVA, l'applicazione deve creare un dispositivo di elaborazione video. Ecco una breve descrizione dei passaggi, illustrati in modo più dettagliato nella parte restante di questa sezione:

  1. Ottenere un puntatore all'interfaccia IDirectXVideoProcessorService .
  2. Creare una descrizione del formato video per il flusso video principale. Usare questa descrizione per ottenere un elenco dei dispositivi di elaborazione video che supportano il formato video. I dispositivi vengono identificati dal GUID.
  3. Per un dispositivo specifico, ottenere un elenco di formati di destinazione di rendering supportati dal dispositivo. I formati vengono restituiti come elenco di valori D3DFORMAT . Se si prevede di combinare sottostream, ottenere anche un elenco dei formati di sottostream supportati.
  4. Eseguire una query sulle funzionalità di ogni dispositivo.
  5. Creare il dispositivo di elaborazione video.

In alcuni casi è possibile omettere alcuni di questi passaggi. Ad esempio, invece di ottenere l'elenco dei formati di destinazione di rendering, è sufficiente provare a creare il dispositivo di elaborazione video con il formato preferito e verificare se ha esito positivo. È probabile che un formato comune, ad esempio D3DFMT_X8R8G8B8, abbia esito positivo.

Nella parte restante di questa sezione vengono descritti in dettaglio questi passaggi.

Ottenere il puntatore IDirectXVideoProcessorService

L'interfaccia IDirectXVideoProcessorService viene ottenuta dal dispositivo Direct3D. Esistono due modi per ottenere un puntatore a questa interfaccia:

Se si dispone di un puntatore a un dispositivo Direct3D, è possibile ottenere un puntatore IDirectXVideoProcessorService chiamando la funzione DXVA2CreateVideoService. Passare un puntatore all'interfaccia IDirect3DDevice9 del dispositivo e specificare IID_IDirectXVideoProcessorService per il parametro riid, come illustrato nel codice seguente:

    // Create the DXVA-2 Video Processor service.
    hr = DXVA2CreateVideoService(g_pD3DD9, IID_PPV_ARGS(&g_pDXVAVPS));

n alcuni casi, un oggetto crea il dispositivo Direct3D e quindi lo condivide con altri oggetti tramite il Gestione dispositivi Direct3D. In questo caso, è possibile chiamare IDirect3DDeviceManager9::GetVideoService nella gestione dispositivi per ottenere il puntatore IDirectXVideoProcessorService , come illustrato nel codice seguente:

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;
}

Enumerare i dispositivi di elaborazione video

Per ottenere un elenco di dispositivi di elaborazione video, compilare una struttura DXVA2_VideoDesc con il formato del flusso video primario e passare questa struttura al metodo IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids. Il metodo restituisce una matrice di GUID, una per ogni dispositivo di elaborazione video che può essere usato con questo formato video.

Si consideri un'applicazione che esegue il rendering di un flusso video in formato YUY2, usando la definizione BT.709 del colore YUV, con una frequenza di fotogrammi di 29,97 fotogrammi al secondo. Si supponga che il contenuto video sia costituito interamente da fotogrammi progressivi. Il frammento di codice seguente mostra come compilare la descrizione del formato e ottenere i GUID del dispositivo:

    // 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);

Il codice per questo esempio è tratto dall'esempio DXVA2_VideoProc SDK.

La matrice pGuids in questo esempio viene allocata dal metodo GetVideoProcessorDeviceGuids, quindi l'applicazione deve liberare la matrice chiamando CoTaskMemFree. I passaggi rimanenti possono essere eseguiti usando uno qualsiasi dei GUID del dispositivo restituiti da questo metodo.

Enumerare i formati di destinazione di rendering

Per ottenere l'elenco dei formati di destinazione di rendering supportati dal dispositivo, passare il GUID del dispositivo e la struttura DXVA2_VideoDesc al metodo IDirectXVideoProcessorService::GetVideoProcessorRenderTargets , come illustrato nel codice seguente:

    // 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;
    }

Il metodo restituisce una matrice di valori D3DFORMAT . In questo esempio, dove il tipo di input è YUY2, un elenco tipico di formati potrebbe essere D3DFMT_X8R8G8B8 (RGB a 32 bit) e D3DMFT_YUY2 (formato di input). Tuttavia, l'elenco esatto dipenderà dal driver.

L'elenco dei formati disponibili per i sottostream può variare a seconda del formato di destinazione di rendering e del formato di input. Per ottenere l'elenco dei formati substream, passare il GUID del dispositivo, la struttura del formato e il formato di destinazione di rendering al metodo IDirectXVideoProcessorService::GetVideoProcessorSubStreamFormats , come illustrato nel codice seguente:

    // 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;
    }

Questo metodo restituisce un'altra matrice di valori di D3DFORMAT . I formati di sottostream tipici sono AYUV e AI44.

Eseguire query sulle funzionalità del dispositivo

Per ottenere le funzionalità di un particolare dispositivo, passare il GUID del dispositivo, la struttura di formato e un formato di destinazione di rendering al metodo IDirectXVideoProcessorService::GetVideoProcessorCaps. Il metodo compila una struttura DXVA2_VideoProcessorCaps con le funzionalità del dispositivo.

    // 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;
    }

Creare il dispositivo

Per creare il dispositivo di elaborazione video, chiama IDirectXVideoProcessorService::CreateVideoProcessor. L'input di questo metodo è il GUID del dispositivo, la descrizione del formato, il formato di destinazione di rendering e il numero massimo di sottostream che si prevede di combinare. Il metodo restituisce un puntatore all'interfaccia IDirectXVideoProcessor , che rappresenta il dispositivo di elaborazione video.

    // Finally create a video processor device.

    hr = g_pDXVAVPS->CreateVideoProcessor(
        guid,
        &g_VideoDesc,
        VIDEO_RENDER_TARGET_FORMAT,
        SUB_STREAM_COUNT,
        &g_pDXVAVPD
        );

Blit processo video

L'operazione principale di elaborazione video è l'elaborazione video blit. Un blit è qualsiasi operazione che combina due o più bitmap in una singola bitmap. Un blit di elaborazione video combina immagini di input per creare un fotogramma di output. Per eseguire un'elaborazione video blit, chiama IDirectXVideoProcessor::VideoProcessBlt. Questo metodo passa un set di campioni video al dispositivo di elaborazione video. In risposta, il dispositivo di elaborazione video elabora le immagini di input e genera un fotogramma di output. L'elaborazione può includere la denterlacing, la conversione dello spazio dei colori e la combinazione di flussi secondari. L'output viene scritto in una superficie di destinazione fornita dal chiamante.

Il metodo VideoProcessBlt accetta i parametri seguenti:

  • pRT punta a una superficie di destinazione di rendering IDirect3DSurface9 che riceverà il fotogramma video elaborato.
  • pBltParams punta a una struttura DXVA2_VideoProcessBltParams che specifica i parametri per il blit.
  • pSamples è l'indirizzo di una matrice di strutture DXVA2_VideoSample . Queste strutture contengono gli esempi di input per il blit.
  • NumSamples fornisce le dimensioni della matrice pSamples .
  • Il parametro Reserved è riservato e deve essere impostato su NULL.

Nella matrice pSamples il chiamante deve fornire gli esempi di input seguenti:

  • Immagine corrente dal flusso video principale.
  • Immagini di riferimento avanti e indietro, se richieste dall'algoritmo di disincantazione.
  • Zero o più immagini sottostream, fino a un massimo di 15 sottostream.

Il driver prevede che questa matrice sia in un ordine specifico, come descritto in Input Sample Order.The driver expects this array to be in a particular order, as described in Input Sample Order.

Parametri Blit

La struttura DXVA2_VideoProcessBltParams contiene parametri generali per il blit. I parametri più importanti vengono archiviati nei membri seguenti della struttura:

  • TargetFrame è l'ora di presentazione del frame di output. Per il contenuto progressivo, questa volta deve essere uguale all'ora di inizio per il fotogramma corrente dal flusso video primario. Questa volta viene specificata nel membro Start della struttura DXVA2_VideoSample per l'esempio di input.

    Per il contenuto interlacciato, un frame con due campi interleaved produce due fotogrammi di output deinterlaced. Nel primo fotogramma di output, l'ora di presentazione deve corrispondere all'ora di inizio dell'immagine corrente nel flusso video primario, proprio come il contenuto progressivo. Nel secondo fotogramma di output, l'ora di inizio deve essere uguale al punto intermedio tra l'ora di inizio dell'immagine corrente nel flusso video primario e l'ora di inizio dell'immagine successiva nel flusso. Ad esempio, se il video di input è di 25 fotogrammi al secondo (50 campi al secondo), i fotogrammi di output avranno i timestamp mostrati nella tabella seguente. I timestamp vengono visualizzati in unità di 100 nanosecondi.

    Immagine di input TargetFrame (1) TargetFrame (2)
    0 0 200000
    400000 0 600000
    800000 800000 1000000
    1200000 1200000 1400000

     

    Se il contenuto interlacciato è costituito da singoli campi anziché campi interleaved, i tempi di output corrispondono sempre ai tempi di input, come con il contenuto progressivo.

  • TargetRect definisce un'area rettangolare all'interno della superficie di destinazione. Il blit scriverà l'output in questa area. In particolare, ogni pixel all'interno di TargetRect verrà modificato e non verrà modificato alcun pixel all'esterno di TargetRect . Il rettangolo di destinazione definisce il rettangolo di delimitazione per tutti i flussi video di input. Il posizionamento di singoli flussi all'interno di tale rettangolo viene controllato tramite il parametro pSamples di IDirectXVideoProcessor::VideoProcessBlt.

  • BackgroundColor fornisce il colore dello sfondo ovunque non venga visualizzata alcuna immagine video. Ad esempio, quando viene visualizzata un'immagine video 16 x 9 all'interno di un'area 4 x 3 (casella di lettere), le aree posta in arrivo vengono visualizzate con il colore di sfondo. Il colore di sfondo si applica solo all'interno del rettangolo di destinazione (TargetRect). I pixel esterni a TargetRect non vengono modificati.

  • DestFormat descrive lo spazio dei colori per il video di output, ad esempio se viene usato il colore BT.709 o BT.601 ITU-R. Queste informazioni possono influire sulla modalità di visualizzazione dell'immagine. Per altre informazioni, vedere Extended Color Information.For more information, see Extended Color Information.

Altri parametri sono descritti nella pagina di riferimento per la struttura DXVA2_VideoProcessBltParams.

Esempi di input

Il parametro pSamples di IDirectXVideoProcessor::VideoProcessBlt punta a una matrice di strutture DXVA2_VideoSample . Ognuna di queste strutture contiene informazioni su un campione di input e un puntatore alla superficie Direct3D che contiene l'esempio. Ogni esempio è uno dei seguenti:

  • Immagine corrente dal flusso primario.
  • Immagine di riferimento avanti o indietro dal flusso primario, utilizzata per la disincantazione.
  • Immagine del sottostream.

L'ordine esatto in cui gli esempi devono essere visualizzati nella matrice viene descritto più avanti, nella sezione Ordine di esempio di input.

È possibile fornire fino a 15 immagini sottostream, anche se la maggior parte delle applicazioni video richiede al massimo un solo sottostream. Il numero di sottostream può cambiare con ogni chiamata a VideoProcessBlt. Le immagini substream sono indicate impostando il membro SampleFormat.SampleFormat della struttura DXVA2_VideoSample uguale a DXVA2_SampleSubStream. Per il flusso video principale, questo membro descrive l'interlacciamento del video di input. Per altre informazioni, vedere DXVA2_SampleFormat'enumerazione.

Per il flusso video primario, i membri Start e End della struttura DXVA2_VideoSample assegnano l'ora di inizio e di fine dell'esempio di input. Per le immagini sottostream, impostare questi valori su zero, perché l'ora di presentazione viene sempre calcolata dal flusso primario. L'applicazione è responsabile del rilevamento quando ogni immagine del sottostream deve essere presentata e inviarla a VideoProcessBlt al momento appropriato.

Due rettangoli definiscono il modo in cui il video di origine viene posizionato per ogni flusso:

  • Il membro SrcRect della struttura DXVA2_VideoSample specifica il rettangolo di origine, un'area rettangolare dell'immagine di origine che verrà visualizzata nel frame di output composito. Per ritagliare l'immagine, impostarla su un valore inferiore alla dimensione del fotogramma. In caso contrario, impostarlo come uguale alla dimensione del fotogramma.
  • Il membro DstRect della stessa struttura specifica il rettangolo di destinazione, un'area rettangolare della superficie di destinazione in cui verrà visualizzato il fotogramma video.

Il driver blitta i pixel dal rettangolo di origine nel rettangolo di destinazione. I due rettangoli possono avere dimensioni o proporzioni diverse; il driver ridimensiona l'immagine in base alle esigenze. Inoltre, ogni flusso di input può usare un fattore di ridimensionamento diverso. In effetti, il ridimensionamento potrebbe essere necessario per produrre le proporzioni corrette nel frame di output. Il driver non tiene conto delle proporzioni pixel dell'origine, quindi se l'immagine di origine usa pixel non quadrati, spetta all'applicazione calcolare il rettangolo di destinazione corretto.

I formati di sottostream preferiti sono AYUV e AI44. Quest'ultimo è un formato palletizzato con 16 colori. Le voci della tavolozza vengono specificate nel membro Pal della struttura DXVA2_VideoSample . Se il formato video di origine è espresso originariamente come tipo di supporto di Media Foundation, le voci della tavolozza vengono archiviate nel attributo MF_MT_PALETTE. Per i formati non palletizzati, deselezionare questa matrice su zero.

Composizione immagine

Ogni operazione blit è definita dai tre rettangoli seguenti:

  • Il rettangolo di destinazione (TargetRect) definisce l'area all'interno della superficie di destinazione in cui verrà visualizzato l'output. L'immagine di output viene ritagliata in questo rettangolo.
  • Il rettangolo di destinazione per ogni flusso (DstRect) definisce dove viene visualizzato il flusso di input nell'immagine composita.
  • Il rettangolo di origine per ogni flusso (SrcRect) definisce quale parte dell'immagine di origine viene visualizzata.

I rettangoli di destinazione e di destinazione vengono specificati in relazione alla superficie di destinazione. Il rettangolo di origine viene specificato in relazione all'immagine di origine. Tutti i rettangoli vengono specificati in pixel.

diagram showing source, destination, and target rectangles

Il dispositivo di elaborazione video alfa fonde le immagini di input, usando una delle seguenti origini di dati alfa:

  • Dati alfa per pixel da sottostream.
  • Valore alfa planare per ogni flusso video, specificato nel membro PlanarAlpha della struttura DXVA2_VideoSample .
  • Valore alfa planare dell'immagine composita, specificato nel membro Alfa della struttura DXVA2_VideoProcessBltParams . Questo valore viene usato per combinare l'intera immagine composita con il colore di sfondo.

Questa sezione fornisce una serie di esempi che illustrano come il dispositivo di elaborazione video crea l'immagine di output.

Esempio 1: Letterboxing

In questo esempio viene illustrato come inserire nella casella di testo l'immagine di origine impostando il rettangolo di destinazione su un valore inferiore al rettangolo di destinazione. Il flusso video principale in questo esempio è un'immagine 720 × 480 e deve essere visualizzata con proporzioni 16:9. La superficie di destinazione è 640 × 480 pixel (proporzioni 4:3). Per ottenere le proporzioni corrette, il rettangolo di destinazione deve essere 640 × 360. Per semplicità, questo esempio non include un sottostream. Il diagramma seguente mostra i rettangoli di origine e di destinazione.

diagram showing letterboxing.

Il diagramma precedente mostra i rettangoli seguenti:

  • Rettangolo di destinazione: { 0, 0, 640, 480 }

  • Video principale:

    • Rettangolo di origine: { 0, 0, 720, 480 }
    • Rettangolo di destinazione: { 0, 60, 640, 420 }

Il driver denterlacerà il video, ridurrà il fotogramma deinterlaced a 640 × 360 e inserirà il fotogramma nel rettangolo di destinazione. Il rettangolo di destinazione è maggiore del rettangolo di destinazione, quindi il driver userà il colore di sfondo per riempire le barre orizzontali sopra e sotto la cornice. Il colore di sfondo viene specificato nella struttura DXVA2_VideoProcessBltParams.

Esempio 2: Estensione delle immagini substream

Le immagini substream possono estendersi oltre l'immagine video principale. Nel video DVD, ad esempio, il flusso video principale può avere una proporzione di 4:3 mentre il sottostream è 16:9. In questo esempio, entrambi i flussi video hanno le stesse dimensioni di origine (720 × 480), ma il sottostream deve essere visualizzato con proporzioni 16:9. Per ottenere queste proporzioni, l'immagine del sottostream viene estesa orizzontalmente. I rettangoli di origine e di destinazione sono illustrati nel diagramma seguente.

diagram showing substream image stretching.

Il diagramma precedente mostra i rettangoli seguenti:

  • Rettangolo di destinazione: { 0, 0, 854, 480 }

  • Video principale:

    • Rettangolo di origine: { 0, 0, 720, 480 }
    • Rettangolo di destinazione: { 0, 107, 474, 480 }
  • Substream:

    • Rettangolo di origine: { 0, 0, 720, 480 }
    • Rettangolo di destinazione: { 0, 0, 854, 480 }

Questi valori mantengono l'altezza dell'immagine e ridimensionano entrambe le immagini orizzontalmente. Nelle aree in cui appaiono entrambe le immagini vengono combinate alfa. Dove l'immagine del sottostream si estende oltre il video primay, il sottostream viene mescolato con il colore di sfondo. Questa fusione alfa rappresenta i colori modificati sul lato destro del diagramma.

Esempio 3: Altezze di flusso non corrispondenti

Nell'esempio precedente, il sottostream e il flusso primario sono la stessa altezza. Flussi possono anche avere altezze non corrispondenti, come illustrato in questo esempio. Le aree all'interno del rettangolo di destinazione in cui non viene visualizzato alcun video vengono disegnate usando il colore di sfondo, nero in questo esempio. I rettangoli di origine e di destinazione sono illustrati nel diagramma seguente.

diagram showing mismatched stream heights,

Il diagramma precedente mostra i rettangoli seguenti:

  • Rettangolo di destinazione: { 0, 0, 150, 85 }
  • Video principale:
    • Rettangolo di origine: { 0, 0, 150, 50 }
    • Rettangolo di destinazione: { 0, 17, 150, 67 }
  • Substream:
    • Rettangolo di origine: { 0, 0, 100, 85 }
    • Rettangolo di destinazione: { 25, 0, 125, 85 }

Esempio 4: Rettangolo di destinazione più piccolo della superficie di destinazione

Questo esempio mostra un caso in cui il rettangolo di destinazione è inferiore alla superficie di destinazione.

diagram showing a blit to a destination rectangle.

Il diagramma precedente mostra i rettangoli seguenti:

  • Superficie di destinazione: { 0, 0, 300, 200 }
  • Rettangolo di destinazione: { 0, 0, 150, 85 }
  • Video principale:
    • Rettangolo di origine: { 0, 0, 150, 50 }
    • Rettangolo di destinazione: { 0, 17, 150, 67 }
  • Substream:
    • Rettangolo di origine: { 0, 0, 100, 85 }
    • Rettangolo di destinazione: { 25, 0, 125, 85 }

I pixel esterni al rettangolo di destinazione non vengono modificati, quindi il colore di sfondo viene visualizzato solo all'interno del rettangolo di destinazione. L'area punteggiata indica parti della superficie di destinazione che non sono interessate dal blit.

Esempio 5: Rettangoli di origine

Se si specifica un rettangolo di origine più piccolo dell'immagine di origine, il driver blitrà solo quella parte dell'immagine. In questo esempio, i rettangoli di origine specificano il quadrante inferiore destro del flusso video primario e il quadrante inferiore sinistro del sottostream (indicato dai contrassegni hash nel diagramma). I rettangoli di destinazione sono le stesse dimensioni dei rettangoli di origine, quindi il video non viene esteso. I rettangoli di origine e di destinazione sono illustrati nel diagramma seguente.

diagram showing a blit from two source rectangles.

Il diagramma precedente mostra i rettangoli seguenti:

  • Rettangolo di destinazione: { 0, 0, 720, 576 }
  • Video principale:
    • Dimensioni della superficie di origine: { 0, 0, 720, 480 }
    • Rettangolo di origine: { 360, 240, 720, 480 }
    • Rettangolo di destinazione: { 0, 0, 360, 240 }
  • Substream:
    • Dimensioni della superficie di origine: { 0, 0, 640, 576 }
    • Rettangolo di origine: { 0, 288, 320, 576 }
    • Rettangolo di destinazione: { 400, 0, 720, 288 }

Esempio 6: intersecare i rettangoli di destinazione

Questo esempio è simile a quello precedente, ma i rettangoli di destinazione si intersecano. Le dimensioni della superficie sono uguali a quella dell'esempio precedente, ma i rettangoli di origine e di destinazione non sono. Anche in questo caso, il video viene ritagliato ma non allungato. I rettangoli di origine e di destinazione sono illustrati nel diagramma seguente.

diagram showing intersecting destination rectangles.

Il diagramma precedente mostra i rettangoli seguenti:

  • Rettangolo di destinazione: { 0, 0, 720, 576 }
  • Video principale:
    • Dimensioni della superficie di origine: { 0, 0, 720, 480 }
    • Rettangolo di origine: { 260, 92, 720, 480 }
    • Rettangolo di destinazione: { 0, 0, 460, 388 }
  • Substream:
    • Dimensioni della superficie di origine: { 0, 0, 640, 576 }
    • Rettangolo di origine: { 0, 0, 460, 388 }
    • Rettangolo di destinazione: { 260, 188, 720, 576 }

Esempio 7: Estensione e ritaglio video

In questo esempio, il video viene esteso e ritagliato. Un'area di 180 × 120 da ogni flusso viene estesa fino a coprire un'area di 360 × 240 nel rettangolo di destinazione.

diagram showing stretching and cropping.

Il diagramma precedente mostra i rettangoli seguenti:

  • Rettangolo di destinazione: { 0, 0, 720, 480 }
  • Video principale:
    • Dimensioni della superficie di origine: { 0, 0, 360, 240 }
    • Rettangolo di origine: { 180, 120, 360, 240 }
    • Rettangolo di destinazione: { 0, 0, 360, 240 }
  • Substream:
    • Dimensioni della superficie di origine: { 0, 0, 360, 240 }
    • Rettangolo di origine: { 0, 0, 180, 120 }
    • Rettangolo di destinazione: { 360, 240, 720, 480 }

Ordine di esempio di input

Il parametro pSamples del metodo VideoProcessBlt è un puntatore a una matrice di esempi di input. I campioni del flusso video primario vengono visualizzati per primi, seguiti da immagini sottostream in ordine Z. Gli esempi devono essere inseriti nella matrice nell'ordine seguente:

  • Gli esempi per il flusso video primario vengono visualizzati prima nella matrice, in ordine temporale. A seconda della modalità deinterlace, il driver potrebbe richiedere uno o più esempi di riferimento dal flusso video primario. I membri NumForwardRefSamples e NumBackwardRefSamples della struttura DXVA2_VideoProcessorCaps specificano il numero di esempi di riferimento avanti e indietro necessari. Il chiamante deve fornire questi esempi di riferimento anche se il contenuto video è progressivo e non richiede l'inserimento dei dati. Ciò può verificarsi quando i fotogrammi progressivi vengono assegnati a un dispositivo di denterlacing, ad esempio quando l'origine contiene una combinazione di fotogrammi interlacciati e progressivi.
  • Dopo gli esempi per il flusso video primario, la matrice può contenere fino a 15 campioni di substream, disposti in ordine Z, dal basso verso l'alto. I sottostream sono sempre progressivi e non richiedono immagini di riferimento.

In qualsiasi momento, il flusso video principale può passare tra contenuto interlacciato e progressivo e il numero di sottostream può cambiare.

Il membro SampleFormat.SampleFormat della struttura DXVA2_VideoSample indica il tipo di immagine. Per le immagini substream, impostare questo valore su DXVA2_SampleSubStream. Per le immagini progressive, il valore è DXVA2_SampleProgressiveFrame. Per le immagini interlacciate, il valore dipende dal layout del campo.

Se il driver richiede esempi di riferimento avanti e indietro, il numero completo di campioni potrebbe non essere disponibile all'inizio della sequenza video. In tal caso, includere le voci nella matrice pSamples , ma contrassegnare gli esempi mancanti come con tipo DXVA2_SampleUnknown.

I membri Start e End della struttura DXVA2_VideoSample assegnano la posizione temporale di ogni campione. Questi valori vengono usati solo per esempi del flusso video primario. Per le immagini substream, impostare entrambi i membri su zero.

Gli esempi seguenti possono contribuire a chiarire questi requisiti.

Esempio 1

Il caso più semplice si verifica quando non sono presenti sottostream e l'algoritmo di deinterlacing non richiede esempi di riferimento (NumForwardRefSamples e NumBackwardRefSamples sono entrambi zero). Bob deinterlacing è un esempio di tale algoritmo. In questo caso, la matrice pSamples deve contenere una singola superficie di input, come illustrato nella tabella seguente.

Indice Tipo di superficie Posizione temporale
pSamples[0] Immagine interlacciata. T

 

Si presuppone che il valore dell'ora T sia l'ora di inizio del fotogramma video corrente.

Esempio 2

In questo esempio l'applicazione combina due sottostream con il flusso primario. L'algoritmo di deinterlacing non richiede esempi di riferimento. Nella tabella seguente viene illustrato come vengono disposti questi esempi nella matrice pSamples .

Indice Tipo di superficie Posizione temporale Ordine Z
pSamples[0] Immagine interlacciata T 0
pSamples[1] Sottostream 0 1
pSamples[2] Sottostream 0 2

 

Esempio 3

Si supponga ora che l'algoritmo di deinterlacing richieda un esempio di riferimento indietro e un esempio di riferimento in avanti. Inoltre, vengono fornite due immagini substream, per un totale di cinque superfici. L'ordinamento corretto è illustrato nella tabella seguente.

Indice Tipo di superficie Posizione temporale Ordine Z
pSamples[0] Immagine interlacciata (riferimento) T −1 Non applicabile
pSamples[1] Immagine interlacciata T 0
pSamples[2] Immagine interlacciata (riferimento) T +1 Non applicabile
pSamples[3] Sottostream 0 1
pSamples[4] Sottostream 0 2

 

L'ora T −1 è l'ora di inizio del fotogramma prima del fotogramma corrente e T +1 è l'ora di inizio del frame seguente.

Se il flusso video passa al contenuto progressivo, usando la stessa modalità di denterlacing, l'applicazione deve fornire lo stesso numero di campioni, come illustrato nella tabella seguente.

Indice Tipo di superficie Posizione temporale Ordine Z
pSamples[0] Immagine progressiva (riferimento) T −1 Non applicabile
pSamples[1] Immagine progressiva T 0
pSamples[2] Immagine progressiva (riferimento) T +1 Non applicabile
pSamples[3] Sottostream 0 1
pSamples[4] Sottostream 0 2

 

Esempio 4

All'inizio di una sequenza video, gli esempi di riferimento avanti e indietro potrebbero non essere disponibili. In questo caso, le voci per gli esempi mancanti vengono incluse nella matrice pSamples , con tipo di esempio DXVA2_SampleUnknown.

Supponendo che la modalità di denterlacing richieda un esempio di riferimento avanti e indietro, le prime tre chiamate a VideoProcessBlt avranno le sequenze di input illustrate nelle tre tabelle seguenti.

Indice Tipo di superficie Posizione temporale
pSamples[0] Sconosciuto 0
pSamples[1] Sconosciuto 0
pSamples[2] Immagine interlacciata (riferimento) T +1

 

Indice Tipo di superficie Posizione temporale
pSamples[0] Sconosciuto 0
pSamples[1] Immagine interlacciata T
pSamples[2] Immagine interlacciata (riferimento) T +1

 

Indice Tipo di superficie Posizione temporale
pSamples[0] Immagine interlacciata T −1
pSamples[1] Immagine interlacciata T
pSamples[2] Immagine interlacciata (riferimento) T +1

 

Accelerazione video DirectX 2.0

Esempio di DXVA2_VideoProc