Настройка параметров 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 практически идентичны.
Чтобы получить возможности деинтерлейсинга для видеопотока, выполните следующие действия.
- Заполните структуру 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. Однако можно также проверка для некоторых известных частот кадров:
Среднее время на кадр Частота кадров (кадров/с) Числитель Знаменатель 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.
}
}