비디오 처리

비디오 처리에 대한 세부 정보는 각 형식에 따라 다릅니다. 이 설명서의 범위를 벗어나 이러한 세부 정보를 제공합니다. 일반적으로 플러그 인의 목표는 입력 버퍼의 색 데이터를 변경한 다음 데이터를 출력 버퍼에 복사하는 것입니다.

샘플 플러그 인은 YUV 및 RGB라는 두 가지 유형의 비디오 형식을 처리합니다.

YUV 비디오의 경우 빨간색 및 파란색 정보는 사용자 및 V 값으로 인코딩되고 광도 수준은 Y 값으로 표시됩니다. 녹색 값은 인코딩되며 알고리즘을 사용하여 복구할 수 있습니다. 샘플 플러그 인은 색상 수준에 영향을 주도록 사용자 및 V 값을 변경하기만 하면 됩니다. 각 U 또는 V 바이트의 값은 0에서 255 사이입니다. 플러그 인은 먼저 -128에서 127까지의 범위로 표현되도록 각 값을 조정한 다음 제공된 배율 인수에 따라 값을 조정합니다. 마지막으로 코드는 원래 0에서 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 플러그 인 구현