aboutsummaryrefslogtreecommitdiffstats
path: root/lib/include/libdvbv5/pmt.h
blob: f4a84e7e46bbe39b09c25986b7562dfc71d8fb5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
/*
 * Copyright (c) 2011-2012 - Mauro Carvalho Chehab
 * Copyright (c) 2012 - Andre Roth <neolynx@gmail.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation version 2
 * of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 *
 */

/**
 * @file pmt.h
 * @brief Provides the descriptors for PMT MPEG-TS table
 * @copyright GNU General Public License version 2 (GPLv2)
 * @author Mauro Carvalho Chehab
 * @author Andre Roth
 *
 * @par Bug Report
 * Please submit bug report and patches to linux-media@vger.kernel.org
 *
 * @par Descriptors
 * The descriptors herein are defined on:
 * - ISO/IEC 13818-1
 *
 * @see http://www.etherguidesystems.com/help/sdos/mpeg/syntax/tablesections/pmts.aspx
 */

#ifndef _PMT_H
#define _PMT_H

#include <stdint.h>
#include <unistd.h> /* ssize_t */

#include <libdvbv5/header.h>

/**
 * @def DVB_TABLE_PMT
 *	@brief PMT table ID
 */
#define DVB_TABLE_PMT      0x02

/**
 * @enum dvb_streams
 *	 @brief Add support for MPEG-TS Stream types
 *
 * @var stream_reserved0
 *	@brief	ITU-T | ISO/IEC Reserved
 * @var stream_video
 *	@brief	ISO/IEC 11172 Video
 * @var stream_video_h262
 *	@brief	ITU-T Rec. H.262 | ISO/IEC 13818-2 Video or ISO/IEC 11172-2 constrained parameter video stream
 * @var stream_audio
 *	@brief	ISO/IEC 11172 Audio
 * @var stream_audio_13818_3
 *	@brief	ISO/IEC 13818-3 Audio
 * @var stream_private_sections
 *	@brief	ITU-T Rec. H.222.0 | ISO/IEC 13818-1 private_sections
 * @var stream_private_data
 *	@brief	ITU-T Rec. H.222.0 | ISO/IEC 13818-1 PES packets containing private data
 * @var stream_mheg
 *	@brief	ISO/IEC 13522 MHEG
 * @var stream_h222
 *	@brief	ITU-T Rec. H.222.0 | ISO/IEC 13818-1 Annex A DSM-CC
 * @var stream_h222_1
 *	@brief	ITU-T Rec. H.222.1
 * @var stream_13818_6_A
 *	@brief	ISO/IEC 13818-6 type A
 * @var stream_13818_6_B
 *	@brief	ISO/IEC 13818-6 type B
 * @var stream_13818_6_C
 *	@brief	ISO/IEC 13818-6 type C
 * @var stream_13818_6_D
 *	@brief	ISO/IEC 13818-6 type D
 * @var stream_h222_aux
 *	@brief	ITU-T Rec. H.222.0 | ISO/IEC 13818-1 auxiliary
 * @var stream_audio_adts
 *	@brief	ISO/IEC 13818-7 Audio with ADTS transport syntax
 * @var stream_video_14496_2
 *	@brief	ISO/IEC 14496-2 Visual
 * @var stream_audio_latm
 *	@brief	ISO/IEC 14496-3 Audio with the LATM transport syntax as defined in ISO/IEC 14496-3 / AMD 1
 * @var stream_14496_1_pes
 *	@brief	ISO/IEC 14496-1 SL-packetized stream or FlexMux stream carried in PES packets
 * @var stream_14496_1_iso
 *	@brief	ISO/IEC 14496-1 SL-packetized stream or FlexMux stream carried in ISO/IEC14496_sections.
 * @var stream_download
 *	@brief	ISO/IEC 13818-6 Synchronized Download Protocol
 * @var stream_reserved
 *	@brief	ITU-T Rec. H.222.0 | ISO/IEC 13818-1 Reserved (from 0x15 to 0x7f)
 * @var stream_private
 *	@brief	User Private (from 0x80 to 0xff)
 */
enum dvb_streams {
	stream_reserved0	= 0x00,
	stream_video		= 0x01,
	stream_video_h262	= 0x02,
	stream_audio		= 0x03,
	stream_audio_13818_3	= 0x04,
	stream_private_sections	= 0x05,
	stream_private_data	= 0x06,
	stream_mheg		= 0x07,
	stream_h222		= 0x08,
	stream_h222_1		= 0x09,
	stream_13818_6_A	= 0x0A,
	stream_13818_6_B	= 0x0B,
	stream_13818_6_C	= 0x0C,
	stream_13818_6_D	= 0x0D,
	stream_h222_aux		= 0x0E,
	stream_audio_adts	= 0x0F,
	stream_video_14496_2	= 0x10,
	stream_audio_latm	= 0x11,
	stream_14496_1_pes	= 0x12,
	stream_14496_1_iso	= 0x13,
	stream_download		= 0x14,
	stream_reserved		= 0x15,
	stream_private		= 0x80
};

/**
 * @brief Converts from enum dvb_streams into a string
 */
extern const char *pmt_stream_name[];

/**
 * @struct dvb_table_pmt_stream
 * @brief MPEG-TS PMT stream table
 *
 * @param type			stream type
 * @param elementary_pid	elementary pid
 * @param desc_length		descriptor length
 * @param zero			zero
 * @param descriptor		pointer to struct descriptor
 * @param next			pointer to struct next
 *
 * This structure is used to store the original PMT stream table,
 * converting the integer fields to the CPU endianness.
 *
 * The undocumented parameters are used only internally by the API and/or
 * are fields that are reserved. They shouldn't be used, as they may change
 * on future API releases.
 *
 * Everything after dvb_table_pmt_stream::descriptor (including it) won't be
 * bit-mapped to the data parsed from the MPEG TS. So, metadata are added there.
 */
struct dvb_table_pmt_stream {
	uint8_t type;
	union {
		uint16_t bitfield;
		struct {
			uint16_t elementary_pid:13;
			uint16_t reserved:3;
		} __attribute__((packed));
	} __attribute__((packed));
	union {
		uint16_t bitfield2;
		struct {
			uint16_t desc_length:10;
			uint16_t zero:2;
			uint16_t reserved2:4;
		} __attribute__((packed));
	} __attribute__((packed));
	struct dvb_desc *descriptor;
	struct dvb_table_pmt_stream *next;
} __attribute__((packed));

/**
 * @struct dvb_table_pmt
 * @brief MPEG-TS PMT table
 *
 * @param pcr_pid	PCR PID
 * @param desc_length	descriptor length
 * @param zero3		zero3
 * @param descriptor	pointer to struct descriptor
 * @param stream	pointer to struct stream
 *
 * This structure is used to store the original PMT stream table,
 * converting the integer fields to the CPU endianness.
 *
 * The undocumented parameters are used only internally by the API and/or
 * are fields that are reserved. They shouldn't be used, as they may change
 * on future API releases.
 *
 * Everything after dvb_table_pmt::descriptor (including it) won't be
 * bit-mapped to the data parsed from the MPEG TS. So, metadata are added there.
 */
struct dvb_table_pmt {
	struct dvb_table_header header;
	union {
		uint16_t bitfield;
		struct {
			uint16_t pcr_pid:13;
			uint16_t reserved2:3;
		} __attribute__((packed));
	} __attribute__((packed));

	union {
		uint16_t bitfield2;
		struct {
			uint16_t desc_length:10;
			uint16_t zero3:2;
			uint16_t reserved3:4;
		} __attribute__((packed));
	} __attribute__((packed));
	struct dvb_desc *descriptor;
	struct dvb_table_pmt_stream *stream;
} __attribute__((packed));

/** @brief First field at the struct */
#define dvb_pmt_field_first header

/** @brief First field that are not part of the received data */
#define dvb_pmt_field_last descriptor

/**
 * @brief Macro used to find all streams on a PMT table
 *
 * @param _stream	stream to seek
 * @param _pmt		pointer to struct dvb_table_pmt_stream
 */
#define dvb_pmt_stream_foreach(_stream, _pmt) \
  for (struct dvb_table_pmt_stream *_stream = _pmt->stream; _stream; _stream = _stream->next) \

struct dvb_v5_fe_parms;

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief Initializes and parses PMT table
 *
 * @param parms	struct dvb_v5_fe_parms pointer to the opened device
 * @param buf buffer containing the PMT raw data
 * @param buflen length of the buffer
 * @param table pointer to struct dvb_table_pmt to be allocated and filled
 *
 * This function allocates a PMT table and fills the fields inside
 * the struct. It also makes sure that all fields will follow the CPU
 * endianness. Due to that, the content of the buffer may change.
 *
 * @return On success, it returns the size of the allocated struct.
 *	   A negative value indicates an error.
 */
ssize_t dvb_table_pmt_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf,
			    ssize_t buflen, struct dvb_table_pmt **table);

/**
 * @brief Frees all data allocated by the PMT table parser
 *
 * @param table pointer to struct dvb_table_pmt to be freed
 */
void dvb_table_pmt_free(struct dvb_table_pmt *table);

/**
 * @brief Prints the content of the PAT table
 *
 * @param parms	struct dvb_v5_fe_parms pointer to the opened device
 * @param table pointe to struct dvb_table_pmt
 */
void dvb_table_pmt_print(struct dvb_v5_fe_parms *parms,
			 const struct dvb_table_pmt *table);

#ifdef __cplusplus
}
#endif

#endif

Privacy Policy