Нарушен ли CMediaType::частично определенный в базовых классах?

#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