Почему DirectShow перетаскивает ненужные промежуточные фильтры при создании нескольких входных подключений к моему фильтру DirectShow Transform? - PullRequest
1 голос
/ 18 ноября 2011

У меня есть фильтр DirectShow Transform, написанный на Delphi 6 с использованием библиотеки компонентов DSPACK.Это простой аудиомикшер, который создает новый входной контакт при каждом новом подключении.Я говорю просто, потому что, как только его медиаформат установлен, все соединения с его входными или выходными контактами вынуждены соответствовать этому медиа формату.Я строю цепочку фильтров вручную, делая все соединения выводов самостоятельно.Я не использую какие-либо вызовы «интеллектуального рендеринга», если только нет какого-либо способа случайно вызвать это нежелательное поведение (в моем случае).

ПРИМЕЧАНИЕ. Фильтр захвата - это стандартный внешний фильтр DirectShow.к моему заявлению.Мой аудио-фильтр push-источника и простые фильтры аудио-микшера используются как частные, незарегистрированные фильтры и являются внутренними для моего приложения.

У меня странная проблема, которая возникает, только когда я пытаюсь сделать множественный вводсоединения с моим микшером, который действительно принимает их.В настоящее время я пытаюсь подключить и фильтр захвата, и мой пользовательский аудио-фильтр Push Source к моему фильтру микшера.Всякий раз, когда я пытаюсь это сделать, происходит сбой подключения второго фильтра обратного потока.Независимо от того, подключаю ли я сначала фильтр захвата или аудиофильтр с принудительным исходным кодом, сначала соединение второго вышестоящего фильтра всегда терпит неудачу.

Первый тест, который я запустил, был попытаться подключить только фильтр захвата к микшеру.Это работало нормально.

Второй тест, который я запустил, состоял в том, чтобы попытаться подключить только аудио фильтр Push Source к микшеру.Это сработало нормально.

Но как только я попытался сделать то и другое, я получил ошибку "не удалось найти комбинацию промежуточных фильтров".Я провел несколько часов, глубоко копаясь в переговорах по медиа, обращаясь к моему фильтру из построителя графиков, и затем я нашел проблему.По какой-то причине граф фильтра перетаскивает древний кодек Indeo (R) Audio Software в цепочку.

Я обнаружил это, потому что, несмотря на тот факт, что кодек действительно имел формат мультимедиа, который соответствовал моему фильтру в почти во всех отношениях (основной тип, подтип, тип формата, параметры формата волны), онв конце элемента данных pbFormat имелось 2 дополнительных байта, и этого было достаточно, чтобы не пройти тест равно , поскольку этот тест выполняет сравнение между исходной и целевой областями pbFormat путем сравнения значения cbFormat каждого типа мультимедиа,Кодек Indeo имеет значение cbFormat, равное 20, а мой фильтр имеет значение cbFormat, равное 18, что соответствует размеру структуры данных _tWAVEFORMATEX.В некотором смысле хорошо, что Indeo pbFormat имеет такой странный размер, потому что первые 18 байтов из его 20-байтовой области были точно равны области pbFormat поддерживаемого моим типом носителя фильтра микшера.Без этой аномалии я бы никогда не узнал, что в древнем кодеке вводили наркотики. Я удивлен, что он вообще вводит наркотики, поскольку в нем есть известные подвиги и уязвимости.Что больше всего сбивает с толку, так это то, что это происходит на выводе моего микшерного фильтра, а не на одном из входных выводов, и Я еще не сделал ни одного нисходящего соединения при создании моего выводаподключений.

Может кто-нибудь сказать мне, почему DirectShow пытается перетащить в этот кодек, несмотря на тот факт, что форматы мультимедиа для обоих входящих фильтров, фильтра захвата и фильтра Push Source, идентичны и не нужныпромежуточные фильтры вообще, так как они точно соответствуют формату входных контактов моего фильтра микшера?Как я могу решить эту проблему?

Кроме того, я заметил, что даже в приведенных выше тестах на присоединение одного фильтра мой вывод микшера все еще запрашивался для медиаформатов.Почему, как я уже сказал, в этот момент при создании моих контактов я ничего не подключил к выходному контакту моего фильтра микшера?

--------------------------- ОБНОВЛЕНИЕ: 1 ----------------------------

Я узнал, что вы можете полностью избежать поведения «интеллектуального соединения», используя IFilterGraph.ConnectDirect () вместо IGraphBuilder.Connect ().Я переключился на DirectConnect () и оказалось, что входной контакт на моем фильтре микшера возвращается как «уже подключен».Это может быть причиной перетаскивания построителя графиков в фильтр кодеков Indeo.Теперь, когда у меня есть новая диагностическая информация, я исправлю проблему и обновлю этот пост своими результатами.

1 Ответ

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

--------------------------- РАЗРЕШЕНИЕ ---------------- ------------

Основной проблемой всего этого было мое повторное использование входного контакта, который я получил из первого фильтра назначения / нисходящего потока, который я подключил к своему простому фильтру звукового микшера, в верхней части кода моего приложения. Другими словами, мой фильтр работал правильно, но я не получал новый входной контакт с каждым входным фильтром, который я пытался подключить к нему. Как только я начал это делать, процесс соединения работал нормально. Я не знаю, почему код за интерфейсом IGraphBuilder.Connect () пытался добавить фильтр кодеков Indeo, возможно, что-то связанное с попыткой подключения к уже подключенному входному контакту, но это имело место. Для своих нужд я предпочитаю жесткий контроль, который обеспечивает IFilterGraph.ConnectDirect (), поскольку он устраняет любые помехи от интеллектуального кода подключения в IGraphBuilder, но я мог видеть, когда включаются видео фильтры, это может стать полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...