Ticket #10496: 0004-refactor-PESPacket-and-PSIPTable-some-more-to-silenc.patch

File 0004-refactor-PESPacket-and-PSIPTable-some-more-to-silenc.patch, 12.1 KB (added by dekarl@…, 12 years ago)
  • mythtv/libs/libmythtv/avformatdecoder.cpp

    From ed1f09ac75a454b2677909a7136d94242a917bad Mon Sep 17 00:00:00 2001
    From: Karl Dietz <dekarl@users.sourceforge.net>
    Date: Wed, 21 Mar 2012 23:36:16 +0100
    Subject: [PATCH 4/5] refactor PESPacket and PSIPTable some more to silence CRC errors
    
    ---
     mythtv/libs/libmythtv/avformatdecoder.cpp  |   16 +----
     mythtv/libs/libmythtv/dvbstreamhandler.cpp |    3 +-
     mythtv/libs/libmythtv/firewiredevice.cpp   |    4 +-
     mythtv/libs/libmythtv/mpeg/mpegtables.h    |   88 +++++++++++++++++++++++++--
     mythtv/libs/libmythtv/mpeg/pespacket.h     |   74 ++----------------------
     5 files changed, 93 insertions(+), 92 deletions(-)
    
    diff --git a/mythtv/libs/libmythtv/avformatdecoder.cpp b/mythtv/libs/libmythtv/avformatdecoder.cpp
    index 40d4a12..62d4578 100644
    a b void AvFormatDecoder::ScanATSCCaptionStreams(int av_index) 
    14681468        return;
    14691469    }
    14701470
    1471     const PESPacket pes = PESPacket::ViewData(ic->cur_pmt_sect);
    1472     const PSIPTable psip(pes);
    1473     const ProgramMapTable pmt(psip);
     1471    const ProgramMapTable pmt = ProgramMapTable::ViewData(ic->cur_pmt_sect);
    14741472
    14751473    uint i;
    14761474    for (i = 0; i < pmt.StreamCount(); i++)
    void AvFormatDecoder::ScanTeletextCaptions(int av_index) 
    15951593    if (!ic->cur_pmt_sect || tracks[kTrackTypeTeletextCaptions].size())
    15961594        return;
    15971595
    1598     const PESPacket pes = PESPacket::ViewData(ic->cur_pmt_sect);
    1599     const PSIPTable psip(pes);
    1600     const ProgramMapTable pmt(psip);
     1596    const ProgramMapTable pmt = PSIPTable::ViewData(ic->cur_pmt_sect);
    16011597
    16021598    for (uint i = 0; i < pmt.StreamCount(); i++)
    16031599    {
    void AvFormatDecoder::ScanDSMCCStreams(void) 
    16691665    if (!itv && ! (itv = m_parent->GetInteractiveTV()))
    16701666        return;
    16711667
    1672     const PESPacket pes = PESPacket::ViewData(ic->cur_pmt_sect);
    1673     const PSIPTable psip(pes);
    1674     const ProgramMapTable pmt(psip);
     1668    ProgramMapTable pmt = ProgramMapTable::ViewData(ic->cur_pmt_sect);
    16751669
    16761670    for (uint i = 0; i < pmt.StreamCount(); i++)
    16771671    {
    bool AvFormatDecoder::HasVideo(const AVFormatContext *ic) 
    45394533{
    45404534    if (ic && ic->cur_pmt_sect)
    45414535    {
    4542         const PESPacket pes = PESPacket::ViewData(ic->cur_pmt_sect);
    4543         const PSIPTable psip(pes);
    4544         const ProgramMapTable pmt(psip);
     4536        const ProgramMapTable pmt = ProgramMapTable::ViewData(ic->cur_pmt_sect);
    45454537
    45464538        for (uint i = 0; i < pmt.StreamCount(); i++)
    45474539        {
  • mythtv/libs/libmythtv/dvbstreamhandler.cpp

    diff --git a/mythtv/libs/libmythtv/dvbstreamhandler.cpp b/mythtv/libs/libmythtv/dvbstreamhandler.cpp
    index 75519f9..1e24b67 100644
    a b void DVBStreamHandler::RunSR(void) 
    324324
    325325            readSomething = true;
    326326
    327             const PESPacket pes = PESPacket::ViewData(buffer);
    328             const PSIPTable psip(pes);
     327            const PSIPTable psip = PSIPTable::ViewData(buffer);
    329328
    330329            if (psip.SectionSyntaxIndicator())
    331330            {
  • mythtv/libs/libmythtv/firewiredevice.cpp

    diff --git a/mythtv/libs/libmythtv/firewiredevice.cpp b/mythtv/libs/libmythtv/firewiredevice.cpp
    index a3f8507..38ae9b3 100644
    a b  
    1616#include "darwinfirewiredevice.h"
    1717#endif
    1818#include "mythlogging.h"
    19 #include "pespacket.h"
     19#include "mpegtables.h"
    2020
    2121#define LOC      QString("FireDev(%1): ").arg(guid_to_string(m_guid))
    2222
    void FirewireDevice::ProcessPATPacket(const TSPacket &tspacket) 
    336336    if (!tspacket.TransportError() && !tspacket.Scrambled() &&
    337337        tspacket.HasPayload() && tspacket.PayloadStart() && !tspacket.PID())
    338338    {
    339         PESPacket pes = PESPacket::View(tspacket);
     339        PSIPTable pes = PSIPTable::View(tspacket);
    340340        uint crc = pes.CalcCRC();
    341341        m_buffer_cleared |= (crc != m_last_crc);
    342342        m_last_crc = crc;
  • mythtv/libs/libmythtv/mpeg/mpegtables.h

    diff --git a/mythtv/libs/libmythtv/mpeg/mpegtables.h b/mythtv/libs/libmythtv/mpeg/mpegtables.h
    index 4223dff..053dd1e 100644
    a b class MTV_PUBLIC TableID 
    350350};
    351351
    352352/** \class PSIPTable
    353  *  \brief A PSIP table is a special type of PES packet containing an
    354  *         MPEG, ATSC, or DVB table.
     353 *  \brief A PSIP table is a variant of a PES packet containing an
     354 *         MPEG, ATSC or DVB table.
    355355 */
    356356class MTV_PUBLIC PSIPTable : public PESPacket
    357357{
     358    /// Only handles single TS packet PES packets, for PMT/PAT tables basically
     359    void InitPESPacket(TSPacket& tspacket)
     360    {
     361        if (tspacket.PayloadStart())
     362            _psiOffset = tspacket.AFCOffset() + tspacket.StartOfFieldPointer();
     363        else
     364        {
     365            LOG(VB_GENERAL, LOG_ERR, "Started PESPacket, but !payloadStart()");
     366            _psiOffset = tspacket.AFCOffset();
     367        }
     368        _pesdata = tspacket.data() + _psiOffset + 1;
     369
     370        _badPacket = true;
     371        // first check if Length() will return something useful and
     372        // than check if the packet ends in the first TSPacket
     373        if ((_pesdata - tspacket.data()) <= (188-3) &&
     374            (_pesdata + Length() - tspacket.data()) <= (188-3))
     375        {
     376            _badPacket = !VerifyCRC();
     377        }
     378    }
     379
     380  protected:
     381    // does not create it's own data
     382    PSIPTable(const TSPacket& tspacket, bool)
     383        : PESPacket()
     384    {
     385        _pesdata = NULL;
     386        _fullbuffer = NULL;
     387         _ccLast = tspacket.ContinuityCounter();
     388         _allocSize = 0;
     389        InitPESPacket(const_cast<TSPacket&>(tspacket));
     390        _fullbuffer = const_cast<unsigned char*>(tspacket.data());
     391        _pesdataSize = TSPacket::kSize - (_pesdata - _fullbuffer);
     392    }
     393
     394  public:
     395
     396    // may be modified
     397    PSIPTable(const TSPacket &tspacket,
     398              const unsigned char *pesdata, uint pes_size)
     399        : PESPacket()
     400    { // clone
     401        _ccLast = tspacket.ContinuityCounter();
     402        _pesdataSize = pes_size;
     403        InitPESPacket(const_cast<TSPacket&>(tspacket)); // sets _psiOffset
     404        int len     = pes_size+4;
     405        /* make alloc size multiple of 188 */
     406        _allocSize  = ((len+_psiOffset+187)/188)*188;
     407        _fullbuffer = pes_alloc(_allocSize);
     408        _pesdata    = _fullbuffer + _psiOffset + 1;
     409        memcpy(_fullbuffer, tspacket.data(), 188);
     410        memcpy(_pesdata, pesdata, pes_size-1);
     411    }
     412
     413
    358414  private:
    359415    // creates non-clone version, for View
    360416    PSIPTable(const PESPacket& pkt, bool)
    361         : PESPacket(reinterpret_cast<const TSPacket*>(pkt.tsheader()), false)
    362         { ; }
     417    {
     418        PSIPTable(reinterpret_cast<const PESPacket&>(*pkt.data()), false);
     419    }
    363420  public:
    364421    PSIPTable(const PSIPTable& table) : PESPacket(table)
    365422    {
    class MTV_PUBLIC PSIPTable : public PESPacket 
    371428        // section_syntax_ind   1       1.0       8   should always be 1
    372429        // private_indicator    1       1.1       9   should always be 1
    373430    }
    374     PSIPTable(const TSPacket& table) : PESPacket(table)
     431    // may be modified
     432    PSIPTable(const TSPacket& table)
     433        : PESPacket()
    375434    {
    376435        // section_syntax_ind   1       1.0       8   should always be 1
    377436        // private_indicator    1       1.1       9   should always be 1
     437
     438        _ccLast = table.ContinuityCounter();
     439        _pesdataSize = 188;
     440
     441        // clone
     442        InitPESPacket(const_cast<TSPacket&>(table)); // sets _psiOffset
     443
     444        int len     = (4*1024) - 256; /* ~4KB */
     445        _allocSize  = len + _psiOffset;
     446        _fullbuffer = pes_alloc(_allocSize);
     447        _pesdata    = _fullbuffer + _psiOffset + 1;
     448        memcpy(_fullbuffer, table.data(), TSPacket::kSize);
    378449    }
    379450
    380451
    381452    static const PSIPTable View(const TSPacket& tspacket)
    382         { return PSIPTable(PESPacket::View(tspacket), false); }
     453        { return PSIPTable(tspacket, false); }
    383454
    384455    static PSIPTable View(TSPacket& tspacket)
    385         { return PSIPTable(PESPacket::View(tspacket), false); }
     456        { return PSIPTable(tspacket, false); }
     457
     458    static const PSIPTable ViewData(const unsigned char* pesdata)
     459        { return PSIPTable(reinterpret_cast<const TSPacket&>(*pesdata), false); }
    386460
    387461    // Section            Bits   Start Byte sbit
    388462    // -----------------------------------------
  • mythtv/libs/libmythtv/mpeg/pespacket.h

    diff --git a/mythtv/libs/libmythtv/mpeg/pespacket.h b/mythtv/libs/libmythtv/mpeg/pespacket.h
    index bcd4fde..b70f1e8 100644
    a b void pes_free(unsigned char *ptr); 
    1919
    2020/** \class PESPacket
    2121 *  \brief Allows us to transform TS packets to PES packets, which
    22  *         are used to hold PSIP tables as well as multimedia streams.
     22 *         are used to hold multimedia streams and very similar to PSIP tables.
    2323 *  \sa PSIPTable, TSPacket
    2424 */
    2525class PESPacket
    2626{
    27     /// Only handles single TS packet PES packets, for PMT/PAT tables basically
    28     void InitPESPacket(TSPacket& tspacket)
    29     {
    30         if (tspacket.PayloadStart())
    31             _psiOffset = tspacket.AFCOffset() + tspacket.StartOfFieldPointer();
    32         else
    33         {
    34             LOG(VB_GENERAL, LOG_ERR, "Started PESPacket, but !payloadStart()");
    35             _psiOffset = tspacket.AFCOffset();
    36         }
    37         _pesdata = tspacket.data() + _psiOffset + 1;
    38 
    39         _badPacket = true;
    40         // first check if Length() will return something useful and
    41         // than check if the packet ends in the first TSPacket
    42         if ((_pesdata - tspacket.data()) <= (188-3) &&
    43             (_pesdata + Length() - tspacket.data()) <= (188-3))
    44         {
    45             _badPacket = !VerifyCRC();
    46         }
    47     }
    48 
    4927  protected:
    50     // does not create it's own data
    51     PESPacket(const TSPacket* tspacket, bool)
    52         : _pesdata(NULL),    _fullbuffer(NULL),
    53           _ccLast(tspacket->ContinuityCounter()), _allocSize(0)
    54     {
    55         InitPESPacket(const_cast<TSPacket&>(*tspacket));
    56         _fullbuffer = const_cast<unsigned char*>(tspacket->data());
    57         _pesdataSize = TSPacket::kSize - (_pesdata - _fullbuffer);
    58     }
     28    /** noop constructor, only for use by derived classes */
     29    PESPacket()
     30    { ; }
     31
    5932    // does not create it's own data
    6033    PESPacket(const unsigned char *pesdata, bool)
    6134        : _pesdata(const_cast<unsigned char*>(pesdata)),
    class PESPacket 
    8861        _pesdata = _fullbuffer + (pkt._pesdata - pkt._fullbuffer);
    8962    }
    9063
    91     // may be modified
    92     PESPacket(const TSPacket& tspacket)
    93         : _ccLast(tspacket.ContinuityCounter()), _pesdataSize(188)
    94     { // clone
    95         InitPESPacket(const_cast<TSPacket&>(tspacket)); // sets _psiOffset
    96 
    97         int len     = (4*1024) - 256; /* ~4KB */
    98         _allocSize  = len + _psiOffset;
    99         _fullbuffer = pes_alloc(_allocSize);
    100         _pesdata    = _fullbuffer + _psiOffset + 1;
    101         memcpy(_fullbuffer, tspacket.data(), TSPacket::kSize);
    102     }
    103 
    10464    // At this point we should have the entire VCT table in buffer
    10565    // at (buffer - 8), and without the tspacket 4 byte header
    10666
    10767        //if (TableID::TVCT == table_id)
    10868        //VirtualChannelTable vct;
    10969
    110     // may be modified
    111     PESPacket(const TSPacket &tspacket,
    112               const unsigned char *pesdata, uint pes_size)
    113         : _ccLast(tspacket.ContinuityCounter()), _pesdataSize(pes_size)
    114     { // clone
    115         InitPESPacket(const_cast<TSPacket&>(tspacket)); // sets _psiOffset
    116         int len     = pes_size+4;
    117         /* make alloc size multiple of 188 */
    118         _allocSize  = ((len+_psiOffset+187)/188)*188;
    119         _fullbuffer = pes_alloc(_allocSize);
    120         _pesdata    = _fullbuffer + _psiOffset + 1;
    121         memcpy(_fullbuffer, tspacket.data(), 188);
    122         memcpy(_pesdata, pesdata, pes_size-1);
    123     }
    124 
    12570    virtual ~PESPacket()
    12671    {
    12772        if (IsClone())
    class PESPacket 
    13176        _pesdata    = NULL;
    13277    }
    13378
    134     static const PESPacket View(const TSPacket& tspacket)
    135         { return PESPacket(&tspacket, false); }
    136 
    137     static PESPacket View(TSPacket& tspacket)
    138         { return PESPacket(&tspacket, false); }
    139 
    140     static const PESPacket ViewData(const unsigned char* pesdata)
    141         { return PESPacket(pesdata, false); }
    142 
    14379    bool IsClone() const { return bool(_allocSize); }
    14480
    14581    // return true if complete or broken