Index: libs/libmythtv/mpeg/mpegstreamdata.cpp
===================================================================
--- libs/libmythtv/mpeg/mpegstreamdata.cpp	(revision 12473)
+++ libs/libmythtv/mpeg/mpegstreamdata.cpp	(working copy)
@@ -747,7 +747,9 @@
         DONE_WITH_PES_PACKET(); // already parsed this table, toss it.
     }
 
-    HandleTables(tspacket->PID(), *psip);
+    if (psip->VerifyPSIP(!_have_CRC_bug))
+        HandleTables(tspacket->PID(), *psip);
+
     DONE_WITH_PES_PACKET();
 }
 #undef DONE_WITH_PES_PACKET
@@ -1406,8 +1408,8 @@
 
     info.status = status;
 
-    VERBOSE(VB_IMPORTANT, QString("PID 0x%1 status: %2")
-            .arg(pid,0,16).arg(status));
+    VERBOSE(VB_RECORD, QString("PID 0x%1 status: %2")
+            .arg(pid,0,16).arg(toString(status)));
 
     uint_vec_t pnum_del_list;
     const uint_vec_t &pnums = _encryption_pid_to_pnums[pid];
Index: libs/libmythtv/mpeg/mpegtables.h
===================================================================
--- libs/libmythtv/mpeg/mpegtables.h	(revision 12473)
+++ libs/libmythtv/mpeg/mpegtables.h	(working copy)
@@ -229,11 +229,72 @@
         DIT      = 0x7e, // always on pid 0x1e
         SIT      = 0x7f, // always on pid 0x1f
 
+        // DVB Conditional Access
+        DVBCAbeg = 0x80,
+        DVBCAend = 0x8f,
+
         // Dishnet Longterm EIT data
         DN_EITbego = 0x80, // always on pid 0x300
         DN_EITendo = 0xfe, // always on pid 0x300
 
-        // ATSC
+        // ARIB
+        ARIBbeg  = 0x80,
+        ARIBend  = 0x8f,
+
+        // SCTE
+        PIM      = 0xC0, // Program Information Message (57 2003) PMT PID
+        PNM      = 0xC1, // Program Name Message (57 2003) PMT PID
+        NIM      = 0xC2, // Network Information Message (57 2003)
+                         // on Network PID (per PAT)
+        NITscte  = 0xC2, // Network Information Table (NIT) (65 2002) on 0x1FFC
+        NTM      = 0xC3, // Network Text Message (57 2003) on 0x1FFC
+                         // (terrestrial only, Map Name Table only) or
+                         // Network PID (per PAT)
+        NTT      = 0xC3, // Network Text Table (NTT) (65 2002) on 0x1FFC
+        VCM      = 0xC4, // Virtual Channel Message (57 2003) on 0x1FFC
+                         // (terrestrial only) or Network PID (per PAT)
+        SVCTscte = 0xC4, // Short Virtual Channel Table (65 2002) on 0x1FFC
+        STM      = 0xC5, // System Time Message (57 2003)
+                         // on Network PID (per PAT)
+        STTscte  = 0xC5, // System Time Table (STT) (65 2002) on 0x1FFC
+        SM       = 0xC6, // subtitle_message (27 2003)
+        MGTscte  = 0xC7, // Master Guide Table (57 2003) on 0x1ffc
+        LVCT     = 0xC9, // Long-form Virtual Channel Table (57 2003) on 0x1ffc
+        RRTscte  = 0xCA, // Region Rating Table (57 2003) on 0x1ffc
+
+        CEA      = 0xD8, // Cable Emergency Alert (18 2002)
+        ADET     = 0xD9, // Aggregate Data Event Table (80 2002)
+
+        // ATSC Conditional Access (A/70)
+        ECM0     = 0x80,
+        ECM1     = 0x81,
+        ECMbeg   = 0x82, // ECM begin private data
+        ECMend   = 0x8f, // ECM end private data
+
+        // ATSC main
+        MGT      = 0xC7, // Master Guide Table A/65 on 0x1ffb
+        TVCT     = 0xC8, // Terrestrial Virtual Channel Table A/65 on 0x1ffb
+        CVCT     = 0xC9, // Cable Virtual Channel Table A/65 on 0x1ffb
+        RRT      = 0xCA, // Region Rating Table A/65 on 0x1ffb
+        EIT      = 0xCB, // Event Information Table A/65 (per MGT)
+        ETT      = 0xCC, // Extended Text Table A/65 (per MGT)
+        STT      = 0xCD, // System Time Table A/65
+        DET      = 0xCE, // Data Event Table A/90 (per MGT)
+        DST      = 0xCF, // Data Service Table A/90
+
+        PIT      = 0xD0, // Program ID Table ???
+        NRT      = 0xD1, // Network Resources Table A/90
+        LTST     = 0xD2, // Long Term Service Table A/90
+        DCCT     = 0xD3, // Directed Channel Change Table A/57 on 0x1ffb
+        DCCSCT   = 0xD4, // DCC Selection Code Table A/57 on 0x1ffb
+        SITatsc  = 0xD5, // Selection Information Table (EIA-775.2 2000)
+        AEIT     = 0xD6, // Aggregate Event Information Table A/81
+        AETT     = 0xD7, // Aggregate Extended Text Table A/81
+        SVCT     = 0xDA, // Satellite VCT A/81
+
+        SRM      = 0xE0, // System Renewability Message (ATSC TSG-717r0)
+
+        // Unknown
         STUFFING = 0x80,
         CAPTION  = 0x86,
         CENSOR   = 0x87,
@@ -242,17 +303,6 @@
         SRVLOC   = 0xA1,
         TSS      = 0xA2,
         CMPNAME  = 0xA3,
-
-        MGT      = 0xC7, // always on pid 0x1ffb
-        TVCT     = 0xC8,
-        CVCT     = 0xC9,
-        RRT      = 0xCA,
-        EIT      = 0xCB,
-        ETT      = 0xCC,
-        STT      = 0xCD,
-
-        DCCT     = 0xD3,
-        DCCSCT   = 0xD4,
     };
 };
 
@@ -359,6 +409,10 @@
     // only for real ATSC PSIP tables, not similar MPEG2 tables
     void SetProtocolVersion(int ver) { pesdata()[8] = ver; }
 
+    bool HasCRC(void) const;
+
+    const bool VerifyPSIP(bool verify_crc) const;
+
     const QString toString(void) const;
 
     static const uint PSIP_OFFSET = 8; // general PSIP header offset
@@ -627,7 +681,7 @@
     // for (i = 0; i < N; i++)      8.0      64
     //   { descriptor() }
     uint DescriptorsLength(void) const
-        { return SectionLength() - PSIP_OFFSET - (HasCRC() ? 4 : 0); }
+        { return SectionLength() - PSIP_OFFSET; }
     const unsigned char *Descriptors(void) const { return psipdata(); }
 
     // CRC_32 32 rpchof
Index: libs/libmythtv/mpeg/mpegtables.cpp
===================================================================
--- libs/libmythtv/mpeg/mpegtables.cpp	(revision 12473)
+++ libs/libmythtv/mpeg/mpegtables.cpp	(working copy)
@@ -66,6 +66,150 @@
     return stream_id;
 }
 
+bool PSIPTable::HasCRC(void) const
+{
+    bool has_crc = false;
+
+    switch (TableID())
+    {
+        // MPEG
+        case TableID::PAT:
+        case TableID::CAT:
+        case TableID::PMT:
+            has_crc = true;
+            break;
+//      case TableID::TSDT
+
+        // DVB manditory
+        case TableID::NIT:
+        case TableID::SDT:
+        case TableID::PF_EIT:
+            has_crc = true;
+            break;
+        case TableID::TDT:
+            has_crc = false;
+            break;
+
+        // DVB optional
+        case TableID::NITo:
+        case TableID::SDTo:
+        case TableID::BAT:
+        case TableID::PF_EITo:
+            has_crc = true;
+            break;
+        case TableID::RST:
+        case TableID::ST:
+            has_crc = false;
+            break;
+        case TableID::TOT:
+            has_crc = true;
+            break;
+//      case TableID::RNT:
+//      case TableID::CT:
+//      case TableID::RCT:
+//      case TableID::CIT:
+//      case TableID::MPEFEC:
+        case TableID::DIT:
+            has_crc = false;
+            break;
+        case TableID::SIT:
+            has_crc = true;
+            break;
+
+        // ATSC
+        case TableID::MGT:
+        case TableID::TVCT:
+        case TableID::CVCT:
+        case TableID::RRT:
+        case TableID::EIT:
+        case TableID::ETT:
+        case TableID::STT:
+        case TableID::DET:
+        case TableID::DST:
+
+        //case TableID::PIT:
+        case TableID::NRT:
+        case TableID::LTST:
+        case TableID::DCCT:
+        case TableID::DCCSCT:
+        //case TableID::SITatsc:
+        case TableID::AEIT:
+        case TableID::AETT:
+        case TableID::SVCT:
+            has_crc = true;
+            break;
+
+        default:
+        {
+            // DVB Longterm EIT data
+            if (TableID::SC_EITbeg <= TableID() &&
+                TableID() <= TableID::SC_EITendo)
+            {
+                has_crc = true;
+            }
+
+            // Dishnet Longterm EIT data
+            if (TableID::DN_EITbego <= TableID() &&
+                TableID() <= TableID::DN_EITendo)
+            {
+                has_crc = true;
+            }
+        }
+        break;
+    }
+
+    return has_crc;
+}
+
+const bool PSIPTable::VerifyPSIP(bool verify_crc) const
+{
+    if (verify_crc && (CalcCRC() != CRC()))
+    {
+        VERBOSE(VB_SIPARSER,
+                QString("PSIPTable: Failed CRC check 0x%1 != 0x%2 "
+                        "for StreamID = 0x%3")
+                .arg(CRC(),0,16).arg(CalcCRC(),0,16).arg(StreamID(),0,16));
+        return false;
+    }
+
+    unsigned char *bufend = _fullbuffer + _allocSize;
+
+    if ((_pesdata + 2) >= bufend)
+        return false; // can't query length
+
+    if (psipdata() >= bufend)
+        return false; // data outside buffer
+
+    if (TableID::PAT == TableID())
+    {
+        uint pcnt = (SectionLength() - PSIP_OFFSET - 2) >> 2;
+        return (psipdata() + (pcnt << 2) + 3 < bufend);
+    }
+
+    if (TableID::PMT == TableID())
+    {
+        if (psipdata() + 3 >= bufend)
+            return false; // can't query program info length
+
+        ProgramMapTable pmt(*this);
+        if ((pmt.ProgramInfo() > bufend) ||
+            (pmt.ProgramInfo() + pmt.ProgramInfoLength() > bufend))
+        {
+            return false;
+        }
+
+        for (uint i = 0; i < pmt.StreamCount(); i++)
+        {
+            if ((pmt.StreamInfo(i) > bufend) ||
+                (pmt.StreamInfo(i) + pmt.StreamInfoLength(i) > bufend))
+            {
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
 ProgramAssociationTable* ProgramAssociationTable::CreateBlank(bool small)
 {
     (void) small; // currently always a small packet..
Index: libs/libmythtv/mpeg/pespacket.h
===================================================================
--- libs/libmythtv/mpeg/pespacket.h	(revision 12472)
+++ libs/libmythtv/mpeg/pespacket.h	(working copy)
@@ -182,7 +182,7 @@
     /// 1 bit  Additional Copy Info field is present
     bool HasACI()             const { return (_pesdata[4] & 0x4) >> 2; }
     /// 1 bit  Cyclic Redundancy Check present
-    bool HasCRC()             const { return (_pesdata[4] & 0x2) >> 1; }
+    virtual bool HasCRC()     const { return (_pesdata[4] & 0x2) >> 1; }
     /// 1 bit  Extension flags are present
     bool HasExtensionFlags()  const { return _pesdata[4] & 0x1; }
 
@@ -249,7 +249,7 @@
 
     unsigned char *_pesdata;    ///< Pointer to PES data in full buffer
     unsigned char *_fullbuffer; ///< Pointer to allocated data
-  private:
+
     uint _psiOffset;    ///< AFCOffset + StartOfFieldPointer
     uint _ccLast;       ///< Continuity counter of last inserted TS Packet
     uint _pesdataSize;  ///< Number of data bytes (TS header + PES data)

