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