Ticket #5530: 5530-v1.patch

File 5530-v1.patch, 9.8 KB (added by danielk, 17 years ago)

portion of patch that i could make apply to trunk w/cleanups

  • libs/libmythtv/mpeg/dvbtables.cpp

     
    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    {
     160        VERBOSE(VB_SIPARSER,"Curious: BAT without bouquet name!");
     161    }
     162    else
     163    {
     164        bouquet_name = QString::fromLatin1(
     165            (const char*) (desc[0] + 2),
     166            MPEGDescriptor(desc[0]).DescriptorLength());
     167    }
     168
     169    p += len;
     170    looplen = ((p[0] & 0x0F) << 8) | p[1];
     171    p += 2; // Now point on first TS desc
     172    while (looplen)
     173    {
     174        _ptrs.push_back(p);    // Add first TS position
     175        p += 4;                // Skip TS and network ID
     176        len = ((p[0] & 0x0F) << 8) | p[1]; // Get length of descriptors
     177        p += 2;
     178        looplen -= 6;
     179        p += len;
     180        looplen -= len;
     181    }
     182}
     183
    151184void DVBEventInformationTable::Parse(void) const
    152185{
    153186    _ptrs.clear();
  • libs/libmythtv/mpeg/dvbstreamdata.cpp

     
    1717    : MPEGStreamData(desired_program, cacheTables),
    1818      _desired_netid(desired_netid), _desired_tsid(desired_tsid),
    1919      _dvb_eit_dishnet_long(false),
     20      _dvb_eit_csatcaraibes(false),
    2021      _nit_version(-2), _nito_version(-2)
    2122{
    2223    SetVersionNIT(-1,0);
     
    3536    _dvb_other_listeners.clear();
    3637    _dvb_eit_listeners.clear();
    3738    _dvb_has_eit.clear();
     39    _dvb_bouquet_listeners.clear();
    3840}
    3941
    4042void DVBStreamData::SetDesiredService(uint netid, uint tsid, int serviceid)
     
    264266
    265267            return true;
    266268        }
     269        case TableID::BAT:
     270        {
     271            // TODO
     272            return true;
     273        }
    267274        case TableID::TDT:
    268275        {
    269276            TimeDateTable tdt(psip);
     
    921928        }
    922929    }
    923930}
     931
     932void DVBStreamData::AddDVBBouquetListener(DVBBouquetStreamListener *val)
     933{
     934    QMutexLocker locker(&_listener_lock);
     935
     936    dvb_bouquet_listener_vec_t::iterator it = _dvb_bouquet_listeners.begin();
     937    for (; it != _dvb_bouquet_listeners.end(); ++it)
     938        if (((void*)val) == ((void*)*it))
     939            return;
     940
     941    _dvb_bouquet_listeners.push_back(val);
     942}
     943
     944void DVBStreamData::RemoveDVBBouquetListener(DVBBouquetStreamListener *val)
     945{
     946    QMutexLocker locker(&_listener_lock);
     947
     948    dvb_bouquet_listener_vec_t::iterator it = _dvb_bouquet_listeners.begin();
     949    for (; it != _dvb_bouquet_listeners.end(); ++it)
     950    {
     951        if (((void*)val) == ((void*)*it))
     952        {
     953            _dvb_bouquet_listeners.erase(it);
     954            return;
     955        }
     956    }
     957}
  • libs/libmythtv/mpeg/mpegtables.h

     
    191191    PREMIERE_EIT_DIREKT_PID = 0x0b11,
    192192    PREMIERE_EIT_SPORT_PID  = 0x0b12,
    193193
     194    // Canal Sat longterm EIT is on pid 0x114 and 0x153
     195    CSATCARAIBES_EIT_PID1 = 0x114,
     196    //    CSATCARAIBES_EIT_PID2 = 0x153,
     197
    194198    ATSC_PSIP_PID = 0x1ffb,
    195199};
    196200
     
    245249        ARIBbeg  = 0x80,
    246250        ARIBend  = 0x8f,
    247251
     252        // Canal Sat Caraibes Longterm EIT data
     253        CSATCARAIBES_CHANNELS  = 0x90, // always on pid 0x114
     254        CSATCARAIBES_THEMES    = 0x91, // always on pid 0x114
     255        CSATCARAIBES_SCHED     = 0x92, // always on pid 0x114
     256        CSATCARAIBES_SUMMARIES = 0x94, // always on pid 0x114
     257
    248258        // SCTE
    249259        PIM      = 0xC0, // Program Information Message (57 2003) PMT PID
    250260        PNM      = 0xC1, // Program Name Message (57 2003) PMT PID
  • libs/libmythtv/mpeg/streamlisteners.h

     
    3131class DirectedChannelChangeSelectionCodeTable;
    3232
    3333class NetworkInformationTable;
     34class BouquetAssociationTable;
    3435class ServiceDescriptionTable;
    3536class TimeDateTable;
    3637class DVBEventInformationTable;
     
    145146    virtual void HandleEIT(const PremiereContentInformationTable*) = 0;
    146147};
    147148
     149class DVBBouquetStreamListener
     150{
     151  protected:
     152    virtual ~DVBBouquetStreamListener() {}
     153  public:
     154    virtual void HandleBAT(const BouquetAssociationTable*)=0;
     155};
    148156
    149157#endif // _STREAMLISTENERS_H_
  • 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 *
     171 *  Note: French Provider Canal+ uses this to associate channels
     172 *  with an index used in their proprietary EIT
     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)
  • libs/libmythtv/mpeg/dvbstreamdata.h

     
    1414typedef QMap<uint, sdt_ptr_t>    sdt_cache_t; // tsid+section->sdts
    1515typedef QMap<uint, sdt_vec_t>    sdt_map_t;   // tsid->sdts
    1616
    17 typedef vector<DVBMainStreamListener*>   dvb_main_listener_vec_t;
    18 typedef vector<DVBOtherStreamListener*>  dvb_other_listener_vec_t;
    19 typedef vector<DVBEITStreamListener*>    dvb_eit_listener_vec_t;
     17typedef vector<DVBMainStreamListener*>    dvb_main_listener_vec_t;
     18typedef vector<DVBOtherStreamListener*>   dvb_other_listener_vec_t;
     19typedef vector<DVBEITStreamListener*>     dvb_eit_listener_vec_t;
     20typedef vector<DVBBouquetStreamListener*> dvb_bouquet_listener_vec_t;
    2021
    2122typedef QMap<uint, bool>                 dvb_has_eit_t;
    2223
     
    176177    void AddDVBMainListener(DVBMainStreamListener*);
    177178    void AddDVBOtherListener(DVBOtherStreamListener*);
    178179    void AddDVBEITListener(DVBEITStreamListener*);
     180    void AddDVBBouquetListener(DVBBouquetStreamListener*);
    179181
    180182    void RemoveDVBMainListener(DVBMainStreamListener*);
    181183    void RemoveDVBOtherListener(DVBOtherStreamListener*);
    182184    void RemoveDVBEITListener(DVBEITStreamListener*);
     185    void RemoveDVBBouquetListener(DVBBouquetStreamListener*);
    183186
    184187  private:
    185188    // Caching
     
    193196   
    194197    /// Decode DishNet's long-term DVB EIT
    195198    bool                      _dvb_eit_dishnet_long;
     199    /// Decode Canal Satellite Caraibes DVB EIT
     200    bool                      _dvb_eit_csatcaraibes;
    196201    /// Tell us if the DVB service has EIT
    197202    dvb_has_eit_t             _dvb_has_eit;
    198203
     
    200205    dvb_main_listener_vec_t   _dvb_main_listeners;
    201206    dvb_other_listener_vec_t  _dvb_other_listeners;
    202207    dvb_eit_listener_vec_t    _dvb_eit_listeners;
     208    dvb_bouquet_listener_vec_t _dvb_bouquet_listeners;
    203209
    204210    // Table versions
    205211    int                       _nit_version;