Ticket #2664: r12480_backported.diff

File r12480_backported.diff, 11.9 KB (added by janne, 5 years ago)

changeset 12480 backported to 0.20-fixes

  • 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 &sect, uint last_section) 
    1515    uint endz = last_section >> 3; 
    1616    if (endz) 
    1717        sect.resize(endz, 0x00); 
    18     sect.resize(33 - endz, 0xff); 
     18    sect.resize(32, 0xff); 
    1919    sect[endz] = init_bits[last_section & 0x7]; 
    2020 
    2121#if 0 
    void MPEGStreamData::HandleTSTables(const TSPacket* tspacket) 
    668668        DONE_WITH_PES_PACKET(); 
    669669    } 
    670670 
     671    if (!psip->VerifyPSIP(!_have_CRC_bug)) 
     672    { 
     673        VERBOSE(VB_RECORD, "PSIP table is invalid"); 
     674        DONE_WITH_PES_PACKET(); 
     675    } 
     676 
    671677    // Don't decode redundant packets, 
    672678    // but if it is a desired PAT or PMT emit a "heartbeat" signal. 
    673679    if (IsRedundant(tspacket->PID(), *psip)) 
    void MPEGStreamData::HandleTSTables(const TSPacket* tspacket) 
    691697    } 
    692698 
    693699    HandleTables(tspacket->PID(), *psip); 
     700 
    694701    DONE_WITH_PES_PACKET(); 
    695702} 
    696703#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) 
    6565    return stream_id; 
    6666} 
    6767 
     68bool 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 
     163bool 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 
    68238ProgramAssociationTable* ProgramAssociationTable::CreateBlank(bool small) 
    69239{ 
    70240    (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 
    228228        DIT      = 0x7e, // always on pid 0x1e 
    229229        SIT      = 0x7f, // always on pid 0x1f 
    230230 
     231        // DVB Conditional Access 
     232        DVBCAbeg = 0x80, 
     233        DVBCAend = 0x8f, 
     234 
    231235        // Dishnet Longterm EIT data 
    232236        DN_EITbego = 0x80, // always on pid 0x300 
    233237        DN_EITendo = 0xfe, // always on pid 0x300 
    234238 
    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 
    236297        STUFFING = 0x80, 
    237298        CAPTION  = 0x86, 
    238299        CENSOR   = 0x87, 
    class TableID 
    241302        SRVLOC   = 0xA1, 
    242303        TSS      = 0xA2, 
    243304        CMPNAME  = 0xA3, 
    244  
    245         MGT      = 0xC7, // always on pid 0x1ffb 
    246         TVCT     = 0xC8, 
    247         CVCT     = 0xC9, 
    248         RRT      = 0xCA, 
    249         EIT      = 0xCB, 
    250         ETT      = 0xCC, 
    251         STT      = 0xCD, 
    252  
    253         DCCT     = 0xD3, 
    254         DCCSCT   = 0xD4, 
    255305    }; 
    256306}; 
    257307 
    class PSIPTable : public PESPacket 
    358408    // only for real ATSC PSIP tables, not similar MPEG2 tables 
    359409    void SetProtocolVersion(int ver) { pesdata()[8] = ver; } 
    360410 
     411    bool HasCRC(void) const; 
     412 
     413    bool VerifyPSIP(bool verify_crc) const; 
     414 
    361415    const QString toString(void) const; 
    362416 
    363417    static const uint PSIP_OFFSET = 8; // general PSIP header offset 
    class ConditionalAccessTable : public PSIPTable 
    625679    // for (i = 0; i < N; i++)      8.0      64 
    626680    //   { descriptor() } 
    627681    uint DescriptorsLength(void) const 
    628         { return SectionLength() - PSIP_OFFSET - (HasCRC() ? 4 : 0); } 
     682        { return SectionLength() - PSIP_OFFSET; } 
    629683    const unsigned char *Descriptors(void) const { return psipdata(); } 
    630684 
    631685    // 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 
    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 
    class PESPacket 
    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)