다음을 통해 공유


DirectShow에 대한 고정 정보 캐싱

애플리케이션은 DirectShow IFilterMapper2 인터페이스를 사용하여 특정 조건을 충족하는 필터를 자동으로 검색할 수 있습니다. 이 애플리케이션은 IFilterMapper2 가 반환하는 제안된 필터 목록을 사용하여 텔레비전 신호를 수신하고 렌더링하는 필터를 사용하여 필터 그래프를 자동으로 빌드할 수 있습니다. 지정된 조건을 충족하는 필터를 빠르게 찾기 위해 IFilterMapper2 는 이전에 캐시에 입력한 필터 및 해당 핀에 대한 정보를 사용합니다. 다음 단락의 설명은 이 캐시를 핀 데이터 캐시라고 합니다.

핀 데이터 캐시에 포함된 정보에는 필터가 노출할 수 있는 각 핀에 대한 매체 및 미디어 유형 목록이 포함됩니다. IFilterMapper2 는 이 캐시 정보를 사용하여 가능한 필터가 이미 그래프에 있는 필터의 핀에 연결할 수 있는지 여부를 결정합니다. 이렇게 결정하면 중간 또는 미디어 형식이 일치하지 않으므로 필터에 연결할 수 없도록 필터의 instance 만드는 오버헤드가 제거됩니다. 필터의 핀 데이터 캐시가 최신 상태가 아닌 경우 필터 그래프에서 연결 후보로 필터가 잘못 제거될 수 있습니다.

BDA 미니드라이버가 DirectShow에서 사용하는 핀 데이터 캐시가 최신 상태가 아니라고 판단할 때마다 해당 미니드라이버는 미니드라이버 BDA 구성 요소의 BDA 필터 인스턴스에 대한 핀 정보가 필터 그래프에 정확하게 노출되도록 핀 데이터 캐시를 업데이트해야 합니다. BDA 미니드라이버에서는 다음 시나리오에 설명된 대로 DirectShow의 핀 데이터 캐시를 업데이트합니다.

  • 미니드라이버가 BDA 필터를 사용자 모드에서 DirectShow 필터로 표시하는 방법에 따라 처음 BDA 필터 인스턴스를 만들 때 BDA 미니드라이버가 DirectShow의 핀 데이터 캐시를 업데이트하는 데 필요하지 않을 수도 있습니다. BDA INF(미니드라이버 정보) 파일은 미니드라이버가 BDA 필터를 DirectShow 필터로 표시하는 데 사용하는 메커니즘을 지정합니다.

    BDA 미니드라이버에서는 일반적으로 KS(커널 스트리밍) 프록시 모듈 (Ksproxy.ax)을 사용하여 BDA 필터를 DirectShow 필터로 표시합니다. KS 프록시는 DirectShow의 핀 데이터 캐시를 자동으로 업데이트하여 해당 필터의 인스턴스를 처음 만들 때마다 BDA 필터에 대한 핀 정보를 노출합니다. 따라서 KS 프록시를 사용하는 BDA 미니드라이버가 처음 필터 인스턴스를 만들 때 DirectShow의 핀 데이터 캐시를 업데이트하는 작업을 수행할 필요가 없습니다. BDA 필터가 KS 프록시를 통해 사용자 모드에 노출되는 경우 캐시된 정보에는 필터의 디스패치 루틴 만들기가 반환된 직후 instance 필터에 있는 핀 팩터리에 대한 매체 및 미디어 유형이 자동으로 포함됩니다.

    일부 BDA 미니드라이버에서는 KS 프록시를 사용하여 BDA 필터를 DirectShow 필터로 표시하지 않습니다. 예를 들어 아날로그 텔레비전 신호를 받거나 처리하기 위해 BDA 필터를 구현하는 BDA 수신기 미니드라이버에서는 KSTVTune.ax 또는 KSXBar.ax 모듈을 사용하여 이러한 BDA 필터를 DirectShow 필터로 표시합니다. 이러한 모듈은 표준 KS 프록시 인터페이스 메서드를 사용하여 DirectShow의 핀 데이터 캐시를 업데이트하지 않으므로 이러한 유형의 BDA 필터에 대한 BDA 미니드라이버에서는 해당 미니드라이버가 처음에 필터 인스턴스를 만들 때 DirectShow의 핀 데이터 캐시를 업데이트해야 합니다. 이러한 필터의 인스턴스를 만들 때 DirectShow의 핀 데이터 캐시가 업데이트되도록 하기 위해 BDA 미니드라이버가 필터의 디스패치 루틴 만들기 구현 내에서 BdaInitFilter 함수를 호출한 직후 BdaFilterFactoryUpdateCacheData 함수를 호출합니다. 이 호출에서 미니드라이버가 핀 정보를 전달하여 필터의 모든 초기 핀을 업데이트합니다.

  • 필터의 디스패치 루틴 만들기가 완료된 후 BDA 필터에 핀을 동적으로 만들 수 있습니다. 처음에 만든 BDA 필터 instance BDA 필터의 템플릿 토폴로지(BDA_FILTER_TEMPLATE)에 나열된 모든 핀의 인스턴스를 노출하지 않는 경우 BDA 미니드라이버가 BdaFilterFactoryUpdateCacheData를 호출하여 필터의 템플릿 토폴로지에 나열된 모든 핀에 대한 정보를 강제로 제공해야 합니다.

참고 DirectShow의 핀 데이터 캐시를 업데이트하면 레지스트리를 터치하고 수정하기 때문에 상당한 오버헤드가 발생합니다. 또한 DirectShow의 핀 데이터 캐시를 업데이트하면 DirectShow가 필터 그래프를 자동으로 빌드하는 데 필요한 시간에 영향을 줍니다. 따라서 BDA 미니드라이버가 DirectShow에서 사용하는 핀 데이터 캐시가 최신 상태가 아니라고 판단되는 경우에만 가능한 모든 핀에 대해 BdaFilterFactoryUpdateCacheData 를 호출해야 합니다.

가능한 경우 BDA 미니드라이버는 드라이버, 펌웨어 또는 하드웨어 업데이트가 발생할 때마다 BdaFilterFactoryUpdateCacheData 를 호출해야 합니다.