diff options
author | etobi <git@e-tobi.net> | 2013-09-03 09:48:41 +0200 |
---|---|---|
committer | etobi <git@e-tobi.net> | 2013-09-03 09:48:41 +0200 |
commit | ab959d7b4194715870128e616b8e29d4a101e488 (patch) | |
tree | 61a746231d30817be73416a7d67763fd677a1042 /lib/libucsi/mpeg | |
parent | 6b350466c4902c5b137e0efaf1d189128a7f18f5 (diff) | |
download | linux-dvb-apps-753ce5b9809deed38d6db404dc72e1e0e8ac4b29.tar.gz |
Imported Upstream version 1.1.1+rev1207upstream/1.1.1+rev1207
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 |