Ticket #2418: prem_eit_032007.diff
| File prem_eit_032007.diff, 15.2 KB (added by jochen, 5 years ago) |
|---|
-
libs/libmythtv/eithelper.cpp
225 225 226 226 uint chanid = GetChanID(eit->ServiceID(), eit->OriginalNetworkID(), 227 227 eit->TSID()); 228 if (!chanid) 228 229 uint tableid = eit->TableID(); 230 231 if (!chanid && tableid != TableID::PR_EIT) 229 232 return; 230 233 231 uint tableid = eit->TableID();232 234 uint version = eit->Version(); 233 235 for (uint i = 0; i < eit->EventCount(); i++) 234 236 { 235 237 // Skip event if we have already processed it before... 236 if (!eitcache->IsNewEIT(chanid, tableid, version, eit->EventID(i), 237 eit->EndTimeUnixUTC(i))) 238 if ((tableid != TableID::PR_EIT) 239 && (!eitcache->IsNewEIT(chanid, tableid, version, eit->EventID(i), 240 eit->EndTimeUnixUTC(i)))) 238 241 { 239 242 continue; 240 243 } … … 347 350 if (content_data) 348 351 { 349 352 ContentDescriptor content(content_data); 350 category = content.GetDescription(0); 351 category_type = content.GetMythCategory(0); 353 354 // fix events without real content data for Premiere EIT 355 if ((tableid == TableID::PR_EIT) && (content.Nibble(0)==0x00)){ 356 if(content.UserNibble(0)==0x1) 357 { 358 category_type = kCategoryMovie; 359 subtitle.length() < 2 ? category = QObject::tr("Movie") : category = subtitle; 360 } 361 else if(content.UserNibble(0)==0x0) 362 { 363 category_type = kCategorySports; 364 subtitle.length() < 2 ? category = QObject::tr("Sports") : category = subtitle; 365 } 366 } 367 else 368 { 369 category = content.GetDescription(0); 370 category_type = content.GetMythCategory(0); 371 } 352 372 } 353 373 354 desc_list_t contentIds = 374 if (tableid == TableID::PR_EIT) 375 { 376 // Find all transmission descriptors for this event 377 desc_list_t transmissions = 378 MPEGDescriptor::FindAll(list, DescriptorID::pr_event_transmission); 379 for(uint j=0; j<transmissions.size(); j++) 380 { 381 PremiereTransmissionDescriptor transmission(transmissions[j]); 382 uint descriptor_length = transmission.DescriptorLength(); 383 uint networkid = transmission.OriginalNetworkID(); 384 uint tsid = transmission.TSID(); 385 uint serviceid = transmission.ServiceID(); 386 387 uint chanid = GetChanID(serviceid, networkid, tsid); 388 389 if (!chanid) 390 { 391 VERBOSE(VB_GENERAL, LOC + QString("No channid for NIT:%1 TID:%2 SID:%3. Possible new feed channel or wrong eit data").arg(networkid).arg(tsid).arg(serviceid)); 392 continue; 393 } 394 uint pos = 0; 395 // find all transmissions for this event 396 while (pos<descriptor_length-6) 397 { 398 unsigned char startdate[5]; 399 memcpy(startdate, transmission.StartDate(pos), 2); 400 // get all start times on this day 401 for (uint k=0; k<transmission.TransmissionCount(pos); k+=3) 402 { 403 memcpy(&startdate[2], transmission.StartTime(pos+k), 3); 404 QDateTime starttime = MythUTCToLocal(dvbdate2qt(startdate)); 405 EITFixUp::TimeFix(starttime); 406 QDateTime endtime = starttime.addSecs(eit->DurationInSeconds(i)); 407 QString programId = "", seriesId = ""; 408 409 DBEvent *event = new DBEvent(chanid, 410 title, subtitle, description, 411 category, category_type, 412 starttime, endtime, fix, 413 false, subtitled, 414 stereo, hdtv, 415 seriesId, programId); 416 db_events.enqueue(event); 417 } 418 // set pos to next transmission 419 pos += 3 + transmission.TransmissionCount(pos); 420 } 421 } 422 } 423 else 424 { 425 desc_list_t contentIds = 355 426 MPEGDescriptor::FindAll(list, DescriptorID::dvb_content_identifier); 356 427 QString programId = "", seriesId = ""; 357 428 for (uint j = 0; j < contentIds.size(); j++) … … 381 452 stereo, hdtv, 382 453 seriesId, programId); 383 454 db_events.enqueue(event); 384 } 455 } } 385 456 } 386 457 387 458 void EITHelper::PruneEITCache(uint timestamp) -
libs/libmythtv/eithelper.h
47 47 class EventInformationTable; 48 48 class ExtendedTextTable; 49 49 class DVBEventInformationTable; 50 class DVBPremiereEventInformationTable; 50 51 51 52 class EITHelper 52 53 { -
libs/libmythtv/mpeg/dvbtables.cpp
165 165 // Dish Network Long Term Future Event Information for all transports 166 166 is_eit |= (TableID::DN_EITbego <= table_id && 167 167 TableID::DN_EITendo >= table_id); 168 // Premiere Event Information for option channels 169 is_eit |= TableID::PR_EIT == table_id; 168 170 169 171 return is_eit; 170 172 } -
libs/libmythtv/mpeg/dvbstreamdata.cpp
141 141 is_eit |= (TableID::DN_EITbego <= table_id && 142 142 TableID::DN_EITendo >= table_id); 143 143 } 144 if (DVB_PR_SPORT_EIT_PID == pid || DVB_PR_DIRECT_EIT_PID == pid) 145 { 146 is_eit |= TableID::PR_EIT == table_id; 147 } 144 148 if (is_eit) 145 149 { 146 150 uint service_id = psip.TableIDExtension(); … … 309 313 return true; 310 314 } 311 315 316 if ((DVB_PR_SPORT_EIT_PID || DVB_PR_DIRECT_EIT_PID) && 317 DVBEventInformationTable::IsEIT(psip.TableID())) 318 { 319 QMutexLocker locker(&_listener_lock); 320 if (!_dvb_eit_listeners.size() && !_eit_helper) 321 return true; 322 323 uint service_id = psip.TableIDExtension(); 324 SetVersionEIT(psip.TableID(), service_id, psip.Version()); 325 SetEITSectionSeen(psip.TableID(), service_id, psip.Section()); 326 327 DVBPremiereEventInformationTable eit(psip); 328 for (uint i = 0; i < _dvb_eit_listeners.size(); i++) 329 _dvb_eit_listeners[i]->HandleEIT(&eit); 330 331 if (_eit_helper) 332 _eit_helper->AddEIT(&eit); 333 334 return true; 335 } 336 312 337 return false; 313 338 } 314 339 … … 354 379 { 355 380 add_pids.push_back(DVB_DNLONG_EIT_PID); 356 381 } 382 if (find(cur_pids.begin(), cur_pids.end(), 383 (uint) DVB_PR_SPORT_EIT_PID) == cur_pids.end()) 384 { 385 add_pids.push_back(DVB_PR_SPORT_EIT_PID); 386 } 387 if (find(cur_pids.begin(), cur_pids.end(), 388 (uint) DVB_PR_DIRECT_EIT_PID) == cur_pids.end()) 389 { 390 add_pids.push_back(DVB_PR_DIRECT_EIT_PID); 391 } 357 392 } 358 393 else 359 394 { … … 369 404 { 370 405 del_pids.push_back(DVB_DNLONG_EIT_PID); 371 406 } 407 if (find(cur_pids.begin(), cur_pids.end(), 408 (uint) DVB_PR_SPORT_EIT_PID) != cur_pids.end()) 409 { 410 del_pids.push_back(DVB_PR_SPORT_EIT_PID); 411 } 412 if (find(cur_pids.begin(), cur_pids.end(), 413 (uint) DVB_PR_DIRECT_EIT_PID) != cur_pids.end()) 414 { 415 del_pids.push_back(DVB_PR_DIRECT_EIT_PID); 416 } 372 417 } 373 418 374 419 return add_pids.size() || del_pids.size(); -
libs/libmythtv/mpeg/mpegtables.h
187 187 // Dishnet longterm EIT is on pid 0x300 188 188 DVB_DNLONG_EIT_PID = 0x0300, 189 189 190 // Premiere EIT for Direct/Sport PPV 191 DVB_PR_DIRECT_EIT_PID = 0x0b11, 192 DVB_PR_SPORT_EIT_PID = 0x0b12, 193 190 194 ATSC_PSIP_PID = 0x1ffb, 191 195 }; 192 196 … … 236 240 // Dishnet Longterm EIT data 237 241 DN_EITbego = 0x80, // always on pid 0x300 238 242 DN_EITendo = 0xfe, // always on pid 0x300 243 244 // Premiere Eit for Direct and Sport 245 PR_EIT = 0xA0, 239 246 240 247 // ARIB 241 248 ARIBbeg = 0x80, -
libs/libmythtv/mpeg/dvbdescriptors.h
1674 1674 }; 1675 1675 1676 1676 1677 class PremiereTransmissionDescriptor : public MPEGDescriptor 1678 { 1679 public: 1680 PremiereTransmissionDescriptor(const unsigned char* data) : MPEGDescriptor(data) 1681 { 1682 // Name bits loc expected value 1683 // descriptor_tag 8 0.0 0xF2 1684 assert(DescriptorID::pr_event_transmission == DescriptorTag()); 1685 // descriptor_length 8 1.0 1686 } 1687 1688 // transport id 16 2.0 1689 uint TSID() const 1690 { return (_data[2] << 8) | _data[3]; } 1691 // network id 16 4.0 1692 uint OriginalNetworkID() const 1693 { return (_data[4] << 8) | _data[5]; } 1694 // service id 16 6.0 1695 uint ServiceID() const 1696 { return (_data[6] << 8) | _data[7]; } 1697 1698 // for(i=0;i<N;i+=2+1+count) 1699 // start date 16 8.0 1700 const unsigned char* StartDate(uint i) const 1701 { return &_data[8 + i]; } 1702 // transmission count 8 10.0 1703 uint TransmissionCount(uint i) const 1704 { return (_data[10 + i]); } 1705 // start_time 24 11.0+x 1706 const unsigned char* StartTime(uint i) const 1707 { return &_data[11 + i]; } 1708 1709 QString toString() const { return QString("TransmissionDescriptor(stub)"); } 1710 }; 1711 1712 1677 1713 #endif -
libs/libmythtv/mpeg/dvbtables.h
221 221 // last_section_number 8 7.0 222 222 Parse(); 223 223 } 224 virtual ~DVBEventInformationTable(){} 224 225 225 226 // service_id 16 3.0 226 uint ServiceID(void) const { return TableIDExtension(); }227 virtual uint ServiceID(void) const { return TableIDExtension(); } 227 228 228 229 // transport_stream_id 16 8.0 229 uint TSID(void) const230 virtual uint TSID(void) const 230 231 { return (psipdata()[0]<<8) | psipdata()[1]; } 231 232 232 233 // original_network_id 16 10.0 233 uint OriginalNetworkID(void) const234 virtual uint OriginalNetworkID(void) const 234 235 { return (psipdata()[2]<<8) | psipdata()[3]; } 235 236 236 237 // segment_last_section_num 8 12.0 … … 240 241 uint LastTableID(void) const 241 242 { return psipdata()[5]; } 242 243 243 uint EventCount() const { return _ptrs.size()-1; }244 virtual uint EventCount() const { return _ptrs.size()-1; } 244 245 245 246 // for(i=0;i<N;i++) { 246 247 // event_id 16 0.0+x … … 260 261 // duration 24 7.0+x 261 262 const unsigned char *Duration(uint i) const 262 263 { return _ptrs[i]+7; } 263 uint DurationInSeconds(uint i) const264 virtual uint DurationInSeconds(uint i) const 264 265 { 265 266 return ((byteBCD2int(Duration(i)[0]) * 3600) + 266 267 (byteBCD2int(Duration(i)[1]) * 60) + … … 271 272 // free_CA_mode 1 10.3+x 272 273 bool IsScrambled(uint i) const { return bool(_ptrs[i][10] & 0x10); } 273 274 // descriptors_loop_len 12 10.4+x 274 uint DescriptorsLength(uint i) const275 virtual uint DescriptorsLength(uint i) const 275 276 { return ((_ptrs[i][10]<<8) | (_ptrs[i][11])) & 0xfff; } 276 277 // for(i=0;i<N;i++) y 12.0+x 277 278 // { descriptor() } 278 const unsigned char* Descriptors(uint i) const279 virtual const unsigned char* Descriptors(uint i) const 279 280 { return _ptrs[i] + 12; } 280 281 // } 281 282 //CRC_32 32 rpchof 282 283 283 v oid Parse(void) const;284 virtual void Parse(void) const; 284 285 285 286 static bool IsEIT(uint table_id); 286 287 … … 314 315 time_t UTCUnix(void) const { return dvbdate2unix(UTCdata()); } 315 316 }; 316 317 318 class DVBPremiereEventInformationTable : public DVBEventInformationTable 319 { 320 public: 321 DVBPremiereEventInformationTable(const DVBEventInformationTable& table) : DVBEventInformationTable(table) 322 { 323 // table_id 8 0.0 0xA0 324 assert(IsEIT(TableID())); 325 // section_syntax_indicator 1 1.0 1 326 // private_indicator 1 1.1 1 327 // reserved 2 1.2 3 328 // section_length 12 1.4 329 // reserved 2 5.0 3 330 // version_number 5 5.2 331 // current_next_indicator 1 5.7 1 332 // section_number 8 6.0 333 // last_section_number 8 7.0 334 Parse(); 335 } 336 ~DVBPremiereEventInformationTable(){} 337 338 // content_id 32 0.0 339 uint ContentID(void) const 340 { return (psipdata()[0]<<24) | (psipdata()[1]<<16) | (psipdata()[2]<<8) | psipdata()[3]; } 341 342 // return dummy values for compatitbility 343 uint ServiceID(void) const { return 18; } 344 uint OriginalNetworkID(void) const { return 133; } 345 uint TSID(void) const { return 4; } 346 uint EventCount(void) const { return 1; } 347 348 // event_duration 24 4.0 349 uint DurationInSeconds(uint i) const 350 { return ((byteBCD2int(psipdata()[4]) * 3600) + 351 (byteBCD2int(psipdata()[5]) * 60) + 352 (byteBCD2int(psipdata()[6]))); } 353 354 // descriptor length 7 8.0 355 uint DescriptorsLength(uint i) const 356 { return ((psipdata()[7] & 0x0F) << 8) | psipdata()[8]; } 357 358 // descriptor length x 9.0 359 const unsigned char* Descriptors(uint i) const 360 { return &psipdata()[9]; } 361 362 void Parse(void) const {}; 363 }; 317 364 #endif // _DVB_TABLES_H_ -
libs/libmythtv/mpeg/mpegdescriptors.h
129 129 DCC_arriving_request = 0xA9, 130 130 DRM_control = 0xAA, 131 131 atsc_content_identifier = 0xB6, 132 133 // PREMIERE 134 pr_event_transmission = 0xF2, 132 135 }; 133 136 }; 134 137
