1 /*
2  * Copyright (c) 2011-2012 - Mauro Carvalho Chehab
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation version 2.1 of the License.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU Lesser General Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16  * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
17  */
18 
19 #include <inttypes.h>
20 #include <stddef.h>
21 #include <stdlib.h>
22 #include <stdio.h>
23 
24 #include <libdvbv5/descriptors.h>
25 #include <libdvbv5/dvb-fe.h>
26 #include <libdvbv5/dvb-scan.h>
27 #include <libdvbv5/dvb-frontend.h>
28 #include <libdvbv5/dvb-v5-std.h>
29 #include <libdvbv5/dvb-log.h>
30 
31 #include <libdvbv5/pat.h>
32 #include <libdvbv5/cat.h>
33 #include <libdvbv5/pmt.h>
34 #include <libdvbv5/nit.h>
35 #include <libdvbv5/sdt.h>
36 #include <libdvbv5/eit.h>
37 #include <libdvbv5/vct.h>
38 #include <libdvbv5/mgt.h>
39 #include <libdvbv5/atsc_eit.h>
40 #include <libdvbv5/desc_language.h>
41 #include <libdvbv5/desc_network_name.h>
42 #include <libdvbv5/desc_cable_delivery.h>
43 #include <libdvbv5/desc_sat.h>
44 #include <libdvbv5/desc_terrestrial_delivery.h>
45 #include <libdvbv5/desc_isdbt_delivery.h>
46 #include <libdvbv5/desc_service.h>
47 #include <libdvbv5/desc_frequency_list.h>
48 #include <libdvbv5/desc_event_short.h>
49 #include <libdvbv5/desc_event_extended.h>
50 #include <libdvbv5/desc_atsc_service_location.h>
51 #include <libdvbv5/desc_hierarchy.h>
52 #include <libdvbv5/desc_ts_info.h>
53 #include <libdvbv5/desc_logical_channel.h>
54 #include <libdvbv5/desc_partial_reception.h>
55 #include <libdvbv5/desc_ca.h>
56 #include <libdvbv5/desc_ca_identifier.h>
57 #include <libdvbv5/desc_extension.h>
58 
dvb_desc_init(uint8_t type,uint8_t length,struct dvb_desc * desc)59 static void dvb_desc_init(uint8_t type, uint8_t length, struct dvb_desc *desc)
60 {
61 	desc->type   = type;
62 	desc->length = length;
63 	desc->next   = NULL;
64 }
65 
dvb_desc_default_init(struct dvb_v5_fe_parms * parms,const uint8_t * buf,struct dvb_desc * desc)66 static int dvb_desc_default_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
67 {
68 	memcpy(desc->data, buf, desc->length);
69 	return 0;
70 }
71 
dvb_desc_default_print(struct dvb_v5_fe_parms * parms,const struct dvb_desc * desc)72 static void dvb_desc_default_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
73 {
74 	if (!parms) {
75 		parms = dvb_fe_dummy();
76 		dvb_hexdump(parms, "|           ", desc->data, desc->length);
77 		free(parms);
78 		return;
79 	}
80 	dvb_hexdump(parms, "|           ", desc->data, desc->length);
81 }
82 
83 #define TABLE_INIT(_x) (dvb_table_init_func) _x##_init
84 
85 const dvb_table_init_func dvb_table_initializers[256] = {
86 	[0 ... 255]              = NULL,
87 	[DVB_TABLE_PAT]          = TABLE_INIT(dvb_table_pat),
88 	[DVB_TABLE_CAT]          = TABLE_INIT(dvb_table_cat),
89 	[DVB_TABLE_PMT]          = TABLE_INIT(dvb_table_pmt),
90 	[DVB_TABLE_NIT]          = TABLE_INIT(dvb_table_nit),
91 	[DVB_TABLE_NIT2]         = TABLE_INIT(dvb_table_nit),
92 	[DVB_TABLE_SDT]          = TABLE_INIT(dvb_table_sdt),
93 	[DVB_TABLE_SDT2]         = TABLE_INIT(dvb_table_sdt),
94 	[DVB_TABLE_EIT]          = TABLE_INIT(dvb_table_eit),
95 	[DVB_TABLE_EIT_OTHER]	 = TABLE_INIT(dvb_table_eit),
96 	[ATSC_TABLE_MGT]         = TABLE_INIT(atsc_table_mgt),
97 	[ATSC_TABLE_EIT]         = TABLE_INIT(atsc_table_eit),
98 	[ATSC_TABLE_TVCT]        = TABLE_INIT(atsc_table_vct),
99 	[ATSC_TABLE_CVCT]        = TABLE_INIT(atsc_table_vct),
100 	[DVB_TABLE_EIT_SCHEDULE]		= TABLE_INIT(dvb_table_eit),
101 	[DVB_TABLE_EIT_SCHEDULE + 0x01]		= TABLE_INIT(dvb_table_eit),
102 	[DVB_TABLE_EIT_SCHEDULE + 0x02]		= TABLE_INIT(dvb_table_eit),
103 	[DVB_TABLE_EIT_SCHEDULE + 0x03]		= TABLE_INIT(dvb_table_eit),
104 	[DVB_TABLE_EIT_SCHEDULE + 0x04]		= TABLE_INIT(dvb_table_eit),
105 	[DVB_TABLE_EIT_SCHEDULE + 0x05]		= TABLE_INIT(dvb_table_eit),
106 	[DVB_TABLE_EIT_SCHEDULE + 0x06]		= TABLE_INIT(dvb_table_eit),
107 	[DVB_TABLE_EIT_SCHEDULE + 0x07]		= TABLE_INIT(dvb_table_eit),
108 	[DVB_TABLE_EIT_SCHEDULE + 0x08]		= TABLE_INIT(dvb_table_eit),
109 	[DVB_TABLE_EIT_SCHEDULE + 0x09]		= TABLE_INIT(dvb_table_eit),
110 	[DVB_TABLE_EIT_SCHEDULE + 0x0a]		= TABLE_INIT(dvb_table_eit),
111 	[DVB_TABLE_EIT_SCHEDULE + 0x0b]		= TABLE_INIT(dvb_table_eit),
112 	[DVB_TABLE_EIT_SCHEDULE + 0x0c]		= TABLE_INIT(dvb_table_eit),
113 	[DVB_TABLE_EIT_SCHEDULE + 0x0d]		= TABLE_INIT(dvb_table_eit),
114 	[DVB_TABLE_EIT_SCHEDULE + 0x0e]		= TABLE_INIT(dvb_table_eit),
115 	[DVB_TABLE_EIT_SCHEDULE + 0x0f]		= TABLE_INIT(dvb_table_eit),
116 	[DVB_TABLE_EIT_SCHEDULE_OTHER]		= TABLE_INIT(dvb_table_eit),
117 	[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x01]	= TABLE_INIT(dvb_table_eit),
118 	[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x02]	= TABLE_INIT(dvb_table_eit),
119 	[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x03]	= TABLE_INIT(dvb_table_eit),
120 	[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x04]	= TABLE_INIT(dvb_table_eit),
121 	[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x05]	= TABLE_INIT(dvb_table_eit),
122 	[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x06]	= TABLE_INIT(dvb_table_eit),
123 	[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x07]	= TABLE_INIT(dvb_table_eit),
124 	[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x08]	= TABLE_INIT(dvb_table_eit),
125 	[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x09]	= TABLE_INIT(dvb_table_eit),
126 	[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x0a]	= TABLE_INIT(dvb_table_eit),
127 	[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x0b]	= TABLE_INIT(dvb_table_eit),
128 	[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x0c]	= TABLE_INIT(dvb_table_eit),
129 	[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x0d]	= TABLE_INIT(dvb_table_eit),
130 	[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x0e]	= TABLE_INIT(dvb_table_eit),
131 	[DVB_TABLE_EIT_SCHEDULE_OTHER + 0x0f]	= TABLE_INIT(dvb_table_eit),
132 };
133 
dvb_desc_parse(struct dvb_v5_fe_parms * parms,const uint8_t * buf,uint16_t buflen,struct dvb_desc ** head_desc)134 int dvb_desc_parse(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
135 			   uint16_t buflen, struct dvb_desc **head_desc)
136 {
137 	const uint8_t *ptr = buf, *endbuf = buf + buflen;
138 	struct dvb_desc *current = NULL;
139 	struct dvb_desc *last = NULL;
140 
141 	*head_desc = NULL;
142 
143 	while (ptr + 2 <= endbuf ) {
144 		uint8_t desc_type = ptr[0];
145 		uint8_t desc_len  = ptr[1];
146 		size_t size;
147 
148 		if (desc_type == 0xff ) {
149 			dvb_logwarn("%s: stopping at invalid descriptor 0xff", __func__);
150 			return 0;
151 		}
152 
153 		ptr += 2; /* skip type and length */
154 
155 		if (ptr + desc_len > endbuf) {
156 			dvb_logerr("%s: short read of %zd/%d bytes parsing descriptor %#02x",
157 				   __func__, endbuf - ptr, desc_len, desc_type);
158 			return -1;
159 		}
160 
161 		switch (parms->verbose) {
162 		case 0:
163 		case 1:
164 			break;
165 		case 2:
166 			if (dvb_descriptors[desc_type].init)
167 				break;
168 			/* fall through */
169 		case 3:
170 			dvb_log("%sdescriptor %s type 0x%02x, size %d",
171 				dvb_descriptors[desc_type].init ? "" : "Not handled ",
172 				dvb_descriptors[desc_type].name, desc_type, desc_len);
173 			dvb_hexdump(parms, "content: ", ptr, desc_len);
174 		}
175 
176 		dvb_desc_init_func init = dvb_descriptors[desc_type].init;
177 		if (!init) {
178 			init = dvb_desc_default_init;
179 			size = sizeof(struct dvb_desc) + desc_len;
180 		} else {
181 			size = dvb_descriptors[desc_type].size;
182 		}
183 		if (!size) {
184 			dvb_logerr("descriptor type 0x%02x has no size defined", desc_type);
185 			return -2;
186 		}
187 
188 		current = calloc(1, size);
189 		if (!current) {
190 			dvb_logerr("%s: out of memory", __func__);
191 			return -3;
192 		}
193 		dvb_desc_init(desc_type, desc_len, current); /* initialize the standard header */
194 		if (init(parms, ptr, current) != 0) {
195 			free(current);
196 			return -4;
197 		}
198 		if (!*head_desc)
199 			*head_desc = current;
200 		if (last)
201 			last->next = current;
202 		last = current;
203 		ptr += current->length;     /* standard descriptor header plus descriptor length */
204 	}
205 	return 0;
206 }
207 
dvb_desc_print(struct dvb_v5_fe_parms * parms,struct dvb_desc * desc)208 void dvb_desc_print(struct dvb_v5_fe_parms *parms, struct dvb_desc *desc)
209 {
210 	while (desc) {
211 		dvb_desc_print_func print = dvb_descriptors[desc->type].print;
212 		if (!print)
213 			print = dvb_desc_default_print;
214 		dvb_loginfo("|        0x%02x: %s", desc->type, dvb_descriptors[desc->type].name);
215 		print(parms, desc);
216 		desc = desc->next;
217 	}
218 }
219 
dvb_desc_free(struct dvb_desc ** list)220 void dvb_desc_free(struct dvb_desc **list)
221 {
222 	struct dvb_desc *desc = *list;
223 	while (desc) {
224 		struct dvb_desc *tmp = desc;
225 		desc = desc->next;
226 		if (dvb_descriptors[tmp->type].free)
227 			dvb_descriptors[tmp->type].free(tmp);
228 		free(tmp);
229 	}
230 	*list = NULL;
231 }
232 
233 const struct dvb_descriptor dvb_descriptors[] = {
234 	[0 ...255 ] = {
235 		.name  = "Unknown descriptor",
236 		.init  = NULL,
237 		.print = NULL,
238 		.free  = NULL,
239 		.size  = 0,
240 	},
241 	[video_stream_descriptor] = {
242 		.name  = "video_stream_descriptor",
243 		.init  = NULL,
244 		.print = NULL,
245 		.free  = NULL,
246 		.size  = 0,
247 	},
248 	[audio_stream_descriptor] = {
249 		.name  = "audio_stream_descriptor",
250 		.init  = NULL,
251 		.print = NULL,
252 		.free  = NULL,
253 		.size  = 0,
254 	},
255 	[hierarchy_descriptor] = {
256 		.name  = "hierarchy_descriptor",
257 		.init  = dvb_desc_hierarchy_init,
258 		.print = dvb_desc_hierarchy_print,
259 		.free  = NULL,
260 		.size  = sizeof(struct dvb_desc_hierarchy),
261 	},
262 	[registration_descriptor] = {
263 		.name  = "registration_descriptor",
264 		.init  = NULL,
265 		.print = NULL,
266 		.free  = NULL,
267 		.size  = 0,
268 	},
269 	[ds_alignment_descriptor] = {
270 		.name  = "ds_alignment_descriptor",
271 		.init  = NULL,
272 		.print = NULL,
273 		.free  = NULL,
274 		.size  = 0,
275 	},
276 	[target_background_grid_descriptor] = {
277 		.name  = "target_background_grid_descriptor",
278 		.init  = NULL,
279 		.print = NULL,
280 		.free  = NULL,
281 		.size  = 0,
282 	},
283 	[video_window_descriptor] = {
284 		.name  = "video_window_descriptor",
285 		.init  = NULL,
286 		.print = NULL,
287 		.free  = NULL,
288 		.size  = 0,
289 	},
290 	[conditional_access_descriptor] = {
291 		.name  = "conditional_access_descriptor",
292 		.init  = dvb_desc_ca_init,
293 		.print = dvb_desc_ca_print,
294 		.free  = dvb_desc_ca_free,
295 		.size  = sizeof(struct dvb_desc_ca),
296 	},
297 	[iso639_language_descriptor] = {
298 		.name  = "iso639_language_descriptor",
299 		.init  = dvb_desc_language_init,
300 		.print = dvb_desc_language_print,
301 		.free  = NULL,
302 		.size  = sizeof(struct dvb_desc_language),
303 	},
304 	[system_clock_descriptor] = {
305 		.name  = "system_clock_descriptor",
306 		.init  = NULL,
307 		.print = NULL,
308 		.free  = NULL,
309 		.size  = 0,
310 	},
311 	[multiplex_buffer_utilization_descriptor] = {
312 		.name  = "multiplex_buffer_utilization_descriptor",
313 		.init  = NULL,
314 		.print = NULL,
315 		.free  = NULL,
316 		.size  = 0,
317 	},
318 	[copyright_descriptor] = {
319 		.name  = "copyright_descriptor",
320 		.init  = NULL,
321 		.print = NULL,
322 		.free  = NULL,
323 		.size  = 0,
324 	},
325 	[maximum_bitrate_descriptor] = {
326 		.name  = "maximum_bitrate_descriptor",
327 		.init  = NULL,
328 		.print = NULL,
329 		.free  = NULL,
330 		.size  = 0,
331 	},
332 	[private_data_indicator_descriptor] = {
333 		.name  = "private_data_indicator_descriptor",
334 		.init  = NULL,
335 		.print = NULL,
336 		.free  = NULL,
337 		.size  = 0,
338 	},
339 	[smoothing_buffer_descriptor] = {
340 		.name  = "smoothing_buffer_descriptor",
341 		.init  = NULL,
342 		.print = NULL,
343 		.free  = NULL,
344 		.size  = 0,
345 	},
346 	[std_descriptor] = {
347 		.name  = "std_descriptor",
348 		.init  = NULL,
349 		.print = NULL,
350 		.free  = NULL,
351 		.size  = 0,
352 	},
353 	[ibp_descriptor] = {
354 		.name  = "ibp_descriptor",
355 		.init  = NULL,
356 		.print = NULL,
357 		.free  = NULL,
358 		.size  = 0,
359 	},
360 	[mpeg4_video_descriptor] = {
361 		.name  = "mpeg4_video_descriptor",
362 		.init  = NULL,
363 		.print = NULL,
364 		.free  = NULL,
365 		.size  = 0,
366 	},
367 	[mpeg4_audio_descriptor] = {
368 		.name  = "mpeg4_audio_descriptor",
369 		.init  = NULL,
370 		.print = NULL,
371 		.free  = NULL,
372 		.size  = 0,
373 	},
374 	[iod_descriptor] = {
375 		.name  = "iod_descriptor",
376 		.init  = NULL,
377 		.print = NULL,
378 		.free  = NULL,
379 		.size  = 0,
380 	},
381 	[sl_descriptor] = {
382 		.name  = "sl_descriptor",
383 		.init  = NULL,
384 		.print = NULL,
385 		.free  = NULL,
386 		.size  = 0,
387 	},
388 	[fmc_descriptor] = {
389 		.name  = "fmc_descriptor",
390 		.init  = NULL,
391 		.print = NULL,
392 		.free  = NULL,
393 		.size  = 0,
394 	},
395 	[external_es_id_descriptor] = {
396 		.name  = "external_es_id_descriptor",
397 		.init  = NULL,
398 		.print = NULL,
399 		.free  = NULL,
400 		.size  = 0,
401 	},
402 	[muxcode_descriptor] = {
403 		.name  = "muxcode_descriptor",
404 		.init  = NULL,
405 		.print = NULL,
406 		.free  = NULL,
407 		.size  = 0,
408 	},
409 	[fmxbuffersize_descriptor] = {
410 		.name  = "fmxbuffersize_descriptor",
411 		.init  = NULL,
412 		.print = NULL,
413 		.free  = NULL,
414 		.size  = 0,
415 	},
416 	[multiplexbuffer_descriptor] = {
417 		.name  = "multiplexbuffer_descriptor",
418 		.init  = NULL,
419 		.print = NULL,
420 		.free  = NULL,
421 		.size  = 0,
422 	},
423 	[content_labeling_descriptor] = {
424 		.name  = "content_labeling_descriptor",
425 		.init  = NULL,
426 		.print = NULL,
427 		.free  = NULL,
428 		.size  = 0,
429 	},
430 	[metadata_pointer_descriptor] = {
431 		.name  = "metadata_pointer_descriptor",
432 		.init  = NULL,
433 		.print = NULL,
434 		.free  = NULL,
435 		.size  = 0,
436 	},
437 	[metadata_descriptor] = {
438 		.name  = "metadata_descriptor",
439 		.init  = NULL,
440 		.print = NULL,
441 		.free  = NULL,
442 		.size  = 0,
443 	},
444 	[metadata_std_descriptor] = {
445 		.name  = "metadata_std_descriptor",
446 		.init  = NULL,
447 		.print = NULL,
448 		.free  = NULL,
449 		.size  = 0,
450 	},
451 	[AVC_video_descriptor] = {
452 		.name  = "AVC_video_descriptor",
453 		.init  = NULL,
454 		.print = NULL,
455 		.free  = NULL,
456 		.size  = 0,
457 	},
458 	[ipmp_descriptor] = {
459 		.name  = "ipmp_descriptor",
460 		.init  = NULL,
461 		.print = NULL,
462 		.free  = NULL,
463 		.size  = 0,
464 	},
465 	[AVC_timing_and_HRD_descriptor] = {
466 		.name  = "AVC_timing_and_HRD_descriptor",
467 		.init  = NULL,
468 		.print = NULL,
469 		.free  = NULL,
470 		.size  = 0,
471 	},
472 	[mpeg2_aac_audio_descriptor] = {
473 		.name  = "mpeg2_aac_audio_descriptor",
474 		.init  = NULL,
475 		.print = NULL,
476 		.free  = NULL,
477 		.size  = 0,
478 	},
479 	[flexmux_timing_descriptor] = {
480 		.name  = "flexmux_timing_descriptor",
481 		.init  = NULL,
482 		.print = NULL,
483 		.free  = NULL,
484 		.size  = 0,
485 	},
486 	[network_name_descriptor] = {
487 		.name  = "network_name_descriptor",
488 		.init  = dvb_desc_network_name_init,
489 		.print = dvb_desc_network_name_print,
490 		.free  = dvb_desc_network_name_free,
491 		.size  = sizeof(struct dvb_desc_network_name),
492 	},
493 	[service_list_descriptor] = {
494 		.name  = "service_list_descriptor",
495 		.init  = NULL,
496 		.print = NULL,
497 		.free  = NULL,
498 		.size  = 0,
499 	},
500 	[stuffing_descriptor] = {
501 		.name  = "stuffing_descriptor",
502 		.init  = NULL,
503 		.print = NULL,
504 		.free  = NULL,
505 		.size  = 0,
506 	},
507 	[satellite_delivery_system_descriptor] = {
508 		.name  = "satellite_delivery_system_descriptor",
509 		.init  = dvb_desc_sat_init,
510 		.print = dvb_desc_sat_print,
511 		.free  = NULL,
512 		.size  = sizeof(struct dvb_desc_sat),
513 	},
514 	[cable_delivery_system_descriptor] = {
515 		.name  = "cable_delivery_system_descriptor",
516 		.init  = dvb_desc_cable_delivery_init,
517 		.print = dvb_desc_cable_delivery_print,
518 		.free  = NULL,
519 		.size  = sizeof(struct dvb_desc_cable_delivery),
520 	},
521 	[VBI_data_descriptor] = {
522 		.name  = "VBI_data_descriptor",
523 		.init  = NULL,
524 		.print = NULL,
525 		.free  = NULL,
526 		.size  = 0,
527 	},
528 	[VBI_teletext_descriptor] = {
529 		.name  = "VBI_teletext_descriptor",
530 		.init  = NULL,
531 		.print = NULL,
532 		.free  = NULL,
533 		.size  = 0,
534 	},
535 	[bouquet_name_descriptor] = {
536 		.name  = "bouquet_name_descriptor",
537 		.init  = NULL,
538 		.print = NULL,
539 		.free  = NULL,
540 		.size  = 0,
541 	},
542 	[service_descriptor] = {
543 		.name  = "service_descriptor",
544 		.init  = dvb_desc_service_init,
545 		.print = dvb_desc_service_print,
546 		.free  = dvb_desc_service_free,
547 		.size  = sizeof(struct dvb_desc_service),
548 	},
549 	[country_availability_descriptor] = {
550 		.name  = "country_availability_descriptor",
551 		.init  = NULL,
552 		.print = NULL,
553 		.free  = NULL,
554 		.size  = 0,
555 	},
556 	[linkage_descriptor] = {
557 		.name  = "linkage_descriptor",
558 		.init  = NULL,
559 		.print = NULL,
560 		.free  = NULL,
561 		.size  = 0,
562 	},
563 	[NVOD_reference_descriptor] = {
564 		.name  = "NVOD_reference_descriptor",
565 		.init  = NULL,
566 		.print = NULL,
567 		.free  = NULL,
568 		.size  = 0,
569 	},
570 	[time_shifted_service_descriptor] = {
571 		.name  = "time_shifted_service_descriptor",
572 		.init  = NULL,
573 		.print = NULL,
574 		.free  = NULL,
575 		.size  = 0,
576 	},
577 	[short_event_descriptor] = {
578 		.name  = "short_event_descriptor",
579 		.init  = dvb_desc_event_short_init,
580 		.print = dvb_desc_event_short_print,
581 		.free  = dvb_desc_event_short_free,
582 		.size  = sizeof(struct dvb_desc_event_short),
583 	},
584 	[extended_event_descriptor] = {
585 		.name  = "extended_event_descriptor",
586 		.init  = dvb_desc_event_extended_init,
587 		.print = dvb_desc_event_extended_print,
588 		.free  = dvb_desc_event_extended_free,
589 		.size  = sizeof(struct dvb_desc_event_extended),
590 	},
591 	[time_shifted_event_descriptor] = {
592 		.name  = "time_shifted_event_descriptor",
593 		.init  = NULL,
594 		.print = NULL,
595 		.free  = NULL,
596 		.size  = 0,
597 	},
598 	[component_descriptor] = {
599 		.name  = "component_descriptor",
600 		.init  = NULL,
601 		.print = NULL,
602 		.free  = NULL,
603 		.size  = 0,
604 	},
605 	[mosaic_descriptor] = {
606 		.name  = "mosaic_descriptor",
607 		.init  = NULL,
608 		.print = NULL,
609 		.free  = NULL,
610 		.size  = 0,
611 	},
612 	[stream_identifier_descriptor] = {
613 		.name  = "stream_identifier_descriptor",
614 		.init  = NULL,
615 		.print = NULL,
616 		.free  = NULL,
617 		.size  = 0,
618 	},
619 	[CA_identifier_descriptor] = {
620 		.name  = "CA_identifier_descriptor",
621 		.init  = dvb_desc_ca_identifier_init,
622 		.print = dvb_desc_ca_identifier_print,
623 		.free  = dvb_desc_ca_identifier_free,
624 		.size  = sizeof(struct dvb_desc_ca_identifier),
625 	},
626 	[content_descriptor] = {
627 		.name  = "content_descriptor",
628 		.init  = NULL,
629 		.print = NULL,
630 		.free  = NULL,
631 		.size  = 0,
632 	},
633 	[parental_rating_descriptor] = {
634 		.name  = "parental_rating_descriptor",
635 		.init  = NULL,
636 		.print = NULL,
637 		.free  = NULL,
638 		.size  = 0,
639 	},
640 	[teletext_descriptor] = {
641 		.name  = "teletext_descriptor",
642 		.init  = NULL,
643 		.print = NULL,
644 		.free  = NULL,
645 		.size  = 0,
646 	},
647 	[telephone_descriptor] = {
648 		.name  = "telephone_descriptor",
649 		.init  = NULL,
650 		.print = NULL,
651 		.free  = NULL,
652 		.size  = 0,
653 	},
654 	[local_time_offset_descriptor] = {
655 		.name  = "local_time_offset_descriptor",
656 		.init  = NULL,
657 		.print = NULL,
658 		.free  = NULL,
659 		.size  = 0,
660 	},
661 	[subtitling_descriptor] = {
662 		.name  = "subtitling_descriptor",
663 		.init  = NULL,
664 		.print = NULL,
665 		.free  = NULL,
666 		.size  = 0,
667 	},
668 	[terrestrial_delivery_system_descriptor] = {
669 		.name  = "terrestrial_delivery_system_descriptor",
670 		.init  = dvb_desc_terrestrial_delivery_init,
671 		.print = dvb_desc_terrestrial_delivery_print,
672 		.free  = NULL,
673 		.size  = sizeof(struct dvb_desc_terrestrial_delivery),
674 	},
675 	[multilingual_network_name_descriptor] = {
676 		.name  = "multilingual_network_name_descriptor",
677 		.init  = NULL,
678 		.print = NULL,
679 		.free  = NULL,
680 		.size  = 0,
681 	},
682 	[multilingual_bouquet_name_descriptor] = {
683 		.name  = "multilingual_bouquet_name_descriptor",
684 		.init  = NULL,
685 		.print = NULL,
686 		.free  = NULL,
687 		.size  = 0,
688 	},
689 	[multilingual_service_name_descriptor] = {
690 		.name  = "multilingual_service_name_descriptor",
691 		.init  = NULL,
692 		.print = NULL,
693 		.free  = NULL,
694 		.size  = 0,
695 	},
696 	[multilingual_component_descriptor] = {
697 		.name  = "multilingual_component_descriptor",
698 		.init  = NULL,
699 		.print = NULL,
700 		.free  = NULL,
701 		.size  = 0,
702 	},
703 	[private_data_specifier_descriptor] = {
704 		.name  = "private_data_specifier_descriptor",
705 		.init  = NULL,
706 		.print = NULL,
707 		.free  = NULL,
708 		.size  = 0,
709 	},
710 	[service_move_descriptor] = {
711 		.name  = "service_move_descriptor",
712 		.init  = NULL,
713 		.print = NULL,
714 		.free  = NULL,
715 		.size  = 0,
716 	},
717 	[short_smoothing_buffer_descriptor] = {
718 		.name  = "short_smoothing_buffer_descriptor",
719 		.init  = NULL,
720 		.print = NULL,
721 		.free  = NULL,
722 		.size  = 0,
723 	},
724 	[frequency_list_descriptor] = {
725 		.name  = "frequency_list_descriptor",
726 		.init  = dvb_desc_frequency_list_init,
727 		.print = dvb_desc_frequency_list_print,
728 		.free  = NULL,
729 		.size  = sizeof(struct dvb_desc_frequency_list),
730 	},
731 	[partial_transport_stream_descriptor] = {
732 		.name  = "partial_transport_stream_descriptor",
733 		.init  = NULL,
734 		.print = NULL,
735 		.free  = NULL,
736 		.size  = 0,
737 	},
738 	[data_broadcast_descriptor] = {
739 		.name  = "data_broadcast_descriptor",
740 		.init  = NULL,
741 		.print = NULL,
742 		.free  = NULL,
743 		.size  = 0,
744 	},
745 	[scrambling_descriptor] = {
746 		.name  = "scrambling_descriptor",
747 		.init  = NULL,
748 		.print = NULL,
749 		.free  = NULL,
750 		.size  = 0,
751 	},
752 	[data_broadcast_id_descriptor] = {
753 		.name  = "data_broadcast_id_descriptor",
754 		.init  = NULL,
755 		.print = NULL,
756 		.free  = NULL,
757 		.size  = 0,
758 	},
759 	[transport_stream_descriptor] = {
760 		.name  = "transport_stream_descriptor",
761 		.init  = NULL,
762 		.print = NULL,
763 		.free  = NULL,
764 		.size  = 0,
765 	},
766 	[DSNG_descriptor] = {
767 		.name  = "DSNG_descriptor",
768 		.init  = NULL,
769 		.print = NULL,
770 		.free  = NULL,
771 		.size  = 0,
772 	},
773 	[PDC_descriptor] = {
774 		.name  = "PDC_descriptor",
775 		.init  = NULL,
776 		.print = NULL,
777 		.free  = NULL,
778 		.size  = 0,
779 	},
780 	[AC_3_descriptor] = {
781 		.name  = "AC_3_descriptor",
782 		.init  = NULL,
783 		.print = NULL,
784 		.free  = NULL,
785 		.size  = 0,
786 	},
787 	[ancillary_data_descriptor] = {
788 		.name  = "ancillary_data_descriptor",
789 		.init  = NULL,
790 		.print = NULL,
791 		.free  = NULL,
792 		.size  = 0,
793 	},
794 	[cell_list_descriptor] = {
795 		.name  = "cell_list_descriptor",
796 		.init  = NULL,
797 		.print = NULL,
798 		.free  = NULL,
799 		.size  = 0,
800 	},
801 	[cell_frequency_link_descriptor] = {
802 		.name  = "cell_frequency_link_descriptor",
803 		.init  = NULL,
804 		.print = NULL,
805 		.free  = NULL,
806 		.size  = 0,
807 	},
808 	[announcement_support_descriptor] = {
809 		.name  = "announcement_support_descriptor",
810 		.init  = NULL,
811 		.print = NULL,
812 		.free  = NULL,
813 		.size  = 0,
814 	},
815 	[application_signalling_descriptor] = {
816 		.name  = "application_signalling_descriptor",
817 		.init  = NULL,
818 		.print = NULL,
819 		.free  = NULL,
820 		.size  = 0,
821 	},
822 	[adaptation_field_data_descriptor] = {
823 		.name  = "adaptation_field_data_descriptor",
824 		.init  = NULL,
825 		.print = NULL,
826 		.free  = NULL,
827 		.size  = 0,
828 	},
829 	[service_identifier_descriptor] = {
830 		.name  = "service_identifier_descriptor",
831 		.init  = NULL,
832 		.print = NULL,
833 		.free  = NULL,
834 		.size  = 0,
835 	},
836 	[service_availability_descriptor] = {
837 		.name  = "service_availability_descriptor",
838 		.init  = NULL,
839 		.print = NULL,
840 		.free  = NULL,
841 		.size  = 0,
842 	},
843 	[default_authority_descriptor] = {
844 		.name  = "default_authority_descriptor",
845 		.init  = NULL,
846 		.print = NULL,
847 		.free  = NULL,
848 		.size  = 0,
849 	},
850 	[related_content_descriptor] = {
851 		.name  = "related_content_descriptor",
852 		.init  = NULL,
853 		.print = NULL,
854 		.free  = NULL,
855 		.size  = 0,
856 	},
857 	[TVA_id_descriptor] = {
858 		.name  = "TVA_id_descriptor",
859 		.init  = NULL,
860 		.print = NULL,
861 		.free  = NULL,
862 		.size  = 0,
863 	},
864 	[content_identifier_descriptor] = {
865 		.name  = "content_identifier_descriptor",
866 		.init  = NULL,
867 		.print = NULL,
868 		.free  = NULL,
869 		.size  = 0,
870 	},
871 	[time_slice_fec_identifier_descriptor] = {
872 		.name  = "time_slice_fec_identifier_descriptor",
873 		.init  = NULL,
874 		.print = NULL,
875 		.free  = NULL,
876 		.size  = 0,
877 	},
878 	[ECM_repetition_rate_descriptor] = {
879 		.name  = "ECM_repetition_rate_descriptor",
880 		.init  = NULL,
881 		.print = NULL,
882 		.free  = NULL,
883 		.size  = 0,
884 	},
885 	[S2_satellite_delivery_system_descriptor] = {
886 		.name  = "S2_satellite_delivery_system_descriptor",
887 		.init  = NULL,
888 		.print = NULL,
889 		.free  = NULL,
890 		.size  = 0,
891 	},
892 	[enhanced_AC_3_descriptor] = {
893 		.name  = "enhanced_AC_3_descriptor",
894 		.init  = NULL,
895 		.print = NULL,
896 		.free  = NULL,
897 		.size  = 0,
898 	},
899 	[DTS_descriptor] = {
900 		.name  = "DTS_descriptor",
901 		.init  = NULL,
902 		.print = NULL,
903 		.free  = NULL,
904 		.size  = 0,
905 	},
906 	[AAC_descriptor] = {
907 		.name  = "AAC_descriptor",
908 		.init  = NULL,
909 		.print = NULL,
910 		.free  = NULL,
911 		.size  = 0,
912 	},
913 	[XAIT_location_descriptor] = {
914 		.name  = "XAIT_location_descriptor",
915 		.init  = NULL,
916 		.print = NULL,
917 		.free  = NULL,
918 		.size  = 0,
919 	},
920 	[FTA_content_management_descriptor] = {
921 		.name  = "FTA_content_management_descriptor",
922 		.init  = NULL,
923 		.print = NULL,
924 		.free  = NULL,
925 		.size  = 0,
926 	},
927 	[extension_descriptor] = {
928 		.name  = "extension_descriptor",
929 		.init  = dvb_extension_descriptor_init,
930 		.print = dvb_extension_descriptor_print,
931 		.free  = dvb_extension_descriptor_free,
932 		.size  = sizeof(struct dvb_extension_descriptor),
933 	},
934 
935 	[CUE_identifier_descriptor] = {
936 		.name  = "CUE_identifier_descriptor",
937 		.init  = NULL,
938 		.print = NULL,
939 		.free  = NULL,
940 		.size  = 0,
941 	},
942 
943 	[component_name_descriptor] = {
944 		.name  = "component_name_descriptor",
945 		.init  = NULL,
946 		.print = NULL,
947 		.free  = NULL,
948 		.size  = 0,
949 	},
950 	[logical_channel_number_descriptor] = {
951 		.name  = "logical_channel_number_descriptor",
952 		.init  = dvb_desc_logical_channel_init,
953 		.print = dvb_desc_logical_channel_print,
954 		.free  = dvb_desc_logical_channel_free,
955 		.size  = sizeof(struct dvb_desc_logical_channel),
956 	},
957 
958 	[carousel_id_descriptor] = {
959 		.name  = "carousel_id_descriptor",
960 		.init  = NULL,
961 		.print = NULL,
962 		.free  = NULL,
963 		.size  = 0,
964 	},
965 	[association_tag_descriptor] = {
966 		.name  = "association_tag_descriptor",
967 		.init  = NULL,
968 		.print = NULL,
969 		.free  = NULL,
970 		.size  = 0,
971 	},
972 	[deferred_association_tags_descriptor] = {
973 		.name  = "deferred_association_tags_descriptor",
974 		.init  = NULL,
975 		.print = NULL,
976 		.free  = NULL,
977 		.size  = 0,
978 	},
979 
980 	[hierarchical_transmission_descriptor] = {
981 		.name  = "hierarchical_transmission_descriptor",
982 		.init  = NULL,
983 		.print = NULL,
984 		.free  = NULL,
985 		.size  = 0,
986 	},
987 	[digital_copy_control_descriptor] = {
988 		.name  = "digital_copy_control_descriptor",
989 		.init  = NULL,
990 		.print = NULL,
991 		.free  = NULL,
992 		.size  = 0,
993 	},
994 	[network_identifier_descriptor] = {
995 		.name  = "network_identifier_descriptor",
996 		.init  = NULL,
997 		.print = NULL,
998 		.free  = NULL,
999 		.size  = 0,
1000 	},
1001 	[partial_transport_stream_time_descriptor] = {
1002 		.name  = "partial_transport_stream_time_descriptor",
1003 		.init  = NULL,
1004 		.print = NULL,
1005 		.free  = NULL,
1006 		.size  = 0,
1007 	},
1008 	[audio_component_descriptor] = {
1009 		.name  = "audio_component_descriptor",
1010 		.init  = NULL,
1011 		.print = NULL,
1012 		.free  = NULL,
1013 		.size  = 0,
1014 	},
1015 	[hyperlink_descriptor] = {
1016 		.name  = "hyperlink_descriptor",
1017 		.init  = NULL,
1018 		.print = NULL,
1019 		.free  = NULL,
1020 		.size  = 0,
1021 	},
1022 	[target_area_descriptor] = {
1023 		.name  = "target_area_descriptor",
1024 		.init  = NULL,
1025 		.print = NULL,
1026 		.free  = NULL,
1027 		.size  = 0,
1028 	},
1029 	[data_contents_descriptor] = {
1030 		.name  = "data_contents_descriptor",
1031 		.init  = NULL,
1032 		.print = NULL,
1033 		.free  = NULL,
1034 		.size  = 0,
1035 	},
1036 	[video_decode_control_descriptor] = {
1037 		.name  = "video_decode_control_descriptor",
1038 		.init  = NULL,
1039 		.print = NULL,
1040 		.free  = NULL,
1041 		.size  = 0,
1042 	},
1043 	[download_content_descriptor] = {
1044 		.name  = "download_content_descriptor",
1045 		.init  = NULL,
1046 		.print = NULL,
1047 		.free  = NULL,
1048 		.size  = 0,
1049 	},
1050 	[CA_EMM_TS_descriptor] = {
1051 		.name  = "CA_EMM_TS_descriptor",
1052 		.init  = NULL,
1053 		.print = NULL,
1054 		.free  = NULL,
1055 		.size  = 0,
1056 	},
1057 	[CA_contract_information_descriptor] = {
1058 		.name  = "CA_contract_information_descriptor",
1059 		.init  = NULL,
1060 		.print = NULL,
1061 		.free  = NULL,
1062 		.size  = 0,
1063 	},
1064 	[CA_service_descriptor] = {
1065 		.name  = "CA_service_descriptor",
1066 		.init  = NULL,
1067 		.print = NULL,
1068 		.free  = NULL,
1069 		.size  = 0,
1070 	},
1071 	[TS_Information_descriptior] = {
1072 		.name  = "TS_Information_descriptior",
1073 		.init  = dvb_desc_ts_info_init,
1074 		.print = dvb_desc_ts_info_print,
1075 		.free  = dvb_desc_ts_info_free,
1076 		.size  = sizeof(struct dvb_desc_ts_info),
1077 	},
1078 	[extended_broadcaster_descriptor] = {
1079 		.name  = "extended_broadcaster_descriptor",
1080 		.init  = NULL,
1081 		.print = NULL,
1082 		.free  = NULL,
1083 		.size  = 0,
1084 	},
1085 	[logo_transmission_descriptor] = {
1086 		.name  = "logo_transmission_descriptor",
1087 		.init  = NULL,
1088 		.print = NULL,
1089 		.free  = NULL,
1090 		.size  = 0,
1091 	},
1092 	[basic_local_event_descriptor] = {
1093 		.name  = "basic_local_event_descriptor",
1094 		.init  = NULL,
1095 		.print = NULL,
1096 		.free  = NULL,
1097 		.size  = 0,
1098 	},
1099 	[reference_descriptor] = {
1100 		.name  = "reference_descriptor",
1101 		.init  = NULL,
1102 		.print = NULL,
1103 		.free  = NULL,
1104 		.size  = 0,
1105 	},
1106 	[node_relation_descriptor] = {
1107 		.name  = "node_relation_descriptor",
1108 		.init  = NULL,
1109 		.print = NULL,
1110 		.free  = NULL,
1111 		.size  = 0,
1112 	},
1113 	[short_node_information_descriptor] = {
1114 		.name  = "short_node_information_descriptor",
1115 		.init  = NULL,
1116 		.print = NULL,
1117 		.free  = NULL,
1118 		.size  = 0,
1119 	},
1120 	[STC_reference_descriptor] = {
1121 		.name  = "STC_reference_descriptor",
1122 		.init  = NULL,
1123 		.print = NULL,
1124 		.free  = NULL,
1125 		.size  = 0,
1126 	},
1127 	[series_descriptor] = {
1128 		.name  = "series_descriptor",
1129 		.init  = NULL,
1130 		.print = NULL,
1131 		.free  = NULL,
1132 		.size  = 0,
1133 	},
1134 	[event_group_descriptor] = {
1135 		.name  = "event_group_descriptor",
1136 		.init  = NULL,
1137 		.print = NULL,
1138 		.free  = NULL,
1139 		.size  = 0,
1140 	},
1141 	[SI_parameter_descriptor] = {
1142 		.name  = "SI_parameter_descriptor",
1143 		.init  = NULL,
1144 		.print = NULL,
1145 		.free  = NULL,
1146 		.size  = 0,
1147 	},
1148 	[broadcaster_Name_Descriptor] = {
1149 		.name  = "broadcaster_Name_Descriptor",
1150 		.init  = NULL,
1151 		.print = NULL,
1152 		.free  = NULL,
1153 		.size  = 0,
1154 	},
1155 	[component_group_descriptor] = {
1156 		.name  = "component_group_descriptor",
1157 		.init  = NULL,
1158 		.print = NULL,
1159 		.free  = NULL,
1160 		.size  = 0,
1161 	},
1162 	[SI_prime_TS_descriptor] = {
1163 		.name  = "SI_prime_TS_descriptor",
1164 		.init  = NULL,
1165 		.print = NULL,
1166 		.free  = NULL,
1167 		.size  = 0,
1168 	},
1169 	[board_information_descriptor] = {
1170 		.name  = "board_information_descriptor",
1171 		.init  = NULL,
1172 		.print = NULL,
1173 		.free  = NULL,
1174 		.size  = 0,
1175 	},
1176 	[LDT_linkage_descriptor] = {
1177 		.name  = "LDT_linkage_descriptor",
1178 		.init  = NULL,
1179 		.print = NULL,
1180 		.free  = NULL,
1181 		.size  = 0,
1182 	},
1183 	[connected_transmission_descriptor] = {
1184 		.name  = "connected_transmission_descriptor",
1185 		.init  = NULL,
1186 		.print = NULL,
1187 		.free  = NULL,
1188 		.size  = 0,
1189 	},
1190 	[content_availability_descriptor] = {
1191 		.name  = "content_availability_descriptor",
1192 		.init  = NULL,
1193 		.print = NULL,
1194 		.free  = NULL,
1195 		.size  = 0,
1196 	},
1197 	[service_group_descriptor] = {
1198 		.name  = "service_group_descriptor",
1199 		.init  = NULL,
1200 		.print = NULL,
1201 		.free  = NULL,
1202 		.size  = 0,
1203 	},
1204 	[carousel_compatible_composite_descriptor] = {
1205 		.name  = "carousel_compatible_composite_descriptor",
1206 		.init  = NULL,
1207 		.print = NULL,
1208 		.free  = NULL,
1209 		.size  = 0,
1210 	},
1211 	[conditional_playback_descriptor] = {
1212 		.name  = "conditional_playback_descriptor",
1213 		.init  = NULL,
1214 		.print = NULL,
1215 		.free  = NULL,
1216 		.size  = 0,
1217 	},
1218 	[ISDBT_delivery_system_descriptor] = {
1219 		.name  = "ISDBT_delivery_system_descriptor",
1220 		.init  = isdbt_desc_delivery_init,
1221 		.print = isdbt_desc_delivery_print,
1222 		.free  = isdbt_desc_delivery_free,
1223 		.size  = sizeof(struct isdbt_desc_terrestrial_delivery_system),
1224 	},
1225 	[partial_reception_descriptor] = {
1226 		.name  = "partial_reception_descriptor",
1227 		.init  = isdb_desc_partial_reception_init,
1228 		.print = isdb_desc_partial_reception_print,
1229 		.free  = isdb_desc_partial_reception_free,
1230 		.size  = sizeof(struct isdb_desc_partial_reception),
1231 	},
1232 	[emergency_information_descriptor] = {
1233 		.name  = "emergency_information_descriptor",
1234 		.init  = NULL,
1235 		.print = NULL,
1236 		.free  = NULL,
1237 		.size  = 0,
1238 	},
1239 	[data_component_descriptor] = {
1240 		.name  = "data_component_descriptor",
1241 		.init  = NULL,
1242 		.print = NULL,
1243 		.free  = NULL,
1244 		.size  = 0,
1245 	},
1246 	[system_management_descriptor] = {
1247 		.name  = "system_management_descriptor",
1248 		.init  = NULL,
1249 		.print = NULL,
1250 		.free  = NULL,
1251 		.size  = 0,
1252 	},
1253 	[atsc_stuffing_descriptor] = {
1254 		.name  = "atsc_stuffing_descriptor",
1255 		.init  = NULL,
1256 		.print = NULL,
1257 		.free  = NULL,
1258 		.size  = 0,
1259 	},
1260 	[atsc_ac3_audio_descriptor] = {
1261 		.name  = "atsc_ac3_audio_descriptor",
1262 		.init  = NULL,
1263 		.print = NULL,
1264 		.free  = NULL,
1265 		.size  = 0,
1266 	},
1267 	[atsc_caption_service_descriptor] = {
1268 		.name  = "atsc_caption_service_descriptor",
1269 		.init  = NULL,
1270 		.print = NULL,
1271 		.free  = NULL,
1272 		.size  = 0,
1273 	},
1274 	[atsc_content_advisory_descriptor] = {
1275 		.name  = "atsc_content_advisory_descriptor",
1276 		.init  = NULL,
1277 		.print = NULL,
1278 		.free  = NULL,
1279 		.size  = 0,
1280 	},
1281 	[atsc_extended_channel_descriptor] = {
1282 		.name  = "atsc_extended_channel_descriptor",
1283 		.init  = NULL,
1284 		.print = NULL,
1285 		.free  = NULL,
1286 		.size  = 0,
1287 	},
1288 	[atsc_service_location_descriptor] = {
1289 		.name  = "atsc_service_location_descriptor",
1290 		.init  = atsc_desc_service_location_init,
1291 		.print = atsc_desc_service_location_print,
1292 		.free  = atsc_desc_service_location_free,
1293 		.size  = sizeof(struct atsc_desc_service_location),
1294 	},
1295 	[atsc_time_shifted_service_descriptor] = {
1296 		.name  = "atsc_time_shifted_service_descriptor",
1297 		.init  = NULL,
1298 		.print = NULL,
1299 		.free  = NULL,
1300 		.size  = 0,
1301 	},
1302 	[atsc_component_name_descriptor] = {
1303 		.name  = "atsc_component_name_descriptor",
1304 		.init  = NULL,
1305 		.print = NULL,
1306 		.free  = NULL,
1307 		.size  = 0,
1308 	},
1309 	[atsc_DCC_departing_request_descriptor] = {
1310 		.name  = "atsc_DCC_departing_request_descriptor",
1311 		.init  = NULL,
1312 		.print = NULL,
1313 		.free  = NULL,
1314 		.size  = 0,
1315 	},
1316 	[atsc_DCC_arriving_request_descriptor] = {
1317 		.name  = "atsc_DCC_arriving_request_descriptor",
1318 		.init  = NULL,
1319 		.print = NULL,
1320 		.free  = NULL,
1321 		.size  = 0,
1322 	},
1323 	[atsc_redistribution_control_descriptor] = {
1324 		.name  = "atsc_redistribution_control_descriptor",
1325 		.init  = NULL,
1326 		.print = NULL,
1327 		.free  = NULL,
1328 		.size  = 0,
1329 	},
1330 	[atsc_ATSC_private_information_descriptor] = {
1331 		.name  = "atsc_ATSC_private_information_descriptor",
1332 		.init  = NULL,
1333 		.print = NULL,
1334 		.free  = NULL,
1335 		.size  = 0,
1336 	},
1337 	[atsc_genre_descriptor] = {
1338 		.name  = "atsc_genre_descriptor",
1339 		.init  = NULL,
1340 		.print = NULL,
1341 		.free  = NULL,
1342 		.size  = 0,
1343 	},
1344 };
1345 
dvb_bcd(uint32_t bcd)1346 uint32_t dvb_bcd(uint32_t bcd)
1347 {
1348 	uint32_t ret = 0, mult = 1;
1349 	while (bcd) {
1350 		ret += (bcd & 0x0f) * mult;
1351 		bcd >>=4;
1352 		mult *= 10;
1353 	}
1354 	return ret;
1355 }
1356 
dvb_hexdump(struct dvb_v5_fe_parms * parms,const char * prefix,const unsigned char * data,int length)1357 void dvb_hexdump(struct dvb_v5_fe_parms *parms, const char *prefix, const unsigned char *data, int length)
1358 {
1359 	char ascii[17];
1360 	char hex[50];
1361 	int i, j = 0;
1362 
1363 	if (!data)
1364 		return;
1365 	hex[0] = '\0';
1366 	for (i = 0; i < length; i++) {
1367 		char t[4];
1368 
1369 		snprintf (t, sizeof(t), "%02x ", (unsigned int) data[i]);
1370 		strncat (hex, t, sizeof(hex) - 1);
1371 		if (data[i] > 31 && data[i] < 128 )
1372 			ascii[j] = data[i];
1373 		else
1374 			ascii[j] = '.';
1375 		j++;
1376 		if (j == 8)
1377 			strncat(hex, " ", sizeof(hex) - 1);
1378 		if (j == 16) {
1379 			ascii[j] = '\0';
1380 			dvb_loginfo("%s%s  %s", prefix, hex, ascii);
1381 			j = 0;
1382 			hex[0] = '\0';
1383 		}
1384 	}
1385 	if (j > 0 && j < 16) {
1386 		char spaces[50];
1387 		for (i = 0; i < sizeof(spaces) - 1 - strlen(hex); i++)
1388 			spaces[i] = ' ';
1389 		spaces[i] = '\0';
1390 		ascii[j] = '\0';
1391 		dvb_loginfo("%s%s %s %s", prefix, hex, spaces, ascii);
1392 	}
1393 }
1394