Memproses Video

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

Plug-in sampel 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 luminance dikodekan sebagai nilai merah, hijau, dan biru terpisah. Plug-in sampel menghitung rata-rata dari 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