2012-08-16 3 views
0

Live DirectShow 필터를 개발 중입니다.DirectShow 라이브 소스 필터 디자인

SDK API를 통해 스트림을 가져올 수있는 H264 스트림 소스가 있습니다.

내 필터에는 스레드에서 들어오는 스트림을 대기열에 넣는 (푸시) 대기열이 있습니다. 내가 확인하는 경우 FillBuffer에서

.... 은 그 때 나는

그래서 내가 스레드 안전 대기열을 (큐에서, 팝업) 필터 FillBuffer 내부 이러한 스트림을 ... 소비 ... 그러나 이것은 몇 가지 문제가 발생 이 들어오는 패킷을하고있는 경우, 공정 논리는 다음과 같이이다 : ...
... 
    bool hasElement = SynchronizedQueue.pop(element); 

    if(!hasElement) 
    { 
     return S_OK 
    } 
    ... 

는 ...이 많은 CPU를 소모 부스트 LIB t을 사용하여

Howewer O 조건 변수 연인의 CPU가하지만 ... 큐에 데이터가없는 경우 언제,이 블록 FillBuffer 기능과 필터를 중지 할 수있다

... 
SynchronizedQueue.waitAndPop(element) ;// which wait until we have some 

..와 잠금기구.

원격 장치에서 입력 스트림을 받아 디코더로 전달하는 라이브 소스 필터의 대안은 무엇입니까? 아니면 내 디자인을 더 좋게 만들 수 있습니까? 더 낮은 CPU와 중단 될 수 있습니까?

답변

0

원본 필터는 푸시 스레드를 소유하므로 출력 핀을 푸시하기 위해 새 프레임을 사용할 수있을 때까지 컨트롤을 생성하기 위해 동기화 개체 (이벤트, 뮤텍스)를 사용하여 대기해야합니다.

SDK에서 프레임을 받아 큐에 넣을 때마다 동기화 개체를 사용하여이 사용 가능 여부를 나타냅니다. 당신은 set an event이 될 것입니다. 작업자 스레드 wlil이 이벤트를보고 프레임 처리를 시작합니다.

작업자 스레드는 적어도 새로운 프레임과 필터/그래프 정지의 두 가지 이벤트에 응답 할 수 있어야합니다. 따라서 복수 evetns를 기다렸다가 처음 깨어 났을 때 WaitForMultipleObjects이 필요합니다.

+0

필터가 중지되었음을 어떻게 감지합니까? 필터 안쪽에 ... – Novalis

+0

글쎄, 그것은 당신의 객체에 대해 호출 된'IBaseFilter :: Stop'입니다. 여러분과 기본 클래스가 이미하고있는 것 이외에 확실히 처리 할 수 ​​있습니다. –