From c7ad89a7eb999982c702eda9347603a9a7a1f532 Mon Sep 17 00:00:00 2001 From: Klaas de Waal Date: Sat, 2 Nov 2019 11:46:10 +0100 Subject: [PATCH] Store channel service_type in database Store the service type of the channel in database table channel. The service type is obtained from the service descriptor as described in the DVB Bluebook A038, Feb 2019, pages 82 and 83. --- mythtv/libs/libmythtv/channelinfo.cpp | 1 + mythtv/libs/libmythtv/channelinfo.h | 5 ++- .../libmythtv/channelscan/channelimporter.cpp | 6 ++-- .../libmythtv/channelscan/channelscan_sm.cpp | 26 ++++++++------ .../libs/libmythtv/channelscan/scaninfo.cpp | 6 ++-- mythtv/libs/libmythtv/channelutil.cpp | 36 +++++++++++-------- mythtv/libs/libmythtv/channelutil.h | 6 ++-- mythtv/libs/libmythtv/dtvmultiplex.cpp | 6 ++-- 8 files changed, 58 insertions(+), 34 deletions(-) diff --git a/mythtv/libs/libmythtv/channelinfo.cpp b/mythtv/libs/libmythtv/channelinfo.cpp index 54966b072a7..2d6ea18e6b6 100644 --- a/mythtv/libs/libmythtv/channelinfo.cpp +++ b/mythtv/libs/libmythtv/channelinfo.cpp @@ -44,6 +44,7 @@ ChannelInfo::ChannelInfo(const ChannelInfo &other) m_useonairguide = other.m_useonairguide; m_mplexid = (other.m_mplexid == 32767) ? 0 : other.m_mplexid; m_serviceid = other.m_serviceid; + m_service_type = other.m_service_type; m_atsc_major_chan = other.m_atsc_major_chan; m_atsc_minor_chan = other.m_atsc_minor_chan; m_last_record = other.m_last_record; diff --git a/mythtv/libs/libmythtv/channelinfo.h b/mythtv/libs/libmythtv/channelinfo.h index 6be9ec37f6d..6cce8f1b6a1 100644 --- a/mythtv/libs/libmythtv/channelinfo.h +++ b/mythtv/libs/libmythtv/channelinfo.h @@ -99,6 +99,7 @@ class MTV_PUBLIC ChannelInfo uint m_mplexid {0}; uint m_serviceid {0}; + uint m_service_type {0}; uint m_atsc_major_chan {0}; uint m_atsc_minor_chan {0}; @@ -150,7 +151,7 @@ class MTV_PUBLIC ChannelInsertInfo bool _is_encrypted, bool _is_data_service, bool _is_audio_service, bool _is_opencable, bool _could_be_opencable, int _decryption_status, - const QString& _default_authority) : + const QString& _default_authority, uint _service_type) : m_db_mplexid(_db_mplexid), m_source_id(_source_id), m_channel_id(_channel_id), @@ -158,6 +159,7 @@ class MTV_PUBLIC ChannelInsertInfo m_service_name(_service_name), m_chan_num(_chan_num), m_service_id(_service_id), + m_service_type(_service_type), m_atsc_major_channel(_atsc_major_channel), m_atsc_minor_channel(_atsc_minor_channel), m_use_on_air_guide(_use_on_air_guide), @@ -205,6 +207,7 @@ class MTV_PUBLIC ChannelInsertInfo QString m_service_name; QString m_chan_num; uint m_service_id {0}; + uint m_service_type {0}; uint m_atsc_major_channel {0}; uint m_atsc_minor_channel {0}; bool m_use_on_air_guide {false}; diff --git a/mythtv/libs/libmythtv/channelscan/channelimporter.cpp b/mythtv/libs/libmythtv/channelscan/channelimporter.cpp index 150cb9ba5e8..375bf612bc4 100644 --- a/mythtv/libs/libmythtv/channelscan/channelimporter.cpp +++ b/mythtv/libs/libmythtv/channelscan/channelimporter.cpp @@ -656,7 +656,8 @@ ScanDTVTransportList ChannelImporter::InsertChannels( QString(), chan.m_format, QString(), - chan.m_default_authority); + chan.m_default_authority, + chan.m_service_type); if (!transports[i].m_iptv_tuning.GetDataURL().isEmpty()) ChannelUtil::CreateIPTVTuningData(chan.m_channel_id, @@ -825,7 +826,8 @@ ScanDTVTransportList ChannelImporter::UpdateChannels( QString(), chan.m_format, QString(), - chan.m_default_authority); + chan.m_default_authority, + chan.m_service_type); } if (updated) diff --git a/mythtv/libs/libmythtv/channelscan/channelscan_sm.cpp b/mythtv/libs/libmythtv/channelscan/channelscan_sm.cpp index 724bfdbadab..d9a10141f5d 100644 --- a/mythtv/libs/libmythtv/channelscan/channelscan_sm.cpp +++ b/mythtv/libs/libmythtv/channelscan/channelscan_sm.cpp @@ -1192,6 +1192,18 @@ static void update_info(ChannelInsertInfo &info, service_name = desc->ServiceName(); if (service_name.trimmed().isEmpty()) service_name.clear(); + + info.m_service_type = desc->ServiceType(); + info.m_is_data_service = + (desc && !desc->IsDTV() && !desc->IsDigitalAudio()); + info.m_is_audio_service = (desc && desc->IsDigitalAudio()); + delete desc; + } + else + { + LOG(VB_CHANSCAN, LOG_INFO, "ChannelScanSM: " + + QString("No ServiceDescriptor for onid %1 tid %2 sid %3") + .arg(sdt->OriginalNetworkID()).arg(sdt->TSID()).arg(sdt->ServiceID(i))); } if (info.m_callsign.isEmpty()) @@ -1206,16 +1218,10 @@ static void update_info(ChannelInsertInfo &info, info.m_hidden = false; info.m_hidden_in_guide = false; - - info.m_is_data_service = - (desc && !desc->IsDTV() && !desc->IsDigitalAudio()); - info.m_is_audio_service = (desc && desc->IsDigitalAudio()); - delete desc; - - info.m_service_id = sdt->ServiceID(i); - info.m_sdt_tsid = sdt->TSID(); - info.m_orig_netid = sdt->OriginalNetworkID(); - info.m_in_sdt = true; + info.m_service_id = sdt->ServiceID(i); + info.m_sdt_tsid = sdt->TSID(); + info.m_orig_netid = sdt->OriginalNetworkID(); + info.m_in_sdt = true; desc_list_t parsed = MPEGDescriptor::Parse(sdt->ServiceDescriptors(i), diff --git a/mythtv/libs/libmythtv/channelscan/scaninfo.cpp b/mythtv/libs/libmythtv/channelscan/scaninfo.cpp index afb75189ffe..ec5ef262150 100644 --- a/mythtv/libs/libmythtv/channelscan/scaninfo.cpp +++ b/mythtv/libs/libmythtv/channelscan/scaninfo.cpp @@ -118,7 +118,8 @@ ScanDTVTransportList LoadScan(uint scanid) " in_pat, in_pmt, in_vct, " " in_nit, in_sdt, is_encrypted, " " is_data_service, is_audio_service, is_opencable, " - " could_be_opencable, decryption_status, default_authority " + " could_be_opencable, decryption_status, default_authority, " + " service_type " "FROM channelscan_channel " "WHERE transportid = :TRANSPORTID"); query2.bindValue(":TRANSPORTID", query.value(15).toUInt()); @@ -178,7 +179,8 @@ ScanDTVTransportList LoadScan(uint scanid) query2.value(32).toBool()/*is_opencable*/, query2.value(33).toBool()/*could_be_opencable*/, query2.value(34).toInt()/*decryption_status*/, - query2.value(35).toString()/*default_authority*/); + query2.value(35).toString()/*default_authority*/, + query2.value(36).toUInt()/*service_type*/); mux.m_channels.push_back(chan); } diff --git a/mythtv/libs/libmythtv/channelutil.cpp b/mythtv/libs/libmythtv/channelutil.cpp index 18644525d66..8eabaa86956 100644 --- a/mythtv/libs/libmythtv/channelutil.cpp +++ b/mythtv/libs/libmythtv/channelutil.cpp @@ -1482,7 +1482,8 @@ bool ChannelUtil::CreateChannel(uint db_mplexid, QString icon, QString format, QString xmltvid, - QString default_authority) + QString default_authority, + uint service_type) { MSqlQuery query(MSqlQuery::InitCon()); @@ -1498,7 +1499,8 @@ bool ChannelUtil::CreateChannel(uint db_mplexid, qstr += " atsc_major_chan, atsc_minor_chan, " " useonairguide, visible, tvformat, " - " icon, xmltvid, default_authority) " + " icon, xmltvid, default_authority, " + " service_type) " "VALUES " " (:CHANID, :CHANNUM, :SOURCEID, " " :CALLSIGN, :NAME, :SERVICEID, "; @@ -1507,7 +1509,8 @@ bool ChannelUtil::CreateChannel(uint db_mplexid, qstr += " :MAJORCHAN, :MINORCHAN, " " :USEOAG, :VISIBLE, :TVFORMAT, " - " :ICON, :XMLTVID, :AUTHORITY) "; + " :ICON, :XMLTVID, :AUTHORITY, " + " :SERVICETYPE ) "; query.prepare(qstr); @@ -1531,10 +1534,11 @@ bool ChannelUtil::CreateChannel(uint db_mplexid, query.bindValue(":FREQID", freqid); QString tvformat = (atsc_minor_channel > 0) ? "ATSC" : std::move(format); - query.bindValueNoNull(":TVFORMAT", tvformat); - query.bindValueNoNull(":ICON", icon); - query.bindValueNoNull(":XMLTVID", xmltvid); - query.bindValueNoNull(":AUTHORITY", default_authority); + query.bindValueNoNull(":TVFORMAT", tvformat); + query.bindValueNoNull(":ICON", icon); + query.bindValueNoNull(":XMLTVID", xmltvid); + query.bindValueNoNull(":AUTHORITY", default_authority); + query.bindValue (":SERVICETYPE", service_type); if (!query.exec() || !query.isActive()) { @@ -1560,7 +1564,8 @@ bool ChannelUtil::UpdateChannel(uint db_mplexid, const QString& icon, QString format, const QString& xmltvid, - const QString& default_authority) + const QString& default_authority, + uint service_type) { if (!channel_id) return false; @@ -1574,7 +1579,7 @@ bool ChannelUtil::UpdateChannel(uint db_mplexid, " atsc_major_chan = :MAJORCHAN, atsc_minor_chan = :MINORCHAN, " " callsign = :CALLSIGN, name = :NAME, " " sourceid = :SOURCEID, useonairguide = :USEOAG, " - " visible = :VISIBLE " + " visible = :VISIBLE, service_type = :SERVICETYPE " "WHERE chanid=:CHANID") .arg((!set_channum) ? "" : "channum = :CHANNUM, ") .arg((freqid.isEmpty()) ? "" : "freqid = :FREQID, ") @@ -1596,13 +1601,14 @@ bool ChannelUtil::UpdateChannel(uint db_mplexid, query.bindValueNoNull(":CALLSIGN", callsign); query.bindValueNoNull(":NAME", service_name); - query.bindValue(":MPLEXID", db_mplexid); + query.bindValue(":MPLEXID", db_mplexid); + query.bindValue(":SERVICEID", service_id); + query.bindValue(":MAJORCHAN", atsc_major_channel); + query.bindValue(":MINORCHAN", atsc_minor_channel); + query.bindValue(":USEOAG", use_on_air_guide); + query.bindValue(":VISIBLE", !hidden); + query.bindValue(":SERVICETYPE", service_type); - query.bindValue(":SERVICEID", service_id); - query.bindValue(":MAJORCHAN", atsc_major_channel); - query.bindValue(":MINORCHAN", atsc_minor_channel); - query.bindValue(":USEOAG", use_on_air_guide); - query.bindValue(":VISIBLE", !hidden); (void) hidden_in_guide; // MythTV can't hide the channel in just the guide. if (!freqid.isEmpty()) diff --git a/mythtv/libs/libmythtv/channelutil.h b/mythtv/libs/libmythtv/channelutil.h index 758807ac3e2..f999f4d98bf 100644 --- a/mythtv/libs/libmythtv/channelutil.h +++ b/mythtv/libs/libmythtv/channelutil.h @@ -117,7 +117,8 @@ class MTV_PUBLIC ChannelUtil QString icon = QString(), QString format = "Default", QString xmltvid = QString(), - QString default_authority = QString()); + QString default_authority = QString(), + uint service_type = 0); static bool UpdateChannel(uint db_mplexid, uint source_id, @@ -135,7 +136,8 @@ class MTV_PUBLIC ChannelUtil const QString& icon = QString(), QString format = QString(), const QString& xmltvid = QString(), - const QString& default_authority = QString()); + const QString& default_authority = QString(), + uint service_type = 0); static bool CreateIPTVTuningData( uint channel_id, const IPTVTuningData &tuning) diff --git a/mythtv/libs/libmythtv/dtvmultiplex.cpp b/mythtv/libs/libmythtv/dtvmultiplex.cpp index cc364409085..5cd092095bb 100644 --- a/mythtv/libs/libmythtv/dtvmultiplex.cpp +++ b/mythtv/libs/libmythtv/dtvmultiplex.cpp @@ -569,7 +569,8 @@ bool ScanDTVTransport::FillFromDB(DTVTunerType type, uint mplexid) " c.serviceid, c.atsc_major_chan, c.atsc_minor_chan, " " c.useonairguide, c.visible, c.freqid, " " c.icon, c.tvformat, c.xmltvid, " - " d.transportid, d.networkid, c.default_authority " + " d.transportid, d.networkid, c.default_authority," + " c.service_type " "FROM channel AS c, dtv_multiplex AS d " "WHERE c.mplexid = :MPLEXID AND" " c.mplexid = d.mplexid"); @@ -600,7 +601,8 @@ bool ScanDTVTransport::FillFromDB(DTVTunerType type, uint mplexid) false, false, false, false, false, false, false, false, false, false, false, 0, - query.value(17).toString() /* default_authority */); + query.value(17).toString(), /* default_authority */ + query.value(18).toUInt()); /* service_type */ m_channels.push_back(chan); }