📄 siparser.cpp
字号:
default: retval.CodeRateHP = "auto"; } // CoderateLP switch ((buffer[8] & 0xC0) >> 6) { case 0: retval.CodeRateLP = "1/2"; break; case 1: retval.CodeRateLP = "2/3"; break; case 2: retval.CodeRateLP = "3/4"; break; case 3: retval.CodeRateLP = "5/6"; break; case 4: retval.CodeRateLP = "7/8"; break; default: retval.CodeRateLP = "auto"; } //Guard Interval switch ((buffer[8] & 0x18) >> 3) { case 0: retval.GuardInterval = "1/32"; break; case 1: retval.GuardInterval = "1/16"; break; case 2: retval.GuardInterval = "1/8"; break; case 3: retval.GuardInterval = "1/4"; break; } //TransmissionMode switch ((buffer[8] & 0x06) >> 1) { case 0: retval.TransmissionMode = "2"; break; case 1: retval.TransmissionMode = "8"; break; default: retval.TransmissionMode = "auto"; } return retval;}// Desctiptor 0x43 - Satellite Delivery System - NITTransportObject SIParser::ParseDescriptorSatelliteDeliverySystem(uint8_t* buffer, int size){ (void) size; TransportObject retval; retval.Type = QString("DVB-S"); QString FrequencyTemp = QString("%1%2%3%4%5%6%7%80") .arg((buffer[2] & 0xF0) >> 4) .arg( buffer[2] & 0x0F) .arg((buffer[3] & 0xF0) >> 4) .arg( buffer[3] & 0x0F) .arg((buffer[4] & 0xF0) >> 4) .arg( buffer[4] & 0x0F) .arg((buffer[5] & 0xF0) >> 4) .arg( buffer[5] & 0x0F); // TODO: Use real BCD conversion on Frequency retval.Frequency=FrequencyTemp.toInt(); retval.OrbitalLocation=QString("%1%2.%3").arg(buffer[6],0,16).arg((buffer[7]&0xF0) >> 4).arg(buffer[7] & 0x0F); // This isn't reported correctly by some carriers switch ((buffer[8] & 0x80) >> 7) { case 0: retval.OrbitalLocation += " West"; break; case 1: retval.OrbitalLocation += " East"; break; } switch ((buffer[8] & 0x60) >> 5) { case 0: retval.Polarity = "h"; break; case 1: retval.Polarity = "v"; break; case 2: retval.Polarity = "l"; break; case 3: retval.Polarity = "r"; break; } switch (buffer[8] & 0x1F) { case 0: // Some SAT Providers use this for QPSK for some reason // Bell ExpressVu is an example case 1: retval.Modulation = "qpsk"; break; case 2: retval.Modulation = "qpsk_8"; break; case 3: retval.Modulation = "qam_16"; break; default: retval.Modulation = "auto"; } QString SymbolRateTemp=QString("%1%2%3%4%5%6%700") .arg((buffer[9] & 0xF0) >> 4) .arg( buffer[9] & 0x0F) .arg((buffer[10] & 0xF0) >> 4) .arg( buffer[10] & 0x0F) .arg((buffer[11] & 0xF0) >> 4) .arg( buffer[11] & 0x0F) .arg((buffer[12] & 0xF0) >> 4); retval.SymbolRate = SymbolRateTemp.toInt(); switch (buffer[12] & 0x0F) { case 1: retval.FEC_Inner = "1/2"; break; case 2: retval.FEC_Inner = "2/3"; break; case 3: retval.FEC_Inner = "3/4"; break; case 4: retval.FEC_Inner = "5/6"; break; case 5: retval.FEC_Inner = "7/8"; break; case 6: retval.FEC_Inner = "8/9"; break; case 0x0F: retval.FEC_Inner = "none"; break; default: retval.FEC_Inner = "auto"; } return retval;}// Descriptor 0x44 - Cable Delivery System - NITTransportObject SIParser::ParseDescriptorCableDeliverySystem(uint8_t* buffer, int size){ (void) size; TransportObject retval; retval.Type = QString("DVB-C"); QString FrequencyTemp = QString("%1%2%3%4%5%6%7%800") .arg((buffer[2] & 0xF0) >> 4) .arg( buffer[2] & 0x0F) .arg((buffer[3] & 0xF0) >> 4) .arg( buffer[3] & 0x0F) .arg((buffer[4] & 0xF0) >> 4) .arg( buffer[4] & 0x0F) .arg((buffer[5] & 0xF0) >> 4) .arg( buffer[5] & 0x0F); // TODO: Use real BCD conversion on Frequency retval.Frequency=FrequencyTemp.toInt(); switch (buffer[7] & 0x0F) { case 1: retval.FEC_Outer = "None"; break; case 2: retval.FEC_Outer = "RS(204/188)"; break; default: retval.FEC_Outer = "unknown"; break; } switch (buffer[8]) { case 1: retval.Modulation = "qam_16"; break; case 2: retval.Modulation = "qam_32"; break; case 3: retval.Modulation = "qam_64"; break; case 4: retval.Modulation = "qam_128"; break; case 5: retval.Modulation = "qam_256"; break; default: retval.Modulation = "auto"; break; } QString SymbolRateTemp=QString("%1%2%3%4%5%6%700") .arg((buffer[9] & 0xF0) >> 4) .arg( buffer[9] & 0x0F) .arg((buffer[10] & 0xF0) >> 4) .arg( buffer[10] & 0x0F) .arg((buffer[11] & 0xF0) >> 4) .arg( buffer[11] & 0x0F) .arg((buffer[12] & 0xF0) >> 4); retval.SymbolRate = SymbolRateTemp.toInt(); switch (buffer[12] & 0x0F) { case 1: retval.FEC_Inner = "1/2"; break; case 2: retval.FEC_Inner = "2/3"; break; case 3: retval.FEC_Inner = "3/4"; break; case 4: retval.FEC_Inner = "5/6"; break; case 5: retval.FEC_Inner = "7/8"; break; case 6: retval.FEC_Inner = "8/9"; break; case 0x0F: retval.FEC_Inner = "none"; break; default: retval.FEC_Inner = "auto"; break; } return retval;}/* * DVB Descriptor 0x54 - Process Content Descriptor - EIT */QString SIParser::ProcessContentDescriptor(uint8_t *buf,int size){// TODO: Add all types, possibly just lookup from a big array that is an include file? (void) size; uint8_t content = buf[2]; if (content) return m_mapCategories[content]; else return QString();}/* * DVB Descriptor 0x4D - Short Event Descriptor - EIT */void SIParser::ProcessShortEventDescriptor(uint8_t *buf,int size,Event& e){// TODO: Test lower loop (void) size; int event_name_len = buf[5] & 0xFF; int text_char_len = buf[event_name_len + 6];; e.Event_Name = DecodeText(buf + 6, event_name_len); e.Event_Subtitle = DecodeText(buf + event_name_len + 7, text_char_len); if(e.Event_Subtitle == e.Event_Name) e.Event_Subtitle= "";}/* * DVB Descriptor 0x4E - Extended Event - EIT */void SIParser::ProcessExtendedEventDescriptor(uint8_t *buf,int size,Event &e){ (void) size;// TODO: Nothing, Complete if (buf[6] != 0) return; int text_length = buf[7] & 0xFF; e.Description = DecodeText(buf + 8, text_length);}QString SIParser::ParseDescriptorLanguage(uint8_t* buffer, int size){ (void) size; return QString::fromLatin1((const char*) buffer + 2, 3);}void SIParser::ProcessComponentDescriptor(uint8_t *buf,int size,Event& e){ SIPARSER(QString("Component Descriptor")); (void)size; switch (buf[2] & 0x0f) { case 0x1: //Video if ((buf[3]>=0x9) && (buf[3]<=0x10)) e.HDTV = true; break; case 0x2: //Audio if ((buf[3]=0x3) || (buf[3]=0x5)) e.Stereo = true; break; case 0x3: //Teletext/Subtitles switch (buf[3]) { case 0x1: case 0x3: case 0x10 ... 0x13: case 0x20 ... 0x23: e.SubTitled = true; } break; }}void SIParser::ParseDescriptorTeletext(uint8_t* buffer, int size){ SIPARSER(QString("Teletext Descriptor")); buffer += 2; while (size >= 5) { QString language = QString::fromLatin1((const char*) buffer, 3); uint8_t teletext_type = buffer[3] >> 3; uint8_t teletext_magazine_number = buffer[3] & 0x07; uint8_t teletext_page_number = buffer[4]; SIPARSER(QString(" lang: %1, type: %2, mag: %3, page: %4") .arg(language) .arg(teletext_type) .arg(teletext_magazine_number) .arg(teletext_page_number) ); buffer += 5; size -= 5; }}void SIParser::ParseDescriptorSubtitling(uint8_t* buffer, int size){ SIPARSER(QString("Subtitling Descriptor")); buffer += 2; while (size >= 8) { QString language = QString::fromLatin1((const char*) buffer, 3); uint8_t subtitling_type = buffer[3]; uint16_t composition_page_id = (buffer[4] << 8) | buffer[5]; uint16_t ancillary_page_id = (buffer[6] << 8) | buffer[7]; SIPARSER(QString(" lang: %1, type: %2, comp: %3, anc: %4") .arg(language) .arg(subtitling_type) .arg(composition_page_id) .arg(ancillary_page_id) ); buffer += 8; size -= 8; }}// --- BEGIN: changes by PJ ---/* * DVB Descriptor 0x13 - Carousel Identifier Descriptor */void SIParser::ParseDescriptorCarouselIdentifier(uint8_t* buffer, int size, uint16_t pid) { (void) size; //uint8_t descriptor_tag = buffer[0]; //uint8_t descriptor_length = buffer[1]; uint32_t carousel_id = (buffer[2] << 24) | (buffer[3] << 16) | (buffer[4] << 8) | buffer[5]; // Let's start receiving sections from this PID SIPARSER("Carousel identifier descriptor found; the DSMCC handler will request this PID"); Table[DSMCC]->Request(pid);}/* * DVB Descriptor 0x52 - Stream Identifier Descriptor */void SIParser::ParseDescriptorStreamIdentifier(uint8_t* buffer, int size, uint16_t pid) { (void) size; //uint8_t descriptor_tag = buffer[0]; //uint8_t descriptor_length = buffer[1]; component_tags[pid] = buffer[2]; stream_pids[buffer[2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -