diff options
Diffstat (limited to 'lib/libucsi/mpeg')
46 files changed, 4730 insertions, 0 deletions
| diff --git a/lib/libucsi/mpeg/Makefile b/lib/libucsi/mpeg/Makefile new file mode 100644 index 0000000..ace8808 --- /dev/null +++ b/lib/libucsi/mpeg/Makefile @@ -0,0 +1,65 @@ +# Makefile for linuxtv.org dvb-apps/lib/libucsi/mpeg + +.PHONY: sub-error-mpeg + +sub-error-mpeg: +	$(error You can't use this makefile directly.) + +ifneq ($(lib_name),) + +objects += mpeg/cat_section.o      \ +           mpeg/metadata_section.o \ +           mpeg/odsmt_section.o    \ +           mpeg/pat_section.o      \ +           mpeg/pmt_section.o      \ +           mpeg/tsdt_section.o + +sub-install += mpeg + +else + +includes = audio_stream_descriptor.h                 \ +           ca_descriptor.h                           \ +           cat_section.h                             \ +           content_labelling_descriptor.h            \ +           copyright_descriptor.h                    \ +           data_stream_alignment_descriptor.h        \ +           descriptor.h                              \ +           external_es_id_descriptor.h               \ +           fmc_descriptor.h                          \ +           fmxbuffer_size_descriptor.h               \ +           hierarchy_descriptor.h                    \ +           ibp_descriptor.h                          \ +           iod_descriptor.h                          \ +           iso_639_language_descriptor.h             \ +           maximum_bitrate_descriptor.h              \ +           metadata_descriptor.h                     \ +           metadata_pointer_descriptor.h             \ +           metadata_section.h                        \ +           metadata_std_descriptor.h                 \ +           mpeg4_audio_descriptor.h                  \ +           mpeg4_video_descriptor.h                  \ +           multiplex_buffer_descriptor.h             \ +           multiplex_buffer_utilization_descriptor.h \ +           muxcode_descriptor.h                      \ +           odsmt_section.h                           \ +           pat_section.h                             \ +           pmt_section.h                             \ +           private_data_indicator_descriptor.h       \ +           registration_descriptor.h                 \ +           section.h                                 \ +           sl_descriptor.h                           \ +           smoothing_buffer_descriptor.h             \ +           std_descriptor.h                          \ +           system_clock_descriptor.h                 \ +           target_background_grid_descriptor.h       \ +           tsdt_section.h                            \ +           types.h                                   \ +           video_stream_descriptor.h                 \ +           video_window_descriptor.h + +include ../../../Make.rules + +lib_name = libucsi/mpeg + +endif diff --git a/lib/libucsi/mpeg/audio_stream_descriptor.h b/lib/libucsi/mpeg/audio_stream_descriptor.h new file mode 100644 index 0000000..7e6ea07 --- /dev/null +++ b/lib/libucsi/mpeg/audio_stream_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_MPEG_AUDIO_STREAM_DESCRIPTOR +#define _UCSI_MPEG_AUDIO_STREAM_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg_audio_stream_descriptor structure + */ +struct mpeg_audio_stream_descriptor { +	struct descriptor d; + +  EBIT5(uint8_t free_format_flag		: 1; , +	uint8_t id				: 1; , +	uint8_t layer				: 2; , +	uint8_t variable_rate_audio_indicator	: 1; , +	uint8_t reserved			: 3; ); +} __ucsi_packed; + +/** + * Process an mpeg_audio_stream_descriptor. + * + * @param d Pointer to the generic descriptor structure. + * @return Pointer to the mpeg_audio_stream_descriptor structure, or NULL on error. + */ +static inline struct mpeg_audio_stream_descriptor* +	mpeg_audio_stream_descriptor_codec(struct descriptor *d) +{ +	if (d->len != (sizeof(struct mpeg_audio_stream_descriptor) - 2)) +		return NULL; + +	return (struct mpeg_audio_stream_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/ca_descriptor.h b/lib/libucsi/mpeg/ca_descriptor.h new file mode 100644 index 0000000..88a65dd --- /dev/null +++ b/lib/libucsi/mpeg/ca_descriptor.h @@ -0,0 +1,91 @@ +/* + * 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_MPEG_CA_DESCRIPTOR +#define _UCSI_MPEG_CA_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg_ca_descriptor structure + */ +struct mpeg_ca_descriptor { +	struct descriptor d; + +	uint16_t ca_system_id; +  EBIT2(uint16_t reserved	: 3;  , +	uint16_t ca_pid		: 13; ); +	/* uint8_t  data[] */ +} __ucsi_packed; + +/** + * Process an mpeg_ca_descriptor. + * + * @param d Generic descriptor. + * @return Pointer to an mpeg_ca_descriptor, or NULL on error. + */ +static inline struct mpeg_ca_descriptor* +	mpeg_ca_descriptor_codec(struct descriptor* d) +{ +	if (d->len < (sizeof(struct mpeg_ca_descriptor) - 2)) +		return NULL; + +	bswap16((uint8_t*) d + 2); +	bswap16((uint8_t*) d + 4); + +	return (struct mpeg_ca_descriptor*) d; +} + +/** + * Accessor for pointer to data field of an mpeg_ca_descriptor. + * + * @param d The mpeg_ca_descriptor structure. + * @return Pointer to the field. + */ +static inline uint8_t * +	mpeg_ca_descriptor_data(struct mpeg_ca_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct mpeg_ca_descriptor); +} + +/** + * Determine length of data field of an mpeg_ca_descriptor. + * + * @param d The mpeg_ca_descriptor structure. + * @return Length of the field in bytes. + */ +static inline int +	mpeg_ca_descriptor_data_length(struct mpeg_ca_descriptor *d) +{ +	return d->d.len - 4; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/cat_section.c b/lib/libucsi/mpeg/cat_section.c new file mode 100644 index 0000000..8c974b8 --- /dev/null +++ b/lib/libucsi/mpeg/cat_section.c @@ -0,0 +1,34 @@ +/* + * 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/mpeg/cat_section.h> + +struct mpeg_cat_section * mpeg_cat_section_codec(struct section_ext * ext) +{ +	uint8_t * buf = (uint8_t *)ext; +	size_t pos = sizeof(struct section_ext); + +	if (verify_descriptors(buf + pos, +	    		       section_ext_length(ext) - sizeof(struct mpeg_cat_section))) +		return NULL; + +	return (struct mpeg_cat_section *)ext; +} diff --git a/lib/libucsi/mpeg/cat_section.h b/lib/libucsi/mpeg/cat_section.h new file mode 100644 index 0000000..7ed34a3 --- /dev/null +++ b/lib/libucsi/mpeg/cat_section.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_MPEG_CAT_SECTION_H +#define _UCSI_MPEG_CAT_SECTION_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/section.h> + +/** + * mpeg_cat_section structure. + */ +struct mpeg_cat_section { +	struct section_ext head; + +	/* struct descriptor descriptors[] */ +} __ucsi_packed; + +/** + * Process an mpeg_cat_section. + * + * @param section The generic section_ext structure. + * @return Pointer to an mpeg_cat_section structure, or NULL on error. + */ +extern struct mpeg_cat_section *mpeg_cat_section_codec(struct section_ext *section); + +/** + * Convenience iterator for descriptors field of an mpeg_cat_section. + * + * @param cat The mpeg_cat_section pointer. + * @param pos Variable holding a pointer to the current descriptor. + */ +#define mpeg_cat_section_descriptors_for_each(cat, pos) \ +	for ((pos) = mpeg_cat_section_descriptors_first(cat); \ +	     (pos); \ +	     (pos) = mpeg_cat_section_descriptors_next(cat, pos)) + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct descriptor * +	mpeg_cat_section_descriptors_first(struct mpeg_cat_section *cat) +{ +	size_t pos = sizeof(struct mpeg_cat_section); + +	if (pos >= section_ext_length(&cat->head)) +		return NULL; + +	return (struct descriptor*)((uint8_t *) cat + pos); +} + + +static inline struct descriptor * +	mpeg_cat_section_descriptors_next(struct mpeg_cat_section *cat, +					  struct descriptor* pos) +{ +	return next_descriptor((uint8_t *) cat + sizeof(struct mpeg_cat_section), +			       section_ext_length(&cat->head) - sizeof(struct mpeg_cat_section), +			       pos); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/content_labelling_descriptor.h b/lib/libucsi/mpeg/content_labelling_descriptor.h new file mode 100644 index 0000000..06738ab --- /dev/null +++ b/lib/libucsi/mpeg/content_labelling_descriptor.h @@ -0,0 +1,356 @@ +/* + * 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_MPEG_CONTENT_LABELLING_DESCRIPTOR +#define _UCSI_MPEG_CONTENT_LABELLING_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * Possible values for content_time_base_indicator. + */ +enum { +	MPEG_CONTENT_TIME_BASE_STC			= 0x01, +	MPEG_CONTENT_TIME_BASE_NPT			= 0x02, +}; + +/** + * mpeg_content_labelling_descriptor structure. + */ +struct mpeg_content_labelling_descriptor { +	struct descriptor d; + +	uint16_t metadata_application_format; +	/* struct mpeg_content_labelling_descriptor_application_format_identifier id */ +	/* struct mpeg_content_labelling_descriptor_flags flags */ +	/* struct mpeg_content_labelling_descriptor_reference_id reference_id */ +	/* struct mpeg_content_labelling_descriptor_time_base time_base */ +	/* struct mpeg_content_labelling_descriptor_content_id content_id */ +	/* struct mpeg_content_labelling_descriptor_time_base_association time_base_assoc */ +	/* uint8_t private_data[] */ +} __ucsi_packed; + +/** + * id field of a content_labelling_descriptor. + */ +struct mpeg_content_labelling_descriptor_application_format_identifier { +	uint32_t id; +} __ucsi_packed; + +/** + * Flags field of a content_labelling_descriptor + */ +struct mpeg_content_labelling_descriptor_flags { +  EBIT3(uint8_t content_reference_id_record_flag		: 1;  , +	uint8_t content_time_base_indicator			: 4;  , +	uint8_t reserved					: 3;  ); +} __ucsi_packed; + +/** + * Reference_id field of a content_labelling_descriptor. + */ +struct mpeg_content_labelling_descriptor_reference_id { +	uint8_t content_reference_id_record_length; +	/* uint8_t data[] */ +} __ucsi_packed; + +/** + * time_base field of a content_labelling_descriptor. + */ +struct mpeg_content_labelling_descriptor_time_base { +  EBIT2(uint64_t reserved_1					: 7;  , +	uint64_t content_time_base_value			:33;  ); +  EBIT2(uint64_t reserved_2					: 7;  , +	uint64_t metadata_time_base_value			:33;  ); +} __ucsi_packed; + +/** + * content_id field of a content_labelling_descriptor. + */ +struct mpeg_content_labelling_descriptor_content_id { +  EBIT2(uint8_t reserved					: 1;  , +	uint8_t contentId					: 7;  ); +} __ucsi_packed; + +/** + * time_base_assoc field of a content_labelling_descriptor. + */ +struct mpeg_content_labelling_descriptor_time_base_association { +	uint8_t time_base_association_data_length; +	/* uint8_t data[] */ +} __ucsi_packed; + + + +/** + * Process an mpeg_content_labelling_descriptor. + * + * @param d Generic descriptor. + * @return Pointer to an mpeg_content_labelling_descriptor, or NULL on error. + */ +static inline struct mpeg_content_labelling_descriptor* +	mpeg_content_labelling_descriptor_codec(struct descriptor* d) +{ +	uint32_t pos = 2; +	uint8_t *buf = (uint8_t*) d; +	uint32_t len = d->len + 2; +	struct mpeg_content_labelling_descriptor_flags *flags; +	int id; + +	if (len < sizeof(struct mpeg_content_labelling_descriptor)) +		return NULL; + +	bswap16(buf + pos); +	id = *((uint16_t*) (buf+pos)); +	pos += 2; + +	if (id == 0xffff) { +		if (len < (pos+4)) +			return NULL; +		bswap32(buf+pos); +		pos += 4; +	} + +	if (len < (pos + sizeof(struct mpeg_content_labelling_descriptor_flags))) +		return NULL; +	flags = (struct mpeg_content_labelling_descriptor_flags*) (buf+pos); +	pos += sizeof(struct mpeg_content_labelling_descriptor_flags); + +	if (flags->content_reference_id_record_flag == 1) { +		if (len < (pos+1)) +			return NULL; +		if (len < (pos+1+buf[pos])) +			return NULL; +		pos += 1 + buf[pos]; +	} + +	if ((flags->content_time_base_indicator == 1) || +	    (flags->content_time_base_indicator == 2)) { +		if (len < (pos + sizeof(struct mpeg_content_labelling_descriptor_time_base))) +			return NULL; +		bswap40(buf+pos); +		bswap40(buf+pos+5); +		pos += sizeof(struct mpeg_content_labelling_descriptor_time_base); +	} + +	if (flags->content_time_base_indicator == 2) { +		if (len < (pos + sizeof(struct mpeg_content_labelling_descriptor_content_id))) +			return NULL; +		pos += sizeof(struct mpeg_content_labelling_descriptor_content_id); +	} + +	if (flags->content_time_base_indicator > 2) { +		if (len < (pos+1)) +			return NULL; +		if (len < (pos+1+buf[pos])) +			return NULL; +		pos += 1 + buf[pos]; +	} + +	if (len < pos) +		return NULL; + +	return (struct mpeg_content_labelling_descriptor*) d; +} + +/** + * Accessor for pointer to id field of an mpeg_content_labelling_descriptor. + * + * @param d The mpeg_content_labelling_descriptor structure. + * @return The pointer, or NULL on error. + */ +static inline struct mpeg_content_labelling_descriptor_application_format_identifier* +	mpeg_content_labelling_descriptor_id(struct mpeg_content_labelling_descriptor *d) +{ +	uint8_t *buf = (uint8_t*) d; + +	if (d->metadata_application_format != 0xffff) +		return NULL; +	return (struct mpeg_content_labelling_descriptor_application_format_identifier*) +		(buf + sizeof(struct mpeg_content_labelling_descriptor)); +} + +/** + * Accessor for pointer to flags field of an mpeg_content_labelling_descriptor. + * + * @param d The mpeg_content_labelling_descriptor structure. + * @return The pointer, or NULL on error. + */ +static inline struct mpeg_content_labelling_descriptor_flags* +        mpeg_content_labelling_descriptor_flags(struct mpeg_content_labelling_descriptor *d) +{ +	uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_content_labelling_descriptor); + +	if (d->metadata_application_format != 0xffff) +		buf += 4; + +	return (struct mpeg_content_labelling_descriptor_flags *) buf; +} + +/** + * Accessor for reference_id field of an mpeg_content_labelling_descriptor. + * + * @param flags Pointer to the mpeg_content_labelling_descriptor_flags. + * @return Pointer to the field, or NULL on error. + */ +static inline struct mpeg_content_labelling_descriptor_reference_id* +	mpeg_content_labelling_descriptor_reference_id(struct mpeg_content_labelling_descriptor_flags *flags) +{ +	uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_content_labelling_descriptor_flags); + +	if (flags->content_reference_id_record_flag != 1) +		return NULL; + +	return (struct mpeg_content_labelling_descriptor_reference_id *) buf; +} + +/** + * Accessor for data field of an mpeg_content_reference_id. + * + * @param d The mpeg_content_reference_id structure. + * @return Pointer to the field. + */ +static inline uint8_t* +	mpeg_content_reference_id_data(struct mpeg_content_labelling_descriptor_reference_id *d) +{ +	return (uint8_t*) d + sizeof(struct mpeg_content_labelling_descriptor_reference_id); +} + +/** + * Accessor for time_base field of an mpeg_content_labelling_descriptor. + * + * @param flags Pointer to the mpeg_content_labelling_descriptor_flags. + * @return Pointer to the field, or NULL on error. + */ +static inline struct mpeg_content_labelling_descriptor_time_base* +	mpeg_content_labelling_descriptor_time_base(struct mpeg_content_labelling_descriptor_flags *flags) +{ +	uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_content_labelling_descriptor_flags); + +	if ((flags->content_time_base_indicator!=1) && (flags->content_time_base_indicator!=2)) +		return NULL; + +	if (flags->content_reference_id_record_flag == 1) +		buf += 1 + buf[1]; + +	return (struct mpeg_content_labelling_descriptor_time_base *) buf; +} + +/** + * Accessor for content_id field of an mpeg_content_labelling_descriptor. + * + * @param flags Pointer to the mpeg_content_labelling_descriptor_flags. + * @return Pointer to the field, or NULL on error. + */ +static inline struct mpeg_content_labelling_descriptor_content_id* +	mpeg_content_labelling_descriptor_content_id(struct mpeg_content_labelling_descriptor_flags *flags) +{ +	uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_content_labelling_descriptor_flags); + +	if (flags->content_time_base_indicator!=2) +		return NULL; + +	if (flags->content_reference_id_record_flag == 1) +		buf += 1 + buf[1]; +	if ((flags->content_time_base_indicator==1) || (flags->content_time_base_indicator==2)) +		buf += sizeof(struct mpeg_content_labelling_descriptor_time_base); + +	return (struct mpeg_content_labelling_descriptor_content_id *) buf; +} + +/** + * Accessor for time_base_association field of an mpeg_content_labelling_descriptor. + * + * @param flags Pointer to the mpeg_content_labelling_descriptor_flags. + * @return Pointer to the field, or NULL on error. + */ +static inline struct mpeg_content_labelling_descriptor_time_base_association* +	mpeg_content_labelling_descriptor_time_base_assoc(struct mpeg_content_labelling_descriptor_flags *flags) +{ +	uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_content_labelling_descriptor_flags); + +	if (flags->content_time_base_indicator<3) +		return NULL; + +	if (flags->content_reference_id_record_flag == 1) +		buf += 1 + buf[1]; +	if ((flags->content_time_base_indicator==1) || (flags->content_time_base_indicator==2)) +		buf += sizeof(struct mpeg_content_labelling_descriptor_time_base); +	if (flags->content_time_base_indicator==2) +		buf += sizeof(struct mpeg_content_labelling_descriptor_content_id); + +	return (struct mpeg_content_labelling_descriptor_time_base_association *) buf; +} + +/** + * Accessor for data field of an mpeg_time_base_association. + * + * @param d The mpeg_time_base_association structure. + * @return Pointer to the field. + */ +static inline uint8_t* +	mpeg_time_base_association_data(struct mpeg_content_labelling_descriptor_time_base_association *d) +{ +	return (uint8_t*) d + sizeof(struct mpeg_content_labelling_descriptor_time_base_association); +} + + +/** + * Accessor for private_data field of an mpeg_content_labelling_descriptor. + * + * @param d The mpeg_content_labelling_descriptor structure. + * @param flags Pointer to the mpeg_content_labelling_descriptor_flags. + * @param length Where the number of bytes in the field should be stored. + * @return Pointer to the field. + */ +static inline uint8_t* +	mpeg_content_labelling_descriptor_data(struct mpeg_content_labelling_descriptor *d, +					       struct mpeg_content_labelling_descriptor_flags *flags, +					       int *length) +{ +	uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_content_labelling_descriptor_flags); +	uint8_t *end = (uint8_t*) d + d->d.len + 2; + +	if (flags->content_reference_id_record_flag == 1) +		buf += 1 + buf[1]; +	if ((flags->content_time_base_indicator==1) || (flags->content_time_base_indicator==2)) +		buf += sizeof(struct mpeg_content_labelling_descriptor_time_base); +	if (flags->content_time_base_indicator==2) +		buf += sizeof(struct mpeg_content_labelling_descriptor_content_id); +	if (flags->content_time_base_indicator<3) +		buf += 1 + buf[1]; + +	*length = end - buf; + +	return buf; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/copyright_descriptor.h b/lib/libucsi/mpeg/copyright_descriptor.h new file mode 100644 index 0000000..5991fe9 --- /dev/null +++ b/lib/libucsi/mpeg/copyright_descriptor.h @@ -0,0 +1,89 @@ +/* + * 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_MPEG_COPYRIGHT_DESCRIPTOR +#define _UCSI_MPEG_COPYRIGHT_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg_copyright_descriptor structure. + */ +struct mpeg_copyright_descriptor { +	struct descriptor d; + +	uint32_t copyright_identifier; +	/* uint8_t data[] */ +} __ucsi_packed; + +/** + * Process an mpeg_copyright_descriptor. + * + * @param d Generic descriptor. + * @return mpeg_copyright_descriptor pointer, or NULL on error. + */ +static inline struct mpeg_copyright_descriptor* +	mpeg_copyright_descriptor_codec(struct descriptor* d) +{ +	if (d->len < (sizeof(struct mpeg_copyright_descriptor) - 2)) +		return NULL; + +	bswap32((uint8_t*) d + 2); + +	return (struct mpeg_copyright_descriptor*) d; +} + +/** + * Retrieve pointer to data field of an mpeg_copyright_descriptor. + * + * @param d mpeg_copyright_descriptor pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +	mpeg_copyright_descriptor_data(struct mpeg_copyright_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct mpeg_copyright_descriptor); +} + + +/** + * Determine length of the data field of an mpeg_copyright_descriptor. + * + * @param d mpeg_copyright_descriptor pointer. + * @return Length of field in bytes. + */ +static inline int +	mpeg_copyright_descriptor_data_length(struct mpeg_copyright_descriptor *d) +{ +	return d->d.len - 4; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/data_stream_alignment_descriptor.h b/lib/libucsi/mpeg/data_stream_alignment_descriptor.h new file mode 100644 index 0000000..887495f --- /dev/null +++ b/lib/libucsi/mpeg/data_stream_alignment_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_MPEG_DATA_STREAM_ALIGNMENT_DESCRIPTOR +#define _UCSI_MPEG_DATA_STREAM_ALIGNMENT_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * Possible values for alignment_type. + */ +enum { +	MPEG_DATA_STREAM_ALIGNMENT_VIDEO_SLICE_OR_AU		= 0x01, +	MPEG_DATA_STREAM_ALIGNMENT_VIDEO_AU			= 0x02, +	MPEG_DATA_STREAM_ALIGNMENT_VIDEO_GOP_OR_SEQ		= 0x03, +	MPEG_DATA_STREAM_ALIGNMENT_VIDEO_SEQ			= 0x04, + +	MPEG_DATA_STREAM_ALIGNMENT_AUDIO_SYNC_WORD		= 0x01, +}; + +/** + * mpeg_data_stream_alignment_descriptor structure. + */ +struct mpeg_data_stream_alignment_descriptor { +	struct descriptor d; + +	uint8_t alignment_type; +} __ucsi_packed; + +/** + * Process an mpeg_data_stream_alignment_descriptor. + * + * @param d Pointer to generic descriptor structure. + * @return Pointer to mpeg_data_stream_alignment_descriptor, or NULL on error. + */ +static inline struct mpeg_data_stream_alignment_descriptor* +	mpeg_data_stream_alignment_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct mpeg_data_stream_alignment_descriptor) - 2)) +		return NULL; + +	return (struct mpeg_data_stream_alignment_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/descriptor.h b/lib/libucsi/mpeg/descriptor.h new file mode 100644 index 0000000..c32775f --- /dev/null +++ b/lib/libucsi/mpeg/descriptor.h @@ -0,0 +1,102 @@ +/* + * 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_MPEG_DESCRIPTOR_H +#define _UCSI_MPEG_DESCRIPTOR_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/mpeg/mpeg4_audio_descriptor.h> +#include <libucsi/mpeg/mpeg4_video_descriptor.h> +#include <libucsi/mpeg/audio_stream_descriptor.h> +#include <libucsi/mpeg/ca_descriptor.h> +#include <libucsi/mpeg/content_labelling_descriptor.h> +#include <libucsi/mpeg/copyright_descriptor.h> +#include <libucsi/mpeg/data_stream_alignment_descriptor.h> +#include <libucsi/mpeg/external_es_id_descriptor.h> +#include <libucsi/mpeg/fmc_descriptor.h> +#include <libucsi/mpeg/fmxbuffer_size_descriptor.h> +#include <libucsi/mpeg/hierarchy_descriptor.h> +#include <libucsi/mpeg/ibp_descriptor.h> +#include <libucsi/mpeg/iod_descriptor.h> +#include <libucsi/mpeg/iso_639_language_descriptor.h> +#include <libucsi/mpeg/maximum_bitrate_descriptor.h> +#include <libucsi/mpeg/metadata_descriptor.h> +#include <libucsi/mpeg/metadata_pointer_descriptor.h> +#include <libucsi/mpeg/metadata_std_descriptor.h> +#include <libucsi/mpeg/multiplex_buffer_descriptor.h> +#include <libucsi/mpeg/multiplex_buffer_utilization_descriptor.h> +#include <libucsi/mpeg/muxcode_descriptor.h> +#include <libucsi/mpeg/private_data_indicator_descriptor.h> +#include <libucsi/mpeg/registration_descriptor.h> +#include <libucsi/mpeg/sl_descriptor.h> +#include <libucsi/mpeg/smoothing_buffer_descriptor.h> +#include <libucsi/mpeg/std_descriptor.h> +#include <libucsi/mpeg/system_clock_descriptor.h> +#include <libucsi/mpeg/target_background_grid_descriptor.h> +#include <libucsi/mpeg/video_stream_descriptor.h> +#include <libucsi/mpeg/video_window_descriptor.h> +#include <libucsi/endianops.h> + +/** + * Enumeration of MPEG descriptor tags. + */ +enum mpeg_descriptor_tag { +	dtag_mpeg_video_stream			= 0x02, +	dtag_mpeg_audio_stream			= 0x03, +	dtag_mpeg_hierarchy			= 0x04, +	dtag_mpeg_registration			= 0x05, +	dtag_mpeg_data_stream_alignment		= 0x06, +	dtag_mpeg_target_background_grid	= 0x07, +	dtag_mpeg_video_window			= 0x08, +	dtag_mpeg_ca				= 0x09, +	dtag_mpeg_iso_639_language		= 0x0a, +	dtag_mpeg_system_clock			= 0x0b, +	dtag_mpeg_multiplex_buffer_utilization	= 0x0c, +	dtag_mpeg_copyright			= 0x0d, +	dtag_mpeg_maximum_bitrate		= 0x0e, +	dtag_mpeg_private_data_indicator	= 0x0f, +	dtag_mpeg_smoothing_buffer		= 0x10, +	dtag_mpeg_std				= 0x11, +	dtag_mpeg_ibp				= 0x12, +	dtag_mpeg_4_video			= 0x1b, +	dtag_mpeg_4_audio			= 0x1c, +	dtag_mpeg_iod				= 0x1d, +	dtag_mpeg_sl				= 0x1e, +	dtag_mpeg_fmc				= 0x1f, +	dtag_mpeg_external_es_id		= 0x20, +	dtag_mpeg_muxcode			= 0x21, +	dtag_mpeg_fmxbuffer_size		= 0x22, +	dtag_mpeg_multiplex_buffer		= 0x23, +	dtag_mpeg_content_labelling		= 0x24, +	dtag_mpeg_metadata_pointer		= 0x25, +	dtag_mpeg_metadata			= 0x26, +	dtag_mpeg_metadata_std			= 0x27, +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/external_es_id_descriptor.h b/lib/libucsi/mpeg/external_es_id_descriptor.h new file mode 100644 index 0000000..3aa3237 --- /dev/null +++ b/lib/libucsi/mpeg/external_es_id_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_MPEG_EXTERNAL_ES_ID_DESCRIPTOR +#define _UCSI_MPEG_EXTERNAL_ES_ID_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg_external_es_id_descriptor structure. + */ +struct mpeg_external_es_id_descriptor { +	struct descriptor d; + +	uint16_t external_es_id; +} __ucsi_packed; + +/** + * Process an mpeg_external_es_id_descriptor structure. + * + * @param d Generic descriptor structure. + * @return mpeg_external_es_id_descriptor pointer, or NULL on error. + */ +static inline struct mpeg_external_es_id_descriptor* +	mpeg_external_es_id_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct mpeg_external_es_id_descriptor) - 2)) +		return NULL; + +	bswap16((uint8_t*) d + 2); + +	return (struct mpeg_external_es_id_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/fmc_descriptor.h b/lib/libucsi/mpeg/fmc_descriptor.h new file mode 100644 index 0000000..5a5bed2 --- /dev/null +++ b/lib/libucsi/mpeg/fmc_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_MPEG_FMC_DESCRIPTOR +#define _UCSI_MPEG_FMC_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg_fmc_descriptor structure. + */ +struct mpeg_fmc_descriptor { +	struct descriptor d; + +	/* struct mpeg_flex_mux muxes[] */ +} __ucsi_packed; + +/** + * An entry in the muxes field of an mpeg_fmc_descriptor structure. + */ +struct mpeg_flex_mux { +	uint16_t es_id; +	uint8_t flex_mux_channel; +} __ucsi_packed; + +/** + * Process an mpeg_fmc_descriptor structure. + * + * @param d Generic descriptor structure. + * @return Pointer to an mpeg_fmc_descriptor structure, or NULL on error. + */ +static inline struct mpeg_fmc_descriptor* +	mpeg_fmc_descriptor_codec(struct descriptor* d) +{ +	uint8_t* buf = (uint8_t*) d + 2; +	int pos = 0; +	int len = d->len; + +	if (len % sizeof(struct mpeg_flex_mux)) +		return NULL; + +	while(pos < len) { +		bswap16(buf+pos); +		pos += sizeof(struct mpeg_flex_mux); +	} + +	return (struct mpeg_fmc_descriptor*) d; +} + +/** + * Convenience iterator for the muxes field of an mpeg_fmc_descriptor structure. + * + * @param d Generic descriptor structure. + * @param pos Variable holding a pointer to the the current entry within the muxes field. + */ +#define mpeg_fmc_descriptor_muxes_for_each(d, pos) \ +	for ((pos) = mpeg_fmc_descriptor_muxes_first(d); \ +	     (pos); \ +	     (pos) = mpeg_fmc_descriptor_muxes_next(d, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct mpeg_flex_mux* +		mpeg_fmc_descriptor_muxes_first(struct mpeg_fmc_descriptor *d) +{ +	if (d->d.len < sizeof(struct mpeg_flex_mux)) +		return NULL; + +	return (struct mpeg_flex_mux *) +			((uint8_t*) d + sizeof(struct mpeg_fmc_descriptor)); +} + +static inline struct mpeg_flex_mux* +	mpeg_fmc_descriptor_muxes_next(struct mpeg_fmc_descriptor *d, +				       struct mpeg_flex_mux *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct mpeg_flex_mux); + +	if (next >= end) +		return NULL; + +	return (struct mpeg_flex_mux *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/fmxbuffer_size_descriptor.h b/lib/libucsi/mpeg/fmxbuffer_size_descriptor.h new file mode 100644 index 0000000..74f643c --- /dev/null +++ b/lib/libucsi/mpeg/fmxbuffer_size_descriptor.h @@ -0,0 +1,83 @@ +/* + * 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_MPEG_FMXBUFFER_SIZE_DESCRIPTOR +#define _UCSI_MPEG_FMXBUFFER_SIZE_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + + +/** + * mpeg_fmxbuffer_size_descriptor structure. + */ +struct mpeg_fmxbuffer_size_descriptor { +	struct descriptor d; + +	/* uint8_t descriptors[] */ +} __ucsi_packed; + +/** + * Process an mpeg_fmxbuffer_size_descriptor structure. + * + * @param d Pointer to a generic descriptor structure. + * @return Pointer to an mpeg_fmxbuffer_size_descriptor structure, or NULL on error. + */ +static inline struct mpeg_fmxbuffer_size_descriptor* +	mpeg_fmxbuffer_size_descriptor_codec(struct descriptor* d) +{ +	return (struct mpeg_fmxbuffer_size_descriptor*) d; +} + +/** + * Retrieve pointer to descriptors field of mpeg_fmxbuffer_size_descriptor structure. + * + * @param d mpeg_fmxbuffer_size_descriptor structure pointer. + * @return Pointer to the descriptors. + */ +static inline uint8_t * +	mpeg_fmxbuffer_size_descriptor_descriptors(struct mpeg_fmxbuffer_size_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct mpeg_fmxbuffer_size_descriptor); +} + +/** + * Calculate the length of the descriptors field of an mpeg_fmxbuffer_size_descriptor structure. + * + * @param d mpeg_fmxbuffer_size_descriptor structure pointer. + * @return Length of descriptors in bytes. + */ +static inline int +	mpeg_fmxbuffer_size_descriptor_descriptors_length(struct mpeg_fmxbuffer_size_descriptor *d) +{ +	return d->d.len; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/hierarchy_descriptor.h b/lib/libucsi/mpeg/hierarchy_descriptor.h new file mode 100644 index 0000000..a38539d --- /dev/null +++ b/lib/libucsi/mpeg/hierarchy_descriptor.h @@ -0,0 +1,83 @@ +/* + * 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_MPEG_HIERARCHY_DESCRIPTOR +#define _UCSI_MPEG_HIERARCHY_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * Hierarchy type values. + */ +enum { +	MPEG_HIERARCHY_TYPE_ISO13818_2_SPATIAL_SCALABILITY 	= 0x01, +	MPEG_HIERARCHY_TYPE_ISO13818_2_SNR_SCALABILITY 		= 0x02, +	MPEG_HIERARCHY_TYPE_ISO13818_2_TEMPORAL_SCALABILITY 	= 0x03, +	MPEG_HIERARCHY_TYPE_ISO13818_2_DATA_PARTITIONING 	= 0x04, +	MPEG_HIERARCHY_TYPE_ISO13818_3_EXTENSION_BITSTREAM 	= 0x05, +	MPEG_HIERARCHY_TYPE_ISO13818_1_PRIVATE_BITSTREAM 	= 0x06, +	MPEG_HIERARCHY_TYPE_ISO13818_2_MULTI_VIEW_PROFILE 	= 0x07, +	MPEG_HIERARCHY_TYPE_BASE_LAYER		 		= 0x0f, +}; + + +/** + * mpeg_hierarchy_descriptor structure. + */ +struct mpeg_hierarchy_descriptor { +	struct descriptor d; + +  EBIT2(uint8_t reserved_1			: 4; , +	uint8_t hierarchy_type			: 4; ); +  EBIT2(uint8_t reserved_2			: 2; , +	uint8_t hierarchy_layer_index		: 6; ); +  EBIT2(uint8_t reserved_3			: 2; , +	uint8_t hierarchy_embedded_layer_index	: 6; ); +  EBIT2(uint8_t reserved_4			: 2; , +	uint8_t hierarchy_channel		: 6; ); +} __ucsi_packed; + +/** + * Process an mpeg_hierarchy_descriptor. + * + * @param d Generic descriptor structure. + * @return Pointer to mpeg_hierarchy_descriptor structure, or NULL on error. + */ +static inline struct mpeg_hierarchy_descriptor* +	mpeg_hierarchy_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct mpeg_hierarchy_descriptor) - 2)) +		return NULL; + +	return (struct mpeg_hierarchy_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/ibp_descriptor.h b/lib/libucsi/mpeg/ibp_descriptor.h new file mode 100644 index 0000000..e82780a --- /dev/null +++ b/lib/libucsi/mpeg/ibp_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_MPEG_IBP_DESCRIPTOR +#define _UCSI_MPEG_IBP_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg_ibp_descriptor structure. + */ +struct mpeg_ibp_descriptor { +	struct descriptor d; + +  EBIT3(uint16_t closed_gop_flag	: 1;  , +	uint16_t identical_gop_flag	: 1;  , +	uint16_t max_gop_length		: 14; ); +} __ucsi_packed; + +/** + * Process an mpeg_ibp_descriptor structure. + * + * @param d Generic descriptor structure. + * @return Pointer to the mpeg_ibp_descriptor structure, or NULL on error. + */ +static inline struct mpeg_ibp_descriptor* +	mpeg_ibp_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct mpeg_ibp_descriptor) - 2)) +		return NULL; + +	bswap16((uint8_t*) d + 2); + +	return (struct mpeg_ibp_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/iod_descriptor.h b/lib/libucsi/mpeg/iod_descriptor.h new file mode 100644 index 0000000..61de153 --- /dev/null +++ b/lib/libucsi/mpeg/iod_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_MPEG_IOD_DESCRIPTOR +#define _UCSI_MPEG_IOD_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg_iod_descriptor structure. + */ +struct mpeg_iod_descriptor { +	struct descriptor d; + +	uint8_t scope_of_iod_label; +	uint8_t iod_label; +	/* uint8_t iod[] */ +} __ucsi_packed; + +/** + * Process an mpeg_iod_descriptor. + * + * @param d Generic descriptor structure. + * @return Pointer to an mpeg_iod_descriptor structure, or NULL on error. + */ +static inline struct mpeg_iod_descriptor* +	mpeg_iod_descriptor_codec(struct descriptor* d) +{ +	if (d->len < (sizeof(struct mpeg_iod_descriptor) - 2)) +		return NULL; + +	return (struct mpeg_iod_descriptor*) d; +} + +/** + * Retrieve pointer to iod field of an mpeg_iod_descriptor structure. + * + * @param d Pointer to mpeg_iod_descriptor structure. + * @return Pointer to the iod field. + */ +static inline uint8_t * +	mpeg_iod_descriptor_iod(struct mpeg_iod_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct mpeg_iod_descriptor); +} + +/** + * Calculate the length of the iod field of an mpeg_iod_descriptor structure. + * + * @param d Pointer to mpeg_iod_descriptor structure. + * @return The number of bytes. + */ +static inline int +	mpeg_iod_descriptor_iod_length(struct mpeg_iod_descriptor *d) +{ +	return d->d.len - 2; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/iso_639_language_descriptor.h b/lib/libucsi/mpeg/iso_639_language_descriptor.h new file mode 100644 index 0000000..5b5aac0 --- /dev/null +++ b/lib/libucsi/mpeg/iso_639_language_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_MPEG_ISO_639_LANGUAGE_DESCRIPTOR +#define _UCSI_MPEG_ISO_639_LANGUAGE_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> +#include <libucsi/types.h> + +/** + * Possible values for audio_type. + */ +enum { +	MPEG_AUDIO_TYPE_CLEAN_EFFECTS 			= 0x01, +	MPEG_AUDIO_TYPE_HEARING_IMPAIRED 		= 0x02, +	MPEG_AUDIO_TYPE_VISUAL_IMPAIRED_COMMENTARY 	= 0x03, +}; + +/** + * mpeg_iso_639_language_descriptor structure. + */ +struct mpeg_iso_639_language_descriptor { +	struct descriptor d; + +	/* struct mpeg_iso_639_language_code languages[] */ +} __ucsi_packed; + +/** + * An entry in the mpeg_iso_639_language_descriptor languages field. + */ +struct mpeg_iso_639_language_code { +	iso639lang_t language_code; +	uint8_t audio_type; +} __ucsi_packed; + +/** + * Process an mpeg_iso_639_language_descriptor. + * + * @param d Generic descriptor structure. + * @return Pointer to an mpeg_iso_639_language_descriptor structure, or NULL + * on error. + */ +static inline struct mpeg_iso_639_language_descriptor* +	mpeg_iso_639_language_descriptor_codec(struct descriptor* d) +{ +	if (d->len % sizeof(struct mpeg_iso_639_language_code)) +		return NULL; + +	return (struct mpeg_iso_639_language_descriptor*) d; +} + +/** + * Convenience iterator for the languages field of an mpeg_iso_639_language_descriptor + * + * @param d Pointer to the mpeg_iso_639_language_descriptor structure. + * @param pos Variable holding a pointer to the current entry. + */ +#define mpeg_iso_639_language_descriptor_languages_for_each(_d, _pos) \ +	for ((_pos) = mpeg_iso_639_language_descriptor_languages_first(_d); \ +	     (_pos); \ +	     (_pos) = mpeg_iso_639_language_descriptor_languages_next(_d, _pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct mpeg_iso_639_language_code* +	mpeg_iso_639_language_descriptor_languages_first(struct mpeg_iso_639_language_descriptor *d) +{ +	if (d->d.len < sizeof(struct mpeg_iso_639_language_code)) +		return NULL; + +	return (struct mpeg_iso_639_language_code *) +		((uint8_t*) d + sizeof(struct mpeg_iso_639_language_descriptor)); +} + +static inline struct mpeg_iso_639_language_code* +	mpeg_iso_639_language_descriptor_languages_next(struct mpeg_iso_639_language_descriptor *d, +						        struct mpeg_iso_639_language_code *pos) +{ +	uint8_t *end = (uint8_t*) d + 2 + d->d.len; +	uint8_t *next =	(uint8_t *) pos + sizeof(struct mpeg_iso_639_language_code); + +	if (next >= end) +		return NULL; + +	return (struct mpeg_iso_639_language_code *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/maximum_bitrate_descriptor.h b/lib/libucsi/mpeg/maximum_bitrate_descriptor.h new file mode 100644 index 0000000..e0bcddb --- /dev/null +++ b/lib/libucsi/mpeg/maximum_bitrate_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_MPEG_MAXIMUM_BITRATE_DESCRIPTOR +#define _UCSI_MPEG_MAXIMUM_BITRATE_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg_maximum_bitrate_descriptor structure. + */ +struct mpeg_maximum_bitrate_descriptor { +	struct descriptor d; + +  EBIT2(uint32_t reserved		: 2;  , +	uint32_t maximum_bitrate	: 22; ); +} __ucsi_packed; + +/** + * Process an mpeg_maximum_bitrate_descriptor. + * + * @param d Pointer to generic descriptor structure. + * @return Pointer to mpeg_maximum_bitrate_descriptor, or NULL on error. + */ +static inline struct mpeg_maximum_bitrate_descriptor* +	mpeg_maximum_bitrate_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct mpeg_maximum_bitrate_descriptor) - 2)) +		return NULL; + +	bswap24((uint8_t*) d + 2); + +	return (struct mpeg_maximum_bitrate_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/metadata_descriptor.h b/lib/libucsi/mpeg/metadata_descriptor.h new file mode 100644 index 0000000..5b91e05 --- /dev/null +++ b/lib/libucsi/mpeg/metadata_descriptor.h @@ -0,0 +1,472 @@ +/* + * 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_MPEG_METADATA_DESCRIPTOR +#define _UCSI_MPEG_METADATA_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * Values for the decoder_config_flags field. + */ +enum { +	MPEG_DECODER_CONFIG_NONE				= 0x00, +	MPEG_DECODER_CONFIG_IN_DECODER_CONFIG			= 0x01, +	MPEG_DECODER_CONFIG_SAME_METADATA_SERVICE		= 0x02, +	MPEG_DECODER_CONFIG_DSMCC				= 0x03, +	MPEG_DECODER_CONFIG_SAME_PROGRAM			= 0x04, +}; + +/** + * mpeg_metadata_descriptor structure. + */ +struct mpeg_metadata_descriptor { +	struct descriptor d; + +	uint16_t metadata_application_format; +	/* struct mpeg_metadata_descriptor_application_format_identifier appid */ +	/* uint8_t metadata_format */ +	/* struct mpeg_metadata_descriptor_format_identifier formid */ +	/* struct mpeg_metadata_descriptor_flags flags */ +	/* struct mpeg_metadata_descriptor_service_identifier service_identifier */ +	/* struct mpeg_metadata_descriptor_decoder_config decoder_config */ +	/* struct mpeg_metadata_descriptor_decoder_config_id_record decoder_config_id_record */ +	/* struct mpeg_metadata_descriptor_decoder_config_service_id decoder_config_service_id */ +	/* struct mpeg_metadata_descriptor_decoder_config_reserved decoder_config_reserved */ +	/* uint8_t private_data[] */ +} __ucsi_packed; + +/** + * appid field of a metadata_descriptor. + */ +struct mpeg_metadata_descriptor_application_format_identifier { +	uint32_t id; +} __ucsi_packed; + +/** + * formid field of a metadata_descriptor. + */ +struct mpeg_metadata_descriptor_format_identifier { +	uint32_t id; +} __ucsi_packed; + +/** + * Flags field of a metadata_descriptor + */ +struct mpeg_metadata_descriptor_flags { +	uint8_t metadata_service_id; +  EBIT3(uint8_t decoder_config_flags				: 3;  , +	uint8_t dsm_cc_flag					: 1;  , +	uint8_t reserved					: 4;  ); +} __ucsi_packed; + +/** + * service_identifier field of a metadata_descriptor. + */ +struct mpeg_metadata_descriptor_service_identifier { +	uint8_t service_identification_length; +	/* uint8_t data[] */ +} __ucsi_packed; + +/** + * decoder_config field of a metadata_descriptor. + */ +struct mpeg_metadata_descriptor_decoder_config { +	uint8_t decoder_config_length; +	/* uint8_t data[] */ +} __ucsi_packed; + +/** + * decoder_config_id_record field of a metadata_descriptor. + */ +struct mpeg_metadata_descriptor_decoder_config_id_record { +	uint8_t decoder_config_id_record_length; +	/* uint8_t data[] */ +} __ucsi_packed; + +/** + * decoder_config_service_id field of a metadata_descriptor. + */ +struct mpeg_metadata_descriptor_decoder_config_service_id { +	uint8_t decoder_config_metadata_service_id; +} __ucsi_packed; + +/** + * decoder_config_reserved field of a metadata_descriptor. + */ +struct mpeg_metadata_descriptor_decoder_config_reserved { +	uint8_t reserved_data_length; +	/* uint8_t data[] */ +} __ucsi_packed; + + + + +/** + * Process an mpeg_metadata_descriptor. + * + * @param d Generic descriptor. + * @return Pointer to an mpeg_metadata_descriptor, or NULL on error. + */ +static inline struct mpeg_metadata_descriptor* +	mpeg_metadata_descriptor_codec(struct descriptor* d) +{ +	uint32_t pos = 2; +	uint8_t *buf = (uint8_t*) d; +	uint32_t len = d->len + 2; +	struct mpeg_metadata_descriptor_flags *flags; +	int id; + +	if (len < sizeof(struct mpeg_metadata_descriptor)) +		return NULL; + +	bswap16(buf + pos); +	id = *((uint16_t*) (buf+pos)); +	pos += 2; + +	if (id == 0xffff) { +		if (len < (pos+4)) +			return NULL; +		bswap32(buf+pos); +		pos += 4; +	} + +	if (len < (pos+1)) +		return NULL; + +	id = buf[pos]; +	pos++; +	if (id == 0xff) { +		if (len < (pos+4)) +			return NULL; +		bswap32(buf+pos); +		pos += 4; +	} + +	if (len < (pos + sizeof(struct mpeg_metadata_descriptor_flags))) +		return NULL; +	flags = (struct mpeg_metadata_descriptor_flags*) (buf+pos); +	pos += sizeof(struct mpeg_metadata_descriptor_flags); + +	if (flags->dsm_cc_flag == 1) { +		if (len < (pos+1)) +			return NULL; +		if (len < (pos+1+buf[pos])) +			return NULL; +		pos += 1 + buf[pos]; +	} + +	if (flags->decoder_config_flags == 1) { +		if (len < (pos+1)) +			return NULL; +		if (len < (pos+1+buf[pos])) +			return NULL; +		pos += 1 + buf[pos]; +	} + +	if (flags->decoder_config_flags == 3) { +		if (len < (pos+1)) +			return NULL; +		if (len < (pos+1+buf[pos])) +			return NULL; +		pos += 1 + buf[pos]; +	} + +	if (flags->decoder_config_flags == 4) { +		if (len < (pos+1)) +			return NULL; +		pos++; +	} + +	if ((flags->decoder_config_flags == 5) || +	    (flags->decoder_config_flags == 6)) { +		if (len < (pos+1)) +			return NULL; +		if (len < (pos+1+buf[pos])) +			return NULL; +		pos += 1 + buf[pos]; +	} + +	if (len < pos) +		return NULL; + +	return (struct mpeg_metadata_descriptor*) d; +} + +/** + * Accessor for pointer to appid field of an mpeg_metadata_descriptor. + * + * @param d The mpeg_metadata_descriptor structure. + * @return The pointer, or NULL on error. + */ +static inline struct mpeg_metadata_descriptor_application_format_identifier* +	mpeg_metadata_descriptor_appid(struct mpeg_metadata_descriptor *d) +{ +	uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor); + +	if (d->metadata_application_format != 0xffff) +		return NULL; +	return (struct mpeg_metadata_descriptor_application_format_identifier*) buf; +} + +/** + * Accessor for metadata_format field of an mpeg_metadata_descriptor. + * + * @param d The mpeg_metadata_descriptor structure. + * @return The pointer, or NULL on error. + */ +static inline uint8_t +	mpeg_metadata_descriptor_metadata_format(struct mpeg_metadata_descriptor *d) +{ +	uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor); + +	if (d->metadata_application_format == 0xffff) +		buf+=4; +	return *buf; +} + +/** + * Accessor for pointer to formid field of an mpeg_metadata_descriptor. + * + * @param d The mpeg_metadata_descriptor structure. + * @return The pointer, or NULL on error. + */ +static inline struct mpeg_metadata_descriptor_format_identifier* +        mpeg_metadata_descriptor_formid(struct mpeg_metadata_descriptor *d) +{ +	uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor); + +	if (d->metadata_application_format == 0xffff) +		buf+=4; +	if (*buf != 0xff) +		return NULL; + +	return (struct mpeg_metadata_descriptor_format_identifier*) (buf+1); +} + +/** + * Accessor for flags field of an mpeg_metadata_descriptor. + * + * @param d The mpeg_metadata_descriptor structure. + * @return Pointer to the field, or NULL on error. + */ +static inline struct mpeg_metadata_descriptor_flags* +	mpeg_metadata_descriptor_flags(struct mpeg_metadata_descriptor *d) +{ +	uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor); + +	if (d->metadata_application_format == 0xffff) +		buf+=4; +	if (*buf == 0xff) +		buf+=4; + +	return (struct mpeg_metadata_descriptor_flags*) buf; +} + + +/** + * Accessor for service_identifier field of an mpeg_metadata_descriptor. + * + * @param flags Pointer to the mpeg_metadata_descriptor_flags. + * @return Pointer to the field, or NULL on error. + */ +static inline struct mpeg_metadata_descriptor_service_identifier* + 	mpeg_metadata_descriptor_sevice_identifier(struct mpeg_metadata_descriptor_flags *flags) +{ +	uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_descriptor_flags); + +	if (flags->dsm_cc_flag!=1) +		return NULL; + +	return (struct mpeg_metadata_descriptor_service_identifier *) buf; +} + +/** + * Accessor for data field of an mpeg_metadata_descriptor_service_identifier. + * + * @param d The mpeg_metadata_descriptor_service_identifier structure. + * @return Pointer to the field. + */ +static inline uint8_t* +	mpeg_metadata_descriptor_service_identifier_data(struct mpeg_metadata_descriptor_service_identifier *d) +{ +	return (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor_service_identifier); +} + +/** + * Accessor for decoder_config field of an mpeg_metadata_descriptor. + * + * @param flags Pointer to the mpeg_metadata_descriptor_flags. + * @return Pointer to the field, or NULL on error. + */ +static inline struct mpeg_metadata_descriptor_decoder_config* +	mpeg_metadata_descriptor_decoder_config(struct mpeg_metadata_descriptor_flags *flags) +{ +	uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_descriptor_flags); + +	if (flags->decoder_config_flags != 1) +		return NULL; + +	if (flags->dsm_cc_flag==1) +		buf += 1 + buf[1]; + +	return (struct mpeg_metadata_descriptor_decoder_config*) buf; +} + +/** + * Accessor for data field of an mpeg_metadata_descriptor_service_identifier. + * + * @param d The mpeg_metadata_descriptor_service_identifier structure. + * @return Pointer to the field. + */ +static inline uint8_t* +	mpeg_metadata_descriptor_decoder_config_data(struct mpeg_metadata_descriptor_decoder_config *d) +{ +	return (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor_decoder_config); +} + +/** + * Accessor for decoder_config_id_record field of an mpeg_metadata_descriptor. + * + * @param flags Pointer to the mpeg_metadata_descriptor_flags. + * @return Pointer to the field, or NULL on error. + */ +static inline struct mpeg_metadata_descriptor_decoder_config_id_record* +	mpeg_metadata_descriptor_decoder_config_id_record(struct mpeg_metadata_descriptor_flags *flags) +{ +	uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_descriptor_flags); + +	if (flags->decoder_config_flags != 3) +		return NULL; + +	if (flags->dsm_cc_flag==1) +		buf += 1 + buf[1]; + +	return (struct mpeg_metadata_descriptor_decoder_config_id_record *) buf; +} + +/** + * Accessor for data field of an mpeg_metadata_descriptor_decoder_config_id_record. + * + * @param d The mpeg_metadata_descriptor_decoder_config_id_record structure. + * @return Pointer to the field. + */ +static inline uint8_t* +	mpeg_metadata_descriptor_decoder_config_id_record_data(struct mpeg_metadata_descriptor_decoder_config_id_record *d) +{ +	return (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor_decoder_config_id_record); +} + +/** + * Accessor for decoder_config_service_id field of an mpeg_metadata_descriptor. + * + * @param flags Pointer to the mpeg_metadata_descriptor_flags. + * @return Pointer to the field, or NULL on error. + */ +static inline struct mpeg_metadata_descriptor_decoder_config_service_id* +	mpeg_metadata_descriptor_decoder_config_service_id(struct mpeg_metadata_descriptor_flags *flags) +{ +	uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_descriptor_flags); + +	if (flags->decoder_config_flags != 4) +		return NULL; + +	if (flags->dsm_cc_flag==1) +		buf += 1 + buf[1]; + +	return (struct mpeg_metadata_descriptor_decoder_config_service_id *) buf; +} + +/** + * Accessor for decoder_config_reserved field of an mpeg_metadata_descriptor. + * + * @param flags Pointer to the mpeg_metadata_descriptor_flags. + * @return Pointer to the field, or NULL on error. + */ +static inline struct mpeg_metadata_descriptor_decoder_config_reserved* +	mpeg_metadata_descriptor_decoder_config_reserved(struct mpeg_metadata_descriptor_flags *flags) +{ +	uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_descriptor_flags); + +	if ((flags->decoder_config_flags != 5) && (flags->decoder_config_flags != 6)) +		return NULL; + +	if (flags->dsm_cc_flag==1) +		buf += 1 + buf[1]; + +	return (struct mpeg_metadata_descriptor_decoder_config_reserved *) buf; +} + +/** + * Accessor for data field of an mpeg_metadata_descriptor_decoder_config_reserved. + * + * @param d The mpeg_metadata_descriptor_decoder_config_reserved structure. + * @return Pointer to the field. + */ +static inline uint8_t* +	mpeg_metadata_descriptor_decoder_config_reserved_data(struct mpeg_metadata_descriptor_decoder_config_reserved *d) +{ +	return (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor_decoder_config_reserved); +} + +/** + * Accessor for private_data field of an mpeg_metadata_descriptor. + * + * @param d The mpeg_metadata_descriptor structure. + * @param flags Pointer to the mpeg_metadata_descriptor_flags. + * @param length Where the number of bytes in the field should be stored. + * @return Pointer to the field. + */ +static inline uint8_t* +	mpeg_metadata_descriptor_private_data(struct mpeg_metadata_descriptor *d, +					      struct mpeg_metadata_descriptor_flags *flags, +					      int *length) +{ +	uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_descriptor_flags); +	uint8_t *end = (uint8_t*) d + d->d.len + 2; + + +	if (flags->dsm_cc_flag==1) +		buf += 1 + buf[1]; +	if (flags->decoder_config_flags==1) +		buf += 1 + buf[1]; +	if (flags->decoder_config_flags==3) +		buf += 1 + buf[1]; +	if (flags->decoder_config_flags==4) +		buf++; +	if ((flags->decoder_config_flags==5)||(flags->decoder_config_flags==6)) +		buf += 1 + buf[1]; + +	*length = end - buf; +	return buf; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/metadata_pointer_descriptor.h b/lib/libucsi/mpeg/metadata_pointer_descriptor.h new file mode 100644 index 0000000..e4d7503 --- /dev/null +++ b/lib/libucsi/mpeg/metadata_pointer_descriptor.h @@ -0,0 +1,360 @@ +/* + * 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_MPEG_METADATA_POINTER_DESCRIPTOR +#define _UCSI_MPEG_METADATA_POINTER_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * Possible values for the mpeg_carriage_flags field. + */ +enum { +	MPEG_CARRIAGE_SAME_TS					= 0x00, +	MPEG_CARRIAGE_DIFFERENT_TS				= 0x01, +	MPEG_CARRIAGE_PS					= 0x02, +	MPEG_CARRIAGE_OTHER					= 0x03, +}; + +/** + * mpeg_metadata_pointer_descriptor structure. + */ +struct mpeg_metadata_pointer_descriptor { +	struct descriptor d; + +	uint16_t metadata_application_format; +	/* struct mpeg_metadata_pointer_descriptor_application_format_identifier appid */ +	/* uint8_t metadata_format */ +	/* struct mpeg_metadata_pointer_descriptor_format_identifier formid */ +	/* struct mpeg_metadata_pointer_descriptor_flags flags */ +	/* struct mpeg_metadata_pointer_descriptor_locator locator */ +	/* struct mpeg_metadata_pointer_descriptor_program_number program_number */ +	/* struct mpeg_metadata_pointer_descriptor_carriage carriage */ +	/* uint8_t private_data[] */ +} __ucsi_packed; + +/** + * appid field of a metadata_pointer_descriptor. + */ +struct mpeg_metadata_pointer_descriptor_application_format_identifier { +	uint32_t id; +} __ucsi_packed; + +/** + * formid field of a metadata_pointer_descriptor. + */ +struct mpeg_metadata_pointer_descriptor_format_identifier { +	uint32_t id; +} __ucsi_packed; + +/** + * Flags field of a metadata_pointer_descriptor + */ +struct mpeg_metadata_pointer_descriptor_flags { +	uint8_t metadata_service_id; +  EBIT3(uint8_t metadata_locator_record_flag			: 1;  , +	uint8_t mpeg_carriage_flags				: 2;  , +	uint8_t reserved					: 5;  ); +} __ucsi_packed; + +/** + * Reference_id field of a metadata_pointer_descriptor. + */ +struct mpeg_metadata_pointer_descriptor_locator { +	uint8_t metadata_locator_record_length; +	/* uint8_t data[] */ +} __ucsi_packed; + +/** + * program_number field of a metadata_pointer_descriptor. + */ +struct mpeg_metadata_pointer_descriptor_program_number { +	uint16_t number; +} __ucsi_packed; + +/** + * carriage field of a metadata_pointer_descriptor. + */ +struct mpeg_metadata_pointer_descriptor_carriage { +	uint16_t transport_stream_location; +	uint16_t transport_stream_id; +} __ucsi_packed; + + + + +/** + * Process an mpeg_metadata_pointer_descriptor. + * + * @param d Generic descriptor. + * @return Pointer to an mpeg_metadata_pointer_descriptor, or NULL on error. + */ +static inline struct mpeg_metadata_pointer_descriptor* +	mpeg_metadata_pointer_descriptor_codec(struct descriptor* d) +{ +	uint32_t pos = 2; +	uint8_t *buf = (uint8_t*) d; +	uint32_t len = d->len + 2; +	struct mpeg_metadata_pointer_descriptor_flags *flags; +	int id; + +	if (len < sizeof(struct mpeg_metadata_pointer_descriptor)) +		return NULL; + +	bswap16(buf + pos); +	id = *((uint16_t*) (buf+pos)); +	pos += 2; + +	if (id == 0xffff) { +		if (len < (pos+4)) +			return NULL; +		bswap32(buf+pos); +		pos += 4; +	} + +	if (len < (pos+1)) +		return NULL; + +	id = buf[pos]; +	pos++; +	if (id == 0xff) { +		if (len < (pos+4)) +			return NULL; +		bswap32(buf+pos); +		pos += 4; +	} + +	if (len < (pos + sizeof(struct mpeg_metadata_pointer_descriptor_flags))) +		return NULL; +	flags = (struct mpeg_metadata_pointer_descriptor_flags*) (buf+pos); +	pos += sizeof(struct mpeg_metadata_pointer_descriptor_flags); + +	if (flags->metadata_locator_record_flag == 1) { +		if (len < (pos+1)) +			return NULL; +		if (len < (pos+1+buf[pos])) +			return NULL; +		pos += 1 + buf[pos]; +	} + +	if (flags->mpeg_carriage_flags < 3) { +		if (len < (pos + 2)) +			return NULL; +		bswap16(buf+pos); +		pos += 2; +	} + +	if (flags->mpeg_carriage_flags == 1) { +		if (len < (pos + 4)) +			return NULL; +		bswap16(buf+pos); +		bswap16(buf+pos+2); +		pos += 4; +	} + +	if (len < pos) +		return NULL; + +	return (struct mpeg_metadata_pointer_descriptor*) d; +} + +/** + * Accessor for pointer to appid field of an mpeg_metadata_pointer_descriptor. + * + * @param d The mpeg_metadata_pointer_descriptor structure. + * @return The pointer, or NULL on error. + */ +static inline struct mpeg_metadata_pointer_descriptor_application_format_identifier* +	mpeg_metadata_pointer_descriptor_appid(struct mpeg_metadata_pointer_descriptor *d) +{ +	uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor); + +	if (d->metadata_application_format != 0xffff) +		return NULL; +	return (struct mpeg_metadata_pointer_descriptor_application_format_identifier*) buf; +} + +/** + * Accessor for metadata_format field of an mpeg_metadata_pointer_descriptor. + * + * @param d The mpeg_metadata_pointer_descriptor structure. + * @return The pointer, or NULL on error. + */ +static inline uint8_t +	mpeg_metadata_pointer_descriptor_metadata_format(struct mpeg_metadata_pointer_descriptor *d) +{ +	uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor); + +	if (d->metadata_application_format == 0xffff) +		buf+=4; +	return *buf; +} + +/** + * Accessor for pointer to formid field of an mpeg_metadata_pointer_descriptor. + * + * @param d The mpeg_metadata_pointer_descriptor structure. + * @return The pointer, or NULL on error. + */ +static inline struct mpeg_metadata_pointer_descriptor_format_identifier* +        mpeg_metadata_pointer_descriptor_formid(struct mpeg_metadata_pointer_descriptor *d) +{ +	uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor); + +	if (d->metadata_application_format == 0xffff) +		buf+=4; +	if (*buf != 0xff) +		return NULL; + +	return (struct mpeg_metadata_pointer_descriptor_format_identifier*) (buf+1); +} + +/** + * Accessor for flags field of an mpeg_metadata_pointer_descriptor. + * + * @param d The mpeg_metadata_pointer_descriptor structure. + * @return Pointer to the field, or NULL on error. + */ +static inline struct mpeg_metadata_pointer_descriptor_flags* +	mpeg_metadata_pointer_descriptor_flags(struct mpeg_metadata_pointer_descriptor *d) +{ +	uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor); + +	if (d->metadata_application_format == 0xffff) +		buf+=4; +	if (*buf == 0xff) +		buf+=4; + +	return (struct mpeg_metadata_pointer_descriptor_flags*) buf; +} + + +/** + * Accessor for locator field of an mpeg_metadata_pointer_descriptor. + * + * @param flags Pointer to the mpeg_metadata_pointer_descriptor_flags. + * @return Pointer to the field, or NULL on error. + */ +static inline struct mpeg_metadata_pointer_descriptor_locator* +	mpeg_metadata_pointer_descriptor_locator(struct mpeg_metadata_pointer_descriptor_flags *flags) +{ +	uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_pointer_descriptor_flags); + +	if (flags->metadata_locator_record_flag!=1) +		return NULL; + +	return (struct mpeg_metadata_pointer_descriptor_locator *) buf; +} + +/** + * Accessor for data field of an mpeg_metadata_pointer_descriptor_locator. + * + * @param d The mpeg_metadata_pointer_descriptor_locator structure. + * @return Pointer to the field. + */ +static inline uint8_t* +	mpeg_metadata_pointer_descriptor_locator_data(struct mpeg_metadata_pointer_descriptor_locator *d) +{ +	return (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor_locator); +} + + +/** + * Accessor for program_number field of an mpeg_metadata_pointer_descriptor. + * + * @param flags Pointer to the mpeg_metadata_pointer_descriptor_flags. + * @return Pointer to the field, or NULL on error. + */ +static inline struct mpeg_metadata_pointer_descriptor_program_number* +	mpeg_metadata_pointer_descriptor_program_number(struct mpeg_metadata_pointer_descriptor_flags *flags) +{ +	uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_pointer_descriptor_flags); + +	if (flags->mpeg_carriage_flags < 3) +		return NULL; + +	if (flags->metadata_locator_record_flag==1) +		buf += 1 + buf[1]; + +	return (struct mpeg_metadata_pointer_descriptor_program_number*) buf; +} + +/** + * Accessor for carriage field of an mpeg_metadata_pointer_descriptor. + * + * @param flags Pointer to the mpeg_metadata_pointer_descriptor_flags. + * @return Pointer to the field, or NULL on error. + */ +static inline struct mpeg_metadata_pointer_descriptor_carriage* +	mpeg_metadata_pointer_descriptor_carriage(struct mpeg_metadata_pointer_descriptor_flags *flags) +{ +	uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_pointer_descriptor_flags); + +	if (flags->mpeg_carriage_flags != 1) +		return NULL; + +	if (flags->metadata_locator_record_flag==1) +		buf += 1 + buf[1]; +	if (flags->mpeg_carriage_flags < 3) +		buf += sizeof(struct mpeg_metadata_pointer_descriptor_program_number); + +	return (struct mpeg_metadata_pointer_descriptor_carriage *) buf; +} + +/** + * Accessor for private_data field of an mpeg_metadata_pointer_descriptor. + * + * @param d The mpeg_metadata_pointer_descriptor structure. + * @param flags Pointer to the mpeg_metadata_pointer_descriptor_flags. + * @param length Where the number of bytes in the field should be stored. + * @return Pointer to the field. + */ +static inline uint8_t* +	mpeg_metadata_pointer_descriptor_private_data(struct mpeg_metadata_pointer_descriptor *d, +					       	      struct mpeg_metadata_pointer_descriptor_flags *flags, +					       	      int *length) +{ +	uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_pointer_descriptor_flags); +	uint8_t *end = (uint8_t*) d + d->d.len + 2; + + +	if (flags->metadata_locator_record_flag==1) +		buf += 1 + buf[1]; +	if (flags->mpeg_carriage_flags < 3) +		buf += sizeof(struct mpeg_metadata_pointer_descriptor_program_number); +	if (flags->mpeg_carriage_flags != 1) +		buf += sizeof(struct mpeg_metadata_pointer_descriptor_carriage); + +	*length = end - buf; +	return buf; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/metadata_section.c b/lib/libucsi/mpeg/metadata_section.c new file mode 100644 index 0000000..c1ce019 --- /dev/null +++ b/lib/libucsi/mpeg/metadata_section.c @@ -0,0 +1,27 @@ +/* + * 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/mpeg/metadata_section.h> + +struct mpeg_metadata_section * mpeg_metadata_section_codec(struct section_ext * ext) +{ +	return (struct mpeg_metadata_section *)ext; +} diff --git a/lib/libucsi/mpeg/metadata_section.h b/lib/libucsi/mpeg/metadata_section.h new file mode 100644 index 0000000..62c4e03 --- /dev/null +++ b/lib/libucsi/mpeg/metadata_section.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_MPEG_METADATA_SECTION_H +#define _UCSI_MPEG_METADATA_SECTION_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/section.h> + +/** + * mpeg_metadata_section structure. + */ +struct mpeg_metadata_section { +	struct section_ext head; + +	/* uint8_t data[] */ +} __ucsi_packed; + +/** + * Process an mpeg_metadata_section structure. + * + * @param section Pointer to the section_ext structure. + * @return Pointer to the mpeg_metadata_section structure, or NULL on error. + */ +extern struct mpeg_metadata_section *mpeg_metadata_section_codec(struct section_ext *section); + +/** + * Accessor for the random_access_indicator field of a metadata section. + * + * @param metadata metadata section pointer. + * @return The random_access_indicator. + */ +static inline uint8_t mpeg_metadata_section_random_access_indicator(struct mpeg_metadata_section *metadata) +{ +	return metadata->head.reserved >> 1; +} + +/** + * Accessor for the decoder_config_flag field of a metadata section. + * + * @param metadata metadata section pointer. + * @return The decoder_config_flag. + */ +static inline uint8_t mpeg_metadata_section_decoder_config_flag(struct mpeg_metadata_section *metadata) +{ +	return metadata->head.reserved & 1; +} + +/** + * Accessor for the fragment_indicator field of a metadata section. + * + * @param metadata metadata section pointer. + * @return The fragment_indicator. + */ +static inline uint8_t mpeg_metadata_section_fragment_indicator(struct mpeg_metadata_section *metadata) +{ +	return metadata->head.reserved1; +} + +/** + * Accessor for the service_id field of a metadata section. + * + * @param metadata metadata section pointer. + * @return The service_id. + */ +static inline uint16_t mpeg_metadata_section_service_id(struct mpeg_metadata_section *metadata) +{ +	return metadata->head.table_id_ext >> 8; +} + +/** + * Retrieve pointer to data field of an mpeg_metadata_section. + * + * @param s mpeg_metadata_section pointer. + * @return Pointer to the field. + */ +static inline uint8_t * +	mpeg_metadata_section_data(struct mpeg_metadata_section *s) +{ +	return (uint8_t *) s + sizeof(struct mpeg_metadata_section); +} + + +/** + * Determine length of the data field of an mpeg_copyright_descriptor. + * + * @param s mpeg_metadata_section_data pointer. + * @return Length of field in bytes. + */ +static inline int +	mpeg_metadata_section_data_length(struct mpeg_metadata_section *s) +{ +	return section_ext_length(&s->head) - sizeof(struct mpeg_metadata_section); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/metadata_std_descriptor.h b/lib/libucsi/mpeg/metadata_std_descriptor.h new file mode 100644 index 0000000..fc83e6e --- /dev/null +++ b/lib/libucsi/mpeg/metadata_std_descriptor.h @@ -0,0 +1,72 @@ +/* + * 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_MPEG_METADATA_STD_DESCRIPTOR +#define _UCSI_MPEG_METADATA_STD_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg_metadata_std_descriptor structure. + */ +struct mpeg_metadata_std_descriptor { +	struct descriptor d; + +  EBIT2(uint32_t reserved_1			: 2; , +	uint32_t metadata_input_leak_rate	:22; ); +  EBIT2(uint32_t reserved_2			: 2; , +	uint32_t metadata_buffer_size		:22; ); +  EBIT2(uint32_t reserved_3			: 2; , +	uint32_t metadata_output_leak_rate	:22; ); +} __ucsi_packed; + +/** + * Process an mpeg_metadata_std_descriptor. + * + * @param d Pointer to the generic descriptor structure. + * @return Pointer to the mpeg_metadata_std_descriptor, or NULL on error. + */ +static inline struct mpeg_metadata_std_descriptor* +	mpeg_metadata_std_descriptor_codec(struct descriptor* d) +{ +	uint8_t *buf = (uint8_t*) d; + +	if (d->len != (sizeof(struct mpeg_metadata_std_descriptor) - 2)) +		return NULL; + +	bswap24(buf + 2); +	bswap24(buf + 5); +	bswap24(buf + 8); + +	return (struct mpeg_metadata_std_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/mpeg4_audio_descriptor.h b/lib/libucsi/mpeg/mpeg4_audio_descriptor.h new file mode 100644 index 0000000..f876759 --- /dev/null +++ b/lib/libucsi/mpeg/mpeg4_audio_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_MPEG4_AUDIO_DESCRIPTOR +#define _UCSI_MPEG4_AUDIO_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg4_audio_descriptor structure. + */ +struct mpeg4_audio_descriptor { +	struct descriptor d; + +	uint8_t mpeg4_audio_profile_and_level; +} __ucsi_packed; + +/** + * Process an mpeg4_audio_descriptor. + * + * @param d Generic descriptor structure. + * @return Pointer to an mpeg4_audio_descriptor structure, or NULL on error. + */ +static inline struct mpeg4_audio_descriptor* +	mpeg4_audio_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct mpeg4_audio_descriptor) - 2)) +		return NULL; + +	return (struct mpeg4_audio_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/mpeg4_video_descriptor.h b/lib/libucsi/mpeg/mpeg4_video_descriptor.h new file mode 100644 index 0000000..b956b91 --- /dev/null +++ b/lib/libucsi/mpeg/mpeg4_video_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_MPEG4_VIDEO_DESCRIPTOR +#define _UCSI_MPEG4_VIDEO_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg4_video_descriptor structure. + */ +struct mpeg4_video_descriptor { +	struct descriptor d; + +	uint8_t mpeg4_visual_profile_and_level; +} __ucsi_packed; + +/** + * Process an mpeg4_video_descriptor structure. + * + * @param d Pointer to generic descriptor structure. + * @return Pointer to mpeg4_video_descriptor structure, or NULL on error. + */ +static inline struct mpeg4_video_descriptor* +	mpeg4_video_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct mpeg4_video_descriptor) - 2)) +		return NULL; + +	return (struct mpeg4_video_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/multiplex_buffer_descriptor.h b/lib/libucsi/mpeg/multiplex_buffer_descriptor.h new file mode 100644 index 0000000..d55ce3d --- /dev/null +++ b/lib/libucsi/mpeg/multiplex_buffer_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_MPEG_MULTIPLEX_BUFFER_DESCRIPTOR +#define _UCSI_MPEG_MULTIPLEX_BUFFER_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg_multiplex_buffer_descriptor descriptor. + */ +struct mpeg_multiplex_buffer_descriptor { +	struct descriptor d; + +  EBIT2(uint64_t mb_buffer_size : 24;  , +	uint64_t tb_leak_rate	: 24;  ); +} __ucsi_packed; + +/** + * Process an mpeg_multiplex_buffer_descriptor. + * + * @param d Pointer to generic descriptor structure. + * @return Pointer to an mpeg_multiplex_buffer_descriptor structure, or NULL on + * error. + */ +static inline struct mpeg_multiplex_buffer_descriptor* +	mpeg_multiplex_buffer_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct mpeg_multiplex_buffer_descriptor) - 2)) +		return NULL; + +	bswap48((uint8_t*) d + 2); + +	return (struct mpeg_multiplex_buffer_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/multiplex_buffer_utilization_descriptor.h b/lib/libucsi/mpeg/multiplex_buffer_utilization_descriptor.h new file mode 100644 index 0000000..16550ed --- /dev/null +++ b/lib/libucsi/mpeg/multiplex_buffer_utilization_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_MPEG_MULTIPLEX_BUFFER_UTILIZATION_DESCRIPTOR +#define _UCSI_MPEG_MULTIPLEX_BUFFER_UTILIZATION_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg_multiplex_buffer_utilization_descriptor structure. + */ +struct mpeg_multiplex_buffer_utilization_descriptor { +	struct descriptor d; + +  EBIT2(uint16_t bound_valid_flag		: 1;  , +	uint16_t ltw_offset_lower_bound		: 15; ); +  EBIT2(uint16_t reserved			: 1;  , +	uint16_t ltw_offset_upper_bound		: 15; ); +} __ucsi_packed; + +/** + * Process a mpeg_multiplex_buffer_utilization_descriptor. + * + * @param d Generic descriptor pointer. + * @return mpeg_multiplex_buffer_utilization_descriptor pointer, or NULL on error. + */ +static inline struct mpeg_multiplex_buffer_utilization_descriptor* +	mpeg_multiplex_buffer_utilization_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct mpeg_multiplex_buffer_utilization_descriptor) - 2)) +		return NULL; + +	bswap16((uint8_t*) d + 2); +	bswap16((uint8_t*) d + 4); + +	return (struct mpeg_multiplex_buffer_utilization_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/muxcode_descriptor.h b/lib/libucsi/mpeg/muxcode_descriptor.h new file mode 100644 index 0000000..6bed334 --- /dev/null +++ b/lib/libucsi/mpeg/muxcode_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_MPEG_MUXCODE_DESCRIPTOR +#define _UCSI_MPEG_MUXCODE_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg_muxcode_descriptor structure + */ +struct mpeg_muxcode_descriptor { +	struct descriptor d; + +	/* uint8_t entries[] */ +} __ucsi_packed; + +/** + * Process an mpeg_muxcode_descriptor. + * + * @param d Pointer to a generic descriptor structure. + * @return Pointer to an mpeg_muxcode_descriptor structure, or NULL on error. + */ +static inline struct mpeg_muxcode_descriptor* +	mpeg_muxcode_descriptor_codec(struct descriptor* d) +{ +	return (struct mpeg_muxcode_descriptor*) d; +} + +/** + * Retrieve pointer to entries field of an mpeg_muxcode_descriptor structure. + * + * @param d Generic descriptor structure. + * @return Pointer to the entries field. + */ +static inline uint8_t * +	mpeg_muxcode_descriptor_entries(struct mpeg_muxcode_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct mpeg_muxcode_descriptor); +} + +/** + * Determine length of entries field of an mpeg_muxcode_descriptor structure. + * + * @param d Generic descriptor structure. + * @return Number of bytes in the entries field. + */ +static inline int +	mpeg_muxcode_descriptor_entries_length(struct mpeg_muxcode_descriptor *d) +{ +	return d->d.len; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/odsmt_section.c b/lib/libucsi/mpeg/odsmt_section.c new file mode 100644 index 0000000..07407f2 --- /dev/null +++ b/lib/libucsi/mpeg/odsmt_section.c @@ -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 + */ + +#include <libucsi/mpeg/odsmt_section.h> + +struct mpeg_odsmt_section *mpeg_odsmt_section_codec(struct section_ext * ext) +{ +	struct mpeg_odsmt_section * odsmt = (struct mpeg_odsmt_section *)ext; +	uint8_t * buf = (uint8_t *)ext; +	size_t pos = sizeof(struct section_ext); +	size_t len = section_ext_length(ext); +	int i; + +	if (len < sizeof(struct mpeg_odsmt_section)) +		return NULL; + +	pos++; + +	if (odsmt->stream_count == 0) { +		struct mpeg_odsmt_stream * stream = +			(struct mpeg_odsmt_stream *) (buf + pos); + +		if ((pos + sizeof(struct mpeg_odsmt_stream_single)) > len) +			return NULL; + +		bswap16(buf+pos); +		pos+=3; + +		if ((pos + stream->u.single.es_info_length) >= len) +			return NULL; + +		if (verify_descriptors(buf + pos, stream->u.single.es_info_length)) +			return NULL; + +		pos += stream->u.single.es_info_length; +	} else { +		for (i=0; i< odsmt->stream_count; i++) { +			struct mpeg_odsmt_stream * stream = +				(struct mpeg_odsmt_stream *)(buf + pos); + +			if ((pos + sizeof(struct mpeg_odsmt_stream_multi)) > len) +				return NULL; + +			bswap16(buf+pos); +			pos += sizeof(struct mpeg_odsmt_stream_multi); + +			if ((pos + stream->u.multi.es_info_length) > len) +				return NULL; + +			if (verify_descriptors(buf + pos, +			    stream->u.multi.es_info_length)) +				return NULL; + +			pos += stream->u.multi.es_info_length; +		} +	} + +	if (pos != len) +		return NULL; + +	return (struct mpeg_odsmt_section *) ext; +} diff --git a/lib/libucsi/mpeg/odsmt_section.h b/lib/libucsi/mpeg/odsmt_section.h new file mode 100644 index 0000000..4e01085 --- /dev/null +++ b/lib/libucsi/mpeg/odsmt_section.h @@ -0,0 +1,224 @@ +/* + * 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_MPEG_ODSMT_SECTION_H +#define _UCSI_MPEG_ODSMT_SECTION_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/section.h> + +/** + * mpeg_odsmt_section structure. + */ +struct mpeg_odsmt_section { +	struct section_ext head; + +	uint8_t stream_count; +	/* stream_count==0 => struct mpeg_odsmt_stream_single streams +	   stream_count>0  => struct mpeg_odsmt_stream_multi streams[] */ +	/* uint8_t object_descriptors[] */ +} __ucsi_packed; + +struct mpeg_odsmt_stream_single +{ +	uint16_t esid; +	uint8_t es_info_length; +	/* struct descriptor descriptors[] */ +} __ucsi_packed; + +struct mpeg_odsmt_stream_multi +{ +	uint16_t esid; +	uint8_t fmc; +	uint8_t es_info_length; +	/* struct descriptor descriptors[] */ +} __ucsi_packed; + +/** + * Structure describing the stream information held in an mpeg_odsmt_section. + */ +struct mpeg_odsmt_stream { +	union { +		struct mpeg_odsmt_stream_single single; +		struct mpeg_odsmt_stream_multi multi; +	} u; +} __ucsi_packed; + +/** + * Process an mpeg_odsmt_section. + * + * @param section Pointer to the generic section_ext structure. + * @return Pointer to a mpeg_odsmt_section structure, or NULL on error. + */ +extern struct mpeg_odsmt_section *mpeg_odsmt_section_codec(struct section_ext *section); + +/** + * Accessor for the PID field of an ODSMT. + * + * @param odsmt odsmt pointer. + * @return The pid. + */ +static inline uint16_t mpeg_odsmt_section_pid(struct mpeg_odsmt_section *odsmt) +{ +	return odsmt->head.table_id_ext & 0x1fff; +} + +/** + * Convenience iterator for the streams field of an mpeg_odsmt_section. + * + * @param osdmt Pointer to the mpeg_odsmt_section structure. + * @param pos Variable holding pointer to the current mpeg_odsmt_stream structure. + * @param index Variable holding the stream index. + */ +#define mpeg_odsmt_section_streams_for_each(osdmt, pos, index) \ +	for (index=0, (pos) = mpeg_odsmt_section_streams_first(odsmt); \ +	     (pos); \ +	     (pos) = mpeg_odsmt_section_streams_next(odsmt, pos, ++index)) + +/** + * Convenience iterator for the descriptors field of an mpeg_odsmt_stream. + * + * @param osdmt Pointer to the mpeg_odsmt_section structure. + * @param stream Pointer to the mpeg_odsmt_stream structure. + * @param pos Variable holding pointer to the current descriptor structure. + */ +#define mpeg_odsmt_stream_descriptors_for_each(osdmt, stream, pos) \ +	for ((pos) = mpeg_odsmt_stream_descriptors_first(odsmt, stream); \ +	     (pos); \ +	     (pos) = mpeg_odsmt_stream_descriptors_next(odsmt, stream, pos)) + +/** + * Retrieve a pointer to the object_descriptors field of an mpeg_odsmt_section. + * + * @param osdmt Pointer to the mpeg_odsmt_section structure. + * @param len On return, will contain the number of bytes in the object descriptors field. + * @return Pointer to the object_descriptors field, or NULL on error. + */ +static inline uint8_t* +	mpeg_odsmt_section_object_descriptors(struct mpeg_odsmt_section * odsmt, +					      size_t* len); + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct mpeg_odsmt_stream * +	mpeg_odsmt_section_streams_first(struct mpeg_odsmt_section *odsmt) +{ +	size_t pos = sizeof(struct mpeg_odsmt_section); + +	if (pos >= section_ext_length(&odsmt->head)) +		return NULL; + +	return (struct mpeg_odsmt_stream *) ((uint8_t *) odsmt + pos); +} + +static inline struct mpeg_odsmt_stream * +	mpeg_odsmt_section_streams_next(struct mpeg_odsmt_section *odsmt, +					struct mpeg_odsmt_stream *pos, +				        int _index) +{ +	uint8_t *end = (uint8_t*) odsmt + section_ext_length(&odsmt->head); +	uint8_t *next; + +	if (_index > odsmt->stream_count) +		return NULL; + +	next = (uint8_t *) pos + sizeof(struct mpeg_odsmt_stream_multi) + +		pos->u.multi.es_info_length; + +	if (next >= end) +		return NULL; + +	return (struct mpeg_odsmt_stream *) next; +} + +static inline struct descriptor * +	mpeg_odsmt_stream_descriptors_first(struct mpeg_odsmt_section *odsmt, +				      	    struct mpeg_odsmt_stream *stream) +{ +	if (odsmt->stream_count == 0) { +		if (stream->u.single.es_info_length == 0) +			return NULL; + +		return (struct descriptor *) +			((uint8_t*) stream + sizeof(struct mpeg_odsmt_stream_single)); +	} else { +		if (stream->u.multi.es_info_length == 0) +			return NULL; + +		return (struct descriptor *) +			((uint8_t*) stream + sizeof(struct mpeg_odsmt_stream_multi)); +	} +} + +static inline struct descriptor * +	mpeg_odsmt_stream_descriptors_next(struct mpeg_odsmt_section *odsmt, +					   struct mpeg_odsmt_stream *stream, +					   struct descriptor* pos) +{ +	if (odsmt->stream_count == 0) { +		return next_descriptor((uint8_t *) stream + sizeof(struct mpeg_odsmt_stream_single), +				       stream->u.single.es_info_length, +				       pos); +	} else { +		return next_descriptor((uint8_t *) stream + sizeof(struct mpeg_odsmt_stream_multi), +				       stream->u.multi.es_info_length, +				       pos); +	} +} + +static inline uint8_t* +	mpeg_odsmt_section_object_descriptors(struct mpeg_odsmt_section * odsmt, +					      size_t* len) +{ +	struct mpeg_odsmt_stream* pos; +	size_t size = sizeof(struct mpeg_odsmt_section); +	int _index; + +	mpeg_odsmt_section_streams_for_each(odsmt, pos, _index) { +		if (odsmt->stream_count == 0) +			size += sizeof(struct mpeg_odsmt_stream_single) + +					pos->u.single.es_info_length; +		else +			size += sizeof(struct mpeg_odsmt_stream_multi) + +					pos->u.multi.es_info_length; +	} + +	*len = section_ext_length(&odsmt->head) - size; +	return (uint8_t*) odsmt + size; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/pat_section.c b/lib/libucsi/mpeg/pat_section.c new file mode 100644 index 0000000..2e4c2cc --- /dev/null +++ b/lib/libucsi/mpeg/pat_section.c @@ -0,0 +1,46 @@ +/* + * 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/mpeg/pat_section.h> + +struct mpeg_pat_section *mpeg_pat_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 mpeg_pat_section)) +		return NULL; + +	while (pos < len) { +		if ((pos + 4) > len) +			return NULL; + +		bswap16(buf + pos); +		bswap16(buf + pos + 2); +		pos += 4; +	} + +	if (pos != len) +		return NULL; + +	return (struct mpeg_pat_section *)ext; +} diff --git a/lib/libucsi/mpeg/pat_section.h b/lib/libucsi/mpeg/pat_section.h new file mode 100644 index 0000000..eadfe28 --- /dev/null +++ b/lib/libucsi/mpeg/pat_section.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) + * + * 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_MPEG_PAT_SECTION_H +#define _UCSI_MPEG_PAT_SECTION_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/section.h> + +/** + * mpeg_pat_section structure. + */ +struct mpeg_pat_section { +	struct section_ext head; /* table_id_ext == transport_stream_id */ + +	/* struct mpeg_pat_program programs[] */ +} __ucsi_packed; + +/** + * A program within an mpeg_pat_section. + */ +struct mpeg_pat_program { +	uint16_t program_number; +  EBIT2(uint16_t reserved	: 3; , +	uint16_t pid		:13; ); +} __ucsi_packed; + +/** + * Process an mpeg_pat_section. + * + * @param section Pointer to the generic section_ext structure. + * @return Pointer to the mpeg_pat_section structure, or NULL on error. + */ +extern struct mpeg_pat_section *mpeg_pat_section_codec(struct section_ext *section); + +/** + * Accessor for the transport_stream_id field of a PAT. + * + * @param pat PAT pointer. + * @return The transport_stream_id. + */ +static inline uint16_t mpeg_pat_section_transport_stream_id(struct mpeg_pat_section *pat) +{ +	return pat->head.table_id_ext; +} + +/** + * Conveience iterator for the programs field of an mpeg_pat_section. + * + * @param pat Pointer to the mpeg_pat_section structure. + * @param pos Variable holding a pointer to the current mpeg_pat_program structure. + */ +#define mpeg_pat_section_programs_for_each(pat, pos) \ +	for ((pos) = mpeg_pat_section_programs_first(pat); \ +	     (pos); \ +	     (pos) = mpeg_pat_section_programs_next(pat, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct mpeg_pat_program * +	mpeg_pat_section_programs_first(struct mpeg_pat_section * pat) +{ +	size_t pos = sizeof(struct mpeg_pat_section); + +	if (pos >= section_ext_length(&pat->head)) +		return NULL; + +	return (struct mpeg_pat_program*)((uint8_t *) pat + pos); +} + +static inline +	struct mpeg_pat_program *mpeg_pat_section_programs_next(struct mpeg_pat_section * pat, +								struct mpeg_pat_program * pos) +{ +	uint8_t *end = (uint8_t*) pat + section_ext_length(&pat->head); +	uint8_t *next= (uint8_t *) pos + sizeof(struct mpeg_pat_program); + +	if (next >= end) +		return NULL; + +	return (struct mpeg_pat_program *) next; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/pmt_section.c b/lib/libucsi/mpeg/pmt_section.c new file mode 100644 index 0000000..e5aec6a --- /dev/null +++ b/lib/libucsi/mpeg/pmt_section.c @@ -0,0 +1,71 @@ +/* + * 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/mpeg/pmt_section.h> + +struct mpeg_pmt_section * mpeg_pmt_section_codec(struct section_ext * ext) +{ +	uint8_t * buf = (uint8_t *) ext; +	struct mpeg_pmt_section * pmt = (struct mpeg_pmt_section *) ext; +	size_t pos = sizeof(struct section_ext); +	size_t len = section_ext_length(ext); + +	if (len < sizeof(struct mpeg_pmt_section)) +		return NULL; + +	bswap16(buf + pos); +	pos += 2; +	bswap16(buf + pos); +	pos += 2; + +	if ((pos + pmt->program_info_length) > len) +		return NULL; + +	if (verify_descriptors(buf + pos, pmt->program_info_length)) +		return NULL; + +	pos += pmt->program_info_length; + +	while (pos < len) { +		struct mpeg_pmt_stream * stream = +			(struct mpeg_pmt_stream *) (buf + pos); + +		if ((pos + sizeof(struct mpeg_pmt_stream)) > len) +			return NULL; + +		bswap16(buf + pos + 1); +		bswap16(buf + pos + 3); +		pos += sizeof(struct mpeg_pmt_stream); + +		if ((pos + stream->es_info_length) > len) +			return NULL; + +		if (verify_descriptors(buf + pos, stream->es_info_length)) +			return NULL; + +		pos += stream->es_info_length; +	} + +	if (pos != len) +		return NULL; + +	return (struct mpeg_pmt_section *) ext; +} diff --git a/lib/libucsi/mpeg/pmt_section.h b/lib/libucsi/mpeg/pmt_section.h new file mode 100644 index 0000000..03dea1b --- /dev/null +++ b/lib/libucsi/mpeg/pmt_section.h @@ -0,0 +1,188 @@ +/* + * 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_MPEG_PMT_SECTION_H +#define _UCSI_MPEG_PMT_SECTION_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/section.h> + +/** + * mpeg_pmt_section structure. + */ +struct mpeg_pmt_section { +	struct section_ext head; + +  EBIT2(uint16_t reserved_1		: 3; , +	uint16_t pcr_pid		:13; ); +  EBIT2(uint16_t reserved_2		: 4; , +	uint16_t program_info_length	:12; ); +	/* struct descriptor descriptors[] */ +	/* struct mpeg_pmt_stream streams[] */ +} __ucsi_packed; + +/** + * A stream within an mpeg_pmt_section. + */ +struct mpeg_pmt_stream { +	uint8_t stream_type; +  EBIT2(uint16_t reserved_1		: 3; , +	uint16_t pid			:13; ); +  EBIT2(uint16_t reserved_2		: 4; , +	uint16_t es_info_length		:12; ); + +	/* struct descriptor descriptors[] */ +} __ucsi_packed; + +/** + * Process an mpeg_pmt_section section. + * + * @param section Pointer to the generic section header. + * @return Pointer to the mpeg_pmt_section structure, or NULL on error. + */ +extern struct mpeg_pmt_section *mpeg_pmt_section_codec(struct section_ext *section); + +/** + * Accessor for program_number field of a PMT. + * + * @param pmt PMT pointer. + * @return The program_number. + */ +static inline uint16_t mpeg_pmt_section_program_number(struct mpeg_pmt_section *pmt) +{ +	return pmt->head.table_id_ext; +} + +/** + * Convenience iterator for the descriptors field of the mpeg_pmt_section structure. + * + * @param pmt Pointer to the mpeg_pmt_section structure. + * @param pos Variable holding a pointer to the current descriptor. + */ +#define mpeg_pmt_section_descriptors_for_each(pmt, pos) \ +	for ((pos) = mpeg_pmt_section_descriptors_first(pmt); \ +	     (pos); \ +	     (pos) = mpeg_pmt_section_descriptors_next(pmt, pos)) + +/** + * Convenience iterator for the streams field of the mpeg_pmt_section structure. + * + * @param pmt Pointer to the mpeg_pmt_section structure. + * @param pos Variable holding a pointer to the current mpeg_pmt_stream. + */ +#define mpeg_pmt_section_streams_for_each(pmt, pos) \ +	for ((pos) = mpeg_pmt_section_streams_first(pmt); \ +	     (pos); \ +	     (pos) = mpeg_pmt_section_streams_next(pmt, pos)) + +/** + * Convenience iterator for the descriptors field of an mpeg_pmt_stream structure. + * + * @param stream Pointer to the mpeg_pmt_stream structure. + * @param pos Variable holding a pointer to the current descriptor. + */ +#define mpeg_pmt_stream_descriptors_for_each(stream, pos) \ +	for ((pos) = mpeg_pmt_stream_descriptors_first(stream); \ +	     (pos); \ +	     (pos) = mpeg_pmt_stream_descriptors_next(stream, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct descriptor * +	mpeg_pmt_section_descriptors_first(struct mpeg_pmt_section * pmt) +{ +	if (pmt->program_info_length == 0) +		return NULL; + +	return (struct descriptor *) +		((uint8_t *) pmt + sizeof(struct mpeg_pmt_section)); +} + +static inline struct descriptor * +	mpeg_pmt_section_descriptors_next(struct mpeg_pmt_section *pmt, +					  struct descriptor* pos) +{ +	return next_descriptor((uint8_t *) pmt + sizeof(struct mpeg_pmt_section), +			       pmt->program_info_length, +			       pos); +} + +static inline struct mpeg_pmt_stream * +	mpeg_pmt_section_streams_first(struct mpeg_pmt_section * pmt) +{ +	size_t pos = sizeof(struct mpeg_pmt_section) + pmt->program_info_length; + +	if (pos >= section_ext_length(&pmt->head)) +		return NULL; + +	return (struct mpeg_pmt_stream *)((uint8_t *)pmt + pos); +} + +static inline struct mpeg_pmt_stream * +	mpeg_pmt_section_streams_next(struct mpeg_pmt_section * pmt, +				      struct mpeg_pmt_stream * pos) +{ +	uint8_t *end = (uint8_t*) pmt + section_ext_length(&pmt->head); +	uint8_t *next =	(uint8_t *) pos + sizeof(struct mpeg_pmt_stream) + +			pos->es_info_length; + +	if (next >= end) +		return NULL; + +	return (struct mpeg_pmt_stream *) next; +} + +static inline struct descriptor * +	mpeg_pmt_stream_descriptors_first(struct mpeg_pmt_stream *stream) +{ +	if (stream->es_info_length == 0) +		return NULL; + +	return (struct descriptor *) +		((uint8_t*) stream + sizeof(struct mpeg_pmt_stream)); +} + +static inline struct descriptor * +	mpeg_pmt_stream_descriptors_next(struct mpeg_pmt_stream *stream, +					 struct descriptor* pos) +{ +	return next_descriptor((uint8_t *) stream + sizeof(struct mpeg_pmt_stream), +			       stream->es_info_length, +			       pos); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/private_data_indicator_descriptor.h b/lib/libucsi/mpeg/private_data_indicator_descriptor.h new file mode 100644 index 0000000..80e8ef3 --- /dev/null +++ b/lib/libucsi/mpeg/private_data_indicator_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_MPEG_PRIVATE_DATA_INDICATOR_DESCRIPTOR +#define _UCSI_MPEG_PRIVATE_DATA_INDICATOR_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg_private_data_indicator_descriptor structure + */ +struct mpeg_private_data_indicator_descriptor { +	struct descriptor d; + +	uint32_t private_data_indicator; +} __ucsi_packed; + +/** + * Process an mpeg_private_data_indicator_descriptor structure. + * + * @param d Pointer to the generic descriptor structure. + * @return Pointer to the mpeg_private_data_indicator_descriptor, or NULL on error. + */ +static inline struct mpeg_private_data_indicator_descriptor* +	mpeg_private_data_indicator_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct mpeg_private_data_indicator_descriptor) - 2)) +		return NULL; + +	bswap32((uint8_t*) d + 2); + +	return (struct mpeg_private_data_indicator_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/registration_descriptor.h b/lib/libucsi/mpeg/registration_descriptor.h new file mode 100644 index 0000000..df5c186 --- /dev/null +++ b/lib/libucsi/mpeg/registration_descriptor.h @@ -0,0 +1,91 @@ +/* + * 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_MPEG_REGISTRATION_DESCRIPTOR +#define _UCSI_MPEG_REGISTRATION_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg_registration_descriptor structure. + */ +struct mpeg_registration_descriptor { +	struct descriptor d; + +	uint32_t format_identifier; +	/* uint8_t additional_id_info[] */ +} __ucsi_packed; + +/** + * Process an mpeg_registration_descriptor. + * + * @param d Pointer to the generic descriptor structure. + * @return Pointer to the mpeg_registration_descriptor structure, or NULL on error. + */ +static inline struct mpeg_registration_descriptor* +	mpeg_registration_descriptor_codec(struct descriptor* d) +{ +	if (d->len < (sizeof(struct mpeg_registration_descriptor) - 2)) +		return NULL; + +	bswap32((uint8_t*) d + 2); + +	return (struct mpeg_registration_descriptor*) d; +} + +/** + * Retrieve a pointer to the additional_id_info field of the + * mpeg_registration_descriptor structure. + * + * @param d Pointer to the mpeg_registration_descriptor structure. + * @return Pointer to the field. + */ +static inline uint8_t * +	mpeg_registration_descriptor_additional_id_info(struct mpeg_registration_descriptor *d) +{ +	return (uint8_t *) d + sizeof(struct mpeg_registration_descriptor); +} + +/** + * Determine number of bytes in the additional_id_info field of the + * mpeg_registration_descriptor structure. + * + * @param d Pointer to the mpeg_registration_descriptor structure. + * @return Number of bytes. + */ + +static inline int +	mpeg_registration_descriptor_additional_id_info_length(struct mpeg_registration_descriptor *d) +{ +	return d->d.len - 4; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/section.h b/lib/libucsi/mpeg/section.h new file mode 100644 index 0000000..7dbff93 --- /dev/null +++ b/lib/libucsi/mpeg/section.h @@ -0,0 +1,58 @@ +/* + * 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_MPEG_SECTION_H +#define _UCSI_MPEG_SECTION_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/mpeg/cat_section.h> +#include <libucsi/mpeg/odsmt_section.h> +#include <libucsi/mpeg/pat_section.h> +#include <libucsi/mpeg/pmt_section.h> +#include <libucsi/mpeg/tsdt_section.h> +#include <libucsi/mpeg/metadata_section.h> + +#define TRANSPORT_PAT_PID 0x00 +#define TRANSPORT_CAT_PID 0x01 +#define TRANSPORT_TSDT_PID 0x02 + +/** + * Enumeration of MPEG section tags. + */ +enum mpeg_section_tag { +	stag_mpeg_program_association			= 0x00, +	stag_mpeg_conditional_access			= 0x01, +	stag_mpeg_program_map				= 0x02, +	stag_mpeg_transport_stream_description		= 0x03, +	stag_mpeg_iso14496_scene_description		= 0x04, +	stag_mpeg_iso14496_object_description		= 0x05, +	stag_mpeg_metadata				= 0x06, +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/sl_descriptor.h b/lib/libucsi/mpeg/sl_descriptor.h new file mode 100644 index 0000000..ab086e3 --- /dev/null +++ b/lib/libucsi/mpeg/sl_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_MPEG_SL_DESCRIPTOR +#define _UCSI_MPEG_SL_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg_sl_descriptor structure. + */ +struct mpeg_sl_descriptor { +	struct descriptor d; + +	uint16_t es_id; +} __ucsi_packed; + +/** + * Process an mpeg_sl_descriptor. + * + * @param d The generic descriptor structure. + * @return Pointer to an mpeg_sl_descriptor structure, or NULL on error. + */ +static inline struct mpeg_sl_descriptor* +	mpeg_sl_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct mpeg_sl_descriptor) - 2)) +		return NULL; + +	bswap16((uint8_t*) d + 2); + +	return (struct mpeg_sl_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/smoothing_buffer_descriptor.h b/lib/libucsi/mpeg/smoothing_buffer_descriptor.h new file mode 100644 index 0000000..5e6ad33 --- /dev/null +++ b/lib/libucsi/mpeg/smoothing_buffer_descriptor.h @@ -0,0 +1,66 @@ +/* + * 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_MPEG_SMOOTHING_BUFFER_DESCRIPTOR +#define _UCSI_MPEG_SMOOTHING_BUFFER_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg_smoothing_buffer_descriptor structure. + */ +struct mpeg_smoothing_buffer_descriptor { +	struct descriptor d; + +  EBIT4(uint64_t reserved_1  		: 2; , +	uint64_t sb_leak_rate		:22; , +	uint64_t reserved_2		: 2; , +	uint64_t sb_size		:22; ); +} __ucsi_packed; + +/** + * Process an mpeg_smoothing_buffer_descriptor. + * + * @param d The generic descriptor structure. + * @return Pointer to mpeg_smoothing_buffer_descriptor, or NULL on error. + */ +static inline struct mpeg_smoothing_buffer_descriptor* +	mpeg_smoothing_buffer_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct mpeg_smoothing_buffer_descriptor) - 2)) +		return NULL; + +	bswap48((uint8_t*) d + 2); + +	return (struct mpeg_smoothing_buffer_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/std_descriptor.h b/lib/libucsi/mpeg/std_descriptor.h new file mode 100644 index 0000000..2625a41 --- /dev/null +++ b/lib/libucsi/mpeg/std_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_MPEG_STD_DESCRIPTOR +#define _UCSI_MPEG_STD_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg_std_descriptor structure. + */ +struct mpeg_std_descriptor { +	struct descriptor d; + +  EBIT2(uint8_t reserved	: 7; , +	uint8_t leak_valid_flag	: 1; ); +} __ucsi_packed; + +/** + * Process an mpeg_std_descriptor. + * + * @param d Pointer to the generic descriptor structure. + * @return Pointer to the mpeg_std_descriptor, or NULL on error. + */ +static inline struct mpeg_std_descriptor* +	mpeg_std_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct mpeg_std_descriptor) - 2)) +		return NULL; + +	return (struct mpeg_std_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/system_clock_descriptor.h b/lib/libucsi/mpeg/system_clock_descriptor.h new file mode 100644 index 0000000..681641f --- /dev/null +++ b/lib/libucsi/mpeg/system_clock_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_MPEG_SYSTEM_CLOCK_DESCRIPTOR +#define _UCSI_MPEG_SYSTEM_CLOCK_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg_system_clock_descriptor structure. + */ +struct mpeg_system_clock_descriptor { +	struct descriptor d; + +  EBIT3(uint8_t external_clock_reference_indicator	: 1; , +	uint8_t reserved_1				: 1; , +	uint8_t clock_accuracy_integer			: 6; ); +  EBIT2(uint8_t clock_accuracy_exponent			: 3; , +	uint8_t reserved_2				: 5; ); +} __ucsi_packed; + +/** + * Process an mpeg_system_clock_descriptor. + * + * @param d The generic descriptor structure. + * @return Pointer to a mpeg_system_clock_descriptor structure, or NULL on error. + */ +static inline struct mpeg_system_clock_descriptor* +	mpeg_system_clock_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct mpeg_system_clock_descriptor) - 2)) +		return NULL; + +	return (struct mpeg_system_clock_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/target_background_grid_descriptor.h b/lib/libucsi/mpeg/target_background_grid_descriptor.h new file mode 100644 index 0000000..7394e82 --- /dev/null +++ b/lib/libucsi/mpeg/target_background_grid_descriptor.h @@ -0,0 +1,66 @@ +/* + * 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_MPEG_TARGET_BACKGROUND_GRID_DESCRIPTOR +#define _UCSI_MPEG_TARGET_BACKGROUND_GRID_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * mpeg_target_background_grid_descriptor structure. + */ +struct mpeg_target_background_grid_descriptor { +	struct descriptor d; + +  EBIT3(uint32_t horizontal_size		: 14; , +	uint32_t vertical_size			: 14; , +	uint32_t aspect_ratio_information	: 4;  ); +} __ucsi_packed; + +/** + * Process an mpeg_target_background_grid_descriptor structure. + * + * @param d Pointer to the generic descriptor structure. + * @return Pointer to the mpeg_target_background_grid_descriptor structure, or + * NULL on error. + */ +static inline struct mpeg_target_background_grid_descriptor* +	mpeg_target_background_grid_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct mpeg_target_background_grid_descriptor) - 2)) +		return NULL; + +	bswap32((uint8_t*) d + 2); + +	return (struct mpeg_target_background_grid_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/tsdt_section.c b/lib/libucsi/mpeg/tsdt_section.c new file mode 100644 index 0000000..fec9dd7 --- /dev/null +++ b/lib/libucsi/mpeg/tsdt_section.c @@ -0,0 +1,34 @@ +/* + * 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/mpeg/tsdt_section.h> + +struct mpeg_tsdt_section * mpeg_tsdt_section_codec(struct section_ext * ext) +{ +	uint8_t * buf = (uint8_t *)ext; +	size_t pos = sizeof(struct section_ext); + +	if (verify_descriptors(buf + pos, +	    section_ext_length(ext) - sizeof(struct mpeg_tsdt_section))) +		return NULL; + +	return (struct mpeg_tsdt_section *)ext; +} diff --git a/lib/libucsi/mpeg/tsdt_section.h b/lib/libucsi/mpeg/tsdt_section.h new file mode 100644 index 0000000..2bbae02 --- /dev/null +++ b/lib/libucsi/mpeg/tsdt_section.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_MPEG_TSDT_SECTION_H +#define _UCSI_MPEG_TSDT_SECTION_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/section.h> + +/** + * mpeg_tsdt_section structure. + */ +struct mpeg_tsdt_section { +	struct section_ext head; + +	/* struct descriptor descriptors[] */ +} __ucsi_packed; + +/** + * Process an mpeg_tsdt_section structure. + * + * @param section Pointer to the section_ext structure. + * @return Pointer to the mpeg_tsdt_section structure, or NULL on error. + */ +extern struct mpeg_tsdt_section *mpeg_tsdt_section_codec(struct section_ext *section); + +/** + * Convenience iterator for descriptors field. + * + * @param tsdt Pointer to the mpeg_tsdt_section structure. + * @param pos Variable holding a pointer to the current descriptor. + */ +#define mpeg_tsdt_section_descriptors_for_each(tsdt, pos) \ +	for ((pos) = mpeg_tsdt_section_descriptors_first(tsdt); \ +	     (pos); \ +	     (pos) = mpeg_tsdt_section_descriptors_next(tsdt, pos)) + + + + + + + + + + +/******************************** PRIVATE CODE ********************************/ +static inline struct descriptor * +	mpeg_tsdt_section_descriptors_first(struct mpeg_tsdt_section * tsdt) +{ +	size_t pos = sizeof(struct mpeg_tsdt_section); + +	if (pos >= section_ext_length(&tsdt->head)) +		return NULL; + +	return (struct descriptor*)((uint8_t *) tsdt + pos); +} + +static inline struct descriptor * +	mpeg_tsdt_section_descriptors_next(struct mpeg_tsdt_section *tsdt, +					   struct descriptor* pos) +{ +	return next_descriptor((uint8_t *) tsdt + sizeof(struct mpeg_tsdt_section), +			      section_ext_length(&tsdt->head) - sizeof(struct mpeg_tsdt_section), +			      pos); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/types.h b/lib/libucsi/mpeg/types.h new file mode 100644 index 0000000..300cb23 --- /dev/null +++ b/lib/libucsi/mpeg/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_MPEG_TYPES_H +#define _UCSI_MPEG_TYPES_H 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * Known stream types. + */ +enum { +	MPEG_STREAM_TYPE_ISO11172_VIDEO    = 0x01, +	MPEG_STREAM_TYPE_ISO13818_2_VIDEO    = 0x02, +	MPEG_STREAM_TYPE_ISO11172_AUDIO    = 0x03, +	MPEG_STREAM_TYPE_ISO13818_3_AUDIO    = 0x04, +	MPEG_STREAM_TYPE_ISO13818_1_PRIVATE_SECTIONS = 0x05, +	MPEG_STREAM_TYPE_ISO13818_1_PRIVATE_PES  = 0x06, +	MPEG_STREAM_TYPE_ISO13522_MHEG     = 0x07, +	MPEG_STREAM_TYPE_ISO13818_DSMCC    = 0x08, +	MPEG_STREAM_TYPE_ITUH222_1     = 0x09, +	MPEG_STREAM_TYPE_ISO13818_6_A    = 0x0a, +	MPEG_STREAM_TYPE_ISO13818_6_B    = 0x0b, +	MPEG_STREAM_TYPE_ISO13818_6_C    = 0x0c, +	MPEG_STREAM_TYPE_ISO13818_6_D    = 0x0d, +	MPEG_STREAM_TYPE_ISO13818_1_AUX    = 0x0e, +	MPEG_STREAM_TYPE_ISO13818_7_AUDIO_ADTS = 0x0f, +	MPEG_STREAM_TYPE_ISO14496_2_VISUAL   = 0x10, +	MPEG_STREAM_TYPE_ISO14496_3_AUDIO_LATM = 0x11, +	MPEG_STREAM_TYPE_ISO14496_1_PES    = 0x12, +	MPEG_STREAM_TYPE_ISO14496_1_SECTIONS   = 0x13, +	MPEG_STREAM_TYPE_ISO14496_6_SYNCDOWNLOAD = 0x14, +	MPEG_STREAM_TYPE_METADATA_PES    = 0x15, +	MPEG_STREAM_TYPE_METADATA_SECTIONS   = 0x16, +	MPEG_STREAM_TYPE_METADATA_DSMCC_DATA   = 0x17, +	MPEG_STREAM_TYPE_METADATA_DSMCC_OBJECT = 0x18, +	MPEG_STREAM_TYPE_METADATA_SYNCDOWNLOAD = 0x19, +}; + +/** + * Metadata formats + */ +enum { +	MPEG_METADATA_FORMAT_ISO15938_1_TEM				= 0x01, +	MPEG_METADATA_FORMAT_ISO15938_1_BIM				= 0x02, +	MPEG_METADATA_FORMAT_METADATA_APPLICATION_FORMAT		= 0x3F, +	MPEG_METADATA_FORMAT_METADATA_APPLICATION_FORMAT_ID		= 0xFF, +}; + +/** + * MPEG 4 audio profile and levels. + */ +enum { +	MPEG4_AUDIO_PROFILE_MAIN_LEVEL_1		= 0x10, +	MPEG4_AUDIO_PROFILE_MAIN_LEVEL_2		= 0x11, +	MPEG4_AUDIO_PROFILE_MAIN_LEVEL_3		= 0x12, +	MPEG4_AUDIO_PROFILE_MAIN_LEVEL_4		= 0x13, + +	MPEG4_AUDIO_PROFILE_SCALABLE_LEVEL_1		= 0x18, +	MPEG4_AUDIO_PROFILE_SCALABLE_LEVEL_2		= 0x19, +	MPEG4_AUDIO_PROFILE_SCALABLE_LEVEL_3		= 0x1a, +	MPEG4_AUDIO_PROFILE_SCALABLE_LEVEL_4		= 0x1b, + +	MPEG4_AUDIO_PROFILE_SPEECH_LEVEL_1		= 0x20, +	MPEG4_AUDIO_PROFILE_SPEECH_LEVEL_2		= 0x21, + +	MPEG4_AUDIO_PROFILE_SYNTHESIS_LEVEL_1		= 0x28, +	MPEG4_AUDIO_PROFILE_SYNTHESIS_LEVEL_2		= 0x29, +	MPEG4_AUDIO_PROFILE_SYNTHESIS_LEVEL_3		= 0x2a, + +	MPEG4_AUDIO_PROFILE_HQ_LEVEL_1			= 0x30, +	MPEG4_AUDIO_PROFILE_HQ_LEVEL_2			= 0x31, +	MPEG4_AUDIO_PROFILE_HQ_LEVEL_3			= 0x32, +	MPEG4_AUDIO_PROFILE_HQ_LEVEL_4			= 0x33, +	MPEG4_AUDIO_PROFILE_HQ_LEVEL_5			= 0x34, +	MPEG4_AUDIO_PROFILE_HQ_LEVEL_6			= 0x35, +	MPEG4_AUDIO_PROFILE_HQ_LEVEL_7			= 0x36, +	MPEG4_AUDIO_PROFILE_HQ_LEVEL_8			= 0x37, + +	MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_1		= 0x38, +	MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_2		= 0x39, +	MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_3		= 0x3a, +	MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_4		= 0x3b, +	MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_5		= 0x3c, +	MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_6		= 0x3d, +	MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_7		= 0x3e, +	MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_8		= 0x3f, + +	MPEG4_AUDIO_PROFILE_NATURAL_LEVEL_1		= 0x40, +	MPEG4_AUDIO_PROFILE_NATURAL_LEVEL_2		= 0x41, +	MPEG4_AUDIO_PROFILE_NATURAL_LEVEL_3		= 0x42, +	MPEG4_AUDIO_PROFILE_NATURAL_LEVEL_4		= 0x43, + +	MPEG4_AUDIO_PROFILE_MOBILE_LEVEL_1		= 0x48, +	MPEG4_AUDIO_PROFILE_MOBILE_LEVEL_2		= 0x49, +	MPEG4_AUDIO_PROFILE_MOBILE_LEVEL_3		= 0x4a, +	MPEG4_AUDIO_PROFILE_MOBILE_LEVEL_4		= 0x4b, +	MPEG4_AUDIO_PROFILE_MOBILE_LEVEL_5		= 0x4c, +	MPEG4_AUDIO_PROFILE_MOBILE_LEVEL_6		= 0x4d, +}; + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/video_stream_descriptor.h b/lib/libucsi/mpeg/video_stream_descriptor.h new file mode 100644 index 0000000..14e9196 --- /dev/null +++ b/lib/libucsi/mpeg/video_stream_descriptor.h @@ -0,0 +1,101 @@ +/* + * 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_MPEG_VIDEO_STREAM_DESCRIPTOR +#define _UCSI_MPEG_VIDEO_STREAM_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> +#include <libucsi/endianops.h> + +/** + * The mpeg_video_stream_descriptor structure + */ +struct mpeg_video_stream_descriptor { +	struct descriptor d; + +  EBIT5(uint8_t multiple_frame_rate_flag	: 1; , +	uint8_t frame_rate_code			: 4; , +	uint8_t mpeg_1_only_flag		: 1; , +	uint8_t constrained_parameter_flag	: 1; , +	uint8_t still_picture_flag		: 1; ); +	/* if (mpeg_1_only_flag == 0) struct mpeg_video_stream_extra extra */ +} __ucsi_packed; + +/** + * The mpeg_video_stream_extra - only present in non-MPEG1-only streams. + */ +struct mpeg_video_stream_extra { +	uint8_t profile_and_level_indication; +  EBIT3(uint8_t chroma_format			: 2; , +	uint8_t frame_rate_extension		: 1; , +	uint8_t reserved			: 5; ); +} __ucsi_packed; + +/** + * Process an mpeg_video_stream_descriptor structure. + * + * @param d Pointer to the generic descriptor structure. + * @return Pointer to the mpeg_video_stream_descriptor, or NULL on error. + */ +static inline struct mpeg_video_stream_descriptor* +	mpeg_video_stream_descriptor_codec(struct descriptor* d) +{ +	struct mpeg_video_stream_descriptor* vsd = +			(struct mpeg_video_stream_descriptor*) d; + +	if (d->len < (sizeof(struct mpeg_video_stream_descriptor) - 2)) +		return NULL; + +	if (!vsd->mpeg_1_only_flag) { +		if (d->len != (sizeof(struct mpeg_video_stream_descriptor) + +				  sizeof(struct mpeg_video_stream_extra) - 2)) +			return NULL; +	} + +	return (struct mpeg_video_stream_descriptor*) d; +} + +/** + * Get a pointer to the mpeg_video_stream_extra structure. + * + * @param d Pointer to the mpeg_video_stream_descriptor structure. + * @return Pointer to the mpeg_video_stream_extra structure, or NULL on error. + */ +static inline struct mpeg_video_stream_extra* +	mpeg_video_stream_descriptor_extra(struct mpeg_video_stream_descriptor* d) +{ +	if (d->mpeg_1_only_flag != 0) +		return NULL; + +	return (struct mpeg_video_stream_extra*) +		((uint8_t*) d + sizeof(struct mpeg_video_stream_descriptor)); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/libucsi/mpeg/video_window_descriptor.h b/lib/libucsi/mpeg/video_window_descriptor.h new file mode 100644 index 0000000..a9a63c7 --- /dev/null +++ b/lib/libucsi/mpeg/video_window_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_MPEG_VIDEO_WINDOW_DESCRIPTOR +#define _UCSI_MPEG_VIDEO_WINDOW_DESCRIPTOR 1 + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <libucsi/descriptor.h> + +/** + * mpeg_video_window_descriptor structure. + */ +struct mpeg_video_window_descriptor { +	struct descriptor d; + +  EBIT3(uint32_t horizontal_offset		: 14; , +	uint32_t vertical_offset		: 14; , +	uint32_t window_priority		: 4;  ); +} __ucsi_packed; + +/** + * Process an mpeg_video_window_descriptor. + * + * @param d Pointer to the generic descriptor structure. + * @return Pointer to the mpeg_video_window_descriptor structure, or NULL on error. + */ +static inline struct mpeg_video_window_descriptor* +	mpeg_video_window_descriptor_codec(struct descriptor* d) +{ +	if (d->len != (sizeof(struct mpeg_video_window_descriptor) - 2)) +		return NULL; + +	bswap32((uint8_t*) d + 2); + +	return (struct mpeg_video_window_descriptor*) d; +} + +#ifdef __cplusplus +} +#endif + +#endif | 
