Bagikan melalui


Mengatur Preferensi Deinterlace

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Pengambilan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine , dan Pengambilan Audio/Video di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Video Mixing Renderer (VMR) mendukung deinterlacing yang dipercepat perangkat keras, yang meningkatkan kualitas penyajian untuk video yang saling terkait. Fitur yang tepat yang tersedia tergantung pada perangkat keras yang mendasar. Aplikasi dapat meminta kemampuan deinterlacing perangkat keras dan mengatur preferensi deinterlacing melalui antarmuka IVMRDeinterlaceControl (VMR-7) atau antarmuka IVMRDeinterlaceControl9 (VMR-9). Deinterlacing dilakukan berdasarkan per aliran.

Ada satu perbedaan penting dalam perilaku interlacing antara VMR-7 dan VMR-9. Pada sistem di mana perangkat keras grafis tidak mendukung deinterlacing tingkat lanjut, VMR-7 dapat kembali ke overlay perangkat keras dan menginstruksikannya untuk menggunakan deinterlace gaya BOB. Dalam hal ini, meskipun VMR melaporkan 30fps video sebenarnya sedang dirender pada 60 flip per detik.

Kecuali dalam kasus VMR-7 menggunakan overlay perangkat keras, penundaan dilakukan oleh mixer VMR. Mixer menggunakan DirectX Video Acceleration (DXVA) yang menentukan antarmuka driver perangkat (DDI) untuk melakukan deinterlacing. DDI ini tidak dapat dipanggil oleh aplikasi, dan aplikasi tidak dapat menggantikan fungsionalitas deinterlacing VMR. Namun, aplikasi dapat memilih mode deinterlacing yang diinginkan, seperti yang dijelaskan di bagian ini.

Catatan

Bagian ini menjelaskan metode IVMRDeinterlaceControl9 , tetapi versi VMR-7 hampir identik.

 

Untuk mendapatkan kemampuan deinterlacing untuk streaming video, lakukan hal berikut:

  1. Isi struktur VMR9VideoDesc dengan deskripsi aliran video. Detail cara mengisi struktur ini diberikan nanti.
  2. Teruskan struktur ke metode IVMRDeinterlaceControl9::GetNumberOfDeinterlaceModes . Panggil metode dua kali. Panggilan pertama mengembalikan jumlah mode deinterlace yang didukung perangkat keras untuk format yang ditentukan. Alokasikan array GUID dengan ukuran ini, dan panggil metode lagi, meneruskan alamat array. Panggilan kedua mengisi array dengan GUID. Setiap GUID mengidentifikasi satu mode deinterlacing.
  3. Untuk mendapatkan kapasitas mode tertentu, panggil metode IVMRDeinterlaceControl9::GetDeinterlaceModeCaps . Teruskan struktur VMR9VideoDesc yang sama, bersama dengan salah satu GUID dari array. Metode ini mengisi struktur VMR9DeinterlaceCaps dengan kemampuan mode.

Kode berikut menunjukkan langkah-langkah ini:

VMR9VideoDesc VideoDesc; 
DWORD dwNumModes = 0;
// Fill in the VideoDesc structure (not shown).
hr = pDeinterlace->GetNumberOfDeinterlaceModes(&VideoDesc, 
    &dwNumModes, NULL);
if (SUCCEEDED(hr) && (dwNumModes != 0))
{
    // Allocate an array for the GUIDs that identify the modes.
    GUID *pModes = new GUID[dwNumModes];
    if (pModes)
    {
        // Fill the array.
        hr = pDeinterlace->GetNumberOfDeinterlaceModes(&VideoDesc, 
            &dwNumModes, pModes);
        if (SUCCEEDED(hr))
        {
            // Loop through each item and get the capabilities.
            for (int i = 0; i < dwNumModes; i++)
            {
                VMR9DeinterlaceCaps Caps;
                hr = pDeinterlace->GetDeinterlaceModeCaps(pModes + i, 
                    &VideoDesc, &Caps);
                if (SUCCEEDED(hr))
                {
                    // Examine the Caps structure.
                }
            }
        }
        delete [] pModes;
    }
}

Sekarang aplikasi dapat mengatur mode deinterlacing untuk aliran, menggunakan metode berikut:

  • Metode SetDeinterlaceMode mengatur mode pilihan. Gunakan GUID_NULL untuk menonaktifkan deinterlacing.
  • Metode SetDeinterlacePrefs menentukan perilaku jika mode yang diminta tidak tersedia.
  • Metode GetDeinterlaceMode mengembalikan mode pilihan yang Anda tetapkan.
  • Metode GetActualDeinterlaceMode mengembalikan mode aktual yang digunakan, yang mungkin merupakan mode fallback, jika mode pilihan tidak tersedia.

Halaman referensi metode memberikan informasi lebih lanjut.

Menggunakan Struktur VMR9VideoDesc

Dalam prosedur yang diberikan sebelumnya, langkah pertama adalah mengisi struktur VMR9VideoDesc dengan deskripsi aliran video. Mulailah dengan mendapatkan jenis media aliran video. Anda dapat melakukan ini dengan memanggil IPin::ConnectionMediaType pada pin input filter VMR. Kemudian konfirmasi apakah streaming video terjalin. Hanya format VIDEOINFOHEADER2 yang dapat diselingi. Jika jenis format FORMAT_VideoInfo, jenis tersebut harus berupa bingkai progresif. Jika jenis format FORMAT_VideoInfo2, periksa bidang dwInterlaceFlags untuk bendera AMINTERLACE_IsInterlaced. Kehadiran bendera ini menunjukkan video terjalin.

Asumsikan bahwa variabel pBMI adalah penunjuk ke struktur BITMAPINFOHEADER dalam blok format. Atur nilai berikut dalam struktur VMR9VideoDesc :

  • dwSize: Atur bidang ini ke sizeof(VMR9VideoDesc).

  • dwSampleWidth: Atur bidang ini ke pBMI->biWidth.

  • dwSampleHeight: Atur bidang ini ke abs(pBMI->biHeight).

  • SampleFormat: Bidang ini menjelaskan karakteristik interlace dari jenis media. Periksa bidang dwInterlaceFlags dalam struktur VIDEOINFOHEADER2 , dan atur SampleFormat sama dengan bendera VMR9_SampleFormat yang setara. Fungsi pembantu untuk melakukan ini diberikan di bawah ini.

  • InputSampleFreq: Bidang ini memberikan frekuensi input, yang dapat dihitung dari bidang AvgTimePerFrame dalam struktur VIDEOINFOHEADER2 . Dalam kasus umum, atur dwNumerator ke 10000000, dan atur dwDenominator ke AvgTimePerFrame. Namun, Anda juga dapat memeriksa beberapa kecepatan bingkai terkenal:

    Waktu rata-rata per bingkai Kecepatan bingkai (fps) Pembi numerator Denominator
    166833 59,94 (NTSC) 60000 1001
    333667 29,97 (NTSC) 30000 1001
    417188 23.97 (NTSC) 24000 1001
    200000 50.00 (PAL) 50 1
    400000 25.00 (PAL) 25 1
    416667 24.00 (Film) 24 1

     

  • OutputFrameFreq: Bidang ini memberikan frekuensi output, yang dapat dihitung dari nilai InputSampleFreq dan karakteristik interleaving dari aliran input:

    • Atur OutputFrameFreq.dwDenominator sama dengan InputSampleFreq.dwDenominator.
    • Jika video input diselingi, atur OutputFrameFreq.dwNumerator ke 2 x InputSampleFreq.dwNumerator. (Setelah deinterlacing, kecepatan bingkai dua kali lipat.) Jika tidak, atur nilai ke InputSampleFreq.dwNumerator.
  • dwFourCC: Atur bidang ini ke pBMI->biCompression.

Fungsi pembantu berikut mengonversi bendera AMINTERLACE_X menjadi nilai VMR9_SampleFormat :

#define IsInterlaced(x) ((x) & AMINTERLACE_IsInterlaced)
#define IsSingleField(x) ((x) & AMINTERLACE_1FieldPerSample)
#define IsField1First(x) ((x) & AMINTERLACE_Field1First)

VMR9_SampleFormat ConvertInterlaceFlags(DWORD dwInterlaceFlags)
{
    if (IsInterlaced(dwInterlaceFlags)) {
        if (IsSingleField(dwInterlaceFlags)) {
            if (IsField1First(dwInterlaceFlags)) {
                return VMR9_SampleFieldSingleEven;
            }
            else {
                return VMR9_SampleFieldSingleOdd;
            }
        }
        else {
            if (IsField1First(dwInterlaceFlags)) {
                return VMR9_SampleFieldInterleavedEvenFirst;
             }
            else {
                return VMR9_SampleFieldInterleavedOddFirst;
            }
        }
    }
    else {
        return VMR9_SampleProgressiveFrame;  // Not interlaced.
    }
}