From b2812b7e71b4b5ef038045f48a5697a4dd063192 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Wed, 15 Jun 2011 21:29:03 +0200 Subject: Added support for "content identifier descriptor" and "default authority descriptor" to 'libsi' --- libsi/descriptor.c | 29 ++++++++++++++++++++++++++++- libsi/descriptor.h | 27 ++++++++++++++++++++++++++- libsi/headers.h | 20 +++++++++++++++++++- libsi/si.c | 10 +++++++--- 4 files changed, 80 insertions(+), 6 deletions(-) (limited to 'libsi') diff --git a/libsi/descriptor.c b/libsi/descriptor.c index 59f636a3..06a58c0a 100644 --- a/libsi/descriptor.c +++ b/libsi/descriptor.c @@ -6,7 +6,7 @@ * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * - * $Id: descriptor.c 2.1 2010/11/01 15:24:31 kls Exp $ + * $Id: descriptor.c 2.2 2011/06/15 21:26:00 kls Exp $ * * ***************************************************************************/ @@ -643,6 +643,33 @@ void ServiceIdentifierDescriptor::Parse() { textualServiceIdentifier.setData(data+sizeof(descr_service_identifier), getLength()-sizeof(descr_service_identifier)); } +void ContentIdentifierDescriptor::Parse() { + identifierLoop.setData(data+sizeof(descr_content_identifier), getLength()-sizeof(descr_content_identifier)); +} + +void ContentIdentifierDescriptor::Identifier::Parse() { + int offset=0; + data.setPointerAndOffset(s, offset); + if (s->crid_location == 0) { + identifier.setData(data+(offset-1), s->crid_length); + } + else { + identifier.setData(data+(offset-1), 2); + } +} + +int ContentIdentifierDescriptor::Identifier::getCridType() const { + return s->crid_type; +} + +int ContentIdentifierDescriptor::Identifier::getCridLocation() const { + return s->crid_location; +} + +void DefaultAuthorityDescriptor::Parse() { + DefaultAuthority.setData(data+sizeof(descr_default_authority), getLength()-sizeof(descr_default_authority)); +} + void MultilingualNameDescriptor::Parse() { nameLoop.setData(data+sizeof(descr_multilingual_network_name), getLength()-sizeof(descr_multilingual_network_name)); } diff --git a/libsi/descriptor.h b/libsi/descriptor.h index 4f2e41b6..f105f7a0 100644 --- a/libsi/descriptor.h +++ b/libsi/descriptor.h @@ -6,7 +6,7 @@ * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * - * $Id: descriptor.h 2.1 2010/11/01 15:24:32 kls Exp $ + * $Id: descriptor.h 2.2 2011/06/15 21:26:00 kls Exp $ * * ***************************************************************************/ @@ -361,6 +361,31 @@ protected: virtual void Parse(); }; +class ContentIdentifierDescriptor : public Descriptor { +public: + class Identifier : public LoopElement { + public: + String identifier; + int getCridType() const; + int getCridLocation() const; + virtual int getLength() { return sizeof(content_identifier_entry)+identifier.getLength(); } + protected: + virtual void Parse(); + private: + const content_identifier_entry *s; + }; + StructureLoop identifierLoop; +protected: + virtual void Parse(); +}; + +class DefaultAuthorityDescriptor : public Descriptor { +public: + String DefaultAuthority; //ID +protected: + virtual void Parse(); +}; + //abstract base class class MultilingualNameDescriptor : public Descriptor { public: diff --git a/libsi/headers.h b/libsi/headers.h index 3ec35def..6867d2c9 100644 --- a/libsi/headers.h +++ b/libsi/headers.h @@ -10,7 +10,7 @@ * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * - * $Id: headers.h 2.1 2010/11/01 15:24:32 kls Exp $ + * $Id: headers.h 2.2 2011/06/15 21:26:00 kls Exp $ * * ***************************************************************************/ @@ -1680,6 +1680,24 @@ struct descr_content_identifier { u_char descriptor_length :8; }; +struct content_identifier_entry { +#if BYTE_ORDER == BIG_ENDIAN + u_char crid_type :6; + u_char crid_location :2; +#else + u_char crid_location :2; + u_char crid_type :6; +#endif + union { + u_char crid_length :8; + u_char crid_ref_hi :8; + }; + union { + u_char crid_byte :8; + u_char crid_ref_lo :8; + }; +}; + /* 0x77 time_slice_fec_identifier_descriptor (ETSI EN 301 192) */ struct descr_time_slice_fec_identifier { diff --git a/libsi/si.c b/libsi/si.c index 39911786..840b3a1f 100644 --- a/libsi/si.c +++ b/libsi/si.c @@ -6,7 +6,7 @@ * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * - * $Id: si.c 2.3 2010/11/01 15:24:32 kls Exp $ + * $Id: si.c 2.4 2011/06/15 21:26:00 kls Exp $ * * ***************************************************************************/ @@ -609,6 +609,12 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain, case RegistrationDescriptorTag: d=new RegistrationDescriptor(); break; + case ContentIdentifierDescriptorTag: + d=new ContentIdentifierDescriptor(); + break; + case DefaultAuthorityDescriptorTag: + d=new DefaultAuthorityDescriptor(); + break; //note that it is no problem to implement one //of the unimplemented descriptors. @@ -650,10 +656,8 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain, case TransportStreamDescriptorTag: //defined in ETSI EN 300 468 v 1.7.1 - case DefaultAuthorityDescriptorTag: case RelatedContentDescriptorTag: case TVAIdDescriptorTag: - case ContentIdentifierDescriptorTag: case TimeSliceFecIdentifierDescriptorTag: case ECMRepetitionRateDescriptorTag: case EnhancedAC3DescriptorTag: -- cgit v1.2.3