Aracılığıyla paylaş


DXVA Video İşleme

DXVA video işleme, sıkıştırılmamış video görüntülerini işlemeye ayrılmış grafik donanımının işlevlerini kapsüller. Video işleme hizmetleri, ayrıştırma ve video karıştırmayı içerir.

Bu konu aşağıdaki bölümleri içerir:

Genel Bakış

Grafik donanımı, sıkıştırılmamış video görüntülerini işlemek için grafik işleme birimini (GPU) kullanabilir. Video işleme cihazı, bu işlevleri kapsülleyen bir yazılım bileşenidir. Uygulamalar aşağıdaki gibi işlevleri gerçekleştirmek için bir video işleme cihazı kullanabilir:

  • Deinterlacing and inverse telecine
  • Video alt akışlarını ana video görüntüsüne karıştırma
  • Renk ayarlama (ProcAmp) ve görüntü filtreleme
  • Görüntü ölçeklendirme
  • Renk alanı dönüştürme
  • Alfa karıştırma

Aşağıdaki diyagramda video işleme işlem hattındaki aşamalar gösterilmektedir. Diyagram gerçek bir uygulamayı göstermek için tasarlanmamıştır. Örneğin, grafik sürücüsü birkaç aşamayı tek bir işlemde birleştirebilir. Bu işlemlerin tümü, video işleme cihazına yapılan tek bir çağrıda gerçekleştirilebilir. Burada gösterilen kirlilik ve ayrıntı filtreleme gibi bazı aşamalar sürücü tarafından desteklenmeyebilir.

dxva video işleme aşamalarını gösteren diyagram.

Video işleme işlem hattına giriş her zaman ana görüntü verilerini içeren bir birincil video akışı içerir. Birincil video akışı, çıkış videosu için kare hızını belirler. Çıkış videosunun her karesi, birincil video akışındaki giriş verilerine göre hesaplanır. Birincil akıştaki pikseller her zaman opaktır ve piksel başına alfa verileri yoktur. Birincil video akışı aşamalı veya geçişli olabilir.

İsteğe bağlı olarak, video işleme işlem hattı en fazla 15 video alt akışı alabilir. Alt akış, kapalı açıklamalı alt yazılar veya DVD alt resimleri gibi yardımcı görüntü verileri içerir. Bu görüntüler birincil video akışı üzerinde görüntülenir ve genellikle kendileri tarafından gösterilmek üzere tasarlanmamıştır. Alt akış resimleri piksel başına alfa verileri içerebilir ve her zaman aşamalı karelerdir. Video işleme cihazı, alt akış görüntülerini birincil video akışındaki geçerli çıkarılmış çerçeveyle alfa-harmanlar.

Bu konunun geri kalanında resim terimi, video işleme cihazına giriş verileri için kullanılır. Resim aşamalı bir çerçeveden, tek bir alandan veya iki araya katılmış alandan oluşabilir. Çıkış her zaman bir çıkarılmış çerçevedir.

Bir video sürücüsü, farklı video işleme özellikleri kümesi sağlamak için birden fazla video işleme cihazı uygulayabilir. Cihazlar GUID ile tanımlanır. Aşağıdaki GUID'ler önceden tanımlanmıştır:

  • DXVA2_VideoProcBobDevice. Bu cihaz, bobinterlacing gerçekleştirir.
  • DXVA2_VideoProcProgressiveDevice. Bu cihaz, videoda yalnızca aşamalı çerçeveler varsa ve aralanmış kareler yoksa kullanılır. (Bazı video içeriği aşamalı ve aralanmış çerçevelerin bir karışımını içerir. Aşamalı cihaz, bu tür "karma" video içeriği için kullanılamaz, çünkü ara çerçeveler için bir ayrıştırma adımı gerekir.)

DXVA video işlemeyi destekleyen her grafik sürücüsünün en az bu iki cihazı uygulaması gerekir. Grafik sürücüsü, sürücüye özgü GUID'ler tarafından tanımlanan başka cihazlar da sağlayabilir. Örneğin, bir sürücü bob deinterlacing'den daha kaliteli çıkış üreten özel bir ayrıştırma algoritması uygulayabilir. Bazı ayrıştırma algoritmaları, birincil akıştan ileri veya geri başvuru resimleri gerektirebilir. Öyleyse, çağıranın bu resimleri bu bölümün ilerleyen bölümlerinde açıklandığı gibi sürücüye doğru sırada sağlaması gerekir.

Ayrıca bir referans yazılım cihazı da sağlanır. Yazılım cihazı hız yerine kalite için iyileştirilmiştir ve gerçek zamanlı video işleme için yeterli olmayabilir. Başvuru yazılımı cihazı guid değerini DXVA2_VideoProcSoftwareDevice kullanır.

Video İşleme Cihazı Oluşturma

DXVA video işlemeyi kullanmadan önce uygulamanın bir video işleme cihazı oluşturması gerekir. Bu bölümün geri kalanında daha ayrıntılı olarak açıklanan adımların kısa bir ana hattı aşağıdadır:

  1. IDirectXVideoProcessorService arabirimine bir işaretçi alın.
  2. Birincil video akışı için video biçiminin açıklamasını oluşturun. Video biçimini destekleyen video işleme cihazlarının listesini almak için bu açıklamayı kullanın. Cihazlar GUID ile tanımlanır.
  3. Belirli bir cihaz için cihaz tarafından desteklenen işleme hedefi biçimlerinin listesini alın. Biçimler , D3DFORMAT değerlerin listesi olarak döndürülür. Alt akışları karıştırmayı planlıyorsanız desteklenen alt akış biçimlerinin listesini de alın.
  4. Her cihazın özelliklerini sorgula.
  5. Video işleme cihazını oluşturun.

Bazen bu adımlardan bazılarını atlayabilirsiniz. Örneğin, işleme hedefi biçimlerinin listesini almak yerine video işleme cihazını tercih ettiğiniz biçimde oluşturmayı deneyebilir ve başarılı olup olmadığını görebilirsiniz. D3DFMT_X8R8G8B8 gibi yaygın bir biçim başarılı olabilir.

Bu bölümün geri kalanında bu adımlar ayrıntılı olarak açıklanmaktadır.

IDirectXVideoProcessorService İşaretçisini Alma

IDirectXVideoProcessorService arabirimi Direct3D cihazından alınır. Bu arabirime yönelik bir işaretçi almanın iki yolu vardır:

Direct3D cihazına yönelik bir işaretçiniz varsa, DXVA2CreateVideoService işlevini çağırarak bir IDirectXVideoProcessorService işaretçisi alabilirsiniz. Cihazın IDirect3DDevice9 arabirimine bir işaretçi geçirin ve aşağıdaki kodda gösterildiği gibi riid parametresi için IID_IDirectXVideoProcessorService belirtin:

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

n bazı durumlarda, bir nesne Direct3D cihazını oluşturur ve ardından Direct3D Cihaz Yöneticisi aracılığıyla diğer nesnelerle paylaşır. Bu durumda, aşağıdaki kodda gösterildiği gibi IDirectXVideoProcessorService işaretçisini almak için cihaz yöneticisinde IDirect3DDeviceManager9::GetVideoService çağrısı yapabilirsiniz:

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

Video İşleme Cihazlarını Numaralandırma

Video işleme cihazlarının listesini almak için DXVA2_VideoDesc bir yapıyı birincil video akışının biçimiyle doldurun ve bu yapıyı IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids yöntemine geçirin. yöntemi, bu video biçimiyle kullanılabilecek her video işleme cihazı için bir GUID dizisi döndürür.

Bir video akışını YUY2 biçiminde işleyen ve SANIYEDE 29,97 kare kare kare hızına sahip YUV renginin BT.709 tanımını kullanan bir uygulama düşünün. Video içeriğinin tamamen aşamalı karelerden oluştuğu varsayılır. Aşağıdaki kod parçası, biçim açıklamasını doldurmayı ve cihaz GUID'lerini almayı gösterir:

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

Bu örneğin kodu DXVA2_VideoProc SDK örneğinden alınmıştır.

Bu örnekteki pGuids dizisi GetVideoProcessorDeviceGuids yöntemi tarafından ayrılmıştır, bu nedenle uygulamanın CoTaskMemFree çağrısı yaparak diziyi boşaltması gerekir. Kalan adımlar, bu yöntem tarafından döndürülen cihaz GUID'lerinden herhangi biri kullanılarak gerçekleştirilebilir.

Render-Target Biçimlerini Numaralandırma

Cihaz tarafından desteklenen işleme hedefi biçimlerinin listesini almak için, aşağıdaki kodda gösterildiği gibi cihaz GUID'sini ve DXVA2_VideoDesc yapısını IDirectXVideoProcessorService::GetVideoProcessorRenderTargets yöntemine geçirin:

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

yöntemi , D3DFORMAT değerlerden oluşan bir dizi döndürür. Giriş türünün YUY2 olduğu bu örnekte, biçimlerin tipik bir listesi D3DFMT_X8R8G8B8 (32 bit RGB) ve D3DMFT_YUY2 (giriş biçimi) olabilir. Ancak, tam liste sürücüye bağlıdır.

Alt akışlar için kullanılabilir biçimlerin listesi, işleme hedefi biçimine ve giriş biçimine bağlı olarak değişebilir. Alt akış biçimlerinin listesini almak için cihaz GUID'sini, biçim yapısını ve işleme hedefi biçimini aşağıdaki kodda gösterildiği gibi IDirectXVideoProcessorService::GetVideoProcessorSubStreamFormats yöntemine geçirin:

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

Bu yöntem başka bir D3DFORMAT değer dizisi döndürür. Tipik alt akış biçimleri AYUV ve AI44'lerdir.

Cihaz Özelliklerini Sorgulama

Belirli bir cihazın özelliklerini almak için cihaz GUID'sini, biçim yapısını ve bir render-target biçimini IDirectXVideoProcessorService::GetVideoProcessorCaps yöntemine geçirin. yöntemi, DXVA2_VideoProcessorCaps bir yapıyı cihaz özellikleriyle doldurur.

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

Cihazı Oluşturma

Video işleme cihazını oluşturmak için IDirectXVideoProcessorService::CreateVideoProcessor çağrısı yapın. Bu yöntemin girişi cihaz GUID'i, biçim açıklaması, işleme hedefi biçimi ve karıştırmayı planladığınız en fazla alt akış sayısıdır. yöntemi, video işleme cihazını temsil eden IDirectXVideoProcessor arabirimine bir işaretçi döndürür.

    // Finally create a video processor device.

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

Video İşlemi Blit

Ana video işleme işlemi, video işleme blit'tir. ( Blit , iki veya daha fazla bit eşlemi tek bir bit eşlem halinde birleştiren herhangi bir işlemdir. Video işleme blit, çıkış çerçevesi oluşturmak için giriş resimlerini birleştirir.) Blit video işleme gerçekleştirmek için IDirectXVideoProcessor::VideoProcessBlt çağrısı yapın. Bu yöntem, video işleme cihazına bir dizi video örneği geçirir. Buna karşılık, video işleme cihazı giriş resimlerini işler ve bir çıkış çerçevesi oluşturur. İşleme, ayrıştırma, renk-alan dönüştürme ve alt akış karıştırmayı içerebilir. Çıkış, arayan tarafından sağlanan bir hedef yüzeye yazılır.

VideoProcessBlt yöntemi aşağıdaki parametreleri alır:

  • pRT , işlenen video çerçevesini alacak bir IDirect3DSurface9 işleme hedef yüzeyine işaret eder.
  • pBltParams , blit parametrelerini belirten bir DXVA2_VideoProcessBltParams yapısına işaret eder.
  • pSamples , DXVA2_VideoSample yapı dizisinin adresidir. Bu yapılar blit için giriş örneklerini içerir.
  • NumSamples , pSamples dizisinin boyutunu verir.
  • Ayrılmış parametresi ayrılmıştır ve NULL olarak ayarlanmalıdır.

pSamples dizisinde çağıranın aşağıdaki giriş örneklerini sağlaması gerekir:

  • Birincil video akışındaki geçerli resim.
  • Ayrıştırma algoritmasının gerektirdiği durumlarda ileri ve geri başvuru resimleri.
  • En fazla 15 alt akış olmak üzere sıfır veya daha fazla alt akış resmi.

Sürücü, Giriş Örneği Sırası'nda açıklandığı gibi bu dizinin belirli bir sırada olmasını bekler.

Blit Parametreleri

DXVA2_VideoProcessBltParams yapısı blit için genel parametreler içerir. En önemli parametreler, yapının aşağıdaki üyelerinde depolanır:

  • TargetFrame , çıkış çerçevesinin sunu zamanıdır. Aşamalı içerik için, bu süre birincil video akışından geçerli kare için başlangıç zamanına eşit olmalıdır. Bu süre, bu giriş örneğinin DXVA2_VideoSample yapısının Başlat üyesinde belirtilir.

    Aralanmış içerik için, iki araya eklenen alanı olan bir çerçeve, iki deinterlaced çıkış çerçevesi oluşturur. İlk çıkış çerçevesinde, sunu zamanı, tıpkı aşamalı içerik gibi birincil video akışındaki geçerli resmin başlangıç zamanına eşit olmalıdır. İkinci çıkış çerçevesinde, başlangıç zamanı birincil video akışındaki geçerli resmin başlangıç saati ile akıştaki bir sonraki resmin başlangıç saati arasındaki orta noktasına eşit olmalıdır. Örneğin, giriş videosu saniyede 25 kare (saniyede 50 alan) ise, çıkış karelerinde aşağıdaki tabloda gösterilen zaman damgaları bulunur. Zaman damgaları 100 nanosaniyelik birimler halinde gösterilir.

    Giriş resmi TargetFrame (1) TargetFrame (2)
    0 0 200000
    400000 0 600000
    800000 800000 1000000
    1200000 1200000 1400000

     

    Araya alınan içerik, araya eklenen alanlar yerine tek alanlardan oluşuyorsa, çıkış süreleri her zaman aşamalı içerikte olduğu gibi giriş süreleriyle eşleşmektedir.

  • TargetRect , hedef yüzey içinde dikdörtgen bir bölge tanımlar. Blit, çıkışı bu bölgeye yazar. Özellikle TargetRect içindeki her piksel değiştirilir ve TargetRect dışındaki hiçbir piksel değiştirilmez. Hedef dikdörtgen, tüm giriş video akışları için sınırlayıcı dikdörtgeni tanımlar. Bu dikdörtgen içindeki tek tek akışların yerleşimi, IDirectXVideoProcessor::VideoProcessBlt'ınpSamples parametresi aracılığıyla denetlenmektedir.

  • BackgroundColor , video görüntüsü görünmeden arka planın rengini verir. Örneğin, 4 x 3 alan (letterboxing) içinde 16 x 9 video görüntüsü görüntülendiğinde, letterboxed bölgeleri arka plan rengiyle görüntülenir. Arka plan rengi yalnızca hedef dikdörtgen içinde (TargetRect) uygulanır. TargetRect dışındaki pikseller değiştirilmez.

  • DestFormat , çıkış videosu için renk alanını açıklar; örneğin bt.709 veya BT.601 rengi ITU-R kullanılır. Bu bilgiler görüntünün görüntülenme şeklini etkileyebilir. Daha fazla bilgi için bkz. Genişletilmiş Renk Bilgileri.

Diğer parametreler , DXVA2_VideoProcessBltParams yapısının başvuru sayfasında açıklanmıştır.

Giriş Örnekleri

IDirectXVideoProcessor::VideoProcessBlt'inpSamples parametresi DXVA2_VideoSample yapı dizisine işaret eder. Bu yapıların her biri, bir giriş örneği ve örneği içeren Direct3D yüzeyine yönelik bir işaretçi hakkında bilgi içerir. Her örnek aşağıdakilerden biridir:

  • Birincil akıştan geçerli resim.
  • Birincil akıştan gelen ve ayrıştırma için kullanılan ileri veya geri başvuru resmi.
  • Alt akış resmi.

Örneklerin dizide gösterilmesi gereken tam sıra daha sonra Giriş Örneği Sırası bölümünde açıklanmıştır.

Çoğu video uygulaması en fazla bir alt akışa ihtiyaç duysa da en fazla 15 alt akış resmi sağlanabilir. Her VideoProcessBlt çağrısıyla alt akış sayısı değişebilir. Alt akış resimleri, DXVA2_VideoSample yapısının SampleFormat.SampleFormat üyesi DXVA2_SampleSubStream eşit olarak ayarlanarak gösterilir. Bu üye, birincil video akışı için giriş videosunu araya alma işlemini açıklar. Daha fazla bilgi için bkz. DXVA2_SampleFormat numaralandırması.

Birincil video akışı için, DXVA2_VideoSample yapısının Başlangıç ve Bitiş üyeleri giriş örneğinin başlangıç ve bitiş saatlerini verir. Sunu zamanı her zaman birincil akıştan hesaplandığından, alt akış resimleri için bu değerleri sıfır olarak ayarlayın. Uygulama, her alt akış resminin ne zaman sunulması gerektiğini izlemek ve uygun zamanda VideoProcessBlt'e göndermekle sorumludur.

İki dikdörtgen, kaynak videonun her akış için nasıl konumlandırılacağını tanımlar:

  • DXVA2_VideoSample yapısının SrcRect üyesi, kaynak resmin bileşik çıktı çerçevesinde görünecek dikdörtgen bir bölgesi olan kaynak dikdörtgeni belirtir. Resmi kırpmak için, bunu çerçeve boyutundan daha küçük bir değere ayarlayın. Aksi takdirde, çerçeve boyutuna eşit olarak ayarlayın.
  • Aynı yapının DstRect üyesi, hedef dikdörtgeni, video çerçevesinin görüntülendiği hedef yüzeyin dikdörtgen bölgesini belirtir.

Sürücü, pikselleri kaynak dikdörtgenden hedef dikdörtgene böler. İki dikdörtgenin farklı boyutları veya en boy oranları olabilir; sürücü görüntüyü gerektiği gibi ölçeklendirir. Ayrıca, her giriş akışı farklı bir ölçeklendirme faktörü kullanabilir. Aslında, çıktı çerçevesinde doğru en boy oranını oluşturmak için ölçeklendirme gerekebilir. Sürücü kaynağın piksel en boy oranını dikkate almaz, bu nedenle kaynak görüntü kare olmayan pikseller kullanıyorsa, doğru hedef dikdörtgeni hesaplamak uygulamaya bağlıdır.

Tercih edilen alt akış biçimleri AYUV ve AI44'lerdir. İkincisi 16 renk içeren paletli bir biçimdir. Palet girişleri, DXVA2_VideoSample yapısının Pal üyesinde belirtilir. (Kaynak video biçiminiz başlangıçta Media Foundation medya türü olarak ifade edilmişse, palet girdileri MF_MT_PALETTE özniteliğinde depolanır.) Paletlenmemiş biçimler için bu diziyi sıfır olarak temizleyin.

Görüntü Oluşturma

Her blit işlemi aşağıdaki üç dikdörtgen tarafından tanımlanır:

  • Hedef dikdörtgen (TargetRect), hedef yüzey içinde çıkışın görüneceği bölgeyi tanımlar. Çıkış görüntüsü bu dikdörtgene kırpılır.
  • Her akışın hedef dikdörtgeni (DstRect), giriş akışının bileşik görüntüde nerede görüneceğini tanımlar.
  • Her akışın (SrcRect) kaynak dikdörtgeni, kaynak görüntünün hangi bölümünün görüneceğini tanımlar.

Hedef ve hedef dikdörtgenler hedef yüzeye göre belirtilir. Kaynak dikdörtgen, kaynak görüntüye göre belirtilir. Tüm dikdörtgenler piksel cinsinden belirtilir.

kaynak, hedef ve hedef dikdörtgenleri gösteren diyagram

Video işleme cihazı alfa, aşağıdaki alfa veri kaynaklarından herhangi birini kullanarak giriş resimlerini harmanlar:

  • Alt akışlardan piksel başına alfa verileri.
  • DXVA2_VideoSample yapısınınPlanarAlpha üyesinde belirtilen her video akışı için planar alfa değeri.
  • DXVA2_VideoProcessBltParams yapısının Alfa üyesinde belirtilen bileşik görüntünün planar alfa değeri. Bu değer, bileşik görüntünün tamamını arka plan rengiyle karıştırmak için kullanılır.

Bu bölümde, video işleme cihazının çıkış görüntüsünü nasıl oluşturduğunu gösteren bir dizi örnek verilmiştir.

Örnek 1: Letterboxing

Bu örnek, hedef dikdörtgeni hedef dikdörtgenden daha küçük olacak şekilde ayarlayarak kaynak görüntünün nasıl letterbox yapılacağını gösterir. Bu örnekteki birincil video akışı 720 × 480 resimdir ve 16:9 en boy oranında görüntülenmesi amaçlanmaktadır. Hedef yüzey 640 × 480 pikseldir (4:3 en boy oranı). Doğru en boy oranını elde etmek için hedef dikdörtgenin 640 × 360 olması gerekir. Kolaylık olması için, bu örnek bir alt akış içermez. Aşağıdaki diyagramda kaynak ve hedef dikdörtgenler gösterilmektedir.

letterboxing'i gösteren diyagram.

Yukarıdaki diyagramda aşağıdaki dikdörtgenler gösterilir:

  • Hedef dikdörtgen: { 0, 0, 640, 480 }

  • Birincil video:

    • Kaynak dikdörtgen: { 0, 0, 720, 480 }
    • Hedef dikdörtgen: { 0, 60, 640, 420 }

Sürücü videonun kodunu keser, çıkarılmış çerçeveyi 640 × 360'a küçültür ve çerçeveyi hedef dikdörtgene böler. Hedef dikdörtgen hedef dikdörtgenden daha büyük olduğundan, sürücü çerçevenin üstündeki ve altındaki yatay çubukları doldurmak için arka plan rengini kullanır. Arka plan rengi DXVA2_VideoProcessBltParams yapısında belirtilir.

Örnek 2: Alt Akış Görüntülerini Esnetme

Alt akış resimleri, birincil video resminin ötesine uzanabilir. Örneğin DVD videoda birincil video akışının en boy oranı 4:3, alt akış ise 16:9 olabilir. Bu örnekte, her iki video akışı da aynı kaynak boyutlara (720 × 480) sahiptir ancak alt akışın 16:9 en boy oranında gösterilmesi amaçlanmıştır. Bu en boy oranını elde etmek için alt akış görüntüsü yatay olarak uzatılır. Kaynak ve hedef dikdörtgenler aşağıdaki diyagramda gösterilmiştir.

alt akış görüntüsünün esnetilmesini gösteren diyagram.

Yukarıdaki diyagramda aşağıdaki dikdörtgenler gösterilir:

  • Hedef dikdörtgen: { 0, 0, 854, 480 }

  • Birincil video:

    • Kaynak dikdörtgen: { 0, 0, 720, 480 }
    • Hedef dikdörtgen: { 0, 107, 474, 480 }
  • Alt Akış:

    • Kaynak dikdörtgen: { 0, 0, 720, 480 }
    • Hedef dikdörtgen: { 0, 0, 854, 480 }

Bu değerler görüntü yüksekliğini korur ve her iki görüntüyü de yatay olarak ölçeklendirir. Her iki görüntünün de göründüğü bölgelerde, alfa karıştırılır. Alt akış resmi birincil videonun ötesine uzanıyorsa, alt akış arka plan rengiyle harmanlanmış alfa şeklindedir. Bu alfa harmanlama, diyagramın sağ tarafındaki değiştirilmiş renkleri hesaplar.

Örnek 3: Eşleşmeyen Akış Yükseklikleri

Önceki örnekte, alt akış ve birincil akış aynı yüksekliktedir. Akışlar, bu örnekte gösterildiği gibi eşleşmeyen yüksekliklere de sahip olabilir. Hedef dikdörtgenin içinde hiçbir videonun görünmediği alanlar, bu örnekte siyah arka plan rengi kullanılarak çizilir. Kaynak ve hedef dikdörtgenler aşağıdaki diyagramda gösterilmiştir.

eşleşmeyen akış yüksekliklerini gösteren diyagram,

Yukarıdaki diyagramda aşağıdaki dikdörtgenler gösterilir:

  • Hedef dikdörtgen: { 0, 0, 150, 85 }
  • Birincil video:
    • Kaynak dikdörtgen: { 0, 0, 150, 50 }
    • Hedef dikdörtgen: { 0, 17, 150, 67 }
  • Alt Akış:
    • Kaynak dikdörtgen: { 0, 0, 100, 85 }
    • Hedef dikdörtgen: { 25, 0, 125, 85 }

Örnek 4: Hedef Dikdörtgen Hedef Yüzeyden Daha Küçük

Bu örnekte hedef dikdörtgenin hedef yüzeyden daha küçük olduğu bir durum gösterilmektedir.

hedef dikdörtgene bir blit gösteren diyagram.

Yukarıdaki diyagramda aşağıdaki dikdörtgenler gösterilir:

  • Hedef yüzey: { 0, 0, 300, 200 }
  • Hedef dikdörtgen: { 0, 0, 150, 85 }
  • Birincil video:
    • Kaynak dikdörtgen: { 0, 0, 150, 50 }
    • Hedef dikdörtgen: { 0, 17, 150, 67 }
  • Alt Akış:
    • Kaynak dikdörtgen: { 0, 0, 100, 85 }
    • Hedef dikdörtgen: { 25, 0, 125, 85 }

Hedef dikdörtgenin dışındaki pikseller değiştirilmez, bu nedenle arka plan rengi yalnızca hedef dikdörtgen içinde görünür. Noktalı alan, hedef yüzeyin yarık tarafından etkilenmeyen kısımlarını gösterir.

Örnek 5: Kaynak Dikdörtgenler

Kaynak resimden daha küçük bir kaynak dikdörtgen belirtirseniz, sürücü resmin yalnızca bu bölümünü yarıklar. Bu örnekte, kaynak dikdörtgenler birincil video akışının sağ alt çeyreğini ve alt akışın sol alt çeyreğini (diyagramdaki karma işaretlerle gösterilir) belirtir. Hedef dikdörtgenler kaynak dikdörtgenlerle aynı boyutlarda olduğundan video uzatılmaz. Kaynak ve hedef dikdörtgenler aşağıdaki diyagramda gösterilmiştir.

iki kaynak dikdörtgenden bir blit gösteren diyagram.

Yukarıdaki diyagramda aşağıdaki dikdörtgenler gösterilir:

  • Hedef dikdörtgen: { 0, 0, 720, 576 }
  • Birincil video:
    • Kaynak yüzey boyutu: { 0, 0, 720, 480 }
    • Kaynak dikdörtgen: { 360, 240, 720, 480 }
    • Hedef dikdörtgen: { 0, 0, 360, 240 }
  • Alt Akış:
    • Kaynak yüzey boyutu: { 0, 0, 640, 576 }
    • Kaynak dikdörtgen: { 0, 288, 320, 576 }
    • Hedef dikdörtgen: { 400, 0, 720, 288 }

Örnek 6: Hedef Dikdörtgenleri Kesiştirme

Bu örnek öncekine benzer, ancak hedef dikdörtgenler kesişmektedir. Yüzey boyutları önceki örnektekiyle aynıdır, ancak kaynak ve hedef dikdörtgenler aynı değildir. Yine video kırpılır ancak uzatılmaz. Kaynak ve hedef dikdörtgenler aşağıdaki diyagramda gösterilmiştir.

kesişen hedef dikdörtgenleri gösteren diyagram.

Yukarıdaki diyagramda aşağıdaki dikdörtgenler gösterilir:

  • Hedef dikdörtgen: { 0, 0, 720, 576 }
  • Birincil video:
    • Kaynak yüzey boyutu: { 0, 0, 720, 480 }
    • Kaynak dikdörtgen: { 260, 92, 720, 480 }
    • Hedef dikdörtgen: { 0, 0, 460, 388 }
  • Alt Akış:
    • Kaynak yüzey boyutu: { 0, 0, 640, 576 }
    • Kaynak dikdörtgen: { 0, 0, 460, 388 }
    • Hedef dikdörtgen: { 260, 188, 720, 576 }

Örnek 7: Video Esnetme ve Kırpma

Bu örnekte video hem uzatılır hem de kırpılır. Her akıştan 180 × 120 bölge, hedef dikdörtgende 360 × 240 alanı kaplayacak şekilde genişletilir.

esnetme ve kırpmayı gösteren diyagram.

Yukarıdaki diyagramda aşağıdaki dikdörtgenler gösterilir:

  • Hedef dikdörtgen: { 0, 0, 720, 480 }
  • Birincil video:
    • Kaynak yüzey boyutu: { 0, 0, 360, 240 }
    • Kaynak dikdörtgen: { 180, 120, 360, 240 }
    • Hedef dikdörtgen: { 0, 0, 360, 240 }
  • Alt Akış:
    • Kaynak yüzey boyutu: { 0, 0, 360, 240 }
    • Kaynak dikdörtgen: { 0, 0, 180, 120 }
    • Hedef dikdörtgen: { 360, 240, 720, 480 }

Giriş Örneği Sırası

VideoProcessBlt yönteminin pSamples parametresi, giriş örnekleri dizisine yönelik bir işaretçidir. Önce birincil video akışından örnekler, ardından Z düzeninde alt akış resimleri görüntülenir. Örnekler diziye aşağıdaki sırayla yerleştirilmelidir:

  • Birincil video akışı örnekleri dizide ilk sırada, zamansal sırada görüntülenir. Ayırma moduna bağlı olarak, sürücü birincil video akışından bir veya daha fazla başvuru örneği gerektirebilir. DXVA2_VideoProcessorCaps yapısının NumForwardRefSamples ve NumBackwardRefSamples üyeleri, kaç ileri ve geri başvuru örneği gerektiğini belirtir. Video içeriği aşamalı olsa ve ayrıştırma gerektirmese bile çağıranın bu başvuru örneklerini sağlaması gerekir. (Bu durum, aşamalı çerçeveler bir ayrıştırma cihazına verildiğinde, örneğin kaynak hem interlaced hem de aşamalı çerçevelerin bir karışımını içerdiğinde ortaya çıkabilir.)
  • Birincil video akışı için örneklerden sonra, dizi en fazla 15 alt akış örneği içerebilir ve aşağıdan üste doğru Z düzeninde düzenlenmiştir. Alt akışlar her zaman aşamalıdır ve başvuru resimleri gerektirmez.

İstediğiniz zaman, birincil video akışı ara ve aşamalı içerik arasında geçiş yapabilir ve alt akış sayısı değişebilir.

DXVA2_VideoSample yapısının SampleFormat.SampleFormat üyesi resmin türünü gösterir. Alt akış resimleri için bu değeri DXVA2_SampleSubStream olarak ayarlayın. Aşamalı resimler için değer DXVA2_SampleProgressiveFrame. Ara resimler için değer, alan düzenine bağlıdır.

Sürücü ileri ve geri başvuru örnekleri gerektiriyorsa, video dizisinin başlangıcında örneklerin tam sayısı kullanılamayabilir. Bu durumda, bunlar için girdileri pSamples dizisine ekleyin, ancak eksik örnekleri tür DXVA2_SampleUnknown olarak işaretleyin.

DXVA2_VideoSample yapısının Başlangıç ve Bitiş üyeleri her örneğin zamansal konumunu verir. Bu değerler yalnızca birincil video akışındaki örnekler için kullanılır. Alt akış resimleri için her iki üyeyi de sıfır olarak ayarlayın.

Aşağıdaki örnekler bu gereksinimlerin netleştirilmesine yardımcı olabilir.

Örnek 1

En basit durum, alt akış olmadığında ve deinterlacing algoritması başvuru örnekleri gerektirmediğinde oluşur (NumForwardRefSamples ve NumBackwardRefSamples her ikisi de sıfırdır). Bob deinterlacing, böyle bir algoritmaya örnektir. Bu durumda, pSamples dizisi aşağıdaki tabloda gösterildiği gibi tek bir giriş yüzeyi içermelidir.

Dizin Surface türü Geçici konum
pSamples[0] Geçişli resim. T

 

T saat değerinin geçerli video çerçevesinin başlangıç saati olduğu varsayılır.

Örnek 2

Bu örnekte, uygulama birincil akışla iki alt akışı karıştırır. Deinterlacing algoritması başvuru örnekleri gerektirmez. Aşağıdaki tabloda bu örneklerin pSamples dizisinde nasıl düzenlendiği gösterilmektedir.

Dizin Surface türü Geçici konum Z düzeni
pSamples[0] Geçişli resim T 0
pSamples[1] Alt Akış 0 1
pSamples[2] Alt Akış 0 2

 

Örnek 3

Şimdi deinterlacing algoritmasının bir geriye dönük başvuru örneği ve bir ileri başvuru örneği gerektirdiğini varsayalım. Ayrıca, toplam beş yüzey için iki alt akış resmi sağlanır. Doğru sıralama aşağıdaki tabloda gösterilmiştir.

Dizin Surface türü Geçici konum Z düzeni
pSamples[0] Ara resim (başvuru) T −1 Uygulanamaz
pSamples[1] Geçişli resim T 0
pSamples[2] Ara resim (başvuru) T +1 Uygulanamaz
pSamples[3] Alt Akış 0 1
pSamples[4] Alt Akış 0 2

 

T −1 saati, geçerli çerçeveden önceki çerçevenin başlangıç zamanıdır ve T +1, aşağıdaki çerçevenin başlangıç saatidir.

Video akışı, aynı ayrıştırma modunu kullanarak aşamalı içeriğe geçerse, uygulamanın aşağıdaki tabloda gösterildiği gibi aynı sayıda örnek sağlaması gerekir.

Dizin Surface türü Geçici konum Z düzeni
pSamples[0] Aşamalı resim (başvuru) T −1 Uygulanamaz
pSamples[1] Aşamalı resim T 0
pSamples[2] Aşamalı resim (başvuru) T +1 Uygulanamaz
pSamples[3] Alt Akış 0 1
pSamples[4] Alt Akış 0 2

 

Örnek 4

Video dizisinin başında ileri ve geri başvuru örnekleri kullanılamayabilir. Bu durumda, eksik örneklerin girişleri pSamples dizisine eklenir ve örnek türü DXVA2_SampleUnknown.

Ayrıştırma modunun bir ileri ve bir geriye doğru başvuru örneğine ihtiyacı olduğunu varsayarsak , VideoProcessBlt'e yapılan ilk üç çağrı aşağıdaki üç tabloda gösterilen giriş dizilerine sahip olur.

Dizin Surface türü Geçici konum
pSamples[0] Bilinmiyor 0
pSamples[1] Bilinmiyor 0
pSamples[2] Ara resim (başvuru) T +1

 

Dizin Surface türü Geçici konum
pSamples[0] Bilinmiyor 0
pSamples[1] Geçişli resim T
pSamples[2] Ara resim (başvuru) T +1

 

Dizin Surface türü Geçici konum
pSamples[0] Geçişli resim T −1
pSamples[1] Geçişli resim T
pSamples[2] Ara resim (başvuru) T +1

 

DirectX Video Hızlandırma 2.0

DXVA2_VideoProc Örneği