Ticket #5530: csat-dvbtables.diff

File csat-dvbtables.diff, 4.8 KB (added by eallaud@…, 16 years ago)
  • mythtv/libs/libmythtv/mpeg/dvbtables.h

    old new  
    164164        mutable vector<const unsigned char*> _ptrs; // used to parse
    165165};
    166166
     167/** \class BouquetAssociationTable
     168 *  \brief Tells what channels can be found on each transponder
     169 *  for one bouquet (a bunch of channels from one provider)
     170 *  Note: French Provider Canal+ uses this to associate channels
     171 *  with an index used in their proprietary EIT
     172 */
     173
     174class BouquetAssociationTable : public PSIPTable
     175{
     176    public:
     177        BouquetAssociationTable(const PSIPTable& table) : PSIPTable(table)
     178        {
     179            assert(TableID::BAT == TableID());
     180            Parse();
     181        }
     182        ~BouquetAssociationTable() { ; }
     183
     184        // table_id                 8   0.0       0x4a
     185        // section_syntax_indicator 1   1.0          1
     186        // reserved_future_use      1   1.1          1
     187        // reserved                 2   1.2          3
     188        // section_length          12   1.4          0
     189        // Bouquet ID              16   3.0          0
     190        // reserved                 2   5.0          3
     191        // version_number           5   5.2          0
     192        // current_next_indicator   1   5.7          1
     193        // section_number           8   6.0       0x00
     194        // last_section_number      8   7.0       0x00
     195        // reserved                 4   8         0x0d
     196        // Bouquet descriptors len 12   8.4
     197        // for (i=0;i<N;i++)
     198        // Descriptor();
     199        // reserved                4 10+N.0
     200        // Transport stream loop len 12
     201        // for (i=0;i<N;i++) {
     202        //   transport_stream_id    16
     203        //   original_network_id    16
     204        //   reserved                4
     205        //   transport descriptor len 12
     206        //   for (j=0;j<N;j++)
     207        //     Descriptor();
     208        //  }
     209        //  crc                     32
     210        uint TSID(uint i) const
     211        { return _ptrs[i][0] << 8 + _ptrs[i][1]; }
     212
     213        /// original_network_id    16   8.0
     214        uint OriginalNetworkID(uint i) const
     215        { return _ptrs[i][2] << 8 + _ptrs[i][3]; }
     216
     217        /* Returns a pointer to the first descriptor following
     218           the TS and Network ID, and the loop length */
     219        const unsigned char * TransportDescriptors(uint i) const
     220        { return _ptrs[i]+6; }
     221        uint TransportDescriptorsLoopLength(uint i) const
     222        { return (_ptrs[i][4] &0x0F)<< 8 + _ptrs[i][5]; }
     223        void Parse(void);
     224        uint NBTransports() const
     225        {
     226            return _ptrs.size();
     227        }
     228        QString BouquetName() const
     229        { return bouquet_name; }
     230
     231    private:
     232        /* point on the transport descriptors */
     233        mutable vector<const unsigned char*> _ptrs;
     234        mutable QString bouquet_name;
     235};
     236
    167237class DiscontinuityInformationTable : public PSIPTable
    168238{
    169239        DiscontinuityInformationTable(const PSIPTable& table) : PSIPTable(table)
  • mythtv/libs/libmythtv/mpeg/dvbtables.cpp

    old new  
    148148        return false;
    149149}
    150150
     151void BouquetAssociationTable::Parse(void)
     152{
     153    const unsigned char * p = psipdata()+8;
     154    uint looplen, len = (p[0] & 0x0F) << 8 + p[1]; // Name descriptor length
     155    desc_list_t desc;
     156    p += 2;
     157    desc = MPEGDescriptor::ParseOnlyInclude(p, len, DescriptorID::bouquet_name);
     158    if (desc.empty())
     159        VERBOSE(VB_SIPARSER,"Curious: BAT without bouquet name!");
     160    else
     161        bouquet_name = QString::fromLatin1((const char*)(desc[0]+2),
     162                                           MPEGDescriptor(desc[0]).DescriptorLength());
     163    p += len;
     164    looplen = (p[0] & 0x0F) << 8 + p[1];
     165    p += 2; // Now point on first TS desc
     166    while (looplen) {
     167        _ptrs.push_back(p);    // Add first TS position
     168        p += 4;                // Skip TS and network ID
     169        len = (p[0] & 0x0F) << 8 + p[1];    // Get length of descriptors
     170        p += 2;
     171        looplen -= 6;
     172        p += len;
     173        looplen -= len;
     174    }
     175}
     176
    151177void DVBEventInformationTable::Parse(void) const
    152178{
    153179    _ptrs.clear();
     
    177203    // Dish Network Long Term Future Event Information for all transports
    178204    is_eit |= (TableID::DN_EITbego <= table_id &&
    179205               TableID::DN_EITendo >= table_id);
     206    // Canal Satellite long term EIT for all transports
     207    is_eit |= (table_id == TableID::CSATCARAIBES_CHANNELS ||
     208               table_id == TableID::CSATCARAIBES_THEMES ||
     209               table_id == TableID::CSATCARAIBES_SCHED ||
     210               table_id == TableID::CSATCARAIBES_SUMMARIES);
    180211
    181212    return is_eit;
    182213}