1 /*
2  * Copyright (c) 2011-2012 - Mauro Carvalho Chehab
3  * Copyright (c) 2012 - Andre Roth <neolynx@gmail.com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published by
7  * the Free Software Foundation version 2.1 of the License.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18  *
19  */
20 
21 #ifndef _SDT_H
22 #define _SDT_H
23 
24 /**
25  * @file sdt.h
26  * @ingroup dvb_table
27  * @brief Provides the descriptors for SDT MPEG-TS table
28  * @copyright GNU Lesser General Public License version 2.1 (LGPLv2.1)
29  * @author Mauro Carvalho Chehab
30  * @author Andre Roth
31  *
32  * @par Relevant specs
33  * The table described herein is defined at:
34  * - ISO/IEC 13818-1
35  *
36  * @see http://www.etherguidesystems.com/Help/SDOs/dvb/syntax/tablesections/SDT.aspx
37  *
38  * @par Bug Report
39  * Please submit bug reports and patches to linux-media@vger.kernel.org
40  */
41 
42 #include <stdint.h>
43 #include <unistd.h> /* ssize_t */
44 
45 #include <libdvbv5/header.h>
46 
47 /**
48  * @def DVB_TABLE_SDT
49  *	@brief SDT table ID
50  *	@ingroup dvb_table
51  * @def DVB_TABLE_SDT2
52  *	@brief SDT table ID (alternative table ID)
53  *	@ingroup dvb_table
54  * @def DVB_TABLE_SDT_PID
55  *	@brief SDT Program ID
56  *	@ingroup dvb_table
57  */
58 #define DVB_TABLE_SDT      0x42
59 #define DVB_TABLE_SDT2     0x46
60 #define DVB_TABLE_SDT_PID  0x0011
61 
62 /**
63  * @struct dvb_table_sdt_service
64  * @brief MPEG-TS SDT service table
65  * @ingroup dvb_table
66  *
67  * @param service_id		service id
68  * @param EIT_present_following	EIT present following
69  * @param EIT_schedule		EIT schedule
70  * @param desc_length		desc length
71  * @param free_CA_mode		free CA mode
72  * @param running_status	running status
73  * @param descriptor		pointer to struct dvb_desc
74  * @param next			pointer to struct dvb_table_sdt_service
75  *
76  * This structure is used to store the original SDT service table,
77  * converting the integer fields to the CPU endianness.
78  *
79  * The undocumented parameters are used only internally by the API and/or
80  * are fields that are reserved. They shouldn't be used, as they may change
81  * on future API releases.
82  *
83  * Everything after dvb_table_sdt_service::descriptor (including it) won't
84  * be bit-mapped to the data parsed from the MPEG TS. So, metadata are added
85  * there.
86  */
87 struct dvb_table_sdt_service {
88 	uint16_t service_id;
89 	uint8_t EIT_present_following:1;
90 	uint8_t EIT_schedule:1;
91 	uint8_t reserved:6;
92 	union {
93 		uint16_t bitfield;
94 		struct {
95 			uint16_t desc_length:12;
96 			uint16_t free_CA_mode:1;
97 			uint16_t running_status:3;
98 		} __attribute__((packed));
99 	} __attribute__((packed));
100 	struct dvb_desc *descriptor;
101 	struct dvb_table_sdt_service *next;
102 } __attribute__((packed));
103 
104 /**
105  * @struct dvb_table_sdt
106  * @brief MPEG-TS SDT table
107  * @ingroup dvb_table
108  *
109  * @param header	struct dvb_table_header content
110  * @param network_id	network id
111  * @param service	pointer to struct dvb_table_sdt_service
112  *
113  * This structure is used to store the original SDT table,
114  * converting the integer fields to the CPU endianness.
115  *
116  * The undocumented parameters are used only internally by the API and/or
117  * are fields that are reserved. They shouldn't be used, as they may change
118  * on future API releases.
119  *
120  * Everything after dvb_table_sdt::service (including it) won't be bit-mapped
121  * to the data parsed from the MPEG TS. So, metadata are added there.
122  */
123 struct dvb_table_sdt {
124 	struct dvb_table_header header;
125 	uint16_t network_id;
126 	uint8_t  reserved;
127 	struct dvb_table_sdt_service *service;
128 } __attribute__((packed));
129 
130 /**
131  * @brief Macro used to find services on a SDT table
132  * @ingroup dvb_table
133  *
134  * @param _service	service to seek
135  * @param _sdt		pointer to struct dvb_table_sdt_service
136  */
137 #define dvb_sdt_service_foreach(_service, _sdt) \
138 	if (_sdt && _sdt->service) \
139 		for (struct dvb_table_sdt_service *_service = _sdt->service; _service; _service = _service->next ) \
140 
141 struct dvb_v5_fe_parms;
142 
143 #ifdef __cplusplus
144 extern "C" {
145 #endif
146 
147 /**
148  * @brief Initializes and parses SDT table
149  * @ingroup dvb_table
150  *
151  * @param parms	struct dvb_v5_fe_parms pointer to the opened device
152  * @param buf buffer containing the SDT raw data
153  * @param buflen length of the buffer
154  * @param table pointer to struct dvb_table_sdt to be allocated and filled
155  *
156  * This function allocates a SDT table and fills the fields inside
157  * the struct. It also makes sure that all fields will follow the CPU
158  * endianness. Due to that, the content of the buffer may change.
159  *
160  * @return On success, it returns the size of the allocated struct.
161  *	   A negative value indicates an error.
162  */
163 ssize_t dvb_table_sdt_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf,
164 			    ssize_t buflen, struct dvb_table_sdt **table);
165 
166 /**
167  * @brief Frees all data allocated by the SDT table parser
168  * @ingroup dvb_table
169  *
170  * @param table pointer to struct dvb_table_sdt to be freed
171  */
172 void dvb_table_sdt_free(struct dvb_table_sdt *table);
173 
174 /**
175  * @brief Prints the content of the SDT table
176  * @ingroup dvb_table
177  *
178  * @param parms	struct dvb_v5_fe_parms pointer to the opened device
179  * @param table pointer to struct dvb_table_sdt
180  */
181 void dvb_table_sdt_print(struct dvb_v5_fe_parms *parms, struct dvb_table_sdt *table);
182 
183 #ifdef __cplusplus
184 }
185 #endif
186 
187 #endif
188