📄 siparser.cpp
字号:
if (CurrentTransport) ((ServiceHandler*) Table[SERVICES])->Services[0][s.ServiceID] = s; else ((ServiceHandler*) Table[SERVICES])->Services[s.TransportID][s.ServiceID] = s; s.Reset(); pos += (descriptors_loop_length + 5); } if (CurrentTransport) emit FindServicesComplete(); // TODO: This is temp Table[EVENTS]->DependencyMet(SERVICES); Table[EVENTS]->AddPid(0x12,0x00,0x00,true);}void SIParser::ParseDVBEIT(tablehead_t* head, uint8_t* buffer ,int size){ uint8_t last_segment_number = buffer[4]; uint8_t last_table_id = buffer[5]; if (!((EventHandler*) Table[EVENTS])->TrackerSetup[head->table_id_ext]) { if (PrivateTypes.CustomGuideRanges) { if ((head->table_id >= PrivateTypes.CurrentTransportTableMin) && (head->table_id <= PrivateTypes.CurrentTransportTableMax)) { for (int x = PrivateTypes.CurrentTransportTableMin; x <= PrivateTypes.CurrentTransportTableMax; x++) ((EventHandler*) Table[EVENTS])->Tracker[head->table_id_ext][x].Reset(); } else if ((head->table_id >= PrivateTypes.OtherTransportTableMin) && (head->table_id <= PrivateTypes.OtherTransportTableMax)) { for (int x = PrivateTypes.OtherTransportTableMin; x <= PrivateTypes.OtherTransportTableMax; x++) ((EventHandler*) Table[EVENTS])->Tracker[head->table_id_ext][x].Reset(); } } else { if ((head->table_id & 0xF0) == 0x50) { for (int x = 0x50 ; x < (last_table_id & 0x0F) + 0x50 ; x++) ((EventHandler*) Table[EVENTS])->Tracker[head->table_id_ext][x].Reset(); } if ((head->table_id & 0xF0) == 0x60) { for (int x = 0x60 ; x < (last_table_id & 0x0F) + 0x60 ; x++) ((EventHandler*) Table[EVENTS])->Tracker[head->table_id_ext][x].Reset(); } } ((EventHandler*) Table[EVENTS])->TrackerSetup[head->table_id_ext] = true; } if (Table[EVENTS]->AddSection(head,head->table_id_ext,head->table_id)) return; if (last_segment_number != head->section_last) { for (int x=(last_segment_number+1);x<((head->section_number&0xF8)+8);x++) ((EventHandler*) Table[EVENTS])->Tracker[head->table_id_ext][head->table_id].MarkUnused(x); } uint16_t pos = 6; uint16_t des_pos = 0; uint16_t descriptor_length = 0; // Event to use temporarily to fill in data Event e; // Set ServiceID/NetworkID/TransportID since they remain the same per table e.ServiceID = head->table_id_ext; e.TransportID = buffer[0] << 8 | buffer[1]; e.NetworkID = buffer[2] << 8 | buffer[3];#ifdef EIT_DEBUG_SIDif (e.ServiceID == EIT_DEBUG_SID) { fprintf(stdout,"EIT_DEBUG: sid:%d nid:%04X tid:%04X lseg:%02X ltab:%02X tab:%02X sec:%02X lsec: %02X size:%d\n", e.ServiceID, e.NetworkID, e.TransportID, last_segment_number, last_table_id, head->table_id, head->section_number, head->section_last, size);}#endif // Loop through table (last 4 bytes are CRC) while (pos < (size-4)) { e.EventID = buffer[pos] << 8 | buffer[pos+1]; e.StartTime = ConvertDVBDate(&buffer[pos+2]); e.EndTime = e.StartTime.addSecs( (bcdtoint(buffer[pos+7] & 0xFF) * 3600) + (bcdtoint(buffer[pos+8] & 0xFF) * 60) + (bcdtoint(buffer[pos+9] & 0xFF)) ) ;#ifdef EIT_DEBUG_SIDif (e.ServiceID == EIT_DEBUG_SID) { fprintf(stdout,"EIT_EVENT: %d EventID: %d Time: %s - %s\n",e.ServiceID,e.EventID,e.StartTime.toString(QString("yyyyMMddhhmm")).ascii(),e.EndTime.toString(QString("yyyyMMddhhmm")).ascii());}#endif // variables to store info about "best descriptor" 4D & 4E // (used to pick out the one with the preferred language // in case there are more than one) int bd4D_prio = -1; uint8_t *bd4D_data = NULL; QString bd4D_lang; int bd4E_prio = -1; uint8_t *bd4E_data = NULL; QString bd4E_lang; // Parse descriptors descriptor_length = ((buffer[pos+10] & 0x0F) << 8) | buffer[pos+11]; pos+=12; des_pos = pos; while (des_pos < (pos + descriptor_length)) { switch (buffer[des_pos]) { case 0x4D: { QString lang = QString::fromLatin1((const char*) &buffer[des_pos + 2], 3); int prio = LanguagePriority[lang];#ifdef EIT_DEBUG_SIDif (e.ServiceID == EIT_DEBUG_SID) { fprintf(stdout,"EIT_EVENT: 4D descriptor, lang %s, prio %i\n", lang.ascii(), prio);}#endif if ((prio > 0 && prio < bd4D_prio) || bd4D_prio == -1) { // this descriptor is better than what we have // => store a reference to this one bd4D_lang = lang; bd4D_prio = prio; bd4D_data = &buffer[des_pos]; } } break; case 0x4E: { QString lang = QString::fromLatin1((const char*) &buffer[des_pos + 3], 3); int prio = LanguagePriority[lang];#ifdef EIT_DEBUG_SIDif (e.ServiceID == EIT_DEBUG_SID) { fprintf(stdout,"EIT_EVENT: 4E descriptor, lang %s, prio %i\n", lang.ascii(), prio);}#endif if ((prio > 0 && prio < bd4E_prio) || bd4E_prio == -1) { // this descriptor is better than what we have // => store a reference to this one bd4E_lang = lang; bd4E_prio = prio; bd4E_data = &buffer[des_pos]; } } break; case 0x50: ProcessComponentDescriptor(&buffer[des_pos], buffer[des_pos+1]+2,e); break; case 0x54: e.ContentDescription = ProcessContentDescriptor(&buffer[des_pos],buffer[des_pos+1]+2); break; default: ProcessUnknownDescriptor(&buffer[des_pos],buffer[des_pos+1]+2); break; } des_pos += (buffer[des_pos+1]+2); if (des_pos > size) return; } // Resolve data for "best" 4D & 4E descriptors if (bd4D_data != NULL) {#ifdef EIT_DEBUG_SIDif (e.ServiceID == EIT_DEBUG_SID) { fprintf(stdout, "EIT_EVENT: using 4D data for language='%s'\n", bd4D_lang.ascii());}#endif e.LanguageCode = bd4D_lang; ProcessShortEventDescriptor(bd4D_data, bd4D_data[1] + 2, e); } if (bd4E_data != NULL) {#ifdef EIT_DEBUG_SIDif (e.ServiceID == EIT_DEBUG_SID) { fprintf(stdout, "EIT_EVENT: using 4E data for language='%s'\n", bd4E_lang.ascii());}#endif e.LanguageCode = bd4E_lang; ProcessExtendedEventDescriptor(bd4E_data, bd4E_data[1] + 2, e); } EITFixUp(e);#ifdef EIT_DEBUG_SIDif (e.ServiceID == EIT_DEBUG_SID) { fprintf(stdout, "EIT_EVENT: LanguageCode='%s' Event_Name='%s' Description='%s'\n", e.LanguageCode.ascii(), e.Event_Name.ascii(), e.Description.ascii());}#endif ((EventHandler*) Table[EVENTS])->Events[head->table_id_ext][e.EventID] = e; e.clearEventValues(); pos += descriptor_length; }}/*------------------------------------------------------------------------ * COMMON DESCRIPTOR PARSERS *------------------------------------------------------------------------*/// Descriptor 0x09 - Conditional Access DescriptorCAPMTObject SIParser::ParseDescriptorCA(uint8_t* buffer, int size){ (void) size; CAPMTObject retval; retval.CASystemID = buffer[2] << 8 | buffer[3]; retval.PID = (buffer[4] & 0x1F) << 8 | buffer[5]; retval.Data_Length = buffer[1] - 4; if (retval.Data_Length > 0) { memcpy(retval.Data, &buffer[6], retval.Data_Length); } return retval;}/*------------------------------------------------------------------------ * DVB DESCRIPTOR PARSERS *------------------------------------------------------------------------*/// Descriptor 0x40 - NetworkNamevoid SIParser::ParseDescriptorNetworkName(uint8_t* buffer, int size, NetworkObject &n){ (void) size; n.NetworkName = DecodeText(buffer + 2, buffer[1]);}// Descriptor 0x4A - Linkage - NITvoid SIParser::ParseDescriptorLinkage(uint8_t* buffer,int size,NetworkObject &n){ (void) size; n.LinkageTransportID = buffer[2] << 8 | buffer[3]; n.LinkageNetworkID = buffer[4] << 8 | buffer[5]; n.LinkageServiceID = buffer[6] << 8 | buffer[7]; n.LinkageType = buffer[8]; n.LinkagePresent = 1; //The following was found to break EIT guide for // Kristian Kalweit <kalweit@exorpro.de> if (n.LinkageType == 4) { PrivateTypes.GuideOnSingleTransport = true; PrivateTypes.GuideTransportID = n.LinkageTransportID; }}// Descriptor 0x62 - Frequency List - NITvoid SIParser::ParseDescriptorFrequencyList(uint8_t* buffer,int size, TransportObject& t){ int i = 2; uint8_t coding = buffer[i++] & 0x3; unsigned frequency; QString FrequencyTemp; for (; i < size ; i+=4) { switch (coding) { case 0x3: //DVB-T frequency*=10; frequency = (((buffer[i] << 24) | (buffer[i+1] << 16) | (buffer[i+2] << 8 ) | buffer[i+3]))*10; break; default: FrequencyTemp = QString("%1%2%3%4%5%6%7%800") .arg((buffer[i] & 0xF0) >> 4) .arg( buffer[i] & 0x0F) .arg((buffer[i+1] & 0xF0) >> 4) .arg( buffer[i+1] & 0x0F) .arg((buffer[i+2] & 0xF0) >> 4) .arg( buffer[i+2] & 0x0F) .arg((buffer[i+3] & 0xF0) >> 4) .arg( buffer[i+3] & 0x0F); frequency=FrequencyTemp.toInt(); } t.frequencies+=frequency; }}//Descriptor 0x83 UK specific channel listvoid SIParser::ParseDescriptorUKChannelList(uint8_t* buffer,int size, QMap_uint16_t& numbers){ int i = 2; for (; i < size ; i+=4) { uint16_t service_id = (buffer[i]<<8)|(buffer[i+1]&0xff); uint16_t channel_num = (buffer[i+2]&0x03<<8)|(buffer[i+3]&0xff); numbers[service_id] = channel_num; }}// Desctiptor 0x48 - Service - SDTvoid SIParser::ParseDescriptorService(uint8_t* buffer, int size, SDTObject& s){ (void) size; uint8_t tempType = buffer[2]; if (PrivateTypes.TVServiceTypes.contains(tempType)) s.ServiceType = PrivateTypes.TVServiceTypes[tempType]; else s.ServiceType = tempType; buffer += 3; s.ProviderName = DecodeText(buffer + 1, buffer[0]); buffer += buffer[0] + 1; s.ServiceName = DecodeText(buffer + 1, buffer[0]);}// Descriptor 0x5A - DVB-T Transport - NITTransportObject SIParser::ParseDescriptorTerrestrialDeliverySystem(uint8_t* buffer, int size){ (void) size; TransportObject retval; retval.Type = QString("DVB-T"); retval.Frequency = ((buffer[2] << 24) | (buffer[3] << 16) | (buffer[4] << 8 ) | buffer[5]) * 10; // Bandwidth switch ((buffer[6] & 0xE0) >> 5) { case 0: retval.Bandwidth = "8"; break; case 1: retval.Bandwidth = "7"; break; case 2: retval.Bandwidth = "6"; break; default: retval.Bandwidth = "auto"; break; } // Consetellation switch ((buffer[7] & 0xC0) >> 6) { case 0: retval.Constellation = "qpsk"; break; case 1: retval.Constellation = "qam_16"; break; case 2: retval.Constellation = "qam_64"; break; default: retval.Constellation = "auto"; break; } // Heiarchy switch ((buffer[7] & 0x38) >> 3) { case 0: retval.Hiearchy = "n"; break; case 1: retval.Hiearchy = "1"; break; case 2: retval.Hiearchy = "2"; break; case 3: retval.Hiearchy = "4"; break; default: retval.Hiearchy = "a"; break; } // CoderateHP switch (buffer[7] & 0x03) { case 0: retval.CodeRateHP = "1/2"; break; case 1: retval.CodeRateHP = "2/3"; break; case 2: retval.CodeRateHP = "3/4"; break; case 3: retval.CodeRateHP = "5/6"; break; case 4: retval.CodeRateHP = "7/8"; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -