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.
Topik terkait