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

[Функция, связанная с этой страницей, Медиаплеер Windows SDK, является устаревшей функцией. Он был заменен MediaPlayer. MediaPlayer оптимизирован для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует по возможности использовать MediaPlayer вместо пакета SDK для Медиаплеер Windows. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

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

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

Для видео YUV сведения о красном и синем цвете кодируются в значениях you и V, а уровень яркости представлен значением Y; зеленое значение закодировано и может быть восстановлено с помощью алгоритма. Пример подключаемого модуля просто изменяет значения you и 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 для видео