DirectShow DirectShow 샘플 필터 샘플 PSI 퍼서 필터 샘플 [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
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 파서 필터를 테스트할 수 있다.
주 : 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 맵핑을 생성 할 수 있지만, 핀을 접속하려면 그래프를 정지해야 한다.
참조