Ticket #2664: 2664-v3.patch
| File 2664-v3.patch, 10.5 KB (added by danielk, 5 years ago) |
|---|
-
libs/libmythtv/mpeg/mpegstreamdata.cpp
747 747 DONE_WITH_PES_PACKET(); // already parsed this table, toss it. 748 748 } 749 749 750 HandleTables(tspacket->PID(), *psip); 750 if (psip->VerifyPSIP(!_have_CRC_bug)) 751 HandleTables(tspacket->PID(), *psip); 752 751 753 DONE_WITH_PES_PACKET(); 752 754 } 753 755 #undef DONE_WITH_PES_PACKET … … 1406 1408 1407 1409 info.status = status; 1408 1410 1409 VERBOSE(VB_ IMPORTANT, QString("PID 0x%1 status: %2")1410 .arg(pid,0,16).arg( status));1411 VERBOSE(VB_RECORD, QString("PID 0x%1 status: %2") 1412 .arg(pid,0,16).arg(toString(status))); 1411 1413 1412 1414 uint_vec_t pnum_del_list; 1413 1415 const uint_vec_t &pnums = _encryption_pid_to_pnums[pid]; -
libs/libmythtv/mpeg/mpegtables.h
229 229 DIT = 0x7e, // always on pid 0x1e 230 230 SIT = 0x7f, // always on pid 0x1f 231 231 232 // DVB Conditional Access 233 DVBCAbeg = 0x80, 234 DVBCAend = 0x8f, 235 232 236 // Dishnet Longterm EIT data 233 237 DN_EITbego = 0x80, // always on pid 0x300 234 238 DN_EITendo = 0xfe, // always on pid 0x300 235 239 236 // ATSC 240 // ARIB 241 ARIBbeg = 0x80, 242 ARIBend = 0x8f, 243 244 // SCTE 245 PIM = 0xC0, // Program Information Message (57 2003) PMT PID 246 PNM = 0xC1, // Program Name Message (57 2003) PMT PID 247 NIM = 0xC2, // Network Information Message (57 2003) 248 // on Network PID (per PAT) 249 NITscte = 0xC2, // Network Information Table (NIT) (65 2002) on 0x1FFC 250 NTM = 0xC3, // Network Text Message (57 2003) on 0x1FFC 251 // (terrestrial only, Map Name Table only) or 252 // Network PID (per PAT) 253 NTT = 0xC3, // Network Text Table (NTT) (65 2002) on 0x1FFC 254 VCM = 0xC4, // Virtual Channel Message (57 2003) on 0x1FFC 255 // (terrestrial only) or Network PID (per PAT) 256 SVCTscte = 0xC4, // Short Virtual Channel Table (65 2002) on 0x1FFC 257 STM = 0xC5, // System Time Message (57 2003) 258 // on Network PID (per PAT) 259 STTscte = 0xC5, // System Time Table (STT) (65 2002) on 0x1FFC 260 SM = 0xC6, // subtitle_message (27 2003) 261 MGTscte = 0xC7, // Master Guide Table (57 2003) on 0x1ffc 262 LVCT = 0xC9, // Long-form Virtual Channel Table (57 2003) on 0x1ffc 263 RRTscte = 0xCA, // Region Rating Table (57 2003) on 0x1ffc 264 265 CEA = 0xD8, // Cable Emergency Alert (18 2002) 266 ADET = 0xD9, // Aggregate Data Event Table (80 2002) 267 268 // ATSC Conditional Access (A/70) 269 ECM0 = 0x80, 270 ECM1 = 0x81, 271 ECMbeg = 0x82, // ECM begin private data 272 ECMend = 0x8f, // ECM end private data 273 274 // ATSC main 275 MGT = 0xC7, // Master Guide Table A/65 on 0x1ffb 276 TVCT = 0xC8, // Terrestrial Virtual Channel Table A/65 on 0x1ffb 277 CVCT = 0xC9, // Cable Virtual Channel Table A/65 on 0x1ffb 278 RRT = 0xCA, // Region Rating Table A/65 on 0x1ffb 279 EIT = 0xCB, // Event Information Table A/65 (per MGT) 280 ETT = 0xCC, // Extended Text Table A/65 (per MGT) 281 STT = 0xCD, // System Time Table A/65 282 DET = 0xCE, // Data Event Table A/90 (per MGT) 283 DST = 0xCF, // Data Service Table A/90 284 285 PIT = 0xD0, // Program ID Table ??? 286 NRT = 0xD1, // Network Resources Table A/90 287 LTST = 0xD2, // Long Term Service Table A/90 288 DCCT = 0xD3, // Directed Channel Change Table A/57 on 0x1ffb 289 DCCSCT = 0xD4, // DCC Selection Code Table A/57 on 0x1ffb 290 SITatsc = 0xD5, // Selection Information Table (EIA-775.2 2000) 291 AEIT = 0xD6, // Aggregate Event Information Table A/81 292 AETT = 0xD7, // Aggregate Extended Text Table A/81 293 SVCT = 0xDA, // Satellite VCT A/81 294 295 SRM = 0xE0, // System Renewability Message (ATSC TSG-717r0) 296 297 // Unknown 237 298 STUFFING = 0x80, 238 299 CAPTION = 0x86, 239 300 CENSOR = 0x87, … … 242 303 SRVLOC = 0xA1, 243 304 TSS = 0xA2, 244 305 CMPNAME = 0xA3, 245 246 MGT = 0xC7, // always on pid 0x1ffb247 TVCT = 0xC8,248 CVCT = 0xC9,249 RRT = 0xCA,250 EIT = 0xCB,251 ETT = 0xCC,252 STT = 0xCD,253 254 DCCT = 0xD3,255 DCCSCT = 0xD4,256 306 }; 257 307 }; 258 308 … … 359 409 // only for real ATSC PSIP tables, not similar MPEG2 tables 360 410 void SetProtocolVersion(int ver) { pesdata()[8] = ver; } 361 411 412 bool HasCRC(void) const; 413 414 const bool VerifyPSIP(bool verify_crc) const; 415 362 416 const QString toString(void) const; 363 417 364 418 static const uint PSIP_OFFSET = 8; // general PSIP header offset … … 627 681 // for (i = 0; i < N; i++) 8.0 64 628 682 // { descriptor() } 629 683 uint DescriptorsLength(void) const 630 { return SectionLength() - PSIP_OFFSET - (HasCRC() ? 4 : 0); }684 { return SectionLength() - PSIP_OFFSET; } 631 685 const unsigned char *Descriptors(void) const { return psipdata(); } 632 686 633 687 // CRC_32 32 rpchof -
libs/libmythtv/mpeg/mpegtables.cpp
66 66 return stream_id; 67 67 } 68 68 69 bool PSIPTable::HasCRC(void) const 70 { 71 bool has_crc = false; 72 73 switch (TableID()) 74 { 75 // MPEG 76 case TableID::PAT: 77 case TableID::CAT: 78 case TableID::PMT: 79 has_crc = true; 80 break; 81 // case TableID::TSDT 82 83 // DVB manditory 84 case TableID::NIT: 85 case TableID::SDT: 86 case TableID::PF_EIT: 87 has_crc = true; 88 break; 89 case TableID::TDT: 90 has_crc = false; 91 break; 92 93 // DVB optional 94 case TableID::NITo: 95 case TableID::SDTo: 96 case TableID::BAT: 97 case TableID::PF_EITo: 98 has_crc = true; 99 break; 100 case TableID::RST: 101 case TableID::ST: 102 has_crc = false; 103 break; 104 case TableID::TOT: 105 has_crc = true; 106 break; 107 // case TableID::RNT: 108 // case TableID::CT: 109 // case TableID::RCT: 110 // case TableID::CIT: 111 // case TableID::MPEFEC: 112 case TableID::DIT: 113 has_crc = false; 114 break; 115 case TableID::SIT: 116 has_crc = true; 117 break; 118 119 // ATSC 120 case TableID::MGT: 121 case TableID::TVCT: 122 case TableID::CVCT: 123 case TableID::RRT: 124 case TableID::EIT: 125 case TableID::ETT: 126 case TableID::STT: 127 case TableID::DET: 128 case TableID::DST: 129 130 //case TableID::PIT: 131 case TableID::NRT: 132 case TableID::LTST: 133 case TableID::DCCT: 134 case TableID::DCCSCT: 135 //case TableID::SITatsc: 136 case TableID::AEIT: 137 case TableID::AETT: 138 case TableID::SVCT: 139 has_crc = true; 140 break; 141 142 default: 143 { 144 // DVB Longterm EIT data 145 if (TableID::SC_EITbeg <= TableID() && 146 TableID() <= TableID::SC_EITendo) 147 { 148 has_crc = true; 149 } 150 151 // Dishnet Longterm EIT data 152 if (TableID::DN_EITbego <= TableID() && 153 TableID() <= TableID::DN_EITendo) 154 { 155 has_crc = true; 156 } 157 } 158 break; 159 } 160 161 return has_crc; 162 } 163 164 const bool PSIPTable::VerifyPSIP(bool verify_crc) const 165 { 166 if (verify_crc && (CalcCRC() != CRC())) 167 { 168 VERBOSE(VB_SIPARSER, 169 QString("PSIPTable: Failed CRC check 0x%1 != 0x%2 " 170 "for StreamID = 0x%3") 171 .arg(CRC(),0,16).arg(CalcCRC(),0,16).arg(StreamID(),0,16)); 172 return false; 173 } 174 175 unsigned char *bufend = _fullbuffer + _allocSize; 176 177 if ((_pesdata + 2) >= bufend) 178 return false; // can't query length 179 180 if (psipdata() >= bufend) 181 return false; // data outside buffer 182 183 if (TableID::PAT == TableID()) 184 { 185 uint pcnt = (SectionLength() - PSIP_OFFSET - 2) >> 2; 186 return (psipdata() + (pcnt << 2) + 3 < bufend); 187 } 188 189 if (TableID::PMT == TableID()) 190 { 191 if (psipdata() + 3 >= bufend) 192 return false; // can't query program info length 193 194 ProgramMapTable pmt(*this); 195 if ((pmt.ProgramInfo() > bufend) || 196 (pmt.ProgramInfo() + pmt.ProgramInfoLength() > bufend)) 197 { 198 return false; 199 } 200 201 for (uint i = 0; i < pmt.StreamCount(); i++) 202 { 203 if ((pmt.StreamInfo(i) > bufend) || 204 (pmt.StreamInfo(i) + pmt.StreamInfoLength(i) > bufend)) 205 { 206 return false; 207 } 208 } 209 } 210 return true; 211 } 212 69 213 ProgramAssociationTable* ProgramAssociationTable::CreateBlank(bool small) 70 214 { 71 215 (void) small; // currently always a small packet.. -
libs/libmythtv/mpeg/pespacket.h
182 182 /// 1 bit Additional Copy Info field is present 183 183 bool HasACI() const { return (_pesdata[4] & 0x4) >> 2; } 184 184 /// 1 bit Cyclic Redundancy Check present 185 bool HasCRC()const { return (_pesdata[4] & 0x2) >> 1; }185 virtual bool HasCRC() const { return (_pesdata[4] & 0x2) >> 1; } 186 186 /// 1 bit Extension flags are present 187 187 bool HasExtensionFlags() const { return _pesdata[4] & 0x1; } 188 188 … … 249 249 250 250 unsigned char *_pesdata; ///< Pointer to PES data in full buffer 251 251 unsigned char *_fullbuffer; ///< Pointer to allocated data 252 private: 252 253 253 uint _psiOffset; ///< AFCOffset + StartOfFieldPointer 254 254 uint _ccLast; ///< Continuity counter of last inserted TS Packet 255 255 uint _pesdataSize; ///< Number of data bytes (TS header + PES data)
