CMediaType :: IsPartiallySpecified в базовых классах не работает? - PullRequest
0 голосов
/ 04 ноября 2011

Я все еще немного новичок в фильтрах 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;
}

Это не внушает доверия остальным классам. Где-нибудь опубликованы опечатки?

Ответы [ 3 ]

1 голос
/ 04 ноября 2011

Оно должно читаться так, как оно есть, и не должно читаться так, как вы думаете, оно должно читаться.

Partial означает, что основной тип и / или тип формата намеренно опущены.

Вы также будете удивлены, что IsPartiallySpecified почти не используется в DirectShow SDK и зависимом фильтре, и даже если вы его сломаете, все остальное будет работать безупречно. Идея вокруг частично определенных типов медиа заключается в том, чтобы дать подсказку о возможностях фильтра. Это все еще имеет очень ограниченное использование.

Реализация на самом деле не тестирует подтип. Если есть указанный тип формата, тип носителя не считается частичным, даже если подтип - GUID_NULL.

Частичный тип мультимедиа - это что-то вроде основного типа и подтипа, так как входной вывод говорит: «Эй, у меня нет типа носителя, чтобы попробовать, но я думаю, у меня есть идея, как он должен выглядеть примерно». *

0 голосов
/ 29 ноября 2011

Есть еще один момент, который вы упускаете. Чтобы полностью определить тип медиа, вам нужен основной тип и блок формата, но многие аудио фильтры используют FORMAT_WaveFormatEx и полагаются на тег формата волны для определения подтипа, и в этих случаях подтип действительно GUID_NULL, но тип медиа полностью определены.

Вообще говоря, блок форматирования полностью определяет носитель и является достаточным и необходимым. Основной тип и подтип должны были обеспечивать определенную степень обработки данных.

G

0 голосов
/ 25 ноября 2011

Фреймворк DirectShow, как выразился Роман Р., отлично работает. Это один из самых сложных наборов API от Microsoft. Вы должны судить об этом по его производительности. Примеры DirectShow, представленные в Windows SDK, хорошо подобраны и работают.

...