'Program Lang./C++'에 해당되는 글 36건

  1. 2016.07.14 2. mpeg ts pat (program associate table) parser
  2. 2016.07.13 1. mpeg sectoin parser
  3. 2016.07.12 message queue with boost and serialization
  4. 2016.07.11 message queue - with boost lib
  5. 2016.07.08 message queue 구현 - not using boost library
  6. 2016.07.07 template과 상속 조합

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
:

1. mpeg sectoin parser

Program Lang./C++ 2016. 7. 13. 22:18

MPEG-2 Part 1, Analyzer를 c++ 공부 차원에서 한번 만들어 보기로 하자.

첫번째 클래스는 ts파일에서 188 바이트씩 읽어와서 section을 넘겨주는 section parser이다.


완전 단순하게 adaptation field을 보고 PID와 PID에 해당하는 section을 단순히 넘기는 클래스이다.

다음에 이어질 PSI (PAT, PMT, SDT ...)에서 사용하기 위함.


사실 셋탑박스나 TV단에서는 system decoder 블록이 별도로 존재하고 chip 자체적으로

PID만 주면 해당 PID에 대한 첫번째 section부터 마지막 setion까지 수신 후,

callback function으로 section을 return해 준다. 기본 길이는 1024 ~ 4096 Byte이다.

이 동작은 네가 경험한 chip에서는 모두 동작이 동일하다.


블로그에 올릴 떄는 현재 기준으로 파일만 대응했는데, IP에서도 가능하도록 도전해 볼 생각이다.


1 소스트리

.

├── CMakeLists.txt

├── SGP.ts

├── psi_glob.h

├── remove.sh

├── section.cpp

├── section.h

├── test.cpp

└── types.h


2. section class header


3. section class


4. test을 위한 main


test는 단순하다. 단순하게 파일해서 188Byte씩 읽어 들이고 setion이라는 구조를 선언하고 이 구조체에

현재 ts에 대한 pid값과 ts header를 제거한 부분을 구조체 버퍼에 넣어서 올려준다.




5. 전체 소스 (github 아래 링크에 존재)


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

:

message queue with boost and serialization

Program Lang./C++ 2016. 7. 12. 15:33

기존의 예제들은 완전한 예제가 아닌 것으로 보인다.

C++ boost message queue는 POSIX 기반의 message queue를 지원하지 않는다고 한다.

또한 message queue로 메세지를 전달 시에 기본 데이터 타입이 아닌 경우에는 Serialization의 과정이 필요하다고 한다

완전한 예제인지는 모르겠지만 기존 예제를 boost에 가장 근접하게 수정을 해 보았다.

따라서 기존 예제는 좀 억지스러운 면이 있는 것 같지만 사용환경에 따라서 사용 가능할 것으로 보인다.

메세지 큐는 Inter-process보다는 Intra-process에서 자사 제품에서는 많이 사용되고 있다.  


1. 소스트리

.

├── CMakeLists.txt

├── remove.sh

└── test.cpp


2. 구현 예제


Intra-process 기반으로 작성을 해 보았다. Inter-process에서 사용할지 의문이다.


3. 실행 결과


hskim@hskim-VirtualBox:~/share/prj/c++/test1-2$ ./test

In main thread

serialize, 37

serialize, 37

serialize, 37

name : heesoon.kim, age : 41

serialize, 37

name : heesoon.kim, age : 41

serialize, 37

serialize, 37

name : heesoon.kim, age : 41

serialize, 37

serialize, 37

name : heesoon.kim, age : 41

serialize, 37

serialize, 37

name : heesoon.kim, age : 41

serialize, 37

serialize, 37

name : heesoon.kim, age : 41

serialize, 37

serialize, 37

serialize, 37

serialize, 37

name : heesoon.kim, age : 41

serialize, 37

name : heesoon.kim, age : 41

serialize, 37

serialize, 37

name : heesoon.kim, age : 41

serialize, 37

name : heesoon.kim, age : 41

 


4. 전체 소스 코드


serialization.zip


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

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

2. mpeg ts pat (program associate table) parser  (0) 2016.07.14
1. mpeg sectoin parser  (0) 2016.07.13
message queue - with boost lib  (0) 2016.07.11
message queue 구현 - not using boost library  (0) 2016.07.08
template과 상속 조합  (0) 2016.07.07
:

message queue - with boost lib

Program Lang./C++ 2016. 7. 11. 08:39

네가 만든 message queue를 boost library로 바꿔봤다.

boost 예제를 조금 수정했는데, boost는 process 대상이고 난 thread로 변경했을 뿐이다.

동작은 네가 만든 것과 동일하다. 단지 message queue 상태 검사는 없다. 


1. 소스트리

.

├── CMakeLists.txt

├── remove.sh

└── test.cpp


2. CMakeLists.txt 변경 사항.


cmake에서 기본적으로 관리하는 package에서 찾아서 링크 시켰다.

참고로 pkg-config를 쓰려면 pkg-config를 먼저 include하고 쓰면 된다.

아직 네가 잘 못해서 Mac에서는 find_package가 먹지 않는다. 


3. 테스트 소스


:

message queue 구현 - not using boost library

Program Lang./C++ 2016. 7. 8. 15:06

boost library interprocess에 message queue가 구현되어 있으나, 공부하는 차원에서 한번 만들어봤다.

소스가 너무 커서 일단 전체 소스는 zip파일 참조


1. 소스트리

.

├── CMakeLists.txt

├── messageQueue.cpp

├── messageQueue.h

├── remove.sh

├── test.cpp

└── types.h


2. message queue header 파일


3. 테스트


네가 만든 메세지 큐를 사용하는 방식은 아래와 같다.


1) 일단 메세지 큐를 연다. (Non Block 의 경우는 Non block open 함수로 연다)

2) 메세지를 보내는 task를 하나 만들고 메세지를 보낸다.

3) 메세지를 받는 task를 하나 만들고 메세지를 받는다.


main 함수도 하나의 task이므로 모든 메세지가 주고 받을 때까지 기다리다가

끝내려면 'x'를 눌러서 나간다.


thread 생성 후에 join을 하기보다는 detach로 작성한 이유는 메세지를 보내고

받는 쪽에서 처리가 안되면 계속 메세지 큐는 보내는 쪽에서 Blocking 상태임으로

모두 detach 시킨다.


이 경우 main 함수를 끝내면 안된다.


네가 구현한 메세지 큐는 메세지 큐 상태를 출력하는데 보내는 thread와 받는 thread의

ID와 현재 주고 받는 메세지 큐 상태를 check할 수 있다.



4. 실행 결과


받는 쪽 thread에서 현재 메세지 큐 상태를 확인하기 위해서 계속 출력하도록 해 봤다



~~~~~~~~~~~~ 중략 ~~~~~~~~~~~~~~~~~~~~~~


name : heesoon.kim, age : 41

--------------------------------------------------

                 index : 0

                    id : 3

          msgQueueName : /mq_test

              senderId : 3074534208

            receiverId : 3066141504

      sendMessageCount : 8

  receivedMessageCount : 8

-------------------------------------------------

name : heesoon.kim, age : 41

--------------------------------------------------

                 index : 0

                    id : 3

          msgQueueName : /mq_test

              senderId : 3074534208

            receiverId : 3066141504

      sendMessageCount : 8

  receivedMessageCount : 9

-------------------------------------------------

name : heesoon.kim, age : 41

--------------------------------------------------

                 index : 0

                    id : 3

          msgQueueName : /mq_test

              senderId : 3074534208

            receiverId : 3066141504

      sendMessageCount : 10

  receivedMessageCount : 10

-------------------------------------------------

x

called ~messageQueue

 

 

 

5. 소스 전체

 

messageQueueTest.zip

 

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

2. mpeg ts pat (program associate table) parser  (0) 2016.07.14
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
template과 상속 조합  (0) 2016.07.07
:

template과 상속 조합

Program Lang./C++ 2016. 7. 7. 10:30

템플릿 기반의 기반 클래스에서 자식 클래스를 상속 받는 경우에 대해서 정리


1. 소스 트리

.

├── CMakeLists.txt

├── test.cpp

├── test.h


2. 기반 클래스


템플릿 기반의 기반 클래스는 test.h 파일에 선언 및 정의되어 있다.

printContents는 순수 가상함수로 선언하여서 자식 클래스의 데이터 타입에 맞게 구현하도록 했다.


3. 템플릿 기반의 기반 클래스에서 자식 클래스 상속


임의의 타입 T를 자식 클래스에서 계속 계승할 경우에 선언과 정의는 모두 헤더 파일(test.h)에 존재하고

아래와 같은 형식을 갖는다. 즉 template <typename T>가 계속 따라 다닌다.


새로운 템플릿 기반 자식 클래스가 생성되었다.

다만 mA는 기반 클래스에서 상속 받았으므로 자식 클래스에서 기반 클래스 데이터를 초기화하는 부분과

신규로 추가한 get() 함수에 대해서 구현 방식에 주의하면 된다.  



4. 템플릿 기반 기반 클래스에서 상속을 받되 특정 타입을 고정해서 받는 경우


문법적으로 정확히 맞는지는 모르겠지만 문제는 없어 보인다.

템플릿의 특수화와 조금 유사하지만 상속까지 더해져서 기본 템플릿 특수화와의 차이점 구분이 필요.


상속을 받지만 특수화가 되었다는 측면에서 클래스의 맴버함수 정의는 구현 파일로 옮겨도 될 것 같다.

일단 임의의 타입으로 하나의 구조체를 선언하고 이 구조체만을 위한 자식 클래스를 기반 클래스에 타입으로

주고 상속을 받았다. 이런 경우를 머라 불러야 하는지?


5. 테스트


6. 상속에 의한 특수화가 아닌 템블릿 중에 하나의 타입에 대한 Specialization 예제


person 타입을 기반클래스에서 주고 자식 클래스에서 이를 상속 받는 개념은 위의 예제에서

봤다. 사실 이게 맞는 것인지는 모르겠다. 이 부분은 표준 라이브러리 예제를 찾아봐야겠다.


원래 c++ 문법에서 나오는 특정 타입으로 특수화를 위한 코드로 변경하면 아래와 같다. 


개인적으로 위의 코드가 더 이상해 보인다. 템플릿에 기존 데이터랑 함수가 다 정의되어 있는데

특정 타입을 위한 클래스를 반복적으로 정의하는 것은

차라리 기반 클래스에서 특정 타입만 상속해서 사용하는 것이 더 맞는 것 아닌가?


테스트 코드


: