Delen via


DXVA-videoverwerking

DXVA-videoverwerking omvat de functies van de grafische hardware die is gewijd aan het verwerken van niet-gecomprimeerde videoafbeeldingen. Videoverwerkingsservices omvatten ontinterlacing en videomixen.

Dit onderwerp bevat de volgende secties:

Overzicht

Grafische hardware kan de GPU (Graphics Processing Unit) gebruiken om niet-gecomprimeerde videoafbeeldingen te verwerken. Een videoverwerkingsapparaat is een softwareonderdeel dat deze functies inkapselt. Toepassingen kunnen een videoverwerkingsapparaat gebruiken om functies uit te voeren, zoals:

  • Deinterlacing en inverse telecine
  • Video-substromen combineren op de hoofdvideoafbeelding
  • Kleuraanpassing (ProcAmp) en afbeeldingsfiltering
  • Schalen van afbeeldingen
  • Kleurruimteconversie
  • Alfamenging

In het volgende diagram ziet u de fasen in de pijplijn voor videoverwerking. Het diagram is niet bedoeld om een werkelijke implementatie weer te geven. Het grafische stuurprogramma kan bijvoorbeeld verschillende fasen combineren tot één bewerking. Al deze bewerkingen kunnen worden uitgevoerd in één aanroep naar het videoverwerkingsapparaat. Sommige fasen die hier worden weergegeven, zoals ruis en detailfiltering, worden mogelijk niet ondersteund door het stuurprogramma.

diagram met de fasen van dxva-videoverwerking.

De invoer voor de pijplijn voor videoverwerking bevat altijd een primaire videostream, die de belangrijkste afbeeldingsgegevens bevat. De primaire videostream bepaalt de framesnelheid voor de uitvoervideo. Elk frame van de uitvoervideo wordt berekend ten opzichte van de invoergegevens van de primaire videostream. Pixels in de primaire stroom zijn altijd ondoorzichtig, zonder alfagegevens per pixel. De primaire videostream kan progressief of interlaced zijn.

Optioneel kan de pijplijn voor videoverwerking maximaal 15 videosubstreams ontvangen. Een substream bevat aanvullende afbeeldingsgegevens, zoals ondertiteling of dvd-subpicturen. Deze afbeeldingen worden weergegeven via de primaire videostream en zijn over het algemeen niet bedoeld om zelf te worden weergegeven. Substreamafbeeldingen kunnen alfagegevens per pixel bevatten en zijn altijd progressieve frames. Het videoverwerkingsapparaat alfa-mixt de substreamafbeeldingen met het huidige gedeinterlaceerde frame van de primaire videostream.

In de rest van dit onderwerp wordt de term afbeelding gebruikt voor de invoergegevens voor een videoverwerkingsapparaat. Een afbeelding kan bestaan uit een progressief kader, één veld of twee interleaved velden. De uitvoer is altijd een gedeinterlaceerd frame.

Een videostuurprogramma kan meer dan één videoverwerkingsapparaat implementeren om verschillende sets videoverwerkingsmogelijkheden te bieden. Apparaten worden geïdentificeerd door GUID. De volgende GUID's zijn vooraf gedefinieerd:

  • DXVA2_VideoProcBobDevice. Dit apparaat voert bob deinterlacing uit.
  • DXVA2_VideoProcProgressiveDevice. Dit apparaat wordt gebruikt als de video alleen progressieve frames bevat, zonder interlaced frames. (Sommige video-inhoud bevat een mix van progressieve en interlaced frames. Het progressieve apparaat kan niet worden gebruikt voor dit soort 'gemengde' video-inhoud, omdat een deinterlacingstap is vereist voor de interlaced frames.)

Elk grafisch stuurprogramma dat ONDERSTEUNING biedt voor DXVA-videoverwerking, moet ten minste deze twee apparaten implementeren. Het grafische stuurprogramma kan ook andere apparaten bieden, die worden geïdentificeerd door stuurprogrammaspecifieke GUID's. Een stuurprogramma kan bijvoorbeeld een eigen deinterlacing-algoritme implementeren dat betere kwaliteit produceert dan bob deinterlacing. Voor sommige deinterlacing-algoritmen zijn mogelijk vooruit- of achteruitverwijzingsafbeeldingen van de primaire stroom vereist. Zo ja, dan moet de beller deze afbeeldingen in de juiste volgorde aan het stuurprogramma doorgeven, zoals verderop in deze sectie wordt beschreven.

Er wordt ook een referentiesoftwareapparaat geleverd. Het softwareapparaat is geoptimaliseerd voor kwaliteit in plaats van snelheid en is mogelijk niet voldoende voor realtime videoverwerking. Het referentiesoftwareapparaat gebruikt de GUID-waarde DXVA2_VideoProcSoftwareDevice.

Een videoverwerkingsapparaat maken

Voordat u DXVA-videoverwerking gebruikt, moet de toepassing een videoverwerkingsapparaat maken. Hier volgt een kort overzicht van de stappen, die in de rest van deze sectie uitgebreider worden uitgelegd:

  1. Haal een aanwijzer op naar de interface IDirectXVideoProcessorService .
  2. Maak een beschrijving van de video-indeling voor de primaire videostream. Gebruik deze beschrijving voor een lijst met de videoverwerkingsapparaten die ondersteuning bieden voor de video-indeling. Apparaten worden geïdentificeerd door GUID.
  3. Voor een bepaald apparaat haalt u een lijst op met render-doelindelingen die door het apparaat worden ondersteund. De notaties worden geretourneerd als een lijst met D3DFORMAT waarden. Als u van plan bent substreams te combineren, haalt u ook een lijst op met de ondersteunde substreamindelingen.
  4. Voer een query uit op de mogelijkheden van elk apparaat.
  5. Maak het videoverwerkingsapparaat.

Soms kunt u enkele van deze stappen weglaten. In plaats van de lijst met render-doelindelingen op te halen, kunt u bijvoorbeeld gewoon proberen om het videoverwerkingsapparaat te maken met de gewenste indeling en te zien of het lukt. Een algemene indeling, zoals D3DFMT_X8R8G8B8, slaagt waarschijnlijk wel.

In de rest van deze sectie worden deze stappen gedetailleerd beschreven.

De IDirectXVideoProcessorService Pointer ophalen

De IDirectXVideoProcessorService-interface wordt verkregen van het Direct3D-apparaat. Er zijn twee manieren om een aanwijzer naar deze interface te krijgen:

Als u een aanwijzer naar een Direct3D-apparaat hebt, kunt u een IDirectXVideoProcessorService-aanwijzer krijgen door de functie DXVA2CreateVideoService aan te roepen. Geef een aanwijzer door naar de IDirect3DDevice9-interface van het apparaat en geef IID_IDirectXVideoProcessorService op voor de riid-parameter , zoals wordt weergegeven in de volgende code:

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

In sommige gevallen maakt één object het Direct3D-apparaat en deelt het vervolgens met andere objecten via Direct3D Device Manager. In deze situatie kunt u IDirect3DDeviceManager9::GetVideoService op de apparaatbeheerder aanroepen om de pointer IDirectXVideoProcessorService op te halen, zoals wordt weergegeven in de volgende code:

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

De videoverwerkingsapparaten opsommen

Als u een lijst met videoverwerkingsapparaten wilt ophalen, vult u een DXVA2_VideoDesc structuur in met de indeling van de primaire videostream en geeft u deze structuur door aan de methode IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids . De methode retourneert een matrix met GUID's, één voor elk videoverwerkingsapparaat dat kan worden gebruikt met deze video-indeling.

Overweeg een toepassing die een videostream in YUY2-indeling weergeeft, met behulp van de BT.709-definitie van YUV-kleur, met een framesnelheid van 29,97 frames per seconde. Stel dat de video-inhoud volledig uit progressieve frames bestaat. In het volgende codefragment ziet u hoe u de beschrijving van de indeling invult en de apparaat-GUID's opgeeft:

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

De code voor dit voorbeeld is afkomstig uit het DXVA2_VideoProc SDK-voorbeeld.

De pGuids-matrix in dit voorbeeld wordt toegewezen door de methode GetVideoProcessorDeviceGuids , dus de toepassing moet de matrix vrij maken door CoTaskMemFree aan te roepen. De resterende stappen kunnen worden uitgevoerd met behulp van een van de apparaat-GUID's die door deze methode worden geretourneerd.

Render-Target-indelingen opsommen

Als u de lijst met render-doelindelingen wilt ophalen die door het apparaat worden ondersteund, geeft u de apparaat-GUID en de DXVA2_VideoDesc structuur door aan de methode IDirectXVideoProcessorService::GetVideoProcessorRenderTargets , zoals wordt weergegeven in de volgende code:

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

De methode retourneert een matrix van D3DFORMAT waarden. In dit voorbeeld, waarbij het invoertype YUY2 is, kan een typische lijst met indelingen worden D3DFMT_X8R8G8B8 (32-bits RGB) en D3DMFT_YUY2 (de invoerindeling). De exacte lijst is echter afhankelijk van het stuurprogramma.

De lijst met beschikbare indelingen voor de substromen kan variëren, afhankelijk van de indeling van het render-doel en de invoerindeling. Als u de lijst met substreamindelingen wilt ophalen, geeft u de apparaat-GUID, de indelingsstructuur en de render-doelindeling door aan de methode IDirectXVideoProcessorService::GetVideoProcessorSubStreamFormats , zoals wordt weergegeven in de volgende code:

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

Deze methode retourneert een andere matrix van D3DFORMAT waarden. Typische substreamindelingen zijn AYUV en AI44.

Query's uitvoeren op de mogelijkheden van het apparaat

Als u de mogelijkheden van een bepaald apparaat wilt ophalen, geeft u de apparaat-GUID, de indelingsstructuur en een render-doelindeling door aan de methode IDirectXVideoProcessorService::GetVideoProcessorCaps . De methode vult een DXVA2_VideoProcessorCaps structuur in met de mogelijkheden van het apparaat.

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

Het apparaat maken

Als u het videoverwerkingsapparaat wilt maken, roept u IDirectXVideoProcessorService::CreateVideoProcessor aan. De invoer voor deze methode is de apparaat-GUID, de indelingsbeschrijving, de indelingsindeling en het maximum aantal substreams dat u wilt combineren. De methode retourneert een aanwijzer naar de IDirectXVideoProcessor-interface , die het videoverwerkingsapparaat vertegenwoordigt.

    // Finally create a video processor device.

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

Videoproces Blit

De belangrijkste videoverwerkingsbewerking is de videoverwerkingslicht. (Een blit is een bewerking die twee of meer bitmaps combineert tot één bitmap. Een videoverwerkings blit combineert invoerafbeeldingen om een uitvoerframe te maken.) Als u een blit voor videoverwerking wilt uitvoeren, roept u IDirectXVideoProcessor::VideoProcessBlt aan. Met deze methode wordt een set videovoorbeelden doorgegeven aan het videoverwerkingsapparaat. Als reactie verwerkt het videoverwerkingsapparaat de invoerafbeeldingen en genereert het één uitvoerframe. Verwerking kan bestaan uit deinterlacing, conversie van kleurruimte en menging van substromen. De uitvoer wordt geschreven naar een doeloppervlak dat door de aanroeper wordt geleverd.

De methode VideoProcessBlt gebruikt de volgende parameters:

  • pRT verwijst naar een IDirect3DSurface9 render doeloppervlak dat het verwerkte videoframe ontvangt.
  • pBltParams verwijst naar een DXVA2_VideoProcessBltParams structuur die de parameters voor de blit specificeert.
  • pSamples is het adres van een matrix van DXVA2_VideoSample structuren. Deze structuren bevatten de invoervoorbeelden voor de blit.
  • NumSamples geeft de grootte van de matrix pSamples .
  • De gereserveerde parameter is gereserveerd en moet worden ingesteld op NULL.

In de matrix pSamples moet de aanroeper de volgende invoervoorbeelden opgeven:

  • De huidige afbeelding van de primaire videostream.
  • Vooruit- en achteruitverwijzingsafbeeldingen, indien vereist door het deinterlacing-algoritme.
  • Nul of meer substreamafbeeldingen, maximaal 15 substreams.

Het stuurprogramma verwacht dat deze matrix zich in een bepaalde volgorde bevindt, zoals beschreven in de invoervoorbeeldvolgorde.

Blit-parameters

De DXVA2_VideoProcessBltParams-structuur bevat algemene parameters voor de blit. De belangrijkste parameters worden opgeslagen in de volgende leden van de structuur:

  • TargetFrame is de presentatietijd van het uitvoerframe. Voor progressieve inhoud moet deze tijd gelijk zijn aan de begintijd voor het huidige frame van de primaire videostream. Deze keer wordt opgegeven in het beginlid van de DXVA2_VideoSample-structuur voor dat invoervoorbeeld.

    Voor interlaced inhoud produceert een frame met twee interleaved velden twee gedeinterlaceerde uitvoerframes. In het eerste uitvoerframe moet de presentatietijd gelijk zijn aan de begintijd van de huidige afbeelding in de primaire videostream, net zoals progressieve inhoud. In het tweede uitvoerframe moet de begintijd gelijk zijn aan het middelpunt tussen de begintijd van de huidige afbeelding in de primaire videostream en de begintijd van de volgende afbeelding in de stream. Als de invoervideo bijvoorbeeld 25 frames per seconde (50 velden per seconde) is, bevatten de uitvoerframes de tijdstempels die worden weergegeven in de volgende tabel. Tijdstempels worden weergegeven in eenheden van 100 nanoseconden.

    Invoerafbeelding TargetFrame (1) TargetFrame (2)
    0 0 200000
    400000 0 600000
    800000 800000 1000000
    1200000 1200000 1400000

     

    Als interlaced inhoud bestaat uit afzonderlijke velden in plaats van interleaved velden, komen de uitvoertijden altijd overeen met de invoertijden, net als bij progressieve inhoud.

  • TargetRect definieert een rechthoekig gebied binnen het doeloppervlak. De blit schrijft de uitvoer naar deze regio. In het bijzonder wordt elke pixel in TargetRect gewijzigd en worden er geen pixels buiten TargetRect gewijzigd. De doelrechthoek definieert de begrenzingsrechthoek voor alle invoervideostreams. Plaatsing van afzonderlijke streams binnen die rechthoek wordt beheerd via de parameter pSamples van IDirectXVideoProcessor::VideoProcessBlt.

  • BackgroundColor geeft de kleur van de achtergrond waar geen videoafbeelding wordt weergegeven. Wanneer bijvoorbeeld een videoafbeelding van 16 x 9 wordt weergegeven binnen een gebied van 4 x 3 (letterboxing), worden de gebieden met brievenvakken weergegeven met de achtergrondkleur. De achtergrondkleur is alleen van toepassing in de doelrechthoek (TargetRect). Eventuele pixels buiten TargetRect worden niet gewijzigd.

  • DestFormat beschrijft de kleurruimte voor de uitvoervideo, bijvoorbeeld of ITU-R BT.709- of BT.601-kleur wordt gebruikt. Deze informatie kan van invloed zijn op de weergave van de afbeelding. Zie Uitgebreide kleurinformatievoor meer informatie.

Andere parameters worden beschreven op de referentiepagina voor de DXVA2_VideoProcessBltParams structuur.

Invoervoorbeelden

De parameter pSamples van IDirectXVideoProcessor::VideoProcessBlt verwijst naar een matrix van DXVA2_VideoSample structuren. Elk van deze structuren bevat informatie over één invoervoorbeeld en een aanwijzer naar het Direct3D-oppervlak dat het monster bevat. Elk voorbeeld is een van de volgende:

  • De huidige afbeelding van de primaire stroom.
  • Een vooruit- of achteruitverwijzingsafbeelding van de primaire stroom, die wordt gebruikt voor deinterlacing.
  • Een substroomafbeelding.

De exacte volgorde waarin de voorbeelden in de matrix moeten worden weergegeven, wordt verderop in de sectie Invoervoorbeeldvolgorde beschreven.

Maximaal 15 substreamafbeeldingen kunnen worden geleverd, hoewel de meeste videotoepassingen maximaal één substream nodig hebben. Het aantal substromen kan worden gewijzigd bij elke aanroep naar VideoProcessBlt. Substroomafbeeldingen worden aangegeven door het lid SampleFormat.SampleFormat van de DXVA2_VideoSample structuur in te stellen die gelijk is aan DXVA2_SampleSubStream. Voor de primaire videostream beschrijft dit lid de interlacing van de invoervideo. Zie DXVA2_SampleFormat opsomming voor meer informatie.

Voor de primaire videostream geven de begin - en eindleden van de DXVA2_VideoSample structuur de begin- en eindtijden van het invoervoorbeeld. Voor substroomafbeeldingen stelt u deze waarden in op nul, omdat de presentatietijd altijd wordt berekend op basis van de primaire stroom. De toepassing is verantwoordelijk voor het bijhouden wanneer elke substroomafbeelding moet worden weergegeven en op het juiste moment naar VideoProcessBlt moet worden verzonden .

In twee rechthoeken wordt gedefinieerd hoe de bronvideo voor elke stream wordt weergegeven:

  • Het SrcRect-lid van de DXVA2_VideoSample-structuur geeft de bronrechthoek op, een rechthoekig gebied van de bronafbeelding die wordt weergegeven in het samengestelde uitvoerframe. Als u de afbeelding wilt bijsnijden, stelt u deze in op een waarde die kleiner is dan het frameformaat. Anders stelt u deze in op de framegrootte.
  • Het DstRect-lid van dezelfde structuur specificeert de doelrechthoek, een rechthoekig gebied van het doeloppervlak waar het videoframe wordt weergegeven.

De blits-pixels van het stuurprogramma van de bronrechthoek in de doelrechthoek. De twee rechthoeken kunnen verschillende grootten of hoogte-breedteverhoudingen hebben; het stuurprogramma schaalt de installatiekopieën naar behoefte. Bovendien kan elke invoerstroom een andere schaalfactor gebruiken. In feite kan schalen nodig zijn om de juiste hoogte-breedteverhouding in het uitvoerframe te produceren. Het stuurprogramma houdt geen rekening met de hoogte-breedteverhouding van de bron, dus als de bronafbeelding niet-vierkante pixels gebruikt, is het aan de toepassing om de juiste doelrechthoek te berekenen.

De voorkeurssubstreamindelingen zijn AYUV en AI44. De laatste is een gepalletiseerde indeling met 16 kleuren. Paletvermeldingen worden opgegeven in het Pal-lid van de DXVA2_VideoSample structuur. (Als de bronvideo-indeling oorspronkelijk wordt uitgedrukt als mediatype Media Foundation, worden de paletvermeldingen opgeslagen in het kenmerk MF_MT_PALETTE .) Wis deze matrix voor niet-gepalletiseerde notaties op nul.

Samenstelling van afbeelding

Elke blit-bewerking wordt gedefinieerd door de volgende drie rechthoeken:

  • De doelrechthoek (TargetRect) definieert de regio binnen het doeloppervlak waar de uitvoer wordt weergegeven. De uitvoerafbeelding wordt in deze rechthoek geknipt.
  • De doelrechthoek voor elke stroom (DstRect) definieert waar de invoerstroom wordt weergegeven in de samengestelde afbeelding.
  • De bronrechthoek voor elke stroom (SrcRect) definieert welk deel van de bronafbeelding wordt weergegeven.

De doel- en doelrechthoeken worden opgegeven ten opzichte van het doeloppervlak. De bronrechthoek wordt opgegeven ten opzichte van de bronafbeelding. Alle rechthoeken worden opgegeven in pixels.

diagram met bron-, doel- en doelrechthoeken

De alfa van het videoverwerkingsapparaat combineert de invoerafbeeldingen met behulp van een van de volgende bronnen van alfagegevens:

  • Alfagegevens per pixel uit substromen.
  • Een planaire alfawaarde voor elke videostroom, opgegeven in het lid PlanarAlpha van de DXVA2_VideoSample-structuur .
  • De planaire alfawaarde van de samengestelde afbeelding, die is opgegeven in het alfa-lid van de DXVA2_VideoProcessBltParams structuur. Deze waarde wordt gebruikt om de hele samengestelde afbeelding te combineren met de achtergrondkleur.

Deze sectie bevat een reeks voorbeelden die laten zien hoe het videoverwerkingsapparaat de uitvoerafbeelding maakt.

Voorbeeld 1: Letterboxing

In dit voorbeeld ziet u hoe u de bronafbeelding in een letterbox kunt plaatsen door de doelrechthoek in te stellen op kleiner dan de doelrechthoek. De primaire videostream in dit voorbeeld is een afbeelding van 720 × 480 en moet worden weergegeven met een hoogte-breedteverhouding van 16:9. Het doeloppervlak is 640 × 480 pixels (hoogte-breedteverhouding van 4:3). Als u de juiste hoogte-breedteverhouding wilt bereiken, moet de doelrechthoek 640 × 360 zijn. Voor het gemak bevat dit voorbeeld geen substream. In het volgende diagram ziet u de bron- en doelrechthoeken.

diagram met letterboxing.

In het voorgaande diagram ziet u de volgende rechthoeken:

  • Doelrechthoek: { 0, 0, 640, 480 }

  • Primaire video:

    • Bronrechthoek: { 0, 0, 720, 480 }
    • Doelrechthoek: { 0, 60, 640, 420 }

Het stuurprogramma zal de video deinterlaceren, het gedeinterlaceerde frame verkleinen tot 640 × 360 en het frame in de doelrechthoek splitsen. De doelrechthoek is groter dan de doelrechthoek, dus het stuurprogramma gebruikt de achtergrondkleur om de horizontale balken boven en onder het frame te vullen. De achtergrondkleur wordt opgegeven in de DXVA2_VideoProcessBltParams structuur.

Voorbeeld 2: Substreamafbeeldingen uitrekken

Substreamafbeeldingen kunnen verder gaan dan de primaire videoafbeelding. In dvd-video kan de primaire videostream bijvoorbeeld een hoogte-breedteverhouding van 4:3 hebben terwijl de substream 16:9 is. In dit voorbeeld hebben beide videostreams dezelfde brondimensies (720 × 480), maar de substream is bedoeld om te worden weergegeven met een hoogte-breedteverhouding van 16:9. Om deze hoogte-breedteverhouding te bereiken, wordt de substroomafbeelding horizontaal uitgerekt. De bron- en doelrechthoeken worden weergegeven in het volgende diagram.

diagram met uitrekkende substreamafbeelding.

In het voorgaande diagram ziet u de volgende rechthoeken:

  • Doelrechthoek: { 0, 0, 854, 480 }

  • Primaire video:

    • Bronrechthoek: { 0, 0, 720, 480 }
    • Doelrechthoek: { 0, 107, 474, 480 }
  • Substream:

    • Bronrechthoek: { 0, 0, 720, 480 }
    • Doelrechthoek: { 0, 0, 854, 480 }

Deze waarden behouden de hoogte van de afbeelding en schalen beide afbeeldingen horizontaal. In de regio's waar beide afbeeldingen worden weergegeven, zijn ze alfa gemengd. Waar de substroomafbeelding zich verder uitbreidt dan de primaire video, wordt de substream gecombineerd met de achtergrondkleur. Deze alfamenging is van toepassing op de gewijzigde kleuren aan de rechterkant van het diagram.

Voorbeeld 3: Niet-overeenkomende stroomhoogten

In het vorige voorbeeld hebben de substream en de primaire stroom dezelfde hoogte. Streams kunnen ook niet-overeenkomende hoogten hebben, zoals wordt weergegeven in dit voorbeeld. Gebieden in de doelrechthoek waar geen video wordt weergegeven, worden getekend met behulp van de achtergrondkleur, zwart in dit voorbeeld. De bron- en doelrechthoeken worden weergegeven in het volgende diagram.

diagram met niet-overeenkomende stroomhoogten,

In het voorgaande diagram ziet u de volgende rechthoeken:

  • Doelrechthoek: { 0, 0, 150, 85 }
  • Primaire video:
    • Bronrechthoek: { 0, 0, 150, 50 }
    • Doelrechthoek: { 0, 17, 150, 67 }
  • Substream:
    • Bronrechthoek: { 0, 0, 100, 85 }
    • Doelrechthoek: { 25, 0, 125, 85 }

Voorbeeld 4: Doelrechthoek kleiner dan doeloppervlak

In dit voorbeeld ziet u een geval waarin de doelrechthoek kleiner is dan het doeloppervlak.

diagram met een blit naar een doelrechthoek.

In het voorgaande diagram ziet u de volgende rechthoeken:

  • Doeloppervlak: { 0, 0, 300, 200 }
  • Doelrechthoek: { 0, 0, 150, 85 }
  • Primaire video:
    • Bronrechthoek: { 0, 0, 150, 50 }
    • Doelrechthoek: { 0, 17, 150, 67 }
  • Substream:
    • Bronrechthoek: { 0, 0, 100, 85 }
    • Doelrechthoek: { 25, 0, 125, 85 }

Pixels buiten de doelrechthoek worden niet gewijzigd, zodat de achtergrondkleur alleen binnen de doelrechthoek wordt weergegeven. Het gestippelde gebied geeft gedeelten van het doeloppervlak aan die niet worden beïnvloed door de blit.

Voorbeeld 5: Bronrechthoeken

Als u een bronrechthoek opgeeft die kleiner is dan de bronafbeelding, wordt alleen dat gedeelte van de afbeelding belicht. In dit voorbeeld geven de bronrechthoeken het kwadrant rechtsonder van de primaire videostream en het kwadrant linksonder van de substream op (aangegeven met hashmarkeringen in het diagram). De doelrechthoeken hebben dezelfde grootte als de bronrechthoeken, zodat de video niet wordt uitgerekt. De bron- en doelrechthoeken worden weergegeven in het volgende diagram.

diagram met een blit van twee bronrechthoeken.

In het voorgaande diagram ziet u de volgende rechthoeken:

  • Doelrechthoek: { 0, 0, 720, 576 }
  • Primaire video:
    • Grootte van bronoppervlak: { 0, 0, 720, 480 }
    • Bronrechthoek: { 360, 240, 720, 480 }
    • Doelrechthoek: { 0, 0, 360, 240 }
  • Substream:
    • Grootte van bronoppervlak: { 0, 0, 640, 576 }
    • Bronrechthoek: { 0, 288, 320, 576 }
    • Doelrechthoek: { 400, 0, 720, 288 }

Voorbeeld 6: Doelrechthoeken kruisen

Dit voorbeeld is vergelijkbaar met de vorige, maar de doelrechthoeken snijden elkaar. De oppervlaktedimensies zijn hetzelfde als in het vorige voorbeeld, maar de bron- en doelrechthoeken zijn niet. Ook hier wordt de video bijgesneden, maar niet uitgerekt. De bron- en doelrechthoeken worden weergegeven in het volgende diagram.

diagram met kruisende doelrechthoeken.

In het voorgaande diagram ziet u de volgende rechthoeken:

  • Doelrechthoek: { 0, 0, 720, 576 }
  • Primaire video:
    • Grootte van bronoppervlak: { 0, 0, 720, 480 }
    • Bronrechthoek: { 260, 92, 720, 480 }
    • Doelrechthoek: { 0, 0, 460, 388 }
  • Substream:
    • Grootte van bronoppervlak: { 0, 0, 640, 576 }
    • Bronrechthoek: { 0, 0, 460, 388 }
    • Doelrechthoek: { 260, 188, 720, 576 }

Voorbeeld 7: Video uitrekken en bijsnijden

In dit voorbeeld wordt de video uitgerekt en bijgesneden. Een 180 × 120 regio van elke stroom wordt uitgerekt om een gebied van 360 × 240 in de doelrechthoek te bedekken.

diagram met uitrekken en bijsnijden.

In het voorgaande diagram ziet u de volgende rechthoeken:

  • Doelrechthoek: { 0, 0, 720, 480 }
  • Primaire video:
    • Grootte van bronoppervlak: { 0, 0, 360, 240 }
    • Bronrechthoek: { 180, 120, 360, 240 }
    • Doelrechthoek: { 0, 0, 360, 240 }
  • Substream:
    • Grootte van bronoppervlak: { 0, 0, 360, 240 }
    • Bronrechthoek: { 0, 0, 180, 120 }
    • Doelrechthoek: { 360, 240, 720, 480 }

Voorbeeldvolgorde invoer

De parameter pSamples van de methode VideoProcessBlt is een verwijzing naar een matrix met invoervoorbeelden. Voorbeelden van de primaire videostream worden eerst weergegeven, gevolgd door substreamafbeeldingen in Z-volgorde. Monsters moeten in de matrix worden geplaatst in de volgende volgorde:

  • Voorbeelden voor de primaire videostream worden eerst weergegeven in de matrix, in tijdelijke volgorde. Afhankelijk van de deinterlacemodus kan het stuurprogramma een of meer referentievoorbeelden van de primaire videostream vereisen. De leden NumForwardRefSamples en NumBackwardRefSamples van de DXVA2_VideoProcessorCaps-structuur geven aan hoeveel referentievoorbeelden voor vooruit en achteruit nodig zijn. De beller moet deze referentievoorbeelden opgeven, zelfs als de video-inhoud progressief is en geen deinterlacing vereist. (Dit kan gebeuren wanneer progressieve frames worden gegeven aan een deinterlacing-apparaat, bijvoorbeeld wanneer de bron een combinatie van zowel interlaced als progressieve frames bevat.)
  • Na de voorbeelden voor de primaire videostream kan de matrix maximaal 15 substroomvoorbeelden bevatten, gerangschikt in Z-volgorde, van beneden naar boven. Substromen zijn altijd progressief en vereisen geen referentieafbeeldingen.

Op elk gewenst moment kan de primaire videostream schakelen tussen interlaced en progressieve inhoud, en het aantal substromen kan veranderen.

Het lid SampleFormat.SampleFormat van de DXVA2_VideoSample structuur geeft het type afbeelding aan. Voor substroomafbeeldingen stelt u deze waarde in op DXVA2_SampleSubStream. Voor progressieve afbeeldingen is de waarde DXVA2_SampleProgressiveFrame. Voor interlaced afbeeldingen is de waarde afhankelijk van de veldindeling.

Als het stuurprogramma voorwaartse en achterwaartse referentievoorbeelden vereist, is het volledige aantal steekproeven mogelijk niet beschikbaar aan het begin van de videoreeks. Neem in dat geval vermeldingen voor ze op in de matrix pSamples , maar markeer de ontbrekende voorbeelden als type DXVA2_SampleUnknown.

De begin - en eindleden van de DXVA2_VideoSample structuur geven de tijdelijke locatie van elke steekproef. Deze waarden worden alleen gebruikt voor voorbeelden uit de primaire videostream. Voor substroomafbeeldingen stelt u beide leden in op nul.

De volgende voorbeelden kunnen helpen om deze vereisten te verduidelijken.

Voorbeeld 1

Het eenvoudigste geval treedt op wanneer er geen substromen zijn en het deinterlacing-algoritme geen referentievoorbeelden vereist (NumForwardRefSamples en NumBackwardRefSamples zijn beide nul). Bob deinterlacing is een voorbeeld van een dergelijk algoritme. In dit geval moet de matrix pSamples één invoeroppervlak bevatten, zoals wordt weergegeven in de volgende tabel.

Index Surface-type Tijdelijke locatie
pSamples[0] Gekruiste foto. T

 

De tijdwaarde T wordt verondersteld de begintijd van het huidige videoframe te zijn.

Voorbeeld 2

In dit voorbeeld combineert de toepassing twee substromen met de primaire stream. Voor het deinterlacing-algoritme zijn geen referentievoorbeelden vereist. In de volgende tabel ziet u hoe deze voorbeelden zijn gerangschikt in de matrix pSamples .

Index Surface-type Tijdelijke locatie Z-order (de volgorde waarin grafische objecten over elkaar worden weergegeven)
pSamples[0] Interlaced picture T 0
pSamples[1] Substream 0 1
pSamples[2] Substream 0 2

 

Voorbeeld 3

Stel nu dat voor het deinterlacing-algoritme één voorbeeld met eerdere verwijzingen en één voorbeeld van een voorwaartse verwijzing is vereist. Daarnaast worden er twee substroomafbeeldingen aangeboden voor in totaal vijf oppervlakken. De juiste volgorde wordt weergegeven in de volgende tabel.

Index Surface-type Tijdelijke locatie Z-order (de volgorde waarin grafische objecten over elkaar worden weergegeven)
pSamples[0] Interlaced picture (naslag) T −1 Niet van toepassing
pSamples[1] Interlaced picture T 0
pSamples[2] Interlaced picture (naslag) T +1 Niet van toepassing
pSamples[3] Substream 0 1
pSamples[4] Substream 0 2

 

De tijd T −1 is de begintijd van het frame vóór het huidige frame en T +1 is de begintijd van het volgende frame.

Als de videostream overschakelt naar progressieve inhoud met dezelfde deinterlacingmodus, moet de toepassing hetzelfde aantal voorbeelden opgeven, zoals wordt weergegeven in de volgende tabel.

Index Surface-type Tijdelijke locatie Z-order (de volgorde waarin grafische objecten over elkaar worden weergegeven)
pSamples[0] Progressief beeld (verwijzing) T −1 Niet van toepassing
pSamples[1] Progressief beeld T 0
pSamples[2] Progressief beeld (verwijzing) T +1 Niet van toepassing
pSamples[3] Substream 0 1
pSamples[4] Substream 0 2

 

Voorbeeld 4

Aan het begin van een videoreeks zijn voorbeelden van voorwaartse en achterwaartse verwijzingen mogelijk niet beschikbaar. Als dit gebeurt, worden vermeldingen voor de ontbrekende voorbeelden opgenomen in de matrix pSamples , met het voorbeeldtype DXVA2_SampleUnknown.

Ervan uitgaande dat de deinterlacing-modus één voorbeeld van een voorwaartse en een achterwaartse verwijzing nodig heeft, bevatten de eerste drie aanroepen naar VideoProcessBlt de reeksen invoer die in de volgende drie tabellen worden weergegeven.

Index Surface-type Tijdelijke locatie
pSamples[0] Onbekend 0
pSamples[1] Onbekend 0
pSamples[2] Interlaced picture (naslag) T +1

 

Index Surface-type Tijdelijke locatie
pSamples[0] Onbekend 0
pSamples[1] Interlaced picture T
pSamples[2] Interlaced picture (naslag) T +1

 

Index Surface-type Tijdelijke locatie
pSamples[0] Interlaced picture T −1
pSamples[1] Interlaced picture T
pSamples[2] Interlaced picture (naslag) T +1

 

DirectX Video Acceleration 2.0

voorbeeld van DXVA2_VideoProc