Ticket #5530: 5530-v1.patch
File 5530-v1.patch, 9.8 KB (added by , 16 years ago) |
---|
-
libs/libmythtv/mpeg/dvbtables.cpp
148 148 return false; 149 149 } 150 150 151 void 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 151 184 void DVBEventInformationTable::Parse(void) const 152 185 { 153 186 _ptrs.clear(); -
libs/libmythtv/mpeg/dvbstreamdata.cpp
17 17 : MPEGStreamData(desired_program, cacheTables), 18 18 _desired_netid(desired_netid), _desired_tsid(desired_tsid), 19 19 _dvb_eit_dishnet_long(false), 20 _dvb_eit_csatcaraibes(false), 20 21 _nit_version(-2), _nito_version(-2) 21 22 { 22 23 SetVersionNIT(-1,0); … … 35 36 _dvb_other_listeners.clear(); 36 37 _dvb_eit_listeners.clear(); 37 38 _dvb_has_eit.clear(); 39 _dvb_bouquet_listeners.clear(); 38 40 } 39 41 40 42 void DVBStreamData::SetDesiredService(uint netid, uint tsid, int serviceid) … … 264 266 265 267 return true; 266 268 } 269 case TableID::BAT: 270 { 271 // TODO 272 return true; 273 } 267 274 case TableID::TDT: 268 275 { 269 276 TimeDateTable tdt(psip); … … 921 928 } 922 929 } 923 930 } 931 932 void 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 944 void 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
191 191 PREMIERE_EIT_DIREKT_PID = 0x0b11, 192 192 PREMIERE_EIT_SPORT_PID = 0x0b12, 193 193 194 // Canal Sat longterm EIT is on pid 0x114 and 0x153 195 CSATCARAIBES_EIT_PID1 = 0x114, 196 // CSATCARAIBES_EIT_PID2 = 0x153, 197 194 198 ATSC_PSIP_PID = 0x1ffb, 195 199 }; 196 200 … … 245 249 ARIBbeg = 0x80, 246 250 ARIBend = 0x8f, 247 251 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 248 258 // SCTE 249 259 PIM = 0xC0, // Program Information Message (57 2003) PMT PID 250 260 PNM = 0xC1, // Program Name Message (57 2003) PMT PID -
libs/libmythtv/mpeg/streamlisteners.h
31 31 class DirectedChannelChangeSelectionCodeTable; 32 32 33 33 class NetworkInformationTable; 34 class BouquetAssociationTable; 34 35 class ServiceDescriptionTable; 35 36 class TimeDateTable; 36 37 class DVBEventInformationTable; … … 145 146 virtual void HandleEIT(const PremiereContentInformationTable*) = 0; 146 147 }; 147 148 149 class DVBBouquetStreamListener 150 { 151 protected: 152 virtual ~DVBBouquetStreamListener() {} 153 public: 154 virtual void HandleBAT(const BouquetAssociationTable*)=0; 155 }; 148 156 149 157 #endif // _STREAMLISTENERS_H_ -
libs/libmythtv/mpeg/dvbtables.h
164 164 mutable vector<const unsigned char*> _ptrs; // used to parse 165 165 }; 166 166 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 */ 174 class 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 167 237 class DiscontinuityInformationTable : public PSIPTable 168 238 { 169 239 DiscontinuityInformationTable(const PSIPTable& table) : PSIPTable(table) -
libs/libmythtv/mpeg/dvbstreamdata.h
14 14 typedef QMap<uint, sdt_ptr_t> sdt_cache_t; // tsid+section->sdts 15 15 typedef QMap<uint, sdt_vec_t> sdt_map_t; // tsid->sdts 16 16 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; 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; 20 typedef vector<DVBBouquetStreamListener*> dvb_bouquet_listener_vec_t; 20 21 21 22 typedef QMap<uint, bool> dvb_has_eit_t; 22 23 … … 176 177 void AddDVBMainListener(DVBMainStreamListener*); 177 178 void AddDVBOtherListener(DVBOtherStreamListener*); 178 179 void AddDVBEITListener(DVBEITStreamListener*); 180 void AddDVBBouquetListener(DVBBouquetStreamListener*); 179 181 180 182 void RemoveDVBMainListener(DVBMainStreamListener*); 181 183 void RemoveDVBOtherListener(DVBOtherStreamListener*); 182 184 void RemoveDVBEITListener(DVBEITStreamListener*); 185 void RemoveDVBBouquetListener(DVBBouquetStreamListener*); 183 186 184 187 private: 185 188 // Caching … … 193 196 194 197 /// Decode DishNet's long-term DVB EIT 195 198 bool _dvb_eit_dishnet_long; 199 /// Decode Canal Satellite Caraibes DVB EIT 200 bool _dvb_eit_csatcaraibes; 196 201 /// Tell us if the DVB service has EIT 197 202 dvb_has_eit_t _dvb_has_eit; 198 203 … … 200 205 dvb_main_listener_vec_t _dvb_main_listeners; 201 206 dvb_other_listener_vec_t _dvb_other_listeners; 202 207 dvb_eit_listener_vec_t _dvb_eit_listeners; 208 dvb_bouquet_listener_vec_t _dvb_bouquet_listeners; 203 209 204 210 // Table versions 205 211 int _nit_version;