#ifndef HELP_HEADER " \6AleVT Online Help System ", " \22`p0`0 p `0pppp ", "\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34", "\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34", " \22# #\42!\42# \42 \42! ", #else HELP_HEADER #endif " ", "\6\15QuickClick: ", "\6\15QuickClick: ", "\24 #################################### ", "\6 100 200 300 400 500 600 700 800 ", "\6 101 201 301 401 501 601 701 801 ", "\6 110 210 310 410 510 610 710 810 ", "\6 120\006220 320 420 520 620 720 820 ", "\6 130 230 330 430 530 630 730 830 ", "\6 140\006240 340 440 540 640 740 840 ", "\6 150 250 350 450 550 650 750 850 ", "\6 160\006260 360 460 560 660 760 860 ", "\6 170 270 370 470 570 670 770 870 ", "\6 180\006280 380 480 580 680 780 880 ", "\6 190 290 390 490 590 690 790 890 ", "\24 pppppppppppppppppppppppppppppppppppp ", " ", " ", "\4\35\7 Index 900 \34", "\1Page 100 \2Page 200 \3Page 300 \6Page 400\34", McCrohan
aboutsummaryrefslogtreecommitdiffstats
path: root/lib/libucsi/atsc/mgt_section.c
blob: bc6b3f236749f672d2d4baec927ef1c81b2e8a97 (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
/*
 * section and descriptor parser
 *
 * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
 * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 */

#include <libucsi/atsc/mgt_section.h>

struct atsc_mgt_section *atsc_mgt_section_codec(struct atsc_section_psip *psip)
{
	uint8_t * buf = (uint8_t *) psip;
	size_t pos = sizeof(struct atsc_section_psip);
	size_t len = section_ext_length(&(psip->ext_head));
	struct atsc_mgt_section *mgt = (struct atsc_mgt_section *) psip;
	int i;

	if (len < sizeof(struct atsc_mgt_section))
		return NULL;

	bswap16(buf + pos);
	pos += 2;

	// we cannot use the tables_defined value here because of the braindead ATSC spec!
	for(i=0; i < mgt->tables_defined; i++) {
		// we think we're still in the tables - process as normal
		if ((pos + sizeof(struct atsc_mgt_table)) > len)
			return NULL;
		struct atsc_mgt_table *table = (struct atsc_mgt_table *) (buf+pos);

		bswap16(buf+pos);
		bswap16(buf+pos+2);
		bswap32(buf+pos+5);
		bswap16(buf+pos+9);

		pos += sizeof(struct atsc_mgt_table);
		if ((pos + table->table_type_descriptors_length) > len)
			return NULL;
		if (verify_descriptors(buf + pos, table->table_type_descriptors_length))
			return NULL;

		pos += table->table_type_descriptors_length;
	}

	if ((pos + sizeof(struct atsc_mgt_section_part2)) > len)
		return NULL;
	struct atsc_mgt_section_part2 *part2 = (struct atsc_mgt_section_part2 *) (buf+pos);

	bswap16(buf+pos);

	pos += sizeof(struct atsc_mgt_section_part2);
	if ((pos + part2->descriptors_length) > len)
		return NULL;
	if (verify_descriptors(buf + pos, part2->descriptors_length))
		return NULL;
	pos += part2->descriptors_length;

	if (pos != len)
		return NULL;

	return (struct atsc_mgt_section *) psip;
}