Ticket #5562: patch1_addbat.patch

File patch1_addbat.patch, 5.3 KB (added by David Matthews <dm@…>, 11 years ago)
  • libs/libmythtv/mpeg/dvbtables.h

     
    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    uint BouquetID() const { return TableIDExtension(); }
     191
     192    // reserved                 2   5.0          3
     193    // version_number           5   5.2          0
     194    // current_next_indicator   1   5.7          1
     195    // section_number           8   6.0       0x00
     196    // last_section_number      8   7.0       0x00
     197    // reserved                 4   8         0x0d
     198    uint BouquetDescriptorsLength(void) const
     199        { return ((psipdata()[0]<<8) | psipdata()[1]) & 0xfff; }
     200           
     201    // Bouquet descriptors len 12   8.4
     202    // for (i=0;i<N;i++)
     203    // Descriptor();
     204    const unsigned char* BouquetDescriptors(void) const
     205        { return psipdata() + 2; }
     206    // reserved                4 10+N.0
     207
     208    // Transport stream loop len 12
     209    uint TransportStreamDataLength(void) const
     210        { return ((_tsc_ptr[0]<<8) | _tsc_ptr[1]) & 0xfff; }
     211    uint TransportStreamCount(void) const
     212        { return _ptrs.size() - 1; }
     213
     214    // for (i=0;i<N;i++) {
     215    //   transport_stream_id    16
     216    uint TSID(uint i) const { return (_ptrs[i][0] << 8) | _ptrs[i][1]; }
     217    //   original_network_id    16
     218    uint OriginalNetworkID(uint i) const
     219        { return (_ptrs[i][2] << 8) | _ptrs[i][3]; }
     220    //   reserved                4
     221    //   transport descriptor len 12
     222    uint TransportDescriptorsLength(uint i) const
     223        { return ((_ptrs[i][4]<<8) | _ptrs[i][5]) & 0xfff; }
     224    ///    for(j=0;j<N;j++)     x  6.0+p
     225    ///      { descriptor() }
     226    const unsigned char* TransportDescriptors(uint i) const
     227        { return _ptrs[i]+6; }
     228    // }
     229
     230    void Parse(void) const;
     231    QString toString(void) const;
     232
     233  private:
     234    mutable const unsigned char* _tsc_ptr;
     235    mutable vector<const unsigned char*> _ptrs;
     236};
     237
    167238class DiscontinuityInformationTable : public PSIPTable
    168239{
    169240    DiscontinuityInformationTable(const PSIPTable& table) : PSIPTable(table)
  • libs/libmythtv/mpeg/dvbtables.cpp

     
    148148        return false;
    149149}
    150150
     151void BouquetAssociationTable::Parse(void) const
     152{
     153    _tsc_ptr = pesdata() + 10 + BouquetDescriptorsLength();
     154
     155    _ptrs.clear();
     156    _ptrs.push_back(_tsc_ptr + 2);
     157    for (uint i=0; _ptrs[i] + 6 <= _ptrs[0] + TransportStreamDataLength(); i++)
     158        _ptrs.push_back(_ptrs[i] + 6 + TransportDescriptorsLength(i));
     159}
     160
     161QString BouquetAssociationTable::toString(void) const
     162{
     163    QString str =
     164        QString("BAT: BouquetID(0x%1) transports(%2)\n")
     165        .arg(BouquetID(), 0, 16).arg(TransportStreamCount());
     166
     167    if (0 != BouquetDescriptorsLength())
     168    {
     169        str.append(QString("Bouquet descriptors length: %1\n")
     170                   .arg(BouquetDescriptorsLength()));
     171        vector<const unsigned char*> desc =
     172            MPEGDescriptor::Parse(BouquetDescriptors(),
     173                                  BouquetDescriptorsLength());
     174        for (uint i = 0; i < desc.size(); i++)
     175            str.append(QString("  %1\n")
     176                       .arg(MPEGDescriptor(desc[i]).toString()));
     177    }
     178
     179    for (uint i = 0; i < TransportStreamCount(); i++)
     180    {
     181        str.append(QString("  Transport #%1 TSID(0x%2) ")
     182                   .arg(i, 2, 10).arg(TSID(i), 0, 16));
     183        str.append(QString("original_network_id(0x%2) desc_len(%3)\n")
     184                   .arg(OriginalNetworkID(i), 0, 16)
     185                   .arg(TransportDescriptorsLength(i)));
     186
     187        if (0 != TransportDescriptorsLength(i))
     188        {
     189            str.append(QString("  Transport descriptors length: %1\n")
     190                       .arg(TransportDescriptorsLength(i)));
     191            vector<const unsigned char*> desc =
     192                MPEGDescriptor::Parse(TransportDescriptors(i),
     193                                      TransportDescriptorsLength(i));
     194            for (uint i = 0; i < desc.size(); i++)
     195                str.append(QString("    %1\n")
     196                           .arg(MPEGDescriptor(desc[i]).toString()));
     197        }
     198    }
     199    return str;
     200}
     201
    151202void DVBEventInformationTable::Parse(void) const
    152203{
    153204    _ptrs.clear();