Verarbeiten des Videos

Die Details der Videoverarbeitung variieren je nach Format. Es liegt außerhalb des Bereichs dieser Dokumentation, diese Details zur Verfügung zu stellen. Im Allgemeinen besteht das Ziel des Plug-Ins im Ändern der Farbdaten im Eingabepuffer und anschließenden Kopieren der Daten in den Ausgabepuffer.

Das Beispiel-Plug-In verarbeitet zwei Arten von Videoformaten: YUV und RGB.

Für YUV-Videos werden die Rot- und Blaufarbeninformationen in den You- und V-Werten codiert, und die Leuchtdichteebene wird durch den Y-Wert dargestellt. Der grüne Wert wird codiert und kann mithilfe eines Algorithmus wiederhergestellt werden. Das Beispiel-Plug-In ändert einfach die Werte für Sie und V, um die Farbebene zu beeinflussen. Jedes U- oder V-Byte hat einen Wert zwischen 0 und 255. Das Plug-In passt zuerst jeden Wert so an, dass er durch einen Bereich von -128 bis 127 dargestellt wird, und skaliert dann den Wert um den angegebenen Skalierungsfaktor. Schließlich passt der Code den Wert erneut für den ursprünglichen Null-zu-255-Bereich an und kopiert die Daten in den Ausgabepuffer. Im folgenden Beispielcode wird das UYCLIP-Video verarbeitet. In diesem Format ist jedes andere Byte ein U- oder Y-Wert.

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;
}

Für RGB-Videos werden die Farb- und Leuchtdichteinformationen als separate rote, grüne und blaue Werte codiert. Das Beispiel-Plug-In berechnet den Durchschnitt der drei Werte, um den Wert für Grau zu bestimmen, und passt dann jeden Farbwert mithilfe des angegebenen Skalierungsfaktors an. Auch hier müssen die Werte für den Bereich -128 bis 127 vor der Skalierung normalisiert werden. Der folgende Code aus Process32Bit zeigt den Prozess für 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;
}

Weitere Informationen zu Videoformaten finden Sie auf der FourCC-Website.

Implementieren eines Video-DSP-Plug-Ins