28 changes: 10 additions & 18 deletions mythtv/libs/libmythtv/mpeg/dishdescriptors.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -160,9 +160,9 @@ QDate DishEventTagsDescriptor::originalairdate(void) const
return originalairdate;
}

QMutex DishEventMPAADescriptor::mpaaRatingsLock;
map<uint,QString> DishEventMPAADescriptor::mpaaRatingsDesc;
bool DishEventMPAADescriptor::mpaaRatingsExists = false;
QMutex DishEventMPAADescriptor::mpaaRatingsLock;
QMap<uint,QString> DishEventMPAADescriptor::mpaaRatingsDesc;
bool DishEventMPAADescriptor::mpaaRatingsExists = false;

float DishEventMPAADescriptor::stars(void) const
{
Expand All @@ -187,13 +187,9 @@ QString DishEventMPAADescriptor::rating(void) const

QMutexLocker locker(&mpaaRatingsLock);

map<uint,QString>::const_iterator it = mpaaRatingsDesc.find(rating_raw());
QMap<uint,QString>::const_iterator it = mpaaRatingsDesc.find(rating_raw());
if (it != mpaaRatingsDesc.end())
{
QString ret = (*it).second;
ret.detach();
return ret;
}
return *it;

// Found nothing? Just return empty string.
return "";
Expand Down Expand Up @@ -239,9 +235,9 @@ void DishEventMPAADescriptor::Init(void)
mpaaRatingsExists = true;
}

QMutex DishEventVCHIPDescriptor::vchipRatingsLock;
map<uint,QString> DishEventVCHIPDescriptor::vchipRatingsDesc;
bool DishEventVCHIPDescriptor::vchipRatingsExists = false;
QMutex DishEventVCHIPDescriptor::vchipRatingsLock;
QMap<uint,QString> DishEventVCHIPDescriptor::vchipRatingsDesc;
bool DishEventVCHIPDescriptor::vchipRatingsExists = false;

QString DishEventVCHIPDescriptor::rating(void) const
{
Expand All @@ -250,13 +246,9 @@ QString DishEventVCHIPDescriptor::rating(void) const

QMutexLocker locker(&vchipRatingsLock);

map<uint,QString>::const_iterator it = vchipRatingsDesc.find(rating_raw());
QMap<uint,QString>::const_iterator it = vchipRatingsDesc.find(rating_raw());
if (it != vchipRatingsDesc.end())
{
QString ret = (*it).second;
ret.detach();
return ret;
}
return *it;

// Found nothing? Just return empty string.
return "";
Expand Down
79 changes: 29 additions & 50 deletions mythtv/libs/libmythtv/mpeg/dishdescriptors.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,23 @@
#ifndef _DISH_DESCRIPTORS_H_
#define _DISH_DESCRIPTORS_H_

#include <cassert>
#include <map>

#include <qmutex.h>
#include <QString>
#include <QMutex>
#include <QDate>
#include <QMap>

#include "atscdescriptors.h"

class DishEventMPAADescriptor : public MPEGDescriptor
{
public:
DishEventMPAADescriptor(const unsigned char* data)
: MPEGDescriptor(data)
{
DishEventMPAADescriptor(const unsigned char *data, int len = 300) :
MPEGDescriptor(data, len, PrivateDescriptorID::dish_event_mpaa) { }
// Name bits loc expected value
// descriptor_tag 8 0.0 0x89
assert(DescriptorID::dish_event_mpaa == DescriptorTag());
// descriptor_length 8 1.0
}
// stars 3 2.0
uint stars_raw(void) const { return (_data[2] & 0xe0) >> 0x05; }
float stars(void) const;
Expand All @@ -39,22 +36,19 @@ class DishEventMPAADescriptor : public MPEGDescriptor
static void Init(void);

private:
static QMutex mpaaRatingsLock;
static map<uint,QString> mpaaRatingsDesc;
static bool mpaaRatingsExists;
static QMutex mpaaRatingsLock;
static QMap<uint,QString> mpaaRatingsDesc;
static bool mpaaRatingsExists;
};

class DishEventVCHIPDescriptor : public MPEGDescriptor
{
public:
DishEventVCHIPDescriptor(const unsigned char* data)
: MPEGDescriptor(data)
{
DishEventVCHIPDescriptor(const unsigned char *data, int len = 300) :
MPEGDescriptor(data, len, PrivateDescriptorID::dish_event_vchip) { }
// Name bits loc expected value
// descriptor_tag 8 0.0 0x95
assert(DescriptorID::dish_event_vchip == DescriptorTag());
// descriptor_length 8 1.0
}
// rating 8 2.0
uint rating_raw(void) const { return _data[2]; }
QString rating(void) const;
Expand All @@ -67,22 +61,19 @@ class DishEventVCHIPDescriptor : public MPEGDescriptor
static void Init(void);

private:
static QMutex vchipRatingsLock;
static map<uint,QString> vchipRatingsDesc;
static bool vchipRatingsExists;
static QMutex vchipRatingsLock;
static QMap<uint,QString> vchipRatingsDesc;
static bool vchipRatingsExists;
};

class DishEventNameDescriptor : public MPEGDescriptor
{
public:
DishEventNameDescriptor(const unsigned char* data)
: MPEGDescriptor(data)
{
DishEventNameDescriptor(const unsigned char *data, int len = 300) :
MPEGDescriptor(data, len, PrivateDescriptorID::dish_event_name) { }
// Name bits loc expected value
// descriptor_tag 8 0.0 0x91
assert(DescriptorID::dish_event_name == DescriptorTag());
// descriptor_length 8 1.0
}
// unknown 8 2.0
// event_name dlen-1 3.0
bool HasName(void) const { return DescriptorLength() > 1; }
Expand All @@ -92,14 +83,12 @@ class DishEventNameDescriptor : public MPEGDescriptor
class DishEventDescriptionDescriptor : public MPEGDescriptor
{
public:
DishEventDescriptionDescriptor(const unsigned char* data)
: MPEGDescriptor(data)
{
DishEventDescriptionDescriptor(const unsigned char *data, int len = 300) :
MPEGDescriptor(
data, len, PrivateDescriptorID::dish_event_description) { }
// Name bits loc expected value
// descriptor_tag 8 0.0 0x92
assert(DescriptorID::dish_event_description == DescriptorTag());
// descriptor_length 8 1.0
}
// unknown 8/16 2.0
// event_name dlen-2 3.0/4.0
const unsigned char *DescriptionRaw(void) const;
Expand All @@ -111,14 +100,12 @@ class DishEventDescriptionDescriptor : public MPEGDescriptor
class DishEventPropertiesDescriptor : public MPEGDescriptor
{
public:
DishEventPropertiesDescriptor(const unsigned char* data)
: MPEGDescriptor(data)
{
DishEventPropertiesDescriptor(const unsigned char *data, int len = 300) :
MPEGDescriptor(
data, len, PrivateDescriptorID::dish_event_properties) { }
// Name bits loc expected value
// descriptor_tag 8 0.0 0x94
assert(DescriptorID::dish_event_properties == DescriptorTag());
// descriptor_length 8 1.0
}
// unknown 8 2.0
// event_name dlen-1 3.0
bool HasProperties(void) const { return DescriptorLength() > 1; }
Expand All @@ -137,14 +124,11 @@ class DishEventPropertiesDescriptor : public MPEGDescriptor
class DishEventTagsDescriptor : public MPEGDescriptor
{
public:
DishEventTagsDescriptor(const unsigned char* data)
: MPEGDescriptor(data)
{
DishEventTagsDescriptor(const unsigned char *data, int len = 300) :
MPEGDescriptor(data, len, PrivateDescriptorID::dish_event_tags) { }
// Name bits loc expected value
// descriptor_tag 8 0.0 0x96
assert(DescriptorID::dish_event_tags == DescriptorTag());
// descriptor_length 8 1.0
}
// seriesid 64 2.0
QString seriesid(void) const;
QString programid(void) const;
Expand Down Expand Up @@ -172,27 +156,22 @@ DishThemeType string_to_dish_theme_type(const QString &type);
class DishContentDescriptor : public MPEGDescriptor
{
public:
DishContentDescriptor(const unsigned char* data) : MPEGDescriptor(data)
{
// Name bits loc expected value
// descriptor_tag 8 0.0 0x54
assert(DescriptorID::content == DescriptorTag());
// descriptor_length 8 1.0
}
DishContentDescriptor(const unsigned char *data, int len = 300) :
MPEGDescriptor(data, len) { }

// content_nibble_level_1 4 0.0
// content_nibble_level_1 4 2.0
uint Nibble1(void) const { return _data[2] >> 4; }
// content_nibble_level_2 4 0.4
// content_nibble_level_2 4 2.4
uint Nibble2(void) const { return _data[2] & 0xf; }

uint Nibble(void) const { return _data[2]; }

// user_nibble 4 1.0
// user_nibble 4 3.0
uint UserNibble1(void) const { return _data[3] >> 4; }
// user_nibble 4 1.4
// user_nibble 4 3.4
uint UserNibble2(void) const { return _data[3] & 0xf; }
uint UserNibble(void) const { return _data[3]; }
// } 2.0
// } 4.0

DishThemeType GetTheme(void) const;
QString GetCategory(void) const;
Expand Down
24 changes: 8 additions & 16 deletions mythtv/libs/libmythtv/mpeg/dvbdescriptors.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -197,9 +197,9 @@ QString dvb_decode_short_name(const unsigned char *src, uint raw_length)
return sStr;
}

QMutex ContentDescriptor::categoryLock;
map<uint,QString> ContentDescriptor::categoryDesc;
bool ContentDescriptor::categoryDescExists = false;
QMutex ContentDescriptor::categoryLock;
QMap<uint,QString> ContentDescriptor::categoryDesc;
volatile bool ContentDescriptor::categoryDescExists = false;

QString myth_category_type_to_string(uint category_type)
{
Expand Down Expand Up @@ -240,32 +240,24 @@ QString ContentDescriptor::GetDescription(uint i) const
QMutexLocker locker(&categoryLock);

// Try to get detailed description
map<uint,QString>::const_iterator it = categoryDesc.find(Nibble(i));
QMap<uint,QString>::const_iterator it = categoryDesc.find(Nibble(i));
if (it != categoryDesc.end())
{
QString ret = (*it).second;
ret.detach();
return ret;
}
return *it;

// Fall back to category description
it = categoryDesc.find(Nibble1(i)<<4);
if (it != categoryDesc.end())
{
QString ret = (*it).second;
ret.detach();
return ret;
}
return *it;

// Found nothing? Just return empty string.
return "";
}

QString ContentDescriptor::toString() const
{
QString tmp("");
QString tmp("ContentDescriptor: ");
for (uint i = 0; i < Count(); i++)
tmp += GetMythCategory(i) + " : " + GetDescription(i);
tmp += GetMythCategory(i) + " : " + GetDescription(i) + ", ";
return tmp;
}

Expand Down
710 changes: 296 additions & 414 deletions mythtv/libs/libmythtv/mpeg/dvbdescriptors.h

Large diffs are not rendered by default.

104 changes: 72 additions & 32 deletions mythtv/libs/libmythtv/mpeg/mpegdescriptors.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,13 @@ desc_list_t MPEGDescriptor::Parse(
while (off < len)
{
tmp.push_back(data+off);
MPEGDescriptor desc(data+off);
off += desc.DescriptorLength() + 2;
MPEGDescriptor desc(data+off, len-off);
if (!desc.IsValid())
{
tmp.pop_back();
break;
}
off += desc.size();
}
return tmp;
}
Expand All @@ -33,8 +38,14 @@ desc_list_t MPEGDescriptor::ParseAndExclude(
{
if ((data+off)[0] != excluded_descid)
tmp.push_back(data+off);
MPEGDescriptor desc(data+off);
off += desc.DescriptorLength() + 2;
MPEGDescriptor desc(data+off, len-off);
if (!desc.IsValid())
{
if ((data+off)[0] != excluded_descid)
tmp.pop_back();
break;
}
off += desc.size();
}
return tmp;
}
Expand All @@ -48,7 +59,14 @@ desc_list_t MPEGDescriptor::ParseOnlyInclude(
{
if ((data+off)[0] == excluded_descid)
tmp.push_back(data+off);
MPEGDescriptor desc(data+off);
MPEGDescriptor desc(data+off, len-off);
if (!desc.IsValid())
{
if ((data+off)[0] == excluded_descid)
tmp.pop_back();
break;
}
off += desc.size();
off += desc.DescriptorLength() + 2;
}
return tmp;
Expand Down Expand Up @@ -350,59 +368,81 @@ QString MPEGDescriptor::toString() const
QString str;

if (DescriptorID::registration == DescriptorTag())
str = RegistrationDescriptor(_data).toString();
str = RegistrationDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::iso_639_language == DescriptorTag())
str = ISO639LanguageDescriptor(_data).toString();
str = ISO639LanguageDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::avc_video == DescriptorTag())
str = AVCVideoDescriptor(_data).toString();
str = AVCVideoDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::ac3_audio_stream == DescriptorTag())
str = AudioStreamDescriptor(_data).toString();
str = AudioStreamDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::caption_service == DescriptorTag())
str = CaptionServiceDescriptor(_data).toString();
str = CaptionServiceDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::extended_channel_name == DescriptorTag())
str = ExtendedChannelNameDescriptor(_data).toString();
str = ExtendedChannelNameDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::component_name == DescriptorTag())
str = ComponentNameDescriptor(_data).toString();
str = ComponentNameDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::conditional_access == DescriptorTag())
str = ConditionalAccessDescriptor(_data).toString();
str = ConditionalAccessDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::network_name == DescriptorTag())
str = NetworkNameDescriptor(_data).toString();
str = NetworkNameDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::linkage == DescriptorTag())
str = LinkageDescriptor(_data).toString();
str = LinkageDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::adaptation_field_data == DescriptorTag())
str = AdaptationFieldDataDescriptor(_data).toString();
str = AdaptationFieldDataDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::ancillary_data == DescriptorTag())
str = AncillaryDataDescriptor(_data).toString();
str = AncillaryDataDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::cable_delivery_system == DescriptorTag())
str = CableDeliverySystemDescriptor(_data).toString();
str = CableDeliverySystemDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::satellite_delivery_system == DescriptorTag())
str = SatelliteDeliverySystemDescriptor(_data).toString();
str = SatelliteDeliverySystemDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::terrestrial_delivery_system == DescriptorTag())
str = TerrestrialDeliverySystemDescriptor(_data).toString();
str = TerrestrialDeliverySystemDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::frequency_list == DescriptorTag())
str = FrequencyListDescriptor(_data).toString();
str = FrequencyListDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::service == DescriptorTag())
str = ServiceDescriptor(_data).toString();
str = ServiceDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::stream_identifier == DescriptorTag())
str = StreamIdentifierDescriptor(_data).toString();
str = StreamIdentifierDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::default_authority == DescriptorTag())
str = DefaultAuthorityDescriptor(_data).toString();
str = DefaultAuthorityDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::bouquet_name == DescriptorTag())
str = BouquetNameDescriptor(_data).toString();
str = BouquetNameDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::country_availability == DescriptorTag())
str = CountryAvailabilityDescriptor(_data).toString();
str = CountryAvailabilityDescriptor(
_data, DescriptorLength()+2).toString();
else if (DescriptorID::service_list == DescriptorTag())
str = ServiceListDescriptor(_data).toString();
str = ServiceListDescriptor(
_data, DescriptorLength()+2).toString();
/// POSSIBLY UNSAFE ! -- begin
else if (PrivateDescriptorID::dvb_uk_channel_list == DescriptorTag())
str = UKChannelListDescriptor(_data).toString();
str = UKChannelListDescriptor(_data, DescriptorLength()+2).toString();
/// POSSIBLY UNSAFE ! -- end
else
{
str.append(QString("%1 Descriptor (0x%2)")
.arg(DescriptorTagString())
.arg(int(DescriptorTag()), 0, 16));
str.append(QString(" length(%1)").arg(int(DescriptorLength())));
str = QString("%1 Descriptor (0x%2) length(%3)")
.arg(DescriptorTagString())
.arg(DescriptorTag(),2,16,QChar('0'))
.arg(DescriptorLength());
//for (uint i=0; i<DescriptorLength(); i++)
// str.append(QString(" 0x%1").arg(int(_data[i+2]), 0, 16));
}
Expand Down
91 changes: 54 additions & 37 deletions mythtv/libs/libmythtv/mpeg/mpegdescriptors.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@
#ifndef _MPEG_DESCRIPTORS_H_
#define _MPEG_DESCRIPTORS_H_

// ANSI C headers
#include <cassert>

// C++ headers
#include <vector>
using namespace std;
Expand Down Expand Up @@ -200,12 +197,46 @@ class MPEGDescriptor
public:
operator const unsigned char*() const { return _data; }

MPEGDescriptor(const unsigned char* data) : _data(data) { ; }
MPEGDescriptor(const unsigned char *data, int len = 300) : _data(data)
{
if ((len < 2) || (int(DescriptorLength()) + 2) > len)
_data = NULL;
else if (!Parse())
_data = NULL;
}
MPEGDescriptor(const unsigned char *data,
int len, uint tag) : _data(data)
{
if ((len < 2) || (int(DescriptorLength()) + 2) > len)
_data = NULL;
else if (DescriptorTag() != tag)
_data = NULL;
else if (!Parse())
_data = NULL;
}
MPEGDescriptor(const unsigned char *data,
int len, uint tag, uint req_desc_len) : _data(data)
{
if ((len < 2) || (int(DescriptorLength()) + 2) > len)
_data = NULL;
else if (DescriptorTag() != tag)
_data = NULL;
else if (DescriptorLength() != req_desc_len)
_data = NULL;
else if (!Parse())
_data = NULL;
}
virtual ~MPEGDescriptor() {}

uint DescriptorTag() const { return _data[0]; }
QString DescriptorTagString() const;
uint DescriptorLength() const { return _data[1]; }
bool IsValid(void) const { return _data; }
uint size(void) const { return DescriptorLength() + 2; }

uint DescriptorTag(void) const { return _data[0]; }
QString DescriptorTagString(void) const;
uint DescriptorLength(void) const { return _data[1]; }

virtual QString toString(void) const;

static desc_list_t Parse(const unsigned char* data, uint len);
static desc_list_t ParseAndExclude(const unsigned char* data, uint len,
int descriptorid);
Expand All @@ -220,26 +251,18 @@ class MPEGDescriptor
static desc_list_t FindBestMatches(
const desc_list_t &parsed, uint desc_tag, QMap<uint,uint> &langPref);

virtual QString toString() const;
protected:
const unsigned char* _data;
virtual bool Parse(void) { return true; }

const unsigned char *_data;
};

// a_52a.pdf p119, Table A1
class RegistrationDescriptor : public MPEGDescriptor
{
public:
RegistrationDescriptor(const unsigned char* data) : MPEGDescriptor(data)
{
assert(DescriptorID::registration == DescriptorTag());
if (0x04 != DescriptorLength())
{
#if 0
LOG(VB_GENERAL, LOG_ERR,
"Registration Descriptor length != 4 !!!!");
#endif
}
}
RegistrationDescriptor(const unsigned char *data, int len = 300) :
MPEGDescriptor(data, len, DescriptorID::registration, 4) { }

uint FormatIdentifier(void) const
{ return (_data[2]<<24) | (_data[3]<<16) | (_data[4]<<8) | _data[5]; }
Expand All @@ -263,24 +286,22 @@ class RegistrationDescriptor : public MPEGDescriptor
class ConditionalAccessDescriptor : public MPEGDescriptor
{
public:
ConditionalAccessDescriptor(const unsigned char* data) : MPEGDescriptor(data)
{
assert(DescriptorID::conditional_access == DescriptorTag());
}
ConditionalAccessDescriptor(const unsigned char *data, int len = 300) :
MPEGDescriptor(data, len, DescriptorID::conditional_access) { }

uint SystemID(void) const { return _data[2] << 8 | _data[3]; }
uint PID(void) const { return (_data[4] & 0x1F) << 8 | _data[5]; }
uint DataSize(void) const { return DescriptorLength() - 4; }
const unsigned char* Data(void) const { return _data+6; }
const unsigned char *Data(void) const { return _data+6; }
QString toString() const;
};

class ISO639LanguageDescriptor : public MPEGDescriptor
{
public:
ISO639LanguageDescriptor(const unsigned char* data) : MPEGDescriptor(data)
{
assert(DescriptorID::ISO_639_language == DescriptorTag());
}
ISO639LanguageDescriptor(const unsigned char *data, int len = 300) :
MPEGDescriptor(data, len, DescriptorID::iso_639_language) { }

const unsigned char* CodeRaw() const { return &_data[2]; }

int LanguageKey(void) const
Expand All @@ -298,13 +319,11 @@ class ISO639LanguageDescriptor : public MPEGDescriptor
class AVCVideoDescriptor : public MPEGDescriptor
{
public:
AVCVideoDescriptor(const unsigned char* data) : MPEGDescriptor(data)
{
AVCVideoDescriptor(const unsigned char *data, int len = 300) :
MPEGDescriptor(data, len, DescriptorID::avc_video) { }
// Name bits loc expected value
// descriptor_tag 8 0.0 0x
assert(DescriptorID::avc_video == DescriptorTag());
// descriptor_length 8 1.0
}
// profile_idc 8 2.0
uint ProfileIDC(void) const { return _data[2]; }
// constraint_set0_flag 1 3.0
Expand All @@ -328,13 +347,11 @@ class AVCVideoDescriptor : public MPEGDescriptor
/// ISO 13818-1:2000/Amd.3:2004 page 12
class AVCTimingAndHRDDescriptor : public MPEGDescriptor
{
AVCTimingAndHRDDescriptor(const unsigned char* data) : MPEGDescriptor(data)
{
AVCTimingAndHRDDescriptor(const unsigned char *data, int len = 300) :
MPEGDescriptor(data, len, DescriptorID::avc_timing_and_hrd) { }
// Name bits loc expected value
// descriptor_tag 8 0.0 0x
assert(DescriptorID::avc_timing__hrd == DescriptorTag());
// descriptor_length 8 1.0
}
// hrd_management_valid 1 2.0
bool HRDManagementValid(void) const { return _data[2]&0x80; }
// reserved 6 2.1
Expand Down
3 changes: 2 additions & 1 deletion mythtv/libs/libmythtv/mpeg/premieredescriptors.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#include "premieredescriptors.h"
#include "dvbdescriptors.h"

void PremiereContentTransmissionDescriptor::Parse(void)
bool PremiereContentTransmissionDescriptor::Parse(void)
{
_transmission_count = 0;
_date_ptrs.clear();
Expand All @@ -20,6 +20,7 @@ void PremiereContentTransmissionDescriptor::Parse(void)
}
dataptr += 3 + starttime_no;
}
return true;
}


Expand Down
18 changes: 11 additions & 7 deletions mythtv/libs/libmythtv/mpeg/premieredescriptors.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,25 @@
#include <stdint.h>
#include <inttypes.h>

// C++ headers
#include <vector>
using namespace std;

// Qt headers
#include <QString>
#include <QDateTime>

// MythTV headers
#include "mpegdescriptors.h"

class PremiereContentTransmissionDescriptor : public MPEGDescriptor
{
public:
PremiereContentTransmissionDescriptor(const unsigned char* data) : MPEGDescriptor(data)
PremiereContentTransmissionDescriptor(
const unsigned char *data, int len = 300) :
MPEGDescriptor(
data, len, PrivateDescriptorID::premiere_content_transmission)
{
Parse();
// assert(DescriptorID::transmission == DescriptorTag());
}

// descriptor_tag 8 0.0
Expand All @@ -42,11 +49,8 @@ class PremiereContentTransmissionDescriptor : public MPEGDescriptor

QDateTime StartTimeUTC(uint i) const;

QString toString() const
{ return QString("PremiereContentTransmissionDescriptor(stub)"); }

private:
void Parse(void);
virtual bool Parse(void);

uint _transmission_count;
mutable vector<const uint8_t*> _date_ptrs;
Expand Down