diff options
Diffstat (limited to 'libsi/section.h')
-rw-r--r-- | libsi/section.h | 252 |
1 files changed, 252 insertions, 0 deletions
diff --git a/libsi/section.h b/libsi/section.h new file mode 100644 index 0000000..efca9bb --- /dev/null +++ b/libsi/section.h @@ -0,0 +1,252 @@ +/*************************************************************************** + * Copyright (c) 2003 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: section.h 1.2 2003/12/13 10:42:15 kls Exp $ + * * + ***************************************************************************/ + +#ifndef LIBSI_SECTION_H +#define LIBSI_SECTION_H + +#include <time.h> + +#include "si.h" +#include "headers.h" + +namespace SI { + +class PAT : public NumberedSection { +public: + PAT(const unsigned char *data, bool doCopy=true) : NumberedSection(data, doCopy) {} + PAT() {} + class Association : public LoopElement { + public: + int getServiceId() const; + int getPid() const; + bool isNITPid() const { return getServiceId()==0; } + virtual int getLength() { return sizeof(pat_prog); } + protected: + virtual void Parse(); + private: + const pat_prog *s; + }; + int getTransportStreamId() const; + StructureLoop<Association> associationLoop; +protected: + virtual void Parse(); +private: + const pat *s; +}; + +class CAT : public NumberedSection { +public: + CAT(const unsigned char *data, bool doCopy=true) : NumberedSection(data, doCopy) {} + CAT() {} + DescriptorLoop loop; +protected: + virtual void Parse(); +}; + +class PMT : public NumberedSection { +public: + PMT(const unsigned char *data, bool doCopy=true) : NumberedSection(data, doCopy) {} + PMT() {} + class Stream : public LoopElement { + public: + int getPid() const; + int getStreamType() const; + DescriptorLoop streamDescriptors; + virtual int getLength() { return sizeof(pmt_info)+streamDescriptors.getLength(); } + protected: + virtual void Parse(); + private: + const pmt_info *s; + }; + DescriptorLoop commonDescriptors; + StructureLoop<Stream> streamLoop; + int getServiceId() const; + int getPCRPid() const; +protected: + virtual void Parse(); +private: + const pmt *s; +}; + +class NIT : public NumberedSection { +public: + NIT(const unsigned char *data, bool doCopy=true) : NumberedSection(data, doCopy) {} + NIT() {} + class TransportStream : public LoopElement { + public: + int getTransportStreamId() const; + int getOriginalNetworkId() const; + virtual int getLength() { return sizeof(ni_ts)+transportStreamDescriptors.getLength(); } + DescriptorLoop transportStreamDescriptors; + protected: + virtual void Parse(); + private: + const ni_ts *s; + }; + DescriptorLoop commonDescriptors; + StructureLoop<TransportStream> transportStreamLoop; + int getNetworkId() const; +protected: + virtual void Parse(); +private: + const nit *s; +}; + +//BAT has the same structure as NIT but different allowed descriptors +class BAT : public NIT { +public: + BAT(const unsigned char *data, bool doCopy=true) : NIT(data, doCopy) {} + BAT() {} + int getBouquetId() const { return getNetworkId(); } +}; + +class SDT : public NumberedSection { +public: + SDT(const unsigned char *data, bool doCopy=true) : NumberedSection(data, doCopy) {} + SDT() {} + class Service : public LoopElement { + public: + int getServiceId() const; + int getEITscheduleFlag() const; + int getEITpresentFollowingFlag() const; + RunningStatus getRunningStatus() const; + int getFreeCaMode() const; + virtual int getLength() { return sizeof(sdt_descr)+serviceDescriptors.getLength(); } + DescriptorLoop serviceDescriptors; + protected: + virtual void Parse(); + private: + const sdt_descr *s; + }; + int getTransportStreamId() const; + int getOriginalNetworkId() const; + StructureLoop<Service> serviceLoop; +protected: + virtual void Parse(); +private: + const sdt *s; +}; + +class EIT : public NumberedSection { +public: + EIT(const unsigned char *data, bool doCopy=true) : NumberedSection(data, doCopy) {} + EIT() {} + class Event : public LoopElement { + public: + int getEventId() const; + time_t getStartTime() const; //UTC + time_t getDuration() const; + + int getMJD() const; + int getStartTimeHour() const; //UTC + int getStartTimeMinute() const; //UTC + int getStartTimeSecond() const; //UTC + int getDurationHour() const; + int getDurationMinute() const; + int getDurationSecond() const; + RunningStatus getRunningStatus() const; + int getFreeCaMode() const; + + DescriptorLoop eventDescriptors; + virtual int getLength() { return sizeof(eit_event)+eventDescriptors.getLength(); } + protected: + virtual void Parse(); + private: + const eit_event *s; + }; + int getServiceId() const; + 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 + bool isActualTS() const; +protected: + virtual void Parse(); +private: + const eit *s; +}; + +class TDT : public Section { +public: + TDT(const unsigned char *data, bool doCopy=true) : Section(data, doCopy) {} + TDT() {} + time_t getTime() const; //UTC +protected: + virtual void Parse(); +private: + const tdt *s; +}; + +class TOT : public CRCSection { +public: + TOT(const unsigned char *data, bool doCopy=true) : CRCSection(data, doCopy) {} + TOT() {} + time_t getTime() const; + DescriptorLoop descriptorLoop; +protected: + virtual void Parse(); +private: + const tot *s; +}; + +class RST : public Section { +public: + RST(const unsigned char *data, bool doCopy=true) : Section(data, doCopy) {} + RST() {} + class RunningInfo : public LoopElement { + public: + int getTransportStreamId() const; + int getOriginalNetworkId() const; + int getServiceId() const; + int getEventId() const; + RunningStatus getRunningStatus() const; + virtual int getLength() { return sizeof(rst_info); } + protected: + virtual void Parse(); + private: + const rst_info *s; + }; + StructureLoop<RunningInfo> infoLoop; +protected: + virtual void Parse(); +}; + +class AIT : public NumberedSection { +public: + AIT(const unsigned char *data, bool doCopy=true) : NumberedSection(data, doCopy) {} + AIT() {} + class Application : public LoopElement { + public: + virtual int getLength() { return sizeof(ait_app)+applicationDescriptors.getLength(); } + long getOrganisationId() const; + int getApplicationId() const; + int getControlCode() const; + MHP_DescriptorLoop applicationDescriptors; + protected: + virtual void Parse(); + const ait_app *s; + }; + MHP_DescriptorLoop commonDescriptors; + StructureLoop<Application> applicationLoop; + int getApplicationType() const; + int getAITVersion() const; +protected: + const ait *first; + virtual void Parse(); +}; + +} //end of namespace + +#endif //LIBSI_TABLE_H |