00001
00002
00003 #include "scanstreamdata.h"
00004 #include "atsctables.h"
00005 #include "dvbtables.h"
00006
00007 ScanStreamData::ScanStreamData()
00008 : MPEGStreamData(-1, true),
00009 ATSCStreamData(-1,-1, true),
00010 DVBStreamData(0, 0, -1, true)
00011 {
00012 }
00013
00014 ScanStreamData::~ScanStreamData() { ; }
00015
00019 bool ScanStreamData::IsRedundant(uint pid, const PSIPTable &psip) const
00020 {
00021 return (ATSCStreamData::IsRedundant(pid,psip) ||
00022 DVBStreamData::IsRedundant(pid,psip));
00023 }
00024
00028 bool ScanStreamData::HandleTables(uint pid, const PSIPTable &psip)
00029 {
00030 bool h0 = ATSCStreamData::HandleTables(pid, psip);
00031 bool h1 = DVBStreamData::HandleTables(pid, psip);
00032 return h0 || h1;
00033 }
00034
00035 void ScanStreamData::Reset(void)
00036 {
00037 MPEGStreamData::Reset(-1);
00038 ATSCStreamData::Reset(-1,-1);
00039 DVBStreamData::Reset(0,0,-1);
00040
00041 AddListeningPID(MPEG_PAT_PID);
00042 AddListeningPID(ATSC_PSIP_PID);
00043 AddListeningPID(DVB_NIT_PID);
00044 AddListeningPID(DVB_SDT_PID);
00045 }
00046
00047 QString ScanStreamData::GetSIStandard(QString guess) const
00048 {
00049 if (HasCachedMGT())
00050 return "atsc";
00051
00052 if (HasCachedAnyNIT())
00053 return "dvb";
00054
00055 QMutexLocker locker(&_cache_lock);
00056
00057 pmt_cache_t::const_iterator it = _cached_pmts.begin();
00058 for (; it != _cached_pmts.end(); ++it)
00059 {
00060 ProgramMapTable *pmt = *it;
00061
00062 for (uint i = 0; (guess != "dvb") && (i < pmt->StreamCount()); i++)
00063 {
00064 if (StreamID::OpenCableVideo == pmt->StreamType(i))
00065 return "opencable";
00066 }
00067
00068 desc_list_t descs = MPEGDescriptor::ParseOnlyInclude(
00069 pmt->ProgramInfo(), pmt->ProgramInfoLength(),
00070 DescriptorID::registration);
00071
00072 for (uint i = 0; i < descs.size(); i++)
00073 {
00074 RegistrationDescriptor reg(descs[i]);
00075 if (reg.FormatIdentifierString() == "CUEI")
00076 return "opencable";
00077 }
00078 }
00079
00080 return "mpeg";
00081 }
00082
00083
00084 void ScanStreamData::DeleteCachedTable(PSIPTable *psip) const
00085 {
00086 if (!psip)
00087 return;
00088
00089 ATSCStreamData::DeleteCachedTable(psip);
00090 if (psip->pesdata())
00091 DVBStreamData::DeleteCachedTable(psip);
00092 }