Ticket #9480: 0002-ticket9480_pl_eit_encodings.patch

File 0002-ticket9480_pl_eit_encodings.patch, 7.6 KB (added by warpme@…, 10 years ago)

Patch for current master

  • mythtv/libs/libmythtv/eitfixup.h

    diff -Naur mythtv-master-20150105-g4216e00-old/mythtv/libs/libmythtv/eitfixup.h mythtv-master-20150105-g4216e00-new/mythtv/libs/libmythtv/eitfixup.h
    old new  
    6363        kEFixForceISO8859_15 = 0x4000,
    6464        kEFixForceISO8859_9  = 0x80000,
    6565        kEFixForceISO8859_2  = 0x100000,
     66        kEFixForceISO6937    = 0x8000,
    6667    };
    6768
    6869    EITFixUp();
  • mythtv/libs/libmythtv/eithelper.cpp

    diff -Naur mythtv-master-20150105-g4216e00-old/mythtv/libs/libmythtv/eithelper.cpp mythtv-master-20150105-g4216e00-new/mythtv/libs/libmythtv/eithelper.cpp
    old new  
    227227    unsigned char enc_2[3]  = { 0x10, 0x00, 0x02 };
    228228    unsigned char enc_9[3]  = { 0x10, 0x00, 0x09 }; // could use { 0x05 } instead
    229229    unsigned char enc_15[3] = { 0x10, 0x00, 0x0f }; // could use { 0x0B } instead
     230    unsigned char enc_0[1]  = { 0x20 };
    230231    int enc_len = 0;
    231232    const unsigned char *enc = NULL;
    232233
     234    // Use an encoding override of ISO 6937
     235    if (fix & EITFixUp::kEFixForceISO6937)
     236    {
     237        enc = enc_0;
     238        enc_len = sizeof(enc_0);
     239    }
     240
    233241    // Is this BellExpressVU EIT (Canada) ?
    234242    // Use an encoding override of ISO 8859-1 (Latin1)
    235243    if (fix & EITFixUp::kEFixForceISO8859_1)
     
    261269        enc = enc_15;
    262270        enc_len = sizeof(enc_15);
    263271    }
     272   
     273   
    264274
    265275    if (bestShortEvent)
    266276    {
     
    337347        return;
    338348
    339349    uint descCompression = (eit->TableID() > 0x80) ? 2 : 1;
    340     uint fix = fixup.value((uint64_t)eit->OriginalNetworkID() << 16);
     350    uint fix = EITFixUp::kFixGenericDVB;
     351    if (eit->SourceNetworkID() && eit->SourceTransportID()) {
     352        fix |= fixup[1<<15 | (uint64_t)eit->SourceNetworkID() << 16];
     353        fix |= fixup[1<<15 | (((uint64_t)eit->SourceTransportID()) << 32) |
     354                     ((uint64_t)eit->SourceNetworkID() << 16)];
     355        fix |= fixup[1<<15 | ((uint64_t)eit->SourceNetworkID() << 16) | (uint64_t)eit->ServiceID()];
     356        fix |= fixup[1<<15 | (((uint64_t)eit->SourceTransportID()) << 32) |
     357                     (uint64_t)((uint64_t)eit->SourceNetworkID() << 16) |
     358                     (uint64_t)(uint64_t)eit->ServiceID()];
     359    }
     360    fix |= fixup[eit->OriginalNetworkID() << 16];
     361
    341362    fix |= fixup.value((((uint64_t)eit->TSID()) << 32) |
    342363                 ((uint64_t)eit->OriginalNetworkID() << 16));
    343364    fix |= fixup.value(((uint64_t)eit->OriginalNetworkID() << 16) |
    344365                 (uint64_t)eit->ServiceID());
    345366    fix |= fixup.value((((uint64_t)eit->TSID()) << 32) |
    346367                 ((uint64_t)eit->OriginalNetworkID() << 16) |
    347                   (uint64_t)eit->ServiceID());
    348     fix |= EITFixUp::kFixGenericDVB;
     368                 (uint64_t)eit->ServiceID());
    349369
    350370    uint tableid   = eit->TableID();
    351371    uint version   = eit->Version();
     
    9901010    ///////////////////////////////////////////////////////////////////////////
    9911011    // Fixups to make EIT provided listings more useful
    9921012    // transport_id<<32 | netword_id<<16 | service_id
     1013    // The service_id is a 13-bit field. Free bit number 15
     1014    // is used here to determine that the data releate to
     1015    // transponder, which sent the EIT, and not the program.
    9931016
    9941017    // Bell Express VU Canada
    9951018    fix[  256U << 16] = EITFixUp::kFixBell;
     
    12701293
    12711294    // Premiere
    12721295    fix[133 << 16] = EITFixUp::kEFixForceISO8859_15;
    1273 
     1296   
     1297    // Cyfra+ ISO-6937 (source NID)
     1298    fix[1<<15 | 318<<16] = EITFixUp::kEFixForceISO6937;
     1299   
     1300    // Polsat ISO-8859-2 (source NID)
     1301    fix[1<<15 | 113<<16] = EITFixUp::kEFixForceISO8859_2;
     1302   
    12741303    // DVB-S Astra 19.2E French channels
    12751304    fix[     1022LL << 32 | 1 << 16 |  6901 ] = // DIRECT 8
    12761305        fix[ 1022LL << 32 | 1 << 16 |  6905 ] = // France 24 (en Francais)
  • mythtv/libs/libmythtv/mpeg/dvbdescriptors.cpp

    diff -Naur mythtv-master-20150105-g4216e00-old/mythtv/libs/libmythtv/mpeg/dvbdescriptors.cpp mythtv-master-20150105-g4216e00-new/mythtv/libs/libmythtv/mpeg/dvbdescriptors.cpp
    old new  
    7676        new unsigned char[raw_length + encoding_override_length];
    7777
    7878    uint length = 0;
    79     if (encoding_override && src[0] >= 0x20) {
    80         memcpy(dst, encoding_override, encoding_override_length);
    81         length = encoding_override_length;
     79    if (encoding_override) {
     80        if (src[0] >= 0x20) {
     81            memcpy(dst, encoding_override, encoding_override_length);
     82            length = encoding_override_length;
     83        } else {
     84            //incorrect ISO-8859 encoding marker,
     85            //when text has been encoded using ISO-6937
     86            if (src[0] >= 0x01 && src[0] <= 0x0B
     87                    && encoding_override_length == 1
     88                    && encoding_override[0] == 0x20) {
     89                src++;
     90                raw_length--;
     91            }
     92        }
    8293    }
    8394
    8495    // Strip formatting characters
  • mythtv/libs/libmythtv/mpeg/dvbstreamdata.cpp

    diff -Naur mythtv-master-20150105-g4216e00-old/mythtv/libs/libmythtv/mpeg/dvbstreamdata.cpp mythtv-master-20150105-g4216e00-new/mythtv/libs/libmythtv/mpeg/dvbstreamdata.cpp
    old new  
    396396        SetVersionEIT(psip.TableID(), service_id, psip.Version(),  psip.LastSection());
    397397        SetEITSectionSeen(psip.TableID(), service_id, psip.Section());
    398398
    399         DVBEventInformationTable eit(psip);
     399        DVBEventInformationTable eit(psip, _desired_netid, _desired_tsid);
    400400        for (uint i = 0; i < _dvb_eit_listeners.size(); i++)
    401401            _dvb_eit_listeners[i]->HandleEIT(&eit);
    402402
  • mythtv/libs/libmythtv/mpeg/dvbtables.h

    diff -Naur mythtv-master-20150105-g4216e00-old/mythtv/libs/libmythtv/mpeg/dvbtables.h mythtv-master-20150105-g4216e00-new/mythtv/libs/libmythtv/mpeg/dvbtables.h
    old new  
    285285class MTV_PUBLIC DVBEventInformationTable : public PSIPTable
    286286{
    287287  public:
     288    DVBEventInformationTable(const PSIPTable& table,
     289                             uint SourceNetworkID,
     290                             uint SourceTransportID) : PSIPTable(table)
     291    {
     292        _source_netid = SourceNetworkID,
     293        _source_tsid  = SourceTransportID;
     294        assert(IsEIT(TableID()));
     295        Parse();
     296    }
    288297    DVBEventInformationTable(const PSIPTable& table) : PSIPTable(table)
    289298    {
    290299    // table_id                 8   0.0       0xC7
     
    362371    void Parse(void) const;
    363372
    364373    static bool IsEIT(uint table_id);
     374   
     375    uint SourceNetworkID(void)   const { return _source_netid; }
     376    uint SourceTransportID(void) const { return _source_tsid;  }
     377    bool ActualTS() const {
     378        return (TableID() == TableID::PF_EIT)
     379                || ((TableID() > TableID::SC_EITbeg)
     380                     && (TableID() < TableID::SC_EITend));
     381    }
     382
    365383
    366384  private:
    367385    mutable vector<const unsigned char*> _ptrs; // used to parse
     386    uint _source_netid;
     387    uint _source_tsid;
    368388};
    369389
    370390/** \class TimeDateTable