Поделиться через


Настройка параметров deinterlace

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

Отрисовщик смешения видео (VMR) поддерживает аппаратное ускорение деинтерлейсинга, что повышает качество отрисовки для видео с чередованием. Конкретные доступные функции зависят от базового оборудования. Приложение может запрашивать возможности деинтерлейсинга оборудования и задавать параметры деинтерлейсинга с помощью интерфейса IVMRDeinterlaceControl (VMR-7) или IVMRDeinterlaceControl9 (VMR-9). Деинтерлаксирование выполняется для каждого потока.

Существует одно важное различие в поведении переплетения между VMR-7 и VMR-9. В системах, где графическое оборудование не поддерживает расширенное деинтерлейсирование, VMR-7 может вернуться к аппаратному наложению и поручить ему использовать деинтерлейс в стиле BOB. В этом случае, хотя VMR сообщает 30 кадров в секунду, видео фактически отрисовывается со значением 60 оборотов в секунду.

За исключением случаев, когда VMR-7 использует аппаратное наложение, деинтерлейсинг выполняется микшером VMR. Для выполнения деинтерлейсинга микшер использует интерфейс драйвера устройства directX Video Acceleration (DXVA) для деинтерлейсинга. Этот DDI не может вызываться приложениями, и приложения не могут заменить функции деинтернтерлейсинга VMR. Однако приложение может выбрать нужный режим деинтерлейсинга, как описано в этом разделе.

Примечание

В этом разделе описываются методы IVMRDeinterlaceControl9 , но версии VMR-7 практически идентичны.

 

Чтобы получить возможности деинтерлейсинга для видеопотока, выполните следующие действия.

  1. Заполните структуру VMR9VideoDesc с описанием видеопотока. Подробные сведения о том, как заполнить эту структуру, приводятся далее.
  2. Передайте структуру в метод IVMRDeinterlaceControl9::GetNumberOfDeinterlaceModes . Вызовите метод дважды. Первый вызов возвращает количество режимов деинтерлейсирования, поддерживаемых оборудованием для указанного формата. Выделите массив идентификаторов GUID этого размера и вызовите метод еще раз, передав адрес массива. Второй вызов заполняет массив идентификаторами GUID. Каждый GUID определяет один режим деинтерлейсинга.
  3. Чтобы получить ограничения определенного режима, вызовите метод IVMRDeinterlaceControl9::GetDeinterlaceModeCaps . Передайте ту же структуру VMR9VideoDesc вместе с одним из GUID из массива. Метод заполняет структуру VMR9DeinterlaceCaps возможностями режима.

Следующий код показывает эти действия.

VMR9VideoDesc VideoDesc; 
DWORD dwNumModes = 0;
// Fill in the VideoDesc structure (not shown).
hr = pDeinterlace->GetNumberOfDeinterlaceModes(&VideoDesc, 
    &dwNumModes, NULL);
if (SUCCEEDED(hr) && (dwNumModes != 0))
{
    // Allocate an array for the GUIDs that identify the modes.
    GUID *pModes = new GUID[dwNumModes];
    if (pModes)
    {
        // Fill the array.
        hr = pDeinterlace->GetNumberOfDeinterlaceModes(&VideoDesc, 
            &dwNumModes, pModes);
        if (SUCCEEDED(hr))
        {
            // Loop through each item and get the capabilities.
            for (int i = 0; i < dwNumModes; i++)
            {
                VMR9DeinterlaceCaps Caps;
                hr = pDeinterlace->GetDeinterlaceModeCaps(pModes + i, 
                    &VideoDesc, &Caps);
                if (SUCCEEDED(hr))
                {
                    // Examine the Caps structure.
                }
            }
        }
        delete [] pModes;
    }
}

Теперь приложение может задать режим деинтерлейсинга для потока, используя следующие методы:

  • Метод SetDeinterlaceMode задает предпочтительный режим. Используйте GUID_NULL, чтобы отключить деинтерлейсинг.
  • Метод SetDeinterlacePrefs определяет поведение, если запрошенный режим недоступен.
  • Метод GetDeinterlaceMode возвращает предпочтительный режим, который вы задали.
  • Метод GetActualDeinterlaceMode возвращает фактический используемый режим, который может быть резервным, если предпочтительный режим недоступен.

Дополнительные сведения см. на страницах справочника по методу.

Использование структуры VMR9VideoDesc

В приведенной выше процедуре первым шагом является заполнение структуры VMR9VideoDesc описанием видеопотока. Начните с получения типа мультимедиа видеопотока. Это можно сделать, вызвав IPin::ConnectionMediaType во входном контакте фильтра VMR. Затем убедитесь, что видеопоток чередуется. Чередование можно выполнять только в форматах VIDEOINFOHEADER2 . Если тип формата FORMAT_VideoInfo, он должен быть прогрессивным кадром. Если тип формата FORMAT_VideoInfo2, проверка поле dwInterlaceFlags для флага AMINTERLACE_IsInterlaced. Наличие этого флага указывает, что видео переплетается.

Предположим, что переменная pBMI является указателем на структуру BITMAPINFOHEADER в блоке формата. Задайте следующие значения в структуре VMR9VideoDesc :

  • dwSize: задайте для этого поля значение sizeof(VMR9VideoDesc).

  • dwSampleWidth: задайте для этого поля значение pBMI->biWidth.

  • dwSampleHeight: задайте для этого поля значение abs(pBMI->biHeight).

  • SampleFormat: в этом поле описываются характеристики чередующегося типа носителя. Проверьте поле dwInterlaceFlags в структуре VIDEOINFOHEADER2 и задайте для SampleFormat значение эквивалентного флага VMR9_SampleFormat . Ниже приведена вспомогательная функция для этого.

  • InputSampleFreq: это поле предоставляет частоту ввода, которую можно вычислить из поля AvgTimePerFrame в структуре VIDEOINFOHEADER2 . В общем случае задайте dwNumerator значение 10000000, а dwDenominatorAvgTimePerFrame. Однако можно также проверка для некоторых известных частот кадров:

    Среднее время на кадр Частота кадров (кадров/с) Числитель Знаменатель
    166833 59.94 (NTSC) 60 000 1001
    333667 29.97 (NTSC) 30 000 1001
    417188 23.97 (NTSC) 24 000 1001
    200 000 50.00 (PAL) 50 1
    400000 25.00 (PAL) 25 1
    416667 24.00 (фильм) 24 1

     

  • OutputFrameFreq: это поле предоставляет частоту вывода, которую можно вычислить на основе значения InputSampleFreq и характеристик чередование входного потока:

    • Задайте для OutputFrameFreq.dwDenominator значение InputSampleFreq.dwDenominator.
    • Если входное видео чередуется, задайте для параметра OutputFrameFreq.dwNumerator значение 2 x InputSampleFreq.dwNumerator. (После деинтерлейсинга частота кадров удвоится.) В противном случае задайте значение InputSampleFreq.dwNumerator.
  • dwFourCC: задайте для этого поля значение pBMI->biCompression.

Следующая вспомогательная функция преобразует флаги AMINTERLACE_X в VMR9_SampleFormat значения:

#define IsInterlaced(x) ((x) & AMINTERLACE_IsInterlaced)
#define IsSingleField(x) ((x) & AMINTERLACE_1FieldPerSample)
#define IsField1First(x) ((x) & AMINTERLACE_Field1First)

VMR9_SampleFormat ConvertInterlaceFlags(DWORD dwInterlaceFlags)
{
    if (IsInterlaced(dwInterlaceFlags)) {
        if (IsSingleField(dwInterlaceFlags)) {
            if (IsField1First(dwInterlaceFlags)) {
                return VMR9_SampleFieldSingleEven;
            }
            else {
                return VMR9_SampleFieldSingleOdd;
            }
        }
        else {
            if (IsField1First(dwInterlaceFlags)) {
                return VMR9_SampleFieldInterleavedEvenFirst;
             }
            else {
                return VMR9_SampleFieldInterleavedOddFirst;
            }
        }
    }
    else {
        return VMR9_SampleProgressiveFrame;  // Not interlaced.
    }
}