Настройка параметров декомбинации
[Функция, связанная с этой страницей, 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 почти идентичны.
Чтобы получить возможности деинтерлакирования для видеопотока, сделайте следующее:
- Заполните структуру VMR9VideoDesc с описанием видеопотока. Далее приведены сведения о том, как заполнить эту структуру.
- Передайте структуру в метод IVMRDeinterlaceControl9::GetNumberOfDeinterlaceModes. Дважды вызовите метод. Первый вызов возвращает количество режимов деинтерлейсинга, поддерживаемых оборудованием для указанного формата. Выделите массив идентификаторов GUID этого размера и снова вызовите метод, передав адрес массива. Второй вызов заполняет массив идентификаторами GUID. Каждый GUID определяет один режим деинтерлакирования.
- Чтобы получить возможности конкретного режима, вызовите метод 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.
}
}