#directshow
#directshow
Вопрос:
Я все еще немного новичок в фильтрах directshow и внимательно изучаю базовые классы. Одна вещь, которая возникла почти сразу, — это базовая реализация CMediaType::IsPartiallySpecified .
Он гласит:
if ((majortype == GUID_NULL) ||
(formattype == GUID_NULL)) {
return TRUE;
} else {
return FALSE;
}
но, конечно, он должен читать:
if ((majortype == GUID_NULL) ||
(subtype == GUID_NULL) ||
(formattype == GUID_NULL)) {
return TRUE;
} else {
return FALSE;
}
Это не внушает доверия остальным классам. Есть ли где-нибудь опубликованные ошибки?
Ответ №1:
Он должен читаться так, как он есть, и он не должен читать так, как вы думаете, что он, безусловно, должен читать.
Partial
означает, что основной тип и / или тип формата намеренно опущены.
Вы также будете удивлены, что IsPartiallySpecified
он почти не используется в DirectShow SDK и зависимом фильтре, и даже если вы его сломаете, остальное все равно будет работать надежно. Идея частично определенных типов носителей заключается в том, чтобы иметь возможность дать подсказку о возможностях фильтрации. Это все еще имеет очень ограниченное применение.
Реализация фактически не проверяет подтип. Если существует указанный тип формата, тип носителя не считается частичным, даже если подтипом является GUID_NULL .
Частичный тип носителя — это что-то вроде основного типа и только подтипа, чтобы входной вывод говорил: «Эй, у меня нет типа носителя, чтобы попробовать, но я думаю, что у меня есть идея, как это должно примерно выглядеть».
Комментарии:
1. Я не удивлен, обнаружив, что он не используется. Меня не особенно интересовала эта функция — я использовал ее как показатель качества базовых классов. Откуда вы взяли эту цитату серым цветом? В битах MSDN, которые я прочитал до сих пор, упоминается, что если какой-либо из mediatype, subtype или format является GUID_NULL, то он является частичным. Комментарий над самой IsPartiallySpecified функцией гласит так: // тип, подтип или тип формата могут быть нулевыми. В любом случае, не стоит зацикливаться на этом, если он не используется 🙂
2. Смотрите «Замечания» в msdn.microsoft.com/en-us/library/windows/desktop /…
3. Спасибо — странно, что они пошли на все эти хлопоты, чтобы написать этот абзац в примечаниях, а не просто протестировать все 3 случая в первую очередь (как, похоже, указывают остальные документы directshow). Вы должны).
Ответ №2:
Структура DirectShow, как выразился Роман Р., работает надежно. Это один из более сложных наборов API от Microsoft. Вы должны судить об этом по его производительности. Образцы DirectShow, представленные в Windows SDK, хорошо подобраны и работают.
Ответ №3:
Есть еще один момент, который вы упускаете. Чтобы полностью определить тип носителя, вам нужен основной тип и блок формата, но многие аудиофильтры используют FORMAT_WaveFormatEx и полагаются на тег формата wave для определения подтипа, и в этих случаях подтип имеет значение GUID_NULL, но тип носителя полностью определен.
Вообще говоря, блок форматирования полностью определяет носитель, и он является как достаточным, так и необходимым. Основной тип и подтип были предназначены для обеспечения некоторой степени универсальной обработки данных.
G