![]() |
TSDuck v3.46-4930
MPEG Transport Stream Toolkit
|
#include <tsEIT.h>


Classes | |
| class | Event |
Public Types | |
| using | EventList = AttachedEntryList<Event> |
| enum | FixMode { FILL_SEGMENTS , ADD_MISSING , FIX_EXISTING } |
Public Member Functions | |
| EIT (bool is_actual=true, bool is_pf=true, uint8_t eits_index=0, uint8_t version=0, bool is_current=true, uint16_t service_id=0, uint16_t ts_id=0, uint16_t onetw_id=0) | |
| EIT (const EIT &other) | |
| EIT (DuckContext &duck, const BinaryTable &table) | |
| const UString & | attribute () const |
| virtual void | clear () override final |
| template<typename T1, typename T2 = Names::uint_t> requires ts::int_enum<T1> && ts::int_enum<T2> | |
| UString | dataName (const UChar *section, T1 value, NamesFlags flags=NamesFlags::NAME, T2 alternate=0, size_t bits=0) |
| virtual Standards | definingStandards (Standards current_standards=Standards::NONE) const override |
| bool | deserialize (DuckContext &duck, const BinaryTable &bin) |
| virtual void | fromXML (DuckContext &duck, const xml::Element *element) override final |
| void | incrementVersion (uint8_t increment=1) |
| void | invalidate () |
| bool | isActual () const |
| virtual bool | isCurrent () const |
| bool | isPresentFollowing () const |
| virtual bool | isPrivate () const |
| bool | isValid () const |
| EIT & | operator= (const EIT &other)=default |
| bool | serialize (DuckContext &duck, BinaryTable &bin) const |
| void | setActual (bool is_actual) |
| void | setAttribute (const UString &attr) |
| virtual void | setCurrent (bool is_current) |
| virtual void | setVersion (uint8_t version) |
| TID | tableId () const |
| virtual uint16_t | tableIdExtension () const override |
| virtual DescriptorList * | topLevelDescriptorList () |
| virtual const DescriptorList * | topLevelDescriptorList () const |
| virtual xml::Element * | toXML (DuckContext &duck, xml::Element *parent) const override final |
| virtual uint8_t | version () const |
| UString | xmlName () const |
Static Public Member Functions | |
| static TID | ComputeTableId (bool is_actual, bool is_pf, uint8_t eits_index=0) |
| template<typename T1, typename T2 = Names::uint_t> requires ts::int_enum<T1> && ts::int_enum<T2> | |
| static UString | DataName (const UChar *xml_name, const UChar *section, T1 value, NamesFlags flags=NamesFlags::NAME, T2 alternate=0, size_t bits=0) |
| static void | DisplaySection (ts::TablesDisplay &display, const ts::Section §ion, ts::PSIBuffer &payload, const ts::UString &margin) |
| A static method to display a section. | |
| static void | Fix (BinaryTable &table, FixMode mode) |
| static xml::Element * | GetOrCreateMetadata (xml::Element *element) |
| static ServiceIdTriplet | GetService (const Section §ion, bool include_version=false) |
| static bool | IsActual (TID tid) |
| static bool | IsEIT (TID tid) |
| static bool | IsOther (TID tid) |
| static bool | IsPresentFollowing (TID tid) |
| static bool | IsSchedule (TID tid) |
| static void | ReorganizeSections (DuckContext &duck, SectionPtrVector §ions, const Time &reftime=Time(), EITOptions options=EITOptions::GEN_ALL) |
| static Time | SegmentStartTime (const Time &event_start_time) |
| static uint8_t | SegmentToSection (size_t segment) |
| static TID | SegmentToTableId (bool is_actual, size_t segment) |
| static bool | SetStandaloneSchedule (Section §ion) |
| static Time | TableStartTime (const Time &last_midnight, const Time &event_start_time) |
| static size_t | TimeToSegment (const Time &last_midnight, const Time &event_start_time) |
| static TID | TimeToTableId (bool is_actual, const Time &last_midnight, const Time &event_start_time) |
| static TID | ToggleActual (TID tid, bool is_actual) |
Public Attributes | |
| EventList | events |
| List of events. | |
| TID | last_table_id = TID_NULL |
| Last table id. | |
| uint16_t | onetw_id = 0 |
| Original network id. | |
| uint16_t | service_id = 0 |
| Service_id. | |
| uint16_t | ts_id = 0 |
| Transport stream_id. | |
Static Public Attributes | |
| static constexpr size_t | EIT_EVENT_FIXED_SIZE = 12 |
| static constexpr size_t | EIT_HEADER_SIZE = LONG_SECTION_HEADER_SIZE |
| static constexpr size_t | EIT_PAYLOAD_FIXED_SIZE = 6 |
| static constexpr size_t | SECTIONS_PER_SEGMENT = 8 |
| static constexpr cn::milliseconds | SEGMENT_DURATION = cn::hours(3) |
| static constexpr size_t | SEGMENTS_PER_DAY = 8 |
| static constexpr size_t | SEGMENTS_PER_TABLE = 32 |
| static constexpr cn::milliseconds | TABLE_DURATION = SEGMENTS_PER_TABLE * SEGMENT_DURATION |
| static constexpr cn::days | TOTAL_DAYS = cn::days(64) |
| static constexpr cn::milliseconds | TOTAL_DURATION = TOTAL_SEGMENTS_COUNT * SEGMENT_DURATION |
| static constexpr size_t | TOTAL_SEGMENTS_COUNT = 512 |
| static constexpr size_t | TOTAL_TABLES_COUNT = 16 |
| static constexpr const UChar * | XML_GENERIC_DESCRIPTOR = u"generic_descriptor" |
| static constexpr const UChar * | XML_GENERIC_LONG_TABLE = u"generic_long_table" |
| static constexpr const UChar * | XML_GENERIC_SHORT_TABLE = u"generic_short_table" |
Protected Member Functions | |
| bool | addOneSection (BinaryTable &table, PSIBuffer &payload) const |
| virtual void | addOneSectionImpl (BinaryTable &, PSIBuffer &) const override |
| virtual bool | analyzeXML (DuckContext &, const xml::Element *) override |
| virtual void | buildXML (DuckContext &, xml::Element *) const override |
| virtual void | clearContent () override |
| virtual void | deserializePayload (PSIBuffer &, const Section &) override |
| virtual void | deserializePayloadWrapper (PSIBuffer &, const Section &) override |
| virtual bool | isValidTableId (TID) const override |
| virtual size_t | maxPayloadSize () const override |
| virtual void | serializePayload (BinaryTable &, PSIBuffer &) const override |
| virtual bool | useTrailingCRC32 () const override |
Protected Attributes | |
| bool | _is_current = true |
| TID | _table_id = TID_NULL |
| uint8_t | _version = 0 |
Representation of a DVB Event Information Table (EIT).
EIT's are very special tables. In fact, EIT's are not "tables" in the MPEG-TS sense. A valid "table" contains all sections from number zero to last_section_number. EIT's, on the contrary, are organized in "segments" as described in ETSI TS 101 211, with missing sections between segments.
An instance of the C++ class named EIT (and its XML counterpart) logically contains the same information as an EIT as defined in ETSI EN 300 468, ie. a service identification and a list of events in that service. Serializing such an object produces a set of contiguous sections which are syntactically correct according to ETSI EN 300 468. However, the organization of events and sections is generally not compatible with the rules from ETSI TS 101 211 (especially EIT-schedule). The static method ReorganizeSections() can be used to transform a set of EIT sections and reorganize events and sections to produce a set of sections which are compatible with the rules from ETSI TS 101 211. The resulting sections can be directly injected in PID 18 of a transport stream.
Consequently, the correct way to produce conformant EIT sections is the following:
--eit-normalization (in plugin inject for instance). This option has the effect of invoking EIT::ReorganizeSections() over all sections which are created from each XML file.| using ts::EIT::EventList = AttachedEntryList<Event> |
List of events.
| enum ts::EIT::FixMode |
EIT fixing modes as used by Fix().
| ts::EIT::EIT | ( | bool | is_actual = true, |
| bool | is_pf = true, | ||
| uint8_t | eits_index = 0, | ||
| uint8_t | version = 0, | ||
| bool | is_current = true, | ||
| uint16_t | service_id = 0, | ||
| uint16_t | ts_id = 0, | ||
| uint16_t | onetw_id = 0 ) |
Default constructor.
| [in] | is_actual | True for EIT Actual TS, false for EIT Other TS. |
| [in] | is_pf | True for EIT present/following, false for EIT schedule. |
| [in] | eits_index | For EIT schedule, index from 0x00 to 0x0F, ignored for EIT present/following. |
| [in] | version | Table version number. |
| [in] | is_current | True if table is current, false if table is next. |
| [in] | service_id | identifier. |
| [in] | ts_id | Transport stream identifier. |
| [in] | onetw_id | Original network id. |
| ts::EIT::EIT | ( | DuckContext & | duck, |
| const BinaryTable & | table ) |
Constructor from a binary table.
| [in,out] | duck | TSDuck execution context. |
| [in] | table | Binary table to deserialize. |
| ts::EIT::EIT | ( | const EIT & | other | ) |
Copy constructor.
| [in] | other | Other instance to copy. |
|
static |
|
static |
|
inlinestatic |
Compute the segment of an event in an EIT schedule.
| [in] | last_midnight | Reference time of "last midnight". |
| [in] | event_start_time | UTC start time of event. |
Compute the segment start time of an event in an EIT schedule.
| [in] | event_start_time | UTC start time of event. |
Compute the start time of EIT schedule table id for an event.
| [in] | last_midnight | Reference time of "last midnight". |
| [in] | event_start_time | UTC start time of event. |
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
|
static |
Extract the service id triplet from an EIT section.
| [in] | section | An EIT section. |
| [in] | include_version | If true, include the version of the EIT section in the ServiceIdTriplet. If false, set the version field of the ServiceIdTriplet to zero. |
Assignment operator.
| [in] | other | Other instance to copy. |
|
inline |
| void ts::EIT::setActual | ( | bool | is_actual | ) |
|
inline |
|
static |
Static method to fix the segmentation of a binary EIT.
Warning: This method is legacy and should no longer be used. Now preferably use the method ReorganizeSections(). The method Fix() works on a BinaryTable object. Such an object contains a "valid" table, ie. containing all sections, from zero to last_section_number. But in practice, EIT's are never complete tables. They are a set of sections which are organized in segments as described in ETSI TS 101 211, with missing sections between segments. As a consequence, attempting to reorganize EIT sections inside a valid BinaryTable object is not possible in the general case.
The method ReorganizeSections(), on the contrary, works on a set or sections, without any attempt to keep valid full tables.
| [in,out] | table | The table to fix. Ignored if it is not valid or not an EIT. |
| [in] | mode | The type of fix to apply. |
|
static |
Static method to reorganize a set of EIT sections according to ETSI TS 101 211.
Warning: This method is no longer the preferred way to generate clean and organized EIT's. It is recommended to use the more generic class EITGenerator.
Only one EITp/f subtable is kept per service. It is split in two sections if two events (present and following) are specified.
All EIT schedule are kept. But they are completely reorganized. All events are extracted and spread over new EIT sections according to ETSI TS 101 211 rules.
Non-EIT sections are left unmodified.
| [in,out] | duck | TSDuck execution context. |
| [in,out] | sections | A vector of safe pointers to sections. Only valid EIT sections are used. On output, a completely new list of sections is built. |
| [in] | reftime | Reference UTC time for EIT schedule. Only the date part is used. This is the "last midnight" according to which EIT segments are assigned. By default, the oldest event start time is used. |
| [in] | options | Generation options for EIT (p/f and/or schedule, actual and/or other). |
|
static |
Modify an EIT-schedule section to make it "standalone", outside any other table. Its section number and last section number are set to zero.
| [in,out] | section | The section to update. |
|
overridevirtual |
Get the table id extension. The table id extension is a 16-bit field which usually contains one of the table fields (service id, transport stream id, etc.) For each subclass, the table id extension is usually directly available in the corresponding public field. This virtual method is a generic way to access the table id extension.
Implements ts::AbstractLongTable.
|
static |
A static method to display a section.
| [in,out] | display | Display engine. |
| [in] | section | The section to display. |
| [in,out] | payload | A PSIBuffer over the payload. |
| [in] | margin | Left margin content. |
|
overrideprotectedvirtual |
Helper method to clear the content of the table or descriptor.
It is called by clear(). In clearContent(), the subclass shall simply revert the value of all fields to their original values in the default constructor.
Implements ts::AbstractSignalization.
|
overrideprotectedvirtual |
This method checks if a table id is valid for this object.
| [in] | tid | A table id to check. |
Reimplemented from ts::AbstractTable.
|
overrideprotectedvirtual |
This abstract method serializes the payload of all sections in the table.
When serialize() is called, the output binary table is cleared and serializePayload() is called. A subclass shall implement serializePayload() which adds all required sections in the binary table.
Note that it is not necessary to explicitly add the last (or only) section. Upon return from serializePayload(), serialize() checks the state of the payload buffer. If the output binary table is still empty or if the payload buffer is not empty (or not empty after the last saved write position), then addOneSection() is automatically called.
| [in,out] | table | The binary table into which this object shall be serialized. The table is initially empty when serialize() calls serializePayload(). |
| [in,out] | buf | A PSIBuffer with the appropriate size for the section payload. The payload buffer is initially empty when serialize() calls serializePayload(). |
Implements ts::AbstractTable.
|
overrideprotectedvirtual |
This abstract method deserializes the payload of one section.
When deserialize() is called, this object is cleared and validated. Then, deserializePayload() is invoked for each section in the binary table. A subclass shall implement deserializePayload() which adds the content of the binary section to the C++ object. Do not reset the object in deserializePayload() since it is repeatedly called for each section of a single binary table.
| [in,out] | buf | Deserialization buffer. The subclass shall read the descriptor payload from buf. The end of read is the end of the binary payload. If any kind of error is reported in the buffer or if the payload is not completely read, the deserialization is considered as invalid. |
| [in] | section | A reference to the section. Can be used to access values in the section header (typically for long sections). |
Implements ts::AbstractTable.
|
overrideprotectedvirtual |
Helper method to convert this object to XML.
It is called by toXML() only when the object is valid. The root element is already built with the appropriate XML node name. In buildXML(), the subclass shall simply populate the XML node.
| [in,out] | root | The root node for the new XML tree. |
| [in,out] | duck | TSDuck execution context. |
Implements ts::AbstractSignalization.
|
overrideprotectedvirtual |
Helper method to convert this object from XML.
It is called by fromXML() after checking the validity of the XML node name. In analyzeXML(), the subclass shall populate the C++ object from the content of the XML node. If analyzeXML() returns false, this table or descriptor object is then invalidated and cleared.
| [in,out] | duck | TSDuck execution context. |
| [in] | element | XML element to convert. |
Implements ts::AbstractSignalization.
|
virtualinherited |
Get the table version.
Reimplemented in ts::MPEFECTable, and ts::MPEIFECTable.
|
virtualinherited |
Set the table version.
| [in] | version | New version number. The value is reduced modulo 32. |
Reimplemented in ts::MPEFECTable, and ts::MPEIFECTable.
|
inlineinherited |
Increment the table version.
| [in] | increment | Increment the version by this value, by default 1. |
|
virtualinherited |
Check if the table is current.
Reimplemented in ts::DST, ts::MPEFECTable, ts::MPEIFECTable, and ts::NRT.
|
virtualinherited |
Set the current/next status of the table.
| [in] | is_current | True if the table is current, false if the table is next. |
Reimplemented in ts::DST, ts::MPEFECTable, ts::MPEIFECTable, and ts::NRT.
|
finaloverridevirtualinherited |
This method clears the content of the table or descriptor. Upon return, the object is valid and in the same empty state as after a default constructor.
Reimplemented from ts::AbstractTable.
|
overrideprotectedvirtualinherited |
Get the maximum size in bytes of the payload of sections of this table.
Reimplemented from ts::AbstractTable.
Reimplemented in ts::AIT, ts::BAT, ts::CableEmergencyAlertTable, ts::DSMCCDownloadDataMessage, ts::DSMCCUserToNetworkMessage, ts::NIT, ts::RRT, ts::SAT, ts::SDT, ts::STT, and ts::VCT.
|
overrideprotectedvirtualinherited |
Check if the sections of this table have a trailing CRC32. This is usually false for short sections but some short sections such as DVB-TOT use a CRC32.
Reimplemented from ts::AbstractTable.
|
overrideprotectedvirtualinherited |
Wrapper for deserializePayload(). This is a method to overload in intermediate classes to avoid using "call superclass" to all tables.
| [in,out] | buf | Deserialization buffer. |
| [in] | section | A reference to the section. |
Reimplemented from ts::AbstractTable.
|
overrideprotectedvirtualinherited |
Actual implementation of adding one section in a binary table. Do not call directly, it is only called by addOneSection() and is overridden in AbstractLongTable.
| [in,out] | table | The binary table into which the new section shall be added. |
| [in,out] | payload | A PSIBuffer containing the section payload between the read and the write pointer. |
Reimplemented from ts::AbstractTable.
|
inlineinherited |
Get the table_id.
|
virtualinherited |
Check if the table is a private one (ie. not MPEG-defined). The default implementation returns true. MPEG-defined tables should override this method to return false.
Reimplemented in ts::CableEmergencyAlertTable, ts::CAT, ts::DSMCCDownloadDataMessage, ts::DSMCCStreamDescriptorsTable, ts::DSMCCUserToNetworkMessage, ts::MPEFECTable, ts::MPEIFECTable, ts::PAT, ts::PMT, ts::SpliceInformationTable, and ts::TSDT.
|
inherited |
This method serializes a table.
| [in,out] | duck | TSDuck execution context. |
| [out] | bin | A binary table object. Its content is replaced with a binary representation of this object. |
|
inherited |
This method deserializes a binary table. In case of success, this object is replaced with the interpreted content of bin. In case of error, this object is invalidated.
| [in,out] | duck | TSDuck execution context. |
| [in] | bin | A binary table to interpret according to the table subclass. |
|
inlineinherited |
Set a generic user-defined string as "attribute" of the table. The semantics of this attribute string is not defined. It is used by the application. The attribute string can be found in the <metadata> structure of the XML representation of the table.
| [in] | attr | Generic string to set as attribute. |
|
virtualinherited |
Get the address of the "top-level descriptor list" of the table.
Some tables have descriptor lists, and sometimes two levels of descriptor lists. This is the case of the PMT, NIT, BAT, etc. The "top-level descriptor list" is present once in the table. It describes the service (PMT), the network (NIT) or the operator (BAT). At the second level, there is one descriptor list per component (PMT), or per transport stream (NIT, BAT). Sometimes, when exploring a second-level descriptor list, it is useful to also explore the top-level descriptor list. This virtual method returns a pointer to the top-level descriptor list. Thus, when exploring a second-level descriptor list, using the table pointer in that list, we can get a reference to the higher-level list.
The default implementation returns the null pointer.
Reimplemented in ts::AbstractDescriptorsTable, ts::AbstractTransportListTable, ts::AIT, ts::BIT, ts::CableEmergencyAlertTable, ts::CDT, ts::DCCSCT, ts::DCCT, ts::DST, ts::INT, ts::ITT, ts::MGT, ts::PMT, ts::RCT, ts::RNT, ts::RRT, ts::SelectionInformationTable, ts::SGT, ts::SpliceInformationTable, ts::STT, ts::SVCT, ts::TOT, ts::UNT, and ts::VCT.
|
virtualinherited |
Get the address of the "top-level descriptor list" of the table (constant).
Reimplemented in ts::AbstractDescriptorsTable, ts::AbstractTransportListTable, ts::AIT, ts::BIT, ts::CableEmergencyAlertTable, ts::CDT, ts::DCCSCT, ts::DCCT, ts::DST, ts::INT, ts::ITT, ts::MGT, ts::PMT, ts::RCT, ts::RNT, ts::RRT, ts::SelectionInformationTable, ts::SGT, ts::SpliceInformationTable, ts::STT, ts::SVCT, ts::TOT, ts::UNT, and ts::VCT.
|
inlineinherited |
Get the generic user-defined "attribute" string of the table.
|
finaloverridevirtualinherited |
This method converts this object to XML.
When this object is valid, this method creates a root node with the default XML name and then invokes buildXML() in the subclass to populate the XML node.
Important: Implementers of signalization classes shall not override this class. Implement the protected method buildXML() instead.
| [in,out] | duck | TSDuck execution context. |
| [in,out] | parent | The parent node for the new XML tree. |
Reimplemented from ts::AbstractSignalization.
|
finaloverridevirtualinherited |
This method converts an XML structure to a table or descriptor in this object.
In case of success, this object is replaced with the interpreted content of the XML structure. In case of error, this object is invalidated.
This method checks the name of the XML node and then invokes analyzeXML() in the subclass. Depending on the returned values of analyzeXML(), this object is either validated or invalidated.
Important: Implementers of signalization classes shall not override this class. Implement the protected method analyzeXML() instead.
| [in,out] | duck | TSDuck execution context. |
| [in] | element | XML element to convert. |
Reimplemented from ts::AbstractSignalization.
|
staticinherited |
Get the <metadata> structure inside a XML element representing a table. If the <metadata> structure does not exist, it is created.
| [in,out] | element | The XML element representing a table. |
|
protectedinherited |
Helper method for serializePayload(): add a section in a binary table.
For long tables, the section number is always one more than the current last section in the table.
If the payload buffer has a pushed read/write state, this state is restored and immediately pushed again. The typical use case is the following:
| [in,out] | table | The binary table into which the new section shall be added. |
| [in,out] | payload | A PSIBuffer containing the section payload between the read and the write pointer. |
|
inlineinherited |
Check if this object is valid.
|
inlineinherited |
Invalidate this object. This object must be rebuilt.
|
inherited |
Get the XMl node name representing this table or descriptor.
|
overridevirtualinherited |
Get the list of standards which define this object.
| [in] | current_standards | Current standards in the stream so far. This is a hint which may help the object to determine to which standard it belongs. This can be used by objects with slightly different semantics depending on the standard. |
Implements ts::AbstractDefinedByStandards.
Reimplemented in ts::AbstractDescriptor.
|
inlinestaticinherited |
Get a name from a specified section in the DVB names file.
| [in] | xml_name | Table or descriptor name, as used in XML structures. |
| [in] | section | Name of section to search. Not case-sensitive. The actual section in the names file is prefixed by the XML name, followed by a dot. |
| [in] | value | Value to get the name for. |
| [in] | flags | Presentation flags. |
| [in] | alternate | Display this integer value if flags ALTERNATE is set. |
| [in] | bits | Optional size in bits of the displayed data. Used in replacement of the "Bits=XX" directive in the .names file. |
|
inlineinherited |
Get a name from a specified section in the DVB names file for that signalization structure.
| [in] | section | Name of section to search. Not case-sensitive. The actual section in the names file is prefixed by the XML name of the structure, followed by a dot. |
| [in] | value | Value to get the name for. |
| [in] | flags | Presentation flags. |
| [in] | alternate | Display this integer value if flags ALTERNATE is set. |
| [in] | bits | Optional size in bits of the displayed data. Used in replacement of the "Bits=XX" directive in the .names file. |
|
staticconstexpr |
|
staticconstexpr |
Number of logical segments per day. Each segment covers 3 hours.
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
Minimum payload size of an EIT section before event loop.
|
staticconstexpr |
Minimum size of an event structure in an EIT section before descriptor loop.
|
protectedinherited |
The table version number field is directly accessible to subclasses only. Some table subclasses may want to enforce specific behaviors.
|
protectedinherited |
The table current/next field is directly accessible to subclasses only. Some table subclasses may want to enforce specific behaviors.
The table id can be modified by subclasses only.
|
staticconstexprinherited |
XML tag name for generic descriptors.
|
staticconstexprinherited |
XML tag name for generic short sections.
|
staticconstexprinherited |
XML tag name for generic tables with long sections.