Обработка видео

Сведения об обработке видео зависят от каждого формата; Эта документация выходит за рамки этой документации для предоставления этих сведений. В общем смысле, цель подключаемого модуля — изменить цветные данные во входном буфере, а затем скопировать данные в выходной буфер.

Пример подключаемого модуля обрабатывает два типа видеоформатов: YUV и RGB.

Для видео YUV сведения о красном и синем цвете кодируются в значениях you и V, а уровень яркости представлен значением Y; зеленое значение закодировано и может быть восстановлено с помощью алгоритма. Пример подключаемого модуля просто изменяет значения, которые вы и V изменяете, чтобы повлиять на уровень цвета. Каждый байт U или V имеет значение от нуля до 255. Подключаемый модуль сначала настраивает каждое значение в диапазоне от –128 до 127, а затем масштабирует значение по указанному коэффициенту масштабирования. Наконец, код снова корректирует значение для исходного диапазона от нуля до 255 и копирует данные в выходной буфер. В следующем примере кода обрабатывается видео UYVY. В этом формате все остальные байты — это значение U или 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;
}

Для RGB-видео сведения о цвете и яркости кодируются в виде отдельных красных, зеленых и синих значений. Пример подключаемого модуля вычисляет среднее из трех значений, чтобы определить значение серого, а затем корректирует каждое значение цвета с помощью предоставленного коэффициента масштабирования. Еще раз перед масштабированием значения должны быть нормализованы для диапазона –128–127. В следующем коде process32Bit показан процесс 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;
}

Дополнительные сведения о форматах видео см. на веб-сайте FourCC.

Реализация подключаемого модуля DSP видео