OSDN Git Service

暫定登録
[iptd/iPTd.git] / src / mpeg2 / ts / PMT.cpp
1 /*
2  *  PMT.cpp
3  */
4
5 #include "mpeg2/ts/PMT.h"
6
7 namespace MPEG2
8 {
9 namespace TS
10 {
11
12 PMT::PMT()
13 {
14     _descriptor = NULL;
15     _element_count = 0;
16     _elements = NULL;
17 }
18
19 PMT::~PMT()
20 {
21     if (_descriptor != NULL)
22     {
23         free(_descriptor);
24     }
25     if (_elements != NULL)
26     {
27         for (int i = 0; i < _element_count; ++i)
28         {
29             if (_elements[i]._descriptor != NULL)
30             {
31                 free(_elements[i]._descriptor);
32             }
33         }
34         free(_elements);
35     }
36 }
37
38 bool PMT::decode_section()
39 {
40     bool result = true;
41     _table_id                 = _section[0x00];
42     if (_table_id == TABLE_ID_PMT)
43     {
44         _section_syntax_indicator = (_section[0x01] & 0x80) >> 7;
45         _section_length           = ((_section[0x01] << 8) + _section[0x02]) & 0x0FFF;
46         _program_number           = (_section[0x03] << 8) + _section[0x04];
47         _version_number           = (_section[0x05] & 0x3E) >> 1;
48         _current_next_indicator   = _section[0x05] & 0x01;
49         _section_number           = _section[0x06];
50         _last_section_number      = _section[0x07];
51         _PCR_PID                  = ((_section[0x08] << 8) + _section[0x09]) & 0x1FFF;
52         _program_info_length      = ((_section[0x0a] << 8) + _section[0x0b]) & 0x0FFF;
53         if (_descriptor != NULL)
54         {
55             free(_descriptor);
56         }
57         _descriptor               = (uint8_t *)malloc(_program_info_length);
58         memcpy(_descriptor, &_section[0x0c], _program_info_length);
59
60         if (_elements != NULL)
61         {
62             for (int i = 0; i < _element_count; ++i)
63             {
64                 if (_elements[i]._descriptor != NULL)
65                 {
66                     free(_elements[i]._descriptor);
67                 }
68             }
69             free(_elements);
70             _elements = NULL;
71         }
72
73         uint16_t offset = 0x0c + _program_info_length;
74
75         _element_count = 0;
76         while (offset < (_length - 4))
77         {
78             if (_elements == NULL)
79             {
80                 _elements = (struct _element *)malloc(sizeof(struct _element));
81             }
82             else
83             {
84                 _elements = (struct _element *)realloc(_elements, sizeof(struct _element) * (_element_count + 1));
85             }
86             _elements[_element_count]._stream_type = _section[offset];
87             _elements[_element_count]._elementary_PID = ((_section[offset + 1] << 8) + _section[offset + 2]) & 0x1FFF;
88             _elements[_element_count]._ES_info_length = ((_section[offset + 3] << 8) + _section[offset + 4]) & 0x0FFF;
89             _elements[_element_count]._descriptor = (uint8_t *)malloc(_elements[_element_count]._ES_info_length);
90             memcpy(_elements[_element_count]._descriptor, &_section[offset + 5], _elements[_element_count]._ES_info_length);
91             offset += (5 + _elements[_element_count]._ES_info_length);
92             _element_count++;
93         }
94     }
95     else
96     {
97         reset();
98         result = false;
99     }
100
101     return result;
102 }
103
104 void PMT::reset()
105 {
106     _section_syntax_indicator = 0;
107     _section_length           = 0;
108     _program_number           = 0;
109     _version_number           = 0;
110     _current_next_indicator   = 0;
111     _section_number           = 0;
112     _last_section_number      = 0;
113     _PCR_PID                  = 0;
114     _program_info_length      = 0;
115     if (_descriptor != NULL)
116     {
117         free(_descriptor);
118         _descriptor = NULL;
119     }
120     if (_elements != NULL)
121     {
122         for (int i = 0; i < _element_count; ++i)
123         {
124             if (_elements[i]._descriptor != NULL)
125             {
126                 free(_elements[i]._descriptor);
127             }
128         }
129         free(_elements);
130         _elements = NULL;
131         _element_count = 0;
132     }
133 }
134
135 } // TS
136 } // MPEG2