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


Настройка параметров декомбинации

[Функция, связанная с этой страницей, 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 кадров в секунду (fps), видео фактически отрисовывается с частотой 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, а для dwDenominator используйте AvgTimePerFrame. Однако вы также можете проверить некоторые известные частоты кадров:

    Среднее время на кадр Частота кадров (fps) Числитель Знаменатель
    166833 59.94 (NTSC) 60000 1001
    333667 29.97 (NTSC) 30000 1001
    417188 23.97 (NTSC) 24000 1001
    200000 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.
    }
}