DirectShow DirectShow 샘플 필터 샘플 DSNetwork 필터 샘플   [목차열람] [주소복사] [슬롯비우기]
DSNetwork 필터 샘플
 
Microsoft DirectX 9.0

DSNetwork 필터 샘플

설명

DSNetwork 샘플은, MPEG-2 트랜스포트 스트림을 멀티 캐스트 하는 방법을 나타낸다. 다음의 2 개의 관련 필터가 포함된다.

어느 쪽의 필터도, 멀티 캐스트 주소 및 Network Interface Card (NIC) 주소를 설정하는, 커스텀 인터페이스의 IMulticastConfig 를 지원 하고 있다.

패스

소스 : (SDK 루트) \Samples\C++\DirectShow\Filters\DSNetwork

사용자 가이드

이 샘플을 사용하려면 , Visual Studio 프로젝트를 컴파일 해 생성 한다. Filter\Debug 서브 디렉토리 또는 Filter\Release 서브 디렉토리에, dsnet.ax 라고 하는 DLL 가 생성 된다. Regsvr32 유틸리티를 사용해 DLL 를 등록한다.

푸쉬 모드에서는, MPEG-2 트랜스포트 스트림이 필요하다. 이것은, 디지털 TV 튜너, IEEE 1394 MPEG-2 캠 코다 등, MPEG-2 트랜스포트 스트림 (파일 소스 이외)을 출력하는 것이면 뭐든지 상관없다. 그래프는, 송신용 그래프와 수신용 그래프의, 2 개의 그래프가 필요하다.

필터는 GraphEdit 로 다음과 같이 테스트할 수 있다.

  1. GraphEdit 를 기동해, 송신용 그래프를 생성 한다. MPEG-2 소스를 Multicast Sender 필터에 접속한다. 추가 필터를 접속할 필요가 있는 경우가 있다. 상세한 처리는 소스에 따라서 다르다.

    Multicast Sender 그래프

    소스가 네트워크 프로바이더의 경우, 그래프는 TIF 필터를 가지고 있지 않으면 안 된다. 인피닛트핀티필터를 사용해 트랜스포트 스트림을 분할해, 1 개의 스트림을 (MPEG-2 디멀티플렉서를 통해서) TIF 에 송신해, 이제 1 개의 스트림을 Multicast Sender 에 송신한다.

    네트워크 프로바이더를 사용한 Multicast Sender 그래프

  2. Multicast Sender 의 프로퍼티 페이지를 사용해, 필요한 멀티 캐스트 주소, 포트, NIC 를 설정한다.
  3. 그래프를 실행한다. 멀티 캐스트 패킷을 감시하는 툴이 있으면 그래프가 실제로 데이터를 출력하고 있을지 어떨지를 확인할 때에 편리하다.
  4. GraphEdit 의 2 번째의 인스턴스를 기동해, 수신용 그래프를 생성 한다. Multicast Receiver 를 MPEG-2 디멀티플렉서에 접속한다.

    Multicast Receiver 그래프

  5. Multicast Receiver 의 프로퍼티 페이지를 사용해, IP 주소, 포트, NIC 를 설정한다. 이러한 설정은, Multicast Sender 로 사용한 설정과 일치하고 있지 않으면 안 된다.
  6. 디멀티플렉서 필터의 프로퍼티 페이지를 사용해, 1 개 이상의 출력 핀을 생성 한다. 트랜스포트 스트림 PID 를 적절한 핀에 할당한다 (원의 소스 스트림내의 PID 맵핑을 이해하고 있는지, 또는,PSI 파서 필터 샘플을 사용할 필요가 있다).
  7. Demux 의 출력 핀을 렌더링 해, 그래프를 실행한다.

애플리케이션은,IMulticastConfig 인터페이스를 사용해, Multicast Sender 필터 및 Multicast Receiver 필터를 구성할 필요가 있다. 어느 쪽의 필터도 이 인터페이스를 공개한다.

IMulticastConfig::SetMulticastGroup 를 호출해, 멀티 캐스트 주소 및 포트 번호를 설정한다. 어느 쪽의 수치도 네트워크 바이트순서가 아니면 안된다. Windows Sockets 라이브러리에는, 그러한 수치를 올바른 바이트순서로 변환하기 위한 헬퍼-함수가 있다. 예를 들어, 다음 코드는 멀티 캐스트 주소 235.1. 1.1, 포트 번호 5000 의 필터를 구성한다.

// IP 주소.
const char ip_address[] = "235.1. 1.1";
unsigned long ulIP = inet_addr(ip_address);
if (ulIP == INADDR_NONE)
{
    cout << "Invalid IP address: " << ip_address << "\n";
    return;
}
// 포트 번호.
unsigned short usPort = htons(5000);
hr = pConfig->SetMulticastGroup(ulIP, usPort);
if (FAILED(hr))
{
    cout << "SetMulticastGroup failed\n";
    return;
}

inet_addr 함수로 "닷 표기" 캐릭터 라인이 네트워크 바이트순서에 변환되어htons 함수로 포트 번호 (부호 없음 Short 형으로 나타낸다)가 변환된다.

다음에,IMulticastConfig::SetNetworkInterface 를 호출해, Network Interface Card (NIC) 주소를 지정한다. Windows Sockets 라이브러리를 사용해, 사용자의 시스템으로 유효한 NIC 주소의 일람을 얻어올 필요가 있다. 최초로, DSNetwork 샘플로 정의된 CInterface 클래스를 사용할 수 있다. 다음의 예에서는, 이 클래스를 사용해 NIC 주소를 얻어온다.

CInterface NIC;
hr = NIC.Initialize();
if (FAILED(hr))
{
    cout << "Could not initialize the NIC helper class\n";
    return;
}
// 리스트의 최초의 NIC 주소를 사용한다.
unsigned long ulNIC = NIC[0]->iiAddress.AddressIn.sin_addr.S_un.S_addr;
hr = pConfig->SetNetworkInterface(ulNIC);
if (FAILED(hr))
{
    cout << "SetNetworkInterface failed: " << ulNIC << "\n";
    return;
}

수신용 그래프로 MPEG-2 디멀티플렉서 필터를 구성하는 방법에 대해서는, 「MPEG-2 디멀티플렉서의 사용법」을 참조할것.

참조

↑TOP