Memproses Video

[Fitur yang terkait dengan halaman ini, Pemutar Media Windows SDK, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer. MediaPlayer telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer alih-alih Pemutar Media Windows SDK, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Detail pemrosesan video bervariasi untuk setiap format; berada di luar cakupan dokumentasi ini untuk memberikan detail ini. Dalam arti umum, tujuan plug-in adalah untuk mengubah data warna di buffer input lalu menyalin data ke buffer output.

Sampel plug-in memproses dua jenis format video: YUV dan RGB.

Untuk video YUV, informasi warna merah dan biru dikodekan dalam nilai Anda dan V dan tingkat luminance diwakili oleh nilai Y; nilai hijau dikodekan dan dapat dipulihkan dengan menggunakan algoritma. Plug-in sampel hanya mengubah nilai Anda dan V untuk memengaruhi tingkat warna. Setiap byte U atau V memiliki nilai antara nol dan 255. Plug-in pertama menyesuaikan setiap nilai yang akan diwakili oleh rentang dari -128 hingga 127, lalu menskalakan nilai dengan faktor skala yang disediakan. Terakhir, kode menyesuaikan nilai lagi untuk rentang nol-ke-255 asli dan menyalin data ke buffer output. Contoh kode berikut memproses video UYVY. Dalam format ini, setiap byte lainnya adalah nilai U atau Y.

while( dwHeight-- )
{
    DWORD x = dwWidth; 

        while( x-- )
        {
        // Scale the U and V bytes to 128.
        // Just copy the Y bytes.
        if( x%2 )
        {
            pbTarget[x] = pbSource[x];
        }
        else
        {
            long temp = (long)((pbSource[x] - 128) * m_fScaleFactor);

            // Truncate if exceeded full scale.
            if (temp > 127)
            temp = 127;
            if (temp < -128)
            temp = -128;

            pbTarget[x] = temp + 128;
        }
    }

    // Move the pointers to the next row.
    pbSource += lStrideIn;
    pbTarget += lStrideOut;
}

Untuk video RGB, informasi warna dan luminans dikodekan sebagai nilai merah, hijau, dan biru terpisah. Plug-in sampel menghitung rata-rata tiga nilai untuk menentukan nilai abu-abu, lalu menyesuaikan setiap nilai warna dengan menggunakan faktor skala yang disediakan. Sekali lagi, nilai harus dinormalisasi untuk rentang -128 hingga 127 sebelum penskalaan. Kode berikut dari Process32Bit menunjukkan proses untuk RGB32:

while( dwHeight-- )
{
    RGBQUAD* pPixelIn = (RGBQUAD*)pbSource;
    RGBQUAD* pPixelOut = (RGBQUAD*)pbTarget;

    for( DWORD x = 0; x < dwWidth; x++ )
    {
    // Get the color bytes.
    long lBlue = (long) pPixelIn[x].rgbBlue;
    long lGreen = (long) pPixelIn[x].rgbGreen;
    long lRed = (long) pPixelIn[x].rgbRed;

    // Compute the average for gray.
    long lAverage = ( lBlue + lGreen + lRed ) / 3;

    // Scale the colors to the average.
    pPixelOut[x].rgbBlue = (BYTE)( ( lBlue - lAverage ) * m_fScaleFactor  + lAverage );
    pPixelOut[x].rgbGreen = (BYTE)( ( lGreen - lAverage ) * m_fScaleFactor  + lAverage );
    pPixelOut[x].rgbRed = (BYTE)( ( lRed - lAverage ) * m_fScaleFactor  + lAverage );
    pPixelOut[x].rgbReserved = pPixelIn[x].rgbReserved;
    }

    // Move the pointers to the next row.
    pbSource += lStrideIn;
    pbTarget += lStrideOut;
}

Untuk informasi selengkapnya tentang format video, lihat situs web FourCC.

Menerapkan Plug-in DSP Video