4. pmt class

Program Lang./C++ 2016. 7. 19. 22:05

이 장에서는 PMT (Program Map Table)에 대해서 알아보고, 구현 클래스를 살펴본다.


PMT의 주요목적은 ES (Element Stream)에 대한 PID를 얻어오는 것이다.

또한 각 ES의 Type을 확인할 수 있다. Type의 의미는 현재 ES가 Audio인지 아니면 Video인지

Video이면 MPEG-2, MPEG-4 Part 4, MPEG-4 Part 10 지금은 UHD를 위한 타입도 추가되었다.


Set-Top Box나 TV에서는 A/V Decoder 블록이 존재하고 PMT에서 추출한 ES에 대한

PID를 A/V Decoder에 잘 넘겨주는 것이 System Decoder단 작업의 일이라고 보면된다.


PMT PID에 PCR PID가 있는데 Adaptation Field에 존재하는 PCR PID와 어떤 상관관계가

있는지 기억이 나지 않는다.

Adaptation Field를 이용하여 PCR Recovery, Rate 등 세가지인가 만족해야 하는 조건이 있다.

전에 한번 짜봐서 확인해 봤는데 분석기와 동일한 결과가 나왔다.

기회가 되면 소스 정리해서 올려놔야겠다.


Stream Analyzer처럼 Stream Type을 보기 좋게 하기 위해서는 추가적인 작업이 많이

필요해서 그냥 hexa값으로 표시하는 정도로 마무리한다.


1. 소스 트리

.

├── CMakeLists.txt

├── pat.cpp

├── pat.h

├── pmt.cpp

├── pmt.h

├── psi_glob.h

├── remove.sh

├── section.cpp

├── section.h

├── test.cpp

└── types.h


2. 헤더 파일

PMT를 Parsing하기 위한 전제 조건은 PAT가 Parsing 완료되어야 한다. 따라서 PAT는 필수적으로

따라 다닌다고 보면 된다.


3. 클래스 본체


4. 테스트 코드


5. 실행 결과 


hskim@MacBookPro/Volumes/Macintosh HD 2/share/c++/pmt $./test

CSection

pat generator called !! 

PMT

current media type : FILE 

mediaInPath : SGP.ts

No Data !! 

  1] PAT version =  1 Section =  0 program_number = 208 [PID  1031 (0x407)]

  2] PAT version =  1 Section =  0 program_number = 209 [PID  1032 (0x408)]

  3] PAT version =  1 Section =  0 program_number = 210 [PID  1033 (0x409)]

  4] PAT version =  1 Section =  0 program_number = 211 [PID  1034 (0x40a)]

  5] PAT version =  1 Section =  0 program_number = 212 [PID  1035 (0x40b)]

  6] PAT version =  1 Section =  0 program_number = 213 [PID  1036 (0x40c)]

  1] PMT version =  1 Section =  0 program_number = 208 [PCR PID   260 (0x104)]

  -> [  1] stream_type =  0x11 [ES PID   515 (0x203)]

  -> [  2] stream_type =  0x11 [ES PID   514 (0x202)]

  -> [  3] stream_type =  0x11 [ES PID   513 (0x201)]

  -> [  4] stream_type =  0x11 [ES PID   516 (0x204)]

  -> [  5] stream_type =  0x1b [ES PID   260 (0x104)]

  -> [  6] stream_type =   0x6 [ES PID   103 ( 0x67)]

  -> [  7] stream_type =   0x6 [ES PID   102 ( 0x66)]

  -> [  8] stream_type =   0x6 [ES PID   101 ( 0x65)]

  -> [  9] stream_type =   0x6 [ES PID   100 ( 0x64)]

  2] PMT version =  1 Section =  0 program_number = 209 [PCR PID   259 (0x103)]

  -> [  1] stream_type =  0x11 [ES PID   517 (0x205)]

  -> [  2] stream_type =  0x11 [ES PID   513 (0x201)]

  -> [  3] stream_type =  0x11 [ES PID   516 (0x204)]

  -> [  4] stream_type =  0x1b [ES PID   259 (0x103)]

  3] PMT version =  1 Section =  0 program_number = 210 [PCR PID   257 (0x101)]

  -> [  1] stream_type =  0x11 [ES PID   513 (0x201)]

  -> [  2] stream_type =   0x6 [ES PID   100 ( 0x64)]

  -> [  3] stream_type =  0x11 [ES PID   516 (0x204)]

  -> [  4] stream_type =  0x1b [ES PID   257 (0x101)]

  4] PMT version =  1 Section =  0 program_number = 211 [PCR PID   258 (0x102)]

  -> [  1] stream_type =  0x11 [ES PID   514 (0x202)]

  -> [  2] stream_type =  0x11 [ES PID   517 (0x205)]

  -> [  3] stream_type =   0x6 [ES PID   102 ( 0x66)]

  -> [  4] stream_type =  0x11 [ES PID   514 (0x202)]

  -> [  5] stream_type =  0x1b [ES PID   258 (0x102)]

  5] PMT version =  1 Section =  0 program_number = 212 [PCR PID   514 (0x202)]

  -> [  1] stream_type =  0x11 [ES PID   516 (0x204)]

  -> [  2] stream_type =  0x11 [ES PID   514 (0x202)]

  6] PMT version =  1 Section =  0 program_number = 213 [PCR PID   516 (0x204)]

  -> [  1] stream_type =  0x11 [ES PID   516 (0x204)]

~CSection

pat destroy called !! 

~PMT 


6. 전체 소스 (github link)

https://github.com/heesoon/mpeg/tree/master/test/pmt


: