diff options
Diffstat (limited to 'lib/libucsi/dvb')
102 files changed, 12246 insertions, 0 deletions
| diff --git a/lib/libucsi/dvb/Makefile b/lib/libucsi/dvb/Makefile new file mode 100644 index 0000000..78876dc --- /dev/null +++ b/lib/libucsi/dvb/Makefile @@ -0,0 +1,121 @@ +# Makefile for linuxtv.org dvb-apps/lib/libucsi/dvb + +.PHONY: sub-error-dvb + +sub-error-dvb: +	$(error You can't use this makefile directly.) + +ifneq ($(lib_name),) + +objects += dvb/bat_section.o           \ +           dvb/dit_section.o           \ +           dvb/eit_section.o           \ +           dvb/int_section.o           \ +           dvb/nit_section.o           \ +           dvb/rst_section.o           \ +           dvb/sdt_section.o           \ +           dvb/sit_section.o           \ +           dvb/st_section.o            \ +           dvb/tdt_section.o           \ +           dvb/tot_section.o           \ +           dvb/tva_container_section.o \ +           dvb/types.o + +sub-install += dvb + +else + +includes = ac3_descriptor.h                                    \ +           adaptation_field_data_descriptor.h                  \ +           ait_application_descriptor.h                        \ +           ait_application_icons_descriptor.h                  \ +           ait_application_name_descriptor.h                   \ +           ait_external_application_authorisation_descriptor.h \ +           ancillary_data_descriptor.h                         \ +           announcement_support_descriptor.h                   \ +           application_signalling_descriptor.h                 \ +           bat_section.h                                       \ +           bouquet_name_descriptor.h                           \ +           ca_identifier_descriptor.h                          \ +           cable_delivery_descriptor.h                         \ +           cell_frequency_link_descriptor.h                    \ +           cell_list_descriptor.h                              \ +           component_descriptor.h                              \ +           content_descriptor.h                                \ +           content_identifier_descriptor.h                     \ +           country_availability_descriptor.h                   \ +           data_broadcast_descriptor.h                         \ +           data_broadcast_id_descriptor.h                      \ +           default_authority_descriptor.h                      \ +           descriptor.h                                        \ +           dit_section.h                                       \ +           dsng_descriptor.h                                   \ +           eit_section.h                                       \ +           extended_event_descriptor.h                         \ +           frequency_list_descriptor.h                         \ +           int_section.h                                       \ +           ip_mac_platform_name_descriptor.h                   \ +           ip_mac_platform_provider_name_descriptor.h          \ +           ip_mac_stream_location_descriptor.h                 \ +           linkage_descriptor.h                                \ +           local_time_offset_descriptor.h                      \ +           mhp_data_broadcast_id_descriptor.h                  \ +           mosaic_descriptor.h                                 \ +           multilingual_bouquet_name_descriptor.h              \ +           multilingual_component_descriptor.h                 \ +           multilingual_network_name_descriptor.h              \ +           multilingual_service_name_descriptor.h              \ +           network_name_descriptor.h                           \ +           nit_section.h                                       \ +           nvod_reference_descriptor.h                         \ +           parental_rating_descriptor.h                        \ +           partial_transport_stream_descriptor.h               \ +           pdc_descriptor.h                                    \ +           private_data_specifier_descriptor.h                 \ +           related_content_descriptor.h                        \ +           rnt_rar_over_dvb_stream_descriptor.h                \ +           rnt_rar_over_ip_descriptor.h                        \ +           rnt_rnt_scan_descriptor.h                           \ +           rst_section.h                                       \ +           s2_satellite_delivery_descriptor.h                  \ +           satellite_delivery_descriptor.h                     \ +           scrambling_descriptor.h                             \ +           sdt_section.h                                       \ +           section.h                                           \ +           service_availability_descriptor.h                   \ +           service_descriptor.h                                \ +           service_identifier_descriptor.h                     \ +           service_list_descriptor.h                           \ +           service_move_descriptor.h                           \ +           short_event_descriptor.h                            \ +           short_smoothing_buffer_descriptor.h                 \ +           sit_section.h                                       \ +           st_section.h                                        \ +           stream_identifier_descriptor.h                      \ +           stuffing_descriptor.h                               \ +           subtitling_descriptor.h                             \ +           target_ip_address_descriptor.h                      \ +           target_ipv6_address_descriptor.h                    \ +           target_ip_slash_descriptor.h                        \ +           target_ip_source_slash_descriptor.h                 \ +           target_ipv6_slash_descriptor.h                      \ +           target_ipv6_source_slash_descriptor.h               \ +           tdt_section.h                                       \ +           telephone_descriptor.h                              \ +           teletext_descriptor.h                               \ +           terrestrial_delivery_descriptor.h                   \ +           time_shifted_event_descriptor.h                     \ +           time_shifted_service_descriptor.h                   \ +           tot_section.h                                       \ +           transport_stream_descriptor.h                       \ +           tva_container_section.h                             \ +           tva_id_descriptor.h                                 \ +           types.h                                             \ +           vbi_data_descriptor.h                               \ +           vbi_teletext_descriptor.h + +include ../../../Make.rules + +lib_name = libucsi/dvb + +endif diff --git a/lib/libucsi/dvb/ac3_descriptor.h b/lib/libucsi/dvb/ac3_descriptor.h new file mode 100644 index 0000000..0a2a5cd --- /dev/null +++ b/lib/libucsi/dvb/ac3_descriptor.h @@ -0,0 +1,88 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_AC3_DESCRIPTOR +#define _UCSI_DVB_AC3_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_ac3_descriptor structure. + */ +struct dvb_ac3_descriptor { +	struct descriptor d; + +  EBIT5(uint8_t ac3_type_flag		: 1; , +	uint8_t bsid_flag		: 1; , +	uint8_t mainid_flag		: 1; , +	uint8_t asvc_flag		: 1; , +	uint8_t reserved		: 4; ); +	/* uint8_t additional_info[] */ +} __ucsi_packed; + +/** + * Process a dvb_ac3_descriptor. + * + * @param d Generic descriptor structure. + * @return dvb_ac3_descriptor pointer, or NULL on error. + */ +static inline struct dvb_ac3_descriptor* +	dvb_ac3_descriptor_codec(struct descriptor* d) +{ +	if (d->len < (sizeof(struct dvb_ac3_descriptor) - 2)) +		return NULL; + +	return (struct dvb_ac3_descriptor*) d; +} + +/** + * Retrieve pointer to additional_info field of a dvb_ac3_descriptor. + * + * @param d dvb_ac3_descriptor pointer. + * @return Pointer to additional_info field. + */ +static inline uint8_t *dvb_ac3_descriptor_additional_info(struct dvb_ac3_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_ac3_descriptor); +} + +/** + * Determine length of additional_info field of a dvb_ac3_descriptor. + * + * @param d dvb_ac3_descriptor pointer. + * @return Length of field in bytes. + */ +static inline int dvb_ac3_descriptor_additional_info_length(struct dvb_ac3_descriptor *d) +{ +	return d->d.len - 1; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/adaptation_field_data_descriptor.h b/lib/libucsi/dvb/adaptation_field_data_descriptor.h new file mode 100644 index 0000000..b207054 --- /dev/null +++ b/lib/libucsi/dvb/adaptation_field_data_descriptor.h @@ -0,0 +1,62 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_ADAPTATION_FIELD_DATA_DESCRIPTOR +#define _UCSI_DVB_ADAPTATION_FIELD_DATA_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_adaptation_field_data_descriptor structure. + */ +struct dvb_adaptation_field_data_descriptor { +	struct descriptor d; + +  EBIT2(uint8_t reserved			: 7; , +	uint8_t announcement_switching_data	: 1; ); +} __ucsi_packed; + +/** + * Process a dvb_adaptation_field_data_descriptor. + * + * @param d Generic descriptor structure. + * @return Pointer to dvb_adaptation_field_data_descriptor, or NULL on error. + */ +static inline struct dvb_adaptation_field_data_descriptor* +	dvb_adaptation_field_data_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct dvb_adaptation_field_data_descriptor) - 2)) +		return NULL; + +	return (struct dvb_adaptation_field_data_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/ait_application_descriptor.h b/lib/libucsi/dvb/ait_application_descriptor.h new file mode 100644 index 0000000..95fb7e3 --- /dev/null +++ b/lib/libucsi/dvb/ait_application_descriptor.h @@ -0,0 +1,204 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_AIT_APPLICATION_DESCRIPTOR +#define _UCSI_DVB_AIT_APPLICATION_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * Possible values for the visibility field. + */ +enum { +	AVB_AIT_APPLICATION_VISIBILITY_HIDDEN		= 0x00, +	AVB_AIT_APPLICATION_VISIBILITY_APPSONLY		= 0x01, +	AVB_AIT_APPLICATION_VISIBILITY_VISIBLE		= 0x03, +}; + +/** + * dvb_ait_application_descriptor structure. + */ +struct dvb_ait_application_descriptor { +	struct descriptor d; + +	uint8_t application_profiles_length; +	/* struct dvb_ait_application_profile profiles [] */ +	/* struct dvb_ait_application_descriptor_part2 part2 */ +} __ucsi_packed; + +/** + * An entry in the profiles field of a dvb_ait_application_descriptor. + */ +struct dvb_ait_application_profile { +	uint16_t application_profile; +	uint8_t version_major; +	uint8_t version_minor; +	uint8_t version_micro; +} __ucsi_packed; + +/** + * Second part of a dvb_ait_application_descriptor structure. + */ +struct dvb_ait_application_descriptor_part2 { +  EBIT3(uint8_t service_bound_flag		: 1; , +	uint8_t visibility			: 2; , +	uint8_t reserved			: 5; ); +	uint8_t application_priority; +	/* uint8_t transport_protocol_label[] */ +} __ucsi_packed; + +/** + * Process a dvb_ait_application_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_ait_application_descriptor pointer, or NULL on error. + */ +static inline struct dvb_ait_application_descriptor* +	dvb_ait_application_descriptor_codec(struct descriptor* d) +{ +	uint32_t pos = 0; +	uint32_t pos2 = 0; +	uint32_t len = d->len + 2; +	uint8_t* buf = (uint8_t*) d; +	struct dvb_ait_application_descriptor *ret = +		(struct dvb_ait_application_descriptor*) d; + +	if (len < sizeof(struct dvb_ait_application_descriptor)) +		return NULL; + +	if (len < (sizeof(struct dvb_ait_application_descriptor) + ret->application_profiles_length)) +		return NULL; + +	if (ret->application_profiles_length % sizeof(struct dvb_ait_application_profile)) +		return NULL; + +	pos += sizeof(struct dvb_ait_application_descriptor); +	pos2 = 0; +	while(pos2 < ret->application_profiles_length) { +		bswap16(buf + pos + pos2); +		pos2 += sizeof(struct dvb_ait_application_descriptor); +	} +	pos += pos2; + +	if (len < (pos + sizeof(struct dvb_ait_application_descriptor_part2))) +		return NULL; + +	return ret; +} + +/** + * Iterator for the profiles field of a dvb_ait_application_descriptor. + * + * @param d dvb_ait_application_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_ait_application_profile. + */ +#define dvb_ait_application_descriptor_profiles_for_each(d, pos) \ +	for ((pos) = dvb_ait_application_descriptor_profiles_first(d); \ +	     (pos); \ +	     (pos) = dvb_ait_application_descriptor_profiles_next(d, pos)) + +/** + * Accessor for the part2 field of a dvb_ait_application_descriptor. + * + * @param d dvb_ait_application_descriptor pointer. + * @return dvb_ait_application_descriptor_part2 pointer. + */ +static inline struct dvb_ait_application_descriptor_part2* +	dvb_ait_application_descriptor_part2(struct dvb_ait_application_descriptor* d) +{ +	return (struct dvb_ait_application_descriptor_part2*) +		((uint8_t*) d + +		 sizeof(struct dvb_ait_application_descriptor) + +		 d->application_profiles_length); +} + +/** + * Accessor for the transport_protocol_label field of a dvb_ait_application_descriptor_part2. + * + * @param d dvb_ait_application_descriptor_part2 pointer. + * @return Pointer to the field. + */ +static inline uint8_t* +	dvb_ait_application_descriptor_part2_transport_protocol_label(struct dvb_ait_application_descriptor_part2* d) +{ +	return (uint8_t*) d + +			sizeof(struct dvb_ait_application_descriptor_part2); +} + +/** + * Calculate the number of bytes in the transport_protocol_label field of a dvb_ait_application_descriptor_part2. + * + * @param d dvb_ait_application_descriptor pointer. + * @param part2 dvb_ait_application_descriptor_part2 pointer. + * @return Number of bytes. + */ +static inline int +	dvb_ait_application_descriptor_part2_transport_protocol_label_length(struct dvb_ait_application_descriptor *d, +									     struct dvb_ait_application_descriptor_part2* part2) +{ +	uint8_t *ptr = (uint8_t*) part2 + sizeof(struct dvb_ait_application_descriptor_part2); +	uint8_t *end = (uint8_t*) d + d->d.len + 2; + +	return (int) (end - ptr); +} + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_ait_application_profile* +	dvb_ait_application_descriptor_profiles_first(struct dvb_ait_application_descriptor *d) +{ +	if (d->application_profiles_length == 0) +		return NULL; + +	return (struct dvb_ait_application_profile *) +		((uint8_t*) d + sizeof(struct dvb_ait_application_descriptor)); +} + +static inline struct dvb_ait_application_profile* +	dvb_ait_application_descriptor_profiles_next(struct dvb_ait_application_descriptor *d, +						     struct dvb_ait_application_profile *pos) +{ +	uint8_t *end = (uint8_t*) d + +			sizeof(struct dvb_ait_application_descriptor) + +			d->application_profiles_length; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_ait_application_profile); + +	if (next >= end) +		return NULL; + +	return (struct dvb_ait_application_profile *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/ait_application_icons_descriptor.h b/lib/libucsi/dvb/ait_application_icons_descriptor.h new file mode 100644 index 0000000..431cd6c --- /dev/null +++ b/lib/libucsi/dvb/ait_application_icons_descriptor.h @@ -0,0 +1,157 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_AIT_APPLICATION_ICONS_DESCRIPTOR +#define _UCSI_DVB_AIT_APPLICATION_ICONS_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + +/** + * Possible values for the icon_flags field. + */ +enum { +	AIT_APPLICATION_ICON_FLAG_32_32		= 0x001, +	AIT_APPLICATION_ICON_FLAG_32_32_43	= 0x002, +	AIT_APPLICATION_ICON_FLAG_24_32_169	= 0x004, + +	AIT_APPLICATION_ICON_FLAG_64_64		= 0x008, +	AIT_APPLICATION_ICON_FLAG_64_64_43	= 0x010, +	AIT_APPLICATION_ICON_FLAG_48_64_169	= 0x020, + +	AIT_APPLICATION_ICON_FLAG_128_128	= 0x040, +	AIT_APPLICATION_ICON_FLAG_128_128_43	= 0x080, +	AIT_APPLICATION_ICON_FLAG_96_128_169	= 0x100, +}; + +/** + * dvb_ait_application_icons_descriptor structure. + */ +struct dvb_ait_application_icons_descriptor { +	struct descriptor d; + +	uint8_t icon_locator_length; +	/* uint8_t icon_locator[] */ +	/* struct dvb_ait_application_icons_descriptor_part2 */ +} __ucsi_packed; + +/** + * Second part of a dvb_ait_application_icons_descriptor. + */ +struct dvb_ait_application_icons_descriptor_part2 { +	uint16_t icon_flags; +	/* uint8_t reserved[] */ +} __ucsi_packed; + +/** + * Process a dvb_ait_application_icons_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_ait_application_icons_descriptor pointer, or NULL on error. + */ +static inline struct dvb_ait_application_icons_descriptor* +	dvb_ait_application_icons_descriptor_codec(struct descriptor* d) +{ +	uint8_t* buf = (uint8_t*) d; +	uint32_t pos = 0; +	uint32_t len = d->len + 2; +	struct dvb_ait_application_icons_descriptor *ret = +		(struct dvb_ait_application_icons_descriptor *) d; + +	if (len < sizeof(struct dvb_ait_application_icons_descriptor)) +		return NULL; +	if (len < (sizeof(struct dvb_ait_application_icons_descriptor) + ret->icon_locator_length)) +		return NULL; + +	pos += sizeof(struct dvb_ait_application_icons_descriptor) + ret->icon_locator_length; + +	if ((len - pos) < sizeof(struct dvb_ait_application_icons_descriptor_part2)) +		return NULL; +	bswap16(buf + pos); + +	return ret; +} +/** + * Accessor for the icon_locator field of a dvb_ait_application_icons_descriptor. + * + * @param e dvb_ait_application_icons_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +	dvb_ait_application_icons_descriptor_icon_locator(struct dvb_ait_application_icons_descriptor *e) +{ +	return (uint8_t *) e + sizeof(struct dvb_ait_application_icons_descriptor); +} + +/** + * Accessor for the part2 field of a dvb_ait_application_icons_descriptor. + * + * @param e dvb_ait_application_icons_descriptor Pointer. + * @return dvb_ait_application_icons_descriptor_part2 pointer. + */ +static inline struct dvb_ait_application_icons_descriptor_part2 * +	dvb_ait_application_icons_descriptor_part2(struct dvb_ait_application_icons_descriptor *e) +{ +	return (struct dvb_ait_application_icons_descriptor_part2 *) +		((uint8_t *) e + sizeof(struct dvb_ait_application_icons_descriptor) + +		e->icon_locator_length); +} + +/** + * Accessor for the reserved field of a dvb_ait_application_icons_descriptor_part2. + * + * @param e dvb_ait_application_icons_part2 pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +	dvb_ait_application_icons_descriptor_part2_reserved(struct dvb_ait_application_icons_descriptor_part2 *e) +{ +	return (uint8_t *) e + sizeof(struct dvb_ait_application_icons_descriptor_part2); +} + +/** + * Calculate the number of bytes in the reserved field of a dvb_ait_application_icons_descriptor_part2. + * + * @param d dvb_ait_application_icons_descriptorpointer. + * @param part2 dvb_ait_application_icons_descriptor_part2 pointer. + * @return Number of bytes. + */ +static inline int +	dvb_ait_application_icons_descriptor_part2_reserved_length(struct dvb_ait_application_icons_descriptor *d, +		struct dvb_ait_application_icons_descriptor_part2* part2) +{ +	uint8_t *ptr = (uint8_t*) part2 + sizeof(struct dvb_ait_application_icons_descriptor_part2); +	uint8_t *end = (uint8_t*) d + d->d.len + 2; + +	return (int) (end - ptr); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/ait_application_name_descriptor.h b/lib/libucsi/dvb/ait_application_name_descriptor.h new file mode 100644 index 0000000..a4b719e --- /dev/null +++ b/lib/libucsi/dvb/ait_application_name_descriptor.h @@ -0,0 +1,145 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_AIT_APPLICATION_NAME_DESCRIPTOR +#define _UCSI_DVB_AIT_APPLICATION_NAME_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + +/** + * dvb_ait_application_name_descriptor structure. + */ +struct dvb_ait_application_name_descriptor { +	struct descriptor d; + +	/* struct dvb_ait_application_name names[] */ +} __ucsi_packed; + +/** + * An entry in the names field of a dvb_ait_application_name_descriptor. + */ +struct dvb_ait_application_name { +	iso639lang_t language_code; +	uint8_t application_name_length; +	/* uint8_t name[] */ +} __ucsi_packed; + +/** + * Process a dvb_ait_application_name_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_ait_application_name_descriptor pointer, or NULL on error. + */ +static inline struct dvb_ait_application_name_descriptor* +	dvb_ait_application_name_descriptor_codec(struct descriptor* d) +{ +	uint8_t* buf = (uint8_t*) d + 2; +	uint32_t pos = 0; +	uint32_t len = d->len; + +	while(pos < len) { +		struct dvb_ait_application_name *e = +			(struct dvb_ait_application_name*) (buf + pos); + +		pos += sizeof(struct dvb_ait_application_name); + +		if (pos > len) +			return NULL; + +		pos += e->application_name_length; + +		if (pos > len) +			return NULL; +	} + +	return (struct dvb_ait_application_name_descriptor*) d; +} + +/** + * Iterator for entries in the names field of a dvb_ait_application_name_descriptor. + * + * @param d dvb_ait_application_name_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_ait_application_name. + */ +#define dvb_ait_application_name_descriptor_names_for_each(d, pos) \ +	for ((pos) = dvb_ait_application_name_descriptor_names_first(d); \ +	     (pos); \ +	     (pos) = dvb_ait_application_name_descriptor_names_next(d, pos)) + +/** + * Accessor for the name field of a dvb_ait_application_name. + * + * @param e dvb_ait_application_name pointer. + * @return Pointer to the name field. + */ +static inline uint8_t * +	dvb_ait_application_name_name(struct dvb_ait_application_name *e) +{ +	return (uint8_t *) e + sizeof(struct dvb_ait_application_name); +} + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_ait_application_name* +	dvb_ait_application_name_descriptor_names_first(struct dvb_ait_application_name_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_ait_application_name *) +		((uint8_t*) d + sizeof(struct dvb_ait_application_name_descriptor)); +} + +static inline struct dvb_ait_application_name* +	dvb_ait_application_name_descriptor_names_next(struct dvb_ait_application_name_descriptor *d, +							    struct dvb_ait_application_name *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + +			sizeof(struct dvb_ait_application_name) + +			pos->application_name_length; + +	if (next >= end) +		return NULL; + +	return (struct dvb_ait_application_name *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/ait_external_application_authorisation_descriptor.h b/lib/libucsi/dvb/ait_external_application_authorisation_descriptor.h new file mode 100644 index 0000000..34f584a --- /dev/null +++ b/lib/libucsi/dvb/ait_external_application_authorisation_descriptor.h @@ -0,0 +1,125 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_AIT_EXTERNAL_APPLICATION_AUTHORISATION_DESCRIPTOR +#define _UCSI_DVB_AIT_EXTERNAL_APPLICATION_AUTHORISATION_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + +/** + * dvb_ait_external_application_authorisation_descriptor structure. + */ +struct dvb_ait_external_application_authorisation_descriptor { +	struct descriptor d; + +	/* struct dvb_ait_external_application_authorisation auths[] */ +} __ucsi_packed; + +/** + * An entry in the auths field of a dvb_ait_external_application_authorisation_descriptor. + */ +struct dvb_ait_external_application_authorisation { +	uint32_t organization_id; +	uint16_t application_id; +	uint8_t application_priority; +} __ucsi_packed; + +/** + * Process a dvb_ait_external_application_authorisation_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_ait_external_application_authorisation_descriptor pointer, or NULL on error. + */ +static inline struct dvb_ait_external_application_authorisation_descriptor* +	dvb_ait_external_application_authorisation_descriptor_codec(struct descriptor* d) +{ +	uint8_t* buf = (uint8_t*) d + 2; +	uint32_t pos = 0; +	uint32_t len = d->len; + +	if (len % sizeof(struct dvb_ait_external_application_authorisation)) +		return NULL; + +	while(pos < len) { +		bswap32(buf + pos); +		bswap32(buf + pos + 4); +		pos += sizeof(struct dvb_ait_external_application_authorisation); +	} + +	return (struct dvb_ait_external_application_authorisation_descriptor*) d; +} + +/** + * Iterator for entries in the auths field of a dvb_ait_external_application_authorisation_descriptor. + * + * @param d dvb_ait_external_application_authorisation_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_ait_external_application_authorisation. + */ +#define dvb_ait_external_application_authorisation_descriptor_auths_for_each(d, pos) \ +	for ((pos) = dvb_ait_external_application_authorisation_descriptor_auths_first(d); \ +	     (pos); \ +	     (pos) = dvb_ait_external_application_authorisation_descriptor_auths_next(d, pos)) + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_ait_external_application_authorisation* +	dvb_ait_external_application_authorisation_descriptor_auths_first(struct dvb_ait_external_application_authorisation_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_ait_external_application_authorisation *) +		((uint8_t*) d + sizeof(struct dvb_ait_external_application_authorisation_descriptor)); +} + +static inline struct dvb_ait_external_application_authorisation* +	dvb_ait_external_application_authorisation_descriptor_auths_next(struct dvb_ait_external_application_authorisation_descriptor *d, +							    struct dvb_ait_external_application_authorisation *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + +			sizeof(struct dvb_ait_external_application_authorisation); + +	if (next >= end) +		return NULL; + +	return (struct dvb_ait_external_application_authorisation *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/ancillary_data_descriptor.h b/lib/libucsi/dvb/ancillary_data_descriptor.h new file mode 100644 index 0000000..04b2f59 --- /dev/null +++ b/lib/libucsi/dvb/ancillary_data_descriptor.h @@ -0,0 +1,67 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_ANCILLARY_DATA_DESCRIPTOR +#define _UCSI_DVB_ANCILLARY_DATA_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_ancillary_data_descriptor structure. + */ +struct dvb_ancillary_data_descriptor { +	struct descriptor d; +  EBIT8(uint8_t reserved			: 1; , +	uint8_t rds_via_udcp			: 1; , +	uint8_t mpeg4_ancillary_data		: 1; , +	uint8_t scale_factor_error_check	: 1; , +	uint8_t dab_ancillary_data		: 1; , +	uint8_t announcement_switching_data	: 1; , +	uint8_t extended_ancillary_data		: 1; , +	uint8_t dvd_video_ancillary_data	: 1; ); +} __ucsi_packed; + +/** + * Process a dvb_ancillary_data_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_ancillary_data_descriptor pointer, or NULL on error. + */ +static inline struct dvb_ancillary_data_descriptor* +	dvb_ancillary_data_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct dvb_ancillary_data_descriptor) - 2)) +		return NULL; + +	return (struct dvb_ancillary_data_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/announcement_support_descriptor.h b/lib/libucsi/dvb/announcement_support_descriptor.h new file mode 100644 index 0000000..9eb20c4 --- /dev/null +++ b/lib/libucsi/dvb/announcement_support_descriptor.h @@ -0,0 +1,219 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_ANNOUNCEMENT_SUPPORT_DESCRIPTOR +#define _UCSI_DVB_ANNOUNCEMENT_SUPPORT_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * Possible values for announcement_support_indicator. + */ +enum { +	DVB_ANNOUNCEMENT_SUPPORT_EMERGENCY		= 0x01, +	DVB_ANNOUNCEMENT_SUPPORT_ROAD_TRAFFIC_FLASH	= 0x02, +	DVB_ANNOUNCEMENT_SUPPORT_PUBLIC_TRANSPORT_FLASH	= 0x04, +	DVB_ANNOUNCEMENT_SUPPORT_WARNING_MESSAGE	= 0x08, +	DVB_ANNOUNCEMENT_SUPPORT_NEWS_FLASH		= 0x10, +	DVB_ANNOUNCEMENT_SUPPORT_WEATHER_FLASH		= 0x20, +	DVB_ANNOUNCEMENT_SUPPORT_EVENT_ANNOUNCEMENT	= 0x40, +	DVB_ANNOUNCEMENT_SUPPORT_PERSONAL_CALL		= 0x80, +}; + +/** + * Possible values for announcement_type. + */ +enum { +	DVB_ANNOUNCEMENT_TYPE_EMERGENCY			= 0x00, +	DVB_ANNOUNCEMENT_TYPE_ROAD_TRAFFIC_FLASH	= 0x01, +	DVB_ANNOUNCEMENT_TYPE_PUBLIC_TRANSPORT_FLASH	= 0x02, +	DVB_ANNOUNCEMENT_TYPE_WARNING_MESSAGE		= 0x03, +	DVB_ANNOUNCEMENT_TYPE_NEWS_FLASH		= 0x04, +	DVB_ANNOUNCEMENT_TYPE_WEATHER_FLASH		= 0x05, +	DVB_ANNOUNCEMENT_TYPE_EVENT_ANNOUNCEMENT	= 0x06, +	DVB_ANNOUNCEMENT_TYPE_PERSONAL_CALL		= 0x07, +}; + +/** + * Possible values for reference_type. + */ +enum { +	DVB_REFERENCE_TYPE_AUDIO			= 0x00, +	DVB_REFERENCE_TYPE_OTHER_AUDIO			= 0x01, +	DVB_REFERENCE_TYPE_OTHER_SERVICE		= 0x02, +	DVB_REFERENCE_TYPE_OTHER_TS			= 0x03, +}; + +/** + * dvb_announcement_support_descriptor structure. + */ +struct dvb_announcement_support_descriptor { +	struct descriptor d; +	uint16_t announcement_support_indicator; +	/* struct dvb_announcement_support_entry entries[] */ +} __ucsi_packed; + +/** + * An entry in the entries field of a dvb_announcement_support_descriptor. + */ +struct dvb_announcement_support_entry { +  EBIT3(uint8_t announcement_type		: 4; , +	uint8_t reserved			: 1; , +	uint8_t reference_type			: 3; ); +	/* Only if reference_type == 1, 2 or 3: +	 * struct dvb_announcement_support_reference reference */ +} __ucsi_packed; + +/** + * The optional reference field only present in a dvb_announcement_support_descriptor if + * its reference_type field is 1,2 or 3. + */ +struct dvb_announcement_support_reference { +	uint16_t original_network_id; +	uint16_t transport_stream_id; +	uint16_t service_id; +	uint8_t component_tag; +} __ucsi_packed; + +/** + * Process a dvb_announcement_support_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_announcement_support_descriptor pointer, or NULL on error. + */ +static inline struct dvb_announcement_support_descriptor* +	dvb_announcement_support_descriptor_codec(struct descriptor* d) +{ +	uint32_t pos = 0; +	uint8_t* buf = (uint8_t*) d + 2; +	uint32_t len = d->len; + +	if (len < (sizeof(struct dvb_announcement_support_descriptor) - 2)) +		return NULL; + +	bswap16(buf+pos); + +	pos += 2; + +	while(pos < len) { +		struct dvb_announcement_support_entry *e = +			(struct dvb_announcement_support_entry*) (buf+pos); + +		pos += sizeof(struct dvb_announcement_support_entry); + +		if (pos > len) +			return NULL; + +		if ((e->reference_type == 1) || +		    (e->reference_type == 2) || +		    (e->reference_type == 3)) { +			if ((pos + sizeof(struct dvb_announcement_support_reference)) > len) +				return NULL; + +			bswap16(buf+pos); +			bswap16(buf+pos+2); +			bswap16(buf+pos+4); + +			pos += sizeof(struct dvb_announcement_support_reference); +		} +	} + +	return (struct dvb_announcement_support_descriptor*) d; +} + +/** + * Iterator for the entries field of a dvb_announcement_support_descriptor. + * + * @param d dvb_announcement_support_descriptor pointer. + * @param pod Variable holding a pointer to the current dvb_announcement_support_entry. + */ +#define dvb_announcement_support_descriptor_entries_for_each(d, pos) \ +	for ((pos) = dvb_announcement_support_descriptor_entries_first(d); \ +	     (pos); \ +	     (pos) = dvb_announcement_support_descriptor_entries_next(d, pos)) + +/** + * Accessor for the reference field of a dvb_announcement_support_entry if present. + * + * @param entry dvb_announcement_support_entry pointer. + * @return dvb_announcement_support_reference pointer, or NULL on error. + */ +static inline struct dvb_announcement_support_reference* +	dvb_announcement_support_entry_reference(struct dvb_announcement_support_entry* entry) +{ +	if ((entry->reference_type != 0x01) && +	    (entry->reference_type != 0x02) && +	    (entry->reference_type != 0x03)) +		return NULL; + +	return (struct dvb_announcement_support_reference*) +		((uint8_t*) entry + sizeof(struct dvb_announcement_support_entry)); +} + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_announcement_support_entry* +	dvb_announcement_support_descriptor_entries_first(struct dvb_announcement_support_descriptor *d) +{ +	if (d->d.len == 2) +		return NULL; + +	return (struct dvb_announcement_support_entry *) +		((uint8_t*) d + sizeof(struct dvb_announcement_support_descriptor)); +} + +static inline struct dvb_announcement_support_entry* +	dvb_announcement_support_descriptor_entries_next(struct dvb_announcement_support_descriptor *d, +							 struct dvb_announcement_support_entry *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t* next = (uint8_t*) pos + sizeof(struct dvb_announcement_support_entry); +	struct dvb_announcement_support_reference* reference = +		dvb_announcement_support_entry_reference(pos); + +	if (reference) +		next += sizeof(struct dvb_announcement_support_reference); + +	if (next >= end) +		return NULL; + +	return (struct dvb_announcement_support_entry *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/application_signalling_descriptor.h b/lib/libucsi/dvb/application_signalling_descriptor.h new file mode 100644 index 0000000..78211cf --- /dev/null +++ b/lib/libucsi/dvb/application_signalling_descriptor.h @@ -0,0 +1,124 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_APPLICATION_SIGNALLING_DESCRIPTOR +#define _UCSI_DVB_APPLICATION_SIGNALLING_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_application_signalling_descriptor structure. + */ +struct dvb_application_signalling_descriptor { +	struct descriptor d; + +	/* struct dvb_application_signalling_entry entries[] */ +} __ucsi_packed; + +/** + * An entry in the entries field of a dvb_application_signalling_descriptor. + */ +struct dvb_application_signalling_entry { +	uint16_t application_type; +  EBIT2(uint8_t reserved		: 3; , +	uint8_t AIT_version_number	: 5; ); +} __ucsi_packed; + +/** + * Process a dvb_application_signalling_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_application_signalling_descriptor pointer, or NULL on error. + */ +static inline struct dvb_application_signalling_descriptor* +	dvb_application_signalling_descriptor_codec(struct descriptor* d) +{ +	uint32_t pos = 0; +	uint32_t len = d->len; +	uint8_t* buf = (uint8_t*) d + 2; + +	pos += sizeof(struct dvb_application_signalling_descriptor) - 2; +	if (len % sizeof(struct dvb_application_signalling_entry)) +		return NULL; + +	while(pos < len) { +		bswap16(buf+pos); +		pos+=3; +	} + +	return (struct dvb_application_signalling_descriptor*) d; +} + +/** + * Iterator for the entries field of a dvb_application_signalling_descriptor. + * + * @param d dvb_application_signalling_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_application_signalling_entry. + */ +#define dvb_application_signalling_descriptor_entries_for_each(d, pos) \ +	for ((pos) = dvb_application_signalling_descriptor_entries_first(d); \ +	     (pos); \ +	     (pos) = dvb_application_signalling_descriptor_entries_next(d, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_application_signalling_entry* +	dvb_application_signalling_descriptor_entries_first(struct dvb_application_signalling_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_application_signalling_entry *) +		((uint8_t*) d + sizeof(struct dvb_application_signalling_descriptor)); +} + +static inline struct dvb_application_signalling_entry* +	dvb_application_signalling_descriptor_entries_next(struct dvb_application_signalling_descriptor *d, +							   struct dvb_application_signalling_entry *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_application_signalling_entry); + +	if (next >= end) +		return NULL; + +	return (struct dvb_application_signalling_entry *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/bat_section.c b/lib/libucsi/dvb/bat_section.c new file mode 100644 index 0000000..99e5cf6 --- /dev/null +++ b/lib/libucsi/dvb/bat_section.c @@ -0,0 +1,77 @@ +/* + * 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/dvb/bat_section.h> + +struct dvb_bat_section * dvb_bat_section_codec(struct section_ext * ext) +{ +	uint8_t * buf = (uint8_t *) ext; +	size_t pos = sizeof(struct section_ext); +	size_t len = section_ext_length(ext); +	struct dvb_bat_section * ret = (struct dvb_bat_section *) ext; + +	if (len < sizeof(struct dvb_bat_section)) +		return NULL; + +	bswap16(buf + pos); +	pos += 2; + +	if ((pos + ret->bouquet_descriptors_length) > len) +		return NULL; + +	if (verify_descriptors(buf + pos, ret->bouquet_descriptors_length)) +		return NULL; +	pos += ret->bouquet_descriptors_length; + +	if ((pos + sizeof(struct dvb_bat_section_part2)) > len) +		return NULL; + +	bswap16(buf + pos); +	pos += sizeof(struct dvb_bat_section_part2); + +	while (pos < len) { +		struct dvb_bat_transport * transport = +			(struct dvb_bat_transport *) (buf + pos); + +		if ((pos + sizeof(struct dvb_bat_transport))  > len) +			return NULL; + +		bswap16(buf + pos); +		bswap16(buf + pos + 2); +		bswap16(buf + pos + 4); + +		pos += sizeof(struct dvb_bat_transport); + +		if ((pos + transport->transport_descriptors_length) > len) +			return NULL; + +		if (verify_descriptors(buf + pos, +					transport->transport_descriptors_length)) +			return NULL; + +		pos += transport->transport_descriptors_length; +	} + +	if (pos != len) +		return NULL; + +	return ret; +} diff --git a/lib/libucsi/dvb/bat_section.h b/lib/libucsi/dvb/bat_section.h new file mode 100644 index 0000000..94ed8a4 --- /dev/null +++ b/lib/libucsi/dvb/bat_section.h @@ -0,0 +1,211 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_BAT_SECTION_H +#define _UCSI_DVB_BAT_SECTION_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/section.h> + +/** + * dvb_bat_section structure. + */ +struct dvb_bat_section { +	struct section_ext head; + +  EBIT2(uint16_t reserved_1			: 4; , +	uint16_t bouquet_descriptors_length	:12; ); +	/* struct descriptor descriptors[] */ +	/* struct dvb_bat_section_part2 part2 */ +}; + +/** + * Second part of a dvb_bat_section, following the variable length descriptors field. + */ +struct dvb_bat_section_part2 { +  EBIT2(uint16_t reserved_2			: 4; , +	uint16_t transport_stream_loop_length	:12; ); +	/* struct dvb_bat_transport transports[] */ +} __ucsi_packed; + +/** + * An entry in the transports field of a dvb_bat_section_part2. + */ +struct dvb_bat_transport { +	uint16_t transport_stream_id; +	uint16_t original_network_id; +  EBIT2(uint16_t reserved			: 4; , +	uint16_t transport_descriptors_length	:12; ); +	/* struct descriptor descriptors[] */ +}; + +/** + * Process a dvb_bat_section. + * + * @param section Generic section  pointer. + * @return dvb_bat_section pointer, or NULL on error. + */ +struct dvb_bat_section *dvb_bat_section_codec(struct section_ext *section); + +/** + * Accessor for the bouquet_id field of a BAT. + * + * @param bat BAT pointer. + * @return The bouquet_id. + */ +static inline uint16_t dvb_bat_section_bouquet_id(struct dvb_bat_section *bat) +{ +	return bat->head.table_id_ext; +} + +/** + * Iterator for the descriptors field in a dvb_bat_section. + * + * @param bat dvb_bat_section pointer. + * @param pos Variable containing a pointer to the current descriptor. + */ +#define dvb_bat_section_descriptors_for_each(bat, pos) \ +	for ((pos) = dvb_bat_section_descriptors_first(bat); \ +	     (pos); \ +	     (pos) = dvb_bat_section_descriptors_next(bat, pos)) + +/** + * Accessor for the second part of a dvb_bat_section. + * + * @param bat dvb_bat_section pointer. + * @return dvb_bat_section_part2 pointer. + */ +static inline struct dvb_bat_section_part2 * +	dvb_bat_section_part2(struct dvb_bat_section *bat) +{ +	return (struct dvb_bat_section_part2 *) +		((uint8_t*) bat + +		 sizeof(struct dvb_bat_section) + +		 bat->bouquet_descriptors_length); + +} + +/** + * Iterator for the transports field of a dvb_bat_section_part2. + * + * @param part2 dvb_bat_section_part2 pointer. + * @param pos Variable containing a pointer to the current dvb_bat_transport. + */ +#define dvb_bat_section_transports_for_each(part2, pos) \ +	for ((pos) = dvb_bat_section_transports_first(part2); \ +	     (pos); \ +	     (pos) = dvb_bat_section_transports_next(part2, pos)) + +/** + * Iterator for the descriptors field of a dvb_bat_transport. + * + * @param transport dvb_bat_transport pointer. + * @param pos Variable containing a pointer to the current descriptor. + */ +#define dvb_bat_transport_descriptors_for_each(transport, pos) \ +	for ((pos) = dvb_bat_transport_descriptors_first(transport); \ +	     (pos); \ +	     (pos) = dvb_bat_transport_descriptors_next(transport, pos)) + + + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct descriptor * +	dvb_bat_section_descriptors_first(struct dvb_bat_section *bat) +{ +	if (bat->bouquet_descriptors_length == 0) +		return NULL; + +	return (struct descriptor *) +		((uint8_t *) bat + sizeof(struct dvb_bat_section)); +} + +static inline struct descriptor * +	dvb_bat_section_descriptors_next(struct dvb_bat_section *bat, +					 struct descriptor* pos) +{ +	return next_descriptor((uint8_t*) bat + sizeof(struct dvb_bat_section), +			       bat->bouquet_descriptors_length, +			       pos); +} + +static inline struct dvb_bat_transport * +	dvb_bat_section_transports_first(struct dvb_bat_section_part2 *part2) +{ +	if (part2->transport_stream_loop_length == 0) +		return NULL; + +	return (struct dvb_bat_transport *) +		((uint8_t *) part2 + sizeof(struct dvb_bat_section_part2)); +} + +static inline struct dvb_bat_transport * +	dvb_bat_section_transports_next(struct dvb_bat_section_part2 *part2, +					struct dvb_bat_transport *pos) +{ +	uint8_t *end = (uint8_t*) part2 + sizeof(struct dvb_bat_section_part2) + +			part2->transport_stream_loop_length; +	uint8_t *next = (uint8_t*) pos + sizeof(struct dvb_bat_transport) + +			pos->transport_descriptors_length; + +	if (next >= end) +		return NULL; + +	return (struct dvb_bat_transport *) next; +} + +static inline struct descriptor * +	dvb_bat_transport_descriptors_first(struct dvb_bat_transport *t) +{ +	if (t->transport_descriptors_length == 0) +		return NULL; + +	return (struct descriptor *) +		((uint8_t*)t + sizeof(struct dvb_bat_transport)); +} + +static inline struct descriptor * +	dvb_bat_transport_descriptors_next(struct dvb_bat_transport *t, +					   struct descriptor* pos) +{ +	return next_descriptor((uint8_t*) t + sizeof(struct dvb_bat_transport), +			       t->transport_descriptors_length, +			       pos); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/bouquet_name_descriptor.h b/lib/libucsi/dvb/bouquet_name_descriptor.h new file mode 100644 index 0000000..a298849 --- /dev/null +++ b/lib/libucsi/dvb/bouquet_name_descriptor.h @@ -0,0 +1,82 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_BOUQUET_NAME_DESCRIPTOR +#define _UCSI_DVB_BOUQUET_NAME_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_bouquet_name_descriptor  structure. + */ +struct dvb_bouquet_name_descriptor { +	struct descriptor d; + +	/* uint8_t name[] */ +} __ucsi_packed; + +/** + * Process a dvb_bouquet_name_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_bouquet_name_descriptor pointer, or NULL on error. + */ +static inline struct dvb_bouquet_name_descriptor* +	dvb_bouquet_name_descriptor_codec(struct descriptor* d) +{ +	return (struct dvb_bouquet_name_descriptor*) d; +} + +/** + * Accessor for the name field of a dvb_bouquet_name_descriptor. + * + * @param d dvb_bouquet_name_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +	dvb_bouquet_name_descriptor_name(struct dvb_bouquet_name_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_bouquet_name_descriptor); +} + +/** + * Determine the length of the name field of a dvb_bouquet_name_descriptor in bytes. + * + * @param d dvb_bouquet_name_descriptor pointer. + * @return Length of the field in bytes. + */ +static inline int +	dvb_bouquet_name_descriptor_name_length(struct dvb_bouquet_name_descriptor *d) +{ +	return d->d.len; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/ca_identifier_descriptor.h b/lib/libucsi/dvb/ca_identifier_descriptor.h new file mode 100644 index 0000000..ac670a9 --- /dev/null +++ b/lib/libucsi/dvb/ca_identifier_descriptor.h @@ -0,0 +1,94 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_CA_IDENTIFIER_DESCRIPTOR +#define _UCSI_DVB_CA_IDENTIFIER_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_ca_identifier_descriptor structure. + */ +struct dvb_ca_identifier_descriptor { +	struct descriptor d; + +	/* uint16_t ca_system_ids[] */ +} __ucsi_packed; + +/** + * Process a dvb_ca_identifier_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_ca_identifier_descriptor pointer, or NULL on error. + */ +static inline struct dvb_ca_identifier_descriptor* +	dvb_ca_identifier_descriptor_codec(struct descriptor* d) +{ +	uint32_t len = d->len; +	uint8_t *buf = (uint8_t*) d + 2; +	uint32_t pos = 0; + +	if (len % 2) +		return NULL; + +	while(pos < len) { +		bswap16(buf+pos); +		pos+=2; +	} + +	return (struct dvb_ca_identifier_descriptor*) d; +} + +/** + * Accessor for the ca_system_ids field of a dvb_ca_identifier_descriptor. + * + * @param d Generic descriptor pointer. + * @return Pointer to the field. + */ +static inline uint16_t * +	dvb_ca_identifier_descriptor_ca_system_ids(struct dvb_ca_identifier_descriptor *d) +{ +	return (uint16_t *) ((uint8_t *) d + sizeof(struct dvb_ca_identifier_descriptor)); +} + +/** + * Calculate the number of entries in the ca_system_ids field of a dvb_ca_identifier_descriptor. + * + * @param d dvb_ca_identifier_descriptor pointer. + * @return Number of entries. + */ +static inline int +	dvb_ca_identifier_descriptor_ca_system_ids_count(struct dvb_ca_identifier_descriptor *d) +{ +	return d->d.len >> 1; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/cable_delivery_descriptor.h b/lib/libucsi/dvb/cable_delivery_descriptor.h new file mode 100644 index 0000000..f0f92f3 --- /dev/null +++ b/lib/libucsi/dvb/cable_delivery_descriptor.h @@ -0,0 +1,70 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_CABLE_DELIVERY_DESCRIPTOR +#define _UCSI_DVB_CABLE_DELIVERY_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_cable_delivery_descriptor structure. + */ +struct dvb_cable_delivery_descriptor { +	struct descriptor d; + +	uint32_t frequency;			// BCD, units 100Hz +  EBIT2(uint16_t reserved	: 12; , +	uint16_t fec_outer	: 4;  ); +	uint8_t modulation; +  EBIT2(uint32_t symbol_rate	: 28; ,		// BCD, units 100Hz +	uint32_t fec_inner	: 4;  ); +} __ucsi_packed; + +/** + * Process a dvb_cable_delivery_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_cable_delivery_descriptor pointer, or NULL on error. + */ +static inline struct dvb_cable_delivery_descriptor* +	dvb_cable_delivery_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct dvb_cable_delivery_descriptor) - 2)) +		return NULL; + +	bswap32((uint8_t*) d + 2); +	bswap16((uint8_t*) d + 6); +	bswap32((uint8_t*) d + 9); + +	return (struct dvb_cable_delivery_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/cell_frequency_link_descriptor.h b/lib/libucsi/dvb/cell_frequency_link_descriptor.h new file mode 100644 index 0000000..63f7fd2 --- /dev/null +++ b/lib/libucsi/dvb/cell_frequency_link_descriptor.h @@ -0,0 +1,190 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_CELL_FREQUENCY_LINK_DESCRIPTOR +#define _UCSI_DVB_CELL_FREQUENCY_LINK_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_cell_frequency_link_descriptor structure. + */ +struct dvb_cell_frequency_link_descriptor { +	struct descriptor d; + +	/* struct dvb_cell_frequency_link_cell cells[] */ +} __ucsi_packed; + +/** + * An entry in the cells field of a dvb_cell_frequency_link_descriptor. + */ +struct dvb_cell_frequency_link_cell { +	uint16_t cell_id; +	uint32_t frequency; +	uint8_t subcell_loop_info_length; +	/* struct dvb_cell_frequency_link_subcell subcells[] */ +} __ucsi_packed; + +/** + * An entry in the subcells field of a dvb_cell_frequency_link_cell. + */ +struct dvb_cell_frequency_link_cell_subcell { +	uint8_t cell_id_extension; +	uint32_t transposer_frequency; +} __ucsi_packed; + +/** + * Process a dvb_cell_frequency_link_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_cell_frequency_link_descriptor pointer, or NULL on error. + */ +static inline struct dvb_cell_frequency_link_descriptor* +	dvb_cell_frequency_link_descriptor_codec(struct descriptor* d) +{ +	uint32_t pos = 0; +	uint32_t pos2 = 0; +	uint8_t* buf = (uint8_t*) d + 2; +	uint32_t len = d->len; + +	while(pos < len) { +		struct dvb_cell_frequency_link_cell *e = +			(struct dvb_cell_frequency_link_cell*) (buf+pos); + +		if ((pos + sizeof(struct dvb_cell_frequency_link_cell)) > len) +			return NULL; + +		bswap16(buf+pos); +		bswap32(buf+pos+2); + +		pos += sizeof(struct dvb_cell_frequency_link_cell); + +		if ((pos + e->subcell_loop_info_length) > len) +			return NULL; + +		if (e->subcell_loop_info_length % sizeof(struct dvb_cell_frequency_link_cell_subcell)) +			return NULL; + +		pos2 = 0; +		while(pos2 < e->subcell_loop_info_length) { +			bswap32(buf+pos+pos2+1); + +			pos2 += sizeof(struct dvb_cell_frequency_link_cell_subcell); +		} + +		pos += e->subcell_loop_info_length; +	} + +	return (struct dvb_cell_frequency_link_descriptor*) d; +} + +/** + * Iterator for the cells field of a dvb_cell_frequency_link_descriptor. + * + * @param d dvb_cell_frequency_link_descriptor pointer. + * @param pos Variable holding a pointer to the current dvb_cell_frequency_link_cell. + */ +#define dvb_cell_frequency_link_descriptor_cells_for_each(d, pos) \ +	for ((pos) = dvb_cell_frequency_link_descriptor_cells_first(d); \ +	     (pos); \ +	     (pos) = dvb_cell_frequency_link_descriptor_cells_next(d, pos)) + +/** + * Iterator for the subcells field of a dvb_cell_frequency_link_cell. + * + * @param cell dvb_cell_frequency_link_cell pointer. + * @param pos Variable holding a pointer to the current dvb_cell_frequency_link_cell_subcell. + */ +#define dvb_cell_frequency_link_cell_subcells_for_each(cell, pos) \ +	for ((pos) = dvb_cell_frequency_link_cell_subcells_first(cell); \ +	     (pos); \ +	     (pos) = dvb_cell_frequency_link_cell_subcells_next(cell, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_cell_frequency_link_cell* +	dvb_cell_frequency_link_descriptor_cells_first(struct dvb_cell_frequency_link_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_cell_frequency_link_cell *) +		((uint8_t*) d + sizeof(struct dvb_cell_frequency_link_descriptor)); +} + +static inline struct dvb_cell_frequency_link_cell* +	dvb_cell_frequency_link_descriptor_cells_next(struct dvb_cell_frequency_link_descriptor *d, +						      struct dvb_cell_frequency_link_cell *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + +			sizeof(struct dvb_cell_frequency_link_cell) + +			pos->subcell_loop_info_length; + +	if (next >= end) +		return NULL; + +	return (struct dvb_cell_frequency_link_cell *) next; +} + +static inline struct dvb_cell_frequency_link_cell_subcell* +	dvb_cell_frequency_link_cell_subcells_first(struct dvb_cell_frequency_link_cell *d) +{ +	if (d->subcell_loop_info_length == 0) +		return NULL; + +	return (struct dvb_cell_frequency_link_cell_subcell*) +		((uint8_t*) d + sizeof(struct dvb_cell_frequency_link_cell)); +} + +static inline struct dvb_cell_frequency_link_cell_subcell* +	dvb_cell_frequency_link_cell_subcells_next(struct dvb_cell_frequency_link_cell *cell, +					      struct dvb_cell_frequency_link_cell_subcell *pos) +{ +	uint8_t *end = (uint8_t*) cell + cell->subcell_loop_info_length; +	uint8_t *next = (uint8_t*) pos + +			sizeof(struct dvb_cell_frequency_link_cell_subcell); + +	if (next >= end) +		return NULL; + +	return (struct dvb_cell_frequency_link_cell_subcell *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/cell_list_descriptor.h b/lib/libucsi/dvb/cell_list_descriptor.h new file mode 100644 index 0000000..ddbaf2c --- /dev/null +++ b/lib/libucsi/dvb/cell_list_descriptor.h @@ -0,0 +1,201 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_CELL_LIST_DESCRIPTOR +#define _UCSI_DVB_CELL_LIST_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_cell_list_descriptor structure. + */ +struct dvb_cell_list_descriptor { +	struct descriptor d; + +	/* struct dvb_cell_list_entry cells[] */ +} __ucsi_packed; + +/** + * An entry in the cells field of a dvb_cell_list_descriptor. + */ +struct dvb_cell_list_entry { +	uint16_t cell_id; +	uint16_t cell_latitude; +	uint16_t cell_longitude; +  EBIT3(uint32_t cell_extend_of_latitude	:12; , +	uint32_t cell_extend_of_longitude	:12; , +	uint32_t subcell_info_loop_length	: 8; ); +	/* struct dvb_subcell_list_entry subcells[] */ +} __ucsi_packed; + +/** + * An entry in the subcells field of a dvb_cell_list_entry. + */ +struct dvb_subcell_list_entry { +	uint8_t cell_id_extension; +	uint16_t subcell_latitude; +	uint16_t subcell_longitude; +  EBIT2(uint32_t subcell_extend_of_latitude	:12; , +	uint32_t subcell_extend_of_longitude	:12; ); +} __ucsi_packed; + +/** + * Process a dvb_cell_list_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_cell_list_descriptor pointer, or NULL on error. + */ +static inline struct dvb_cell_list_descriptor* +	dvb_cell_list_descriptor_codec(struct descriptor* d) +{ +	uint32_t pos = 0; +	uint32_t pos2 = 0; +	uint8_t* buf = (uint8_t*) d + 2; +	uint32_t len = d->len; + +	while(pos < len) { +		struct dvb_cell_list_entry *e = +			(struct dvb_cell_list_entry*) (buf+pos); + +		if ((pos + sizeof(struct dvb_cell_list_entry)) > len) +			return NULL; + +		bswap16(buf+pos); +		bswap16(buf+pos+2); +		bswap16(buf+pos+4); +		bswap32(buf+pos+6); + +		pos += sizeof(struct dvb_cell_list_entry); + +		if ((pos + e->subcell_info_loop_length) > len) +			return NULL; + +		if (e->subcell_info_loop_length % sizeof(struct dvb_subcell_list_entry)) +			return NULL; + +		pos2 = 0; +		while(pos2 < e->subcell_info_loop_length) { +			bswap16(buf+pos+pos2+1); +			bswap16(buf+pos+pos2+3); +			bswap24(buf+pos+pos2+5); + +			pos2 += sizeof(struct dvb_subcell_list_entry); +		} + +		pos += e->subcell_info_loop_length; +	} + +	return (struct dvb_cell_list_descriptor*) d; +} + +/** + * Iterator for the cells field of a dvb_cell_list_descriptor. + * + * @param d dvb_cell_list_descriptor pointer. + * @param pos Variable holding a pointer to the current dvb_cell_list_entry. + */ +#define dvb_cell_list_descriptor_cells_for_each(d, pos) \ +	for ((pos) = dvb_cell_list_descriptor_cells_first(d); \ +	     (pos); \ +	     (pos) = dvb_cell_list_descriptor_cells_next(d, pos)) + +/** + * Iterator for the subcells field of a dvb_cell_list_entry. + * + * @param cell dvb_cell_list_entry pointer. + * @param pos Variable holding a pointer to the current dvb_subcell_list_entry. + */ +#define dvb_cell_list_entry_subcells_for_each(cell, pos) \ +	for ((pos) = dvb_cell_list_entry_subcells_first(cell); \ +	     (pos); \ +	     (pos) = dvb_cell_list_entry_subcells_next(cell, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_cell_list_entry* +	dvb_cell_list_descriptor_cells_first(struct dvb_cell_list_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_cell_list_entry *) +		((uint8_t*) d + sizeof(struct dvb_cell_list_descriptor)); +} + +static inline struct dvb_cell_list_entry* +	dvb_cell_list_descriptor_cells_next(struct dvb_cell_list_descriptor *d, +					    struct dvb_cell_list_entry *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + +			sizeof(struct dvb_cell_list_entry) + +			pos->subcell_info_loop_length; + +	if (next >= end) +		return NULL; + +	return (struct dvb_cell_list_entry *) next; +} + +static inline struct dvb_subcell_list_entry* +	dvb_cell_list_entry_subcells_first(struct dvb_cell_list_entry *d) +{ +	if (d->subcell_info_loop_length == 0) +		return NULL; + +	return (struct dvb_subcell_list_entry*) +		((uint8_t*) d + sizeof(struct dvb_cell_list_entry)); +} + +static inline struct dvb_subcell_list_entry* +	dvb_cell_list_entry_subcells_next(struct dvb_cell_list_entry *d, +					  struct dvb_subcell_list_entry *pos) +{ +	uint8_t *next = (uint8_t*) pos + sizeof(struct dvb_subcell_list_entry); +	uint8_t *end = (uint8_t*) d + +			sizeof(struct dvb_cell_list_entry) + +			d->subcell_info_loop_length; + +	if (next >= end) +		return NULL; + +	return (struct dvb_subcell_list_entry *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/component_descriptor.h b/lib/libucsi/dvb/component_descriptor.h new file mode 100644 index 0000000..31d38e1 --- /dev/null +++ b/lib/libucsi/dvb/component_descriptor.h @@ -0,0 +1,147 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_COMPONENT_DESCRIPTOR +#define _UCSI_DVB_COMPONENT_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + +/** + * Possible values for stream_content. + */ +enum { +	DVB_STREAM_CONTENT_VIDEO 		= 0x01, +	DVB_STREAM_CONTENT_AUDIO 		= 0x02, +	DVB_STREAM_CONTENT_SUBTITLE 		= 0x03, +	DVB_STREAM_CONTENT_AC3	 		= 0x04, +}; + +/** + * Possible values for component_type. + */ +enum { +	DVB_COMPONENT_TYPE_VIDEO_43_25Hz		= 0x01, +	DVB_COMPONENT_TYPE_VIDEO_169_PAN_25Hz		= 0x02, +	DVB_COMPONENT_TYPE_VIDEO_169_NOPAN_25Hz		= 0x03, +	DVB_COMPONENT_TYPE_VIDEO_GT169_25Hz		= 0x04, + +	DVB_COMPONENT_TYPE_VIDEO_43_30Hz		= 0x05, +	DVB_COMPONENT_TYPE_VIDEO_169_PAN_30Hz		= 0x06, +	DVB_COMPONENT_TYPE_VIDEO_169_NOPAN_30Hz		= 0x07, +	DVB_COMPONENT_TYPE_VIDEO_GT169_30Hz		= 0x08, + +	DVB_COMPONENT_TYPE_HDVIDEO_43_25Hz		= 0x09, +	DVB_COMPONENT_TYPE_HDVIDEO_169_PAN_25Hz		= 0x0a, +	DVB_COMPONENT_TYPE_HDVIDEO_169_NOPAN_25Hz	= 0x0b, +	DVB_COMPONENT_TYPE_HDVIDEO_GT169_25Hz		= 0x0c, + +	DVB_COMPONENT_TYPE_HDVIDEO_43_30Hz		= 0x0d, +	DVB_COMPONENT_TYPE_HDVIDEO_169_PAN_30Hz		= 0x0e, +	DVB_COMPONENT_TYPE_HDVIDEO_169_NOPAN_30Hz	= 0x0f, +	DVB_COMPONENT_TYPE_HDVIDEO_GT169_30Hz		= 0x10, + +	DVB_COMPONENT_TYPE_AUDIO_SINGLE_MONO		= 0x01, +	DVB_COMPONENT_TYPE_AUDIO_DUAL_MONO		= 0x02, +	DVB_COMPONENT_TYPE_AUDIO_STEREO			= 0x03, +	DVB_COMPONENT_TYPE_AUDIO_MULTI_LINGUAL_MULTI_CHAN= 0x04, +	DVB_COMPONENT_TYPE_AUDIO_SURROUND		= 0x05, +	DVB_COMPONENT_TYPE_AUDIO_VISUAL_IMPAIRED	= 0x40, +	DVB_COMPONENT_TYPE_AUDIO_HARDHEAR		= 0x41, +	DVB_COMPONENT_TYPE_AUDIO_SUPPLEMENTARY		= 0x42, + +	DVB_COMPONENT_TYPE_SUBTITLE_TELETEXT		= 0x01, +	DVB_COMPONENT_TYPE_SUBTITLE_ASSOC_TELETEXT	= 0x02, +	DVB_COMPONENT_TYPE_SUBTITLE_VBI			= 0x03, +	DVB_COMPONENT_TYPE_SUBTITLE_DVB			= 0x10, +	DVB_COMPONENT_TYPE_SUBTITLE_DVB_43		= 0x11, +	DVB_COMPONENT_TYPE_SUBTITLE_DVB_169		= 0x12, +	DVB_COMPONENT_TYPE_SUBTITLE_DVB_2211		= 0x13, +	DVB_COMPONENT_TYPE_SUBTITLE_DVB_HARDHEAR	= 0x20, +	DVB_COMPONENT_TYPE_SUBTITLE_DVB_HARDHEAR_43	= 0x21, +	DVB_COMPONENT_TYPE_SUBTITLE_DVB_HARDHEAR_169	= 0x22, +	DVB_COMPONENT_TYPE_SUBTITLE_DVB_HARDHEAR_2211	= 0x23, +}; + +/** + * dvb_component_descriptor structure. + */ +struct dvb_component_descriptor { +	struct descriptor d; + +  EBIT2(uint8_t reserved	: 4; , +	uint8_t stream_content	: 4; ); +	uint8_t component_type; +	uint8_t component_tag; +	iso639lang_t language_code; +	/* uint8_t text[] */ +} __ucsi_packed; + +/** + * Process a dvb_component_descriptor. + * + * @param d Pointer to a generic descriptor. + * @return dvb_component_descriptor pointer, or NULL on error. + */ +static inline struct dvb_component_descriptor* +	dvb_component_descriptor_codec(struct descriptor* d) +{ +	if (d->len < (sizeof(struct dvb_component_descriptor) - 2)) +		return NULL; + +	return (struct dvb_component_descriptor*) d; +} + +/** + * Accessor for the text field of a dvb_component_descriptor. + * + * @param d dvb_component_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +	dvb_component_descriptor_text(struct dvb_component_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_component_descriptor); +} + +/** + * Determine the length of the text field of a dvb_component_descriptor. + * + * @param d dvb_component_descriptor pointer. + * @return Length of the field in bytes. + */ +static inline int +	dvb_component_descriptor_text_length(struct dvb_component_descriptor *d) +{ +	return d->d.len - 6; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/content_descriptor.h b/lib/libucsi/dvb/content_descriptor.h new file mode 100644 index 0000000..d2a63a0 --- /dev/null +++ b/lib/libucsi/dvb/content_descriptor.h @@ -0,0 +1,116 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_CONTENT_DESCRIPTOR +#define _UCSI_DVB_CONTENT_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +// FIXME: the nibbles + +/** + * dvb_content_descriptor structure. + */ +struct dvb_content_descriptor { +	struct descriptor d; + +	/* struct dvb_content_nibble nibbles[] */ +} __ucsi_packed; + +/** + * An entry in the nibbles field of a dvb_content_descriptor. + */ +struct dvb_content_nibble { +  EBIT2(uint8_t content_nibble_level_1	: 4; , +	uint8_t content_nibble_level_2	: 4; ); +  EBIT2(uint8_t user_nibble_1		: 4; , +	uint8_t user_nibble_2		: 4; ); +} __ucsi_packed; + +/** + * Process a dvb_content_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_content_descriptor pointer, or NULL on error. + */ +static inline struct dvb_content_descriptor* +	dvb_content_descriptor_codec(struct descriptor* d) +{ +	if (d->len % sizeof(struct dvb_content_nibble)) +		return NULL; + +	return (struct dvb_content_descriptor*) d; +} + +/** + * Iterator for the nibbles field of a dvb_content_descriptor. + * + * @param d dvb_content_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_content_nibble. + */ +#define dvb_content_descriptor_nibbles_for_each(d, pos) \ +	for ((pos) = dvb_content_descriptor_nibbles_first(d); \ +	     (pos); \ +	     (pos) = dvb_content_descriptor_nibbles_next(d, pos)) + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_content_nibble* +	dvb_content_descriptor_nibbles_first(struct dvb_content_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_content_nibble *) +		((uint8_t*) d + sizeof(struct dvb_content_descriptor)); +} + +static inline struct dvb_content_nibble* +	dvb_content_descriptor_nibbles_next(struct dvb_content_descriptor *d, +					    struct dvb_content_nibble *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_content_nibble); + +	if (next >= end) +		return NULL; + +	return (struct dvb_content_nibble *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/content_identifier_descriptor.h b/lib/libucsi/dvb/content_identifier_descriptor.h new file mode 100644 index 0000000..c2cf9ea --- /dev/null +++ b/lib/libucsi/dvb/content_identifier_descriptor.h @@ -0,0 +1,233 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_CONTENT_IDENTIFIER_DESCRIPTOR +#define _UCSI_DVB_CONTENT_IDENTIFIER_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + + +/** + * Possible values for the crid_type. + */ +enum { +	DVB_CRID_TYPE_NONE		= 0x00, +	DVB_CRID_TYPE_ITEM		= 0x01, +	DVB_CRID_TYPE_SERIES		= 0x02, +	DVB_CRID_TYPE_RECOMMENDATION	= 0x03, +}; + +/** + * Possible values for the crid_location. + */ +enum { +	DVB_CRID_LOCATION_THIS_DESCRIPTOR	= 0x00, +	DVB_CRID_LOCATION_CIT			= 0x01, +}; + +/** + * dvb_content_identifier_descriptor structure. + */ +struct dvb_content_identifier_descriptor { +	struct descriptor d; + +	/* struct dvb_content_identifier_entry entries[] */ +} __ucsi_packed; + +/** + * An entry in the entries field of a dvb_content_identifier_descriptor. + */ +struct dvb_content_identifier_entry { +  EBIT2(uint8_t crid_type		: 6; , +	uint8_t crid_location		: 2; ); +	/* struct dvb_content_identifier_data_00 data0 */ +	/* struct dvb_content_identifier_data_01 data1 */ +} __ucsi_packed; + +/** + * The data if crid_location == 0 + */ +struct dvb_content_identifier_entry_data_0 { +	uint8_t crid_length; +	/* uint8_t data[] */ +} __ucsi_packed; + +/** + * The data if crid_location == 1 + */ +struct dvb_content_identifier_entry_data_1 { +	uint16_t crid_ref; +} __ucsi_packed; + + +/** + * Process a dvb_content_identifier_descriptor. + * + * @param d Generic descriptor. + * @return dvb_content_identifier_descriptor pointer, or NULL on error. + */ +static inline struct dvb_content_identifier_descriptor* +	dvb_content_identifier_descriptor_codec(struct descriptor* d) +{ +	uint32_t len = d->len + 2; +	uint32_t pos = 2; +	uint8_t *buf = (uint8_t*) d; + +	while(pos < len) { +		struct dvb_content_identifier_entry *e = +			(struct dvb_content_identifier_entry*) (buf + pos); + +		if (len < (pos+1)) +			return NULL; +		pos++; + +		switch(e->crid_location) { +		case 0: +			if (len < (pos + 1)) +				return NULL; +			if (len < (pos + 1 + buf[pos])) +				return NULL; +			pos += 1 + buf[pos]; +			break; + +		case 1: +			if (len < (pos+2)) +				return NULL; +			bswap16(buf+pos); +			break; +		} +	} + +	if (pos != len) +		return NULL; + +	return (struct dvb_content_identifier_descriptor*) d; +} + +/** + * Iterator for entries field of a dvb_content_identifier_descriptor. + * + * @param d dvb_content_identifier_descriptor pointer. + * @param pos Variable holding a pointer to the current dvb_content_identifier_entry. + */ +#define dvb_content_identifier_descriptor_entries_for_each(d, pos) \ +	for ((pos) = dvb_content_identifier_descriptor_entries_first(d); \ +	     (pos); \ +	     (pos) = dvb_content_identifier_descriptor_entries_next(d, pos)) + +/** + * Accessor for the data0 field of a dvb_content_identifier_entry. + * + * @param d dvb_content_identifier_entry pointer. + * @return Pointer, or NULL on error. + */ +static inline struct dvb_content_identifier_entry_data_0* +	dvb_content_identifier_entry_data_0(struct dvb_content_identifier_entry *d) +{ +	if (d->crid_location != 0) +		return NULL; +	return (struct dvb_content_identifier_entry_data_0*) +		((uint8_t*) d + sizeof(struct dvb_content_identifier_entry)); +} +/** + * Accessor for the data field of a dvb_content_identifier_entry_data_0. + * + * @param d dvb_content_identifier_entry_data_0 pointer. + * @return Pointer, or NULL on error. + */ +static inline uint8_t* +	dvb_content_identifier_entry_data_0_data(struct dvb_content_identifier_entry_data_0 *d) +{ +	return ((uint8_t*) d + sizeof(struct dvb_content_identifier_entry_data_0)); +} + +/** + * Accessor for the data1 field of a dvb_content_identifier_entry. + * + * @param d dvb_content_identifier_entry pointer. + * @return Pointer, or NULL on error. + */ +static inline struct dvb_content_identifier_entry_data_1* +	dvb_content_identifier_entry_data_1(struct dvb_content_identifier_entry *d) +{ +	if (d->crid_location != 1) +		return NULL; +	return (struct dvb_content_identifier_entry_data_1*) +		((uint8_t*) d + sizeof(struct dvb_content_identifier_entry)); +} + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_content_identifier_entry* +	dvb_content_identifier_descriptor_entries_first(struct dvb_content_identifier_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_content_identifier_entry *) +		((uint8_t*) d + sizeof(struct dvb_content_identifier_descriptor)); +} + +static inline struct dvb_content_identifier_entry* +	dvb_content_identifier_descriptor_entries_next(struct dvb_content_identifier_descriptor *d, +					     struct dvb_content_identifier_entry *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_content_identifier_entry); + +	if (next >= end) +		return NULL; + +	switch(pos->crid_location) { +	case 0: +		if ((next+2) >= end) +			return NULL; +		if ((next+2+next[1]) >= end) +			return NULL; +		break; + +	case 1: +		if ((next+3) >= end) +			return NULL; +		break; +	} + +	return (struct dvb_content_identifier_entry*) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/country_availability_descriptor.h b/lib/libucsi/dvb/country_availability_descriptor.h new file mode 100644 index 0000000..65b1661 --- /dev/null +++ b/lib/libucsi/dvb/country_availability_descriptor.h @@ -0,0 +1,120 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_COUNTRY_AVAILABILITY_DESCRIPTOR +#define _UCSI_DVB_COUNTRY_AVAILABILITY_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + +/** + * dvb_country_availability_descriptor structure. + */ +struct dvb_country_availability_descriptor { +	struct descriptor d; + +  EBIT2(uint8_t country_availability_flag	: 1; , +	uint8_t reserved			: 7; ); +	/* struct dvb_country_availability_entry countries[] */ +} __ucsi_packed; + +/** + * An entry in the countries field of a dvb_country_availability_descriptor. + */ +struct dvb_country_availability_entry { +	iso639country_t country_code; +} __ucsi_packed; + +/** + * Process a dvb_country_availability_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_country_availability_descriptor pointer, or NULL on error. + */ +static inline struct dvb_country_availability_descriptor* +	dvb_country_availability_descriptor_codec(struct descriptor* d) +{ +	uint32_t len = d->len; + +	if (len < (sizeof(struct dvb_country_availability_descriptor) - 2)) +		return NULL; + +	if ((len - 1) % sizeof(struct dvb_country_availability_entry)) +		return NULL; + +	return (struct dvb_country_availability_descriptor*) d; +} + +/** + * Iterator for the countries field of a dvb_country_availability_descriptor. + * + * @param d dvb_country_availability_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_country_availability_entry. + */ +#define dvb_country_availability_descriptor_countries_for_each(d, pos) \ +	for ((pos) = dvb_country_availability_descriptor_countries_first(d); \ +	     (pos); \ +	     (pos) = dvb_country_availability_descriptor_countries_next(d, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_country_availability_entry* +	dvb_country_availability_descriptor_countries_first(struct dvb_country_availability_descriptor *d) +{ +	if (d->d.len == 1) +		return NULL; + +	return (struct dvb_country_availability_entry *) +		((uint8_t*) d + sizeof(struct dvb_country_availability_descriptor)); +} + +static inline struct dvb_country_availability_entry* +	dvb_country_availability_descriptor_countries_next(struct dvb_country_availability_descriptor *d, +							   struct dvb_country_availability_entry *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_country_availability_entry); + +	if (next >= end) +		return NULL; + +	return (struct dvb_country_availability_entry *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/data_broadcast_descriptor.h b/lib/libucsi/dvb/data_broadcast_descriptor.h new file mode 100644 index 0000000..069e1db --- /dev/null +++ b/lib/libucsi/dvb/data_broadcast_descriptor.h @@ -0,0 +1,139 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_DATA_BROADCAST_DESCRIPTOR +#define _UCSI_DVB_DATA_BROADCAST_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + +/** + * dvb_data_broadcast_descriptor structure. + */ +struct dvb_data_broadcast_descriptor { +	struct descriptor d; + +	uint16_t data_broadcast_id; +	uint8_t component_tag; +	uint8_t selector_length; +	/* uint8_t selector[] */ +	/* struct dvb_data_broadcast_descriptor_part2 part2 */ +} __ucsi_packed; + +/** + * Second part of a dvb_data_broadcast_descriptor following the variable length selector field. + */ +struct dvb_data_broadcast_descriptor_part2 { +	iso639lang_t language_code; +	uint8_t text_length; +	/* uint8_t text[] */ +} __ucsi_packed; + +/** + * Process a dvb_data_broadcast_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_data_broadcast_descriptor pointer, or NULL on error. + */ +static inline struct dvb_data_broadcast_descriptor* +	dvb_data_broadcast_descriptor_codec(struct descriptor* d) +{ +	struct dvb_data_broadcast_descriptor *p = +		(struct dvb_data_broadcast_descriptor *) d; +	struct dvb_data_broadcast_descriptor_part2 *p2; +	uint8_t* buf = (uint8_t*) d + 2; +	uint32_t pos = sizeof(struct dvb_data_broadcast_descriptor) - 2; +	uint32_t len = d->len; + +	if (pos > len) +		return NULL; + +	bswap16(buf + 2); + +	pos += p->selector_length; + +	if (pos > len) +		return NULL; + +	p2 = (struct dvb_data_broadcast_descriptor_part2*) (buf + 2 + pos); + +	pos += sizeof(struct dvb_data_broadcast_descriptor_part2); + +	if (pos > len) +		return NULL; + +	pos += p2->text_length; + +	if (pos != len) +		return NULL; + +	return p; +} + +/** + * Accessor for the selector field of a dvb_data_broadcast_descriptor. + * + * @param d dvb_data_broadcast_descriptor pointer. + * @return pointer to the field. + */ +static inline uint8_t * +	dvb_data_broadcast_descriptor_selector(struct dvb_data_broadcast_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_data_broadcast_descriptor); +} + +/** + * Accessor for the second part of a dvb_data_broadcast_descriptor. + * + * @param d dvb_data_broadcast_descriptor pointer. + * @return dvb_data_broadcast_descriptor_part2 pointer. + */ +static inline struct dvb_data_broadcast_descriptor_part2 * +	dvb_data_broadcast_descriptor_part2(struct dvb_data_broadcast_descriptor *d) +{ +	return (struct dvb_data_broadcast_descriptor_part2*) +		((uint8_t*) d + sizeof(struct dvb_data_broadcast_descriptor) + +		 d->selector_length); +} + +/** + * Accessor for the text field in a dvb_data_broadcast_descriptor_part2. + * + * @param d dvb_data_broadcast_descriptor_part2 pointer. + * @return pointer to the field. + */ +static inline uint8_t * +	dvb_data_broadcast_descriptor_part2_text(struct dvb_data_broadcast_descriptor_part2 *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_data_broadcast_descriptor_part2); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/data_broadcast_id_descriptor.h b/lib/libucsi/dvb/data_broadcast_id_descriptor.h new file mode 100644 index 0000000..446927c --- /dev/null +++ b/lib/libucsi/dvb/data_broadcast_id_descriptor.h @@ -0,0 +1,221 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_DATA_BROADCAST_ID_DESCRIPTOR +#define _UCSI_DVB_DATA_BROADCAST_ID_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * Possible values for data_broadcast_id. + */ +enum { +	DVB_BROADCAST_ID_DATA_PIPE			= 0X0001, +	DVB_BROADCAST_ID_ASYNCHRONOUS_DATA_STREAM	= 0X0002, +	DVB_BROADCAST_ID_SYNCHRONOUS_DATA_STREAM	= 0X0003, +	DVB_BROADCAST_ID_SYNCHRONISED_DATA_STREAM	= 0X0004, +	DVB_BROADCAST_ID_MULTI_PROTOCOL_ENCAPSULATION	= 0X0005, +	DVB_BROADCAST_ID_DATA_CAROUSEL			= 0X0006, +	DVB_BROADCAST_ID_OBJECT_CAROUSEL		= 0X0007, +	DVB_BROADCAST_ID_DVB_ATM_STREAMS		= 0X0008, +	DVB_BROADCAST_ID_HIGHER_PROTOCOLS		= 0X0009, +	DVB_BROADCAST_ID_SOFTWARE_UPDATE		= 0x000A, +	DVB_BROADCAST_ID_IP_MAC_NOTIFICATION_TABLE	= 0x000B, +}; + +/** + * dvb_data_broadcast_id_descriptor structure. + */ +struct dvb_data_broadcast_id_descriptor { +	struct descriptor d; + +	uint16_t data_broadcast_id; +	/* uint8_t id_selector_byte[] */ +} __ucsi_packed; + +/** + * id_selector_byte for 0x000b data_broadcast_id (IP/MAC Notification Table). + */ +struct dvb_id_selector_byte_000b { +	uint8_t platform_id_data_length; +	/* struct dvb_ip_mac_notification_info infos[] */ +	/* uint8_t private_data[] */ +} __ucsi_packed; + +/** + * Entries in the infos field of a dvb_id_selector_byte_0b. + */ +struct dvb_ip_mac_notification_info { +  EBIT2(uint32_t platform_id		: 24; , +	uint8_t action_type		: 8;  ); +  EBIT3(uint8_t reserved		: 2;  , +	uint8_t INT_versioning_flag	: 1;  , +	uint8_t INT_version		: 5;  ); +} __ucsi_packed; + +/** + * Process a dvb_data_broadcast_id_descriptor. + * + * @param d Generic descriptor structure. + * @return dvb_data_broadcast_id_descriptor pointer, or NULL on error. + */ +static inline struct dvb_data_broadcast_id_descriptor* +	dvb_data_broadcast_id_descriptor_codec(struct descriptor* d) +{ +	if (d->len < (sizeof(struct dvb_data_broadcast_id_descriptor) - 2)) +		return NULL; + +	bswap16((uint8_t*) d + 2); + +	return (struct dvb_data_broadcast_id_descriptor*) d; +} + +/** + * Accessor for the selector_byte field of a dvb_data_broadcast_id_descriptor. + * + * @param d dvb_data_broadcast_id_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +	dvb_data_broadcast_id_descriptor_id_selector_byte(struct dvb_data_broadcast_id_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_data_broadcast_id_descriptor); +} + +/** + * Determine the length of the selector_byte field of a dvb_data_broadcast_id_descriptor. + * + * @param d dvb_data_broadcast_id_descriptor pointer. + * @return Length of the field in bytes. + */ +static inline int +	dvb_data_broadcast_id_descriptor_id_selector_byte_length(struct dvb_data_broadcast_id_descriptor *d) +{ +	return d->d.len - 2; +} + +/** + * Accessor for a dvb_id_selector_byte_000b pointer. + * + * @param d dvb_data_broadcast_id_descriptor pointer. + * @return Pointer to the data field. + */ +static inline struct dvb_id_selector_byte_000b * +	dvb_id_selector_byte_000b(struct dvb_data_broadcast_id_descriptor *d) +{ +	if (d->data_broadcast_id != DVB_BROADCAST_ID_IP_MAC_NOTIFICATION_TABLE) +		return NULL; +	return (struct dvb_id_selector_byte_000b *) dvb_data_broadcast_id_descriptor_id_selector_byte(d); +} + +/** + * Iterator for the dvb_ip_mac_notification_info field of a dvb_id_selector_byte_000b. + * + * @param id_selector_byte dvb_id_selector_byte_000b pointer. + * @param pos Variable containing a pointer to the current dvb_ip_mac_notification_info. + */ +#define dvb_id_selector_byte_000b_ip_mac_notification_info_for_each(id_selector_byte, pos) \ +	for ((pos) = dvb_ip_mac_notification_info_first(id_selector_byte); \ +	     (pos); \ +	     (pos) = dvb_ip_mac_notification_info_next(id_selector_byte, pos)) + +/** + * Length of the private_data field of a dvb_id_selector_byte_000b. + * + * @param d descriptor pointer. + * @param i dvb_id_selector_byte_000b pointer. + * @return Length of the field. + */ +static inline uint8_t +	dvb_id_selector_byte_000b_private_data_length(struct descriptor *d, +			    struct dvb_id_selector_byte_000b *i) +{ +	return (uint8_t) (d->len - +	     sizeof(struct descriptor) - +	     i->platform_id_data_length - +	     sizeof(struct dvb_id_selector_byte_000b)); +} + +/** + * Accessor for the private_data field of a dvb_id_selector_byte_000b. + * + * @param d descriptor pointer. + * @param i dvb_id_selector_byte_000b pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +	dvb_id_selector_byte_000b_private_data(struct descriptor *d, +			    struct dvb_id_selector_byte_000b *i) +{ +	if (dvb_id_selector_byte_000b_private_data_length(d, i) <= 0) +		return NULL; + +	return (uint8_t *) i + i->platform_id_data_length + sizeof(struct dvb_id_selector_byte_000b); +} + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_ip_mac_notification_info * +	dvb_ip_mac_notification_info_first(struct dvb_id_selector_byte_000b *d) +{ +	if (d->platform_id_data_length == 0) +		return NULL; + +	bswap32((uint8_t *) d + sizeof(struct dvb_id_selector_byte_000b)); + +	return (struct dvb_ip_mac_notification_info *) ((uint8_t *) d + sizeof(struct dvb_id_selector_byte_000b)); +} + +static inline struct dvb_ip_mac_notification_info * +	dvb_ip_mac_notification_info_next(struct dvb_id_selector_byte_000b *d, +				    struct dvb_ip_mac_notification_info *pos) +{ +	uint8_t *end = (uint8_t *) d + d->platform_id_data_length; +	uint8_t *next =	(uint8_t *) pos + +			sizeof(struct dvb_id_selector_byte_000b) + +			sizeof(struct dvb_ip_mac_notification_info); + +	if (next >= end) +		return NULL; + +	bswap32(next); + +	return (struct dvb_ip_mac_notification_info *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif + +#include <libucsi/dvb/mhp_data_broadcast_id_descriptor.h> diff --git a/lib/libucsi/dvb/default_authority_descriptor.h b/lib/libucsi/dvb/default_authority_descriptor.h new file mode 100644 index 0000000..0b0ba73 --- /dev/null +++ b/lib/libucsi/dvb/default_authority_descriptor.h @@ -0,0 +1,82 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_DEFAULT_AUTHORITY_DESCRIPTOR +#define _UCSI_DVB_DEFAULT_AUTHORITY_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_default_authority_descriptor structure. + */ +struct dvb_default_authority_descriptor { +	struct descriptor d; + +	/* char name[] */ +} __ucsi_packed; + +/** + * Process a dvb_default_authority_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_default_authority_descriptor pointer, or NULL on error. + */ +static inline struct dvb_default_authority_descriptor* +	dvb_default_authority_descriptor_codec(struct descriptor* d) +{ +	return (struct dvb_default_authority_descriptor*) d; +} + +/** + * Accessor for the name field in a dvb_default_authority_descriptor. + * + * @param d dvb_default_authority_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +	dvb_default_authority_descriptor_name(struct dvb_default_authority_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_default_authority_descriptor); +} + +/** + * Calculate the length of the name field in a dvb_default_authority_descriptor. + * + * @param d dvb_default_authority_descriptor pointer. + * @return Length of the field in bytes. + */ +static inline int +	dvb_default_authority_descriptor_name_length(struct dvb_default_authority_descriptor *d) +{ +	return d->d.len; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/descriptor.h b/lib/libucsi/dvb/descriptor.h new file mode 100644 index 0000000..303e17a --- /dev/null +++ b/lib/libucsi/dvb/descriptor.h @@ -0,0 +1,229 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_DESCRIPTOR_H +#define _UCSI_DVB_DESCRIPTOR_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/dvb/ac3_descriptor.h> +#include <libucsi/dvb/adaptation_field_data_descriptor.h> +#include <libucsi/dvb/ancillary_data_descriptor.h> +#include <libucsi/dvb/announcement_support_descriptor.h> +#include <libucsi/dvb/application_signalling_descriptor.h> +#include <libucsi/dvb/bouquet_name_descriptor.h> +#include <libucsi/dvb/ca_identifier_descriptor.h> +#include <libucsi/dvb/cable_delivery_descriptor.h> +#include <libucsi/dvb/cell_frequency_link_descriptor.h> +#include <libucsi/dvb/cell_list_descriptor.h> +#include <libucsi/dvb/component_descriptor.h> +#include <libucsi/dvb/content_descriptor.h> +#include <libucsi/dvb/content_identifier_descriptor.h> +#include <libucsi/dvb/country_availability_descriptor.h> +#include <libucsi/dvb/data_broadcast_descriptor.h> +#include <libucsi/dvb/data_broadcast_id_descriptor.h> +#include <libucsi/dvb/default_authority_descriptor.h> +#include <libucsi/dvb/dsng_descriptor.h> +#include <libucsi/dvb/extended_event_descriptor.h> +#include <libucsi/dvb/frequency_list_descriptor.h> +#include <libucsi/dvb/ip_mac_platform_name_descriptor.h> +#include <libucsi/dvb/ip_mac_platform_provider_name_descriptor.h> +#include <libucsi/dvb/ip_mac_stream_location_descriptor.h> +#include <libucsi/dvb/linkage_descriptor.h> +#include <libucsi/dvb/local_time_offset_descriptor.h> +#include <libucsi/dvb/mosaic_descriptor.h> +#include <libucsi/dvb/multilingual_bouquet_name_descriptor.h> +#include <libucsi/dvb/multilingual_component_descriptor.h> +#include <libucsi/dvb/multilingual_network_name_descriptor.h> +#include <libucsi/dvb/multilingual_service_name_descriptor.h> +#include <libucsi/dvb/network_name_descriptor.h> +#include <libucsi/dvb/nvod_reference_descriptor.h> +#include <libucsi/dvb/parental_rating_descriptor.h> +#include <libucsi/dvb/partial_transport_stream_descriptor.h> +#include <libucsi/dvb/pdc_descriptor.h> +#include <libucsi/dvb/private_data_specifier_descriptor.h> +#include <libucsi/dvb/related_content_descriptor.h> +#include <libucsi/dvb/satellite_delivery_descriptor.h> +#include <libucsi/dvb/s2_satellite_delivery_descriptor.h> +#include <libucsi/dvb/scrambling_descriptor.h> +#include <libucsi/dvb/service_availability_descriptor.h> +#include <libucsi/dvb/service_descriptor.h> +#include <libucsi/dvb/service_identifier_descriptor.h> +#include <libucsi/dvb/service_list_descriptor.h> +#include <libucsi/dvb/service_move_descriptor.h> +#include <libucsi/dvb/short_event_descriptor.h> +#include <libucsi/dvb/short_smoothing_buffer_descriptor.h> +#include <libucsi/dvb/stream_identifier_descriptor.h> +#include <libucsi/dvb/stuffing_descriptor.h> +#include <libucsi/dvb/subtitling_descriptor.h> +#include <libucsi/dvb/target_ip_address_descriptor.h> +#include <libucsi/dvb/target_ipv6_address_descriptor.h> +#include <libucsi/dvb/target_ip_slash_descriptor.h> +#include <libucsi/dvb/target_ip_source_slash_descriptor.h> +#include <libucsi/dvb/target_ipv6_slash_descriptor.h> +#include <libucsi/dvb/target_ipv6_source_slash_descriptor.h> +#include <libucsi/dvb/telephone_descriptor.h> +#include <libucsi/dvb/teletext_descriptor.h> +#include <libucsi/dvb/terrestrial_delivery_descriptor.h> +#include <libucsi/dvb/time_shifted_event_descriptor.h> +#include <libucsi/dvb/time_shifted_service_descriptor.h> +#include <libucsi/dvb/transport_stream_descriptor.h> +#include <libucsi/dvb/tva_id_descriptor.h> +#include <libucsi/dvb/vbi_data_descriptor.h> +#include <libucsi/dvb/vbi_teletext_descriptor.h> +#include <libucsi/endianops.h> + +/** + * The following are disabled because support is incomplete just now. + */ +/* +#include <libucsi/dvb/rnt_rar_over_dvb_stream_descriptor.h> +#include <libucsi/dvb/rnt_rar_over_ip_descriptor.h> +#include <libucsi/dvb/rnt_rnt_scan_descriptor.h> +#include <libucsi/dvb/ait_application_descriptor.h> +#include <libucsi/dvb/ait_application_name_descriptor.h> +#include <libucsi/dvb/ait_external_application_authorisation_descriptor.h> +#include <libucsi/dvb/ait_application_icons_descriptor.h> +*/ + +/** + * The following are not implemented just now + */ +/* +#include <libucsi/dvb/ait_transport_protocol_descriptor.h> +#include <libucsi/dvb/ait_dvb_j_application_descriptor.h> +#include <libucsi/dvb/ait_dvb_j_application_location_descriptor.h> +#include <libucsi/dvb/ait_dvb_html_application_descriptor.h> +#include <libucsi/dvb/ait_dvb_html_application_location_descriptor.h> +#include <libucsi/dvb/ait_dvb_html_application_boundary_descriptor.h> +#include <libucsi/dvb/ait_prefetch_descriptor.h> +#include <libucsi/dvb/ait_dii_location_descriptor.h> +#include <libucsi/dvb/ait_ip_signalling_descriptor.h> +*/ + +/** + * Enumeration of DVB descriptor tags. + */ +enum dvb_descriptor_tag { +	dtag_dvb_network_name			= 0x40, +	dtag_dvb_service_list			= 0x41, +	dtag_dvb_stuffing			= 0x42, +	dtag_dvb_satellite_delivery_system	= 0x43, +	dtag_dvb_cable_delivery_system		= 0x44, +	dtag_dvb_vbi_data			= 0x45, +	dtag_dvb_vbi_teletext			= 0x46, +	dtag_dvb_bouquet_name			= 0x47, +	dtag_dvb_service			= 0x48, +	dtag_dvb_country_availability		= 0x49, +	dtag_dvb_linkage			= 0x4a, +	dtag_dvb_nvod_reference			= 0x4b, +	dtag_dvb_time_shifted_service		= 0x4c, +	dtag_dvb_short_event			= 0x4d, +	dtag_dvb_extended_event			= 0x4e, +	dtag_dvb_time_shifted_event		= 0x4f, +	dtag_dvb_component			= 0x50, +	dtag_dvb_mosaic				= 0x51, +	dtag_dvb_stream_identifier		= 0x52, +	dtag_dvb_ca_identifier			= 0x53, +	dtag_dvb_content			= 0x54, +	dtag_dvb_parental_rating		= 0x55, +	dtag_dvb_teletext			= 0x56, +	dtag_dvb_telephone			= 0x57, +	dtag_dvb_local_time_offset		= 0x58, +	dtag_dvb_subtitling			= 0x59, +	dtag_dvb_terrestial_delivery_system	= 0x5a, +	dtag_dvb_multilingual_network_name	= 0x5b, +	dtag_dvb_multilingual_bouquet_name	= 0x5c, +	dtag_dvb_multilingual_service_name	= 0x5d, +	dtag_dvb_multilingual_component		= 0x5e, +	dtag_dvb_private_data_specifier		= 0x5f, +	dtag_dvb_service_move			= 0x60, +	dtag_dvb_short_smoothing_buffer		= 0x61, +	dtag_dvb_frequency_list			= 0x62, +	dtag_dvb_partial_transport_stream	= 0x63, +	dtag_dvb_data_broadcast			= 0x64, +	dtag_dvb_scrambling			= 0x65, +	dtag_dvb_data_broadcast_id		= 0x66, +	dtag_dvb_transport_stream		= 0x67, +	dtag_dvb_dsng				= 0x68, +	dtag_dvb_pdc				= 0x69, +	dtag_dvb_ac3				= 0x6a, +	dtag_dvb_ancillary_data			= 0x6b, +	dtag_dvb_cell_list			= 0x6c, +	dtag_dvb_cell_frequency_link		= 0x6d, +	dtag_dvb_announcement_support		= 0x6e, +	dtag_dvb_application_signalling		= 0x6f, +	dtag_dvb_adaptation_field_data		= 0x70, +	dtag_dvb_service_identifier		= 0x71, +	dtag_dvb_service_availability		= 0x72, +	dtag_dvb_default_authority		= 0x73, +	dtag_dvb_related_content		= 0x74, +	dtag_dvb_tva_id				= 0x75, +	dtag_dvb_content_identifier		= 0x76, +	dtag_dvb_time_slice_fec_identifier	= 0x77, +	dtag_dvb_ecm_repetition_rate		= 0x78, +	dtag_dvb_s2_satellite_delivery_descriptor= 0x79, +	dtag_dvb_enhanced_ac3_descriptor	= 0x7a, +	dtag_dvb_dts_descriptor			= 0x7b, +	dtag_dvb_aac_descriptor			= 0x7c, +	dtag_dvb_extension_descriptor		= 0x7f, + +	/* descriptors which may only appear in an RNT */ +	dtag_dvb_rnt_rar_over_dvb_stream	= 0x40, +	dtag_dvb_rnt_rar_over_ip		= 0x41, +	dtag_dvb_rnt_rnt_scan			= 0x42, + +	/* descriptors which may only appear in an AIT */ +	dtag_dvb_ait_application		= 0x00, +	dtag_dvb_ait_application_name		= 0x01, +	dtag_dvb_ait_transport_protocol		= 0x02, +	dtag_dvb_ait_dvb_j_application		= 0x03, +	dtag_dvb_ait_dvb_j_application_location	= 0x04, +	dtag_dvb_ait_external_application_authorisation	= 0x05, +	dtag_dvb_ait_dvb_html_application	= 0x08, +	dtag_dvb_ait_dvb_html_application_location = 0x09, +	dtab_dvb_ait_dvb_html_application_boundary = 0x0a, +	dtag_dvb_ait_application_icons		= 0x0b, +	dtag_dvb_ait_prefetch			= 0x0c, +	dtag_dvb_ait_dii_location		= 0x0d, +	dtag_dvb_ait_ip_signalling		= 0x11, + +	/* descriptors which may only appear in INT */ +	dtag_dvb_target_ip_address		= 0x09, +	dtag_dvb_target_ipv6_address		= 0x0a, +	dtag_dvb_ip_mac_platform_name		= 0x0c, +	dtag_dvb_ip_mac_platform_provider_name	= 0x0d, +	dtag_dvb_target_ip_slash		= 0x0f, +	dtag_dvb_target_ip_source_slash		= 0x10, +	dtag_dvb_target_ipv6_slash		= 0x11, +	dtag_dvb_target_ipv6_source_slash	= 0x12, +	dtag_dvb_ip_mac_stream_location		= 0x13, + +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/dit_section.c b/lib/libucsi/dvb/dit_section.c new file mode 100644 index 0000000..4f69d4e --- /dev/null +++ b/lib/libucsi/dvb/dit_section.c @@ -0,0 +1,32 @@ +/* + * 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/dvb/dit_section.h> + +struct dvb_dit_section * dvb_dit_section_codec(struct section * section) +{ +	struct dvb_dit_section * ret = (struct dvb_dit_section *)section; + +	if (section->length < 1) +		return NULL; + +	return ret; +} diff --git a/lib/libucsi/dvb/dit_section.h b/lib/libucsi/dvb/dit_section.h new file mode 100644 index 0000000..69fce4f --- /dev/null +++ b/lib/libucsi/dvb/dit_section.h @@ -0,0 +1,54 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_DIT_SECTION_H +#define _UCSI_DVB_DIT_SECTION_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/section.h> + +/** + * dvb_dit_section structure. + */ +struct dvb_dit_section { +	struct section head; + +  EBIT2(uint8_t transition_flag : 1; , +	uint8_t reserved 	: 7; ); +}; + +/** + * Process a dvb_dit_section. + * + * @param section Pointer to a generic section header. + * @return Pointer to a dvb_dit_section, or NULL on error. + */ +struct dvb_dit_section * dvb_dit_section_codec(struct section *section); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/dsng_descriptor.h b/lib/libucsi/dvb/dsng_descriptor.h new file mode 100644 index 0000000..6fd369b --- /dev/null +++ b/lib/libucsi/dvb/dsng_descriptor.h @@ -0,0 +1,80 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_DSNG_DESCRIPTOR +#define _UCSI_DVB_DSNG_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_dsng_descriptor structure. + */ +struct dvb_dsng_descriptor { +	struct descriptor d; + +	/* uint8_t data[] */ +} __ucsi_packed; + +/** + * Process a dvb_dsng_descriptor. + * + * @param d Generic descriptor structure. + * @return Pointer to a dvb_dsng_descriptor, or NULL on error. + */ +static inline struct dvb_dsng_descriptor* +	dvb_dsng_descriptor_codec(struct descriptor* d) +{ +	return (struct dvb_dsng_descriptor*) d; +} + +/** + * Accessor for the data field in a dvb_dsng_descriptor. + * + * @param d dvb_dsng_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint8_t *dvb_dsng_descriptor_data(struct dvb_dsng_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_dsng_descriptor); +} + +/** + * Determine the length of the data field in a dvb_dsng_descriptor. + * + * @param d dvb_dsng_descriptor pointer. + * @return Length of the field in bytes. + */ +static inline int dvb_dsng_descriptor_data_length(struct dvb_dsng_descriptor *d) +{ +	return d->d.len; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/eit_section.c b/lib/libucsi/dvb/eit_section.c new file mode 100644 index 0000000..97b0261 --- /dev/null +++ b/lib/libucsi/dvb/eit_section.c @@ -0,0 +1,63 @@ +/* + * 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/dvb/eit_section.h> + +struct dvb_eit_section *dvb_eit_section_codec(struct section_ext * ext) +{ +	uint8_t * buf = (uint8_t *) ext; +	size_t pos = sizeof(struct section_ext); +	size_t len = section_ext_length(ext); + +	if (len < sizeof(struct dvb_eit_section)) +		return NULL; + +	bswap16(buf + pos); +	pos += 2; +	bswap16(buf + pos); +	pos += 4; + +	while (pos < len) { +		struct dvb_eit_event * event = +			(struct dvb_eit_event *) (buf + pos); + +		if ((pos + sizeof(struct dvb_eit_event)) > len) +			return NULL; + +		bswap16(buf + pos); +		bswap16(buf + pos + 10); + +		pos += sizeof(struct dvb_eit_event); + +		if ((pos + event->descriptors_loop_length) > len) +			return NULL; + +		if (verify_descriptors(buf + pos, event->descriptors_loop_length)) +			return NULL; + +		pos += event->descriptors_loop_length; +	} + +	if (pos != len) +		return NULL; + +	return (struct dvb_eit_section *) ext; +} diff --git a/lib/libucsi/dvb/eit_section.h b/lib/libucsi/dvb/eit_section.h new file mode 100644 index 0000000..a2f3e4f --- /dev/null +++ b/lib/libucsi/dvb/eit_section.h @@ -0,0 +1,160 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_EIT_SECTION_H +#define _UCSI_DVB_EIT_SECTION_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/section.h> +#include <libucsi/dvb/types.h> + + +/** + * dvb_eit_section structure. + */ +struct dvb_eit_section { +	struct section_ext head; + +	uint16_t transport_stream_id; +	uint16_t original_network_id; +	uint8_t segment_last_section_number; +	uint8_t last_table_id; +	/* struct eit_event events[] */ +} __ucsi_packed; + +/** + * An entry in the events field of a dvb_eit_section. + */ +struct dvb_eit_event { +	uint16_t event_id; +	dvbdate_t start_time; +	dvbduration_t duration; +  EBIT3(uint16_t running_status		: 3;  , +	uint16_t free_ca_mode		: 1;  , +	uint16_t descriptors_loop_length:12; ); +	/* struct descriptor descriptors[] */ +} __ucsi_packed; + +/** + * Process a dvb_eit_section. + * + * @param section Pointer to a generic section_ext structure. + * @return Pointer to a dvb_eit_section, or NULL on error. + */ +struct dvb_eit_section *dvb_eit_section_codec(struct section_ext *section); + +/** + * Accessor for the service_id field of an EIT. + * + * @param eit EIT pointer. + * @return The service_id. + */ +static inline uint16_t dvb_eit_section_service_id(struct dvb_eit_section *eit) +{ +	return eit->head.table_id_ext; +} + +/** + * Iterator for the events field of a dvb_eit_section. + * + * @param eit dvb_eit_section pointer. + * @param pos Variable containing a pointer to the current dvb_eit_event. + */ +#define dvb_eit_section_events_for_each(eit, pos) \ +	for ((pos) = dvb_eit_section_events_first(eit); \ +	     (pos); \ +	     (pos) = dvb_eit_section_events_next(eit, pos)) + +/** + * Iterator for the descriptors field of a dvb_eit_event. + * + * @param eit dvb_eit_event pointer. + * @param pos Variable containing a pointer to the current descriptor. + */ +#define dvb_eit_event_descriptors_for_each(event, pos) \ +	for ((pos) = dvb_eit_event_descriptors_first(event); \ +	     (pos); \ +	     (pos) = dvb_eit_event_descriptors_next(event, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_eit_event * +	dvb_eit_section_events_first(struct dvb_eit_section *eit) +{ +	size_t pos = sizeof(struct dvb_eit_section); + +	if (pos >= section_ext_length(&eit->head)) +		return NULL; + +        return (struct dvb_eit_event*) ((uint8_t *) eit + pos); +} + +static inline struct dvb_eit_event * +	dvb_eit_section_events_next(struct dvb_eit_section *eit, +				    struct dvb_eit_event *pos) +{ +	uint8_t *end = (uint8_t*) eit + section_ext_length(&eit->head); +	uint8_t *next =	(uint8_t *) pos + +			sizeof(struct dvb_eit_event) + +			pos->descriptors_loop_length; + +	if (next >= end) +		return NULL; + +	return (struct dvb_eit_event *) next; +} + +static inline struct descriptor * +	dvb_eit_event_descriptors_first(struct dvb_eit_event * t) +{ +	if (t->descriptors_loop_length == 0) +		return NULL; + +	return (struct descriptor *) +		((uint8_t *) t + sizeof(struct dvb_eit_event)); +} + +static inline struct descriptor * +	dvb_eit_event_descriptors_next(struct dvb_eit_event * t, +				       struct descriptor* pos) +{ +	return next_descriptor((uint8_t*) t + sizeof(struct dvb_eit_event), +			       t->descriptors_loop_length, +			       pos); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/extended_event_descriptor.h b/lib/libucsi/dvb/extended_event_descriptor.h new file mode 100644 index 0000000..bba04b0 --- /dev/null +++ b/lib/libucsi/dvb/extended_event_descriptor.h @@ -0,0 +1,232 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_EXTENDED_EVENT_DESCRIPTOR +#define _UCSI_DVB_EXTENDED_EVENT_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + +/** + * dvb_extended_event_descriptor structure. + */ +struct dvb_extended_event_descriptor { +	struct descriptor d; + +  EBIT2(uint8_t descriptor_number	: 4; , +	uint8_t last_descriptor_number	: 4; ); +	iso639lang_t language_code; +	uint8_t length_of_items; +	/* struct dvb_extended_event_item items[] */ +	/* struct dvb_extended_event_descriptor_part2 part2 */ +} __ucsi_packed; + +/** + * An entry in the items field of a dvb_extended_event_descriptor. + */ +struct dvb_extended_event_item { +	uint8_t item_description_length; +	/* uint8_t item_description[] */ +	/* struct dvb_extended_event_item_part2 part2 */ +} __ucsi_packed; + +/** + * The second part of a dvb_extended_event_item, following the variable length + * description field. + */ +struct dvb_extended_event_item_part2 { +	uint8_t item_length; +	/* uint8_t item[] */ +} __ucsi_packed; + +/** + * The second part of a dvb_extended_event_descriptor, following the variable + * length items field. + */ +struct dvb_extended_event_descriptor_part2 { +	uint8_t text_length; +	/* uint8_t text[] */ +} __ucsi_packed; + +/** + * Process a dvb_extended_event_descriptor. + * + * @param d Generic descriptor structure. + * @return dvb_extended_event_descriptor pointer, or NULL on error. + */ +static inline struct dvb_extended_event_descriptor* +	dvb_extended_event_descriptor_codec(struct descriptor* d) +{ +	uint8_t* buf = (uint8_t*) d + 2; +	uint32_t pos = 0; +	uint32_t len = d->len; +	struct dvb_extended_event_descriptor * p = +		(struct dvb_extended_event_descriptor *) d; +	struct dvb_extended_event_descriptor_part2 *p2; + +	pos += sizeof(struct dvb_extended_event_descriptor) - 2; + +	if (pos > len) +		return NULL; + +	pos += p->length_of_items; + +	if (pos > len) +		return NULL; + +	p2 = (struct dvb_extended_event_descriptor_part2*) (buf+pos); + +	pos += sizeof(struct dvb_extended_event_descriptor_part2); + +	if (pos > len) +		return NULL; + +	pos += p2->text_length; + +	if (pos != len) +		return NULL; + +	return p; +} + +/** + * Iterator for the items field of a dvb_extended_event_descriptor. + * + * @param d dvb_extended_event_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_extended_event_item. + */ +#define dvb_extended_event_descriptor_items_for_each(d, pos) \ +	for ((pos) = dvb_extended_event_descriptor_items_first(d); \ +	     (pos); \ +	     (pos) = dvb_extended_event_descriptor_items_next(d, pos)) + +/** + * Accessor for the description field of a dvb_extended_event_item. + * + * @param d dvb_extended_event_item pointer. + * @return Pointer to the field. + */ +static inline uint8_t* +	dvb_extended_event_item_description(struct dvb_extended_event_item *d) +{ +	return (uint8_t*) d + sizeof(struct dvb_extended_event_item); +} + +/** + * Accessor for the second part of a dvb_extended_event_item. + * + * @param dvb_extended_event_item pointer. + * @return dvb_extended_event_item_part2 pointer. + */ +static inline struct dvb_extended_event_item_part2* +	dvb_extended_event_item_part2(struct dvb_extended_event_item *d) +{ +	return (struct dvb_extended_event_item_part2*) +		((uint8_t*) d + sizeof(struct dvb_extended_event_item) + +		 d->item_description_length); +} + +/** + * Accessor for the item field of a dvb_extended_event_item_part2. + * + * @param d dvb_extended_event_item_part2 pointer. + * @return Pointer to the item field. + */ +static inline uint8_t* +	dvb_extended_event_item_part2_item(struct dvb_extended_event_item_part2 *d) +{ +	return (uint8_t*) d + sizeof(struct dvb_extended_event_item_part2); +} + +/** + * Accessor for the second part of a dvb_extended_event_descriptor. + * + * @param d dvb_extended_event_descriptor pointer. + * @return dvb_extended_event_descriptor_part2 pointer. + */ +static inline struct dvb_extended_event_descriptor_part2* +	dvb_extended_event_descriptor_part2(struct dvb_extended_event_descriptor *d) +{ +	return (struct dvb_extended_event_descriptor_part2*) +		((uint8_t*) d + sizeof(struct dvb_extended_event_descriptor) + +		 d->length_of_items); +} + +/** + * Accessor for the text field of an dvb_extended_event_descriptor_part2. + * + * @param d dvb_extended_event_descriptor_part2 pointer. + * @return Pointer to the text field. + */ +static inline uint8_t* +	dvb_extended_event_descriptor_part2_text(struct dvb_extended_event_descriptor_part2 *d) +{ +	return (uint8_t*) +		((uint8_t*) d + sizeof(struct dvb_extended_event_descriptor_part2)); +} + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_extended_event_item* +	dvb_extended_event_descriptor_items_first(struct dvb_extended_event_descriptor *d) +{ +	if (d->length_of_items == 0) +		return NULL; + +	return (struct dvb_extended_event_item *) +		((uint8_t*) d + sizeof(struct dvb_extended_event_descriptor)); +} + +static inline struct dvb_extended_event_item* +	dvb_extended_event_descriptor_items_next(struct dvb_extended_event_descriptor *d, +						 struct dvb_extended_event_item *pos) +{ +	struct dvb_extended_event_item_part2* part2 = +		dvb_extended_event_item_part2(pos); +	uint8_t *end = (uint8_t*) d + sizeof(struct dvb_extended_event_descriptor) + d->length_of_items; +	uint8_t *next =	(uint8_t *) part2 + +			sizeof(struct dvb_extended_event_item_part2) + +			part2->item_length; + +	if (next >= end) +		return NULL; + +	return (struct dvb_extended_event_item *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/frequency_list_descriptor.h b/lib/libucsi/dvb/frequency_list_descriptor.h new file mode 100644 index 0000000..4c18cec --- /dev/null +++ b/lib/libucsi/dvb/frequency_list_descriptor.h @@ -0,0 +1,107 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_FREQUENCY_LIST_DESCRIPTOR +#define _UCSI_DVB_FREQUENCY_LIST_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * Possible values for coding_type. + */ +enum { +	DVB_CODING_TYPE_SATELLITE		= 0x01, +	DVB_CODING_TYPE_CABLE			= 0x02, +	DVB_CODING_TYPE_TERRESTRIAL		= 0x03, +}; + +/** + * dvb_frequency_list_descriptor structure. + */ +struct dvb_frequency_list_descriptor { +	struct descriptor d; + +  EBIT2(uint8_t reserved	: 6; , +	uint8_t coding_type	: 2; ); +	/* uint32_t centre_frequencies [] */ +} __ucsi_packed; + +/** + * Process a dvb_frequency_list_descriptor. + * + * @param d Pointer to a generic descriptor structure. + * @return dvb_frequency_list_descriptor pointer, or NULL on error. + */ +static inline struct dvb_frequency_list_descriptor* +	dvb_frequency_list_descriptor_codec(struct descriptor* d) +{ +	uint32_t pos = 0; +	uint8_t* buf = (uint8_t*) d + 2; +	uint32_t len = d->len; + +	pos += sizeof(struct dvb_frequency_list_descriptor) - 2; + +	if ((len - pos) % 4) +		return NULL; + +	while(pos < len) { +		bswap32(buf+pos); +		pos += 4; +	} + +	return (struct dvb_frequency_list_descriptor*) d; +} + +/** + * Accessor for the centre_frequencies field of a dvb_frequency_list_descriptor. + * + * @param d dvb_frequency_list_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint32_t * +	dvb_frequency_list_descriptor_centre_frequencies(struct dvb_frequency_list_descriptor *d) +{ +	return (uint32_t *) ((uint8_t *) d + sizeof(struct dvb_frequency_list_descriptor)); +} + +/** + * Determine the number of entries in the centre_frequencies field of a dvb_frequency_list_descriptor. + * + * @param d dvb_frequency_list_descriptor pointer. + * @return The number of entries. + */ +static inline int +	dvb_frequency_list_descriptor_centre_frequencies_count(struct dvb_frequency_list_descriptor *d) +{ +	return (d->d.len - 1) >> 2; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/int_section.c b/lib/libucsi/dvb/int_section.c new file mode 100644 index 0000000..c2bb15f --- /dev/null +++ b/lib/libucsi/dvb/int_section.c @@ -0,0 +1,79 @@ +/* + * section and descriptor parser + * + * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org) + * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net) + * Copyright (C) 2005 Patrick Boettcher (pb@linuxtv.org) + * + * 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/dvb/int_section.h> + +struct dvb_int_section * dvb_int_section_codec(struct section_ext *ext) +{ +	uint8_t *buf = (uint8_t *) ext; +	struct dvb_int_section *in = (struct dvb_int_section *) ext; +	size_t pos = sizeof(struct section_ext); +	size_t len = section_ext_length(ext); + +	if (len < sizeof(struct dvb_int_section)) +		return NULL; + +	bswap32(buf+8); +	bswap16(buf+12); +	pos += 6; + +	if (len - pos < in->platform_descriptors_length) +		return NULL; + +	if (verify_descriptors(buf + pos, in->platform_descriptors_length)) +		return NULL; + +	pos += in->platform_descriptors_length; + +	while (pos < len) { +		struct dvb_int_target *s2 = (struct dvb_int_target *) (buf + pos); +		struct dvb_int_operational_loop *s3; + +		bswap16(buf + pos); /* target_descriptor_loop_length swap */ + +		if (len - pos < s2->target_descriptors_length) +			return NULL; + +		pos += sizeof(struct dvb_int_target); + +		if (verify_descriptors(buf + pos, s2->target_descriptors_length)) +			return NULL; + +		pos += s2->target_descriptors_length; + +		s3 = (struct dvb_int_operational_loop *) (buf + pos); + +		bswap16(buf + pos); /* operational_descriptor_loop_length swap */ + +		if (len - pos < s3->operational_descriptors_length) +			return NULL; + +		pos += sizeof(struct dvb_int_operational_loop); + +		if (verify_descriptors(buf + pos, s3->operational_descriptors_length)) +			return NULL; + +		pos += s3->operational_descriptors_length; +	} + +	return (struct dvb_int_section *) ext; +} diff --git a/lib/libucsi/dvb/int_section.h b/lib/libucsi/dvb/int_section.h new file mode 100644 index 0000000..932c0e8 --- /dev/null +++ b/lib/libucsi/dvb/int_section.h @@ -0,0 +1,245 @@ +/* + * section and descriptor parser + * + * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org) + * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net) + * Copyright (C) 2005 Patrick Boettcher (pb@linuxtv.org) + * + * 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 + */ +#ifndef _UCSI_DVB_INT_SECTION_H +#define _UCSI_DVB_INT_SECTION_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/section.h> + +/** + * dvb_int_section structure - IP/MAC notification section. + */ +struct dvb_int_section { +	struct section_ext head; + +  EBIT2(uint32_t platform_id				:24;  , +	uint32_t processing_order			: 8;  ); +  EBIT2(uint16_t reserved2				: 4;  , +	uint16_t platform_descriptors_length		:12;  ); +	/* struct descriptor platform_descriptors[] */ +	/* struct dvb_int_target target_loop[] */ +} __ucsi_packed; + +/** + * An entry in the target_loop field of a dvb_int_section. + */ +struct dvb_int_target { +  EBIT2(uint16_t reserved3			: 4;  , +	uint16_t target_descriptors_length	:12;  ); +	/* struct descriptor target_descriptors[] */ +	/* struct dvb_int_operational_loop operational_loop */ +} __ucsi_packed; + +/** + * The operational_loop field in a dvb_int_target. + */ +struct dvb_int_operational_loop { +  EBIT2(uint16_t reserved4				: 4;  , +	uint16_t operational_descriptors_length		:12;  ); +	/* struct descriptor operational_descriptors[] */ +} __ucsi_packed; + +/** + * Process a dvb_int_section. + * + * @param section Generic section_ext pointer. + * @return dvb_int_section pointer, or NULL on error. + */ +extern struct dvb_int_section * dvb_int_section_codec(struct section_ext *section); + +/** + * Accessor for the action_type field of an INT. + * + * @param intp INT pointer. + * @return The action_type. + */ +static inline uint8_t dvb_int_section_action_type(struct dvb_int_section *intp) +{ +	return intp->head.table_id_ext >> 8; +} + +/** + * Accessor for the platform_id_hash field of an INT. + * + * @param intp INT pointer. + * @return The platform_id_hash. + */ +static inline uint8_t dvb_int_section_platform_id_hash(struct dvb_int_section *intp) +{ +	return intp->head.table_id_ext & 0xff; +} + +/** + * Iterator for platform_descriptors field in a dvb_int_section. + * + * @param intp dvb_int_section pointer. + * @param pos Variable holding a pointer to the current descriptor. + */ +#define dvb_int_section_platform_descriptors_for_each(intp, pos) \ +	for ((pos) = dvb_int_section_platform_descriptors_first(intp); \ +	     (pos); \ +	     (pos) = dvb_int_section_platform_descriptors_next(intp, pos)) + +/** + * Iterator for the target_loop field in a dvb_int_section. + * + * @param intp dvb_int_section pointer. + * @param pos Variable holding a pointer to the current dvb_int_target. + */ +#define dvb_int_section_target_loop_for_each(intp,pos) \ +	for ((pos) = dvb_int_section_target_loop_first(intp); \ +	     (pos); \ +	     (pos) = dvb_int_section_target_loop_next(intp, pos)) + +/** + * Iterator for the target_descriptors field in a dvb_int_target. + * + * @param target dvb_int_target pointer. + * @param pos Variable holding a pointer to the current descriptor. + */ +#define dvb_int_target_target_descriptors_for_each(target, pos) \ +	for ((pos) = dvb_int_target_target_descriptors_first(target); \ +	     (pos); \ +	     (pos) = dvb_int_target_target_descriptors_next(target, pos)) + +/** + * Accessor for the operational_loop field of a dvb_int_target. + * + * @param target dvb_int_target pointer. + * @return Pointer to a dvb_int_operational_loop. + */ +static inline struct dvb_int_operational_loop * +	dvb_int_target_operational_loop(struct dvb_int_target *target) +{ +	return (struct dvb_int_operational_loop *) +		((uint8_t *) target + sizeof(struct dvb_int_target) + target->target_descriptors_length); +} + +/** + * Iterator for the operational_descriptors field in a dvb_int_operational_loop. + * + * @param oploop dvb_int_operational_loop pointer. + * @param pos Variable holding a pointer to the current descriptor. + */ +#define dvb_int_operational_loop_operational_descriptors_for_each(oploop, pos) \ +	for ((pos) = dvb_int_operational_loop_operational_descriptors_first(oploop); \ +	     (pos); \ +	     (pos) = dvb_int_operational_loop_operational_descriptors_next(oploop, pos)) + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct descriptor * +	dvb_int_section_platform_descriptors_first(struct dvb_int_section *in) +{ +	if (in->platform_descriptors_length == 0) +		return NULL; + +	return (struct descriptor *) +		((uint8_t *) in + sizeof(struct dvb_int_section)); +} + +static inline struct descriptor * +	dvb_int_section_platform_descriptors_next(struct dvb_int_section *in, +		struct descriptor* pos) +{ +	return next_descriptor((uint8_t*) in + sizeof(struct dvb_int_section), +		in->platform_descriptors_length, +		pos); +} + +static inline struct dvb_int_target * +	dvb_int_section_target_loop_first(struct dvb_int_section *in) +{ +	if (sizeof(struct dvb_int_section) + in->platform_descriptors_length >= (uint32_t) section_ext_length((struct section_ext *) in)) +		return NULL; + +	return (struct dvb_int_target *) +		((uint8_t *) in + sizeof(struct dvb_int_section) + in->platform_descriptors_length); +} + +static inline struct dvb_int_target * +	dvb_int_section_target_loop_next(struct dvb_int_section *in, +			struct dvb_int_target *pos) +{ +	struct dvb_int_operational_loop *ol = dvb_int_target_operational_loop(pos); +	struct dvb_int_target *next = +		(struct dvb_int_target *) ( (uint8_t *) pos + +			sizeof(struct dvb_int_target) + pos->target_descriptors_length + +			sizeof(struct dvb_int_operational_loop) + ol->operational_descriptors_length); +	struct dvb_int_target *end = +		(struct dvb_int_target *) ((uint8_t *) in + section_ext_length((struct section_ext *) in) ); + +	if (next >= end) +		return 0; +	return next; +} + +static inline struct descriptor * +	dvb_int_target_target_descriptors_first(struct dvb_int_target *tl) +{ +	if (tl->target_descriptors_length == 0) +		return NULL; + +	return (struct descriptor *) +		((uint8_t *) tl + sizeof(struct dvb_int_target)); +} + +static inline struct descriptor * +	dvb_int_target_target_descriptors_next(struct dvb_int_target *tl, +		struct descriptor* pos) +{ +	return next_descriptor((uint8_t*) tl + sizeof(struct dvb_int_target), +		tl->target_descriptors_length, +		pos); +} + +static inline struct descriptor * +	dvb_int_operational_loop_operational_descriptors_first(struct dvb_int_operational_loop *ol) +{ +	if (ol->operational_descriptors_length == 0) +		return NULL; + +	return (struct descriptor *) +		((uint8_t *) ol + sizeof(struct dvb_int_operational_loop)); +} + +static inline struct descriptor * +	dvb_int_operational_loop_operational_descriptors_next(struct dvb_int_operational_loop *ol, +		struct descriptor* pos) +{ +	return next_descriptor((uint8_t*) ol + sizeof(struct dvb_int_operational_loop), +		ol->operational_descriptors_length, +		pos); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/ip_mac_platform_name_descriptor.h b/lib/libucsi/dvb/ip_mac_platform_name_descriptor.h new file mode 100644 index 0000000..c470e89 --- /dev/null +++ b/lib/libucsi/dvb/ip_mac_platform_name_descriptor.h @@ -0,0 +1,87 @@ +/* + * section and descriptor parser + * + * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org) + * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net) + * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr) + * + * 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 + */ + +#ifndef _UCSI_DVB_IP_MAC_PLATFORM_NAME_DESCRIPTOR +#define _UCSI_DVB_IP_MAC_PLATFORM_NAME_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/types.h> + +/** + * dvb_ip_platform_name_descriptor structure. + */ +struct dvb_ip_platform_name_descriptor { +	struct descriptor d; + +	iso639lang_t language_code; +	/* uint8_t text[] */ +} __ucsi_packed; + +/** + * Process a dvb_ip_platform_name_descriptor. + * + * @param d Pointer to a generic descriptor. + * @return dvb_ip_platform_name_descriptor pointer, or NULL on error. + */ +static inline struct dvb_ip_platform_name_descriptor* +	dvb_ip_platform_name_descriptor_codec(struct descriptor* d) +{ +	if (d->len < (sizeof(struct dvb_ip_platform_name_descriptor) - 2)) +		return NULL; + +	return (struct dvb_ip_platform_name_descriptor*) d; +} + +/** + * Accessor for the text field of a dvb_ip_platform_name_descriptor. + * + * @param d dvb_ip_platform_name_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +	dvb_ip_platform_name_descriptor_text(struct dvb_ip_platform_name_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_ip_platform_name_descriptor); +} + +/** + * Determine the length of the text field of a dvb_ip_platform_name_descriptor. + * + * @param d dvb_ip_platform_name_descriptor pointer. + * @return Length of the field in bytes. + */ +static inline int +	dvb_ip_platform_name_descriptor_text_length(struct dvb_ip_platform_name_descriptor *d) +{ +	return d->d.len - 3; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/ip_mac_platform_provider_name_descriptor.h b/lib/libucsi/dvb/ip_mac_platform_provider_name_descriptor.h new file mode 100644 index 0000000..ba95b8f --- /dev/null +++ b/lib/libucsi/dvb/ip_mac_platform_provider_name_descriptor.h @@ -0,0 +1,87 @@ +/* + * section and descriptor parser + * + * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org) + * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net) + * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr) + * + * 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 + */ + +#ifndef _UCSI_DVB_IP_MAC_PLATFORM_PROVIDER_NAME_DESCRIPTOR +#define _UCSI_DVB_IP_MAC_PLATFORM_PROVIDER_NAME_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/types.h> + +/** + * dvb_ip_platform_provider_name_descriptor structure. + */ +struct dvb_ip_platform_provider_name_descriptor { +	struct descriptor d; + +	iso639lang_t language_code; +	/* uint8_t text[] */ +} __ucsi_packed; + +/** + * Process a dvb_ip_platform_provider_name_descriptor. + * + * @param d Pointer to a generic descriptor. + * @return dvb_ip_platform_provider_name_descriptor pointer, or NULL on error. + */ +static inline struct dvb_ip_platform_provider_name_descriptor* +	dvb_ip_platform_provider_name_descriptor_codec(struct descriptor* d) +{ +	if (d->len < (sizeof(struct dvb_ip_platform_provider_name_descriptor) - 2)) +		return NULL; + +	return (struct dvb_ip_platform_provider_name_descriptor*) d; +} + +/** + * Accessor for the text field of a dvb_ip_platform_provider_name_descriptor. + * + * @param d dvb_ip_platform_provider_name_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +	dvb_ip_platform_provider_name_descriptor_text(struct dvb_ip_platform_provider_name_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_ip_platform_provider_name_descriptor); +} + +/** + * Determine the length of the text field of a dvb_ip_platform_provider_name_descriptor. + * + * @param d dvb_ip_platform_provider_name_descriptor pointer. + * @return Length of the field in bytes. + */ +static inline int +	dvb_ip_platform_provider_name_descriptor_text_length(struct dvb_ip_platform_provider_name_descriptor *d) +{ +	return d->d.len - 3; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/ip_mac_stream_location_descriptor.h b/lib/libucsi/dvb/ip_mac_stream_location_descriptor.h new file mode 100644 index 0000000..36216d6 --- /dev/null +++ b/lib/libucsi/dvb/ip_mac_stream_location_descriptor.h @@ -0,0 +1,73 @@ +/* + * section and descriptor parser + * + * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org) + * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net) + * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr) + * + * 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 + */ + +#ifndef _UCSI_DVB_IP_MAC_STREAM_LOCATION_DESCRIPTOR +#define _UCSI_DVB_IP_MAC_PLATFORM_PROVIDER_NAME_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/types.h> + +/** + * dvb_ip_mac_stream_location_descriptor structure. + */ +struct dvb_ip_mac_stream_location_descriptor { +	struct descriptor d; + +	uint16_t network_id; +	uint16_t original_network_id; +	uint16_t transport_stream_id; +	uint16_t service_id; +	uint8_t component_tag; +} __ucsi_packed; + +/** + * Process a dvb_ip_mac_stream_location_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_ip_mac_stream_location_descriptor pointer, or NULL on error. + */ +static inline struct dvb_ip_mac_stream_location_descriptor* +	dvb_ip_mac_stream_location_descriptor_codec(struct descriptor* d) +{ +	uint8_t* buf = (uint8_t*) d + 2; + +	if (d->len != (sizeof(struct dvb_ip_mac_stream_location_descriptor) - 2)) +		return NULL; + +	bswap16(buf); +	bswap16(buf+2); +	bswap16(buf+4); +	bswap16(buf+6); + +	return (struct dvb_ip_mac_stream_location_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/linkage_descriptor.h b/lib/libucsi/dvb/linkage_descriptor.h new file mode 100644 index 0000000..d2be789 --- /dev/null +++ b/lib/libucsi/dvb/linkage_descriptor.h @@ -0,0 +1,480 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_LINKAGE_DESCRIPTOR +#define _UCSI_DVB_LINKAGE_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + +/** + * Possible values for linkage_type. + */ +enum { +	DVB_LINKAGE_TYPE_INFORMATION			= 0x01, +	DVB_LINKAGE_TYPE_EPG				= 0x02, +	DVB_LINKAGE_TYPE_CA_REPLACEMENT			= 0x03, +	DVB_LINKAGE_TYPE_TS_WITH_BAT_NIT		= 0x04, +	DVB_LINKAGE_TYPE_SERVICE_REPLACMENT		= 0x05, +	DVB_LINKAGE_TYPE_DATA_BCAST			= 0x06, +	DVB_LINKAGE_TYPE_RCS_MAP			= 0x07, +	DVB_LINKAGE_TYPE_MOBILE_HANDOVER		= 0x08, +	DVB_LINKAGE_TYPE_SOFTWARE_UPDATE		= 0x09, +	DVB_LINKAGE_TYPE_TS_WITH_SSU_BAT_NIT		= 0x0a, +	DVB_LINKAGE_TYPE_IP_MAC_NOTIFICATION		= 0x0b, +	DVB_LINKAGE_TYPE_TS_WITH_INT_BAT_NIT		= 0x0c, +}; + +/** + * Possible values for hand_over_type. + */ +enum { +	DVB_HAND_OVER_TYPE_IDENTICAL_NEIGHBOURING_COUNTRY	= 0x01, +	DVB_HAND_OVER_TYPE_LOCAL_VARIATION			= 0x02, +	DVB_HAND_OVER_TYPE_ASSOCIATED_SERVICE			= 0x03, +}; + +/** + * Possible values for origin_type. + */ +enum { +	DVB_ORIGIN_TYPE_NIT				= 0x00, +	DVB_ORIGIN_TYPE_SDT				= 0x01, +}; + +/** + * dvb_linkage_descriptor structure. + */ +struct dvb_linkage_descriptor { +	struct descriptor d; + +	uint16_t transport_stream_id; +	uint16_t original_network_id; +	uint16_t service_id; +	uint8_t linkage_type; +	/* uint8_t data[] */ +} __ucsi_packed; + +/** + * Data for a linkage_type of 0x08. + */ +struct dvb_linkage_data_08 { +  EBIT3(uint8_t hand_over_type		: 4;  , +	uint8_t reserved		: 3;  , +	uint8_t origin_type		: 1;  ); +	/* uint16_t network_id if hand_over_type == 1,2,3 */ +	/* uint16_t initial_service_id if origin_type = 0 */ +	/* uint8_t data[] */ +} __ucsi_packed; + +/** + * Data for an linkage_type of 0x0b (IP/MAC Notification Table). + */ +struct dvb_linkage_data_0b { +	uint8_t platform_id_data_length; +	/* struct platform_id ids[] */ +} __ucsi_packed; + +/** + * Entries in the ids field of a dvb_linkage_data_0b. + */ +struct dvb_platform_id { +  EBIT2(uint32_t platform_id			: 24; , +	uint8_t platform_name_loop_length	: 8;  ); +	/* struct platform_name names[] */ +} __ucsi_packed; + +/** + * Entries in the names field of a dvb_platform_id. + */ +struct dvb_platform_name { +	iso639lang_t language_code; +	uint8_t platform_name_length; +	/* uint8_t text[] */ +} __ucsi_packed; + +/** + * Data for a linkage_type of 0x0c (IP/MAC Notification Table). + */ +struct dvb_linkage_data_0c { +	uint8_t table_type; +	/* uint16_t bouquet_id if table_type == 0x02 */ +} __ucsi_packed; + + +/** + * Process a dvb_linkage_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_linkage_descriptor pointer, or NULL on error. + */ +static inline struct dvb_linkage_descriptor* +	dvb_linkage_descriptor_codec(struct descriptor* d) +{ +	uint32_t pos = 0; +	uint8_t* buf = (uint8_t*) d + 2; +	uint32_t len = d->len; +	struct dvb_linkage_descriptor *p = +		(struct dvb_linkage_descriptor*) d; + +	if (len < (sizeof(struct dvb_linkage_descriptor) - 2)) +		return NULL; + +	bswap16(buf); +	bswap16(buf+2); +	bswap16(buf+4); + +	pos += sizeof(struct dvb_linkage_descriptor) - 2; + +	if (p->linkage_type == 0x08) { +		struct dvb_linkage_data_08 *d08; + +		if ((len - pos) < sizeof(struct dvb_linkage_data_08)) +			return NULL; +		d08 = (struct dvb_linkage_data_08 *) (buf+pos); +		pos += sizeof(struct dvb_linkage_data_08); + +		switch(d08->hand_over_type) { +		case 1: +		case 2: +		case 3: +			if ((len - pos) < 2) +				return NULL; +			bswap16(buf+pos); +			pos += 2; +			break; +		} +		if (d08->origin_type == 0) { +			if ((len - pos) < 2) +				return NULL; +			bswap16(buf+pos); +			pos+=2; +		} + +	} else if (p->linkage_type == 0x0b) { +		uint32_t pos2=0; +		struct dvb_linkage_data_0b *l_0b = (struct dvb_linkage_data_0b *) (buf + pos); + +		if ((len - pos) < sizeof(struct dvb_linkage_data_0b)) +			return NULL; + +		pos += sizeof(struct dvb_linkage_data_0b); +		if ((len - pos) < l_0b->platform_id_data_length) +			return NULL; + +		while (pos2 < l_0b->platform_id_data_length) { +			bswap32(buf + pos + pos2); + +			struct dvb_platform_id *p_id = (struct dvb_platform_id *) (buf + pos + pos2); +			if ((len - pos - pos2) < p_id->platform_name_loop_length) +				return NULL; + +			pos2 += sizeof(struct dvb_platform_id) + p_id->platform_name_loop_length; +		} + +		pos += pos2; +	} else if (p->linkage_type == 0x0c) { +		struct dvb_linkage_data_0c *l_0c = (struct dvb_linkage_data_0c *) (buf + pos); + +		if ((len - pos) < sizeof(struct dvb_linkage_data_0c)) +			return NULL; +		pos += sizeof(struct dvb_linkage_data_0c); + +		if (l_0c->table_type == 0x02) { +			if ((len - pos) < 2) +				return NULL; +			bswap16(buf+pos); +		} +	} + +	return (struct dvb_linkage_descriptor*) d; +} + +/** + * Accessor for the data field of a dvb_linkage_descriptor. + * + * @param d dvb_linkage_descriptor pointer. + * @return Pointer to the data field. + */ +static inline uint8_t * +	dvb_linkage_descriptor_data(struct dvb_linkage_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_linkage_descriptor); +} + +/** + * Determine the length of the data field of a dvb_linkage_descriptor. + * + * @param d dvb_linkage_descriptor pointer. + * @return Length of the field in bytes. + */ +static inline int +	dvb_linkage_descriptor_data_length(struct dvb_linkage_descriptor *d) +{ +	return d->d.len - 7; +} + +/** + * Accessor for a dvb_linkage_data_08 pointer. + * + * @param d dvb_linkage_descriptor pointer. + * @return Pointer to the data field. + */ +static inline struct dvb_linkage_data_08 * +	dvb_linkage_data_08(struct dvb_linkage_descriptor *d) +{ +	if (d->linkage_type != 0x08) +		return NULL; +	return (struct dvb_linkage_data_08 *) dvb_linkage_descriptor_data(d); +} + +/** + * Accessor for the network_id field of a dvb_linkage_data_08. + * + * @param d dvb_linkage_descriptor pointer + * @param d08 dvb_linkage_data_08 pointer. + * @return network_id, or -1 if not present + */ +static inline int +	dvb_linkage_data_08_network_id(struct dvb_linkage_descriptor *d, struct dvb_linkage_data_08 *d08) +{ +	if (d->linkage_type != 0x08) +		return -1; + +	switch(d08->hand_over_type) { +	case 1: +	case 2: +	case 3: +		return *((uint16_t*) ((uint8_t*) d08 + sizeof(struct dvb_linkage_data_08))); +	} + +	return -1; +} + +/** + * Accessor for the initial_service_id field of a dvb_linkage_data_08. + * + * @param d dvb_linkage_descriptor pointer + * @param d08 dvb_linkage_data_08 pointer. + * @return initial_service_id, or -1 if not present + */ +static inline int +	dvb_linkage_data_08_initial_service_id(struct dvb_linkage_descriptor *d, struct dvb_linkage_data_08 *d08) +{ +	uint8_t *pos; + +	if (d->linkage_type != 0x08) +		return -1; +	if (d08->origin_type != 0) +		return -1; + +	pos = ((uint8_t*) d08) + sizeof(struct dvb_linkage_data_08); +	switch(d08->hand_over_type) { +	case 1: +	case 2: +	case 3: +		pos +=2; +		break; +	} + +	return *((uint16_t*) pos); +} + +/** + * Accessor for the data field of a dvb_linkage_data_08. + * + * @param d dvb_linkage_descriptor pointer + * @param d08 dvb_linkage_data_08 pointer. + * @param length Pointer to int destination for data length. + * @return Pointer to the data field, or NULL if invalid + */ +static inline uint8_t * +	dvb_linkage_data_08_data(struct dvb_linkage_descriptor *d, struct dvb_linkage_data_08 *d08, int *length) +{ +	uint8_t *pos; +	int used = 0; + +	if (d->linkage_type != 0x08) { +		*length = 0; +		return NULL; +	} + +	pos = ((uint8_t*) d08) + sizeof(struct dvb_linkage_data_08); +	switch(d08->hand_over_type) { +	case 1: +	case 2: +	case 3: +		pos += 2; +		used += 2; +		break; +	} +	if (d08->origin_type == 0) { +		pos+=2; +		used+=2; +	} + +	*length = dvb_linkage_descriptor_data_length(d) - (sizeof(struct dvb_linkage_data_08) + used); +	return pos; +} + +/** + * Accessor for a dvb_linkage_data_0b pointer. + * + * @param d dvb_linkage_descriptor pointer. + * @return Pointer to the data field. + */ +static inline struct dvb_linkage_data_0b * +	dvb_linkage_data_0b(struct dvb_linkage_descriptor *d) +{ +	if (d->linkage_type != 0x0b) +		return NULL; +	return (struct dvb_linkage_data_0b *) dvb_linkage_descriptor_data(d); +} + +/** + * Iterator for the platform_id field of a dvb_linkage_data_0b. + * + * @param linkage dvb_linkage_data_0b pointer. + * @param pos Variable containing a pointer to the current dvb_platform_id. + */ +#define dvb_linkage_data_0b_platform_id_for_each(linkage, pos) \ +	for ((pos) = dvb_platform_id_first(linkage); \ +	     (pos); \ +	     (pos) = dvb_platform_id_next(linkage, pos)) + +/** + * Iterator for the platform_name field of a dvb_platform_id. + * + * @param platid dvb_platform_id pointer. + * @param pos Variable containing a pointer to the current dvb_platform_name. + */ +#define dvb_platform_id_platform_name_for_each(platid, pos) \ +	for ((pos) = dvb_platform_name_first(platid); \ +	     (pos); \ +	     (pos) = dvb_platform_name_next(platid, pos)) + +/** + * Accessor for the text field of a dvb_platform_name. + * + * @param p dvb_platform_name pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +	dvb_platform_name_text(struct dvb_platform_name *p) +{ +	return (uint8_t *) p + sizeof(struct dvb_platform_name); +} + +/** + * Accessor for a dvb_linkage_data_0c pointer. + * + * @param d dvb_linkage_descriptor pointer. + * @return Pointer to the data field. + */ +static inline struct dvb_linkage_data_0c * +		dvb_linkage_data_0c(struct dvb_linkage_descriptor *d) +{ +	if (d->linkage_type != 0x0c) +		return NULL; +	return (struct dvb_linkage_data_0c *) dvb_linkage_descriptor_data(d); +} + +/** + * Accessor for the bouquet_id field of a dvb_linkage_data_0c if table_id == 0x02. + * + * @param l_0c dvb_linkage_data_0c pointer. + * @return The bouquet field, or -1 on error. + */ +static inline int +	dvb_linkage_data_0c_bouquet_id(struct dvb_linkage_data_0c *l_0c) +{ +	if (l_0c->table_type != 0x02) +		return -1; + +	return *((uint16_t *) ((uint8_t*) l_0c + 1)); +} + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_platform_id * +	dvb_platform_id_first(struct dvb_linkage_data_0b *d) +{ +	if (d->platform_id_data_length == 0) +		return NULL; + +	return (struct dvb_platform_id *) ((uint8_t *) d + sizeof(struct dvb_linkage_data_0b)); +} + +static inline struct dvb_platform_id * +	dvb_platform_id_next(struct dvb_linkage_data_0b *d, +				    struct dvb_platform_id *pos) +{ +	uint8_t *end = (uint8_t *) d + d->platform_id_data_length; +	uint8_t *next =	(uint8_t *) pos + +			sizeof(struct dvb_platform_id) + +			pos->platform_name_loop_length; + +	if (next >= end) +		return NULL; + +	return (struct dvb_platform_id *) next; +} + +static inline struct dvb_platform_name * +	dvb_platform_name_first(struct dvb_platform_id *p) +{ +	if (p->platform_name_loop_length == 0) +		return NULL; + +	return (struct dvb_platform_name *) ((uint8_t *) p + sizeof(struct dvb_platform_id)); +} + +static inline struct dvb_platform_name * +	dvb_platform_name_next(struct dvb_platform_id *p, +				    struct dvb_platform_name *pos) +{ +	uint8_t *end = (uint8_t *) p + p->platform_name_loop_length; +	uint8_t *next =	(uint8_t *) pos + +			sizeof(struct dvb_platform_name) + +			pos->platform_name_length; + +	if (next >= end) +		return NULL; + +	return (struct dvb_platform_name *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/local_time_offset_descriptor.h b/lib/libucsi/dvb/local_time_offset_descriptor.h new file mode 100644 index 0000000..d0eebb3 --- /dev/null +++ b/lib/libucsi/dvb/local_time_offset_descriptor.h @@ -0,0 +1,127 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_LOCAL_TIME_OFFSET_DESCRIPTOR +#define _UCSI_DVB_LOCAL_TIME_OFFSET_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> +#include <libucsi/dvb/types.h> + +/** + * dvb_local_time_offset_descriptor parameter. + */ +struct dvb_local_time_offset_descriptor { +	struct descriptor d; + +	/* struct dvb_local_time_offset offsets[] */ +} __ucsi_packed; + +/** + * Entry in the offsets field of dvb_local_time_offset_descriptor. + */ +struct dvb_local_time_offset { +	iso639country_t country_code; +  EBIT3(uint8_t country_region_id		: 6; , +	uint8_t reserved			: 1; , +	uint8_t local_time_offset_polarity	: 1; ); +	dvbhhmm_t local_time_offset; +	dvbdate_t time_of_change; +	dvbhhmm_t next_time_offset; +} __ucsi_packed; + +/** + * Process a dvb_local_time_offset_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_local_time_offset_descriptor pointer, or NULL on error. + */ +static inline struct dvb_local_time_offset_descriptor* +	dvb_local_time_offset_descriptor_codec(struct descriptor* d) +{ +	uint32_t len = d->len; +	uint32_t pos = 0; + +	if (len % sizeof(struct dvb_local_time_offset)) +		return NULL; + +	while(pos < len) { +		pos += sizeof(struct dvb_local_time_offset); +	} + +	return (struct dvb_local_time_offset_descriptor*) d; +} + +/** + * Iterator for the offsets field of a dvb_local_time_offset_descriptor. + * + * @param d dvb_local_time_offset_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_local_time_offset. + */ +#define dvb_local_time_offset_descriptor_offsets_for_each(d, pos) \ +	for ((pos) = dvb_local_time_offset_descriptor_offsets_first(d); \ +	     (pos); \ +	     (pos) = dvb_local_time_offset_descriptor_offsets_next(d, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_local_time_offset* +	dvb_local_time_offset_descriptor_offsets_first(struct dvb_local_time_offset_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_local_time_offset *) +		((uint8_t*) d + sizeof(struct dvb_local_time_offset_descriptor)); +} + +static inline struct dvb_local_time_offset* +	dvb_local_time_offset_descriptor_offsets_next(struct dvb_local_time_offset_descriptor *d, +						      struct dvb_local_time_offset *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_local_time_offset); + +	if (next >= end) +		return NULL; + +	return (struct dvb_local_time_offset *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/mhp_data_broadcast_id_descriptor.h b/lib/libucsi/dvb/mhp_data_broadcast_id_descriptor.h new file mode 100644 index 0000000..d79b48c --- /dev/null +++ b/lib/libucsi/dvb/mhp_data_broadcast_id_descriptor.h @@ -0,0 +1,110 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_MHP_DATA_BROADCAST_ID_DESCRIPTOR +#define _UCSI_DVB_MHP_DATA_BROADCAST_ID_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifndef _UCSI_DVB_DATA_BROADCAST_ID_DESCRIPTOR +#error Must include dvb/data_broadcast_id_descriptor.h first +#endif + +/** + * Broadcast IDs for MHP. + */ +enum { +	DVB_BROADCAST_ID_MHP_OBJECT_CAROUSEL = 0x00f0, +	DVB_BROADCAST_ID_MHP_MPE = 0x00f1, +}; + +/** + * dvb_mhp_data_broadcast_id_descriptor structure. + */ +struct dvb_mhp_data_broadcast_id_descriptor { +	struct dvb_data_broadcast_id_descriptor d; +	/* uint16_t application_type[] */ +} __ucsi_packed; + +/** + * Process a dvb_mhp_data_broadcast_id_descriptor. + * + * @param d Generic descriptor structure. + * @return dvb_mhp_data_broadcast_id_descriptor pointer, or NULL on error. + */ +static inline struct dvb_mhp_data_broadcast_id_descriptor* +	dvb_mhp_data_broadcast_id_descriptor_codec(struct dvb_data_broadcast_id_descriptor* d) +{ +	uint8_t * buf; +	int len; +	int pos = 0; +	struct dvb_mhp_data_broadcast_id_descriptor *res = +		(struct dvb_mhp_data_broadcast_id_descriptor *) d; + +	if ((res->d.data_broadcast_id < 0xf0) || (res->d.data_broadcast_id > 0xfe)) +		return NULL; + +	buf = dvb_data_broadcast_id_descriptor_id_selector_byte(d); +	len = dvb_data_broadcast_id_descriptor_id_selector_byte_length(d); + +	if (len % 2) +		return NULL; + +	while(pos < len) { +		bswap16(buf+pos); +		pos+=2; +	} + +	return res; +} + +/** + * Accessor for the application_type field of a dvb_mhp_data_broadcast_id_descriptor. + * + * @param d dvb_mhp_data_broadcast_id_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint16_t * +	dvb_mhp_data_broadcast_id_descriptor_id_application_type(struct dvb_mhp_data_broadcast_id_descriptor *d) +{ +	return (uint16_t *) dvb_data_broadcast_id_descriptor_id_selector_byte((struct dvb_data_broadcast_id_descriptor*) d); +} + +/** + * Determine the number of entries in the application_type field of a dvb_mhp_data_broadcast_id_descriptor. + * + * @param d dvb_data_broadcast_id_descriptor pointer. + * @return Length of the field in bytes. + */ +static inline int +	dvb_mhp_data_broadcast_id_descriptor_id_application_type_count(struct dvb_mhp_data_broadcast_id_descriptor *d) +{ +	return dvb_data_broadcast_id_descriptor_id_selector_byte_length((struct dvb_data_broadcast_id_descriptor*) d) >> 1; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/mosaic_descriptor.h b/lib/libucsi/dvb/mosaic_descriptor.h new file mode 100644 index 0000000..6da1e95 --- /dev/null +++ b/lib/libucsi/dvb/mosaic_descriptor.h @@ -0,0 +1,324 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_MOSAIC_DESCRIPTOR +#define _UCSI_DVB_MOSAIC_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_mosaic_descriptor structure. + */ +struct dvb_mosaic_descriptor { +	struct descriptor d; + +  EBIT4(uint8_t mosaic_entry_point		: 1; , +	uint8_t number_of_horiz_elementary_cells: 3; , +	uint8_t reserved			: 1; , +	uint8_t number_of_vert_elementary_cells	: 3; ); +	/* struct dvb_mosaic_info infos[] */ +} __ucsi_packed; + +/** + * An entry in the infos field of a dvb_mosaic_descriptor. + */ +struct dvb_mosaic_info { +  EBIT3(uint16_t logical_cell_id		: 6; , +	uint16_t reserved			: 7; , +	uint16_t logical_cell_presentation_info	: 3; ); +	uint8_t elementary_cell_field_length; +	/* struct dvb_mosaic_elementary_cell_field fields[] */ +	/* struct dvb_mosaic_info_part2 part2 */ +	/* struct dvb_mosaic_linkage linkage */ +} __ucsi_packed; + +/** + * An entry in the fields field of a dvb_mosaic_info. + */ +struct dvb_mosaic_elementary_cell_field { +  EBIT2(uint8_t reserved		: 2; , +	uint8_t elementary_cell_id	: 6; ); +} __ucsi_packed; + +/** + * Part2 of dvb_mosaic_info, following the variable length fields field. + */ +struct dvb_mosaic_info_part2 { +	uint8_t cell_linkage_info; +} __ucsi_packed; + +struct dvb_mosaic_linkage_01 { +	uint16_t bouquet_id; +} __ucsi_packed; + +struct dvb_mosaic_linkage_02 { +	uint16_t original_network_id; +	uint16_t transport_stream_id; +	uint16_t service_id; +} __ucsi_packed; + +struct dvb_mosaic_linkage_03 { +	uint16_t original_network_id; +	uint16_t transport_stream_id; +	uint16_t service_id; +} __ucsi_packed; + +struct dvb_mosaic_linkage_04 { +	uint16_t original_network_id; +	uint16_t transport_stream_id; +	uint16_t service_id; +	uint16_t event_id; +} __ucsi_packed; + +/** + * Structure describing the linkage field of a dvb_mosaic_info + */ +struct dvb_mosaic_linkage { +	union { +		struct dvb_mosaic_linkage_01 linkage_01; +		struct dvb_mosaic_linkage_02 linkage_02; +		struct dvb_mosaic_linkage_03 linkage_03; +		struct dvb_mosaic_linkage_04 linkage_04; +	} u; +} __ucsi_packed; + +/** + * Process a dvb_mosaic_descriptor. + * + * @param d Pointer to a generic descriptor structure. + */ +static inline struct dvb_mosaic_descriptor* +	dvb_mosaic_descriptor_codec(struct descriptor* d) +{ +	uint8_t* buf = (uint8_t*) d + 2; +	uint32_t pos = 0; +	uint32_t len = d->len; +	struct dvb_mosaic_descriptor * p = +		(struct dvb_mosaic_descriptor *) d; + +	pos += (sizeof(struct dvb_mosaic_descriptor) - 2); + +	if (pos > len) +		return NULL; + +	while(pos < len) { +		struct dvb_mosaic_info *e = +			(struct dvb_mosaic_info*) (buf+pos); +		struct dvb_mosaic_info_part2 *e2; +		struct dvb_mosaic_linkage *linkage; + +		if ((pos + sizeof(struct dvb_mosaic_info)) > len) +			return NULL; + +		bswap16(buf + pos); + +		pos += sizeof(struct dvb_mosaic_info) + +			e->elementary_cell_field_length; + +		if (pos > len) +			return NULL; + +		e2 = (struct dvb_mosaic_info_part2*) (buf+pos); + +		pos += sizeof(struct dvb_mosaic_info_part2); + +		if (pos > len) +			return NULL; + +		linkage = (struct dvb_mosaic_linkage*) (buf+pos); + +		switch(e2->cell_linkage_info) { +		case 0x01: +			if ((pos + sizeof(struct dvb_mosaic_linkage_01)) > len) +				return NULL; +			bswap16(buf+pos); +			pos += sizeof(struct dvb_mosaic_linkage_01); +			break; + +		case 0x02: +			if ((pos + sizeof(struct dvb_mosaic_linkage_02)) > len) +				return NULL; +			bswap16(buf+pos); +			bswap16(buf+pos+2); +			bswap16(buf+pos+4); +			pos += sizeof(struct dvb_mosaic_linkage_02); +			break; + +		case 0x03: +			if ((pos + sizeof(struct dvb_mosaic_linkage_03)) > len) +				return NULL; +			bswap16(buf+pos); +			bswap16(buf+pos+2); +			bswap16(buf+pos+4); +			pos += sizeof(struct dvb_mosaic_linkage_03); +			break; + +		case 0x04: +			if ((pos + sizeof(struct dvb_mosaic_linkage_04)) > len) +				return NULL; +			bswap16(buf+pos); +			bswap16(buf+pos+2); +			bswap16(buf+pos+4); +			bswap16(buf+pos+6); +			pos += sizeof(struct dvb_mosaic_linkage_04); +			break; +		} +	} + +	return p; +} + +/** + * Iterator over the infos field of a dvb_mosaic_descriptor. + * + * @param d dvb_mosaic_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_mosaic_info. + */ +#define dvb_mosaic_descriptor_infos_for_each(d, pos) \ +	for ((pos) = dvb_mosaic_descriptor_infos_first(d); \ +	     (pos); \ +	     (pos) = dvb_mosaic_descriptor_infos_next(d, pos)) + +/** + * Iterator over the fields field of a dvb_mosaic_info. + * + * @param info dvb_mosaic_info pointer. + * @param pos Variable containing a pointer to the current dvb_mosaic_elementary_cell_field. + */ +#define dvb_mosaic_info_fields_for_each(info, pos) \ +	for ((pos) = dvb_mosaic_info_fields_first(info); \ +	     (pos); \ +	     (pos) = dvb_mosaic_info_fields_next(info, pos)) + +/** + * Accessor for the second part of the dvb_mosaic_info structure. + * + * @param entry dvb_mosaic_info pointer. + * @return dvb_mosaic_info_part2 pointer. + */ +static inline struct dvb_mosaic_info_part2* +	dvb_mosaic_info_part2(struct dvb_mosaic_info* entry) +{ +	return (struct dvb_mosaic_info_part2*) +		((uint8_t*) entry + sizeof(struct dvb_mosaic_info) + +		 entry->elementary_cell_field_length); +} + +/** + * Accessor for the linkage field a dvb_mosaic_info structure. + * + * @param entry dvb_mosaic_info_part2 pointer. + * @return dvb_mosaic_linkage pointer, or NULL on error. + */ +static inline struct dvb_mosaic_linkage* +	dvb_mosaic_linkage(struct dvb_mosaic_info_part2* entry) +{ +	if ((entry->cell_linkage_info != 0x01) && +	    (entry->cell_linkage_info != 0x02) && +	    (entry->cell_linkage_info != 0x03) && +	    (entry->cell_linkage_info != 0x04)) +		return NULL; + +	return (struct dvb_mosaic_linkage*) +		((uint8_t*) entry + sizeof(struct dvb_mosaic_info_part2)); +} + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_mosaic_info* +	dvb_mosaic_descriptor_infos_first(struct dvb_mosaic_descriptor *d) +{ +	if (d->d.len == 1) +		return NULL; + +	return (struct dvb_mosaic_info *) +		((uint8_t*) d + sizeof(struct dvb_mosaic_descriptor)); +} + +static inline struct dvb_mosaic_info* +	dvb_mosaic_descriptor_infos_next(struct dvb_mosaic_descriptor *d, +					 struct dvb_mosaic_info *pos) +{ +	struct dvb_mosaic_info_part2* part2 = dvb_mosaic_info_part2(pos); +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_mosaic_info) + +			pos->elementary_cell_field_length + +			sizeof(struct dvb_mosaic_info_part2); + +	if (part2->cell_linkage_info == 0x01) +		next += sizeof(struct dvb_mosaic_linkage_01); +	else if (part2->cell_linkage_info == 0x02) +		next += sizeof(struct dvb_mosaic_linkage_02); +	else if (part2->cell_linkage_info == 0x03) +		next += sizeof(struct dvb_mosaic_linkage_03); +	else if (part2->cell_linkage_info == 0x04) +		next += sizeof(struct dvb_mosaic_linkage_04); + +	if (next >= end) +		return NULL; + +	return (struct dvb_mosaic_info *) next; +} + +static inline struct dvb_mosaic_elementary_cell_field* +	dvb_mosaic_info_fields_first(struct dvb_mosaic_info *d) +{ +	if (d->elementary_cell_field_length == 0) +		return NULL; + +	return (struct dvb_mosaic_elementary_cell_field*) +		((uint8_t*) d + sizeof(struct dvb_mosaic_info)); +} + +static inline struct dvb_mosaic_elementary_cell_field* +	dvb_mosaic_info_fields_next(struct dvb_mosaic_info *d, +				    struct dvb_mosaic_elementary_cell_field* pos) +{ +	uint8_t *end = (uint8_t*) d + sizeof(struct dvb_mosaic_info) + +			d->elementary_cell_field_length; +	uint8_t *next =	(uint8_t *) pos + +			sizeof(struct dvb_mosaic_elementary_cell_field); + +	if (next >= end) +		return NULL; + +	return (struct dvb_mosaic_elementary_cell_field *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/multilingual_bouquet_name_descriptor.h b/lib/libucsi/dvb/multilingual_bouquet_name_descriptor.h new file mode 100644 index 0000000..0d8deb1 --- /dev/null +++ b/lib/libucsi/dvb/multilingual_bouquet_name_descriptor.h @@ -0,0 +1,145 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_MULTILINGUAL_BOUQUET_NAME_DESCRIPTOR +#define _UCSI_DVB_MULTILINGUAL_BOUQUET_NAME_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + +/** + * dvb_multilingual_bouquet_name_descriptor structure. + */ +struct dvb_multilingual_bouquet_name_descriptor { +	struct descriptor d; + +	/* struct dvb_multilingual_bouquet_name names[]*/ +} __ucsi_packed; + +/** + * An entry in the names field of a dvb_multilingual_bouquet_name_descriptor. + */ +struct dvb_multilingual_bouquet_name { +	iso639lang_t language_code; +	uint8_t bouquet_name_length; +	/* uint8_t name[] */ +} __ucsi_packed; + +/** + * Process a dvb_multilingual_bouquet_name_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_multilingual_bouquet_name_descriptor pointer, or NULL on error. + */ +static inline struct dvb_multilingual_bouquet_name_descriptor* +	dvb_multilingual_bouquet_name_descriptor_codec(struct descriptor* d) +{ +	uint8_t* buf = (uint8_t*) d + 2; +	uint32_t pos = 0; +	uint32_t len = d->len; + +	while(pos < len) { +		struct dvb_multilingual_bouquet_name *e = +			(struct dvb_multilingual_bouquet_name*) (buf+pos); + +		pos += sizeof(struct dvb_multilingual_bouquet_name); + +		if (pos > len) +			return NULL; + +		pos += e->bouquet_name_length; + +		if (pos > len) +			return NULL; +	} + +	return (struct dvb_multilingual_bouquet_name_descriptor*) d; +} + +/** + * Iterator for entries in the names field of a dvb_multilingual_bouquet_name_descriptor. + * + * @param d dvb_multilingual_bouquet_name_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_multilingual_bouquet_name. + */ +#define dvb_multilingual_bouquet_name_descriptor_names_for_each(d, pos) \ +	for ((pos) = dvb_multilingual_bouquet_name_descriptor_names_first(d); \ +	     (pos); \ +	     (pos) = dvb_multilingual_bouquet_name_descriptor_names_next(d, pos)) + +/** + * Accessor for the name field of a dvb_multilingual_bouquet_name. + * + * @param e dvb_multilingual_bouquet_name pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +	dvb_multilingual_bouquet_name_name(struct dvb_multilingual_bouquet_name *e) +{ +	return (uint8_t *) e + sizeof(struct dvb_multilingual_bouquet_name); +} + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_multilingual_bouquet_name* +	dvb_multilingual_bouquet_name_descriptor_names_first(struct dvb_multilingual_bouquet_name_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_multilingual_bouquet_name *) +		((uint8_t*) d + sizeof(struct dvb_multilingual_bouquet_name_descriptor)); +} + +static inline struct dvb_multilingual_bouquet_name* +	dvb_multilingual_bouquet_name_descriptor_names_next(struct dvb_multilingual_bouquet_name_descriptor *d, +							    struct dvb_multilingual_bouquet_name *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + +			sizeof(struct dvb_multilingual_bouquet_name) + +			pos->bouquet_name_length; + +	if (next >= end) +		return NULL; + +	return (struct dvb_multilingual_bouquet_name *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/multilingual_component_descriptor.h b/lib/libucsi/dvb/multilingual_component_descriptor.h new file mode 100644 index 0000000..ab156af --- /dev/null +++ b/lib/libucsi/dvb/multilingual_component_descriptor.h @@ -0,0 +1,149 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_MULTILINGUAL_COMPONENT_DESCRIPTOR +#define _UCSI_DVB_MULTILINGUAL_COMPONENT_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + +/** + * dvb_multilingual_component_descriptor structure. + */ +struct dvb_multilingual_component_descriptor { +	struct descriptor d; + +	uint8_t component_tag; +	/* struct dvb_multilingual_component components[] */ +} __ucsi_packed; + +/** + * An entry in the components field of a dvb_multilingual_component_descriptor. + */ +struct dvb_multilingual_component { +	iso639lang_t language_code; +	uint8_t text_description_length; +	/* uint8_t text_char[] */ +} __ucsi_packed; + +/** + * Process a dvb_multilingual_component_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_multilingual_component_descriptor pointer, or NULL on error. + */ +static inline struct dvb_multilingual_component_descriptor* +	dvb_multilingual_component_descriptor_codec(struct descriptor* d) +{ +	uint8_t* buf = (uint8_t*) d + 2; +	uint32_t pos = sizeof(struct dvb_multilingual_component_descriptor) - 2; +	uint32_t len = d->len; + +	if (pos > len) +		return NULL; + +	while(pos < len) { +		struct dvb_multilingual_component *e = +			(struct dvb_multilingual_component*) (buf+pos); + +		pos += sizeof(struct dvb_multilingual_component); + +		if (pos > len) +			return NULL; + +		pos += e->text_description_length; + +		if (pos > len) +			return NULL; +	} + +	return (struct dvb_multilingual_component_descriptor*) d; +} + +/** + * Iterator for entries in the components field of a dvb_multilingual_component_descriptor. + * + * @param d Generic descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_multilingual_component. + */ +#define dvb_multilingual_component_descriptor_components_for_each(d, pos) \ +	for ((pos) = dvb_multilingual_component_descriptor_components_first(d); \ +	     (pos); \ +	     (pos) = dvb_multilingual_component_descriptor_components_next(d, pos)) + +/** + * Accessor for the text_char field in a dvb_multilingual_component. + * + * @param e dvb_multilingual_component pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +	dvb_multilingual_component_text_char(struct dvb_multilingual_component *e) +{ +	return (uint8_t *) e + sizeof(struct dvb_multilingual_component); +} + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_multilingual_component* +	dvb_multilingual_component_descriptor_components_first(struct dvb_multilingual_component_descriptor *d) +{ +	if (d->d.len == 1) +		return NULL; + +	return (struct dvb_multilingual_component *) +		((uint8_t*) d + sizeof(struct dvb_multilingual_component_descriptor)); +} + +static inline struct dvb_multilingual_component* +	dvb_multilingual_component_descriptor_components_next(struct dvb_multilingual_component_descriptor *d, +							      struct dvb_multilingual_component *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + +			sizeof(struct dvb_multilingual_component) + +			pos->text_description_length; + +	if (next >= end) +		return NULL; + +	return (struct dvb_multilingual_component *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/multilingual_network_name_descriptor.h b/lib/libucsi/dvb/multilingual_network_name_descriptor.h new file mode 100644 index 0000000..1a7b8c4 --- /dev/null +++ b/lib/libucsi/dvb/multilingual_network_name_descriptor.h @@ -0,0 +1,145 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_MULTILINGUAL_NETWORK_NAME_DESCRIPTOR +#define _UCSI_DVB_MULTILINGUAL_NETWORK_NAME_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + +/** + * dvb_multilingual_network_name_descriptor structure. + */ +struct dvb_multilingual_network_name_descriptor { +	struct descriptor d; + +	/* struct dvb_multilingual_network_name names[] */ +} __ucsi_packed; + +/** + * An entry in the names field of a dvb_multilingual_network_name_descriptor. + */ +struct dvb_multilingual_network_name { +	iso639lang_t language_code; +	uint8_t network_name_length; +	/* uint8_t name[] */ +} __ucsi_packed; + +/** + * Process a dvb_multilingual_network_name_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_multilingual_network_name_descriptor pointer, or NULL on error. + */ +static inline struct dvb_multilingual_network_name_descriptor* +	dvb_multilingual_network_name_descriptor_codec(struct descriptor* d) +{ +	uint8_t* buf = (uint8_t*) d + 2; +	uint32_t pos = 0; +	uint32_t len = d->len; + +	while(pos < len) { +		struct dvb_multilingual_network_name *e = +			(struct dvb_multilingual_network_name*) (buf + pos); + +		pos += sizeof(struct dvb_multilingual_network_name); + +		if (pos > len) +			return NULL; + +		pos += e->network_name_length; + +		if (pos > len) +			return NULL; +	} + +	return (struct dvb_multilingual_network_name_descriptor*) d; +} + +/** + * Iterator for entries in the names field of a dvb_multilingual_network_name_descriptor. + * + * @param d dvb_multilingual_network_name_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_multilingual_network_name. + */ +#define dvb_multilingual_network_name_descriptor_names_for_each(d, pos) \ +	for ((pos) = dvb_multilingual_network_name_descriptor_names_first(d); \ +	     (pos); \ +	     (pos) = dvb_multilingual_network_name_descriptor_names_next(d, pos)) + +/** + * Accessor for the name field of a dvb_multilingual_network_name. + * + * @param e dvb_multilingual_network_name pointer. + * @return Pointer to the name field. + */ +static inline uint8_t * +	dvb_multilingual_network_name_name(struct dvb_multilingual_network_name *e) +{ +	return (uint8_t *) e + sizeof(struct dvb_multilingual_network_name); +} + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_multilingual_network_name* +	dvb_multilingual_network_name_descriptor_names_first(struct dvb_multilingual_network_name_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_multilingual_network_name *) +		((uint8_t*) d + sizeof(struct dvb_multilingual_network_name_descriptor)); +} + +static inline struct dvb_multilingual_network_name* +	dvb_multilingual_network_name_descriptor_names_next(struct dvb_multilingual_network_name_descriptor *d, +							    struct dvb_multilingual_network_name *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + +			sizeof(struct dvb_multilingual_network_name) + +			pos->network_name_length; + +	if (next >= end) +		return NULL; + +	return (struct dvb_multilingual_network_name *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/multilingual_service_name_descriptor.h b/lib/libucsi/dvb/multilingual_service_name_descriptor.h new file mode 100644 index 0000000..31bb9c3 --- /dev/null +++ b/lib/libucsi/dvb/multilingual_service_name_descriptor.h @@ -0,0 +1,197 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_MULTILINGUAL_SERVICE_NAME_DESCRIPTOR +#define _UCSI_DVB_MULTILINGUAL_SERVICE_NAME_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + +/** + * dvb_multilingual_service_name_descriptor structure. + */ +struct dvb_multilingual_service_name_descriptor { +	struct descriptor d; + +	/* struct dvb_multilingual_service_name names[] */ +} __ucsi_packed; + +/** + * An entry in the service_names field of a dvb_multilingual_service_name_descriptor. + */ +struct dvb_multilingual_service_name { +	iso639lang_t language_code; +	uint8_t service_provider_name_length; +	/* uint8_t service_provider_name[] */ +	/* struct dvb_multilingual_service_name_part2 part2 */ +} __ucsi_packed; + +/** + * Second part of a dvb_multilingual_service_name following the variable length + * service_provider_name. + */ +struct dvb_multilingual_service_name_part2 { +	uint8_t service_name_length; +	/* uint8_t service_name[] */ +} __ucsi_packed; + +/** + * Process a dvb_multilingual_service_name_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_multilingual_service_name_descriptor pointer, or NULL on error. + */ +static inline struct dvb_multilingual_service_name_descriptor* +	dvb_multilingual_service_name_descriptor_codec(struct descriptor* d) +{ +	uint8_t* buf = (uint8_t*) d + 2; +	uint32_t pos = 0; +	uint32_t len = d->len; + +	while(pos < len) { +		struct dvb_multilingual_service_name *e = +			(struct dvb_multilingual_service_name*) (buf+pos); +		struct dvb_multilingual_service_name_part2 *e2; + +		pos += sizeof(struct dvb_multilingual_service_name); + +		if (pos > len) +			return NULL; + +		pos += e->service_provider_name_length; + +		if (pos > len) +			return NULL; + +		e2 = (struct dvb_multilingual_service_name_part2*) (buf+pos); + +		pos += sizeof(struct dvb_multilingual_service_name_part2); + +		if (pos > len) +			return NULL; + +		pos += e2->service_name_length; + +		if (pos > len) +			return NULL; +	} + +	return (struct dvb_multilingual_service_name_descriptor*) d; +} + +/** + * Iterator for entries in the service_name field of a dvb_multilingual_service_name_descriptor. + * + * @param d dvb_multilingual_service_name_descriptor pointer, + * @param pos Variable containing pointer to the current dvb_multilingual_service_name. + */ +#define dvb_multilingual_service_name_descriptor_names_for_each(d, pos) \ +	for ((pos) = dvb_multilingual_service_name_descriptor_names_first(d); \ +	     (pos); \ +	     (pos) = dvb_multilingual_service_name_descriptor_names_next(d, pos)) + +/** + * Accessor for the service_provider_name field of a dvb_multilingual_service_name. + * + * @param e dvb_multilingual_service_name pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +	dvb_multilingual_service_name_service_provider_name(struct dvb_multilingual_service_name *e) +{ +	return (uint8_t *) e + sizeof(struct dvb_multilingual_service_name); +} + +/** + * Accessor for the dvb_multilingual_service_name_part2 - second part of a + * dvb_multilingual_service_name following the service_name field. + * + * @param e dvb_multilingual_service_name Pointer. + * @return dvb_multilingual_service_name_part2 pointer. + */ +static inline struct dvb_multilingual_service_name_part2 * +	dvb_multilingual_service_name_part2(struct dvb_multilingual_service_name *e) +{ +	return (struct dvb_multilingual_service_name_part2 *) +		((uint8_t *) e + sizeof(struct dvb_multilingual_service_name) + +		 e->service_provider_name_length); +} + +/** + * Accessor for the service_name field of a dvb_multilingual_service_name_part2. + * + * @param e dvb_multilingual_service_name_part2 pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +	dvb_multilingual_service_name_service_name(struct dvb_multilingual_service_name_part2 *e) +{ +	return (uint8_t *) e + sizeof(struct dvb_multilingual_service_name_part2); +} + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_multilingual_service_name* +	dvb_multilingual_service_name_descriptor_names_first(struct dvb_multilingual_service_name_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_multilingual_service_name *) +		((uint8_t*) d + sizeof(struct dvb_multilingual_service_name_descriptor)); +} + +static inline struct dvb_multilingual_service_name* +	dvb_multilingual_service_name_descriptor_names_next(struct dvb_multilingual_service_name_descriptor *d, +							    struct dvb_multilingual_service_name *pos) +{ +	struct dvb_multilingual_service_name_part2 * part2 = +			dvb_multilingual_service_name_part2(pos); +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) part2+ +			sizeof(struct dvb_multilingual_service_name_part2) + +			part2->service_name_length; + +	if (next >= end) +		return NULL; + +	return (struct dvb_multilingual_service_name *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/network_name_descriptor.h b/lib/libucsi/dvb/network_name_descriptor.h new file mode 100644 index 0000000..0754597 --- /dev/null +++ b/lib/libucsi/dvb/network_name_descriptor.h @@ -0,0 +1,82 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_NETWORK_NAME_DESCRIPTOR +#define _UCSI_DVB_NETWORK_NAME_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_network_name_descriptor structure. + */ +struct dvb_network_name_descriptor { +	struct descriptor d; + +	/* char name[] */ +} __ucsi_packed; + +/** + * Process a dvb_network_name_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_network_name_descriptor pointer, or NULL on error. + */ +static inline struct dvb_network_name_descriptor* +	dvb_network_name_descriptor_codec(struct descriptor* d) +{ +	return (struct dvb_network_name_descriptor*) d; +} + +/** + * Accessor for the name field in a dvb_network_name_descriptor. + * + * @param d dvb_network_name_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +	dvb_network_name_descriptor_name(struct dvb_network_name_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_network_name_descriptor); +} + +/** + * Calculate the length of the name field in a dvb_network_name_descriptor. + * + * @param d dvb_network_name_descriptor pointer. + * @return Length of the field in bytes. + */ +static inline int +	dvb_network_name_descriptor_name_length(struct dvb_network_name_descriptor *d) +{ +	return d->d.len; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/nit_section.c b/lib/libucsi/dvb/nit_section.c new file mode 100644 index 0000000..664a0cb --- /dev/null +++ b/lib/libucsi/dvb/nit_section.c @@ -0,0 +1,78 @@ +/* + * 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/dvb/nit_section.h> + +struct dvb_nit_section *dvb_nit_section_codec(struct section_ext * ext) +{ +	uint8_t * buf = (uint8_t *) ext; +	struct dvb_nit_section * ret = (struct dvb_nit_section *) ext; +	size_t pos = sizeof(struct section_ext); +	size_t len = section_ext_length(ext); + +	if (len < sizeof(struct dvb_nit_section)) +		return NULL; + +	bswap16(buf + pos); +	pos += 2; + +	if ((pos + ret->network_descriptors_length) > len) +		return NULL; + +	if (verify_descriptors(buf + pos, ret->network_descriptors_length)) +		return NULL; + +	pos += ret->network_descriptors_length; + +	if ((pos + sizeof(struct dvb_nit_section_part2)) > len) +		return NULL; + +	bswap16(buf + pos); +	pos += 2; + +	while (pos < len) { +		struct dvb_nit_transport *transport = +			(struct dvb_nit_transport *)(buf + pos); + +		if ((pos + sizeof(struct dvb_nit_transport)) > len) +			return NULL; + +		bswap16(buf + pos); +		bswap16(buf + pos + 2); +		bswap16(buf + pos + 4); + +		pos += sizeof(struct dvb_nit_transport); + +		if ((pos + transport->transport_descriptors_length) > len) +			return NULL; + +		if (verify_descriptors(buf + pos, +					transport->transport_descriptors_length)) +			return NULL; + +		pos += transport->transport_descriptors_length; +	} + +	if (pos != len) +		return NULL; + +	return ret; +} diff --git a/lib/libucsi/dvb/nit_section.h b/lib/libucsi/dvb/nit_section.h new file mode 100644 index 0000000..77ab1a0 --- /dev/null +++ b/lib/libucsi/dvb/nit_section.h @@ -0,0 +1,207 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_NIT_SECTION_H +#define _UCSI_DVB_NIT_SECTION_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/section.h> + +/** + * dvb_nit_section structure. + */ +struct dvb_nit_section { +	struct section_ext head; + +  EBIT2(uint16_t reserved_1			: 4; , +	uint16_t network_descriptors_length	:12; ); +	/* struct descriptor descriptors[] */ +	/* struct dvb_nit_section_part2 part2 */ +}; + +/** + * Second part of a dvb_nit_section, following the variable length descriptors field. + */ +struct dvb_nit_section_part2 { +  EBIT2(uint16_t reserved_2			: 4; , +	uint16_t transport_stream_loop_length	:12; ); +	/* struct dvb_nit_transport transports[] */ +} __ucsi_packed; + +/** + * An entry in the transports field of a dvb_nit_section_part2 + */ +struct dvb_nit_transport { +	uint16_t transport_stream_id; +	uint16_t original_network_id; +  EBIT2(uint16_t reserved			: 4; , +	uint16_t transport_descriptors_length	:12; ); +	/* struct descriptor descriptors[] */ +} __ucsi_packed; + +/** + * Process a dvb_nit_section. + * + * @param section Generic section_ext pointer. + * @return dvb_nit_section pointer, or NULL on error. + */ +struct dvb_nit_section * dvb_nit_section_codec(struct section_ext *section); + +/** + * Accessor for the network_id field of a NIT. + * + * @param nit NIT pointer. + * @return The network_id. + */ +static inline uint16_t dvb_nit_section_network_id(struct dvb_nit_section *nit) +{ +	return nit->head.table_id_ext; +} + +/** + * Iterator over the descriptors field in a dvb_nit_section. + * + * @param nit dvb_nit_section pointer. + * @param pos Variable containing a pointer to the current descriptor. + */ +#define dvb_nit_section_descriptors_for_each(nit, pos) \ +	for ((pos) = dvb_nit_section_descriptors_first(nit); \ +	     (pos); \ +	     (pos) = dvb_nit_section_descriptors_next(nit, pos)) + +/** + * Accessor for a pointer to the dvb_nit_section_part2 structure. + * + * @param nit dvb_nit_section pointer. + * @return dvb_nit_section_part2 pointer. + */ +static inline struct dvb_nit_section_part2 *dvb_nit_section_part2(struct dvb_nit_section * nit) +{ +	return (struct dvb_nit_section_part2 *) +		((uint8_t*) nit + sizeof(struct dvb_nit_section) + +		 nit->network_descriptors_length); +} + +/** + * Iterator over the transports field in a dvb_nit_section_part2. + * + * @param nit dvb_nit_section pointer. + * @param part2 dvb_nit_section_part2 pointer. + * @param pos Pointer to the current dvb_nit_transport. + */ +#define dvb_nit_section_transports_for_each(nit, part2, pos) \ +	for ((pos) = dvb_nit_section_transports_first(part2); \ +	     (pos); \ +	     (pos) = dvb_nit_section_transports_next(part2, pos)) + +/** + * Iterator over the descriptors field in a dvb_nit_transport. + * + * @param transport dvb_nit_transport pointer. + * @param pos Pointer to the current descriptor. + */ +#define dvb_nit_transport_descriptors_for_each(transport, pos) \ +	for ((pos) = dvb_nit_transport_descriptors_first(transport); \ +	     (pos); \ +	     (pos) = dvb_nit_transport_descriptors_next(transport, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct descriptor * +	dvb_nit_section_descriptors_first(struct dvb_nit_section * nit) +{ +	if (nit->network_descriptors_length == 0) +		return NULL; + +	return (struct descriptor *) +		((uint8_t *) nit + sizeof(struct dvb_nit_section)); +} + +static inline struct descriptor * +	dvb_nit_section_descriptors_next(struct dvb_nit_section * nit, +					 struct descriptor* pos) +{ +	return next_descriptor((uint8_t*) nit + sizeof(struct dvb_nit_section), +			      nit->network_descriptors_length, +			      pos); +} + +static inline struct dvb_nit_transport * +	dvb_nit_section_transports_first(struct dvb_nit_section_part2 *part2) +{ +	if (part2->transport_stream_loop_length == 0) +		return NULL; + +	return (struct dvb_nit_transport *) +		((uint8_t *)part2 + sizeof(struct dvb_nit_section_part2)); +} + +static inline struct dvb_nit_transport * +	dvb_nit_section_transports_next(struct dvb_nit_section_part2 *part2, +					struct dvb_nit_transport *pos) +{ +	uint8_t *end = (uint8_t*) part2 + sizeof(struct dvb_nit_section_part2) + +		part2->transport_stream_loop_length; +	uint8_t *next = (uint8_t*) pos + sizeof(struct dvb_nit_transport) + +		pos->transport_descriptors_length; + +	if (next >= end) +		return NULL; + +	return (struct dvb_nit_transport *) next; +} + +static inline struct descriptor * +	dvb_nit_transport_descriptors_first(struct dvb_nit_transport *t) +{ +	if (t->transport_descriptors_length == 0) +		return NULL; + +	return (struct descriptor *) +		((uint8_t*) t + sizeof(struct dvb_nit_transport)); +} + +static inline struct descriptor * +	dvb_nit_transport_descriptors_next(struct dvb_nit_transport *t, +					   struct descriptor* pos) +{ +	return next_descriptor((uint8_t*) t + sizeof(struct dvb_nit_transport), +			      t->transport_descriptors_length, +			      pos); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/nvod_reference_descriptor.h b/lib/libucsi/dvb/nvod_reference_descriptor.h new file mode 100644 index 0000000..6180514 --- /dev/null +++ b/lib/libucsi/dvb/nvod_reference_descriptor.h @@ -0,0 +1,125 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_NVOD_REFERENCE_DESCRIPTOR +#define _UCSI_DVB_NVOD_REFERENCE_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_nvod_reference_descriptor structure. + */ +struct dvb_nvod_reference_descriptor { +	struct descriptor d; + +	/* struct dvb_nvod_reference references[] */ +} __ucsi_packed; + +/** + * An entry in the references field of a dvb_nvod_reference_descriptor. + */ +struct dvb_nvod_reference { +	uint16_t transport_stream_id; +	uint16_t original_network_id; +	uint16_t service_id; +} __ucsi_packed; + +/** + * Process a dvb_nvod_reference_descriptor. + * + * @param d Pointer to a generic descriptor structure pointer. + * @return dvb_nvod_reference_descriptor pointer, or NULL on error. + */ +static inline struct dvb_nvod_reference_descriptor* +	dvb_nvod_reference_descriptor_codec(struct descriptor* d) +{ +	uint32_t pos = 0; +	uint8_t* buf = (uint8_t*) d + 2; +	uint32_t len = d->len; + +	if (len % sizeof(struct dvb_nvod_reference)) +		return NULL; + +	while(pos < len) { +		bswap16(buf+pos); +		bswap16(buf+pos+2); +		bswap16(buf+pos+4); +		pos += sizeof(struct dvb_nvod_reference); +	} + +	return (struct dvb_nvod_reference_descriptor*) d; +} + +/** + * Iterator over the references field in a dvb_nvod_reference_descriptor. + * + * @param d dvb_nvod_reference_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_nvod_reference. + */ +#define dvb_nvod_reference_descriptor_references_for_each(d, pos) \ +	for ((pos) = dvb_nvod_reference_descriptor_references_first(d); \ +	     (pos); \ +	     (pos) = dvb_nvod_reference_descriptor_references_next(d, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_nvod_reference* +	dvb_nvod_reference_descriptor_references_first(struct dvb_nvod_reference_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_nvod_reference *) +		((uint8_t*) d + sizeof(struct dvb_nvod_reference_descriptor)); +} + +static inline struct dvb_nvod_reference* +	dvb_nvod_reference_descriptor_references_next(struct dvb_nvod_reference_descriptor *d, +						      struct dvb_nvod_reference *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_nvod_reference); + +	if (next >= end) +		return NULL; + +	return (struct dvb_nvod_reference *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/parental_rating_descriptor.h b/lib/libucsi/dvb/parental_rating_descriptor.h new file mode 100644 index 0000000..72ecd0a --- /dev/null +++ b/lib/libucsi/dvb/parental_rating_descriptor.h @@ -0,0 +1,135 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_PARENTAL_RATING_DESCRIPTOR +#define _UCSI_DVB_PARENTAL_RATING_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + +/** + * Defined values for the rating field. + */ +enum { +	DVB_PARENTAL_RATING_MIN_3YEARS		= 0x01, +	DVB_PARENTAL_RATING_MIN_4YEARS		= 0x02, +	DVB_PARENTAL_RATING_MIN_5YEARS		= 0x03, +	DVB_PARENTAL_RATING_MIN_6YEARS		= 0x04, +	DVB_PARENTAL_RATING_MIN_7YEARS		= 0x05, +	DVB_PARENTAL_RATING_MIN_8YEARS		= 0x06, +	DVB_PARENTAL_RATING_MIN_9YEARS		= 0x07, +	DVB_PARENTAL_RATING_MIN_10YEARS		= 0x08, +	DVB_PARENTAL_RATING_MIN_11YEARS		= 0x09, +	DVB_PARENTAL_RATING_MIN_12YEARS		= 0x0a, +	DVB_PARENTAL_RATING_MIN_13YEARS		= 0x0b, +	DVB_PARENTAL_RATING_MIN_14YEARS		= 0x0c, +	DVB_PARENTAL_RATING_MIN_15YEARS		= 0x0d, +	DVB_PARENTAL_RATING_MIN_16YEARS		= 0x0e, +	DVB_PARENTAL_RATING_MIN_17YEARS		= 0x0f, +}; + +/** + * dvb_parental_rating_descriptor structure. + */ +struct dvb_parental_rating_descriptor { +	struct descriptor d; + +	/* struct dvb_parental_rating ratings[] */ +} __ucsi_packed; + +/** + * An entry in the ratings field of a dvb_parental_rating_descriptor. + */ +struct dvb_parental_rating { +	iso639country_t country_code; +	uint8_t rating; +} __ucsi_packed; + +/** + * Process a dvb_parental_rating_descriptor. + * + * @param d Generic descriptor structure pointer. + * @return dvb_parental_rating_descriptor pointer, or NULL on error. + */ +static inline struct dvb_parental_rating_descriptor* +	dvb_parental_rating_descriptor_codec(struct descriptor* d) +{ +	if (d->len % sizeof(struct dvb_parental_rating)) +		return NULL; + +	return (struct dvb_parental_rating_descriptor*) d; +} + +/** + * Iterator for entries in the ratings field of a dvb_parental_rating_descriptor. + * + * @param d dvb_parental_rating_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_parental_rating. + */ +#define dvb_parental_rating_descriptor_ratings_for_each(d, pos) \ +	for ((pos) = dvb_parental_rating_descriptor_ratings_first(d); \ +	     (pos); \ +	     (pos) = dvb_parental_rating_descriptor_ratings_next(d, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_parental_rating* +	dvb_parental_rating_descriptor_ratings_first(struct dvb_parental_rating_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_parental_rating *) +		((uint8_t*) d + sizeof(struct dvb_parental_rating_descriptor)); +} + +static inline struct dvb_parental_rating* +	dvb_parental_rating_descriptor_ratings_next(struct dvb_parental_rating_descriptor *d, +						    struct dvb_parental_rating *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_parental_rating); + +	if (next >= end) +		return NULL; + +	return (struct dvb_parental_rating *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/partial_transport_stream_descriptor.h b/lib/libucsi/dvb/partial_transport_stream_descriptor.h new file mode 100644 index 0000000..6e3aa96 --- /dev/null +++ b/lib/libucsi/dvb/partial_transport_stream_descriptor.h @@ -0,0 +1,68 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_PARTIAL_TRANSPORT_STREAM_DESCRIPTOR +#define _UCSI_DVB_PARTIAL_TRANSPORT_STREAM_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_partial_transport_stream_descriptor structure. + */ +struct dvb_partial_transport_stream_descriptor { +	struct descriptor d; + +  EBIT6(uint64_t reserved				: 2;  , +	uint64_t peak_rate				:22;  , +  	uint64_t reserved_2				: 2;  , +	uint64_t minimum_overall_smoothing_rate		:22;  , +  	uint64_t reserved_3				: 2;  , +	uint64_t maximum_overall_smoothing_rate		:14;  ); +} __ucsi_packed; + +/** + * Process a dvb_partial_transport_stream_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_partial_transport_stream_descriptor pointer, or NULL on error. + */ +static inline struct dvb_partial_transport_stream_descriptor* +	dvb_partial_transport_stream_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct dvb_partial_transport_stream_descriptor) - 2)) +		return NULL; + +	bswap64((uint8_t*) d + 2); + +	return (struct dvb_partial_transport_stream_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/pdc_descriptor.h b/lib/libucsi/dvb/pdc_descriptor.h new file mode 100644 index 0000000..68190be --- /dev/null +++ b/lib/libucsi/dvb/pdc_descriptor.h @@ -0,0 +1,64 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_PDC_DESCRIPTOR +#define _UCSI_DVB_PDC_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_pdc_descriptor structure. + */ +struct dvb_pdc_descriptor { +	struct descriptor d; + +  EBIT2(uint32_t reserved		: 4; , +	uint32_t programme_id_label	:20; ); +} __ucsi_packed; + +/** + * Process a dvb_pdc_descriptor. + * + * @param d Pointer to a generic descriptor structure. + * @return dvb_pdc_descriptor pointer, or NULL on error. + */ +static inline struct dvb_pdc_descriptor* +	dvb_pdc_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct dvb_pdc_descriptor) - 2)) +		return NULL; + +	bswap24((uint8_t*) d + 2); + +	return (struct dvb_pdc_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/private_data_specifier_descriptor.h b/lib/libucsi/dvb/private_data_specifier_descriptor.h new file mode 100644 index 0000000..f4cc03c --- /dev/null +++ b/lib/libucsi/dvb/private_data_specifier_descriptor.h @@ -0,0 +1,63 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_PRIVATE_DATA_SPECIFIER_DESCRIPTOR +#define _UCSI_DVB_PRIVATE_DATA_SPECIFIER_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_private_data_specifier_descriptor structure. + */ +struct dvb_private_data_specifier_descriptor { +	struct descriptor d; + +	uint32_t private_data_specifier; +} __ucsi_packed; + +/** + * Process a dvb_private_data_specifier_descriptor. + * + * @param d Generic descriptor structure. + * @return dvb_private_data_specifier_descriptor pointer, or NULL on error. + */ +static inline struct dvb_private_data_specifier_descriptor* +	dvb_private_data_specifier_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct dvb_private_data_specifier_descriptor) - 2)) +		return NULL; + +	bswap32((uint8_t*) d + 2); + +	return (struct dvb_private_data_specifier_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/related_content_descriptor.h b/lib/libucsi/dvb/related_content_descriptor.h new file mode 100644 index 0000000..fd6a358 --- /dev/null +++ b/lib/libucsi/dvb/related_content_descriptor.h @@ -0,0 +1,56 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_RELATED_CONTENT_DESCRIPTOR +#define _UCSI_DVB_RELATED_CONTENT_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_related_content_descriptor structure. + */ +struct dvb_related_content_descriptor { +	struct descriptor d; +} __ucsi_packed; + +/** + * Process a dvb_related_content_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_related_content_descriptor pointer, or NULL on error. + */ +static inline struct dvb_related_content_descriptor* +	dvb_related_content_descriptor_codec(struct descriptor* d) +{ +	return (struct dvb_related_content_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/rnt_rar_over_dvb_stream_descriptor.h b/lib/libucsi/dvb/rnt_rar_over_dvb_stream_descriptor.h new file mode 100644 index 0000000..ba42d12 --- /dev/null +++ b/lib/libucsi/dvb/rnt_rar_over_dvb_stream_descriptor.h @@ -0,0 +1,110 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_RNT_RAR_OVER_DVB_STREAM_DESCRIPTOR +#define _UCSI_DVB_RNT_RAR_OVER_DVB_STREAM_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_rnt_rar_over_dvb_stream_descriptor structure. + */ +struct dvb_rnt_rar_over_dvb_stream_descriptor { +	struct descriptor d; + +	dvbdate_t first_valid_date; +	dvbdate_t last_valid_date; +  EBIT3(uint8_t weighting		: 6; , +	uint8_t complete_flag		: 1; , +	uint8_t scheduled_flag		: 1; ); +	uint16_t transport_stream_id; +	uint16_t original_network_id; +	uint16_t service_id; +	uint8_t component_tag; +	/* struct dvb_rnt_rar_over_dvb_stream_descriptor_scheduled_info scheduled_info */ +} __ucsi_packed; + +/** + * The scheduled_info field of a dvb_rnt_rar_over_dvb_stream_descriptor (only appears + * if scheduled_flag = 1). + */ +struct dvb_rnt_rar_over_dvb_stream_descriptor_scheduled_info { +	dvbdate_t download_start_time; +	uint8_t download_period_duration; +	uint8_t download_cycle_time; +} __ucsi_packed; + +/** + * Process a dvb_rnt_rar_over_dvb_stream_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_rnt_rar_over_dvb_stream_descriptor pointer, or NULL on error. + */ +static inline struct dvb_rnt_rar_over_dvb_stream_descriptor* +	dvb_rnt_rar_over_dvb_stream_descriptor_codec(struct descriptor* d) +{ +	uint8_t *buf = (uint8_t*) d; +	uint32_t len = d->len + 2; +	struct dvb_rnt_rar_over_dvb_stream_descriptor *ret = +		(struct dvb_rnt_rar_over_dvb_stream_descriptor *) buf; + +	if (len < sizeof(struct dvb_rnt_rar_over_dvb_stream_descriptor)) +		return NULL; + +	bswap16(buf + 13); +	bswap16(buf + 15); +	bswap16(buf + 17); + +	if (ret->scheduled_flag == 1) { +		if (len < (sizeof(struct dvb_rnt_rar_over_dvb_stream_descriptor)+ +			   sizeof(struct dvb_rnt_rar_over_dvb_stream_descriptor_scheduled_info))) +			return NULL; +	} + +	return ret; +} + +/** + * Accessor for the scheduled_info field of a dvb_rnt_rar_over_dvb_stream_descriptor. + * + * @param d dvb_rnt_rar_over_dvb_stream_descriptor pointer. + * @return Pointer, or NULL on error. + */ +static inline struct dvb_rnt_rar_over_dvb_stream_descriptor_scheduled_info* +	dvb_rnt_rar_over_dvb_stream_descriptor_scheduled_info(struct dvb_rnt_rar_over_dvb_stream_descriptor *d) +{ +	if (d->scheduled_flag != 1) +		return NULL; +	return (struct dvb_rnt_rar_over_dvb_stream_descriptor_scheduled_info*) +			((uint8_t*) d + sizeof(struct dvb_rnt_rar_over_dvb_stream_descriptor)); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/rnt_rar_over_ip_descriptor.h b/lib/libucsi/dvb/rnt_rar_over_ip_descriptor.h new file mode 100644 index 0000000..b1f2da4 --- /dev/null +++ b/lib/libucsi/dvb/rnt_rar_over_ip_descriptor.h @@ -0,0 +1,87 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_RNT_RAR_OVER_IP_DESCRIPTOR +#define _UCSI_DVB_RNT_RAR_OVER_IP_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_rnt_rar_over_ip_descriptor structure. + */ +struct dvb_rnt_rar_over_ip_descriptor { +	struct descriptor d; + +	dvbdate_t first_valid_date; +	dvbdate_t last_valid_date; +  EBIT3(uint8_t weighting		: 6; , +	uint8_t complete_flag		: 1; , +	uint8_t reserved		: 1; ); +	uint8_t url_length; +	/* uint8_t url[] */ +} __ucsi_packed; + +/** + * Process a dvb_rnt_rar_over_ip_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_rnt_rar_over_ip_descriptor pointer, or NULL on error. + */ +static inline struct dvb_rnt_rar_over_ip_descriptor* +	dvb_rnt_rar_over_ip_descriptor_codec(struct descriptor* d) +{ +	uint8_t *buf = (uint8_t*) d; +	uint32_t len = d->len + 2; +	struct dvb_rnt_rar_over_ip_descriptor *ret = +		(struct dvb_rnt_rar_over_ip_descriptor *) buf; + +	if (len < sizeof(struct dvb_rnt_rar_over_ip_descriptor)) +		return NULL; +	if (len < (sizeof(struct dvb_rnt_rar_over_ip_descriptor) + buf[13])) +		return NULL; + +	return ret; +} + +/** + * Accessor for the url field of a dvb_rnt_rar_over_ip_descriptor. + * + * @param d dvb_rnt_rar_over_ip_descriptor pointer. + * @return Pointer. + */ +static inline uint8_t* +	dvb_rnt_rar_over_ip_descriptor_url(struct dvb_rnt_rar_over_ip_descriptor *d) +{ +	return (uint8_t*) +		((uint8_t*) d + sizeof(struct dvb_rnt_rar_over_ip_descriptor)); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/rnt_rnt_scan_descriptor.h b/lib/libucsi/dvb/rnt_rnt_scan_descriptor.h new file mode 100644 index 0000000..cb74f75 --- /dev/null +++ b/lib/libucsi/dvb/rnt_rnt_scan_descriptor.h @@ -0,0 +1,125 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_RNT_RNT_SCAN_DESCRIPTOR +#define _UCSI_DVB_RNT_RNT_SCAN_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + +/** + * dvb_rnt_rnt_scan_descriptor structure. + */ +struct dvb_rnt_rnt_scan_descriptor { +	struct descriptor d; + +	/* struct dvb_rnt_rnt_scan_entry entries[] */ +} __ucsi_packed; + +/** + * An entry in the entries field of a dvb_rnt_rnt_scan_descriptor. + */ +struct dvb_rnt_rnt_scan_entry { +	uint16_t transport_stream_id; +	uint16_t original_network_id; +	uint8_t scan_weighting; +} __ucsi_packed; + +/** + * Process a dvb_rnt_rnt_scan_descriptor. + * + * @param d Generic descriptor. + * @return dvb_rnt_rnt_scan_descriptor pointer, or NULL on error. + */ +static inline struct dvb_rnt_rnt_scan_descriptor* +	dvb_rnt_rnt_scan_descriptor_codec(struct descriptor* d) +{ +	uint8_t *buf = (uint8_t*) d; +	uint32_t len = d->len +2; +	uint32_t pos = 2; + +	if ((len-2) % sizeof(struct dvb_rnt_rnt_scan_entry)) +		return NULL; + +	while(pos < len) { +		bswap16(buf+pos); +		bswap16(buf+pos+2); +		pos += sizeof(struct dvb_rnt_rnt_scan_entry); +	} + +	return (struct dvb_rnt_rnt_scan_descriptor*) d; +} + +/** + * Iterator for entries field of a dvb_rnt_rnt_scan_descriptor. + * + * @param d dvb_rnt_rnt_scan_descriptor pointer. + * @param pos Variable holding a pointer to the current dvb_rnt_rnt_scan_entry. + */ +#define dvb_rnt_rnt_scan_descriptor_entries_for_each(d, pos) \ +	for ((pos) = dvb_rnt_rnt_scan_descriptor_entries_first(d); \ +	     (pos); \ +	     (pos) = dvb_rnt_rnt_scan_descriptor_entries_next(d, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_rnt_rnt_scan_entry* +	dvb_rnt_rnt_scan_descriptor_entries_first(struct dvb_rnt_rnt_scan_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_rnt_rnt_scan_entry *) +		((uint8_t*) d + sizeof(struct dvb_rnt_rnt_scan_descriptor)); +} + +static inline struct dvb_rnt_rnt_scan_entry* +	dvb_rnt_rnt_scan_descriptor_entries_next(struct dvb_rnt_rnt_scan_descriptor *d, +					     struct dvb_rnt_rnt_scan_entry *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_rnt_rnt_scan_entry); + +	if (next >= end) +		return NULL; + +	return (struct dvb_rnt_rnt_scan_entry *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/rst_section.c b/lib/libucsi/dvb/rst_section.c new file mode 100644 index 0000000..259d2b0 --- /dev/null +++ b/lib/libucsi/dvb/rst_section.c @@ -0,0 +1,47 @@ +/* + * 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/dvb/rst_section.h> + +struct dvb_rst_section * dvb_rst_section_codec(struct section *section) +{ +	uint8_t * buf = (uint8_t *) section; +	size_t pos = sizeof(struct section); +	size_t len = section_length(section); +	struct dvb_rst_section * ret = (struct dvb_rst_section *) section; + +	while (pos < len) { +		if ((pos + sizeof(struct dvb_rst_status)) > len) +			return NULL; + +		bswap16(buf + pos); +		bswap16(buf + pos + 2); +		bswap16(buf + pos + 4); +		bswap16(buf + pos + 6); + +		pos += sizeof(struct dvb_rst_status); +	} + +	if (pos != len) +		return NULL; + +	return ret; +} diff --git a/lib/libucsi/dvb/rst_section.h b/lib/libucsi/dvb/rst_section.h new file mode 100644 index 0000000..4b3360b --- /dev/null +++ b/lib/libucsi/dvb/rst_section.h @@ -0,0 +1,110 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_RST_SECTION_H +#define _UCSI_DVB_RST_SECTION_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/section.h> + +/** + * dvb_rst_section structure. + */ +struct dvb_rst_section { +	struct section head; + +	/* struct dvb_rst_status statuses[] */ +}; + +/** + * An entry in the statuses field of a dvb_rst_section structure. + */ +struct dvb_rst_status { +	uint16_t transport_stream_id; +	uint16_t original_network_id; +	uint16_t service_id; +	uint16_t event_id; +  EBIT2(uint8_t reserved	: 5;  , +	uint8_t running_status	: 3;  ); +}; + +/** + * Process a dvb_rst_section. + * + * @param section Pointer to a generic section strcuture. + * @return dvb_rst_section pointer, or NULL on error. + */ +struct dvb_rst_section *dvb_rst_section_codec(struct section *section); + +/** + * Iterator for entries in the statuses field of a dvb_rst_section. + * + * @param rst dvb_rst_section pointer. + * @param pos Variable containing a pointer to the current dvb_rst_status. + */ +#define dvb_rst_section_statuses_for_each(rst, pos) \ +	for ((pos) = dvb_rst_section_statuses_first(rst); \ +	     (pos); \ +	     (pos) = dvb_rst_section_statuses_next(rst, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_rst_status * +	dvb_rst_section_statuses_first(struct dvb_rst_section *rst) +{ +	size_t pos = sizeof(struct dvb_rst_section); + +	if (pos >= section_length(&rst->head)) +		return NULL; + +	return (struct dvb_rst_status*) ((uint8_t *) rst + pos); +} + +static inline struct dvb_rst_status * +	dvb_rst_section_statuses_next(struct dvb_rst_section * rst, +				      struct dvb_rst_status * pos) +{ +	uint8_t *end = (uint8_t*) rst + section_length(&rst->head); +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_rst_status); + +	if (next >= end) +		return NULL; + +	return (struct dvb_rst_status *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/s2_satellite_delivery_descriptor.h b/lib/libucsi/dvb/s2_satellite_delivery_descriptor.h new file mode 100644 index 0000000..8f9fea8 --- /dev/null +++ b/lib/libucsi/dvb/s2_satellite_delivery_descriptor.h @@ -0,0 +1,116 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_S2_SATELLITE_DELIVERY_DESCRIPTOR +#define _UCSI_DVB_S2_SATELLITE_DELIVERY_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_s2_satellite_delivery_descriptor structure. + */ +struct dvb_s2_satellite_delivery_descriptor { +	struct descriptor d; + +  EBIT4(uint8_t scrambling_sequence_selector	: 1; , +	uint8_t multiple_input_stream		: 1; , +	uint8_t backwards_compatability		: 1; , +	uint8_t reserved			: 5; ); +	/* uint32_t scrambling_sequence_index if scrambling_sequence_selector = 1 */ +	/* uint8_t input_stream_id if multiple_input_stream = 1 */ +} __ucsi_packed; + +/** + * Process a dvb_s2_satellite_delivery_descriptor. + * + * @param d Pointer to a generic descriptor structure. + * @return dvb_s2_satellite_delivery_descriptor pointer, or NULL on error. + */ +static inline struct dvb_s2_satellite_delivery_descriptor* +	dvb_s2_satellite_delivery_descriptor_codec(struct descriptor* d) +{ +	struct dvb_s2_satellite_delivery_descriptor *s2 = +			(struct dvb_s2_satellite_delivery_descriptor*) d; + +	if (d->len < (sizeof(struct dvb_s2_satellite_delivery_descriptor) - 2)) +		return NULL; + +	int len = sizeof(struct dvb_s2_satellite_delivery_descriptor); +	if (s2->scrambling_sequence_selector) { +		len += 3; +	} +	if (s2->multiple_input_stream) { +		len += 1; +	} + +	if (d->len < len) +		return NULL; + +	return s2; +} + +/** + * Accessor for the scrambling_sequence_index field of a dvb_s2_satellite_delivery_descriptor. + * + * @param s2 dvb_s2_satellite_delivery_descriptor pointer. + * @return The scrambling_sequence_index. + */ +static inline uint32_t dvb_s2_satellite_delivery_descriptor_scrambling_sequence_index(struct dvb_s2_satellite_delivery_descriptor *s2) +{ +	uint8_t *tmp = (uint8_t*) s2; + +	if (s2->scrambling_sequence_selector) { +		return ((tmp[4] & 0x03) << 16) | (tmp[5] << 8) | tmp[6]; +	} +	return 0; +} + +/** + * Accessor for the input_stream_id field of a dvb_s2_satellite_delivery_descriptor. + * + * @param s2 dvb_s2_satellite_delivery_descriptor pointer. + * @return The input_stream_id. + */ +static inline uint8_t dvb_s2_satellite_delivery_descriptor_input_stream_id(struct dvb_s2_satellite_delivery_descriptor *s2) +{ +	uint8_t *tmp = (uint8_t*) s2; + +	if (!s2->multiple_input_stream) +		return 0; + +	int off = 3; +	if (s2->scrambling_sequence_selector) { +		off += 3; +	} +	return tmp[off]; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/satellite_delivery_descriptor.h b/lib/libucsi/dvb/satellite_delivery_descriptor.h new file mode 100644 index 0000000..b93d052 --- /dev/null +++ b/lib/libucsi/dvb/satellite_delivery_descriptor.h @@ -0,0 +1,73 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_SATELLITE_DELIVERY_DESCRIPTOR +#define _UCSI_DVB_SATELLITE_DELIVERY_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_satellite_delivery_descriptor structure. + */ +struct dvb_satellite_delivery_descriptor { +	struct descriptor d; + +	uint32_t frequency;			// BCD, units 10kHz +	uint16_t orbital_position; +  EBIT5(uint8_t west_east_flag		: 1; , +	uint8_t polarization  	  	: 2; , +	uint8_t roll_off	  	: 2; , +	uint8_t modulation_system 	: 1; , +	uint8_t modulation_type 	: 2; ); +  EBIT2(uint32_t symbol_rate		: 28; , // BCD, units 100Hz +	uint32_t fec_inner		: 4;  ); +} __ucsi_packed; + +/** + * Process a dvb_satellite_delivery_descriptor. + * + * @param d Pointer to a generic descriptor structure. + * @return dvb_satellite_delivery_descriptor pointer, or NULL on error. + */ +static inline struct dvb_satellite_delivery_descriptor* +	dvb_satellite_delivery_descriptor_codec(struct descriptor* d) +{ +	if (d->len < (sizeof(struct dvb_satellite_delivery_descriptor) - 2)) +		return NULL; + +	bswap32((uint8_t*) d + 2); +	bswap16((uint8_t*) d + 6); +	bswap32((uint8_t*) d + 9); + +	return (struct dvb_satellite_delivery_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/scrambling_descriptor.h b/lib/libucsi/dvb/scrambling_descriptor.h new file mode 100644 index 0000000..4669bc8 --- /dev/null +++ b/lib/libucsi/dvb/scrambling_descriptor.h @@ -0,0 +1,61 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_SCRAMBLING_DESCRIPTOR +#define _UCSI_DVB_SCRAMBLING_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_scrambling_descriptor structure. + */ +struct dvb_scrambling_descriptor { +	struct descriptor d; + +	uint8_t scrambling_mode; +} __ucsi_packed; + +/** + * Process a dvb_scrambling_descriptor. + * + * @param d Generic descriptor structure. + * @return Pointer to dvb_scrambling_descriptor, or NULL on error. + */ +static inline struct dvb_scrambling_descriptor* +	dvb_scrambling_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct dvb_scrambling_descriptor) - 2)) +		return NULL; + +	return (struct dvb_scrambling_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/sdt_section.c b/lib/libucsi/dvb/sdt_section.c new file mode 100644 index 0000000..4c7824c --- /dev/null +++ b/lib/libucsi/dvb/sdt_section.c @@ -0,0 +1,60 @@ +/* + * 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/dvb/sdt_section.h> + +struct dvb_sdt_section * dvb_sdt_section_codec(struct section_ext * ext) +{ +	uint8_t * buf = (uint8_t *) ext; +	size_t pos = sizeof(struct section_ext); +	size_t len = section_ext_length(ext); + +	if (len < sizeof(struct dvb_sdt_section)) +		return NULL; + +	bswap16(buf + pos); +	pos += 3; + +	while (pos < len) { +		struct dvb_sdt_service * service = +			(struct dvb_sdt_service *)(buf + pos); + +		if ((pos + sizeof(struct dvb_sdt_service)) > len) +			return NULL; + +		bswap16(buf + pos); +		bswap16(buf + pos + 3); +		pos += sizeof(struct dvb_sdt_service); + +		if ((pos + service->descriptors_loop_length) > len) +			return NULL; + +		if (verify_descriptors(buf + pos, service->descriptors_loop_length)) +			return NULL; + +		pos += service->descriptors_loop_length; +	} + +	if (pos != len) +		return NULL; + +	return (struct dvb_sdt_section *) ext; +} diff --git a/lib/libucsi/dvb/sdt_section.h b/lib/libucsi/dvb/sdt_section.h new file mode 100644 index 0000000..03a8569 --- /dev/null +++ b/lib/libucsi/dvb/sdt_section.h @@ -0,0 +1,157 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_SDT_SECTION_H +#define _UCSI_DVB_SDT_SECTION_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/section.h> + +/** + * dvb_sdt_section structure. + */ +struct dvb_sdt_section { +	struct section_ext head; + +	uint16_t original_network_id; +	uint8_t reserved; +	/* struct dvb_sdt_service services[] */ +} __ucsi_packed; + +/** + * An entry in the services field of a dvb_sdt_section. + */ +struct dvb_sdt_service { +	uint16_t service_id; +  EBIT3(uint8_t	reserved			: 6; , +	uint8_t eit_schedule_flag		: 1; , +	uint8_t eit_present_following_flag	: 1; ); +  EBIT3(uint16_t running_status			: 3; , +	uint16_t free_ca_mode			: 1; , +	uint16_t descriptors_loop_length	:12; ); +	/* struct descriptor descriptors[] */ +} __ucsi_packed; + +/** + * Process a dvb_sdt_section. + * + * @param section Pointer to a generic section_ext structure. + * @return dvb_sdt_section pointer, or NULL on error. + */ +struct dvb_sdt_section * dvb_sdt_section_codec(struct section_ext *section); + +/** + * Accessor for the transport_stream_id field of an SDT. + * + * @param sdt SDT pointer. + * @return The transport_stream_id. + */ +static inline uint16_t dvb_sdt_section_transport_stream_id(struct dvb_sdt_section *sdt) +{ +	return sdt->head.table_id_ext; +} + +/** + * Iterator for the services field in a dvb_sdt_section. + * + * @param sdt dvb_sdt_section pointer. + * @param pos Variable containing a pointer to the current dvb_sdt_service. + */ +#define dvb_sdt_section_services_for_each(sdt, pos) \ +	for ((pos) = dvb_sdt_section_services_first(sdt); \ +	     (pos); \ +	     (pos) = dvb_sdt_section_services_next(sdt, pos)) + +/** + * Iterator for the descriptors field in a dvb_sdt_service. + * + * @param service dvb_sdt_service pointer. + * @param pos Variable containing a pointer to the current descriptor. + */ +#define dvb_sdt_service_descriptors_for_each(service, pos) \ +	for ((pos) = dvb_sdt_service_descriptors_first(service); \ +	     (pos); \ +	     (pos) = dvb_sdt_service_descriptors_next(service, pos)) + + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_sdt_service * +	dvb_sdt_section_services_first(struct dvb_sdt_section * sdt) +{ +	size_t pos = sizeof(struct dvb_sdt_section); + +	if (pos >= section_ext_length(&sdt->head)) +		return NULL; + +	return (struct dvb_sdt_service*) ((uint8_t *) sdt + pos); +} + +static inline struct dvb_sdt_service * +	dvb_sdt_section_services_next(struct dvb_sdt_section * sdt, +				      struct dvb_sdt_service * pos) +{ +	uint8_t *end = (uint8_t*) sdt + section_ext_length(&sdt->head); +	uint8_t *next = (uint8_t*) pos + sizeof(struct dvb_sdt_service) + +			pos->descriptors_loop_length; + +	if (next >= end) +		return NULL; + +	return (struct dvb_sdt_service *) next; +} + +static inline struct descriptor * +	dvb_sdt_service_descriptors_first(struct dvb_sdt_service *svc) +{ +	if (svc->descriptors_loop_length == 0) +		return NULL; + +	return (struct descriptor *) +		((uint8_t*) svc + sizeof(struct dvb_sdt_service)); +} + +static inline struct descriptor * +	dvb_sdt_service_descriptors_next(struct dvb_sdt_service *svc, +					 struct descriptor* pos) +{ +	return next_descriptor((uint8_t*) svc + sizeof(struct dvb_sdt_service), +			       svc->descriptors_loop_length, +			       pos); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/section.h b/lib/libucsi/dvb/section.h new file mode 100644 index 0000000..8488d71 --- /dev/null +++ b/lib/libucsi/dvb/section.h @@ -0,0 +1,107 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_SECTION_H +#define _UCSI_DVB_SECTION_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/dvb/bat_section.h> +#include <libucsi/dvb/dit_section.h> +#include <libucsi/dvb/eit_section.h> +#include <libucsi/dvb/nit_section.h> +#include <libucsi/dvb/rst_section.h> +#include <libucsi/dvb/sdt_section.h> +#include <libucsi/dvb/sit_section.h> +#include <libucsi/dvb/st_section.h> +#include <libucsi/dvb/tdt_section.h> +#include <libucsi/dvb/tot_section.h> +#include <libucsi/dvb/tva_container_section.h> +#include <libucsi/dvb/int_section.h> + +/** + * The following are not implemented just now. + */ +/* +#include <libucsi/dvb/tva_related_content_section.h> +#include <libucsi/dvb/tva_content_identifier_section.h> +#include <libucsi/dvb/tva_resolution_provider_notification_section.h> +#include <libucsi/dvb/ait_section.h> +#include <libucsi/dvb/cit_section.h> +#include <libucsi/dvb/rct_section.h> +#include <libucsi/dvb/rnt_section.h> +*/ + +#define TRANSPORT_NIT_PID 0x10 +#define TRANSPORT_SDT_PID 0x11 +#define TRANSPORT_BAT_PID 0x11 +#define TRANSPORT_EIT_PID 0x12 +#define TRANSPORT_CIT_PID 0x12 +#define TRANSPORT_RST_PID 0x13 +#define TRANSPORT_TDT_PID 0x14 +#define TRANSPORT_TOT_PID 0x14 +#define TRANSPORT_RNT_PID 0x16 +#define TRANSPORT_DIT_PID 0x1e +#define TRANSPORT_SIT_PID 0x1f + +/** + * Enumeration of DVB section tags. + */ +enum dvb_section_tag { +	stag_dvb_network_information_actual			= 0x40, +	stag_dvb_network_information_other			= 0x41, + +	stag_dvb_service_description_actual			= 0x42, +	stag_dvb_service_description_other			= 0x46, + +	stag_dvb_bouquet_association				= 0x4a, +	stag_dvb_update_notification				= 0x4b, /* same syntax as IP_MAC */ +	stag_dvb_ip_mac_notification				= 0x4c, + +	stag_dvb_event_information_nownext_actual		= 0x4e, +	stag_dvb_event_information_nownext_other		= 0x4f, +	stag_dvb_event_information_schedule_actual		= 0x50, /* 0x50->0x5f */ +	stag_dvb_event_information_schedule_other		= 0x60, /* 0x60->0x6f */ + +	stag_dvb_time_date					= 0x70, +	stag_dvb_running_status					= 0x71, +	stag_dvb_stuffing					= 0x72, +	stag_dvb_time_offset					= 0x73, +	stag_dvb_application_information			= 0x74, +	stag_dvb_tva_container					= 0x75, +	stag_dvb_tva_related_content				= 0x76, +	stag_dvb_tva_content_identifier				= 0x77, +	stag_dvb_mpe_fec					= 0x78, +	stag_dvb_tva_resolution_provider_notification		= 0x79, + +	stag_dvb_discontinuity_information			= 0x7e, +	stag_dvb_selection_information				= 0x7f, + +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/service_availability_descriptor.h b/lib/libucsi/dvb/service_availability_descriptor.h new file mode 100644 index 0000000..64def75 --- /dev/null +++ b/lib/libucsi/dvb/service_availability_descriptor.h @@ -0,0 +1,98 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_SERVICE_AVAILABILITY_DESCRIPTOR +#define _UCSI_DVB_SERVICE_AVAILABILITY_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_service_availability_descriptor structure. + */ +struct dvb_service_availability_descriptor { +	struct descriptor d; + +  EBIT2(uint8_t availability_flag	: 1; , +	uint8_t reserved		: 7; ); +	/* uint16_t cell_ids[] */ +} __ucsi_packed; + +/** + * Process a dvb_service_availability_descriptor. + * + * @param d Pointer to a generic descriptor structure. + * @return dvb_service_availability_descriptor pointer, or NULL on error. + */ +static inline struct dvb_service_availability_descriptor* +	dvb_service_availability_descriptor_codec(struct descriptor* d) +{ +	uint32_t pos = 0; +	uint8_t* buf = (uint8_t*) d + 2; +	uint32_t len = d->len; + +	pos += sizeof(struct dvb_service_availability_descriptor) - 2; + +	if ((len - pos) % 2) +		return NULL; + +	while(pos < len) { +		bswap16(buf+pos); +		pos += 2; +	} + +	return (struct dvb_service_availability_descriptor*) d; +} + +/** + * Accessor for the cell_ids field of a dvb_service_availability_descriptor. + * + * @param d dvb_service_availability_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint16_t * +	dvb_service_availability_descriptor_cell_ids(struct dvb_service_availability_descriptor *d) +{ +	return (uint16_t *) ((uint8_t *) d + sizeof(struct dvb_service_availability_descriptor)); +} + +/** + * Determine the number of entries in the cell_ids field of a dvb_service_availability_descriptor. + * + * @param d dvb_service_availability_descriptor pointer. + * @return The number of entries. + */ +static inline int +	dvb_service_availability_descriptor_cell_ids_count(struct dvb_service_availability_descriptor *d) +{ +	return (d->d.len - 1) >> 1; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/service_descriptor.h b/lib/libucsi/dvb/service_descriptor.h new file mode 100644 index 0000000..dd0f0ec --- /dev/null +++ b/lib/libucsi/dvb/service_descriptor.h @@ -0,0 +1,163 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_SERVICE_DESCRIPTOR +#define _UCSI_DVB_SERVICE_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * Possible values for service_type. + */ +enum { +	DVB_SERVICE_TYPE_DIGITAL_TV		= 0x01, +	DVB_SERVICE_TYPE_DIGITAL_RADIO		= 0x02, +	DVB_SERVICE_TYPE_TELETEXT		= 0x03, +	DVB_SERVICE_TYPE_NVOD_REF		= 0x04, +	DVB_SERVICE_TYPE_NVOD_TIMESHIFT		= 0x05, +	DVB_SERVICE_TYPE_MOSAIC			= 0x06, +	DVB_SERVICE_TYPE_PAL			= 0x07, +	DVB_SERVICE_TYPE_SECAM			= 0x08, +	DVB_SERVICE_TYPE_D_D2_MAC		= 0x09, +	DVB_SERVICE_TYPE_FM_RADIO		= 0x0a, +	DVB_SERVICE_TYPE_NTSC			= 0x0b, +	DVB_SERVICE_TYPE_DATA_BCAST		= 0x0c, +	DVB_SERVICE_TYPE_EN50221		= 0x0d, +	DVB_SERVICE_TYPE_RCS_MAP		= 0x0e, +	DVB_SERVICE_TYPE_RCS_FLS		= 0x0f, +	DVB_SERVICE_TYPE_MHP			= 0x10, +	DVB_SERVICE_TYPE_MPEG2_HD_DIGITAL_TV	= 0x11, +	DVB_SERVICE_TYPE_ADVANCED_CODEC_SD_DIGITAL_TV = 0x16, +	DVB_SERVICE_TYPE_ADVANCED_CODEC_SD_NVOD_TIMESHIFT = 0x17, +	DVB_SERVICE_TYPE_ADVANCED_CODEC_SD_NVOD_REF = 0x18, +	DVB_SERVICE_TYPE_ADVANCED_CODEC_HD_DIGITAL_TV = 0x19, +	DVB_SERVICE_TYPE_ADVANCED_CODEC_HD_NVOD_TIMESHIFT = 0x1a, +	DVB_SERVICE_TYPE_ADVANCED_CODEC_HD_NVOD_REF = 0x1b, +}; + +/** + * dvb_service_descriptor structure. + */ +struct dvb_service_descriptor { +	struct descriptor d; + +	uint8_t service_type; +	uint8_t service_provider_name_length; +	/* uint8_t service_provider_name[] */ +	/* struct dvb_service_descriptor_part2 part2 */ +} __ucsi_packed; + +/** + * Second part of a dvb_service_descriptor following the variable length + * service_provider_name field. + */ +struct dvb_service_descriptor_part2 { +	uint8_t service_name_length; +	/* uint8_t service_name[] */ +} __ucsi_packed; + +/** + * Process a dvb_service_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_service_descriptor pointer, or NULL on error. + */ +static inline struct dvb_service_descriptor* +	dvb_service_descriptor_codec(struct descriptor* d) +{ +	struct dvb_service_descriptor *p = +		(struct dvb_service_descriptor *) d; +	struct dvb_service_descriptor_part2 *p2; +	uint32_t pos = sizeof(struct dvb_service_descriptor) - 2; +	uint32_t len = d->len; + +	if (pos > len) +		return NULL; + +	pos += p->service_provider_name_length; + +	if (pos > len) +		return NULL; + +	p2 = (struct dvb_service_descriptor_part2*) ((uint8_t*) d + 2 + pos); + +	pos += sizeof(struct dvb_service_descriptor_part2); + +	if (pos > len) +		return NULL; + +	pos += p2->service_name_length; + +	if (pos != len) +		return NULL; + +	return p; +} + +/** + * Accessor for the service_provider_name field of a dvb_service_descriptor. + * + * @param d dvb_service_descriptor pointer. + * @return Pointer to the service_provider_name field. + */ +static inline uint8_t * +	dvb_service_descriptor_service_provider_name(struct dvb_service_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_service_descriptor); +} + +/** + * Accessor for the second part of a dvb_service_descriptor. + * + * @param d dvb_service_descriptor pointer. + * @return dvb_service_descriptor_part2 pointer. + */ +static inline struct dvb_service_descriptor_part2 * +	dvb_service_descriptor_part2(struct dvb_service_descriptor *d) +{ +	return (struct dvb_service_descriptor_part2 *) +		((uint8_t*) d + sizeof(struct dvb_service_descriptor) + +		 d->service_provider_name_length); +} + +/** + * Accessor for the service_name field of a dvb_service_descriptor_part2. + * + * @param d dvb_service_descriptor_part2 pointer. + * @return Pointer to the service_name field. + */ +static inline uint8_t * +	dvb_service_descriptor_service_name(struct dvb_service_descriptor_part2 *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_service_descriptor_part2); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/service_identifier_descriptor.h b/lib/libucsi/dvb/service_identifier_descriptor.h new file mode 100644 index 0000000..2037a05 --- /dev/null +++ b/lib/libucsi/dvb/service_identifier_descriptor.h @@ -0,0 +1,82 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_SERVICE_IDENTIFIER_DESCRIPTOR +#define _UCSI_DVB_SERVICE_IDENTIFIER_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_service_identifier_descriptor. + */ +struct dvb_service_identifier_descriptor { +	struct descriptor d; + +	/* uint8_t identifier[] */ +} __ucsi_packed; + +/** + * Process a dvb_service_identifier_descriptor. + * + * @param d Generic descriptor structure. + * @return dvb_service_identifier_descriptor pointer, or NULL on error. + */ +static inline struct dvb_service_identifier_descriptor* +	dvb_service_identifier_descriptor_codec(struct descriptor* d) +{ +	return (struct dvb_service_identifier_descriptor*) d; +} + +/** + * Retrieve a pointer to the identifier field of a dvb_service_identifier_descriptor. + * + * @param d dvb_service_identifier_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +	dvb_service_identifier_descriptor_identifier(struct dvb_service_identifier_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_service_identifier_descriptor); +} + +/** + * Calculate length of the identifier field of a dvb_service_identifier_descriptor. + * + * @param d dvb_service_identifier_descriptor pointer. + * @return The length in bytes. + */ +static inline int +	dvb_service_identifier_descriptor_identifier_length(struct dvb_service_identifier_descriptor *d) +{ +	return d->d.len; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/service_list_descriptor.h b/lib/libucsi/dvb/service_list_descriptor.h new file mode 100644 index 0000000..0086b25 --- /dev/null +++ b/lib/libucsi/dvb/service_list_descriptor.h @@ -0,0 +1,122 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_SERVICE_LIST_DESCRIPTOR +#define _UCSI_DVB_SERVICE_LIST_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_service_list_descriptor structure. + */ +struct dvb_service_list_descriptor { +	struct descriptor d; + +	/* struct dvb_service_list_service services[] */ +} __ucsi_packed; + +/** + * An entry in the services field of a dvb_service_list_descriptor. + */ +struct dvb_service_list_service { +	uint16_t service_id; +	uint8_t service_type; +} __ucsi_packed; + +/** + * Process a dvb_service_list_descriptor. + * + * @param d Generic descriptor structure. + * @return dvb_service_list_descriptor pointer, or NULL on error. + */ +static inline struct dvb_service_list_descriptor* +	dvb_service_list_descriptor_codec(struct descriptor* d) +{ +	uint32_t pos = 0; +	uint32_t len = d->len; +	uint8_t *p = (uint8_t*) d + 2; + +	if (len % sizeof(struct dvb_service_list_service)) +		return NULL; + +	while(pos < len) { +		bswap16(p+pos); +		pos += sizeof(struct dvb_service_list_service); +	} + +	return (struct dvb_service_list_descriptor*) d; +} + +/** + * Iterator for services field in a dvb_service_list_descriptor. + * + * @param d dvb_service_list_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_service_list_service. + */ +#define dvb_service_list_descriptor_services_for_each(d, pos) \ +	for ((pos) = dvb_service_list_descriptor_services_first(d); \ +	     (pos); \ +	     (pos) = dvb_service_list_descriptor_services_next(d, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_service_list_service* +	dvb_service_list_descriptor_services_first(struct dvb_service_list_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_service_list_service *) +		((uint8_t*) d + sizeof(struct dvb_service_list_descriptor)); +} + +static inline struct dvb_service_list_service* +	dvb_service_list_descriptor_services_next(struct dvb_service_list_descriptor *d, +						  struct dvb_service_list_service *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_service_list_service); + +	if (next >= end) +		return NULL; + +	return (struct dvb_service_list_service *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/service_move_descriptor.h b/lib/libucsi/dvb/service_move_descriptor.h new file mode 100644 index 0000000..7685e65 --- /dev/null +++ b/lib/libucsi/dvb/service_move_descriptor.h @@ -0,0 +1,67 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_SERVICE_MOVE_DESCRIPTOR +#define _UCSI_DVB_SERVICE_MOVE_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_service_move_descriptor structure. + */ +struct dvb_service_move_descriptor { +	struct descriptor d; + +	uint16_t new_original_network_id; +	uint16_t new_transport_stream_id; +	uint16_t new_service_id; +} __ucsi_packed; + +/** + * Process a dvb_service_move_descriptor. + * + * @param d Generic descriptor structure. + * @return Pointer to dvb_service_move_descriptor, or NULL on error. + */ +static inline struct dvb_service_move_descriptor* +	dvb_service_move_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct dvb_service_move_descriptor) - 2)) +		return NULL; + +	bswap16((uint8_t*) d + 2); +	bswap16((uint8_t*) d + 4); +	bswap16((uint8_t*) d + 6); + +	return (struct dvb_service_move_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/short_event_descriptor.h b/lib/libucsi/dvb/short_event_descriptor.h new file mode 100644 index 0000000..449c6f0 --- /dev/null +++ b/lib/libucsi/dvb/short_event_descriptor.h @@ -0,0 +1,135 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_SHORT_EVENT_DESCRIPTOR +#define _UCSI_DVB_SHORT_EVENT_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + +/** + * dvb_short_event_descriptor structure. + */ +struct dvb_short_event_descriptor { +	struct descriptor d; + +	iso639lang_t language_code; +	uint8_t event_name_length; +	/* uint8_t event_name[] */ +	/* struct dvb_short_event_descriptor_part2 part2 */ +} __ucsi_packed; + +/** + * Second part of a dvb_short_event_descriptor, following the variable length + * name field. + */ +struct dvb_short_event_descriptor_part2 { +	uint8_t text_length; +	/* uint8_t text[] */ +} __ucsi_packed; + +/** + * Process a dvb_short_event_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_short_event_descriptor pointer, or NULL on error. + */ +static inline struct dvb_short_event_descriptor* +	dvb_short_event_descriptor_codec(struct descriptor* d) +{ +	struct dvb_short_event_descriptor *p = +		(struct dvb_short_event_descriptor*) d; +	struct dvb_short_event_descriptor_part2 *p2; +	uint32_t pos = sizeof(struct dvb_short_event_descriptor) - 2; +	uint32_t len = d->len; + +	if (pos > len) +		return NULL; + +	pos += p->event_name_length; + +	if (pos > len) +		return NULL; + +	p2 = (struct dvb_short_event_descriptor_part2*) ((uint8_t*) d + 2 + pos); + +	pos += sizeof(struct dvb_short_event_descriptor_part2); + +	if (pos > len) +		return NULL; + +	pos += p2->text_length; + +	if (pos != len) +		return NULL; + +	return p; +} + +/** + * Accessor for name field in a dvb_short_event_descriptor. + * + * @param d dvb_short_event_descriptor pointer. + * @return Pointer to name field. + */ +static inline uint8_t * +	dvb_short_event_descriptor_event_name(struct dvb_short_event_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_short_event_descriptor); +} + +/** + * Accessor for second part of a dvb_short_event_descriptor. + * + * @param d dvb_short_event_descriptor pointer. + * @return dvb_short_event_descriptor_part2 pointer. + */ +static inline struct dvb_short_event_descriptor_part2 * +	dvb_short_event_descriptor_part2(struct dvb_short_event_descriptor *d) +{ +	return (struct dvb_short_event_descriptor_part2 *) +		((uint8_t*) d + sizeof(struct dvb_short_event_descriptor) + +		 d->event_name_length); +} + +/** + * Accessor for text field in a dvb_short_event_descriptor_part2. + * + * @param d dvb_short_event_descriptor_part2 pointer. + * @return Pointer to text field. + */ +static inline uint8_t * +	dvb_short_event_descriptor_text(struct dvb_short_event_descriptor_part2 *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_short_event_descriptor_part2); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/short_smoothing_buffer_descriptor.h b/lib/libucsi/dvb/short_smoothing_buffer_descriptor.h new file mode 100644 index 0000000..e52d20a --- /dev/null +++ b/lib/libucsi/dvb/short_smoothing_buffer_descriptor.h @@ -0,0 +1,87 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_SHORT_SMOOTHING_BUFFER_DESCRIPTOR +#define _UCSI_DVB_SHORT_SMOOTHING_BUFFER_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_short_smoothing_buffer_descriptor structure. + */ +struct dvb_short_smoothing_buffer_descriptor { +	struct descriptor d; + +  EBIT2(uint8_t sb_size		: 2; , +	uint8_t sb_leak_rate	: 6; ); +	/* uint8_t reserved [] */ +} __ucsi_packed; + +/** + * Process a dvb_short_smoothing_buffer_descriptor. + * + * @param d Generic descriptor structure. + * @return dvb_short_smoothing_buffer_descriptor pointer, or NULL on error. + */ +static inline struct dvb_short_smoothing_buffer_descriptor* +	dvb_short_smoothing_buffer_descriptor_codec(struct descriptor* d) +{ +	if (d->len < (sizeof(struct dvb_short_smoothing_buffer_descriptor) - 2)) +		return NULL; + +	return (struct dvb_short_smoothing_buffer_descriptor*) d; +} + +/** + * Accessor for reserved field in a dvb_short_smoothing_buffer_descriptor. + * + * @param d dvb_short_smoothing_buffer_descriptor pointer. + * @return Pointer to reserved field. + */ +static inline uint8_t * +	dvb_short_smoothing_buffer_descriptor_reserved(struct dvb_short_smoothing_buffer_descriptor *d) +{ +	return (uint8_t*) d + sizeof(struct dvb_short_smoothing_buffer_descriptor); +} + +/** + * Calculate length of reserved field in a dvb_short_smoothing_buffer_descriptor. + * + * @param d dvb_short_smoothing_buffer_descriptor pointer. + * @return Length of the field in bytes. + */ +static inline int +	dvb_short_smoothing_buffer_descriptor_reserved_length(struct dvb_short_smoothing_buffer_descriptor *d) +{ +	return d->d.len - 1; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/sit_section.c b/lib/libucsi/dvb/sit_section.c new file mode 100644 index 0000000..06c228c --- /dev/null +++ b/lib/libucsi/dvb/sit_section.c @@ -0,0 +1,69 @@ +/* + * 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/dvb/sit_section.h> + +struct dvb_sit_section * dvb_sit_section_codec(struct section_ext * ext) +{ +	uint8_t * buf = (uint8_t *) ext; +	struct dvb_sit_section * ret = (struct dvb_sit_section *) ext; +	size_t pos = sizeof(struct section_ext); +	size_t len = section_ext_length(ext); + +	if (len < sizeof(struct dvb_sit_section)) +		return NULL; + +	bswap16(buf + pos); +	pos += 2; + +	if ((pos + ret->transmission_info_loop_length) > len) +		return NULL; + +	if (verify_descriptors(buf + pos, ret->transmission_info_loop_length)) +		return NULL; + +	pos += ret->transmission_info_loop_length; + +	while (pos < len) { +		struct dvb_sit_service * service = (void*)(buf + pos); + +		if ((pos + sizeof(struct dvb_sit_service)) > len) +			return NULL; + +		bswap16(buf + pos); +		bswap16(buf + pos + 2); +		bswap16(buf + pos + 4); +		pos += sizeof(struct dvb_sit_service); + +		if ((pos + service->service_loop_length) > len) +			return NULL; + +		if (verify_descriptors(buf + pos, service->service_loop_length)) +			return NULL; + +		pos += service->service_loop_length; +	} + +	if (pos != len) +		return NULL; + +	return ret; +} diff --git a/lib/libucsi/dvb/sit_section.h b/lib/libucsi/dvb/sit_section.h new file mode 100644 index 0000000..e06d596 --- /dev/null +++ b/lib/libucsi/dvb/sit_section.h @@ -0,0 +1,173 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_SIT_SECTION_H +#define _UCSI_DVB_SIT_SECTION_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/section.h> + +/** + * dvb_sit_section structure. + */ +struct dvb_sit_section { +	struct section_ext head; + +  EBIT2(uint16_t reserved			: 4; , +	uint16_t transmission_info_loop_length  :12; ); +	/* struct descriptor descriptors[] */ +	/* struct dvb_sit_service services[] */ +}; + +/** + * An entry in the services field of a dvb_sit_section. + */ +struct dvb_sit_service { +	uint16_t service_id; +  EBIT3(uint16_t reserved		: 1; , +	uint16_t running_status		: 3; , +	uint16_t service_loop_length    :12; ); +	/* struct descriptor descriptors[] */ +}; + +/** + * Process a dvb_sit_section. + * + * @param section Generic section_ext structure. + * @return dvb_sit_section pointer, or NULL on error. + */ +struct dvb_sit_section * dvb_sit_section_codec(struct section_ext *section); + +/** + * Iterator for descriptors field in a dvb_sit_section. + * + * @param sit dvb_sit_section Pointer. + * @param pos Variable holding pointer to current descriptor. + */ +#define dvb_sit_section_descriptors_for_each(sit, pos) \ +	for ((pos) = dvb_sit_section_descriptors_first(sit); \ +	     (pos); \ +	     (pos) = dvb_sit_section_descriptors_first(sit)) + +/** + * Iterator for services field in a dvb_sit_section. + * + * @param sit dvb_sit_section Pointer. + * @param pos Variable holding pointer to current dvb_sit_service. + */ +#define dvb_sit_section_services_for_each(sit, pos) \ +	for ((pos) = dvb_sit_section_services_first(sit); \ +	     (pos); \ +	     (pos) = dvb_sit_section_services_next(sit, pos)) + +/** + * Iterator for descriptors field in a dvb_sit_service. + * + * @param service dvb_sit_service Pointer. + * @param pos Variable holding pointer to current descriptor. + */ +#define dvb_sit_service_descriptors_for_each(service, pos) \ +	for ((pos) = dvb_sit_service_descriptors_first(service); \ +	     (pos); \ +	     (pos) = dvb_sit_service_descriptors_next(service, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct descriptor * +	dvb_sit_section_descriptors_first(struct dvb_sit_section *sit) +{ +	if (sit->transmission_info_loop_length == 0) +		return NULL; + +	return (struct descriptor *) +			((uint8_t *) sit + sizeof(struct dvb_sit_section)); +} + +static inline struct descriptor * +	dvb_sit_section_descriptors_next(struct dvb_sit_section *sit, +					 struct descriptor* pos) +{ +	return next_descriptor((uint8_t*) sit + sizeof(struct dvb_sit_section), +			       sit->transmission_info_loop_length, +			       pos); +} + +static inline struct dvb_sit_service * +	dvb_sit_section_services_first(struct dvb_sit_section *sit) +{ +	size_t pos = sizeof(struct dvb_sit_section) + sit->transmission_info_loop_length; + +	if (pos >= section_ext_length(&sit->head)) +		return NULL; + +	return (struct dvb_sit_service*) ((uint8_t *) sit + pos); +} + +static inline struct dvb_sit_service * +	dvb_sit_section_services_next(struct dvb_sit_section *sit, +				      struct dvb_sit_service *pos) +{ +	uint8_t *end = (uint8_t*) sit + section_ext_length(&sit->head); +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_sit_service) + +			pos->service_loop_length; + +	if (next >= end) +		return NULL; + +	return (struct dvb_sit_service *) next; +} + +static inline struct descriptor * +	dvb_sit_service_descriptors_first(struct dvb_sit_service * t) +{ +	if (t->service_loop_length == 0) +		return NULL; + +	return (struct descriptor *) +			((uint8_t *) t + sizeof(struct dvb_sit_service)); +} + +static inline struct descriptor * +	dvb_sit_service_descriptors_next(struct dvb_sit_service *t, +					 struct descriptor* pos) +{ +	return next_descriptor((uint8_t*) t + sizeof(struct dvb_sit_service), +			       t->service_loop_length, +			       pos); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/st_section.c b/lib/libucsi/dvb/st_section.c new file mode 100644 index 0000000..0e60aa1 --- /dev/null +++ b/lib/libucsi/dvb/st_section.c @@ -0,0 +1,29 @@ +/* + * 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/dvb/st_section.h> + +struct dvb_st_section * dvb_st_section_codec(struct section * section) +{ +	struct dvb_st_section * ret = (struct dvb_st_section *)section; + +	return ret; +} diff --git a/lib/libucsi/dvb/st_section.h b/lib/libucsi/dvb/st_section.h new file mode 100644 index 0000000..52ba888 --- /dev/null +++ b/lib/libucsi/dvb/st_section.h @@ -0,0 +1,77 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_ST_SECTION_H +#define _UCSI_DVB_ST_SECTION_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/section.h> + +/** + * dvb_st_section structure. + */ +struct dvb_st_section { +	struct section head; + +	/* uint8_t data[] */ +}; + +/** + * Process a dvb_st_section. + * + * @param section Generic section header. + * @return dvb_st_section pointer, or NULL on error. + */ +struct dvb_st_section *dvb_st_section_codec(struct section *section); + +/** + * Accessor for data field of dvb_st_section. + * + * @param st dvb_st_section Pointer. + * @return Pointer to field. + */ +static inline uint8_t* +	dvb_st_section_data(struct dvb_st_section* st) +{ +	return (uint8_t*) st + sizeof(struct dvb_st_section); +} + +/** + * Calculate length of data field of dvb_st_section. + * + * @param st dvb_st_section Pointer. + * @return Length in bytes. + */ +static inline int +	dvb_st_section_data_length(struct dvb_st_section* st) +{ +	return st->head.length; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/stream_identifier_descriptor.h b/lib/libucsi/dvb/stream_identifier_descriptor.h new file mode 100644 index 0000000..262c7e2 --- /dev/null +++ b/lib/libucsi/dvb/stream_identifier_descriptor.h @@ -0,0 +1,61 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_STREAM_IDENTIFIER_DESCRIPTOR +#define _UCSI_DVB_STREAM_IDENTIFIER_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_stream_identifier_descriptor structure. + */ +struct dvb_stream_identifier_descriptor { +	struct descriptor d; + +	uint8_t component_tag; +} __ucsi_packed; + +/** + * Process a dvb_stream_identifier_descriptor. + * + * @param d Pointer to generic descriptor structure. + * @return dvb_stream_identifier_descriptor pointer, or NULL on error. + */ +static inline struct dvb_stream_identifier_descriptor* +	dvb_stream_identifier_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct dvb_stream_identifier_descriptor) - 2)) +		return NULL; + +	return (struct dvb_stream_identifier_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/stuffing_descriptor.h b/lib/libucsi/dvb/stuffing_descriptor.h new file mode 100644 index 0000000..48e415d --- /dev/null +++ b/lib/libucsi/dvb/stuffing_descriptor.h @@ -0,0 +1,82 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_STUFFING_DESCRIPTOR +#define _UCSI_DVB_STUFFING_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_stuffing_descriptor. + */ +struct dvb_stuffing_descriptor { +	struct descriptor d; + +	/* uint8_t data[] */ +} __ucsi_packed; + +/** + * Process a dvb_stuffing_descriptor. + * + * @param d Generic descriptor structure. + * @return dvb_stuffing_descriptor pointer, or NULL on error. + */ +static inline struct dvb_stuffing_descriptor* +	dvb_stuffing_descriptor_codec(struct descriptor* d) +{ +	return (struct dvb_stuffing_descriptor*) d; +} + +/** + * Retrieve a pointer to the data field of a dvb_stuffing_descriptor. + * + * @param d dvb_stuffing_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +	dvb_stuffing_descriptor_data(struct dvb_stuffing_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_stuffing_descriptor); +} + +/** + * Calculate length of the data field of a dvb_stuffing_descriptor. + * + * @param d dvb_stuffing_descriptor pointer. + * @return The length in bytes. + */ +static inline int +	dvb_stuffing_descriptor_data_length(struct dvb_stuffing_descriptor *d) +{ +	return d->d.len; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/subtitling_descriptor.h b/lib/libucsi/dvb/subtitling_descriptor.h new file mode 100644 index 0000000..74fc25a --- /dev/null +++ b/lib/libucsi/dvb/subtitling_descriptor.h @@ -0,0 +1,126 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_SUBTITLING_DESCRIPTOR +#define _UCSI_DVB_SUBTITLING_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + +/** + * dvb_subtitling_descriptor structure. + */ +struct dvb_subtitling_descriptor { +	struct descriptor d; + +	/* struct dvb_subtitling_entry subtitles[] */ +} __ucsi_packed; + +/** + * An entry in the subtitles field of the a dvb_subtitling_descriptor. + */ +struct dvb_subtitling_entry { +	iso639lang_t language_code; +	uint8_t subtitling_type; +	uint16_t composition_page_id; +	uint16_t ancillary_page_id; +} __ucsi_packed; + +/** + * Process a dvb_subtitling_descriptor. + * + * @param d Generic descriptor. + * @return dvb_subtitling_descriptor pointer, or NULL on error. + */ +static inline struct dvb_subtitling_descriptor* +	dvb_subtitling_descriptor_codec(struct descriptor* d) +{ +	uint32_t pos = 0; +	uint8_t* ptr = (uint8_t*) d + 2; +	uint32_t len = d->len; + +	if (len % sizeof(struct dvb_subtitling_entry)) +		return NULL; + +	while(pos < len) { +		bswap16(ptr+pos+4); +		bswap16(ptr+pos+6); +		pos += sizeof(struct dvb_subtitling_entry); +	} + +	return (struct dvb_subtitling_descriptor*) d; +} + +/** + * Iterator for subtitles field in dvb_subtitling_descriptor. + * + * @param d dvb_subtitling_descriptor pointer. + * @param pos Variable containing a pointer to current dvb_subtitling_entry. + */ +#define dvb_subtitling_descriptor_subtitles_for_each(d, pos) \ +	for ((pos) = dvb_subtitling_descriptor_subtitles_first(d); \ +	     (pos); \ +	     (pos) = dvb_subtitling_descriptor_subtitles_next(d, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_subtitling_entry* +	dvb_subtitling_descriptor_subtitles_first(struct dvb_subtitling_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_subtitling_entry *) +		((uint8_t*) d + sizeof(struct dvb_subtitling_descriptor)); +} + +static inline struct dvb_subtitling_entry* +	dvb_subtitling_descriptor_subtitles_next(struct dvb_subtitling_descriptor *d, +						 struct dvb_subtitling_entry *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_subtitling_entry); + +	if (next >= end) +		return NULL; + +	return (struct dvb_subtitling_entry *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/target_ip_address_descriptor.h b/lib/libucsi/dvb/target_ip_address_descriptor.h new file mode 100644 index 0000000..c08b60e --- /dev/null +++ b/lib/libucsi/dvb/target_ip_address_descriptor.h @@ -0,0 +1,116 @@ +/* + * section and descriptor parser + * + * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org) + * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net) + * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr) + * + * 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 + */ + +#ifndef _UCSI_DVB_TARGET_IP_ADDRESS_DESCRIPTOR +#define _UCSI_DVB_TARGET_IP_ADDRESS_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/types.h> + +/** + * dvb_target_ip_address_descriptor structure. + */ +struct dvb_target_ip_address_descriptor { +	struct descriptor d; + +	uint8_t ipv4_addr_mask[4]; +	/* struct dvb_ipv4_addr ipv4_addr[] */ +} __ucsi_packed; + +/** + * An entry in the ipv4_addr field of a dvb_target_ip_address_descriptor. + */ +struct dvb_ipv4_addr { +	uint8_t ipv4_addr[4]; +} __ucsi_packed; + +/** + * Process a dvb_target_ip_address_descriptor. + * + * @param d Generic descriptor structure pointer. + * @return dvb_target_ip_address_descriptor pointer, or NULL on error. + */ +static inline struct dvb_target_ip_address_descriptor* +	dvb_target_ip_address_descriptor_codec(struct descriptor* d) +{ +	uint32_t len = d->len - 4; + +	if (len % sizeof(struct dvb_ipv4_addr)) +		return NULL; + +	return (struct dvb_target_ip_address_descriptor*) d; +} + +/** + * Iterator for entries in the ipv4_addr field of a dvb_target_ip_address_descriptor. + * + * @param d dvb_target_ip_address_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_ipv4_addr. + */ +#define dvb_target_ip_address_descriptor_ipv4_addr_for_each(d, pos) \ +	for ((pos) = dvb_target_ip_address_descriptor_ipv4_addr_first(d); \ +	     (pos); \ +	     (pos) = dvb_target_ip_address_descriptor_ipv4_addr_next(d, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_ipv4_addr* +	dvb_target_ip_address_descriptor_ipv4_addr_first(struct dvb_target_ip_address_descriptor *d) +{ +	if (d->d.len == 4) +		return NULL; + +	return (struct dvb_ipv4_addr *) +		((uint8_t*) d + sizeof(struct dvb_target_ip_address_descriptor)); +} + +static inline struct dvb_ipv4_addr* +	dvb_target_ip_address_descriptor_ipv4_addr_next(struct dvb_target_ip_address_descriptor *d, +						    struct dvb_ipv4_addr *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len - 4; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_ipv4_addr); + +	if (next >= end) +		return NULL; + +	return (struct dvb_ipv4_addr *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/target_ip_slash_descriptor.h b/lib/libucsi/dvb/target_ip_slash_descriptor.h new file mode 100644 index 0000000..e5bc76a --- /dev/null +++ b/lib/libucsi/dvb/target_ip_slash_descriptor.h @@ -0,0 +1,116 @@ +/* + * section and descriptor parser + * + * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org) + * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net) + * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr) + * + * 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 + */ + +#ifndef _UCSI_DVB_TARGET_IP_SLASH_DESCRIPTOR +#define _UCSI_DVB_TARGET_IP_SLASH_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/types.h> + +/** + * dvb_target_ip_slash_descriptor structure. + */ +struct dvb_target_ip_slash_descriptor { +	struct descriptor d; + +	/* struct dvb_ipv4_slash ipv4_slash[] */ +} __ucsi_packed; + +/** + * An entry in the ipv4_slash field of a dvb_target_ip_slash_descriptor. + */ +struct dvb_ipv4_slash { +	uint8_t ipv4_addr[4]; +	uint8_t ipv4_slash; +} __ucsi_packed; + +/** + * Process a dvb_target_ip_slash_descriptor. + * + * @param d Generic descriptor structure pointer. + * @return dvb_target_ip_slash_descriptor pointer, or NULL on error. + */ +static inline struct dvb_target_ip_slash_descriptor* +	dvb_target_ip_slash_descriptor_codec(struct descriptor* d) +{ +	uint32_t len = d->len; + +	if (len % sizeof(struct dvb_ipv4_slash)) +		return NULL; + +	return (struct dvb_target_ip_slash_descriptor*) d; +} + +/** + * Iterator for entries in the ipv4_slash field of a dvb_target_ip_slash_descriptor. + * + * @param d dvb_target_ip_slash_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_ipv4_slash. + */ +#define dvb_target_ip_slash_descriptor_ipv4_slash_for_each(d, pos) \ +	for ((pos) = dvb_target_ip_slash_descriptor_ipv4_slash_first(d); \ +	     (pos); \ +	     (pos) = dvb_target_ip_slash_descriptor_ipv4_slash_next(d, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_ipv4_slash* +	dvb_target_ip_slash_descriptor_ipv4_slash_first(struct dvb_target_ip_slash_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_ipv4_slash *) +		((uint8_t*) d + sizeof(struct dvb_target_ip_slash_descriptor)); +} + +static inline struct dvb_ipv4_slash* +	dvb_target_ip_slash_descriptor_ipv4_slash_next(struct dvb_target_ip_slash_descriptor *d, +						    struct dvb_ipv4_slash *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_ipv4_slash); + +	if (next >= end) +		return NULL; + +	return (struct dvb_ipv4_slash *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/target_ip_source_slash_descriptor.h b/lib/libucsi/dvb/target_ip_source_slash_descriptor.h new file mode 100644 index 0000000..8cade48 --- /dev/null +++ b/lib/libucsi/dvb/target_ip_source_slash_descriptor.h @@ -0,0 +1,118 @@ +/* + * section and descriptor parser + * + * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org) + * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net) + * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr) + * + * 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 + */ + +#ifndef _UCSI_DVB_TARGET_IP_SOURCE_SLASH_DESCRIPTOR +#define _UCSI_DVB_TARGET_IP_SOURCE_SLASH_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/types.h> + +/** + * dvb_target_ip_source_slash_descriptor structure. + */ +struct dvb_target_ip_source_slash_descriptor { +	struct descriptor d; + +	/* struct dvb_ipv4_source_slash ipv4_source_slash[] */ +} __ucsi_packed; + +/** + * An entry in the ipv4_source_slash field of a dvb_target_ip_source_slash_descriptor. + */ +struct dvb_ipv4_source_slash { +	uint8_t ipv4_source_addr[4]; +	uint8_t ipv4_source_slash; +	uint8_t ipv4_dest_addr[4]; +	uint8_t ipv4_dest_slash; +} __ucsi_packed; + +/** + * Process a dvb_target_ip_source_slash_descriptor. + * + * @param d Generic descriptor structure pointer. + * @return dvb_target_ip_source_slash_descriptor pointer, or NULL on error. + */ +static inline struct dvb_target_ip_source_slash_descriptor* +	dvb_target_ip_source_slash_descriptor_codec(struct descriptor* d) +{ +	uint32_t len = d->len; + +	if (len % sizeof(struct dvb_ipv4_source_slash)) +		return NULL; + +	return (struct dvb_target_ip_source_slash_descriptor*) d; +} + +/** + * Iterator for entries in the ipv4_source_slash field of a dvb_target_ip_source_slash_descriptor. + * + * @param d dvb_target_ip_source_slash_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_ipv4_source_slash. + */ +#define dvb_target_ip_source_slash_descriptor_ipv4_source_slash_for_each(d, pos) \ +	for ((pos) = dvb_target_ip_source_slash_descriptor_ipv4_source_slash_first(d); \ +	     (pos); \ +	     (pos) = dvb_target_ip_source_slash_descriptor_ipv4_source_slash_next(d, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_ipv4_source_slash* +	dvb_target_ip_source_slash_descriptor_ipv4_source_slash_first(struct dvb_target_ip_source_slash_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_ipv4_source_slash *) +		((uint8_t*) d + sizeof(struct dvb_target_ip_source_slash_descriptor)); +} + +static inline struct dvb_ipv4_source_slash* +	dvb_target_ip_source_slash_descriptor_ipv4_source_slash_next(struct dvb_target_ip_source_slash_descriptor *d, +						    struct dvb_ipv4_source_slash *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_ipv4_source_slash); + +	if (next >= end) +		return NULL; + +	return (struct dvb_ipv4_source_slash *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/target_ipv6_address_descriptor.h b/lib/libucsi/dvb/target_ipv6_address_descriptor.h new file mode 100644 index 0000000..1b28b48 --- /dev/null +++ b/lib/libucsi/dvb/target_ipv6_address_descriptor.h @@ -0,0 +1,116 @@ +/* + * section and descriptor parser + * + * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org) + * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net) + * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr) + * + * 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 + */ + +#ifndef _UCSI_DVB_TARGET_IPV6_ADDRESS_DESCRIPTOR +#define _UCSI_DVB_TARGET_IPV6_ADDRESS_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/types.h> + +/** + * dvb_target_ipv6_address_descriptor structure. + */ +struct dvb_target_ipv6_address_descriptor { +	struct descriptor d; + +	uint8_t ipv6_addr_mask[16]; +	/* struct dvb_ipv6_addr ipv6_addr[] */ +} __ucsi_packed; + +/** + * An entry in the ipv6_addr field of a dvb_target_ipv6_address_descriptor. + */ +struct dvb_ipv6_addr { +	uint8_t ipv6_addr[16]; +} __ucsi_packed; + +/** + * Process a dvb_target_ipv6_address_descriptor. + * + * @param d Generic descriptor structure pointer. + * @return dvb_target_ipv6_address_descriptor pointer, or NULL on error. + */ +static inline struct dvb_target_ipv6_address_descriptor* +	dvb_target_ipv6_address_descriptor_codec(struct descriptor* d) +{ +	uint32_t len = d->len - 16; + +	if (len % sizeof(struct dvb_ipv6_addr)) +		return NULL; + +	return (struct dvb_target_ipv6_address_descriptor*) d; +} + +/** + * Iterator for entries in the ipv6_addr field of a dvb_target_ipv6_address_descriptor. + * + * @param d dvb_target_ipv6_address_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_ipv6_addr. + */ +#define dvb_target_ipv6_address_descriptor_ipv6_addr_for_each(d, pos) \ +	for ((pos) = dvb_target_ipv6_address_descriptor_ipv6_addr_first(d); \ +	     (pos); \ +	     (pos) = dvb_target_ipv6_address_descriptor_ipv6_addr_next(d, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_ipv6_addr* +	dvb_target_ipv6_address_descriptor_ipv6_addr_first(struct dvb_target_ipv6_address_descriptor *d) +{ +	if (d->d.len == 16) +		return NULL; + +	return (struct dvb_ipv6_addr *) +		((uint8_t*) d + sizeof(struct dvb_target_ipv6_address_descriptor)); +} + +static inline struct dvb_ipv6_addr* +	dvb_target_ipv6_address_descriptor_ipv6_addr_next(struct dvb_target_ipv6_address_descriptor *d, +						    struct dvb_ipv6_addr *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len - 16; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_ipv6_addr); + +	if (next >= end) +		return NULL; + +	return (struct dvb_ipv6_addr *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/target_ipv6_slash_descriptor.h b/lib/libucsi/dvb/target_ipv6_slash_descriptor.h new file mode 100644 index 0000000..3dc6d75 --- /dev/null +++ b/lib/libucsi/dvb/target_ipv6_slash_descriptor.h @@ -0,0 +1,116 @@ +/* + * section and descriptor parser + * + * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org) + * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net) + * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr) + * + * 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 + */ + +#ifndef _UCSI_DVB_TARGET_IPV6_SLASH_DESCRIPTOR +#define _UCSI_DVB_TARGET_IPV6_SLASH_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/types.h> + +/** + * dvb_target_ipv6_slash_descriptor structure. + */ +struct dvb_target_ipv6_slash_descriptor { +	struct descriptor d; + +	/* struct dvb_ipv6_slash ipv6_slash[] */ +} __ucsi_packed; + +/** + * An entry in the ipv6_slash field of a dvb_target_ipv6_slash_descriptor. + */ +struct dvb_ipv6_slash { +	uint8_t ipv6_addr[16]; +	uint8_t ipv6_slash; +} __ucsi_packed; + +/** + * Process a dvb_target_ipv6_slash_descriptor. + * + * @param d Generic descriptor structure pointer. + * @return dvb_target_ipv6_slash_descriptor pointer, or NULL on error. + */ +static inline struct dvb_target_ipv6_slash_descriptor* +	dvb_target_ipv6_slash_descriptor_codec(struct descriptor* d) +{ +	uint32_t len = d->len; + +	if (len % sizeof(struct dvb_ipv6_slash)) +		return NULL; + +	return (struct dvb_target_ipv6_slash_descriptor*) d; +} + +/** + * Iterator for entries in the ipv6_slash field of a dvb_target_ipv6_slash_descriptor. + * + * @param d dvb_target_ipv6_slash_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_ipv6_slash. + */ +#define dvb_target_ipv6_slash_descriptor_ipv6_slash_for_each(d, pos) \ +	for ((pos) = dvb_target_ipv6_slash_descriptor_ipv6_slash_first(d); \ +	     (pos); \ +	     (pos) = dvb_target_ipv6_slash_descriptor_ipv6_slash_next(d, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_ipv6_slash* +	dvb_target_ipv6_slash_descriptor_ipv6_slash_first(struct dvb_target_ipv6_slash_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_ipv6_slash *) +		((uint8_t*) d + sizeof(struct dvb_target_ipv6_slash_descriptor)); +} + +static inline struct dvb_ipv6_slash* +	dvb_target_ipv6_slash_descriptor_ipv6_slash_next(struct dvb_target_ipv6_slash_descriptor *d, +						    struct dvb_ipv6_slash *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_ipv6_slash); + +	if (next >= end) +		return NULL; + +	return (struct dvb_ipv6_slash *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/target_ipv6_source_slash_descriptor.h b/lib/libucsi/dvb/target_ipv6_source_slash_descriptor.h new file mode 100644 index 0000000..3a4b38e --- /dev/null +++ b/lib/libucsi/dvb/target_ipv6_source_slash_descriptor.h @@ -0,0 +1,118 @@ +/* + * section and descriptor parser + * + * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org) + * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net) + * Copyright (C) 2006 Stephane Este-Gracias (sestegra@free.fr) + * + * 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 + */ + +#ifndef _UCSI_DVB_TARGET_IPV6_SOURCE_SLASH_DESCRIPTOR +#define _UCSI_DVB_TARGET_IPV6_SOURCE_SLASH_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/types.h> + +/** + * dvb_target_ipv6_source_slash_descriptor structure. + */ +struct dvb_target_ipv6_source_slash_descriptor { +	struct descriptor d; + +	/* struct dvb_ipv6_source_slash ipv6_source_slash[] */ +} __ucsi_packed; + +/** + * An entry in the ipv6_source_slash field of a dvb_target_ipv6_source_slash_descriptor. + */ +struct dvb_ipv6_source_slash { +	uint8_t ipv6_source_addr[16]; +	uint8_t ipv6_source_slash; +	uint8_t ipv6_dest_addr[16]; +	uint8_t ipv6_dest_slash; +} __ucsi_packed; + +/** + * Process a dvb_target_ipv6_source_slash_descriptor. + * + * @param d Generic descriptor structure pointer. + * @return dvb_target_ipv6_source_slash_descriptor pointer, or NULL on error. + */ +static inline struct dvb_target_ipv6_source_slash_descriptor* +	dvb_target_ipv6_source_slash_descriptor_codec(struct descriptor* d) +{ +	uint32_t len = d->len; + +	if (len % sizeof(struct dvb_ipv6_source_slash)) +		return NULL; + +	return (struct dvb_target_ipv6_source_slash_descriptor*) d; +} + +/** + * Iterator for entries in the ipv6_source_slash field of a dvb_target_ipv6_source_slash_descriptor. + * + * @param d dvb_target_ipv6_source_slash_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_ipv6_source_slash. + */ +#define dvb_target_ipv6_source_slash_descriptor_ipv6_source_slash_for_each(d, pos) \ +	for ((pos) = dvb_target_ipv6_source_slash_descriptor_ipv6_source_slash_first(d); \ +	     (pos); \ +	     (pos) = dvb_target_ipv6_source_slash_descriptor_ipv6_source_slash_next(d, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_ipv6_source_slash* +	dvb_target_ipv6_source_slash_descriptor_ipv6_source_slash_first(struct dvb_target_ipv6_source_slash_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_ipv6_source_slash *) +		((uint8_t*) d + sizeof(struct dvb_target_ipv6_source_slash_descriptor)); +} + +static inline struct dvb_ipv6_source_slash* +	dvb_target_ipv6_source_slash_descriptor_ipv6_source_slash_next(struct dvb_target_ipv6_source_slash_descriptor *d, +						    struct dvb_ipv6_source_slash *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_ipv6_source_slash); + +	if (next >= end) +		return NULL; + +	return (struct dvb_ipv6_source_slash *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/tdt_section.c b/lib/libucsi/dvb/tdt_section.c new file mode 100644 index 0000000..ba64fe9 --- /dev/null +++ b/lib/libucsi/dvb/tdt_section.c @@ -0,0 +1,33 @@ +/* + * 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/dvb/tdt_section.h> + +struct dvb_tdt_section * dvb_tdt_section_codec(struct section * section) +{ +	size_t len = section_length(section); +	struct dvb_tdt_section * ret = (struct dvb_tdt_section *) section; + +	if (len != sizeof(struct dvb_tdt_section)) +		return NULL; + +	return ret; +} diff --git a/lib/libucsi/dvb/tdt_section.h b/lib/libucsi/dvb/tdt_section.h new file mode 100644 index 0000000..fc2bcb8 --- /dev/null +++ b/lib/libucsi/dvb/tdt_section.h @@ -0,0 +1,54 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_TDT_SECTION_H +#define _UCSI_DVB_TDT_SECTION_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/section.h> +#include <libucsi/dvb/types.h> + +/** + * dvb_tdt_section structure. + */ +struct dvb_tdt_section { +	struct section head; + +	dvbdate_t utc_time; +} __ucsi_packed; + +/** + * Process a dvb_tdt_section. + * + * @param section Generic section header. + * @return dvb_tdt_section pointer, or NULL on error. + */ +struct dvb_tdt_section *dvb_tdt_section_codec(struct section *section); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/telephone_descriptor.h b/lib/libucsi/dvb/telephone_descriptor.h new file mode 100644 index 0000000..3dc43a1 --- /dev/null +++ b/lib/libucsi/dvb/telephone_descriptor.h @@ -0,0 +1,150 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_TELEPHONE_DESCRIPTOR +#define _UCSI_DVB_TELEPHONE_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_telephone_descriptor stucture. + */ +struct dvb_telephone_descriptor { +	struct descriptor d; + +  EBIT3(uint8_t reserved_1			: 2; , +	uint8_t foreign_availability		: 1; , +	uint8_t connection_type			: 5; ); +  EBIT4(uint8_t reserved_2			: 1; , +	uint8_t country_prefix_length		: 2; , +	uint8_t international_area_code_length	: 3; , +	uint8_t operator_code_length		: 2; ); +  EBIT3(uint8_t reserved_3			: 1; , +	uint8_t national_area_code_length	: 3; , +	uint8_t core_number_length		: 4; ); +	/* uint8_t country_prefix[] */ +	/* uint8_t international_area_code[] */ +	/* uint8_t operator_code[] */ +	/* uint8_t national_area_code[] */ +	/* uint8_t core_number[] */ +} __ucsi_packed; + + +/** + * Process a dvb_telephone_descriptor. + * + * @param d Generic descriptor. + * @return dvb_telephone_descriptor pointer, or NULL on error. + */ +static inline struct dvb_telephone_descriptor* +	dvb_telephone_descriptor_codec(struct descriptor* d) +{ +	struct dvb_telephone_descriptor* p = +		(struct dvb_telephone_descriptor*) d; +	uint32_t pos = sizeof(struct dvb_telephone_descriptor) - 2; +	uint32_t len = d->len; + +	if (pos > len) +		return NULL; + +	pos +=  p->country_prefix_length + +		p->international_area_code_length + +		p->operator_code_length + +		p->national_area_code_length + +		p->core_number_length; + +	if (pos != len) +		return NULL; + +	return p; +} + +/** + * Retrieve pointer to country_prefix field of a dvb_telephone_descriptor. + * + * @param d dvb_telephone_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint8_t* +	dvb_telephone_descriptor_country_prefix(struct dvb_telephone_descriptor* d) +{ +	return (uint8_t*) d + sizeof(struct dvb_telephone_descriptor); +} + +/** + * Retrieve pointer to international_area_code field of a dvb_telephone_descriptor. + * + * @param d dvb_telephone_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint8_t* +	dvb_telephone_descriptor_international_area_code(struct dvb_telephone_descriptor* d) +{ +	return dvb_telephone_descriptor_country_prefix(d) + d->country_prefix_length; +} + +/** + * Retrieve pointer to operator_code field of a dvb_telephone_descriptor. + * + * @param d dvb_telephone_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint8_t* +	dvb_telephone_descriptor_operator_code(struct dvb_telephone_descriptor* d) +{ +	return dvb_telephone_descriptor_international_area_code(d) + d->international_area_code_length; +} + +/** + * Retrieve pointer to national_area_code field of a dvb_telephone_descriptor. + * + * @param d dvb_telephone_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint8_t* +	dvb_telephone_descriptor_national_area_code(struct dvb_telephone_descriptor* d) +{ +	return dvb_telephone_descriptor_operator_code(d) + d->operator_code_length; +} + +/** + * Retrieve pointer to core_number field of a dvb_telephone_descriptor. + * + * @param d dvb_telephone_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint8_t* +	dvb_telephone_descriptor_core_number(struct dvb_telephone_descriptor* d) +{ +	return dvb_telephone_descriptor_national_area_code(d) + d->national_area_code_length; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/teletext_descriptor.h b/lib/libucsi/dvb/teletext_descriptor.h new file mode 100644 index 0000000..424c1cb --- /dev/null +++ b/lib/libucsi/dvb/teletext_descriptor.h @@ -0,0 +1,127 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_TELETEXT_DESCRIPTOR +#define _UCSI_DVB_TELETEXT_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + +/** + * Possible values for the type field. + */ +enum { +	DVB_TELETEXT_TYPE_INITIAL		= 0x01, +	DVB_TELETEXT_TYPE_SUBTITLE		= 0x02, +	DVB_TELETEXT_TYPE_ADDITIONAL		= 0x03, +	DVB_TELETEXT_TYPE_SCHEDULE		= 0x04, +	DVB_TELETEXT_TYPE_SUBTITLE_HEARING_IMPAIRED= 0x05, +}; + +/** + * dvb_teletext_descriptor structure. + */ +struct dvb_teletext_descriptor { +	struct descriptor d; + +	/* struct dvb_teletext_entry entries[] */ +} __ucsi_packed; + +/** + * An entry in the entries field of a dvb_teletext_descriptor. + */ +struct dvb_teletext_entry { +	iso639lang_t language_code; +  EBIT2(uint8_t type		: 5; , +	uint8_t magazine_number: 3; ); +	uint8_t page_number; +} __ucsi_packed; + +/** + * Process a dvb_teletext_descriptor. + * + * @param d Generic descriptor. + * @return dvb_teletext_descriptor pointer, or NULL on error. + */ +static inline struct dvb_teletext_descriptor* +	dvb_teletext_descriptor_codec(struct descriptor* d) +{ +	if (d->len % sizeof(struct dvb_teletext_entry)) +		return NULL; + +	return (struct dvb_teletext_descriptor*) d; +} + +/** + * Iterator for entries field of a dvb_teletext_descriptor. + * + * @param d dvb_teletext_descriptor pointer. + * @param pos Variable holding a pointer to the current dvb_teletext_entry. + */ +#define dvb_teletext_descriptor_entries_for_each(d, pos) \ +	for ((pos) = dvb_teletext_descriptor_entries_first(d); \ +	     (pos); \ +	     (pos) = dvb_teletext_descriptor_entries_next(d, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_teletext_entry* +	dvb_teletext_descriptor_entries_first(struct dvb_teletext_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_teletext_entry *) +		((uint8_t*) d + sizeof(struct dvb_teletext_descriptor)); +} + +static inline struct dvb_teletext_entry* +	dvb_teletext_descriptor_entries_next(struct dvb_teletext_descriptor *d, +					     struct dvb_teletext_entry *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_teletext_entry); + +	if (next >= end) +		return NULL; + +	return (struct dvb_teletext_entry *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/terrestrial_delivery_descriptor.h b/lib/libucsi/dvb/terrestrial_delivery_descriptor.h new file mode 100644 index 0000000..c624dab --- /dev/null +++ b/lib/libucsi/dvb/terrestrial_delivery_descriptor.h @@ -0,0 +1,77 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_TERRESTRIAL_DELIVERY_DESCRIPTOR +#define _UCSI_DVB_TERRESTRIAL_DELIVERY_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_terrestrial_delivery_descriptor structure. + */ +struct dvb_terrestrial_delivery_descriptor { +	struct descriptor d; + +	uint32_t centre_frequency;		// Normal integer, units 10Hz +  EBIT5(uint8_t bandwidth		: 3; , +	uint8_t priority		: 1; , +	uint8_t time_slicing_indicator	: 1; , +	uint8_t mpe_fec_indicator	: 1; , +	uint8_t reserved_1		: 2; ); +  EBIT3(uint8_t constellation		: 2; , +	uint8_t hierarchy_information	: 3; , +	uint8_t code_rate_hp_stream	: 3; ); +  EBIT4(uint8_t code_rate_lp_stream	: 3; , +	uint8_t guard_interval		: 2; , +	uint8_t transmission_mode	: 2; , +	uint8_t other_frequency_flag	: 1; ); +	uint32_t reserved_2; +} __ucsi_packed; + +/** + * Process a dvb_terrestrial_delivery_descriptor. + * + * @param d Generic descriptor structure. + * @return dvb_terrestrial_delivery_descriptor pointer, or NULL on error. + */ +static inline struct dvb_terrestrial_delivery_descriptor* +	dvb_terrestrial_delivery_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct dvb_terrestrial_delivery_descriptor) - 2)) +		return NULL; + +	bswap32((uint8_t*) d + 2); +	bswap32((uint8_t*) d + 9); + +	return (struct dvb_terrestrial_delivery_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/time_shifted_event_descriptor.h b/lib/libucsi/dvb/time_shifted_event_descriptor.h new file mode 100644 index 0000000..6b4a9f6 --- /dev/null +++ b/lib/libucsi/dvb/time_shifted_event_descriptor.h @@ -0,0 +1,65 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_TIME_SHIFTED_EVENT_DESCRIPTOR +#define _UCSI_DVB_TIME_SHIFTED_EVENT_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_time_shifted_event_descriptor structure. + */ +struct dvb_time_shifted_event_descriptor { +	struct descriptor d; + +	uint16_t reference_service_id; +	uint16_t reference_event_id; +} __ucsi_packed; + +/** + * Process a dvb_time_shifted_event_descriptor. + * + * @param d Generic descriptor. + * @return dvb_time_shifted_event_descriptor pointer, or NULL on error. + */ +static inline struct dvb_time_shifted_event_descriptor* +	dvb_time_shifted_event_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct dvb_time_shifted_event_descriptor) - 2)) +		return NULL; + +	bswap16((uint8_t*) d + 2); +	bswap16((uint8_t*) d + 4); + +	return (struct dvb_time_shifted_event_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/time_shifted_service_descriptor.h b/lib/libucsi/dvb/time_shifted_service_descriptor.h new file mode 100644 index 0000000..c8dcc0e --- /dev/null +++ b/lib/libucsi/dvb/time_shifted_service_descriptor.h @@ -0,0 +1,63 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_TIME_SHIFTED_SERVICE_DESCRIPTOR +#define _UCSI_DVB_TIME_SHIFTED_SERVICE_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_time_shifted_service_descriptor structure. + */ +struct dvb_time_shifted_service_descriptor { +	struct descriptor d; + +	uint16_t reference_service_id; +} __ucsi_packed; + +/** + * Process a dvb_time_shifted_service_descriptor. + * + * @param d Generic descriptor. + * @return Pointer to dvb_time_shifted_service_descriptor, or NULL on error. + */ +static inline struct dvb_time_shifted_service_descriptor* +	dvb_time_shifted_service_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct dvb_time_shifted_service_descriptor) - 2)) +		return NULL; + +	bswap16((uint8_t*) d + 2); + +	return (struct dvb_time_shifted_service_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/tot_section.c b/lib/libucsi/dvb/tot_section.c new file mode 100644 index 0000000..5dc7890 --- /dev/null +++ b/lib/libucsi/dvb/tot_section.c @@ -0,0 +1,50 @@ +/* + * 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/dvb/tot_section.h> + +struct dvb_tot_section *dvb_tot_section_codec(struct section *section) +{ +	uint8_t * buf = (uint8_t *)section; +	size_t pos = sizeof(struct section); +	size_t len = section_length(section) - CRC_SIZE; +	struct dvb_tot_section * ret = (struct dvb_tot_section *)section; + +	if (len < sizeof(struct dvb_tot_section)) +		return NULL; + +	pos += 5; +	bswap16(buf + pos); +	pos += 2; + +	if ((pos + ret->descriptors_loop_length) > len) +		return NULL; + +	if (verify_descriptors(buf + pos, ret->descriptors_loop_length)) +		return NULL; + +	pos += ret->descriptors_loop_length; + +	if (pos != len) +		return NULL; + +	return ret; +} diff --git a/lib/libucsi/dvb/tot_section.h b/lib/libucsi/dvb/tot_section.h new file mode 100644 index 0000000..3474da1 --- /dev/null +++ b/lib/libucsi/dvb/tot_section.h @@ -0,0 +1,97 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_TOT_SECTION_H +#define _UCSI_DVB_TOT_SECTION_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/section.h> +#include <libucsi/dvb/types.h> + +/** + * dvb_tot_section structure. + */ +struct dvb_tot_section { +	struct section head; + +	dvbdate_t utc_time; +  EBIT2(uint16_t reserved		: 4; , +	uint16_t descriptors_loop_length:12; ); +  	/* struct descriptor descriptors[] */ +} __ucsi_packed; + +/** + * Process a dvb_tot_section. + * + * @param section Pointer to generic section structure. + * @return dvb_tot_section pointer, or NULL on error. + */ +struct dvb_tot_section * dvb_tot_section_codec(struct section *section); + +/** + * Iterator for descriptors field of dvb_tot_section. + * + * @param tot dvb_tot_section pointer. + * @param pos Variable holding a pointer to the current descriptor. + */ +#define dvb_tot_section_descriptors_for_each(tot, pos) \ +	for ((pos) = dvb_tot_section_descriptors_first(tot); \ +	     (pos); \ +	     (pos) = dvb_tot_section_descriptors_next(tot, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct descriptor * +	dvb_tot_section_descriptors_first(struct dvb_tot_section * tot) +{ +	if (tot->descriptors_loop_length == 0) +		return NULL; + +	return (struct descriptor *) +		((uint8_t *) tot + sizeof(struct dvb_tot_section)); +} + +static inline struct descriptor * +	dvb_tot_section_descriptors_next(struct dvb_tot_section *tot, +					 struct descriptor* pos) +{ +	return next_descriptor((uint8_t *) tot + sizeof(struct dvb_tot_section), +			       tot->descriptors_loop_length, +			       pos); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/transport_stream_descriptor.h b/lib/libucsi/dvb/transport_stream_descriptor.h new file mode 100644 index 0000000..1797ec5 --- /dev/null +++ b/lib/libucsi/dvb/transport_stream_descriptor.h @@ -0,0 +1,82 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_TRANSPORT_STREAM_DESCRIPTOR +#define _UCSI_DVB_TRANSPORT_STREAM_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_transport_stream_descriptor structure. + */ +struct dvb_transport_stream_descriptor { +	struct descriptor d; + +	/* uint8_t data[] */ +} __ucsi_packed; + +/** + * Process dvb_transport_stream_descriptor structure. + * + * @param d Pointer to generic descriptor. + * @return dvb_transport_stream_descriptor structure or NULL on error. + */ +static inline struct dvb_transport_stream_descriptor* +	dvb_transport_stream_descriptor_codec(struct descriptor* d) +{ +	return (struct dvb_transport_stream_descriptor*) d; +} + +/** + * Retrieve a pointer to the data field of a dvb_transport_stream_descriptor. + * + * @param d dvb_transport_stream_descriptor structure. + * @return Pointer to data field. + */ +static inline uint8_t * +	dvb_transport_stream_descriptor_data(struct dvb_transport_stream_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_transport_stream_descriptor); +} + +/** + * Calculate the length of the data field of a dvb_transport_stream_descriptor. + * + * @param d dvb_transport_stream_descriptor structure. + * @return length of data field in bytes. + */ +static inline int +	dvb_transport_stream_descriptor_data_length(struct dvb_transport_stream_descriptor *d) +{ +	return d->d.len; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/tva_container_section.c b/lib/libucsi/dvb/tva_container_section.c new file mode 100644 index 0000000..f526efc --- /dev/null +++ b/lib/libucsi/dvb/tva_container_section.c @@ -0,0 +1,33 @@ +/* + * 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/dvb/tva_container_section.h> + +struct dvb_tva_container_section *dvb_tva_container_section_codec(struct section_ext *ext) +{ +	size_t len = section_ext_length(ext); +	struct dvb_tva_container_section* ret = (struct dvb_tva_container_section*) ext; + +	if (len < sizeof(struct dvb_tva_container_section)) +		return NULL; + +	return ret; +} diff --git a/lib/libucsi/dvb/tva_container_section.h b/lib/libucsi/dvb/tva_container_section.h new file mode 100644 index 0000000..7d0abb1 --- /dev/null +++ b/lib/libucsi/dvb/tva_container_section.h @@ -0,0 +1,90 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_TVA_CONTAINER_SECTION_H +#define _UCSI_DVB_TVA_CONTAINER_SECTION_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/section.h> +#include <libucsi/dvb/types.h> + +/** + * dvb_tva_container_section structure. + */ +struct dvb_tva_container_section { +	struct section_ext head; + +	/* uint8_t data[] */ +} __ucsi_packed; + +/** + * Process a dvb_tva_container_section. + * + * @param section Generic section header. + * @return dvb_tdt_section pointer, or NULL on error. + */ +struct dvb_tva_container_section *dvb_tva_container_section_codec(struct section_ext *ext); + +/** + * Accessor for the container_id field of a tva container section. + * + * @param container dvb_tva_container_section pointer. + * @return The container_id. + */ +static inline uint16_t dvb_tva_container_section_container_id(struct dvb_tva_container_section *container) +{ +	return container->head.table_id_ext; +} + +/** + * Accessor for the data field of a dvb_data_broadcast_id_descriptor. + * + * @param d dvb_data_broadcast_id_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +dvb_tva_container_section_data(struct dvb_tva_container_section *s) +{ +	return (uint8_t *) s + sizeof(struct dvb_tva_container_section); +} + +/** + * Determine the number of bytes in the data field of a dvb_tva_container_section. + * + * @param d dvb_tva_container_section pointer. + * @return Length of the field in bytes. + */ +static inline int +dvb_tva_container_section_data_length(struct dvb_tva_container_section *s) +{ +	return section_ext_length(&s->head) - sizeof(struct dvb_tva_container_section); +} + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/tva_id_descriptor.h b/lib/libucsi/dvb/tva_id_descriptor.h new file mode 100644 index 0000000..3b4f3e8 --- /dev/null +++ b/lib/libucsi/dvb/tva_id_descriptor.h @@ -0,0 +1,124 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_TVA_ID_DESCRIPTOR +#define _UCSI_DVB_TVA_ID_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * dvb_tva_id_descriptor structure. + */ +struct dvb_tva_id_descriptor { +	struct descriptor d; + +	/* struct dvb_tva_id_entry entries[] */ +} __ucsi_packed; + +/** + * An entry in the entries field of a dvb_tva_id_descriptor. + */ +struct dvb_tva_id_entry { +	uint16_t tva_id; +  EBIT2(uint8_t reserved		: 5; , +	uint8_t running_status		: 3; ); +} __ucsi_packed; + +/** + * Process a dvb_tva_id_descriptor. + * + * @param d Generic descriptor pointer. + * @return dvb_tva_id_descriptor pointer, or NULL on error. + */ +static inline struct dvb_tva_id_descriptor* +	dvb_tva_id_descriptor_codec(struct descriptor* d) +{ +	uint32_t pos = 0; +	uint32_t len = d->len; +	uint8_t* buf = (uint8_t*) d + 2; + +	pos += sizeof(struct dvb_tva_id_descriptor) - 2; +	if (len % sizeof(struct dvb_tva_id_entry)) +		return NULL; + +	while(pos < len) { +		bswap16(buf+pos); +		pos+=3; +	} + +	return (struct dvb_tva_id_descriptor*) d; +} + +/** + * Iterator for the entries field of a dvb_tva_id_descriptor. + * + * @param d dvb_tva_id_descriptor pointer. + * @param pos Variable containing a pointer to the current dvb_tva_id_entry. + */ +#define dvb_tva_id_descriptor_entries_for_each(d, pos) \ +	for ((pos) = dvb_tva_id_descriptor_entries_first(d); \ +	     (pos); \ +	     (pos) = dvb_tva_id_descriptor_entries_next(d, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_tva_id_entry* +	dvb_tva_id_descriptor_entries_first(struct dvb_tva_id_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_tva_id_entry *) +		((uint8_t*) d + sizeof(struct dvb_tva_id_descriptor)); +} + +static inline struct dvb_tva_id_entry* +	dvb_tva_id_descriptor_entries_next(struct dvb_tva_id_descriptor *d, +							     struct dvb_tva_id_entry *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_tva_id_entry); + +	if (next >= end) +		return NULL; + +	return (struct dvb_tva_id_entry *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/types.c b/lib/libucsi/dvb/types.c new file mode 100644 index 0000000..c1cf583 --- /dev/null +++ b/lib/libucsi/dvb/types.c @@ -0,0 +1,270 @@ +/* + * section and descriptor parser + * + * 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 <string.h> +#include "types.h" + +time_t dvbdate_to_unixtime(dvbdate_t dvbdate) +{ +	int k = 0; +	struct tm tm; +	double mjd; + +	/* check for the undefined value */ +	if ((dvbdate[0] == 0xff) && +	    (dvbdate[1] == 0xff) && +	    (dvbdate[2] == 0xff) && +	    (dvbdate[3] == 0xff) && +	    (dvbdate[4] == 0xff)) { +		return -1; +	} + +	memset(&tm, 0, sizeof(tm)); +	mjd = (dvbdate[0] << 8) | dvbdate[1]; + +	tm.tm_year = (int) ((mjd - 15078.2) / 365.25); +	tm.tm_mon = (int) (((mjd - 14956.1) - (int) (tm.tm_year * 365.25)) / 30.6001); +	tm.tm_mday = (int) mjd - 14956 - (int) (tm.tm_year * 365.25) - (int) (tm.tm_mon * 30.6001); +	if ((tm.tm_mon == 14) || (tm.tm_mon == 15)) k = 1; +	tm.tm_year += k; +	tm.tm_mon = tm.tm_mon - 2 - k * 12; +	tm.tm_sec = bcd_to_integer(dvbdate[4]); +	tm.tm_min = bcd_to_integer(dvbdate[3]); +	tm.tm_hour = bcd_to_integer(dvbdate[2]); + +	return mktime(&tm); +} + +void unixtime_to_dvbdate(time_t unixtime, dvbdate_t dvbdate) +{ +	struct tm tm; +	double l = 0; +	int mjd; + +	/* the undefined value */ +	if (unixtime == -1) { +		memset(dvbdate, 0xff, 5); +		return; +	} + +	gmtime_r(&unixtime, &tm); +	tm.tm_mon++; +	if ((tm.tm_mon == 1) || (tm.tm_mon == 2)) l = 1; +	mjd = 14956 + tm.tm_mday + (int) ((tm.tm_year - l) * 365.25) + (int) ((tm.tm_mon + 1 + l * 12) * 30.6001); + +	dvbdate[0] = (mjd & 0xff00) >> 8; +	dvbdate[1] = mjd & 0xff; +	dvbdate[2] = integer_to_bcd(tm.tm_hour); +	dvbdate[3] = integer_to_bcd(tm.tm_min); +	dvbdate[4] = integer_to_bcd(tm.tm_sec); +} + +int dvbduration_to_seconds(dvbduration_t dvbduration) +{ +	int seconds = 0; + +	seconds += (bcd_to_integer(dvbduration[0]) * 60 * 60); +	seconds += (bcd_to_integer(dvbduration[1]) * 60); +	seconds += bcd_to_integer(dvbduration[2]); + +	return seconds; +} + +void seconds_to_dvbduration(int seconds, dvbduration_t dvbduration) +{ +	int hours, mins; + +	hours = seconds / (60*60); +	seconds -= (hours * 60 * 60); +	mins = seconds / 60; +	seconds -= (mins * 60); + +	dvbduration[0] = integer_to_bcd(hours); +	dvbduration[1] = integer_to_bcd(mins); +	dvbduration[2] = integer_to_bcd(seconds); +} + +int dvbhhmm_to_seconds(dvbhhmm_t dvbhhmm) +{ +	int seconds = 0; + +	seconds += (bcd_to_integer(dvbhhmm[0]) * 60 * 60); +	seconds += (bcd_to_integer(dvbhhmm[1]) * 60); + +	return seconds; +} + +void seconds_to_dvbhhmm(int seconds, dvbhhmm_t dvbhhmm) +{ +	int hours, mins; + +	hours = seconds / (60*60); +	seconds -= (hours * 60 * 60); +	mins = seconds / 60; + +	dvbhhmm[0] = integer_to_bcd(hours); +	dvbhhmm[1] = integer_to_bcd(mins); +} + +uint32_t integer_to_bcd(uint32_t intval) +{ +	uint32_t val = 0; + +	int i; +	for(i=0; i<=28;i+=4) { +		val |= ((intval % 10) << i); +		intval /= 10; +	} + +	return val; +} + +uint32_t bcd_to_integer(uint32_t bcdval) +{ +	uint32_t val = 0; + +	int i; +	for(i=28; i>=0;i-=4) { +		val += ((bcdval >> i) & 0x0f); +		if (i != 0) val *= 10; +	} + +	return val; +} + +const char *dvb_charset(char *dvb_text, int dvb_text_length, int *consumed) +{ +	char *charset = "ISO6937"; +	int used = 0; + +	if (dvb_text_length == 0) +		goto exit; +	if (dvb_text[0] >= 32) +		goto exit; +	if (dvb_text[0] == 0x10) { +		if (dvb_text_length < 3) +			goto exit; + +		used = 3; +		uint16_t ext = (dvb_text[1] << 8) | dvb_text[2]; +		switch(ext) { +		case 0x01: +			charset = "ISO8859-1"; +			break; +		case 0x02: +			charset = "ISO8859-2"; +			break; +		case 0x03: +			charset = "ISO8859-3"; +			break; +		case 0x04: +			charset = "ISO8859-4"; +			break; +		case 0x05: +			charset = "ISO8859-5"; +			break; +		case 0x06: +			charset = "ISO8859-6"; +			break; +		case 0x07: +			charset = "ISO8859-7"; +			break; +		case 0x08: +			charset = "ISO8859-8"; +			break; +		case 0x09: +			charset = "ISO8859-9"; +			break; +		case 0x0a: +			charset = "ISO8859-10"; +			break; +		case 0x0b: +			charset = "ISO8859-11"; +			break; +		case 0x0d: +			charset = "ISO8859-13"; +			break; +		case 0x0e: +			charset = "ISO8859-14"; +			break; +		case 0x0f: +			charset = "ISO8859-15"; +			break; +		default: +			used = 0; +			break; +		} +	} else { +		used = 1; +		switch(dvb_text[0]) { +		case 0x01: +			charset = "ISO8859-5"; +			break; +		case 0x02: +			charset = "ISO8859-6"; +			break; +		case 0x03: +			charset = "ISO8859-7"; +			break; +		case 0x04: +			charset = "ISO8859-8"; +			break; +		case 0x05: +			charset = "ISO8859-9"; +			break; +		case 0x06: +			charset = "ISO8859-10"; +			break; +		case 0x07: +			charset = "ISO8859-11"; +			break; +		case 0x09: +			charset = "ISO8859-13"; +			break; +		case 0x0a: +			charset = "ISO8859-14"; +			break; +		case 0x0b: +			charset = "ISO8859-15"; +			break; +		case 0x11: +			charset = "UTF16"; +			break; +		case 0x12: +			charset = "EUC-KR"; +			break; +		case 0x13: +			charset = "GB2312"; +			break; +		case 0x14: +			charset = "GBK"; +			break; +		case 0x15: +			charset = "UTF8"; +			break; +		default: +			used = 0; +			break; +		} +	} +exit: +	*consumed = used; +	return charset; +} diff --git a/lib/libucsi/dvb/types.h b/lib/libucsi/dvb/types.h new file mode 100644 index 0000000..437c7c3 --- /dev/null +++ b/lib/libucsi/dvb/types.h @@ -0,0 +1,127 @@ +/* + * section and descriptor parser + * + * 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 + */ + +#ifndef _UCSI_DVB_TYPES_H +#define _UCSI_DVB_TYPES_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <stdint.h> +#include <time.h> + +typedef uint8_t dvbdate_t[5]; +typedef uint8_t dvbduration_t[3]; +typedef uint8_t dvbhhmm_t[2]; + +/** + * Running status values. + */ +enum { +	DVB_RUNNING_STATUS_NOT_RUNNING			= 0x01, +	DVB_RUNNING_STATUS_FEW_SECONDS			= 0x02, +	DVB_RUNNING_STATUS_PAUSING			= 0x03, +	DVB_RUNNING_STATUS_RUNNING			= 0x04, +}; + +/** + * Convert from a 5 byte DVB UTC date to unix time. + * Note: this functions expects the DVB date in network byte order. + * + * @param d Pointer to DVB date. + * @return The unix timestamp, or -1 if the dvbdate was set to the 'undefined' value + */ +extern time_t dvbdate_to_unixtime(dvbdate_t dvbdate); + +/** + * Convert from a unix timestemp to a 5 byte DVB UTC date. + * Note: this function will always output the DVB date in + * network byte order. + * + * @param unixtime The unix timestamp, or -1 for the 'undefined' value. + * @param utc Pointer to 5 byte DVB date. + */ +extern void unixtime_to_dvbdate(time_t unixtime, dvbdate_t dvbdate); + +/** + * Convert from a DVB BCD duration to a number of seconds. + * + * @param dvbduration Pointer to 3 byte DVB duration. + * @return Number of seconds. + */ +extern int dvbduration_to_seconds(dvbduration_t dvbduration); + +/** + * Convert from a number of seconds to a DVB 3 byte BCD duration. + * + * @param seconds The number of seconds. + * @param dvbduration Pointer to 3 byte DVB duration. + */ +extern void seconds_to_dvbduration(int seconds, dvbduration_t dvbduration); + +/** + * Convert from a DVB BCD HHMM to a number of seconds. + * + * @param dvbduration Pointer to 2 byte DVB HHMM. + * @return Number of seconds. + */ +extern int dvbhhmm_to_seconds(dvbhhmm_t dvbhhmm); + +/** + * Convert from a number of seconds to a DVB 2 byte BCD HHMM. + * + * @param seconds The number of seconds. + * @param dvbduration Pointer to 2 byte DVB HHMM. + */ +extern void seconds_to_dvbhhmm(int seconds, dvbhhmm_t dvbhhmm); + +/** + * Convert a __ucsi_packed BCD value into a normal integer. + * + * @param bcd The value to convert. + * @return The value. + */ +extern uint32_t bcd_to_integer(uint32_t bcd); + +/** + * Convert a normal integer into a __ucsi_packed BCD value. + * + * @param integer The value to convert. + * @return The value. + */ +extern uint32_t integer_to_bcd(uint32_t integer); + +/** + * Determine the (iconv compatable) character set of a dvb string. + * + * @param dvb_text DVB text concerned. + * @param dvb_text_length Length of text. + * @param consumed Out parameter of number of bytes used to encode the character set. + * @return Name of the character set. + */ +extern const char *dvb_charset(char *dvb_text, int dvb_text_length, int *consumed); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/vbi_data_descriptor.h b/lib/libucsi/dvb/vbi_data_descriptor.h new file mode 100644 index 0000000..b1d8703 --- /dev/null +++ b/lib/libucsi/dvb/vbi_data_descriptor.h @@ -0,0 +1,186 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_VBI_DATA_DESCRIPTOR +#define _UCSI_DVB_VBI_DATA_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * Possible values for the data_service_id field. + */ +enum { +	DVB_VBI_DATA_SERVICE_ID_EBU		= 0x01, +	DVB_VBI_DATA_SERVICE_ID_INVERTED	= 0x02, +	DVB_VBI_DATA_SERVICE_ID_VPS		= 0x04, +	DVB_VBI_DATA_SERVICE_ID_WSS		= 0x05, +	DVB_VBI_DATA_SERVICE_ID_CC		= 0x06, +	DVB_VBI_DATA_SERVICE_ID_MONO_422	= 0x07, +}; + +/** + * dvb_vbi_data_descriptor structure + */ +struct dvb_vbi_data_descriptor { +	struct descriptor d; + +	/* struct dvb_vbi_data_entry entries[] */ +} __ucsi_packed; + +/** + * An entry in the dvb_vbi_data_descriptor entries field. + */ +struct dvb_vbi_data_entry { +	uint8_t data_service_id; +	uint8_t data_length; +	/* uint8_t data[] */ +} __ucsi_packed; + +/** + * Format of the dvb_vbi_data_entry data field, if data_service_id == 1,2,4,5,6,7. + */ +struct dvb_vbi_data_x { +  EBIT3(uint8_t reserved 	: 2; , +	uint8_t field_parity 	: 1; , +	uint8_t line_offset	: 5; ); +} __ucsi_packed; + +/** + * Process a dvb_vbi_data_descriptor. + * + * @param d Generic descriptor structure. + * @return dvb_vbi_data_descriptor pointer, or NULL on error. + */ +static inline struct dvb_vbi_data_descriptor* +	dvb_vbi_data_descriptor_codec(struct descriptor* d) +{ +	uint8_t* p = (uint8_t*) d + 2; +	uint32_t pos = 0; +	uint32_t len = d->len; + +	while(pos < len) { +		struct dvb_vbi_data_entry *e = +			(struct dvb_vbi_data_entry*) (p+pos); + +		pos += sizeof(struct dvb_vbi_data_entry); + +		if (pos > len) +			return NULL; + +		pos += e->data_length; + +		if (pos > len) +			return NULL; +	} + +	return (struct dvb_vbi_data_descriptor*) d; +} + +/** + * Iterator for entries field in a dvb_vbi_data_descriptor structure. + * + * @param d Pointer to dvb_vbi_data_descriptor structure. + * @param pos Variable holding pointer to the current dvb_vbi_data_entry structure. + */ +#define dvb_vbi_data_descriptor_entries_for_each(d, pos) \ +	for ((pos) = dvb_vbi_data_descriptor_entries_first(d); \ +	     (pos); \ +	     (pos) = dvb_vbi_data_descriptor_entries_next(d, pos)) + +/** + * Get a pointer to the data field of a dvb_vbi_data_entry. + * + * @param d dvb_vbi_data_entry structure. + * @return Pointer to the data field. + */ +static inline uint8_t * +	dvb_vbi_data_entry_data(struct dvb_vbi_data_entry *d) +{ +	return (uint8_t *) d + sizeof(struct dvb_vbi_data_entry); +} + +/** + * Get a pointer to the data field of a dvb_vbi_data_x for id 1,2,4,5,6,7. + * + * @param d dvb_vbi_data_entry structure. + * @return Pointer to the data field, or NULL if invalid + */ +static inline struct dvb_vbi_data_x* +	dvb_vbi_data_entry_data_x(struct dvb_vbi_data_entry *d) +{ +	switch(d->data_service_id) { +	case 1: +	case 2: +	case 4: +	case 5: +	case 6: +	case 7: +		return (struct dvb_vbi_data_x*) ((uint8_t *) d + sizeof(struct dvb_vbi_data_entry)); +	} + +	return NULL; +} + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_vbi_data_entry* +	dvb_vbi_data_descriptor_entries_first(struct dvb_vbi_data_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_vbi_data_entry *) +		((uint8_t*) d + sizeof(struct dvb_vbi_data_descriptor)); +} + +static inline struct dvb_vbi_data_entry* +	dvb_vbi_data_descriptor_entries_next(struct dvb_vbi_data_descriptor *d, +					     struct dvb_vbi_data_entry *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_vbi_data_entry) + +			pos->data_length; + +	if (next >= end) +		return NULL; + +	return (struct dvb_vbi_data_entry *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/dvb/vbi_teletext_descriptor.h b/lib/libucsi/dvb/vbi_teletext_descriptor.h new file mode 100644 index 0000000..fd779d7 --- /dev/null +++ b/lib/libucsi/dvb/vbi_teletext_descriptor.h @@ -0,0 +1,116 @@ +/* + * 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 + */ + +#ifndef _UCSI_DVB_VBI_TELETEXT_DESCRIPTOR +#define _UCSI_DVB_VBI_TELETEXT_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + +/** + * dvb_vbi_teletext_descriptor structure + */ +struct dvb_vbi_teletext_descriptor { +	struct descriptor d; + +	/* struct dvb_vbi_teletext_entry entries[] */ +} __ucsi_packed; + +/** + * An entry in a dvb_vbi_teletext_descriptor structure. + */ +struct dvb_vbi_teletext_entry { +	iso639lang_t language_code; +  EBIT2(uint8_t type		: 5; , +	uint8_t magazine_number: 3;  ); +	uint8_t page_number; +} __ucsi_packed; + +/** + * Process an dvb_vbi_teletext_descriptor. + * + * @param d Generic descriptor. + * @return dvb_vbi_teletext_descriptor pointer, or NULL on error. + */ +static inline struct dvb_vbi_teletext_descriptor* +	dvb_vbi_teletext_descriptor_codec(struct descriptor* d) +{ +	if (d->len % sizeof(struct dvb_vbi_teletext_entry)) +		return NULL; + +	return (struct dvb_vbi_teletext_descriptor*) d; +} + +/** + * Iterator for entries field of a dvb_vbi_teletext_descriptor. + * + * @param d Pointer to dvb_vbi_teletext_descriptor. + * @param pos Variable holding a pointer to the current dvb_vbi_teletext_entry. + */ +#define dvb_vbi_teletext_descriptor_entries_for_each(d, pos) \ +	for ((pos) = dvb_vbi_teletext_descriptor_entries_first(d); \ +	     (pos); \ +	     (pos) = dvb_vbi_teletext_descriptor_entries_next(d, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct dvb_vbi_teletext_entry* +	dvb_vbi_teletext_descriptor_entries_first(struct dvb_vbi_teletext_descriptor *d) +{ +	if (d->d.len == 0) +		return NULL; + +	return (struct dvb_vbi_teletext_entry *) +		((uint8_t*) d +	sizeof(struct dvb_vbi_teletext_descriptor)); +} + +static inline struct dvb_vbi_teletext_entry* +	dvb_vbi_teletext_descriptor_entries_next(struct dvb_vbi_teletext_descriptor *d, +					         struct dvb_vbi_teletext_entry *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct dvb_vbi_teletext_entry); + +	if (next >= end) +		return NULL; + +	return (struct dvb_vbi_teletext_entry *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif | 
