DirectShow DirectShow 레퍼런스 인터페이스 IGraphConfig Reconnect   [목차열람] [주소복사] [슬롯비우기]
IGraphConfig::Reconnect
 
Microsoft DirectX 9.0

IGraphConfig::Reconnect

Reconnect 메서드는, 2 개의 핀의 사이의 동적인 재접속을 실행한다.

구문

HRESULT Reconnect(
  IPin *pOutputPin,
  IPin *pInputPin,
  const AM_MEDIA_TYPE *pmtFirstConnection,
  IBaseFilter *pUsingFilter,
  HANDLE hAbortEvent,
  DWORD dwFlags
);

파라미터

pOutputPin

[in] 출력 핀의 포인터. NULL 도 가능. 그 경우,pInputPin 는 NULL 여서는 안 된다.

pInputPin

[in] 입력 핀의 포인터. NULL 도 가능. 그 경우,pOutputPin 는 NULL 여서는 안 된다.

pmtFirstConnection

[in] 재접속의 최초의 핀 접속에 사용하는 미디어 타입을 지정하는 AM_MEDIA_TYPE 구조체의 포인터. 이 인수가 NULL 의 경우, 최초의 접속의 미디어 타입은 한정되지 않는다.

pUsingFilter

[in] 재접속에 사용하는 필터의 포인터 (생략 가능). 필터는 이미 그래프에 포함되지 않으면 안 된다. NULL 도 가능.

hAbortEvent

[in] 이벤트의 핸들. 필터의 데이터 처리 thread의 어느쪽이든으로부터 이 메서드를 호출하는 경우는, 이 인수에, 그 필터가 정지상태태에 바뀌었을 때에 신호 상태가 되는 이벤트의 핸들을 지정해야 한다. 그 이외의 경우, 이 인수는 NULL 로 상관없다. 더 자세한 정보는, 「주의」를 참조할것.

dwFlags

[in] 재접속의 실행 방법을 지정하는 AM_GRAPH_CONFIG_RECONNECT_FLAGS 열거의 플래그의 편성.

반환값

성공했을 경우는 S_OK 를 돌려준다. 그 이외의 경우는, 다음의 몇개의 에러 코드인가, 또는 일람에 나타나지 않은 그 외의 값을 돌려준다.

E_INVALIDARG 무효인 인수. 예를 들어,pInputPinpOutputPin 의 양쪽 모두에 NULL 가 지정되었을 경우 등.
E_NOINTERFACE 입력 핀으로 IPinConnection 가 지원하지 않는다.
VFW_E_CANNOT_CONNECT 필터를 접속할 수 없다.
VFW_E_STATE_CHANGED 필터 상태가 변화했다. 조작을 완료할 수 없다.

주의

출력 핀을 1 개만 지정 하면, 메서드는 이제 한편의 핀을 검색한다. 다만 디폴트에서는,IFilterGraph::AddFilter 메서드로 그래프에 추가한 필터가 발견되면 검색이 실패한다. 이 동작을 오버라이드(override) 하려면 ,IGraphConfig::SetFilterFlags 를 호출해 필터의 AM_FILTER_FLAGS_REMOVABLE 플래그를 설정한다.

재접속 처리는 이하의 스텝에서 실행되어 그 대부분은 이 메서드내에서 처리된다.

  1. 우선, 메서드를 호출하기 전에, 복구성 하려고 하고 있는 패스에 따른 데이터 플로우의 동작을 확실히 정지한다. 호출원이 애플리케이션의 경우, 이것에는 IPinFlowControl::Block 메서드를 호출해야 한다. 애플리케이션은 아니고 필터로부터 호출하는 경우, 데이터 플로우를 필터측에서 내부적으로 제어할 수 있을 가능성이 있다.
  2. 지정하는 출력 핀과 입력 핀에 의해, 재접속의 시점과 종점이 정의된다. 입력 핀은 IPinConnection 인터페이스를 지원 해야 한다. 이러한 핀의 어느쪽이든을 지정하지 않는 (NULL 인수를 건네준다)와 메서드는, 필터 그래프로부터 재접속의 후보가 되는 핀을 검색한다 (입력 핀은 출력 핀으로부터 다운 스트림에, 출력 핀은 입력 핀으로부터 업 스트림에 검색한다).
  3. 메서드가, 필터 그래프를 통해서 보류 상태의 데이터를 인도한다 (내부적으로 IGraphConfig::PushThroughData 를 호출한다).
  4. 그래프에 삽입하는 필터를 지정했을 경우, 그 필터의 입력 핀에 최초의 출력 핀이 접속되어 그 필터의 출력 핀이 마지막 입력 핀에 접속된다. 필터를 지정하지 않았던 경우에는, 출력 핀이 입력 핀에 직접 접속된다. 어느 경우도, 접속의 확립에 필요한 변환 필터가 있으면 삽입된다. 다만, 적절한 플래그를 설정 하면, 이 동작을 오버라이드(override) 할 수 있다 (더 자세한 정보는, 「dwFlags」인수의 설명을 참조할것).
  5. 마지막으로, 새로운 필터가 실행 상태로 전환할 수 있다. 데이터 플로우를 재개하는 것은, 호출원의 책임이다. 호출원이 애플리케이션의 경우, 이것에는, 플래그를 설정하지 않고 IPinFlowControl::Block 를 호출하면 좋다.

필터의 데이터 처리 thread의 어느쪽이든으로부터 이 메서드를 호출하면, 데드 록에 빠지는 위험성이 있다. 이 메서드가 필터 그래프를 잠그기 (위해)때문에,IMediaFilter::Stop 의 호출을 받았을 때, 필터를 정지할 수 없을 가능성이 있다. 이 상황을 피하기 (위해)때문에, 이 메서드는 필터가 제공하는 이벤트 개체의 핸들을 이용한다. 필터는, 그 Stop 메서드의 호출을 받으면 이벤트를 통지해야 한다.

참조

↑TOP