Ticket #2664: r12480_backported.diff
File r12480_backported.diff, 11.9 KB (added by , 17 years ago) |
---|
-
mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp
diff --git a/mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp b/mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp index 1072d49..d4d2b65 100644
a b void init_sections(sections_t §, uint last_section) 15 15 uint endz = last_section >> 3; 16 16 if (endz) 17 17 sect.resize(endz, 0x00); 18 sect.resize(3 3 - endz, 0xff);18 sect.resize(32, 0xff); 19 19 sect[endz] = init_bits[last_section & 0x7]; 20 20 21 21 #if 0 … … void MPEGStreamData::HandleTSTables(const TSPacket* tspacket) 668 668 DONE_WITH_PES_PACKET(); 669 669 } 670 670 671 if (!psip->VerifyPSIP(!_have_CRC_bug)) 672 { 673 VERBOSE(VB_RECORD, "PSIP table is invalid"); 674 DONE_WITH_PES_PACKET(); 675 } 676 671 677 // Don't decode redundant packets, 672 678 // but if it is a desired PAT or PMT emit a "heartbeat" signal. 673 679 if (IsRedundant(tspacket->PID(), *psip)) … … void MPEGStreamData::HandleTSTables(const TSPacket* tspacket) 691 697 } 692 698 693 699 HandleTables(tspacket->PID(), *psip); 700 694 701 DONE_WITH_PES_PACKET(); 695 702 } 696 703 #undef DONE_WITH_PES_PACKET -
mythtv/libs/libmythtv/mpeg/mpegtables.cpp
diff --git a/mythtv/libs/libmythtv/mpeg/mpegtables.cpp b/mythtv/libs/libmythtv/mpeg/mpegtables.cpp index 1efe738..c4722a5 100644
a b uint StreamID::Normalize(uint stream_id, const desc_list_t &desc) 65 65 return stream_id; 66 66 } 67 67 68 bool PSIPTable::HasCRC(void) const 69 { 70 bool has_crc = false; 71 72 switch (TableID()) 73 { 74 // MPEG 75 case TableID::PAT: 76 case TableID::CAT: 77 case TableID::PMT: 78 has_crc = true; 79 break; 80 // case TableID::TSDT 81 82 // DVB manditory 83 case TableID::NIT: 84 case TableID::SDT: 85 case TableID::PF_EIT: 86 has_crc = true; 87 break; 88 case TableID::TDT: 89 has_crc = false; 90 break; 91 92 // DVB optional 93 case TableID::NITo: 94 case TableID::SDTo: 95 case TableID::BAT: 96 case TableID::PF_EITo: 97 has_crc = true; 98 break; 99 case TableID::RST: 100 case TableID::ST: 101 has_crc = false; 102 break; 103 case TableID::TOT: 104 has_crc = true; 105 break; 106 // case TableID::RNT: 107 // case TableID::CT: 108 // case TableID::RCT: 109 // case TableID::CIT: 110 // case TableID::MPEFEC: 111 case TableID::DIT: 112 has_crc = false; 113 break; 114 case TableID::SIT: 115 has_crc = true; 116 break; 117 118 // ATSC 119 case TableID::MGT: 120 case TableID::TVCT: 121 case TableID::CVCT: 122 case TableID::RRT: 123 case TableID::EIT: 124 case TableID::ETT: 125 case TableID::STT: 126 case TableID::DET: 127 case TableID::DST: 128 129 //case TableID::PIT: 130 case TableID::NRT: 131 case TableID::LTST: 132 case TableID::DCCT: 133 case TableID::DCCSCT: 134 //case TableID::SITatsc: 135 case TableID::AEIT: 136 case TableID::AETT: 137 case TableID::SVCT: 138 has_crc = true; 139 break; 140 141 default: 142 { 143 // DVB Longterm EIT data 144 if (TableID::SC_EITbeg <= TableID() && 145 TableID() <= TableID::SC_EITendo) 146 { 147 has_crc = true; 148 } 149 150 // Dishnet Longterm EIT data 151 if (TableID::DN_EITbego <= TableID() && 152 TableID() <= TableID::DN_EITendo) 153 { 154 has_crc = true; 155 } 156 } 157 break; 158 } 159 160 return has_crc; 161 } 162 163 bool PSIPTable::VerifyPSIP(bool verify_crc) const 164 { 165 if (verify_crc && (CalcCRC() != CRC())) 166 { 167 VERBOSE(VB_SIPARSER, 168 QString("PSIPTable: Failed CRC check 0x%1 != 0x%2 " 169 "for StreamID = 0x%3") 170 .arg(CRC(),0,16).arg(CalcCRC(),0,16).arg(StreamID(),0,16)); 171 return false; 172 } 173 174 unsigned char *bufend = _fullbuffer + _allocSize; 175 176 if ((_pesdata + 2) >= bufend) 177 return false; // can't query length 178 179 if (psipdata() >= bufend) 180 return false; // data outside buffer 181 182 if (TableID::PAT == TableID()) 183 { 184 uint pcnt = (SectionLength() - PSIP_OFFSET - 2) >> 2; 185 return (psipdata() + (pcnt << 2) + 3 < bufend); 186 } 187 188 if (TableID::PMT == TableID()) 189 { 190 if (psipdata() + 3 >= bufend) 191 { 192 VERBOSE(VB_SIPARSER, "can't query program info length"); 193 return false; // can't query program info length 194 } 195 196 if (psipdata() + Length() - 9 > bufend) 197 { 198 VERBOSE(VB_SIPARSER, "reported length to large"); 199 return false; // reported length to large 200 } 201 202 uint proginfolen = ((psipdata()[2]<<8) | psipdata()[3]) & 0x0fff; 203 const unsigned char *proginfo = psipdata() + 4; 204 const unsigned char *cpos = proginfo + proginfolen; 205 if (cpos > bufend) 206 { 207 VERBOSE(VB_SIPARSER, "program info extends past end of buffer"); 208 return false; 209 } 210 211 vector<unsigned char*> _ptrs; 212 const unsigned char *pos = cpos; 213 uint i = 0; 214 for (; pos < psipdata() + Length() - 9; i++) 215 { 216 const unsigned char *ptr = pos; 217 if (pos + 4 > bufend) 218 { 219 VERBOSE(VB_SIPARSER, QString("stream info %1 extends past " 220 "end of buffer").arg(i)); 221 return false; 222 } 223 pos += 5 + ((ptr[3] << 8) | ptr[4]) & 0x0fff; 224 } 225 if (pos > bufend) 226 { 227 VERBOSE(VB_SIPARSER, QString("last stream info %1 extends past " 228 "end of buffer").arg(i)); 229 return false; 230 } 231 232 return true; 233 } 234 235 return true; 236 } 237 68 238 ProgramAssociationTable* ProgramAssociationTable::CreateBlank(bool small) 69 239 { 70 240 (void) small; // currently always a small packet.. -
mythtv/libs/libmythtv/mpeg/mpegtables.h
diff --git a/mythtv/libs/libmythtv/mpeg/mpegtables.h b/mythtv/libs/libmythtv/mpeg/mpegtables.h index 0db147d..1065895 100644
a b class TableID 228 228 DIT = 0x7e, // always on pid 0x1e 229 229 SIT = 0x7f, // always on pid 0x1f 230 230 231 // DVB Conditional Access 232 DVBCAbeg = 0x80, 233 DVBCAend = 0x8f, 234 231 235 // Dishnet Longterm EIT data 232 236 DN_EITbego = 0x80, // always on pid 0x300 233 237 DN_EITendo = 0xfe, // always on pid 0x300 234 238 235 // ATSC 239 // ARIB 240 ARIBbeg = 0x80, 241 ARIBend = 0x8f, 242 243 // SCTE 244 PIM = 0xC0, // Program Information Message (57 2003) PMT PID 245 PNM = 0xC1, // Program Name Message (57 2003) PMT PID 246 NIM = 0xC2, // Network Information Message (57 2003) 247 // on Network PID (per PAT) 248 NITscte = 0xC2, // Network Information Table (NIT) (65 2002) on 0x1FFC 249 NTM = 0xC3, // Network Text Message (57 2003) on 0x1FFC 250 // (terrestrial only, Map Name Table only) or 251 // Network PID (per PAT) 252 NTT = 0xC3, // Network Text Table (NTT) (65 2002) on 0x1FFC 253 VCM = 0xC4, // Virtual Channel Message (57 2003) on 0x1FFC 254 // (terrestrial only) or Network PID (per PAT) 255 SVCTscte = 0xC4, // Short Virtual Channel Table (65 2002) on 0x1FFC 256 STM = 0xC5, // System Time Message (57 2003) 257 // on Network PID (per PAT) 258 STTscte = 0xC5, // System Time Table (STT) (65 2002) on 0x1FFC 259 SM = 0xC6, // subtitle_message (27 2003) 260 MGTscte = 0xC7, // Master Guide Table (57 2003) on 0x1ffc 261 LVCT = 0xC9, // Long-form Virtual Channel Table (57 2003) on 0x1ffc 262 RRTscte = 0xCA, // Region Rating Table (57 2003) on 0x1ffc 263 264 CEA = 0xD8, // Cable Emergency Alert (18 2002) 265 ADET = 0xD9, // Aggregate Data Event Table (80 2002) 266 267 // ATSC Conditional Access (A/70) 268 ECM0 = 0x80, 269 ECM1 = 0x81, 270 ECMbeg = 0x82, // ECM begin private data 271 ECMend = 0x8f, // ECM end private data 272 273 // ATSC main 274 MGT = 0xC7, // Master Guide Table A/65 on 0x1ffb 275 TVCT = 0xC8, // Terrestrial Virtual Channel Table A/65 on 0x1ffb 276 CVCT = 0xC9, // Cable Virtual Channel Table A/65 on 0x1ffb 277 RRT = 0xCA, // Region Rating Table A/65 on 0x1ffb 278 EIT = 0xCB, // Event Information Table A/65 (per MGT) 279 ETT = 0xCC, // Extended Text Table A/65 (per MGT) 280 STT = 0xCD, // System Time Table A/65 281 DET = 0xCE, // Data Event Table A/90 (per MGT) 282 DST = 0xCF, // Data Service Table A/90 283 284 PIT = 0xD0, // Program ID Table ??? 285 NRT = 0xD1, // Network Resources Table A/90 286 LTST = 0xD2, // Long Term Service Table A/90 287 DCCT = 0xD3, // Directed Channel Change Table A/57 on 0x1ffb 288 DCCSCT = 0xD4, // DCC Selection Code Table A/57 on 0x1ffb 289 SITatsc = 0xD5, // Selection Information Table (EIA-775.2 2000) 290 AEIT = 0xD6, // Aggregate Event Information Table A/81 291 AETT = 0xD7, // Aggregate Extended Text Table A/81 292 SVCT = 0xDA, // Satellite VCT A/81 293 294 SRM = 0xE0, // System Renewability Message (ATSC TSG-717r0) 295 296 // Unknown 236 297 STUFFING = 0x80, 237 298 CAPTION = 0x86, 238 299 CENSOR = 0x87, … … class TableID 241 302 SRVLOC = 0xA1, 242 303 TSS = 0xA2, 243 304 CMPNAME = 0xA3, 244 245 MGT = 0xC7, // always on pid 0x1ffb246 TVCT = 0xC8,247 CVCT = 0xC9,248 RRT = 0xCA,249 EIT = 0xCB,250 ETT = 0xCC,251 STT = 0xCD,252 253 DCCT = 0xD3,254 DCCSCT = 0xD4,255 305 }; 256 306 }; 257 307 … … class PSIPTable : public PESPacket 358 408 // only for real ATSC PSIP tables, not similar MPEG2 tables 359 409 void SetProtocolVersion(int ver) { pesdata()[8] = ver; } 360 410 411 bool HasCRC(void) const; 412 413 bool VerifyPSIP(bool verify_crc) const; 414 361 415 const QString toString(void) const; 362 416 363 417 static const uint PSIP_OFFSET = 8; // general PSIP header offset … … class ConditionalAccessTable : public PSIPTable 625 679 // for (i = 0; i < N; i++) 8.0 64 626 680 // { descriptor() } 627 681 uint DescriptorsLength(void) const 628 { return SectionLength() - PSIP_OFFSET - (HasCRC() ? 4 : 0); }682 { return SectionLength() - PSIP_OFFSET; } 629 683 const unsigned char *Descriptors(void) const { return psipdata(); } 630 684 631 685 // CRC_32 32 rpchof -
mythtv/libs/libmythtv/mpeg/pespacket.h
diff --git a/mythtv/libs/libmythtv/mpeg/pespacket.h b/mythtv/libs/libmythtv/mpeg/pespacket.h index f5a0c71..1198b1b 100644
a b class PESPacket 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 … … class PESPacket 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)