diff options
| -rw-r--r-- | libsi/descriptor.c | 119 | ||||
| -rw-r--r-- | libsi/descriptor.h | 21 | ||||
| -rwxr-xr-x | libsi/gendescr.pl | 7 | ||||
| -rw-r--r-- | libsi/headers.h | 415 | ||||
| -rw-r--r-- | libsi/section.c | 24 | ||||
| -rw-r--r-- | libsi/section.h | 19 | ||||
| -rw-r--r-- | libsi/si.c | 40 | ||||
| -rw-r--r-- | libsi/si.h | 40 | ||||
| -rw-r--r-- | libsi/util.c | 35 | ||||
| -rw-r--r-- | libsi/util.h | 36 | 
10 files changed, 217 insertions, 539 deletions
| diff --git a/libsi/descriptor.c b/libsi/descriptor.c index eabe0c9e..433d6802 100644 --- a/libsi/descriptor.c +++ b/libsi/descriptor.c @@ -6,16 +6,15 @@   *   the Free Software Foundation; either version 2 of the License, or     *   *   (at your option) any later version.                                   *   *                                                                         * + *   $Id: descriptor.c 1.2 2003/12/13 10:42:05 kls Exp $ + *                                                                         *   ***************************************************************************/ -   #include <string.h>  #include "descriptor.h"  namespace SI { - -  void ShortEventDescriptor::Parse() {     unsigned int offset=0;     const descr_short_event *s; @@ -29,9 +28,6 @@ void ShortEventDescriptor::Parse() {     text.setData(data+offset, mid->text_length);  } - - -  int ExtendedEventDescriptor::getDescriptorNumber() {     return s->descriptor_number;  } @@ -52,9 +48,6 @@ void ExtendedEventDescriptor::Parse() {     text.setData(data+offset, mid->text_length);  } - - -  void ExtendedEventDescriptor::Item::Parse() {     unsigned int offset=0;     const item_extended_event *first; @@ -65,7 +58,6 @@ void ExtendedEventDescriptor::Item::Parse() {     item.setData(data+offset, mid->item_length);  } -  int ExtendedEventDescriptors::getTextLength() {     int ret=0;     for (int i=0;i<length;i++) { @@ -116,18 +108,18 @@ char *ExtendedEventDescriptors::getText(char *buffer) {           memcpy(buffer+index, tempbuf, len);           index+=len;        } -       +        ExtendedEventDescriptor::Item item;        for (Loop::Iterator it; d->itemLoop.hasNext(it);   ) {           item=d->itemLoop.getNext(it); -          +           item.item.getText(tempbuf);           len=strlen(tempbuf);           if (len) {              memcpy(buffer+index, tempbuf, len);              index+=len;           } -          +           item.itemDescription.getText(tempbuf);           len=strlen(tempbuf);           if (len) { @@ -140,9 +132,6 @@ char *ExtendedEventDescriptors::getText(char *buffer) {     return buffer;  } - - -  int TimeShiftedEventDescriptor::getReferenceServiceId() const {     return HILO(s->reference_service_id);  } @@ -155,17 +144,11 @@ void TimeShiftedEventDescriptor::Parse() {     s=data.getData<const descr_time_shifted_event>();  } - - -  void ContentDescriptor::Parse() {     //this descriptor is only a header and a loop     nibbleLoop.setData(data+sizeof(SectionHeader), getLength()-sizeof(SectionHeader));  } - - -  int ContentDescriptor::Nibble::getContentNibbleLevel1() const {     return s->content_nibble_level_1;  } @@ -186,15 +169,11 @@ void ContentDescriptor::Nibble::Parse() {     s=data.getData<const nibble_content>();  } - - -  void ParentalRatingDescriptor::Parse() {     //this descriptor is only a header and a loop     ratingLoop.setData(data+sizeof(SectionHeader), getLength()-sizeof(SectionHeader));  } -  int ParentalRatingDescriptor::Rating::getRating() const {     return s->rating;  } @@ -206,9 +185,6 @@ void ParentalRatingDescriptor::Rating::Parse() {     languageCode[2]=s->lang_code3;  } - - -  int CaDescriptor::getCaType() const {     return HILO(s->CA_type);  } @@ -223,8 +199,6 @@ void CaDescriptor::Parse() {     privateData.assign(data.getData(offset), getLength()-offset);  } - -  int StreamIdentifierDescriptor::getComponentTag() const {     return s->component_tag;  } @@ -233,25 +207,14 @@ void StreamIdentifierDescriptor::Parse() {     s=data.getData<const descr_stream_identifier>();  } - - -  void NetworkNameDescriptor::Parse() {     name.setData(data+sizeof(descr_network_name), getLength()-sizeof(descr_network_name));  } - - -  void CaIdentifierDescriptor::Parse() {     identifiers.setData(data+sizeof(descr_ca_identifier), getLength()-sizeof(descr_ca_identifier));  } - - - - -  int CarouselIdentifierDescriptor::getCarouselId() const {     return (HILO(s->carousel_id_hi) << 16) | HILO(s->carousel_id_lo);  } @@ -264,16 +227,10 @@ void CarouselIdentifierDescriptor::Parse() {     s=data.getData<const descr_carousel_identifier>();  } - - -  void ServiceListDescriptor::Parse() {     serviceLoop.setData(data+sizeof(descr_service_list), getLength()-sizeof(descr_service_list));  } - - -  int ServiceListDescriptor::Service::getServiceId() const {     return HILO(s->service_id);  } @@ -286,9 +243,6 @@ void ServiceListDescriptor::Service::Parse() {     s=data.getData<const descr_service_list_loop>();  } - - -  int SatelliteDeliverySystemDescriptor::getFrequency() const {     return (HILO(s->frequency_hi) << 16) | HILO(s->frequency_lo);  } @@ -321,9 +275,6 @@ void SatelliteDeliverySystemDescriptor::Parse() {     s=data.getData<const descr_satellite_delivery_system>();  } - - -  int CableDeliverySystemDescriptor::getFrequency() const {     return (HILO(s->frequency_hi) << 16) | HILO(s->frequency_lo);  } @@ -348,9 +299,6 @@ void CableDeliverySystemDescriptor::Parse() {     s=data.getData<const descr_cable_delivery_system>();  } - - -  int TerrestrialDeliverySystemDescriptor::getFrequency() const {     return (HILO(s->frequency_hi) << 16) | HILO(s->frequency_lo);  } @@ -391,9 +339,6 @@ void TerrestrialDeliverySystemDescriptor::Parse() {     s=data.getData<const descr_terrestrial_delivery>();  } - - -  int ServiceDescriptor::getServiceType() const {     return s->service_type;  } @@ -411,9 +356,6 @@ void NVODReferenceDescriptor::Parse() {     serviceLoop.setData(data+sizeof(descr_nvod_reference), getLength()-sizeof(descr_nvod_reference));  } - - -  int NVODReferenceDescriptor::Service::getTransportStream() const {     return HILO(s->transport_stream_id);  } @@ -430,9 +372,6 @@ void NVODReferenceDescriptor::Service::Parse() {     s=data.getData<const item_nvod_reference>();  } - - -  int TimeShiftedServiceDescriptor::getReferenceServiceId() const {     return HILO(s->reference_service_id);  } @@ -441,9 +380,6 @@ void TimeShiftedServiceDescriptor::Parse() {     s=data.getData<const descr_time_shifted_service>();  } - - -  int ComponentDescriptor::getStreamContent() const {     return s->stream_content;  } @@ -465,16 +401,10 @@ void ComponentDescriptor::Parse() {     description.setData(data+offset, getLength()-offset);  } - - -  void SubtitlingDescriptor::Parse() {     subtitlingLoop.setData(data+sizeof(descr_subtitling), getLength()-sizeof(descr_subtitling));  } - - -  int SubtitlingDescriptor::Subtitling::getSubtitlingType() const {     return s->subtitling_type;  } @@ -491,9 +421,6 @@ void SubtitlingDescriptor::Subtitling::Parse() {     s=data.getData<const item_subtitling>();  } - - -  int ServiceMoveDescriptor::getNewOriginalNetworkId() const {     return HILO(s->new_original_network_id);  } @@ -510,9 +437,6 @@ void ServiceMoveDescriptor::Parse() {     s=data.getData<const descr_service_move>();  } - - -  int FrequencyListDescriptor::getCodingType() const {     return s->coding_type;  } @@ -523,19 +447,14 @@ void FrequencyListDescriptor::Parse() {     frequencies.setData(data+offset, getLength()-offset);  } - - -  void ServiceIdentifierDescriptor::Parse() {     textualServiceIdentifier.setData(data+sizeof(descr_service_identifier), getLength()-sizeof(descr_service_identifier));  } -  void MultilingualNameDescriptor::Parse() {     nameLoop.setData(data+sizeof(descr_multilingual_network_name), getLength()-sizeof(descr_multilingual_network_name));  } -  void MultilingualNameDescriptor::Name::Parse() {     unsigned int offset=0;     const entry_multilingual_name *s; @@ -546,7 +465,6 @@ void MultilingualNameDescriptor::Name::Parse() {     name.setData(data+offset, s->text_length);  } -  int MultilingualComponentDescriptor::getComponentTag() const {     return s->component_tag;  } @@ -554,19 +472,13 @@ int MultilingualComponentDescriptor::getComponentTag() const {  void MultilingualComponentDescriptor::Parse() {     unsigned int offset=0;     data.setPointerAndOffset<const descr_multilingual_component>(s, offset); -   nameLoop.setData(data+sizeof(descr_multilingual_component), getLength()-sizeof(descr_multilingual_component));    +   nameLoop.setData(data+sizeof(descr_multilingual_component), getLength()-sizeof(descr_multilingual_component));  } - - -  void MultilingualServiceNameDescriptor::Parse() {     nameLoop.setData(data+sizeof(descr_multilingual_network_name), getLength()-sizeof(descr_multilingual_network_name));  } - - -  void MultilingualServiceNameDescriptor::Name::Parse() {     unsigned int offset=0;     const entry_multilingual_name *s; @@ -580,9 +492,6 @@ void MultilingualServiceNameDescriptor::Name::Parse() {     name.setData(data+offset, mid->service_name_length);  } - - -  void ApplicationSignallingDescriptor::Parse() {     entryLoop.setData(data+sizeof(descr_application_signalling), getLength()-sizeof(descr_application_signalling));  } @@ -599,10 +508,6 @@ void ApplicationSignallingDescriptor::ApplicationEntryDescriptor::Parse() {     s=data.getData<const application_signalling_entry>();  } - - - -  bool MHP_ApplicationDescriptor::isServiceBound() const {     return s->service_bound_flag;  } @@ -615,7 +520,6 @@ int MHP_ApplicationDescriptor::getApplicationPriority() const {     return s->application_priority;  } -  void MHP_ApplicationDescriptor::Parse() {     unsigned int offset=0;     const descr_application *dapp; @@ -625,7 +529,6 @@ void MHP_ApplicationDescriptor::Parse() {     transportProtocolLabels.setData(data+offset, getLength()-offset);  } -  int MHP_ApplicationDescriptor::Profile::getApplicationProfile() const {        return HILO(s->application_profile);  } @@ -646,8 +549,6 @@ void MHP_ApplicationDescriptor::Profile::Parse() {     s=data.getData<application_profile_entry>();  } - -  void MHP_ApplicationNameDescriptor::Parse() {     nameLoop.setData(data+sizeof(descr_application_name), getLength()-sizeof(descr_application_name));  } @@ -661,8 +562,6 @@ void MHP_ApplicationNameDescriptor::NameEntry::Parse() {     languageCode[2]=s->lang_code3;  } - -  int MHP_TransportProtocolDescriptor::getProtocolId() const {     return HILO(s->protocol_id);  } @@ -701,8 +600,6 @@ void MHP_TransportProtocolDescriptor::Parse() {     }  } - -  void MHP_DVBJApplicationDescriptor::Parse() {     applicationLoop.setData(data+sizeof(descr_dvbj_application), getLength()-sizeof(descr_dvbj_application));  } @@ -712,7 +609,6 @@ void MHP_DVBJApplicationDescriptor::ApplicationEntry::Parse() {     parameter.setData(data+sizeof(descr_dvbj_application_entry), entry->parameter_length);  } -  void MHP_DVBJApplicationLocationDescriptor::Parse() {     unsigned int offset=0;     const descr_dvbj_application_location *first; @@ -724,7 +620,6 @@ void MHP_DVBJApplicationLocationDescriptor::Parse() {     initialClass.setData(data+offset, getLength()-offset);  } -  int MHP_ApplicationIconsDescriptor::getIconFlags() const {     return HILO(s->icon_flags);  } @@ -738,5 +633,3 @@ void MHP_ApplicationIconsDescriptor::Parse() {  }  } //end of namespace - - diff --git a/libsi/descriptor.h b/libsi/descriptor.h index 24d95e8e..9abe1f01 100644 --- a/libsi/descriptor.h +++ b/libsi/descriptor.h @@ -6,6 +6,8 @@   *   the Free Software Foundation; either version 2 of the License, or     *   *   (at your option) any later version.                                   *   *                                                                         * + *   $Id: descriptor.h 1.2 2003/12/13 10:42:08 kls Exp $ + *                                                                         *   ***************************************************************************/  #ifndef LIBSI_DESCRIPTOR_H @@ -16,7 +18,6 @@  namespace SI { -  class ShortEventDescriptor : public Descriptor {  public:     char languageCode[3]; @@ -56,10 +57,9 @@ public:     //same semantics as with SI::String     char *getText();     //buffer must at least be getTextLength(), getMaximumTextLength() is a good choice -   char *getText(char *buffer);  +   char *getText(char *buffer);  }; -  class TimeShiftedEventDescriptor : public Descriptor {  public:     int getReferenceServiceId() const; @@ -89,7 +89,6 @@ protected:     virtual void Parse();  }; -  class ParentalRatingDescriptor : public Descriptor {  public:     class Rating : public LoopElement { @@ -107,7 +106,6 @@ protected:     virtual void Parse();  }; -  class CaDescriptor : public Descriptor {  public:     int getCaType() const; @@ -172,7 +170,6 @@ protected:     virtual void Parse();  }; -  class SatelliteDeliverySystemDescriptor : public Descriptor {  public:     int getFrequency() const; @@ -247,7 +244,6 @@ protected:     virtual void Parse();  }; -  class TimeShiftedServiceDescriptor : public Descriptor {  public:     int getReferenceServiceId() const; @@ -288,7 +284,6 @@ protected:     virtual void Parse();  }; -  class ServiceMoveDescriptor : public Descriptor {  public:     int getNewOriginalNetworkId() const; @@ -366,10 +361,6 @@ protected:     virtual void Parse();  }; - - - -  //a descriptor currently unimplemented in this library  class UnimplementedDescriptor : public Descriptor {  protected: @@ -418,7 +409,6 @@ protected:     virtual void Parse();  }; -  class MHP_ApplicationNameDescriptor : public Descriptor {  public:     class NameEntry : public LoopElement { @@ -434,7 +424,6 @@ protected:     virtual void Parse();  }; -  class MHP_TransportProtocolDescriptor : public Descriptor {  public:     enum Protocol { ObjectCarousel = 0x01, IPviaDVB = 0x02, HTTPoverInteractionChannel = 0x03 }; @@ -464,7 +453,6 @@ protected:     virtual void Parse();  }; -  class MHP_DVBJApplicationLocationDescriptor : public Descriptor {  public:     String baseDirectory; @@ -484,9 +472,6 @@ private:     const descr_application_icons_descriptor_end *s;  }; - -  } //end of namespace  #endif //LIBSI_TABLE_H - diff --git a/libsi/gendescr.pl b/libsi/gendescr.pl index 901bb834..8273f640 100755 --- a/libsi/gendescr.pl +++ b/libsi/gendescr.pl @@ -1,5 +1,7 @@  #!/usr/bin/perl +# $Id: gendescr.pl 1.2 2003/12/13 10:42:05 kls Exp $ +  print "Name (ohne ...Descriptor):";  $name=<STDIN>;  $name =~ s/\n$//; @@ -10,7 +12,6 @@ print "Struct:";  $struct=<STDIN>;  $struct =~ s/\n$//; -  mm:  $index=0;  $which=1; @@ -44,7 +45,7 @@ sub schreib {     print "Danke.\n";     open(OUTPUT_H, ">>".$filename_h) or die "Could not open file!!";     open(OUTPUT_C, ">>".$filename_c) or die "Could not open file!!"; -    +     if ($inner) {        $offset="   ";     } else { @@ -63,7 +64,7 @@ sub schreib {        print (OUTPUT_H "\n".$offset."   int get".$members[$i]."() const;");     }     print(OUTPUT_H "\n".$offset."virtual int getLength() { return sizeof(".$struct."); }") if ($inner); -    +     print(OUTPUT_H "\n".$offset."protected:\n".$offset."   virtual void Parse();");     print(OUTPUT_H "\n".$offset."private:\n".$offset."   const ".$struct." *s;") if ($struct ne "");     print(OUTPUT_H "\n".$offset."};\n\n"); diff --git a/libsi/headers.h b/libsi/headers.h index e8bef639..d5c11999 100644 --- a/libsi/headers.h +++ b/libsi/headers.h @@ -1,15 +1,17 @@  /*************************************************************************** - *                                                                         *      + *                                                                         *   *   (C) 2001-03 Rolf Hakenes <hakenes@hippomi.de>, under the              *   *               GNU GPL with contribution of Oleg Assovski,               *   *               www.satmania.com                                          * - *               Adapted and extended by Marcel Wiesweg                                 * + *               Adapted and extended by Marcel Wiesweg                    *   *                                                                         *   *   This program is free software; you can redistribute it and/or modify  *   *   it under the terms of the GNU General Public License as published by  *   *   the Free Software Foundation; either version 2 of the License, or     *   *   (at your option) any later version.                                   *   *                                                                         * + *   $Id: headers.h 1.2 2003/12/13 10:43:26 kls Exp $ + *                                                                         *   ***************************************************************************/  #ifndef LIBSI_HEADERS_H @@ -22,29 +24,29 @@ namespace SI {  typedef unsigned char u_char;  struct SectionHeader { -   u_char table_id                               :8;  +   u_char table_id                               :8;  #if BYTE_ORDER == BIG_ENDIAN -   u_char section_syntax_indicator               :1;  -   u_char                                        :3;  -   u_char section_length_hi                      :4;  -#else  -   u_char section_length_hi                      :4;  -   u_char                                        :3;  -   u_char section_syntax_indicator               :1;  +   u_char section_syntax_indicator               :1; +   u_char                                        :3; +   u_char section_length_hi                      :4; +#else +   u_char section_length_hi                      :4; +   u_char                                        :3; +   u_char section_syntax_indicator               :1;  #endif -   u_char section_length_lo                      :8;  +   u_char section_length_lo                      :8;  };  struct ExtendedSectionHeader { -   u_char table_id                               :8;  +   u_char table_id                               :8;  #if BYTE_ORDER == BIG_ENDIAN -   u_char section_syntax_indicator               :1;  -   u_char                                        :3;  -   u_char section_length_hi                      :4;  -#else  -   u_char section_length_hi                      :4;  -   u_char                                        :3;  -   u_char section_syntax_indicator               :1;  +   u_char section_syntax_indicator               :1; +   u_char                                        :3; +   u_char section_length_hi                      :4; +#else +   u_char section_length_hi                      :4; +   u_char                                        :3; +   u_char section_syntax_indicator               :1;  #endif     u_char section_length_lo                      :8;     u_char table_id_extension_hi                  :8; @@ -127,7 +129,7 @@ struct pat_prog {     u_char network_pid_hi                         :5;     u_char                                        :3;  #endif -   u_char network_pid_lo                         :8;  +   u_char network_pid_lo                         :8;     /* or program_map_pid (if prog_num=0)*/  }; @@ -263,78 +265,78 @@ struct pmt_info {   *   */ -#define NIT_LEN 10  +#define NIT_LEN 10 -struct nit {  -   u_char table_id                               :8;  +struct nit { +   u_char table_id                               :8;  #if BYTE_ORDER == BIG_ENDIAN -   u_char section_syntax_indicator               :1;  -   u_char                                        :3;  -   u_char section_length_hi                      :4;  -#else  -   u_char section_length_hi                      :4;  -   u_char                                        :3;  -   u_char section_syntax_indicator               :1;  +   u_char section_syntax_indicator               :1; +   u_char                                        :3; +   u_char section_length_hi                      :4; +#else +   u_char section_length_hi                      :4; +   u_char                                        :3; +   u_char section_syntax_indicator               :1;  #endif -   u_char section_length_lo                      :8;  -   u_char network_id_hi                          :8;  -   u_char network_id_lo                          :8;  +   u_char section_length_lo                      :8; +   u_char network_id_hi                          :8; +   u_char network_id_lo                          :8;  #if BYTE_ORDER == BIG_ENDIAN -   u_char                                        :2;  -   u_char version_number                         :5;  -   u_char current_next_indicator                 :1;  +   u_char                                        :2; +   u_char version_number                         :5; +   u_char current_next_indicator                 :1;  #else -   u_char current_next_indicator                 :1;  -   u_char version_number                         :5;  -   u_char                                        :2;  +   u_char current_next_indicator                 :1; +   u_char version_number                         :5; +   u_char                                        :2;  #endif -   u_char section_number                         :8;  -   u_char last_section_number                    :8;  -#if BYTE_ORDER == BIG_ENDIAN  -   u_char                                        :4;  -   u_char network_descriptor_length_hi           :4;  +   u_char section_number                         :8; +   u_char last_section_number                    :8; +#if BYTE_ORDER == BIG_ENDIAN +   u_char                                        :4; +   u_char network_descriptor_length_hi           :4;  #else -   u_char network_descriptor_length_hi           :4;  -   u_char                                        :4;  +   u_char network_descriptor_length_hi           :4; +   u_char                                        :4;  #endif -   u_char network_descriptor_length_lo           :8;  +   u_char network_descriptor_length_lo           :8;    /* descriptors */ -};  -  -#define SIZE_NIT_MID 2  +}; + +#define SIZE_NIT_MID 2 -struct nit_mid {                                 // after descriptors  +struct nit_mid {                                 // after descriptors  #if BYTE_ORDER == BIG_ENDIAN -   u_char                                        :4;  -   u_char transport_stream_loop_length_hi        :4;  +   u_char                                        :4; +   u_char transport_stream_loop_length_hi        :4;  #else -   u_char transport_stream_loop_length_hi        :4;  -   u_char                                        :4;  +   u_char transport_stream_loop_length_hi        :4; +   u_char                                        :4;  #endif -   u_char transport_stream_loop_length_lo        :8;  -};  -  -#define SIZE_NIT_END 4  - -struct nit_end {  -   long CRC;  -};  -  -#define NIT_TS_LEN 6  - -struct ni_ts {  -   u_char transport_stream_id_hi                 :8;  -   u_char transport_stream_id_lo                 :8;  -   u_char original_network_id_hi                 :8;  -   u_char original_network_id_lo                 :8;  +   u_char transport_stream_loop_length_lo        :8; +}; + +#define SIZE_NIT_END 4 + +struct nit_end { +   long CRC; +}; + +#define NIT_TS_LEN 6 + +struct ni_ts { +   u_char transport_stream_id_hi                 :8; +   u_char transport_stream_id_lo                 :8; +   u_char original_network_id_hi                 :8; +   u_char original_network_id_lo                 :8;  #if BYTE_ORDER == BIG_ENDIAN -   u_char                                        :4;  -   u_char transport_descriptors_length_hi        :4;  -#else   -   u_char transport_descriptors_length_hi        :4;  -   u_char                                        :4;  +   u_char                                        :4; +   u_char transport_descriptors_length_hi        :4; +#else +   u_char transport_descriptors_length_hi        :4; +   u_char                                        :4;  #endif -   u_char transport_descriptors_length_lo        :8;  +   u_char transport_descriptors_length_lo        :8;     /* descriptors  */  }; @@ -426,7 +428,7 @@ struct sdt_descr {  /*   *   *    3) Event Information Table (EIT): - *  + *   *       - the EIT contains data concerning events or programmes such as event   *         name, start time, duration, etc.; - the use of different descriptors   *         allows the transmission of different kinds of event information e.g. @@ -505,7 +507,7 @@ struct eit_event {   */  struct rst { -   u_char table_id                               :8;  +   u_char table_id                               :8;  #if BYTE_ORDER == BIG_ENDIAN     u_char section_syntax_indicator               :1;     u_char                                        :3; @@ -516,7 +518,7 @@ struct rst {     u_char section_syntax_indicator               :1;  #endif     u_char section_length_lo                      :8; -};  +};  struct rst_info {     u_char transport_stream_id_hi                 :8; @@ -549,7 +551,7 @@ struct rst_info {  #define TDT_LEN 8  struct tdt { -   u_char table_id                               :8;  +   u_char table_id                               :8;  #if BYTE_ORDER == BIG_ENDIAN     u_char section_syntax_indicator               :1;     u_char                                        :3; @@ -579,7 +581,7 @@ struct tdt {  #define TOT_LEN 10  struct tot { -   u_char table_id                               :8;  +   u_char table_id                               :8;  #if BYTE_ORDER == BIG_ENDIAN     u_char section_syntax_indicator               :1;     u_char                                        :3; @@ -605,7 +607,6 @@ struct tot {     u_char descriptors_loop_length_lo             :8;  }; -  /*   *   *    7) Stuffing Table (ST): @@ -637,11 +638,11 @@ struct tot {   *   */      /* TO BE DONE */ -     +  /*   *   *    3) Application Information Table (AIT): - *  + *   *       - the AIT contains data concerning MHP application broadcast by a service.   *   */ @@ -685,50 +686,48 @@ struct ait {  #define SIZE_AIT_MID 2 -struct ait_mid {                                 // after descriptors  +struct ait_mid {                                 // after descriptors  #if BYTE_ORDER == BIG_ENDIAN -   u_char                                        :4;  -   u_char application_loop_length_hi             :4;  +   u_char                                        :4; +   u_char application_loop_length_hi             :4;  #else -   u_char application_loop_length_hi             :4;  -   u_char                                        :4;  +   u_char application_loop_length_hi             :4; +   u_char                                        :4;  #endif -   u_char application_loop_length_lo             :8;  -};  -  -#define SIZE_AIT_END 4  +   u_char application_loop_length_lo             :8; +}; + +#define SIZE_AIT_END 4 -struct ait_end {  -   long CRC;  -};  +struct ait_end { +   long CRC; +};  #define AIT_APP_LEN 9 -struct ait_app {  +struct ait_app {     //how to deal with 32 bit fields? -   u_char organisation_id_hi_hi                  :8;  -   u_char organisation_id_hi_lo                  :8;  -   u_char organisation_id_lo_hi                  :8;  -   u_char organisation_id_lo_lo                  :8;  +   u_char organisation_id_hi_hi                  :8; +   u_char organisation_id_hi_lo                  :8; +   u_char organisation_id_lo_hi                  :8; +   u_char organisation_id_lo_lo                  :8;     //long organisation_id                          :32;     u_char application_id_hi                      :8;     u_char application_id_lo                      :8;     u_char application_control_code               :8;  #if BYTE_ORDER == BIG_ENDIAN -   u_char                                        :4;  -   u_char application_descriptors_length_hi      :4;  -#else   -   u_char application_descriptors_length_hi      :4;  -   u_char                                        :4;  +   u_char                                        :4; +   u_char application_descriptors_length_hi      :4; +#else +   u_char application_descriptors_length_hi      :4; +   u_char                                        :4;  #endif -   u_char application_descriptors_length_lo      :8;  +   u_char application_descriptors_length_lo      :8;     /* descriptors  */  }; - -  /*   *   *    The following describes the different descriptors that can be used within @@ -754,11 +753,9 @@ struct descr_gen {     u_char descriptor_length                      :8;  }; -  #define GetDescriptorTag(x) (((descr_gen_t *) x)->descriptor_tag)  #define GetDescriptorLength(x) (((descr_gen_t *) x)->descriptor_length+DESCR_GEN_LEN) -  /* 0x09 ca_descriptor */  #define DESCR_CA_LEN 6 @@ -777,7 +774,6 @@ struct descr_ca {     u_char CA_PID_lo                              :8;  }; -  /* 0x0A iso_639_language_descriptor */  #define DESCR_ISO_639_LANGUAGE_LEN 5 @@ -789,8 +785,6 @@ struct descr_iso_639_language {     u_char lang_code3                             :8;  }; - -  /* 0x13 carousel_identifier_descriptor */  #define DESCR_CAROUSEL_IDENTIFIER_LEN 7 @@ -805,8 +799,6 @@ struct descr_carousel_identifier {     /* FormatSpecifier follows */  }; - -  /* 0x40 network_name_descriptor */  #define DESCR_NETWORK_NAME_LEN 2 @@ -815,8 +807,6 @@ struct descr_network_name {     u_char descriptor_length                      :8;  }; - -  /* 0x41 service_list_descriptor */  #define DESCR_SERVICE_LIST_LEN 2 @@ -825,7 +815,6 @@ struct descr_service_list {     u_char descriptor_length                      :8;  }; -  #define DESCR_SERVICE_LIST_LOOP_LEN 3  struct descr_service_list_loop {     u_char service_id_hi                          :8; @@ -833,8 +822,6 @@ struct descr_service_list_loop {     u_char service_type                           :8;  }; - -  /* 0x42 stuffing_descriptor */  #define DESCR_STUFFING_LEN XX @@ -844,8 +831,6 @@ struct descr_stuffing {     /* TBD */  }; - -  /* 0x43 satellite_delivery_system_descriptor */  #define DESCR_SATELLITE_DELIVERY_SYSTEM_LEN 13 @@ -879,8 +864,6 @@ struct descr_satellite_delivery_system {  #endif  }; - -  /* 0x44 cable_delivery_system_descriptor */  #define DESCR_CABLE_DELIVERY_SYSTEM_LEN 13 @@ -912,8 +895,6 @@ struct descr_cable_delivery_system {  #endif  }; - -  /* 0x45 vbi_data_descriptor */  #define DESCR_VBI_DATA_LEN XX @@ -923,8 +904,6 @@ struct descr_vbi_data {     /* TBD */  }; - -  /* 0x46 vbi_teletext_descriptor */  #define DESCR_VBI_TELETEXT_LEN XX @@ -934,8 +913,6 @@ struct descr_vbi_teletext {     /* TBD */  }; - -  /* 0x47 bouquet_name_descriptor */  #define DESCR_BOUQUET_NAME_LEN 2 @@ -944,8 +921,6 @@ struct descr_bouquet_name {     u_char descriptor_length                      :8;  }; - -  /* 0x48 service_descriptor */  #define DESCR_SERVICE_LEN  4 @@ -960,8 +935,6 @@ struct descr_service_mid {     u_char service_name_length                   :8;  }; - -  /* 0x49 country_availability_descriptor */  #define DESCR_COUNTRY_AVAILABILITY_LEN 3 @@ -977,8 +950,6 @@ struct descr_country_availability {  #endif  }; - -  /* 0x4A linkage_descriptor */  #define DESCR_LINKAGE_LEN 9 @@ -987,15 +958,13 @@ struct descr_linkage {     u_char descriptor_length                      :8;     u_char transport_stream_id_hi                 :8;     u_char transport_stream_id_lo                 :8; -   u_char original_network_id_hi                 :8;  -   u_char original_network_id_lo                 :8;  +   u_char original_network_id_hi                 :8; +   u_char original_network_id_lo                 :8;     u_char service_id_hi                          :8;     u_char service_id_lo                          :8;     u_char linkage_type                           :8;  }; - -  /* 0x4B nvod_reference_descriptor */  #define DESCR_NVOD_REFERENCE_LEN 2 @@ -1004,20 +973,16 @@ struct descr_nvod_reference {     u_char descriptor_length                      :8;  }; -  #define ITEM_NVOD_REFERENCE_LEN 6  struct item_nvod_reference {     u_char transport_stream_id_hi                 :8;     u_char transport_stream_id_lo                 :8; -   u_char original_network_id_hi                 :8;  -   u_char original_network_id_lo                 :8;  +   u_char original_network_id_hi                 :8; +   u_char original_network_id_lo                 :8;     u_char service_id_hi                          :8;     u_char service_id_lo                          :8;  }; - - -  /* 0x4C time_shifted_service_descriptor */  #define DESCR_TIME_SHIFTED_SERVICE_LEN 4 @@ -1028,8 +993,6 @@ struct descr_time_shifted_service {     u_char reference_service_id_lo                :8;  }; - -  /* 0x4D short_event_descriptor */  #define DESCR_SHORT_EVENT_LEN 6 @@ -1046,8 +1009,6 @@ struct descr_short_event_mid {     u_char text_length                      :8;  }; - -  /* 0x4E extended_event_descriptor */  #define DESCR_EXTENDED_EVENT_LEN 7 @@ -1072,7 +1033,6 @@ struct descr_extended_event_mid {     u_char text_length                            :8;  }; -  #define ITEM_EXTENDED_EVENT_LEN 1  struct item_extended_event {     u_char item_description_length                :8; @@ -1082,8 +1042,6 @@ struct item_extended_event_mid {     u_char item_length                            :8;  }; - -  /* 0x4F time_shifted_event_descriptor */  #define DESCR_TIME_SHIFTED_EVENT_LEN 6 @@ -1096,8 +1054,6 @@ struct descr_time_shifted_event {     u_char reference_event_id_lo                  :8;  }; - -  /* 0x50 component_descriptor */  #define DESCR_COMPONENT_LEN  8 @@ -1118,8 +1074,6 @@ struct descr_component {     u_char lang_code3                             :8;  }; - -  /* 0x51 mosaic_descriptor */  #define DESCR_MOSAIC_LEN XX @@ -1129,8 +1083,6 @@ struct descr_mosaic {     /* TBD */  }; - -  /* 0x52 stream_identifier_descriptor */  #define DESCR_STREAM_IDENTIFIER_LEN 3 @@ -1140,8 +1092,6 @@ struct descr_stream_identifier {     u_char component_tag                          :8;  }; - -  /* 0x53 ca_identifier_descriptor */  #define DESCR_CA_IDENTIFIER_LEN 2 @@ -1150,8 +1100,6 @@ struct descr_ca_identifier {     u_char descriptor_length                      :8;  }; - -  /* 0x54 content_descriptor */  #define DESCR_CONTENT_LEN 2 @@ -1160,7 +1108,6 @@ struct descr_content {     u_char descriptor_length                      :8;  }; -  struct nibble_content {  #if BYTE_ORDER == BIG_ENDIAN     u_char content_nibble_level_1                 :4; @@ -1178,8 +1125,6 @@ struct nibble_content {  #endif  }; - -  /* 0x55 parental_rating_descriptor */  #define DESCR_PARENTAL_RATING_LEN 2 @@ -1188,7 +1133,6 @@ struct descr_parental_rating {     u_char descriptor_length                      :8;  }; -  #define PARENTAL_RATING_LEN 4  struct parental_rating {     u_char lang_code1                             :8; @@ -1197,8 +1141,6 @@ struct parental_rating {     u_char rating                                 :8;  }; - -  /* 0x56 teletext_descriptor */  #define DESCR_TELETEXT_LEN 2 @@ -1207,24 +1149,21 @@ struct descr_teletext {     u_char descriptor_length                      :8;  }; -  #define ITEM_TELETEXT_LEN 5  struct item_teletext {     u_char lang_code1                             :8;     u_char lang_code2                             :8;     u_char lang_code3                             :8;  #if BYTE_ORDER == BIG_ENDIAN -   u_char type                                   :5;  -   u_char magazine_number                        :3;  -#else  -   u_char magazine_number                        :3;  -   u_char type                                   :5;  -#endif  -   u_char page_number                            :8;  +   u_char type                                   :5; +   u_char magazine_number                        :3; +#else +   u_char magazine_number                        :3; +   u_char type                                   :5; +#endif +   u_char page_number                            :8;  }; - -  /* 0x57 telephone_descriptor */  #define DESCR_TELEPHONE_LEN XX @@ -1234,8 +1173,6 @@ struct descr_telephone {     /* TBD */  }; - -  /* 0x58 local_time_offset_descriptor */  #define DESCR_LOCAL_TIME_OFFSET_LEN 2 @@ -1244,7 +1181,6 @@ struct descr_local_time_offset {     u_char descriptor_length                      :8;  }; -  #define LOCAL_TIME_OFFSET_ENTRY_LEN 15  struct local_time_offset_entry {     u_char country_code1                          :8; @@ -1270,8 +1206,6 @@ struct local_time_offset_entry {     u_char next_time_offset_m                     :8;  }; - -  /* 0x59 subtitling_descriptor */  #define DESCR_SUBTITLING_LEN 2 @@ -1280,21 +1214,18 @@ struct descr_subtitling {     u_char descriptor_length                      :8;  }; -  #define ITEM_SUBTITLING_LEN 8  struct item_subtitling {     u_char lang_code1                             :8;     u_char lang_code2                             :8;     u_char lang_code3                             :8; -   u_char subtitling_type                        :8;  -   u_char composition_page_id_hi                 :8;  -   u_char composition_page_id_lo                 :8;  -   u_char ancillary_page_id_hi                   :8;  -   u_char ancillary_page_id_lo                   :8;  +   u_char subtitling_type                        :8; +   u_char composition_page_id_hi                 :8; +   u_char composition_page_id_lo                 :8; +   u_char ancillary_page_id_hi                   :8; +   u_char ancillary_page_id_lo                   :8;  }; - -  /* 0x5A terrestrial_delivery_system_descriptor */  #define DESCR_TERRESTRIAL_DELIVERY_SYSTEM_LEN XX @@ -1338,8 +1269,6 @@ struct descr_terrestrial_delivery {     u_char reserver5                              :8;  }; - -  /* 0x5B multilingual_network_name_descriptor */  #define DESCR_MULTILINGUAL_NETWORK_NAME_LEN XX @@ -1355,8 +1284,6 @@ struct entry_multilingual_name {     u_char text_length                            :8;  }; - -  /* 0x5C multilingual_bouquet_name_descriptor */  #define DESCR_MULTILINGUAL_BOUQUET_NAME_LEN XX @@ -1365,8 +1292,6 @@ struct descr_multilingual_bouquet_name {     u_char descriptor_length                      :8;  }; - -  /* 0x5D multilingual_service_name_descriptor */  #define DESCR_MULTILINGUAL_SERVICE_NAME_LEN XX @@ -1379,7 +1304,6 @@ struct entry_multilingual_service_name_mid {     u_char service_name_length                    :8;  }; -  /* 0x5E multilingual_component_descriptor */  #define DESCR_MULTILINGUAL_COMPONENT_LEN XX @@ -1389,8 +1313,6 @@ struct descr_multilingual_component {     u_char component_tag                          :8;  }; - -  /* 0x5F private_data_specifier_descriptor */  #define DESCR_PRIVATE_DATA_SPECIFIER_LEN XX @@ -1400,8 +1322,6 @@ struct descr_private_data_specifier {     /* TBD */  }; - -  /* 0x60 service_move_descriptor */  #define DESCR_SERVICE_MOVE_LEN XX @@ -1416,8 +1336,6 @@ struct descr_service_move {     u_char new_service_id_lo                      :8;  }; - -  /* 0x61 short_smoothing_buffer_descriptor */  #define DESCR_SHORT_SMOOTHING_BUFFER_LEN XX @@ -1427,15 +1345,13 @@ struct descr_short_smoothing_buffer {     /* TBD */  }; - -  /* 0x62 frequency_list_descriptor */  #define DESCR_FREQUENCY_LIST_LEN XX  struct descr_frequency_list {     u_char descriptor_tag                         :8;     u_char descriptor_length                      :8; -#if BYTE_ORDER == BIG_ENDIAN    +#if BYTE_ORDER == BIG_ENDIAN     u_char                                        :6;     u_char coding_type                            :2;  #else @@ -1444,8 +1360,6 @@ struct descr_frequency_list {  #endif  }; - -  /* 0x63 partial_transport_stream_descriptor */  #define DESCR_PARTIAL_TRANSPORT_STREAM_LEN XX @@ -1455,8 +1369,6 @@ struct descr_partial_transport_stream {     /* TBD */  }; - -  /* 0x64 data_broadcast_descriptor */  #define DESCR_DATA_BROADCAST_LEN XX @@ -1466,8 +1378,6 @@ struct descr_data_broadcast {     /* TBD */  }; - -  /* 0x65 ca_system_descriptor */  #define DESCR_CA_SYSTEM_LEN XX @@ -1477,8 +1387,6 @@ struct descr_ca_system {     /* TBD */  }; - -  /* 0x66 data_broadcast_id_descriptor */  #define DESCR_DATA_BROADCAST_ID_LEN XX @@ -1488,8 +1396,6 @@ struct descr_data_broadcast_id {     /* TBD */  }; - -  /* 0x67 transport_stream_descriptor */  #define DESCR_TRANSPORT_STREAM_LEN XX @@ -1499,8 +1405,6 @@ struct descr_transport_stream {     /* TBD */  }; - -  /* 0x68 dsng_descriptor */  #define DESCR_DSNG_LEN XX @@ -1510,8 +1414,6 @@ struct descr_dsng {     /* TBD */  }; - -  /* 0x69 pdc_descriptor */  #define DESCR_PDC_LEN XX @@ -1521,8 +1423,6 @@ struct descr_pdc {     /* TBD */  }; - -  /* 0x6A ac3_descriptor */  #define DESCR_AC3_LEN 3 @@ -1548,8 +1448,6 @@ struct descr_ac3 {     u_char asvc                                   :8;  }; - -  /* 0x6B ancillary_data_descriptor */  #define DESCR_ANCILLARY_DATA_LEN 3 @@ -1559,8 +1457,6 @@ struct descr_ancillary_data {     u_char ancillary_data_identifier              :8;  }; - -  /* 0x6C cell_list_descriptor */  #define DESCR_CELL_LIST_LEN XX @@ -1570,8 +1466,6 @@ struct descr_cell_list {     /* TBD */  }; - -  /* 0x6D cell_frequency_link_descriptor */  #define DESCR_CELL_FREQUENCY_LINK_LEN XX @@ -1581,8 +1475,6 @@ struct descr_cell_frequency_link {     /* TBD */  }; - -  /* 0x6E announcement_support_descriptor */  #define DESCR_ANNOUNCEMENT_SUPPORT_LEN XX @@ -1592,8 +1484,6 @@ struct descr_announcement_support {     /* TBD */  }; - -  /* 0x6F application_signalling_descriptor */  #define DESCR_APPLICATION_SIGNALLING_LEN 2 @@ -1602,22 +1492,19 @@ struct descr_application_signalling {     u_char descriptor_length                      :8;  }; -  #define APPLICATION_SIGNALLING_ENTRY_LEN 3  struct application_signalling_entry { -   u_char application_type_hi                    :8;    -   u_char application_type_lo                    :8;    +   u_char application_type_hi                    :8; +   u_char application_type_lo                    :8;  #if BYTE_ORDER == BIG_ENDIAN -   u_char                                        :3;  +   u_char                                        :3;     u_char AIT_version_number                     :5;  #else     u_char AIT_version_number                     :5; -   u_char                                        :3;  +   u_char                                        :3;  #endif  }; - -  /* 0x71 service_identifier_descriptor (ETSI TS 102 812, MHP) */  struct descr_service_identifier { @@ -1625,7 +1512,6 @@ struct descr_service_identifier {     u_char descriptor_length                      :8;  }; -  /* MHP 0x00 application_descriptor */  #define DESCR_APPLICATION_LEN 3 @@ -1636,7 +1522,6 @@ struct descr_application {     u_char application_profiles_length            :8;  }; -  #define DESCR_APPLICATION_END_LEN 2  struct descr_application_end { @@ -1653,18 +1538,16 @@ struct descr_application_end {  /*now follow 8bit transport_protocol_label fields to the end */  }; -  #define APPLICATION_PROFILE_ENTRY_LEN 5  struct application_profile_entry { -   u_char application_profile_hi                 :8;    -   u_char application_profile_lo                 :8;    -   u_char version_major                          :8;    -   u_char version_minor                          :8;    -   u_char version_micro                          :8;    +   u_char application_profile_hi                 :8; +   u_char application_profile_lo                 :8; +   u_char version_major                          :8; +   u_char version_minor                          :8; +   u_char version_micro                          :8;  }; -  /* MHP 0x01 application_name_desriptor */  #define DESCR_APPLICATION_NAME_LEN 2 @@ -1674,7 +1557,6 @@ struct descr_application_name {     u_char descriptor_length                      :8;  }; -  #define APPLICATION_NAME_ENTRY_LEN 4  struct descr_application_name_entry { @@ -1685,7 +1567,6 @@ struct descr_application_name_entry {     /* application name string */  }; -  /* MHP 0x02 transport_protocol_descriptor */  #define DESCR_TRANSPORT_PROTOCOL_LEN 5 @@ -1693,13 +1574,12 @@ struct descr_application_name_entry {  struct descr_transport_protocol {     u_char descriptor_tag                         :8;     u_char descriptor_length                      :8; -   u_char protocol_id_hi                         :8;    -   u_char protocol_id_lo                         :8;    -   u_char transport_protocol_label               :8;  -   /* protocol_id-specific selector bytes follow */   +   u_char protocol_id_hi                         :8; +   u_char protocol_id_lo                         :8; +   u_char transport_protocol_label               :8; +   /* protocol_id-specific selector bytes follow */  }; -  #define TRANSPORT_VIA_OC_LEN 1  struct transport_via_oc { @@ -1712,7 +1592,6 @@ struct transport_via_oc {  #endif  }; -  //if remote is true, transport_via_oc_remote_end_t follows,  // else transport_via_oc_end_t. @@ -1728,14 +1607,12 @@ struct transport_via_oc_remote_end {     u_char component_tag                          :8;  }; -  #define TRANSPORT_VIA_OC_END_LEN 1  struct transport_via_oc_end {     u_char component_tag                          :8;  }; -  /* 0x03 dvb_j_application_descriptor() */  #define DESCR_DVBJ_APPLICATION_LEN 2 @@ -1745,7 +1622,6 @@ struct descr_dvbj_application {     u_char descriptor_length                      :8;  }; -  #define DESCR_DVBJ_APPLICATION_ENTRY_LEN 1  struct descr_dvbj_application_entry { @@ -1753,7 +1629,6 @@ struct descr_dvbj_application_entry {     /* parameter string */  }; -  /* 0x04 dvb_j_application_location_descriptor */  #define DESCR_DVBJ_APPLICATION_LOCATION_LEN 3 @@ -1765,14 +1640,12 @@ struct descr_dvbj_application_location {     /* base directory string */  }; -  #define DESCR_DVBJ_APPLICATION_LOCATION_MID_LEN 1  struct descr_dvbj_application_location_mid {     u_char classpath_extension_length                  :8;  }; -  /* 0x0B application_icons_descriptor */  #define DESCR_APPLICATION_ICONS_LEN 3 @@ -1782,21 +1655,15 @@ struct descr_application_icons_descriptor {     u_char descriptor_length                      :8;     u_char icon_locator_length                    :8;     /* icon locator */ -};  - +};  #define DESCR_APPLICATION_ICONS_END_LEN 2  struct descr_application_icons_descriptor_end {     u_char icon_flags_hi                          :8;     u_char icon_flags_lo                          :8; -};  - - - - +};  } //end of namespace  #endif //LIBSI_HEADERS_H - diff --git a/libsi/section.c b/libsi/section.c index 6abbb232..0de2a573 100644 --- a/libsi/section.c +++ b/libsi/section.c @@ -6,6 +6,8 @@   *   the Free Software Foundation; either version 2 of the License, or     *   *   (at your option) any later version.                                   *   *                                                                         * + *   $Id: section.c 1.2 2003/12/13 10:42:14 kls Exp $ + *                                                                         *   ***************************************************************************/  #include "section.h" @@ -74,8 +76,6 @@ void PMT::Stream::Parse() {     streamDescriptors.setData(data+offset, HILO(s->ES_info_length));  } - -  /*********************** NIT ***********************/  int NIT::getNetworkId() const { @@ -105,11 +105,8 @@ void NIT::TransportStream::Parse() {     transportStreamDescriptors.setData(data+offset, HILO(s->transport_descriptors_length));  } - -  /*********************** SDT ***********************/ -  void SDT::Parse() {     unsigned int offset=0;     data.setPointerAndOffset<const sdt>(s, offset); @@ -150,8 +147,6 @@ void SDT::Service::Parse() {     serviceDescriptors.setData(data+offset, HILO(s->descriptors_loop_length));  } - -  /*********************** EIT ***********************/  int EIT::getServiceId() const { @@ -167,7 +162,7 @@ int EIT::getOriginalNetworkId() const {  }  bool EIT::isPresentFollowing() const { -   return getTableId() == TableIdEIT_presentFollowing || getTableId() == TableIdEIT_presentFollowing_other;  +   return getTableId() == TableIdEIT_presentFollowing || getTableId() == TableIdEIT_presentFollowing_other;  }  bool EIT::isActualTS() const { @@ -183,7 +178,6 @@ void EIT::Parse() {     eventLoop.setData(data+offset, getLength()-offset-4); //4 is for CRC  } -  time_t EIT::Event::getStartTime() const {     return DVBTime::getTime(s->mjd_hi, s->mjd_lo, s->start_time_h, s->start_time_m, s->start_time_s);  } @@ -239,7 +233,6 @@ void EIT::Event::Parse() {     eventDescriptors.setData(data+offset, HILO(s->descriptors_loop_length));  } -  /*********************** TDT ***********************/  time_t TDT::getTime() const { @@ -250,7 +243,6 @@ void TDT::Parse() {     s=data.getData<const tdt>();  } -  /*********************** TOT ***********************/  time_t TOT::getTime() const { @@ -263,9 +255,6 @@ void TOT::Parse() {     descriptorLoop.setData(data+offset, getLength()-offset-4);  } - - -  /*********************** RST ***********************/  void RST::Parse() { @@ -299,11 +288,8 @@ void RST::RunningInfo::Parse() {     s=data.getData<const rst_info>();  } - -  /*********************** AIT ***********************/ -  int AIT::getApplicationType() const {     return HILO(first->application_type);  } @@ -321,7 +307,6 @@ void AIT::Parse() {     applicationLoop.setData(data+offset, HILO(mid->application_loop_length));  } -  long AIT::Application::getOrganisationId() const {     return data.FourBytes(0);  } @@ -340,7 +325,4 @@ void AIT::Application::Parse() {     applicationDescriptors.setData(data+offset, HILO(s->application_descriptors_length));  } - -  } //end of namespace - diff --git a/libsi/section.h b/libsi/section.h index 55fc1bab..efca9bb6 100644 --- a/libsi/section.h +++ b/libsi/section.h @@ -6,6 +6,8 @@   *   the Free Software Foundation; either version 2 of the License, or     *   *   (at your option) any later version.                                   *   *                                                                         * + *   $Id: section.h 1.2 2003/12/13 10:42:15 kls Exp $ + *                                                                         *   ***************************************************************************/  #ifndef LIBSI_SECTION_H @@ -50,7 +52,6 @@ protected:     virtual void Parse();  }; -  class PMT : public NumberedSection {  public:     PMT(const unsigned char *data, bool doCopy=true) : NumberedSection(data, doCopy) {} @@ -108,7 +109,6 @@ public:     int getBouquetId() const { return getNetworkId(); }  }; -  class SDT : public NumberedSection {  public:     SDT(const unsigned char *data, bool doCopy=true) : NumberedSection(data, doCopy) {} @@ -134,8 +134,7 @@ protected:     virtual void Parse();  private:     const sdt *s; -};   - +};  class EIT : public NumberedSection {  public: @@ -146,7 +145,7 @@ public:        int getEventId() const;        time_t getStartTime() const; //UTC        time_t getDuration() const; -       +        int getMJD() const;        int getStartTimeHour() const; //UTC        int getStartTimeMinute() const; //UTC @@ -156,7 +155,7 @@ public:        int getDurationSecond() const;        RunningStatus getRunningStatus() const;        int getFreeCaMode() const; -       +        DescriptorLoop eventDescriptors;        virtual int getLength() { return sizeof(eit_event)+eventDescriptors.getLength(); }     protected: @@ -168,7 +167,7 @@ public:     int getTransportStreamId() const;     int getOriginalNetworkId() const;     StructureLoop<Event> eventLoop; -       +     //true if table conveys present/following information, false if it conveys schedule information     bool isPresentFollowing() const;     //true if table describes TS on which it is broadcast, false if it describes other TS @@ -179,7 +178,6 @@ private:     const eit *s;  }; -  class TDT : public Section {  public:     TDT(const unsigned char *data, bool doCopy=true) : Section(data, doCopy) {} @@ -191,7 +189,6 @@ private:     const tdt *s;  }; -  class TOT : public CRCSection {  public:     TOT(const unsigned char *data, bool doCopy=true) : CRCSection(data, doCopy) {} @@ -204,7 +201,6 @@ private:     const tot *s;  }; -  class RST : public Section {  public:     RST(const unsigned char *data, bool doCopy=true) : Section(data, doCopy) {} @@ -227,7 +223,6 @@ protected:     virtual void Parse();  }; -  class AIT : public NumberedSection {  public:     AIT(const unsigned char *data, bool doCopy=true) : NumberedSection(data, doCopy) {} @@ -252,8 +247,6 @@ protected:     virtual void Parse();  }; - -  } //end of namespace  #endif //LIBSI_TABLE_H @@ -6,6 +6,8 @@   *   the Free Software Foundation; either version 2 of the License, or     *   *   (at your option) any later version.                                   *   *                                                                         * + *   $Id: si.c 1.2 2003/12/13 10:42:16 kls Exp $ + *                                                                         *   ***************************************************************************/  #include <string.h> @@ -28,8 +30,6 @@ void Object::setData(CharArray &d) {     data=d;  } - -  Section::Section(const unsigned char *data, bool doCopy) {     setData(data, getLength(data), doCopy);  } @@ -43,11 +43,11 @@ int Section::getLength() {  }  TableId Section::getTableId(const unsigned char *d) { -   return (TableId)((const SectionHeader *)d)->table_id;  +   return (TableId)((const SectionHeader *)d)->table_id;  }  int Section::getLength(const unsigned char *d) { -   return HILO(((const SectionHeader *)d)->section_length)+sizeof(SectionHeader);  +   return HILO(((const SectionHeader *)d)->section_length)+sizeof(SectionHeader);  }  bool CRCSection::isValid() { @@ -61,8 +61,6 @@ bool CRCSection::CheckCRCAndParse() {     return true;  } - -  bool NumberedSection::getCurrentNextIndicator() const {     return data.getData<ExtendedSectionHeader>()->current_next_indicator;  } @@ -79,10 +77,6 @@ int NumberedSection::getLastSectionNumber() const {     return data.getData<ExtendedSectionHeader>()->last_section_number;  } - - - -  int Descriptor::getLength() {     return getLength(data.getData());  } @@ -99,7 +93,6 @@ DescriptorTag Descriptor::getDescriptorTag(const unsigned char *d) {     return (DescriptorTag)((const DescriptorHeader*)d)->descriptor_tag;  } -  Descriptor *DescriptorLoop::getNext(Iterator &it) {     if (it.i<getLength()) {        return createDescriptor(it.i); @@ -193,8 +186,6 @@ bool DescriptorGroup::isComplete() {     return true;  } - -  char *String::getText() {     if (getLength() < 0 || getLength() >4095)        return "text error"; @@ -216,17 +207,17 @@ char *String::getText(char *buffer) {  void String::decodeText(char *buffer) {     const unsigned char *from=data.getData(0);     char *to=buffer; -    +     /* Disable detection of coding tables - libdtv doesn't do it either     if ( (0x01 <= *from) && (*from <= 0x1f) ) {        codeTable=*from     }     */ -    +     for (int i = 0; i < getLength(); i++) {        if (*from == 0)           break; -      if (    ((' ' <= *from) && (*from <= '~'))  +      if (    ((' ' <= *from) && (*from <= '~'))             || (*from == '\n')             || ((0xA0 <= *from) && (*from <= 0xFF))           ) @@ -310,7 +301,7 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain)              break;           case CaIdentifierDescriptorTag:              d=new CaIdentifierDescriptor(); -            break;         +            break;           case ShortEventDescriptorTag:              d=new ShortEventDescriptor();              break; @@ -329,10 +320,10 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain)           case ApplicationSignallingDescriptorTag:              d=new ApplicationSignallingDescriptor();              break; -             +           //note that it is no problem to implement one           //of the unimplemented descriptors. -          +           //defined in ISO-13818-1           case VideoStreamDescriptorTag:           case AudioStreamDescriptorTag: @@ -350,7 +341,7 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain)           case SmoothingBufferDescriptorTag:           case STDDescriptorTag:           case IBPDescriptorTag: -          +           //defined in ETSI EN 300 468           case StuffingDescriptorTag:           case VBIDataDescriptorTag: @@ -374,7 +365,7 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain)           case DSNGDescriptorTag:           case PDCDescriptorTag:           case AncillaryDataDescriptorTag: -         case AnnouncementSupportDescriptorTag:             +         case AnnouncementSupportDescriptorTag:           case AdaptationFieldDataDescriptorTag:           case TransportStreamDescriptorTag:           default: @@ -421,11 +412,4 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain)     return d;  } - - - - -  } //end of namespace - - @@ -6,9 +6,10 @@   *   the Free Software Foundation; either version 2 of the License, or     *   *   (at your option) any later version.                                   *   *                                                                         * + *   $Id: si.h 1.2 2003/12/13 10:42:17 kls Exp $ + *                                                                         *   ***************************************************************************/ -  #ifndef LIBSI_SI_H  #define LIBSI_SI_H @@ -44,7 +45,7 @@ enum TableId { TableIdPAT = 0x00, //program association section                 TableIdSIT = 0x7F, //service information section                 TableIdAIT = 0x74  //application information section               }; -                +  enum DescriptorTag {    // defined by ISO/IEC 13818-1 @@ -65,7 +66,7 @@ enum DescriptorTag {                 SmoothingBufferDescriptorTag = 0x10,                 STDDescriptorTag = 0x11,                 IBPDescriptorTag = 0x12, -  // defined by ISO-13818-6 (DSM-CC)  +  // defined by ISO-13818-6 (DSM-CC)                 CarouselIdentifierDescriptorTag = 0x13,                 // 0x14 - 0x3F  Reserved    // defined by ETSI (EN 300 468) @@ -138,7 +139,7 @@ enum DescriptorTag {                 MHP_PrefetchDescriptorTag = 0x0C,                 MHP_DelegatedApplicationDescriptorTag = 0x0E,                 MHP_ApplicationStorageDescriptorTag = 0x10, -                +                 //a descriptor currently unimplemented in this library                 //the actual value 0xFF is "forbidden" according to the spec.                 UnimplementedDescriptorTag = 0xFF @@ -153,7 +154,6 @@ enum RunningStatus { RunningStatusUndefined = 0,                       RunningStatusRunning = 4                     }; -  /* Some principles:     - Objects that return references to other objects contained in their data must make sure       that the returned objects have been parsed. @@ -161,7 +161,6 @@ enum RunningStatus { RunningStatusUndefined = 0,       Note that this does not apply to Loops and Strings (their are never returned by reference, BTW).  */ -  class Object : public Parsable {  public:     Object(); @@ -183,7 +182,7 @@ public:     Section() {}     TableId getTableId() const;     virtual int getLength(); -    +     static int getLength(const unsigned char *d);     static TableId getTableId(const unsigned char *d);  }; @@ -211,9 +210,6 @@ public:     bool moreThanOneSection()  const { return getLastSectionNumber()>1; }  }; - - -  class VariableLengthPart : public Object {  public:     //never forget to call this @@ -225,12 +221,9 @@ private:     int length;  }; - -  class LoopElement : public Object {  }; -  class SubStructure : public LoopElement {  }; @@ -238,7 +231,7 @@ class Descriptor : public LoopElement {  public:     virtual int getLength();     DescriptorTag getDescriptorTag() const; -    +     static int getLength(const unsigned char *d);     static DescriptorTag getDescriptorTag(const unsigned char *d);  protected: @@ -250,8 +243,6 @@ protected:     static Descriptor *getDescriptor(CharArray d, DescriptorTagDomain domain);  }; - -  class Loop : public VariableLengthPart {  public:     class Iterator { @@ -338,11 +329,11 @@ public:              return (data.FourBytes(index) << 32) | data.FourBytes(index+4);           }        } -   T getNext(Iterator &it) const  +   T getNext(Iterator &it) const        {           T ret=operator[](it.i);           it.i+=sizeof(T); -         return ret;  +         return ret;        }     bool hasNext() const { return getLength() > it.i; }  }; @@ -352,7 +343,6 @@ public:     MHP_DescriptorLoop() { domain=MHP; }  }; -  //The content of the ExtendedEventDescriptor may be split over several  //descriptors if the text is longer than 256 bytes.  //The following classes provide base functionality to handle this case. @@ -367,7 +357,7 @@ public:     DescriptorGroup(bool deleteOnDesctruction=true);     ~DescriptorGroup();     void Add(GroupDescriptor *d); -   void Delete();    +   void Delete();     int getLength() { return length; }     GroupDescriptor **getDescriptors() { return array; }     bool isComplete(); //if all descriptors have been added @@ -377,17 +367,15 @@ protected:     bool deleteOnDesctruction;  }; - -  class String : public VariableLengthPart {  public:     //A note to the length: getLength() returns the length of the raw data. -   //The text may be shorter. Its length can be obtained with one of the  +   //The text may be shorter. Its length can be obtained with one of the     //above functions and strlen. -    +     //returns text. Data is allocated with new and must be delete'd by the user.     char *getText(); -   //copies text into given buffer.  +   //copies text into given buffer.     //a buffer of size getLength()+1 is guaranteed to be sufficiently large.     //In most descriptors the string length is an 8-bit field,     //so the maximum there is 256. @@ -398,8 +386,6 @@ protected:     void decodeText(char *buffer);  }; -  } //end of namespace  #endif //LIBSI_SI_H - diff --git a/libsi/util.c b/libsi/util.c index 872a3e48..2c1c6e35 100644 --- a/libsi/util.c +++ b/libsi/util.c @@ -6,6 +6,8 @@   *   the Free Software Foundation; either version 2 of the License, or     *   *   (at your option) any later version.                                   *   *                                                                         * + *   $Id: util.c 1.2 2003/12/13 10:42:18 kls Exp $ + *                                                                         *   ***************************************************************************/  #include <string.h> @@ -13,7 +15,6 @@  namespace SI { -  /*---------------------------- CharArray ----------------------------*/  CharArray::CharArray() : data_(0), off(0) { @@ -38,7 +39,7 @@ CharArray& CharArray::operator=(const CharArray &f) {        ++ f.data_->count_;      }      if (data_) { -      if (--data_->count_ == 0)  +      if (--data_->count_ == 0)           delete data_;      }      data_ = f.data_; @@ -62,18 +63,18 @@ void CharArray::assign(const unsigned char*data, unsigned int size, bool doCopy)  bool CharArray::operator==(const char *string) const {     //here we can use strcmp, string is null-terminated. -   if (!data_)  +   if (!data_)        return false;     return data_->size ? (!strcmp((const char*)data_->data, string)) : string[0]==0;  }  bool CharArray::operator==(const CharArray &other) const { -   if (!data_ || !other.data_)  +   if (!data_ || !other.data_)        return !(data_ || other.data_); //true if both empty -       +     if (data_->size != other.data_->size)        return false; -       +     //do _not_ use strcmp! Data is not necessarily null-terminated.     for (unsigned int i=0;i<data_->size;i++)        if (data_->data[i] != other.data_->data[i]) @@ -98,7 +99,7 @@ CharArray::Data::Data() : count_(1) {  }  CharArray::Data::~Data() { -   /*    +   /*     if (locked)        pthread_mutex_unlock(&mutex);     pthread_mutex_destroy(&mutex); @@ -108,7 +109,7 @@ CharArray::Data::~Data() {  /*CharArray::Data::Data(const Data& d) : count_(1) {     size=0;     data=0; -    +     lockingPid = 0;     locked = 0;     pthread_mutex_init(&mutex, NULL); @@ -143,7 +144,6 @@ void CharArray::DataForeignData::Delete() {     //do not delete!  } -  /*  void CharArray::Data::assign(unsigned int s) {     if (data) @@ -184,16 +184,15 @@ void Parsable::CheckParse() {     }  } - -//taken and adapted from libdtv, (c) Rolf Hakenes and VDR, (c) Klaus Schmidinger     +//taken and adapted from libdtv, (c) Rolf Hakenes and VDR, (c) Klaus Schmidinger  time_t DVBTime::getTime(unsigned char date_hi, unsigned char date_lo, unsigned char time_hour, unsigned char time_minute, unsigned char time_second) {     unsigned short mjd = date_hi << 8 | date_lo;     struct tm t; -    +     t.tm_sec = bcdToDec(time_second);     t.tm_min = bcdToDec(time_minute);     t.tm_hour = bcdToDec(time_hour); -    +     int k;     t.tm_year = (int) ((mjd - 15078.2) / 365.25);     t.tm_mon = (int) ((mjd - 14956.1 - (int)(t.tm_year * 365.25)) / 30.6001); @@ -205,7 +204,7 @@ time_t DVBTime::getTime(unsigned char date_hi, unsigned char date_lo, unsigned c     t.tm_isdst = -1;     t.tm_gmtoff = 0; -    +     return timegm(&t);  } @@ -279,12 +278,4 @@ CRC32::CRC32(const char *d, int len, unsigned long CRCvalue) {     value=CRCvalue;  } - - - - -  } //end of namespace - - - diff --git a/libsi/util.h b/libsi/util.h index 8df82c4d..d6765104 100644 --- a/libsi/util.h +++ b/libsi/util.h @@ -6,9 +6,10 @@   *   the Free Software Foundation; either version 2 of the License, or     *   *   (at your option) any later version.                                   *   *                                                                         * + *   $Id: util.h 1.2 2003/12/13 10:42:20 kls Exp $ + *                                                                         *   ***************************************************************************/ -  #ifndef LIBSI_UTIL_H  #define LIBSI_UTIL_H @@ -23,28 +24,27 @@  namespace SI { -  //Holds an array of unsigned char which is deleted  //when the last object pointing to it is deleted.  //Optimized for use in libsi.  class CharArray {  public:     CharArray(); -    +     CharArray(const CharArray &source);     CharArray& operator=(const CharArray &source);     ~CharArray(); -    +     //can be called exactly once     void assign(const unsigned char*data, unsigned int size, bool doCopy=true);     //compares to a null-terminated string -   bool operator==(const char *string) const;    +   bool operator==(const char *string) const;     //compares to another CharArray (data not necessarily null-terminated)     bool operator==(const CharArray &other) const; -    +     //returns another CharArray with its offset incremented by offset     CharArray operator+(const unsigned int offset) const; -    +     //access and convenience methods     const unsigned char* getData() const { return data_->data+off; }     const unsigned char* getData(int offset) const { return data_->data+offset+off; } @@ -56,17 +56,17 @@ public:     int getLength() const { return data_->size; }     unsigned short TwoBytes(const unsigned int index) const { return data_->data ? data_->TwoBytes(off+index) : 0; }     unsigned long FourBytes(const unsigned int index) const { return data_->data ? data_->FourBytes(off+index) : 0; } -    +     void addOffset(unsigned int offset) { off+=offset; }  private:     class Data {     public:        Data();        virtual ~Data(); -       +        virtual void assign(const unsigned char*data, unsigned int size) = 0;        virtual void Delete() = 0; -       +        unsigned short TwoBytes(const unsigned int index) const           { return (data[index] << 8) | data[index+1]; }        unsigned long FourBytes(const unsigned int index) const @@ -81,15 +81,15 @@ private:        Data(const Data& d);        void assign(unsigned int size);        */ -   +        const unsigned char*data;        unsigned int size; -   +        unsigned count_;        // count_ is the number of CharArray objects that point at this        // count_ must be initialized to 1 by all constructors        // (it starts as 1 since it is pointed to by the CharArray object that created it) -       +        /*        pthread_mutex_t mutex;        pid_t lockingPid; @@ -114,8 +114,8 @@ private:     unsigned int off;  }; -   -   + +  //abstract base class  class Parsable {  public: @@ -145,16 +145,12 @@ public:  protected:     static unsigned long crc_table[256];     static unsigned long crc32 (const char *d, int len, unsigned long CRCvalue); -    +     const char *data;     int length;     unsigned long value;  }; - -  } //end of namespace -  #endif - | 
