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

ICaptureGraphBuilder2::RenderStream

RenderStream 메서드는, 소스 필터의 출력 핀을, 옵션으로 중간 필터를 경유해, 싱크 필터에 접속한다.

구문

HRESULT RenderStream(
  const GUID *pCategory,
  const GUID *pType,
  IUnknown *pSource,
  IBaseFilter *pIntermediate,
  IBaseFilter *pSink
);

파라미터

pCategory

[in] 핀 카테고리를 지정하는,핀 프로퍼티 세트AMPROPERTY_PIN_CATEGORY 구조체의 멤버의 포인터. 또는, 카테고리에 관계없이, 임의의 핀을 사용하는 경우는 NULL 를 지정한다. 보통은, 다음의 값을 지정한다.

pType

[in] 출력 핀의 미디어 타입을 지정하는 메이저 타입 GUID 의 포인터. 미디어 타입에 관계없이, 임의의 핀을 사용하는 경우는 NULL 를 지정한다. 지정할 수 있는 값의 일람에 대해서는, 「메이저 타입」을 참조할것.

pSource

[in] 접속의 선두 필터의 포인터인가, 또는 출력 핀의 포인터를 지정한다.

pIntermediate

[in] 압축 필터 등 중간 필터의 IBaseFilter 인터페이스의 포인터. NULL 도 가능.

pSink

[in] 렌더러나 Mux 필터 등, 싱크 필터의 IBaseFilter 인터페이스의 포인터. 값이 NULL 의 경우, 메서드는 디폴트의 렌더러 ( 「주의」를 참조)를 사용한다.

반환값

HRESULT 값을 돌려준다. 가능한 반환값은 다음과 같다.

반환 코드 설명
S_OK 성공.
VFW_S_NOPREVIEWPIN 스마트티필터를 경유해 프리뷰가 렌더링 되었다.
E_FAIL 실패.
E_INVALIDARG 무효인 인수.
E_POINTER NULL 포인터 인수.
VFW_E_NOT_IN_GRAPH 필터가 필터 그래프에 포함되지 않았다. AddFilter 를 호출해, 그래프에 pSource,pIntermediate, 또는 pSink 를 추가하고 있지 않으면 이 에러가 일어난다. SetFiltergraph 를 호출해 그래프를 Capture Graph Builder 에 접속하고 있지 않았던 경우도, 이 에러는 일어난다. 이 경우, Capture Graph Builder 개체는 독자적인 필터 그래프를 자동적으로 생성 한다. 「Capture Graph Builder 에 대하며」를 참조할것.

주의

이 메서드는, 체인의 복수의 필터를 접속해, 스트림을 렌더링 한다.

메서드는,pSourcepIntermediate 에 접속해, 다음에 pIntermediatepSink 에 접속한다. pIntermediate 가 NULL 의 경우, 메서드는 pSource 를 단지 pSink 에 접속한다. pSource,pIntermediate,pSink 로 지정되는 필터는 모두, 반드시 메서드를 호출하기 전에 그래프에 추가해 둘 필요가 있다. 메서드는,인텔리전트 접속을 사용하고 있으므로, 디코더등의 추가 필터가 추가되는 경우가 있다.

pSink 인수가 NULL 의 경우, 메서드는 디폴트 렌더러를 사용하려고 한다. 비디오의 경우는비디오 렌더러를 사용해, 오디오의 경우는 DirectSound 렌더러를 사용한다.

pSource 가 필터의 경우, 메서드는 그 필터의 출력 핀을 검색한다. 그 경우,pCategory 인수와 pType 인수를 사용해 검색을 좁히는 것. 예를 들어, 필터가 프리뷰용과 캡춰용으로 각각 독립한 핀을 가지고 있는 경우는, PIN_CATEGORY_CAPTURE 또는 PIN_CATEGORY_PREVIEW 의 어느쪽이든을 지정할 수 있다. pSource 가 출력 핀의 경우는,pCategorypType 를 NULL 로 설정한다.

모든 경우에 대해, 메서드는 접속되지 않은 핀을 검색한다. 복수의 핀이 지정된 조건에 적합하는 경우, 메서드는 최초로 찾아낸 핀을 사용한다.

DV 캡춰로, 미디어 타입이 MEDIATYPE_Interleaved 로 pSink 인수가 NULL 의 경우, 메서드는 인터리브 된 스트림을 오디오 스트림과 비디오 스트림에 분할해, 그러한 스트림을 양쪽 모두 렌더링 하는 점에 주의 해야 한다.

RenderStream 메서드는, 다음과 같은 캡춰 그래프에 필요한 세세한 처리의 대부분을 실행한다.

스마트티. 일부의 캡춰 필터에는 캡춰 핀은 있지만, 프리뷰 핀이 없다. 프리뷰를 실시하려면 , 캡춰 핀이스마트티필터에 접속되고 있을 필요가 있다. 이 필터는, 데이터를 캡춰 스트림과 프리뷰 스트림의 2 개의 스트림에 분할한다. PIN_CATEGORY_PREVIEW 또는 PIN_CATEGORY_CAPTURE 를 지정 하면, 필요에 따라서, 메서드가 스마트티필터를 삽입한다. 다음에, 메서드는, 스마트티필터상에서 지정된 스트림을 렌더링 한다. 프리뷰 스트림을 렌더링 할 경우에 메서드가 스마트티필터를 사용하는 경우, 메서드는 VFW_S_NOPREVIEWPIN 를 돌려준다.

자막 방송. 이 메서드를 사용해 자막 방송의 캡춰 또는 프리뷰를 실시할 수가 있다. 일부의 캡춰 필터는 수직 동기 간격 (VBI) 데이터를 출력해, 다른 캡춰 필터는 자막 방송 데이터를 출력한다. 어느 경우도, 1 회는 PIN_CATEGORY_VBI 를 사용해, 이제 1 회는 PIN_CATEGORY_CC 를 사용해, 메서드를 2 회 호출한다. 메서드는, VBI 데이터를 자막 방송으로 변환하는데 필요한 모든 필터를 삽입한다. 데이터의 프리뷰를 실시하려면 ,pSink 인수를 NULL 로 설정한다. 데이터를 파일에 캡춰 하려면 , 멀티플렉서 필터의 IBaseFilter 인터페이스 포인터를 사용한다. 같은 그래프로 데이터의 캡춰와 프리뷰를 실시할 수가 있다. 1 번째는 NULL 를 사용해, 2 번째는 멀티플렉서를 사용해 메서드를 호출한다. pIntermediate 인수를 NULL 로 설정한다.

비디오 포트 핀. 비디오 포트 extension (VPE) 비디오 캡춰 하드웨어를 사용하는 필터는, 프리뷰 핀 대신에 비디오 포트 핀 (PIN_CATEGORY_VIDEOPORT)을 갖추고 있다. 프리뷰나 캡춰를 기능시키려면 , 비디오 포트 핀이오버레이 믹서 필터에 접속되고 있을 필요가 있다. 세부는 메서드가 처리한다. PIN_CATEGORY_VIDEOPORT 를 지정할 필요는 없다. PIN_CATEGORY_PREVIEW 또는 PIN_CATEGORY_CAPTURE 를 지정하면, 메서드가 핀을 올바르게 접속한다. 이것과 같게, 일부의 필터는, 비디오 포트 핀 (PIN_CATEGORY_VIDEOPORT_VBI)을 사용해 VBI 데이터를 출력한다. PIN_CATEGORY_VIDEOPORT 의 경우와 같게, 메서드가 세부를 처리한다. PIN_CATEGORY_VIDEOPORT_VBI 를 지정할 필요는 없다.

지원 하는 필터. 캡춰 장치가 Windows Driver Model (WDM) 드라이버를 사용하는 경우, 그래프는,TV 튜너 필터아날로그 비디오 크로스바 필터 등,WDM 비디오 캡춰 필터의 업 스트림에 있는 특정의 필터를 필요로 하는 일이 있다. 이 메서드가 스트림을 올바르게 렌더링 하면, 메서드는, 필요하게 되는 모든 WDM 필터를 그래프에 삽입한다. 메서드는, 캡춰 필터의 입력 핀에 문의해, 입력 핀이 지원 하는 미디어를 판별해, 그러한 미디어를 적합하는 필터에 접속한다.

샘플 코드

일반적인 캡춰 그래프의 경우, 중간 필터를 경유하지 않고, 프리뷰 핀을 디폴트 렌더러에 접속한다.

// 비디오 :
pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, 
    pCaptureFilter, NULL, NULL); 
// 오디오 :
pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Audio, 
    pCaptureFilter, NULL, NULL); 

출력처의 파일 타입에 응해, 캡춰 핀을 Mux 필터 또는 파일 라이터 필터에 접속한다. AVI 파일의 경우는,AVI Mux 필터를 사용한다. ASF 파일의 경우는,WM ASF 라이터 필터를 사용한다. 보통, 이 필터의 포인터는,ICaptureGraphBuilder2::SetOutputFileName 메서드의 ppf 인수로부터 얻어온다.

pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, L"C:\\Example.avi", 
    &ppf, &pSink);
pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
    pCaptureFilter, NULL, ppf);

다른 사용예에 대해서는, 「비디오 캡춰」를 참조할것.

파일 소스. 이 메서드는 파일의 트랜스 코드나 재압축에 사용할 수 있다. 이하의 설명에서는, 파일에는 최대에서도 1 개의 비디오 스트림과 1 개의 오디오 스트림 또는 1 개의 인터리브 스트림이 포함되어 있는 것으로 한다. 그 이외의 조건에서는, 메서드는 올바르게 기능하지 않는다.

파일 소스의 출력 핀은 1 개이므로,pCategorypType 를 NULL 로 설정한다. 1 회는 비디오 스트림을 렌더링 하기 위해서, 이제 1 회는 오디오 스트림을 렌더링 하기 위해서, 합계 2 회 메서드를 호출한다. 최초의 호출에서는, 소스 필터가 파서 필터에 접속되어 파서 필터의 출력 핀안의 1 개가 렌더링 된다. 2 번째의 호출에서는, 파서의 나머지의 출력 핀이 렌더링 된다. 1 개의 스트림을 압축해, 이제 1 개의 스트림을 압축하지 않는 경우는, 반드시 최초의 호출로 압력 필터를 지정하는 것. 메서드는, 압축 타입에 근거해 자동적으로 올바른 스트림을 선택한다.

pBuilder->RenderStream(NULL, NULL, pSrc, pCompressor, pMux);
pBuilder->RenderStream(NULL, NULL, pSrc, NULL, pMux);

자세한 사용예에 대해서는, 「AVI 파일의 재압축」을 참조할것.

참조

↑TOP