2011-10-20 1 views
0

직접 쇼 변환 필터에 타사 비디오 디코더 라이브러리를 래핑하는 작업이 있습니다. 비동기 변환을 사용하여 DirectShow 변환 필터를 작성할 수 있습니까?

나는 제 3 자 라이브러리는 비동기 콜백을 사용하기 때문에 전체 프레임이 준비가되었을 때 나는 순수 가상 CTransformFilter.Transform 기능을 볼 때

// on main thread 
lib->RegisterCallback(callback function) 
lib->write(raw data bytes) 

void callback(frame) 
{ 
    // here is your frame (on a worker thread) 
} 

이가 기대 즉,이 문제가 될 것입니다 생각 동기가되도록 변환하십시오. 이제 콜백에 설정된 이벤트에서 차단되도록 설정할 수 있지만 변환 기능으로 들어오는 데이터가 완전히 새로운 프레임을 생성하기에 충분하지 않은 경우 어떻게됩니까? 나는 그 기능을 교착 상태로 만들 것이다.

도서관 개발자에게 가서 동기식 디코더를 요청하는 유일한 방법은 무엇입니까?

CTransformFilter Receive 기능을 살펴 보았습니다. 이것이 (재정의 된) Transform 함수를 호출하는 것입니다. 그런 다음 m_pOutput-> m_pInputPin-> Receive (pOutSample)를 호출하여 샘플을 전달합니다. 콜백의 작업자 스레드에서이 수신 함수를 호출 할 수 있습니까? 아니면 동일한 스레드에서 모든 것을 유지해야합니까?

감사합니다.

답변

1

원하는 것을 얻을 수 있습니다. 필터는 동일한 스레드 및/또는 입력 미디어 샘플을 수신하는 호출 내에서 미디어 샘플을 출력하는 데 필요하지 않습니다. 그러나 CTransformFilter은 이러한 가정을 염두에두고 작성되었습니다.

그래서 기본적 간단한 선택 사항은 다음과 같습니다

  • 단계 다시 CTransformFilter에서와 [작업자 스레드의] 콜백 호출
  • 대기 내에서 Transform 기능에서 출력 용지 샘플 전달을 구현하기 위해 상속하기 위해 조상을 사용하여 비동기 완료 (내부 라이브러리가 여전히 1 입력 프레임에 대해 1 출력 프레임을 디코딩하는 경우 의미가 있음) 출력을 따라 잡습니다. 당신은 또한 일시 중지 요청을 기다려야하고 실행을 막지 않기 위해 대기를 중단해야합니다.
+0

고마워, 그것은 좋은 소식입니다. 두 번째 선택 (및 내 원래 질문)이 효과가 있다고 생각하지 않는 이유는 입력 샘플에 새 프레임을 생성하기에 충분한 데이터가 포함되어 있는지 (또는 여러 프레임에 대해 충분한 데이터가 포함되어 있는지) 확실하지 않다는 것입니다. 각 샘플이 다음 프레임과 일치해야한다는 변환 필터의 입력에 대한 규정이 있습니까? –