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>
for reporting a bug in detecting frames in case the Picture Start Code or Access Unit
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
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
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
order to avoid problems in case channels are reordered or deleted (reported by
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 *
* (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<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() {
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 *
* (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<Identifier> 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:

View File

@ -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 {

View File

@ -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: