00001
00002
00003 #include "scanstreamdata.h"
00004 #include "atsctables.h"
00005 #include "dvbtables.h"
00006
00007 ScanStreamData::ScanStreamData(bool no_default_pid) :
00008 MPEGStreamData(-1, true),
00009 ATSCStreamData(-1,-1, true),
00010 DVBStreamData(0, 0, -1, true),
00011 dvb_uk_freesat_si(false),
00012 m_no_default_pid(no_default_pid)
00013 {
00014 if (m_no_default_pid)
00015 _pids_listening.clear();
00016 }
00017
00018 ScanStreamData::~ScanStreamData() { ; }
00019
00023 bool ScanStreamData::IsRedundant(uint pid, const PSIPTable &psip) const
00024 {
00025
00026 if (dvb_uk_freesat_si &&
00027 (psip.TableID() == TableID::BAT || psip.TableID() == TableID::SDTo))
00028 return pid != FREESAT_SI_PID;
00029
00030 return (ATSCStreamData::IsRedundant(pid,psip) ||
00031 DVBStreamData::IsRedundant(pid,psip));
00032 }
00033
00037 bool ScanStreamData::HandleTables(uint pid, const PSIPTable &psip)
00038 {
00039 bool h0 = ATSCStreamData::HandleTables(pid, psip);
00040 bool h1 = DVBStreamData::HandleTables(pid, psip);
00041 return h0 || h1;
00042 }
00043
00044 void ScanStreamData::Reset(void)
00045 {
00046 MPEGStreamData::Reset(-1);
00047 ATSCStreamData::Reset(-1,-1);
00048 DVBStreamData::Reset(0,0,-1);
00049
00050 if (m_no_default_pid)
00051 {
00052 _pids_listening.clear();
00053 return;
00054 }
00055
00056 AddListeningPID(MPEG_PAT_PID);
00057 AddListeningPID(ATSC_PSIP_PID);
00058 AddListeningPID(DVB_NIT_PID);
00059 AddListeningPID(DVB_SDT_PID);
00060 if (dvb_uk_freesat_si)
00061 AddListeningPID(FREESAT_SI_PID);
00062 }
00063
00064 QString ScanStreamData::GetSIStandard(QString guess) const
00065 {
00066 if (HasCachedMGT())
00067 return "atsc";
00068
00069 if (HasCachedAnyNIT())
00070 return "dvb";
00071
00072 QMutexLocker locker(&_cache_lock);
00073
00074 pmt_cache_t::const_iterator it = _cached_pmts.begin();
00075 for (; it != _cached_pmts.end(); ++it)
00076 {
00077 ProgramMapTable *pmt = *it;
00078
00079 for (uint i = 0; (guess != "dvb") && (i < pmt->StreamCount()); i++)
00080 {
00081 if (StreamID::OpenCableVideo == pmt->StreamType(i))
00082 return "opencable";
00083 }
00084
00085 desc_list_t descs = MPEGDescriptor::ParseOnlyInclude(
00086 pmt->ProgramInfo(), pmt->ProgramInfoLength(),
00087 DescriptorID::registration);
00088
00089 for (uint i = 0; i < descs.size(); i++)
00090 {
00091 RegistrationDescriptor reg(descs[i]);
00092 if (reg.FormatIdentifierString() == "SCTE")
00093 return "opencable";
00094 }
00095 }
00096
00097 return "mpeg";
00098 }
00099
00100
00101 bool ScanStreamData::DeleteCachedTable(PSIPTable *psip) const
00102 {
00103 if (!psip)
00104 return false;
00105
00106 if (ATSCStreamData::DeleteCachedTable(psip))
00107 return true;
00108 else
00109 return DVBStreamData::DeleteCachedTable(psip);
00110 }