Added support for "content identifier descriptor" and "default authority descriptor" to 'libsi'

This commit is contained in:
Klaus Schmidinger 2011-06-15 21:29:03 +02:00
parent 263dc29508
commit b2812b7e71
6 changed files with 87 additions and 7 deletions

View File

@ -2722,3 +2722,7 @@ Marco G
Johan Andersson <jna@jna.pp.se> Johan Andersson <jna@jna.pp.se>
for reporting a bug in detecting frames in case the Picture Start Code or Access Unit for reporting a bug in detecting frames in case the Picture Start Code or Access Unit
Delimiter extends over TS packet boundaries Delimiter extends over TS packet boundaries
Dave Pickles <dave@pickles.me.uk>
for adding support for "content identifier descriptor" and "default authority
descriptor" to 'libsi'

View File

@ -6607,7 +6607,7 @@ Video Disk Recorder Revision History
- Avoiding an unecessary call to Recordings.ResetResume() (thanks to Reinhard - Avoiding an unecessary call to Recordings.ResetResume() (thanks to Reinhard
Nissl). Nissl).
2011-06-13: Version 1.7.19 2011-06-15: Version 1.7.19
- Fixed cString's operator=(const char *String) in case the given string is the - Fixed cString's operator=(const char *String) in case the given string is the
same as the existing one (thanks to Dirk Leber). same as the existing one (thanks to Dirk Leber).
@ -6647,3 +6647,5 @@ Video Disk Recorder Revision History
- The initial channel is now stored by the channel ID in the setup.conf file, in - The initial channel is now stored by the channel ID in the setup.conf file, in
order to avoid problems in case channels are reordered or deleted (reported by order to avoid problems in case channels are reordered or deleted (reported by
Lars Bläser). Lars Bläser).
- Added support for "content identifier descriptor" and "default authority descriptor"
to 'libsi' (thanks to Dave Pickles).

View File

@ -6,7 +6,7 @@
* the Free Software Foundation; either version 2 of the License, or * * the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. * * (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)); 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<const content_identifier_entry>(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() { void MultilingualNameDescriptor::Parse() {
nameLoop.setData(data+sizeof(descr_multilingual_network_name), getLength()-sizeof(descr_multilingual_network_name)); nameLoop.setData(data+sizeof(descr_multilingual_network_name), getLength()-sizeof(descr_multilingual_network_name));
} }

View File

@ -6,7 +6,7 @@
* the Free Software Foundation; either version 2 of the License, or * * the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. * * (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(); 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<Identifier> identifierLoop;
protected:
virtual void Parse();
};
class DefaultAuthorityDescriptor : public Descriptor {
public:
String DefaultAuthority; //ID
protected:
virtual void Parse();
};
//abstract base class //abstract base class
class MultilingualNameDescriptor : public Descriptor { class MultilingualNameDescriptor : public Descriptor {
public: public:

View File

@ -10,7 +10,7 @@
* the Free Software Foundation; either version 2 of the License, or * * the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. * * (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; 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) */ /* 0x77 time_slice_fec_identifier_descriptor (ETSI EN 301 192) */
struct descr_time_slice_fec_identifier { struct descr_time_slice_fec_identifier {

View File

@ -6,7 +6,7 @@
* the Free Software Foundation; either version 2 of the License, or * * the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. * * (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: case RegistrationDescriptorTag:
d=new RegistrationDescriptor(); d=new RegistrationDescriptor();
break; break;
case ContentIdentifierDescriptorTag:
d=new ContentIdentifierDescriptor();
break;
case DefaultAuthorityDescriptorTag:
d=new DefaultAuthorityDescriptor();
break;
//note that it is no problem to implement one //note that it is no problem to implement one
//of the unimplemented descriptors. //of the unimplemented descriptors.
@ -650,10 +656,8 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain,
case TransportStreamDescriptorTag: case TransportStreamDescriptorTag:
//defined in ETSI EN 300 468 v 1.7.1 //defined in ETSI EN 300 468 v 1.7.1
case DefaultAuthorityDescriptorTag:
case RelatedContentDescriptorTag: case RelatedContentDescriptorTag:
case TVAIdDescriptorTag: case TVAIdDescriptorTag:
case ContentIdentifierDescriptorTag:
case TimeSliceFecIdentifierDescriptorTag: case TimeSliceFecIdentifierDescriptorTag:
case ECMRepetitionRateDescriptorTag: case ECMRepetitionRateDescriptorTag:
case EnhancedAC3DescriptorTag: case EnhancedAC3DescriptorTag: