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

PSI 파서 필터 샘플

PSI 파서 필터는, MPEG-2 트랜스포트 스트림으로부터 Program Specific Information (PSI)를 받아, Program Association Table (PAT) 및 Program Map Tables (PMT)로부터 프로그램 정보를 추출한다. 애플리케이션은 이 정보를 사용해, MPEG-2 디멀티플렉서를 구성할 수 있다. 이 필터는, PSI 정보를 얻어온다 유익의 커스텀 인터페이스 IMpeg2PsiParser 를 지원 하고 있다.

이 필터는, IEEE 1394 MPEG-2 캠 코다, D-VHS 장치등이 같은 MPEG-2 장치전용이다. 더 자세한 정보는, 「MSTape 드라이버」를 참조할것. 디지털 TV 방송 소스는 TIF 필터를 사용해 프로그램 정보를 얻어온다 일.

사용자 가이드

GraphEdit 로 다음과 같이 PSI 파서 필터를 테스트할 수 있다.

  1. GraphEdit 를 시작 한다.
  2. MPEG-2 트랜스포트 소스를 삽입한다. MPEG-2 캠 코다와 D-VHS 장치가 [Video Capture Sources] 카테고리의 [Microsoft AV/C Tape Subunit Device] 로서 표시된다.
  3. 소스 필터를 MPEG-2 디멀티플렉서 필터에 접속한다.
  4. Demux 의 프로퍼티 페이지를 사용해, 미디어 타입 MPEG-2 PSI 로 출력 핀을 생성 한다. 이 핀으로부터 PAT 섹션과 PMT 섹션이 출력된다.
  5. Demux 프로퍼티 페이지를 사용해, PID 0x00 를 출력 핀에 맵핑 한다. 컨텐츠 타입은 MPEG2 PSI Sections 로 설정한다.
  6. Demux 출력 핀을 PSI 파서에게 접속한다.

    PSI 파서 필터 그래프

  7. PSI 데이터를 PSI 파서 필터에 공급하기 위해서, 그래프를 실행한다. 필터는, PAT 섹션을 디코드할 경우에, PMT PID 를 Demux 의 같은 출력 핀에 자동적으로 맵핑 하므로, PMT 섹션을 받을 수가 있다.
  8. PSI 파서의 프로퍼티 페이지를 사용해, 프로그램 번호를 선택한다. 프로퍼티 페이지의 기본 스트림의 일람에, 선택한 프로그램의 PID 와 각 기본 스트림에 관련한 스트림 타입이 표시된다. 프로퍼티 페이지는, ISO/IEC 13818-1 로 정의된 스트림 타입을 인식하기 위한의 것이다.
  9. 오디오 PID 번호를 [Audio PID] 편집용 박스에, 비디오 PID 번호를 [Video PID] 편집용 박스에 입력한다.
  10. [View Program] 버튼을 클릭한다. PSI 파서는, Demux 의 출력 핀을 프로그램 스트림 정보에 적합시켜, 핀을 렌더링 하도록(듯이) 구성한다.

  : PSI 파서의 프로퍼티 페이지는 테스트를 용이하게하기 위한의 것으로, MPEG-2 디멀티플렉서를 구성하는 샘플 코드를 제공하고 있다. 애플리케이션으로부터의 사용은 추천하지 않는다. 애플리케이션은, 프로그램적으로 Demux 를 구성할 필요가 있다.

애플리케이션으로 PSI 파서 필터를 사용하려면 , MPEG-2 소스로부터 MPEG-2 Demux 에의 필터 그래프를 생성 하는 것으로부터 시작한다. 이 순서에 대응하는 코드는 여기에는 기재하지 않는다. 실제의 그래프 구성은 소스에 따라서 다르기 때문이다.

다음에, PSI 데이터에 대응하는 Demux 의 출력 핀을 생성 한다. 다음 코드에 나타나듯이 PAT 섹션용으로 예약되고 있는 PID 0x00 를 이 핀에 맵핑 한다.

// 미디어 타입을 MPEG-2 테이블 셀렉션으로 설정한다.
AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = KSDATAFORMAT_TYPE_MPEG2_SECTIONS;

// 핀을 생성 한다.
IPin *pPsiPin;
hr = pDemux->CreateOutputPin(&mt, L"PSI", &pPsiPin);
if (SUCCEEDED(hr))
{
    // PID 0 에 맵 한다.
    ULONG Pid = 0x00;
    hr = pPid->MapPID(1, &Pid, MEDIA_MPEG2_PSI);
}

더 자세한 정보는, 「MPEG-2 디멀티플렉서의 사용」을 참조할것.

PSI 파서 필터를 이 그래프에 추가해, Demux 의 출력 핀에 그래프를 접속한다. PSI 파서로 IMpeg2PsiParser 인터페이스를 문의한다. 다음에, 그래프를 실행해, 새로운 PAT 섹션이나 PMT 섹션을 통지하는 EC_PROGRAM_CHANGED 이벤트를 대기한다. 이 이벤트는, PSI 파서 필터가 정의하는 커스텀 이벤트이다. EC_PROGRAM_CHANGED 이벤트를 받으면IMpeg2PsiParser 메서드를 호출해, 사용할 수 있는 PSI 정보를 취득할 수 있다. 이 섹션에는, 가장 빈번하게 필요한 메서드가 기술되고 있다.

프로그램의 수를 얻어오려면,GetCountOfPrograms 메서드를 사용한다.

int NumProgs = 0;
hr = pPsi->GetCountOfPrograms(&NumProgs);

특정의 프로그램의 프로그램 번호를 얻어오려면,GetRecordProgramNumber 메서드를 사용한다.

WORD ProgNum = 0;
for (int i = 0; iProgram < NumProgs; i++)
{
    hr = pPsi->GetRecordProgramNumber(i, &ProgNum);
    ...
}

프로그램 번호를 사용해, 각각의 프로그램의 PMT 엔트리를 얻어온다. 프로그램의 기본 스트림의 수를 얻어오려면, 다음과 같이 GetCountOfElementaryStreams 메서드를 사용한다.

ULONG cElemStreams = 0;
hr = pPsi->GetCountOfElementaryStreams(ProgNum, &cElemStreams);

각 기본 스트림에 대해,GetRecordElementaryPid 메서드는 PID 를 돌려주어,GetRecordStreamType 메서드는 스트림 타입을 돌려준다.

BYTE ESType = 0;
WORD ESPid = 0;
for (ULONG j = 0; j < cElemStreams; j++)
{
    hr = pPsi->GetRecordElementaryPid(ProgNum, j, &ESPid);
    hr = pPsi->GetRecordStreamType(ProgNum, j, &ESType);
}

PID 와 스트림 타입을 사용해, MPEG-2 디멀티플렉서의 새로운 출력 핀을 구성할 수 있다. 구성하려면 , 원의 출처에 도착해 이해해 둘 필요가 있다. 예를 들어, ISO/IEC 13818-1 는 스트림 타입 0x80 ~ 0xFF 를 "사용자 고유 (user private)" 라고 정의하고 있지만, MPEG-2 에 근거한 다른 규격에서는 이러한 타입에 다른 의미를 할당하고 있는 경우가 있다.

MPEG-2 디멀티플렉서는, 그래프의 실행중에 새로운 핀이나 새로운 PID 맵핑을 생성 할 수 있지만, 핀을 접속하려면 그래프를 정지해야 한다.

참조

↑TOP