У меня возникла странная проблема при разработке моего приложения DirectShow. Я использую Delphi 6 с библиотекой компонентов DSPACK DirectShow. Один из экземпляров IBaseFilter, похоже, не распознает контакт, который ему принадлежит, когда я пытаюсь найти контакт в фильтре, используя его свойство TPinInfo.achName (_PinInfo). (Обратите внимание, что в этом случае это IBaseFilter, созданный компонентом TSampleGrabber, который демонстрирует это странное поведение).Не удается найти PIN-код в DirectShow по имени/ID, несмотря на то, что он был ID, возвращаемым QueryPinInfo
Последовательность событий, инкапсулированных в примере кода ниже заключается в следующем:
- Найти первый доступный входной контакт в экземпляре IBaseFilter. В приведенном ниже коде это вывод, переданный testPinInfo().
- Выполнение QueryPinInfo() на возвращаемом значке, чтобы получить эту информацию. Возвращенная информация показывает, что имя_шнука является «входом».
- Попробуйте найти булавку с именем «Input» в том же экземпляре IBaseFilter, используя IBaseFilter.findPin().
- Получить NIL, указывающий, что контакт не найден с этим именем. Это, на мой взгляд, действительно странное условие (ошибка).
Кто-нибудь знает, какие условия могут вызвать этот сценарий? Я не думаю, что это проблема с повреждением памяти, потому что связанные структуры данных выглядят отлично, когда я проверяю их в отладчике. Возможно ли, что некоторые реализации IBaseFilter пренебрегают внедрением метода FindPin()?
Вот код ниже:
procedure testPinInfo(intfInputPin: IPin);
var
intfTestPin: IPin;
pinInfo_input: TPinInfo;
begin
intfTestPin := nil;
// Get the pin information.
ZeroMemory(@pinInfo_input, SizeOf(pinInfo_input));
intfInputPin.QueryPinInfo(pinInfo_input);
// Now immediately turn around and try to find the pin in the filter that
// owns it, using the name found in pinInfo_input
pinInfo_input.pFilter.FindPin(pinInfo_input.achName, intfTestPin);
// >>> intfTestPin is NIL (unassigned). This is an error.
end;