Ticket #2664: 2664-v3.patch

File 2664-v3.patch, 10.5 KB (added by danielk, 5 years ago)

Updated version with more tables in HasCRC for ATSC

  • libs/libmythtv/mpeg/mpegstreamdata.cpp

     
    747747        DONE_WITH_PES_PACKET(); // already parsed this table, toss it. 
    748748    } 
    749749 
    750     HandleTables(tspacket->PID(), *psip); 
     750    if (psip->VerifyPSIP(!_have_CRC_bug)) 
     751        HandleTables(tspacket->PID(), *psip); 
     752 
    751753    DONE_WITH_PES_PACKET(); 
    752754} 
    753755#undef DONE_WITH_PES_PACKET 
     
    14061408 
    14071409    info.status = status; 
    14081410 
    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))); 
    14111413 
    14121414    uint_vec_t pnum_del_list; 
    14131415    const uint_vec_t &pnums = _encryption_pid_to_pnums[pid]; 
  • libs/libmythtv/mpeg/mpegtables.h

     
    229229        DIT      = 0x7e, // always on pid 0x1e 
    230230        SIT      = 0x7f, // always on pid 0x1f 
    231231 
     232        // DVB Conditional Access 
     233        DVBCAbeg = 0x80, 
     234        DVBCAend = 0x8f, 
     235 
    232236        // Dishnet Longterm EIT data 
    233237        DN_EITbego = 0x80, // always on pid 0x300 
    234238        DN_EITendo = 0xfe, // always on pid 0x300 
    235239 
    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 
    237298        STUFFING = 0x80, 
    238299        CAPTION  = 0x86, 
    239300        CENSOR   = 0x87, 
     
    242303        SRVLOC   = 0xA1, 
    243304        TSS      = 0xA2, 
    244305        CMPNAME  = 0xA3, 
    245  
    246         MGT      = 0xC7, // always on pid 0x1ffb 
    247         TVCT     = 0xC8, 
    248         CVCT     = 0xC9, 
    249         RRT      = 0xCA, 
    250         EIT      = 0xCB, 
    251         ETT      = 0xCC, 
    252         STT      = 0xCD, 
    253  
    254         DCCT     = 0xD3, 
    255         DCCSCT   = 0xD4, 
    256306    }; 
    257307}; 
    258308 
     
    359409    // only for real ATSC PSIP tables, not similar MPEG2 tables 
    360410    void SetProtocolVersion(int ver) { pesdata()[8] = ver; } 
    361411 
     412    bool HasCRC(void) const; 
     413 
     414    const bool VerifyPSIP(bool verify_crc) const; 
     415 
    362416    const QString toString(void) const; 
    363417 
    364418    static const uint PSIP_OFFSET = 8; // general PSIP header offset 
     
    627681    // for (i = 0; i < N; i++)      8.0      64 
    628682    //   { descriptor() } 
    629683    uint DescriptorsLength(void) const 
    630         { return SectionLength() - PSIP_OFFSET - (HasCRC() ? 4 : 0); } 
     684        { return SectionLength() - PSIP_OFFSET; } 
    631685    const unsigned char *Descriptors(void) const { return psipdata(); } 
    632686 
    633687    // CRC_32 32 rpchof 
  • libs/libmythtv/mpeg/mpegtables.cpp

     
    6666    return stream_id; 
    6767} 
    6868 
     69bool 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 
     164const 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 
    69213ProgramAssociationTable* ProgramAssociationTable::CreateBlank(bool small) 
    70214{ 
    71215    (void) small; // currently always a small packet.. 
  • libs/libmythtv/mpeg/pespacket.h

     
    182182    /// 1 bit  Additional Copy Info field is present 
    183183    bool HasACI()             const { return (_pesdata[4] & 0x4) >> 2; } 
    184184    /// 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; } 
    186186    /// 1 bit  Extension flags are present 
    187187    bool HasExtensionFlags()  const { return _pesdata[4] & 0x1; } 
    188188 
     
    249249 
    250250    unsigned char *_pesdata;    ///< Pointer to PES data in full buffer 
    251251    unsigned char *_fullbuffer; ///< Pointer to allocated data 
    252   private: 
     252 
    253253    uint _psiOffset;    ///< AFCOffset + StartOfFieldPointer 
    254254    uint _ccLast;       ///< Continuity counter of last inserted TS Packet 
    255255    uint _pesdataSize;  ///< Number of data bytes (TS header + PES data)