MPEG Kod Çözücü Ön İşleme Dönüştürmeleri

[Bu sayfayla ilişkilendirilen DirectShowözelliği eski bir özelliktir. Yerine MediaPlayer, IMFMediaEngineve Media Foundation 'de Ses/Video Yakalamaalmıştır. Bu özellikler Windows 10 ve Windows 11 için iyileştirilmiştir. Microsoft, mümkün olduğunda, yeni kodun MediaPlayer, IMFMediaEngine ve Media Foundation'da Audio/Video Yakalama kullanmasını, DirectShowyerine kesinlikle önerir. Microsoft, mümkünse yeni API'leri kullanmak için eski API'leri kullanan mevcut kodun yeniden yazılmasını önerir.]

Letterbox ve PanScan

4x3 görüntüsü, görüntünün üst ve alt kısmını doldurarak (Letterbox görüntüsü olarak adlandırılır) veya görüntünün 4x3 bölümünü ayıklayarak (PanScan görüntüsü olarak adlandırılır) oluşturulabilir. Menüler ve alt menü akışları, son video görüntüsünün üzerine eklenir. 16x9 oranlı görüntüler 4x3 anamorfik biçimde depolanır. Anamorfik 4x3 en boy oranı 720x480 kaynak videoyu 16x9 en boy oranına uzatmak özgün 16x9 en boy görüntüsünü oluşturur.

Aşağıda modların her birinin ve bunların vurgularının doğru şekilde nasıl görüntüleneceğine ilişkin bir açıklama yer almaktadır:

  • Geniş Ekran: Kaynak video, çıkış penceresinin en büyük 16:9 alanına gerilmiş. Öne çıkanlar, 16x9 alanının iç kısmına göredir. Siyah çubuklar, 16x9'lık bir alanı korumak için üst ve alt kısımlara veya yanlara eklenmelidir.
  • Pan Taraması: 16x9 video içinden, 4x3 en-boy oranında bir alt pencere ayıklamak için MPEG2 akışında sağlanan yatay kaydırmayı kullanın. 4x3 alt penceresini çıkış istemci penceresinin en büyük 4x3 alanına yerleştirin. Vurgunun koordinatları 4x3 çıkış penceresine göredir ve kaynak 16x9 video ile hiçbir ilişkisi yoktur. Siyah çubuklar, 4x3 alanı korumak için üst ve alt kısımlara veya yanlara eklenmelidir.
  • Letterbox: Çıkış penceresinin en büyük 4x3 alanını hesapla. Siyah çubuklar, 4x3 alanı korumak için üst ve alt kısımlara veya yanlara eklenmelidir. Kaynak anamorfik 4x3 video (16x9 görüntüsünü temsil eder) 4x3 alanının en büyük 16x9 alt penceresine yerleştirilir. 16x9 alanı korumak için alt pencerenin üstüne ve altına siyah çubuklar eklenmelidir. Vurgunun koordinatları 4x3 alanına göredir ve kaynak 16x9 video ile hiçbir ilişkisi yoktur. Bir diskin 16x9 alanının dışında (ancak yine de 4x3 penceresinde) bir vurgu belirtmesi mümkündür. 4x3 video için video, çıkış istemci penceresinin en büyük 4x3 çıkış alanına yerleştirilir. Siyah çubuklar, 4x3 alanı korumak için üst ve alt kısımlara veya yanlara eklenmelidir.

DVD Gezgini ve VMR ile MPEG ön işlemesi

Şu anda kod çözücüye FORMAT_MPEG2_VIDEO medya türü geçirilmiş olup, biçim bloğu MPEG2VIDEOINFO yapısına işaret eder. Çıkış pinlerinde, kod çözücü bir FORMAT_VideoInfo2 medya türü üretir ve bu türün biçim bloğu, VIDEOINFOHEADER2 yapısına işaret eder. Yapının dwReserved alanı dwControls bayrakları olarak yeniden adlandırıldı.

dwControlFlags üyesi artık yeni bitleri içerecek.

Etiket Değer
AMCONTROL_USED 0x00000001
AMCONTROL_PAD_TO_4x3 0x00000002
AMCONTROL_PAD_TO_16x9 0x00000004

 

AMCONTROL_USED, bu yeni bayrakların desteklenip desteklenmediğini test etmek için kullanılır. Kaynak filtresi AMCONTROL_USED bayrağını ayarlamalı ve aşağı akış pininde QueryAccept(MediaType) işleminin başarılı olup olmadığını görmelidir. Reddedilirse AMCONTROL bayrakları kullanılamaz ve dwReserved1 değeri 0 olarak ayarlanmalıdır.

AMCONTROL_PAD_TO_4x3, görüntünün 4x3 alanda doldurulması ve görüntülenmesi gerektiğini gösterir.

AMCONTROL_PAD_TO_16x9, görüntünün 16x9 alanında doldurulması ve görüntülenmesi gerektiğini gösterir.

Kod çözücü, bitleri körü körüne kopyalamalı veya işlemelidir. Kod çözücü, letterbox efekti uyguluyorsa, öncelikle piksel en-boy oranını değiştirmeli, ardından görüntüyü doldurmalı ve ilgili AMCONTROL_* bitlerini kaldırmalıdır.

MPEG2VIDEOINFO.dwFlags artık içeriğin nasıl görüntülenmesi gerektiğini denetlemeye yönelik üç bayrak içerir:

  • AMMPEG2_DoPanScan (0x00000001): Bu bayrak ayarlanırsa, MPEG-2 video kod çözücüsü çıkış görüntüsünü picture_display_extension'daki pan-scan vektörlerine göre kırpmalı ve resim en boy oranını 4x3 olarak değiştirmelidir. VMR bu bayrakla 16x9 örneği almamalıdır. Basit bir uygulama, sol kenarı picture_display_extension görüntü uzaklığıyla eşit olan 540 geniş kaynak bölgeyi göstermek için kaynak dikdörtgeni değiştirebilir.

  • AMMPEG2_LetterboxAnalogOut (0x00000020): Donanım kod çözücü bu akışı bir video çıkışına (genellikle kartta bir SVIDEO bağlayıcısı) gösterdiğinde, 4x3 ekranda 16x9 örneği görüntüleme kurallarını uygulamalıdır.

    Bir yazılım kod çözücüsü (veya VMR'ye gönderilen çıkışı üreten bir donanım kod çözücüsü), görüntüleri işlerken iki seçeneğe sahiptir:

    1. Bu bayrağı yoksayın ve VideoInfoHeader2 içeriğini VMR'ye iletin (AMCONTROL_PAD_TO_4x3 bayrağı örnekteki DVD Navigator tarafından zaten ayarlanmıştır). VMR, AMCONTROL_PAD_TO_4x3 bayrağı ayarlanmış 16x9 video örneği ve 4x3 alt resim akışıyla karşılaşır. Uygulamanın iki akışın çıkış normalleştirilmiş hedef dikdörtgenlerini aynı genişlikte olacak şekilde ayarlaması gerekir.
    2. Anamorfik video akışını, görüntünün üst ve alt kısmına boşluk ekleyerek ve video en boy oranını 4x3 olarak ayarlayarak (yukarıdaki Letterbox açıklamasına bakın) ve AMCONTROL_PAD_TO_4x3 bitini VIDEOINFOHEADER2'dan kaldırarak 4x3 görüntüsüne dönüştürün.

    Video ve alt resim akışlarını karıştıran DirectXVA kod çözücülerinin bu bayrağı işlemesi gerekir. Donanım karıştırılmış alt resmi ölçeklendiremiyorsa, kod çözücü VMR'nin videoyla karışması için ayrı bir alt resim akışı oluşturmalıdır.

  • AMMPEG2_WidescreenAnalogOut (0x00000200): Bir donanım kod çözücüsü bu akışı bir video çıkışına (genellikle kartta bir SVIDEO bağlayıcısı) gösterdiğinde, 16x9 (anamorfik) bir ekran varsaymalıdır.

    Bir yazılım kod çözücüsü (veya VMR'ye gönderilen çıkışı üreten bir donanım kod çözücüsü), anamorfik görüntüyü işlerken iki seçeneğe sahiptir:

    1. Bu bayrağı yoksayın ve VideoInfoHeader2 içeriğini VMR'ye kopyalayın. VMR, AMCONTROL_PAD_TO_16x9 ayarlanmışsa 4x3 görüntüleri 16x9 formatına doldurur.
    2. Çıktı görüntüsünü bir 16x9 görüntüye yastıklayın ve AMCONTROL_PAD_TO_16x9 bitini kaldırın.

Çoğu kod çözücü, giriş pinindeki bir medya değişikliğini algılamak ve VIDEOINFOHEADER2 içeriğini (MPEG2INFOHEADERiçinde yer alan) çıkış pinine kopyalamak için GetMediaType kullanmalıdır. Büyük olasılıkla yalnızca PanScan bitini işleyeceklerdir.

Aşağıdaki örnek kod, VIDEOINFOHEADER2 içeriğinin giriş pininden çıkış pinine nasıl kopyalanmasını gösterir.

#include <dvdmedia.h>
HRESULT CopyMPeg2ToVideoInfoHeader2(CMediaSample* pInSample, CMediaSample* pOutSample)
{
    HRESULT hr = S_OK;
    // Check for a media type on the input sample.
    AM_MEDIA_TYPE* pInType;
    if (pInSample->GetMediaType(&pInType) == S_OK) 
    {
        // Make sure it's an MPEG2 Video format.
        if ((pInType->formattype == FORMAT_MPEG2_VIDEO) &&
            (pInType->cbFormat >= sizeof(MPEG2VIDEOINFO)))
        {
            hr = S_OK; // Initialize hr for the CMediaType constructor.
            CMediaType outType(*pInType, &hr);
            if (FAILED(hr))
            {
                DeleteMediaType( pInType );
                return hr;
            }

            // Set the format type GUID.
            outType.SetFormatType(&FORMAT_VideoInfo2);
                
            // Truncate the format block to include just the VIDEOINFOHEADER part.
            MPEG2VIDEOINFO *pMPeg2Header = (MPEG2VIDEOINFO*)pInType->pbFormat;
            BYTE *pVIH = (BYTE*)&pMPeg2Header->hdr;
            hr = (outType.SetFormat(pVIH, sizeof(VIDEOINFOHEADER2)) ? S_OK : E_OUTOFMEMORY);
            if (SUCCEEDED(hr))
            {
                hr = pOutSample->SetMediaType(&outType);
            }
        } 
        else 
        {
            ASSERT(FALSE); // Not a MPEG2 header.
            hr = VFW_E_INVALIDMEDIATYPE;
        }
        DeleteMediaType( pInType );
    } 

    return hr;
}