DVD 필터 그래프 빌드

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

DirectShow 애플리케이션과 마찬가지로 DVD 재생 애플리케이션은 필터 그래프를 빌드하여 시작합니다. DirectShow는 DVD 재생을 위해 다음과 같은 구성 요소를 제공합니다.

DVD 재생에는 MPEG-2 디코더도 필요합니다. 하드웨어 및 소프트웨어 MPEG-2 디코더는 타사에서 사용할 수 있습니다. 먼저 DVD Graph Builder 개체의 instance 만듭니다.

IDvdGraphBuilder *pBuild = NULL;
hr = CoCreateInstance(CLSID_DvdGraphBuilder, NULL, 
    CLSCTX_INPROC_SERVER, IID_IDvdGraphBuilder, (void **)&pBuild);

이 시점에서 나머지 그래프를 빌드하기 전에 비디오 렌더러를 선택하고 구성할 수 있습니다. 선택 사항인 이 단계는 다음 섹션에서 자세히 설명합니다. 이 단계를 생략하면 DVD Graph Builder가 기본 렌더러를 선택합니다. 다음으로, IDvdGraphBuilder::RenderDvdVideoVolume 메서드를 호출하여 그래프를 빌드합니다.

AM_DVD_RENDERSTATUS buildStatus;
hr = pBuild->RenderDvdVideoVolume(L"Z:\\video_ts", 0, &buildStatus);

첫 번째 매개 변수는 DVD 파일이 포함된 디렉터리의 이름입니다. DVD 디스크에서 이러한 파일은 VIDEO_TS 디렉터리에 있습니다. 첫 번째 매개 변수가 NULL인 경우 DVD Graph Builder는 DVD 볼륨이 포함된 첫 번째 드라이브를 사용합니다.

두 번째 매개 변수에는 디코더 유형(하드웨어 또는 소프트웨어) 및 기타 옵션을 선택하기 위한 다양한 선택적 플래그가 포함되어 있습니다.

세 번째 매개 변수는 상태 정보를 수신하는 AM_DVD_RENDERSTATUS 구조체입니다. RenderDvdVideoVolume 메서드가 S_FALSE 반환하는 경우 호출이 부분적으로 성공했거나 비관론자인 경우 부분적으로 실패했음을 의미합니다. 예를 들어 다른 스트림이 성공적으로 렌더링되더라도 메서드가 하위픽처 스트림을 렌더링하지 못할 수 있습니다. RenderDvdVideoVolume 메서드가 오류 코드 또는 S_FALSE 값을 반환하는 경우 오류에 대한 자세한 내용은 AM_DVD_RENDERSTATUS 구조를 검사할 수 있습니다.

다음으로, IDvdGraphBuilder::GetFiltergraph를 호출하여 필터 그래프 관리자에 대한 포인터를 가져옵니다. 이 메서드는 Filter Graph Manager의 IGraphBuilder 인터페이스에 대한 포인터를 반환합니다.

IGraphBuilder *pGraph = NULL;
hr =  pBuild->GetFiltergraph(&m_pGraph);

IDvdGraphBuilder::GetDvdInterface 메서드를 사용하여 다음을 포함하여 DVD 관련 인터페이스를 검색합니다.

  • IDvdControl2. 재생 및 DVD 명령을 제어합니다.
  • IDvdInfo2. DVD 탐색기 현재 상태에 대한 정보를 반환합니다.
  • IAMLine21Decoder. 컨트롤은 닫힌 캡션 표시합니다. 닫힌 캡션 디스플레이는 기본적으로 사용하도록 설정됩니다. 사용하지 않도록 설정하려면 AM_L21_CCSTATE_Off 플래그를 사용하여 IAMLine21Decoder::SetServiceState 를 호출합니다.
  • IBasicAudio. 오디오 볼륨 및 균형을 제어합니다.

예를 들어 다음 코드는 IDvdControl2 인터페이스를 반환합니다.

IDvdControl2 *pDvdControl = NULL;
hr = pBuild->GetDvdInterface(IID_IDvdControl2, (void**)&pDvdControl);

DVD 재생 필터 그래프를 빌드하는 권장 방법은 DVD Graph Builder 개체가 자동으로 수행되도록 하는 것입니다. 이 방법은 아래와 DVD 샘플 애플리케이션에서 설명합니다. DVD 필터 그래프를 수동으로 빌드해야 하는 경우 DirectShow 설명서의 다른 곳에서 설명한 그래프 빌드의 기본 규칙을 따라 수행할 수 있습니다. 일반적으로 DVD Graph Builder에서 만든 그래프에서 개별 필터를 수동으로 추가, 제거, 연결 또는 연결 해제하면 안 됩니다. 이렇게 하면 정리 코드가 혼동될 수 있기 때문입니다.

Video Renderer 구성

DirectShow는 여러 비디오 렌더러 필터를 제공합니다. 그래프를 빌드하기 전에 원하는 비디오 렌더러를 선택할 수 있습니다. IDvdGraphBuilder::GetDvdInterface를 호출하고 해당 렌더러와 관련된 인터페이스를 요청하여 렌더러를 선택합니다.

필터 그래프를 빌드하기 전에 이러한 인터페이스를 요청하면 DVD Graph Builder에서 해당 비디오 렌더러를 만듭니다. 나중에 그래프를 빌드할 때 DVD Graph Builder가 해당 렌더러를 사용하려고 합니다. 그러나 선택한 렌더러를 사용하여 그래프를 빌드할 수 없는 경우 다른 렌더러로 전환할 수 있습니다. 예를 들어 MPEG-2 디코더가 VMR 필터와 호환되지 않을 수 있습니다. 이 경우 DVD Graph Builder는 기본적으로 오버레이 믹서로 설정됩니다.

또한 이러한 인터페이스를 사용하면 렌더러가 디코더에 연결되기 전에 렌더러를 구성할 수 있습니다. 예를 들어 기본 창 모드 대신 창 없는 모드를 사용하도록 VMR을 설정할 수 있습니다. 비디오 렌더러에 대한 자세한 내용은 DirectShow의 비디오 렌더링 정보 항목을 참조하세요.

Windows XP 이상에서 DVD Graph Builder는 다음을 수행하지 않는 한 항상 비디오 혼합 렌더러 7 (VMR-7)을 사용합니다.

  • 호출자 쿼리 인터페이스는 IMixerPinConfig2와 같은 오버레이 믹서만 발견했습니다. 그러면 애플리케이션이 VMR이 아닌 오버레이 믹서 사용하려는 힌트를 DVD Graph Builder에 보냅니다. Windows 미디어 플레이어 오버레이 믹서의 사용을 강제하는 대화 상자 옵션도 있습니다.
  • 설치된 디코더는 VMR과 호환되지 않습니다. 그래프를 빌드하는 동안 새 IAMDecoderCaps 인터페이스는 디코더의 VMR 지원을 위해 검사 데 사용됩니다. 이 항목이 없으면 DVD Graph Builder는 오버레이 믹서 를 사용합니다.
  • 하드웨어 디코더를 사용하는 동안 디코더는 VPM( 비디오 포트 관리자 )에 연결할 수 없습니다. 하드웨어 디코더가 VPM을 사용할 수 없는 경우 VMR을 사용할 수 없으므로 DVD Graph Builder는 오버레이 믹서로 그래프를 빌드하려고 합니다.
  • 디스플레이 카드 VMR을 지원하기 위한 리소스 및/또는 기능이 부족한 것으로 알려져 있지만 드라이버에서 이를 올바르게 보고하지는 않습니다. (알려진 일부 사례는 DVD Graph Builder에서 특별히 제외됩니다.)
  • 디코더와 VMR 간의 연결은 어떤 이유로든 실패합니다. 일반적으로 필요한 표면을 만드는 VRAM이 없기 때문입니다. 이러한 경우 DVD Graph Builder는 VMR 사용을 끄고 오버레이 믹서 를 사용하여 그래프를 작성하려고 합니다.

창 모드

창 모드(오버레이 믹서 또는 VMR)에서 렌더러는 자체 비디오 창을 만듭니다. 이 창을 애플리케이션 창의 자식으로 만들려면 애플리케이션에 대한 핸들 을 사용하여 IVideoWindow::p ut_Owner 를 호출합니다. 또한 IVideoWindow::p ut_WindowStyle 을 호출하여 렌더러의 비디오 창에서 WS_CHILD 및 WS_CLIPSIBLINGS 스타일을 설정합니다. 렌더러의 비디오 창에서 마우스 메시지를 얻으려면 애플리케이션 창에 대한 핸들 을 사용하여 IVideoWindow::p ut_MessageDrain 을 호출합니다. 이 메서드는 "메시지 드레이닝"을 설정합니다. 비디오 창은 수신한 마우스 메시지를 메시지 드레이닝 창으로 전달합니다.

pVideoWindow->put_Owner((OAHWND)hwnd);
pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
pVideoWindow->put_MessageDrain((OAHWND)hwnd) ;

메시지 드레이닝으로 인해 DVD 메뉴 단추를 선택하는 것이 다소 복잡해집니다. 비디오 창이 애플리케이션의 전체 클라이언트 영역을 채우지 않는다고 가정하면 일부 마우스 이벤트가 비디오 창 밖으로 떨어집니다. 비디오 창 내에서 마우스 이벤트가 발생하면 DVD 메뉴 탐색을 위해 처리해야 합니다. 비디오 창 외부 의 마우스 이벤트는 처리하면 안 됩니다. 메시지 드레인을 사용하면 둘을 구분할 방법이 없습니다. 또한 비디오 창의 마우스 이벤트에 대한 좌표는 비디오 창의 클라이언트 영역을 기준으로 합니다. 하지만 비디오 창 외부의 마우스 이벤트는 애플리케이션의 클라이언트 영역을 기준으로 합니다.

창 없는 모드

창 없는 모드는 마우스 메시지의 문제를 완전히 방지합니다. VMR(또는 EVR)이 창 없는 모드에서 자체 창을 만들지 않으므로 메시지 드레이닝이 필요하지 않습니다. 대신 애플리케이션 창에 직접 그립니다. 대상 사각형이 애플리케이션 클라이언트 영역보다 작은 경우 DVD 탐색기는 DVD 단추 위치를 계산할 때 이를 고려합니다. 따라서 마우스 메시지가 표시되면 메뉴 탐색 섹션에 설명된 대로 좌표를 DVD 탐색기로 직접 전달할 수 있습니다.

DVD 응용 프로그램