Фильтр DirectShow, который я написал, умирает через 10-24 секунды в видеовстрече Skype - PullRequest
1 голос
/ 03 апреля 2010

Я написал push-фильтр DirectShow для использования со Skype, используя Delphi Pro 6 и библиотеку DSPACK DirectShow. В режиме предварительного просмотра, когда вы тестируете устройство ввода видео в окне настроек видео клиента Skype, мой фильтр работает безупречно. Я могу оставить это в течение многих минут без ошибок.

Однако, когда я начинаю видеозвонок через 10–24 секунды, а не дольше, видеопоток останавливается. Вызов продолжается нормально, счетчик продолжительности звонка отбрасывает секунды, но видеопоток не работает, он застрял в любом кадре, в котором произошла остановка (хотя через некоторое время он становится черным, что, по моему мнению, означает, что Skype отказался от фильтра). Я попытался подключиться к процессу из моего отладчика, установив точку останова, буквально установленную при каждом вызове метода, и ни одна из них не была нажата после того, как произошла остановка. Это как если бы поток, который выполняет вызов DirectShow FillBuffer () к моему фильтру от имени Skype, был мертв или был остановлен.

Я не могу отследить свой фильтр в отладчике, потому что во время звонка Skype я получаю странные вызовы жесткого прерывания отладчика int 1 и int 3, когда идет видеозвонок Skype. Это происходит даже при выбранном стандартном устройстве ввода веб-камеры и моем фильтре DirectShow, полностью незарегистрированном как сервер ActiveX. Я подозреваю, что это может быть какой-то «анти-отладочный» код, поскольку он не происходит в режиме предварительного просмотра видеовхода. В любом случае, именно поэтому мне пришлось подключиться к процессу после факта, чтобы узнать, вызывается ли мой вызываемый метод FillBuffer (), и вместо этого обнаружил, что он кажется мертвым.

Обратите внимание, что фильтр DirectShow моей простой ванильной USB веб-камеры не демонстрирует замораживание и прекрасно работает в течение многих минут. В моем фильтре есть что-то, что Skype не нравится. Я пробовал операторы Sleep () с разными интервалами, никаких операторов Sleep, практически ничего не делая в вызове FillBuffer (). Ничего не помогает.

Если у кого-нибудь есть идеи о том, кто может быть виновником, я бы хотел знать.

Спасибо, Роберт

Ответы [ 2 ]

1 голос
/ 17 апреля 2010

Взаимная блокировка - распространенная проблема в DirectShow, и, похоже, именно это и происходит. Вы сказали, что можете прикрепить отладчик к своему процессу после его зависания? Если вы взломаете его в этот момент, где находятся нити? Если какой-либо поток имеет ваш код в стеке, то это может дать вам подсказку о том, что происходит, даже если он на самом деле застрял в коде DirectShow.

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

0 голосов
/ 03 апреля 2010

Как всегда, вы можете начать с разделения вашего кода компонента.

Включайте их снова, один за другим, пока не нажмете код ошибки.

Попробуйте изолировать проблемную область.Попробуйте юнит-тесты.

Возможно, у вас утечка памяти или побочный эффект в коде, который требует устранения.

Удачи.

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