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

  1. 2017.01.02 std::function 정리
  2. 2016.12.30 unique_ptr, shared_ptr 읽히기
  3. 2016.12.30 c++ pair 읽히기
  4. 2016.07.22 full version (pat, pmt, sdt) 2
  5. 2016.07.22 sdt json version
  6. 2016.07.22 pmt json version
  7. 2016.07.21 pat 정보를 json 파일로 저장 후 webbrowser에서 확인
  8. 2016.07.20 5. sdt (service description table) class
  9. 2016.07.19 4. pmt class
  10. 2016.07.19 3. pat info. save to MySQL with cpp connector

std::function 정리

Program Lang./C++ 2017. 1. 2. 11:15

1. std::function 개요


기존 함수포인터의 개념을 확장한 것이다. c++11이후부터는 callable target이 아래와 같이 다양해졌다.

따라서 기존 함수포인터만으로는 이를 cover할 수 없고, 보다 일반화된 개념이 필요해지면서

std::function이 새롭게 나온 것이다.


std::function이 처리할 수 있는 callable target은 아래와 같다.

  • function (일반함수)
  • lambda expression
  • bind expression
  • function object (함수 객체)
  • class 내의 맴버함수 및 맴버 변수

2. usage


선언하고 사용하는 방법에 대해서 아래와 같이 정리한다.


#include <functional>

 

std::function<리턴타입(입력 파라미터들)> 변수


void print(int a, int b);

ex) std::function<void(int, int)> fp = print;

 

3. 테스트 코드


각 callable target에 대한 사용법을 예제를 통해서 알아본다.



4. 결론

c++11 이후에서 class를 설계할 때, 기존에 함수포인터를 이용했다면 이제 std::function으로 모두

통일하는 것이 c++ 철학에 맞는 구현 방식이다.

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

[json-c] simple generator json ojbect  (0) 2017.01.09
[json-c] simple parsing example  (0) 2017.01.09
unique_ptr, shared_ptr 읽히기  (0) 2016.12.30
c++ pair 읽히기  (0) 2016.12.30
full version (pat, pmt, sdt)  (2) 2016.07.22
:

unique_ptr, shared_ptr 읽히기

Program Lang./C++ 2016. 12. 30. 14:45

1. 목적

c++ unique_ptr, shared_ptr 개인적인 정리


2. shared_ptr

C++98 표준안까지 사용되던 auto_ptr은 이제 더 이상 사용하지 않는 것이 권고 사항이다. C++11부터 지원하는 share_ptr을 간단히 말하면 객체의 자동 파괴를 수행하기 위해서 도입된 smart pointer 이다. 하지만 몇 가지 제약 사항은 여전히 존재한다. 제약 사항은 아래에서 하나씩 살펴보도록 하자.

일반적인 사용법은 테스트 코드에 주석으로 표기하였다. 자세한 사항은 standard 생성자 overriding을 참조하면 된다.

다만 주의해야 할 사항은 대입 연산은 explicit으로 처리되어 있기 때문에 암시적 대입연산은 동작하지 않는다.

또한 make_shared<> utility를 사용하는 것이 성능면에서 좋다.


2.1. shared_ptr 예제 (제약 사항 예제)

The C++ Standard Library 책의 예제는 너무 복잡하고 딱히 와 닿지도 않아서 어떤 블로그 소스 참조

하나의 객체에 대해서 서로 다른 shared_ptr로 참조하게 되면 소멸된 객체에 다시 소멸자를 호출하게 되어서 알 수 없는 동작을 수행하게 된다.



<실행결과>

Start
Person, 14
delete : heesoon.kim
~Person, 18
delete : heesoon.kim
Segmentation fault
Finish


순환 참조의 문제점을 보여주는 예제로 weak_ptr<Person> 주석을 막고 shared_ptr<Person>을 사용하면 소멸자가 호출되지 않는다. 결론적으로 객체가 정상적으로 파괴되지 않는 문제가 발생한다.



2.3. shared_ptr 예제 (제약 사항 예제)

smart pointer라고는 하지만 여전히 주의를 기울여야 할 것이 남아 있다. weak_ptr은 shared_ptr의 reference_count를 늘리지 않지만 shared_ptr이 관리하는 객체를 공유한다. 객체의 자원 관리는 shared_ptr로 하되 객체에 접근하여 필요한 동작을 수행 시에는 weak_ptr로 하는 것이 바람직해 보인다.

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

[json-c] simple parsing example  (0) 2017.01.09
std::function 정리  (0) 2017.01.02
c++ pair 읽히기  (0) 2016.12.30
full version (pat, pmt, sdt)  (2) 2016.07.22
sdt json version  (0) 2016.07.22
:

c++ pair 읽히기

Program Lang./C++ 2016. 12. 30. 09:59

1. 목적

c++ map을 for_each 구문에서 쓰려고 하니까 pair 관련된 내용이 나와서 예제 짜보고 읽히기로 함.


2. 테스트 코드

std:pair을 사용하기 위해서는 두 개의 입력 요소를 하나의 요소로 만들어 주는 make_pair 구문과 같이

봐서 사용법을 읽히는 것이 좋을 것 같다.


아래 코드에서 for_each 문 안에 함수 포인터로 등록된 함수를 실행하기 위해서 item.second이 아닌

item.second()로 호출해야 하는 문법적인 근거를 모르겠다. 이래 저래 삽질하다가 함수 객채 호출 시에

사용하는 문법처럼 해 봤는데 동작은 하는데 모르겠네.

아시는 분은 댓글 부탁 드립니다.



3. 테스트 코드 실행

단순히 vector에 등록된 두 개의 debug 메뉴를 실행한다. 따라서 Hellow World와 내 이름을 차례되로 찍는다.


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

std::function 정리  (0) 2017.01.02
unique_ptr, shared_ptr 읽히기  (0) 2016.12.30
full version (pat, pmt, sdt)  (2) 2016.07.22
sdt json version  (0) 2016.07.22
pmt json version  (0) 2016.07.22
:

full version (pat, pmt, sdt)

Program Lang./C++ 2016. 7. 22. 12:43

처음 해보려고 한 목적은 개발 중에 필드에서 Stream 이상한 것이 많다.

이런 것들 항상 자기 컴에 복사해서 분석기로 돌려서 보고, 분석하지만 분석기가 동작이 제 각각이고 내가 보고 싶은 부분만

빨리 보고 싶은데 그러기도 힘들고 분석 후에 파일의 사후 관리도 안된다. 

따라서 중앙 서버에 모든 파일을 두고 여기서 돌리고 브라우져로 결과를 보면 스트림 관리가 편하지 않을까 생각해서

해보려고 했다. 하지만 현실의 벽이 높다.


지금까지 작업을 수행했던 Section, PAT, PMT, SDT parser의 full version 정리

여기에 CAT, TDT, TOT, NIT, EIT 까지 붙이면 좋을텐데 시간이 되면 해야 할 것 같다.

올해 처음 생긴 5년마다의 안식년 휴가 3주 동안 이 모든 것을 하기에는 시간이 부족하다.


같이 공부하고 연구하는 사람이 있으면 좋을텐데, 회사의 개발자들은 별로 자기 개발에 의지가 없는듯.

혼자 하는 수 밖에. 난 오늘도 도서관 꼭대기 에어콘도 들어오지 않는 곳에서 열심히 열공 중이다. ㅠ.ㅠ


1. 소스 트리

지금까지 작업한 모든 소스 한 곳에 모았다. javascript folder는 실행결과를 web browser에서

확인하기 위해서 APM 설치 후에 기본 서비스 폴더에 복사해 넣으면 된다.

.

├── CMakeLists.txt

├── javascript

│   ├── css

│   │   ├── images

│   │   │   ├── ajax-loader.gif

│   │   │   ├── file.gif

│   │   │   ├── folder-closed.gif

│   │   │   ├── folder.gif

│   │   │   ├── minus.gif

│   │   │   ├── plus.gif

│   │   │   ├── treeview-black-line.gif

│   │   │   ├── treeview-black.gif

│   │   │   ├── treeview-default-line.gif

│   │   │   ├── treeview-default.gif

│   │   │   ├── treeview-famfamfam-line.gif

│   │   │   ├── treeview-famfamfam.gif

│   │   │   ├── treeview-gray-line.gif

│   │   │   ├── treeview-gray.gif

│   │   │   ├── treeview-red-line.gif

│   │   │   └── treeview-red.gif

│   │   ├── jquery.treeview.css

│   │   └── screen.css

│   ├── index.html

│   ├── lib

│   │   ├── jquery.cookie.js

│   │   ├── jquery.js

│   │   └── jquery.treeview.js

│   ├── pat_json.txt

│   ├── pmt_json.txt

│   └── sdt_json.txt

├── json_spirit

│   ├── CMakeFiles

│   │   ├── CMakeDirectoryInformation.cmake

│   │   ├── json_spirit.dir

│   │   │   ├── CXX.includecache

│   │   │   ├── DependInfo.cmake

│   │   │   ├── build.make

│   │   │   ├── cmake_clean.cmake

│   │   │   ├── cmake_clean_target.cmake

│   │   │   ├── depend.internal

│   │   │   ├── depend.make

│   │   │   ├── flags.make

│   │   │   ├── json_spirit_reader.cpp.o

│   │   │   ├── json_spirit_value.cpp.o

│   │   │   ├── json_spirit_writer.cpp.o

│   │   │   ├── link.txt

│   │   │   └── progress.make

│   │   └── progress.marks

│   ├── CMakeLists.txt

│   ├── Makefile

│   ├── cmake_install.cmake

│   ├── json_spirit.h

│   ├── json_spirit.vcproj

│   ├── json_spirit_error_position.h

│   ├── json_spirit_reader.cpp

│   ├── json_spirit_reader.h

│   ├── json_spirit_reader_template.h

│   ├── json_spirit_stream_reader.h

│   ├── json_spirit_utils.h

│   ├── json_spirit_value.cpp

│   ├── json_spirit_value.h

│   ├── json_spirit_writer.cpp

│   ├── json_spirit_writer.h

│   ├── json_spirit_writer_options.h

│   ├── json_spirit_writer_template.h

│   └── libjson_spirit.a

├── pat.cpp

├── pat.h

├── pmt.cpp

├── pmt.h

├── psi_glob.h

├── remove.sh

├── sdt.cpp

├── sdt.h

├── section.cpp

├── section.h

├── test.cpp

└── types.h


2. 헤더 파일

너무 많아서 github link 내의 소스 참조


3. 클래스 본체

너무 많아서 github link 내의 소스 참조.


4. 테스트 코드

실제 TS 파일을 사용자로부터 받아서 처리해야 하는데, 귀찮으니까 그냥 SGP.ts로 고정.

차후 IP Multicast Stream 받을 수 있도록 붙이면 고려해 볼 생각.


처음에는 Message Queue로 Section에서는 던지고 Parser쪽에서는 받아서 처리하려고 했는데

의미 없어 보여서 생략. Message Queue 동작은 github test folder에 정리했다. 



5. 전체 소스 (github link)


https://github.com/heesoon/mpeg/tree/master/full_version

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

unique_ptr, shared_ptr 읽히기  (0) 2016.12.30
c++ pair 읽히기  (0) 2016.12.30
sdt json version  (0) 2016.07.22
pmt json version  (0) 2016.07.22
pat 정보를 json 파일로 저장 후 webbrowser에서 확인  (0) 2016.07.21
:

sdt json version

Program Lang./C++ 2016. 7. 22. 11:52

SDT 정보를 브라우져에 출력하기 위한 예제


웹브라우져에서 확인 테스트는 자바스크립트 탭에 정리한다.


1. 소스 트리

자세한 내용은 PAT에 정리되어 있다. 여기서 핵심은 boost spirit을 이용한 json 라이블러리의 사용이다.

PAT쪽에 정리되어 있으므로 여기서 생략하기로 하자. 


2. 헤더 파일

json 파일로 저장하는 함수 하나 추가해서 일단 생략하고 전체 소스 링크 참조


3. 클래스 본체

json 포멧은 PAT과 동일하다. 일단 저장은 PAT과 동일한 형태로 저장하고 브라우져에 출력 시에

좀 더 분석기와 유사한 UI와 맞추기 위해서 조정을 할 필요는 있다.



4. 테스트 코드


5. 실행 결과


6. 전체 소스 (github link, javascript는 없음.)

자사스크립트는 자바스크립트 탭에 정리


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

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

c++ pair 읽히기  (0) 2016.12.30
full version (pat, pmt, sdt)  (2) 2016.07.22
pmt json version  (0) 2016.07.22
pat 정보를 json 파일로 저장 후 webbrowser에서 확인  (0) 2016.07.21
5. sdt (service description table) class  (0) 2016.07.20
:

pmt json version

Program Lang./C++ 2016. 7. 22. 10:16

PAT 정보를 Json 파일 포멧으로 저장 후에 웹브라우져에서 확인하는 것의 연장선으로 PMT 정보도 출력했다.

결국 json 형식으로 출력 및 자바스크립트에서 막히는 문제로 삽질을 했다.


웹브라우져에서 확인 테스트는 자바스크립트 탭에 정리한다.


1. 소스 트리

자세한 내용은 PAT에 정리되어 있다. 여기서 핵심은 boost spirit을 이용한 json 라이블러리의 사용이다.

PAT쪽에 정리되어 있으므로 여기서 생략하기로 하자. 


2. 헤더 파일

json 파일로 저장하는 함수 하나 추가해서 일단 생략하고 전체 소스 링크 참조


3. 클래스 본체

json 포멧이 PAT보다 복잡해졌다.

전체 PMT정보를 감싸는 pmtArr라는 Object Array가 선언되어 있고 이 배열 안에

다시 Object + Array 형태로 저장이 되어 있는 구조이다.

이 구조가 맞는 것인지는 모르겠다. 인터넷 상에 찾아보고 동작은 잘되서 맞는 것 같은데

시간이 되면 좀 더 자세히 봐봐야겠다 



4. 테스트 코드


5. 실행 결과


6. 전체 소스 (github link, javascript는 없음.)

자사스크립트는 자바스크립트 탭에 정리


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

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

full version (pat, pmt, sdt)  (2) 2016.07.22
sdt json version  (0) 2016.07.22
pat 정보를 json 파일로 저장 후 webbrowser에서 확인  (0) 2016.07.21
5. sdt (service description table) class  (0) 2016.07.20
4. pmt class  (0) 2016.07.19
:

pat 정보를 json 파일로 저장 후 webbrowser에서 확인

Program Lang./C++ 2016. 7. 21. 18:57

앞 장에서 pat(program associate table)을 MySQL로 저장해서 확인해 보았지만 최종적으로 webbrower에서 

확인하기에는 Node.js 같은 것을 붙여야 하고 일이 커져서 일단 아래와 같이 구현해 본다.


MFC 나 C#등을 이용해서 UI를 짜면 되지만 실제 보여주는 UI는 webbrowser에서 보여지는 것을 보고 싶다.

그래서 일단 c++ native application에서 pat 정보를 parsing완료하면 json 포멧으로

저장한다. 저장 위치는 webserver root directory 이다.


저장된 값은 webbrowser를 실행하고 해당 URL을 입력해서 출력되는 것을 확인한다.


1. 선수 작업

먼저 c++ json parser and writer가 필요하다. 난 boost spirit을 이용한다.

아래 참고 사이트에서 소스를 받아서 빌드하면 잘 된다. 난 cmake만을 사용하므로 cmake로 돌리고

헤더 파일과 static library만을 내 project에 포함시키고 아래 소스 트리에서 json_spirit 폴더에 해당함.

내 project CMakeLists.txt파일에서 json_spirit 헤더와 라이블러리 패스만 잡아줌.

json_spirit 폴더 내의 CMakeLists.txt 파일은 내꺼 프로젝트와 상관없고 원래 있었던 것으로 연동안됨.


2. 소스 트리

.

├── CMakeLists.txt

├── json_spirit

│   ├── CMakeFiles

│   │   ├── CMakeDirectoryInformation.cmake

│   │   ├── json_spirit.dir

│   │   │   ├── CXX.includecache

│   │   │   ├── DependInfo.cmake

│   │   │   ├── build.make

│   │   │   ├── cmake_clean.cmake

│   │   │   ├── cmake_clean_target.cmake

│   │   │   ├── depend.internal

│   │   │   ├── depend.make

│   │   │   ├── flags.make

│   │   │   ├── json_spirit_reader.cpp.o

│   │   │   ├── json_spirit_value.cpp.o

│   │   │   ├── json_spirit_writer.cpp.o

│   │   │   ├── link.txt

│   │   │   └── progress.make

│   │   └── progress.marks

│   ├── CMakeLists.txt

│   ├── Makefile

│   ├── cmake_install.cmake

│   ├── json_spirit.h

│   ├── json_spirit.vcproj

│   ├── json_spirit_error_position.h

│   ├── json_spirit_reader.cpp

│   ├── json_spirit_reader.h

│   ├── json_spirit_reader_template.h

│   ├── json_spirit_stream_reader.h

│   ├── json_spirit_utils.h

│   ├── json_spirit_value.cpp

│   ├── json_spirit_value.h

│   ├── json_spirit_writer.cpp

│   ├── json_spirit_writer.h

│   ├── json_spirit_writer_options.h

│   ├── json_spirit_writer_template.h

│   └── libjson_spirit.a

├── pat.cpp

├── pat.h

├── pat_json.txt

├── psi_glob.h

├── remove.sh

├── section.cpp

├── section.h

├── test.cpp

└── types.h


3. 헤더 파일

보여지지 않는 파일은 기존 pat class와 동일하고 단지 변경 사항만 여기에 보여준다.

pat정보를 json으로 저장하기 위한 함수 선언이 추가되었다.



4. 본체

pat_json.txt 파일을 apache 서버 설정 루트 디렉토르로 만들어서 저장한다.



5. 테스트

webbrowser로 결과를 확인하는 내용은 아래 post에 정리해 두었다.


http://chipmaker.tistory.com/category/Program%20Lang./javascript/



6. pat_json.txt 파일 구조

6개의 프로그램 정보가 배열 형태의 json 포멧으로 저장되어 있다.

하나의 프로그램의 형식은 pat.h에 정의한 struct 구성과 동일하다. 


7. 전체 소스 (github link)


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


8. 참고 자료


[boost spirit json parser and writer]

http://www.codeproject.com/Articles/20027/JSON-Spirit-A-C-JSON-Parser-Generator-Implemented

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

sdt json version  (0) 2016.07.22
pmt json version  (0) 2016.07.22
5. sdt (service description table) class  (0) 2016.07.20
4. pmt class  (0) 2016.07.19
3. pat info. save to MySQL with cpp connector  (0) 2016.07.19
:

5. sdt (service description table) class

Program Lang./C++ 2016. 7. 20. 19:17

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


SDT는 MPEG-2 Part 2의 규격 사항은 아니다. MPEG System의 구성은 기본 골격은 MPEG에서 출발하고

세부적인 사항은 ATSC, DVB, ISDB의 형태로 나누어진다. SDT는 DVB에 해당하는 규격이고

요즘은 ATSC도 같이 보고 있지만 기존에 계속 DVB만해서 익숙한 것 위주로 구현해 본다.


SDT는 현재 방송되고 있는 방송사업자 정보나 방송 채널 이름 같은 정보를 얻어올 수 있다.

좀 세부적으로 들어가면 PAT에 있는 프로그램 갯수가 정말 정확할까? 이런 문제들이 속출하게된다.


테스트 코드에서 볼 수 있듯이 PMT를 parsing하기 위해서는 PAT가 먼저 parsing이 되어야 한다.

하지만 SDT의 경우에는 테스트 코드에서도 볼 수 있지만 PAT와 상관없이 바로 Section PID를 알고 있으므로

바로 PAT와 상관없이 Parsing할 수 있다.

여기서 복합적으로 성능을 올릴 수 있는 방법을 고민해 볼 수 있다. Chip의 특성을 잘 파악한다면

여러가지 복합적으로 생각해 볼 수 있다.


또한 SDT는 CI+와 직접적인 연관이 있다. 업체마다 구현은 다르겠지만 ...

상세하게 여기 기술하기에는 한계가 있다. 정보 유출로 걸릴까 무섭다.


1. 소스 트리

├── CMakeLists.txt

├── psi_glob.h

├── remove.sh

├── sdt.cpp

├── sdt.h

├── section.cpp

├── section.h

├── test.cpp

└── types.h


2. 헤더 파일


3. 본체


4. 테스트 소스


5. 실행 결과



CSectionSDT

current media type : FILE 

mediaInPath : SGP.ts

No Data !! 

  0] SDT version =  1, Section =  0, service_id = 208 

  -              EIT_schedule_flag :     0  

  -     EIT_present_following_flag :     1  

  -                 running_status :   0x4 

  -                   free_CA_mode :     0  

  -           service Provide Name : MediaCorp TV   

  -                   service Name : TV1_SD   

  1] SDT version =  1, Section =  0, service_id = 209 

  -              EIT_schedule_flag :     0  

  -     EIT_present_following_flag :     1  

  -                 running_status :   0x4 

  -                   free_CA_mode :     0  

  -           service Provide Name : MediaCorp TV   

  -                   service Name : TV2_SD   

  2] SDT version =  1, Section =  0, service_id = 210 

  -              EIT_schedule_flag :     0  

  -     EIT_present_following_flag :     1  

  -                 running_status :   0x4 

  -                   free_CA_mode :     0  

  -           service Provide Name : MediaCorp TV   

  -                   service Name : TV3_HD   

  3] SDT version =  1, Section =  0, service_id = 211 

  -              EIT_schedule_flag :     0  

  -     EIT_present_following_flag :     1  

  -                 running_status :   0x4 

  -                   free_CA_mode :     0  

  -           service Provide Name : MediaCorp TV   

  -                   service Name : TV4_HD   

  4] SDT version =  1, Section =  0, service_id = 212 

  -              EIT_schedule_flag :     0  

  -     EIT_present_following_flag :     1  

  -                 running_status :   0x4 

  -                   free_CA_mode :     0  

  -           service Provide Name : MediaCorp TV   

  -                   service Name : TV5_Radio   

  5] SDT version =  1, Section =  0, service_id = 213 

  -              EIT_schedule_flag :     0  

  -     EIT_present_following_flag :     1  

  -                 running_status :   0x4 

  -                   free_CA_mode :     0  

  -           service Provide Name : MediaCorp TV   

  -                   service Name : TV6_Rad   

~CSection

~SDT 



6. 전체 소스 (github link)


소스 코드는 여기 있는 부분과 다를 수 있다. 중간에 버그나 수정이 필요하면 다시 올리기 때문에 git에서 받는게 가장 최신임.


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

:

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


:

3. pat info. save to MySQL with cpp connector

Program Lang./C++ 2016. 7. 19. 21:11

http://chipmaker.tistory.com/entry/mysql-cpp-connector-study

에서 cpp connector wrapper 클래스를 만들고 이 클래스를 기반 클래스로 정의하였다.

여기서는 이 기반 클래스를 구체화하는 예제로 PAT 정보를 MySQL에 써 보도록 하자.


1. 소스 트리

.

├── CMakeLists.txt

├── mysqlAdaptor.cpp

├── mysqlAdaptor.h

├── mysqlAdaptorForPAT.cpp

├── mysqlAdaptorForPAT.h

├── pat.cpp

├── pat.h

├── psi_glob.h

├── remove.sh

├── section.cpp

├── section.h

├── test.cpp

└── types.h


2. 헤더 파일

PAT 정보를 MySQL에 쓰는 파일만 보고 전체 파일을 github link을 참조.


3. 클래스 본체

기반 클래스에서 순수 가상함수를 사용하였으나, 구지 순수 가상함수를 만들지 않고

가상함수로 만들고 함수 오버라이딩 기법을 사용해도 되지만 두서 없이 c++ 공부하다 보니 그 떄 생각나고

짜보고 싶은 것을 위주로 생각해서 진행해서 어떤 설계를 기반으로 하지 않은점은 고력해야 한다.


4. 테스트 예제


5. 실행 결과



6. github link (전체 소스) 


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

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

5. sdt (service description table) class  (0) 2016.07.20
4. pmt class  (0) 2016.07.19
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
: