2. mpeg ts pat (program associate table) parser

Program Lang./C++ 2016. 7. 14. 20:44

앞 단원 mpeg section parser에서 넘겨주는 section information을 기반으로 

PID가 '0'에 해당하는 PAT를 분석하여 필요한 데이터를 저장하는 PAT class를 설계하고 구현한다. 


PAT(Program Associate Table)은 셋탑박스나 TV단에서 채널 수신 중, 가장 처음에 수신해서 Parsing해야 한다.

대기업 TV 제조사나 이름있는 셋탑박스 업체는 채널 전환 시에도 모든 mpeg system을 수신하고 기존 값과

비교해서 변경 사항이 있으면 조치를 취하지만 중국 제품은 네가 10년 전에 셋탑박스 개발 시에는 처음 설치시에

Scan 후에 다시는 하지 않는 구조였다. 


PAT에서는 program number (service ID라고도 한다)와 PMT PID을 저장하고 있다.

현재 목적은 구현이기 때문에 자세한 설명은 규격서을 참조하면 알 수 있다.


1. 소스 트리


일단 기존 section class 파일들은 전에 기술한 내용과 동일한 부분이다. 변경 추가 사항인 PAT을 살펴본다.

.

├── CMakeLists.txt

├── pat.cpp

├── pat.h

├── psi_glob.h

├── remove.sh

├── section.cpp

├── section.h

├── test.cpp

└── types.h 


2. PAT class header


3. PAT class


PAT에 존재하는 program number와 PMT PID를 갯수 만큼 파싱해서 forward list에 저장한다.

동일한 값을 저장하는 것을 피하기 위해서 버전과 section number가 동일하면 리스트 추가하지 않는다.

HW적인 chip상에서는 여기서 구현한 것처럼 section number를 구분하지 않는다.

section number와 last section number를 확인하고 last section number까지 수신이 완료되면

PAT에 대한 section이 모두 완료되고 상위 레이어에 올려준다.

PAT section은 max section 길이가 1024 바이트로 기억된다.

여기서는 HW기반과 다르게 section 하나 하나를 분석하기 위해서 section number까지 고려한다.


보통 section에서 version number는 중요하다. version이 바뀌면 기존에 저장되어 있는 PAT와

TV가 동작 중이라면 현재 수신 중인 채널에 대한 처리가 고려되어야 한다.


일반적으로 처음 PAT를 수신 후에 version 변경여부를 일정 시간 타이머로 확인하는 작업도 있다.



4. main함수


5. 전체 소스 (github 위치)


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

'Program Lang. > C++' 카테고리의 다른 글

4. pmt class  (0) 2016.07.19
3. pat info. save to MySQL with cpp connector  (0) 2016.07.19
1. mpeg sectoin parser  (0) 2016.07.13
message queue with boost and serialization  (0) 2016.07.12
message queue - with boost lib  (0) 2016.07.11
: