Ticket #11487: iptv-http-ts-streaming.patch
File iptv-http-ts-streaming.patch, 11.9 KB (added by , 11 years ago) |
---|
-
mythtv/libs/libmythtv/iptv/iptvchannelfetcher.cpp
diff --git a/mythtv/libs/libmythtv/iptv/iptvchannelfetcher.cpp b/mythtv/libs/libmythtv/iptv/iptvchannelfetcher.cpp index 57ba817..9889c4c 100644
a b void IPTVChannelFetcher::run(void) 141 141 QString channum = it.key(); 142 142 QString name = (*it).m_name; 143 143 QString xmltvid = (*it).m_xmltvid.isEmpty() ? "" : (*it).m_xmltvid; 144 uint serviceid = (*it).m_serviceid; 144 145 QString msg = QObject::tr("Channel #%1 : %2").arg(channum).arg(name); 145 146 146 147 int chanid = ChannelUtil::GetChanID(_sourceid, channum); … … void IPTVChannelFetcher::run(void) 154 155 chanid = ChannelUtil::CreateChanID(_sourceid, channum); 155 156 ChannelUtil::CreateChannel( 156 157 0, _sourceid, chanid, name, name, channum, 157 0, 0, 0, false, false, false, QString::null,158 serviceid, 0, 0, false, false, false, QString::null, 158 159 QString::null, "Default", xmltvid); 159 160 } 160 161 else … … void IPTVChannelFetcher::run(void) 166 167 } 167 168 ChannelUtil::UpdateChannel( 168 169 0, _sourceid, chanid, name, name, channum, 169 0, 0, 0, false, false, false, QString::null,170 serviceid, 0, 0, false, false, false, QString::null, 170 171 QString::null, "Default", xmltvid); 171 172 } 172 173 … … static bool parse_chan_info(const QString &rawdata, 339 340 { 340 341 // #EXTINF:0,2 - France 2 <-- duration,channum - channame 341 342 // #EXTMYTHTV:xmltvid=C2.telepoche.com <-- optional line (myth specific) 343 // #EXTMYTHTV2:serviceid=1234 <-- optional if missing 1 is used (mythtv specific) 342 344 // #... <-- ignored comments 343 345 // rtsp://maiptv.iptv.fr/iptvtv/201 <-- url 344 346 345 347 QString name; 346 348 QString xmltvid; 349 uint serviceid=1; 347 350 while (true) 348 351 { 349 352 QString line = rawdata.section("\n", lineNum, lineNum); … … static bool parse_chan_info(const QString &rawdata, 365 368 xmltvid = data.mid(data.indexOf('=')+1); 366 369 } 367 370 } 371 else if (line.startsWith("#EXTMYTHTV2:")) 372 { 373 QString data = line.mid(line.indexOf(':')+1); 374 if (data.startsWith("serviceid=")) 375 { 376 serviceid = data.mid(data.indexOf('=')+1).toUInt(); 377 } 378 } 368 379 else 369 380 { 370 381 // Just ignore other comments … … static bool parse_chan_info(const QString &rawdata, 375 386 if (name.isEmpty()) 376 387 return false; 377 388 QString url = line; 378 info = IPTVChannelInfo(name, url, xmltvid );389 info = IPTVChannelInfo(name, url, xmltvid, serviceid); 379 390 return true; 380 391 } 381 392 } -
mythtv/libs/libmythtv/iptv/iptvchannelinfo.h
diff --git a/mythtv/libs/libmythtv/iptv/iptvchannelinfo.h b/mythtv/libs/libmythtv/iptv/iptvchannelinfo.h index d18014b..23544c15 100644
a b class IPTVChannelInfo 20 20 21 21 IPTVChannelInfo(const QString &name, 22 22 const QString &url, 23 const QString &xmltvid) : 24 m_name(name), m_url(url), m_xmltvid(xmltvid) 23 const QString &xmltvid, 24 const uint serviceid) : 25 m_name(name), m_url(url), m_xmltvid(xmltvid),m_serviceid(serviceid) 25 26 { 26 27 } 27 28 … … class IPTVChannelInfo 40 41 QString m_name; 41 42 QString m_url; 42 43 QString m_xmltvid; 44 uint m_serviceid; 43 45 }; 44 46 45 47 typedef QMap<QString,IPTVChannelInfo> fbox_chan_map_t; -
mythtv/libs/libmythtv/iptv/iptvfeederwrapper.cpp
diff --git a/mythtv/libs/libmythtv/iptv/iptvfeederwrapper.cpp b/mythtv/libs/libmythtv/iptv/iptvfeederwrapper.cpp index 16eb5c7..6c8e35d 100644
a b using namespace std; 17 17 #include "iptvfeederrtp.h" 18 18 #include "iptvfeederfile.h" 19 19 #include "iptvfeederhls.h" 20 #include "iptvfeederhttp.h" 20 21 #include "mythcontext.h" 21 22 #include "mythlogging.h" 22 23 … … bool IPTVFeederWrapper::InitFeeder(const QString &url) 74 75 { 75 76 tmp_feeder = new IPTVFeederHLS(); 76 77 } 78 else if(IPTVFeederHTTP::IsHTTP(url)) 79 { 80 tmp_feeder = new IPTVFeederHTTP(); 81 } 77 82 else 78 83 { 79 84 LOG(VB_RECORD, LOG_ERR, LOC + -
mythtv/libs/libmythtv/iptvchannel.cpp
diff --git a/mythtv/libs/libmythtv/iptvchannel.cpp b/mythtv/libs/libmythtv/iptvchannel.cpp index bb7385e..822f8b9 100644
a b bool IPTVChannel::SetChannelByString(const QString &channum) 95 95 return false; 96 96 97 97 // Verify that channel exists 98 if (!GetChanInfo(channum).isValid()) 98 IPTVChannelInfo chaninfo=GetChanInfo(channum); 99 if (!chaninfo.isValid()) 99 100 { 100 101 LOG(VB_GENERAL, LOG_ERR, LOC + 101 102 QString("SetChannelByString(%1)").arg(channum) + … … bool IPTVChannel::SetChannelByString(const QString &channum) 110 111 // Set the dtv channel info for any additional multiplex tuning 111 112 SetDTVInfo(/*atsc_major*/ 0, /*atsc_minor*/ 0, 112 113 /*netid*/ 0, 113 /*tsid*/ 0, /*mpeg_prog_num*/ 1);114 /*tsid*/ 0, /*mpeg_prog_num*/ chaninfo.m_serviceid); 114 115 115 116 HandleScript(channum /* HACK treat channum as freqid */); 116 117 -
mythtv/libs/libmythtv/libmythtv.pro
diff --git a/mythtv/libs/libmythtv/libmythtv.pro b/mythtv/libs/libmythtv/libmythtv.pro index c815431..b23aa5a 100644
a b using_backend { 567 567 HEADERS += iptv/iptvfeederfile.h iptv/iptvfeederlive.h 568 568 HEADERS += iptv/iptvfeederrtp.h iptv/timeoutedtaskscheduler.h 569 569 HEADERS += iptv/iptvfeederhls.h 570 HEADERS += iptv/iptvfeederhttp.h 570 571 571 572 SOURCES += iptvchannel.cpp iptvrecorder.cpp 572 573 SOURCES += iptvsignalmonitor.cpp … … using_backend { 577 578 SOURCES += iptv/iptvfeederfile.cpp iptv/iptvfeederlive.cpp 578 579 SOURCES += iptv/iptvfeederrtp.cpp iptv/timeoutedtaskscheduler.cpp 579 580 SOURCES += iptv/iptvfeederhls.cpp 581 SOURCES += iptv/iptvfeederhttp.cpp 582 583 LIBS += -lccext2 -lccgnu2 580 584 581 585 DEFINES += USING_IPTV 582 586 } -
new file mythtv/libs/libmythtv/iptv/iptvfeederhttp.cpp
diff --git a/mythtv/libs/libmythtv/iptv/iptvfeederhttp.cpp b/mythtv/libs/libmythtv/iptv/iptvfeederhttp.cpp new file mode 100644 index 0000000..5fd3dd8
- + 1 /** -*- Mode: c++ -*- 2 * IPTVFeederHTTP -- 3 * Copyright (c) 4 * Distributed as part of MythTV under GPL v2 and later. 5 */ 6 #include <unistd.h> 7 #include "iptvfeederhttp.h" 8 9 // MythTV headers 10 #include "mythlogging.h" 11 #include "streamlisteners.h" 12 13 #define LOC QString("IPTVHTTP: ") 14 #define TS_SIZE 188 15 #define BUFFER_SIZE (128 * TS_SIZE) 16 17 18 IPTVFeederHTTP::IPTVFeederHTTP() 19 : _lock(),_abort(false),_running(false) 20 { 21 _stream.setTimeout(5000); 22 } 23 24 IPTVFeederHTTP::~IPTVFeederHTTP() 25 { 26 Close(); 27 } 28 29 bool IPTVFeederHTTP::IsHTTP(const QString &url) 30 { 31 return url.startsWith("http://", Qt::CaseInsensitive); 32 } 33 34 bool IPTVFeederHTTP::Open(const QString &url) 35 { 36 QMutexLocker locker(&_lock); 37 QUrl parse(url); 38 if (parse.scheme().toLower() != "http") 39 { 40 LOG(VB_GENERAL, LOG_ERR, LOC + "Open() -- end 1"); 41 return false; 42 } 43 QByteArray p=parse.toEncoded(); 44 45 URLStream::Error status; 46 status = _stream.get(p.constData()); 47 if(status) 48 { 49 LOG(VB_RECORD, LOG_INFO, LOC + QString("Open() -- failed to open stream, error %1").arg(status)); 50 _stream.close(); 51 } 52 return true; 53 } 54 55 void IPTVFeederHTTP::Close(void) 56 { 57 LOG(VB_RECORD, LOG_INFO, LOC + "Close() -- begin"); 58 Stop(); 59 60 QMutexLocker locker(&_lock); 61 _stream.close(); 62 } 63 64 void IPTVFeederHTTP::Run(void) 65 { 66 LOG(VB_RECORD, LOG_INFO, LOC + "Run() -- begin"); 67 _lock.lock(); 68 _running = true; 69 _abort = false; 70 _lock.unlock(); 71 LOG(VB_RECORD, LOG_INFO, LOC + "Run() -- loop begin"); 72 73 while(!_abort) 74 { 75 uint8_t buffer[BUFFER_SIZE]; 76 if(!_stream.isConnected()) 77 { 78 break; 79 } 80 81 if(_listeners.empty()) 82 { 83 usleep(50000); 84 continue; 85 } 86 87 _stream.read((char*)buffer,BUFFER_SIZE); 88 int size=_stream.gcount(); 89 if(size>0) 90 { 91 //LOG(VB_RECORD, LOG_INFO, LOC + QString("Run() -- got %1 bytes of data").arg(size)); 92 _lock.lock(); 93 vector<TSDataListener*>::iterator it = _listeners.begin(); 94 for (; it != _listeners.end(); ++it) 95 (*it)->AddData(buffer, size); 96 _lock.unlock(); 97 } 98 } 99 100 LOG(VB_RECORD, LOG_INFO, LOC + "Run() -- loop end"); 101 102 _lock.lock(); 103 _running = false; 104 _cond.wakeAll(); 105 _lock.unlock(); 106 LOG(VB_RECORD, LOG_INFO, LOC + "Run() -- end"); 107 } 108 109 void IPTVFeederHTTP::Stop(void) 110 { 111 LOG(VB_RECORD, LOG_INFO, LOC + "Stop() -- begin"); 112 QMutexLocker locker(&_lock); 113 _abort = true; 114 115 while (_running) 116 _cond.wait(&_lock, 500); 117 LOG(VB_RECORD, LOG_INFO, LOC + "Stop() -- end"); 118 } 119 120 void IPTVFeederHTTP::AddListener(TSDataListener *item) 121 { 122 LOG(VB_RECORD, LOG_INFO, LOC + QString("AddListener(0x%1) -- begin") 123 .arg((uint64_t)item,0,16)); 124 if (!item) 125 { 126 LOG(VB_RECORD, LOG_INFO, LOC + QString("AddListener(0x%1) -- end") 127 .arg((uint64_t)item,0,16)); 128 return; 129 } 130 131 // avoid duplicates 132 RemoveListener(item); 133 134 // add to local list 135 QMutexLocker locker(&_lock); 136 _listeners.push_back(item); 137 138 LOG(VB_RECORD, LOG_INFO, LOC + QString("AddListener(0x%1) -- end") 139 .arg((uint64_t)item,0,16)); 140 } 141 142 void IPTVFeederHTTP::RemoveListener(TSDataListener *item) 143 { 144 LOG(VB_RECORD, LOG_INFO, LOC + QString("RemoveListener(0x%1) -- begin") 145 .arg((uint64_t)item,0,16)); 146 QMutexLocker locker(&_lock); 147 vector<TSDataListener*>::iterator it = 148 find(_listeners.begin(), _listeners.end(), item); 149 150 if (it == _listeners.end()) 151 { 152 LOG(VB_RECORD, LOG_INFO, LOC + QString("RemoveListener(0x%1) -- end 1") 153 .arg((uint64_t)item,0,16)); 154 return; 155 } 156 157 // remove from local list.. 158 *it = *_listeners.rbegin(); 159 _listeners.resize(_listeners.size() - 1); 160 161 LOG(VB_RECORD, LOG_INFO, LOC + QString("RemoveListener(0x%1) -- end 2") 162 .arg((uint64_t)item,0,16)); 163 } -
new file mythtv/libs/libmythtv/iptv/iptvfeederhttp.h
diff --git a/mythtv/libs/libmythtv/iptv/iptvfeederhttp.h b/mythtv/libs/libmythtv/iptv/iptvfeederhttp.h new file mode 100644 index 0000000..fadb484
- + 1 /** -*- Mode: c++ -*- 2 * IPTVFeederHTTP 3 * Copyright (c) 4 * Distributed as part of MythTV under GPL v2 and later. 5 */ 6 #ifndef _IPTV_FEEDER_HTTP_H_ 7 #define _IPTV_FEEDER_HTTP_H_ 8 9 // C++ headers 10 #include <vector> 11 using namespace std; 12 #include <cc++/common.h> 13 using namespace ost; 14 15 #include <stdint.h> 16 17 // Qt headers 18 #include <QWaitCondition> 19 #include <QMutex> 20 #include <QUrl> 21 22 // Mythtv headers 23 #include "iptvfeeder.h" 24 25 class QString; 26 class TSDataListener; 27 28 29 class IPTVFeederHTTP : public IPTVFeeder 30 { 31 public: 32 IPTVFeederHTTP(); 33 virtual ~IPTVFeederHTTP(); 34 35 bool CanHandle(const QString &url) const { return IsHTTP(url); }; 36 bool IsOpen(void) const { return _stream.isConnected(); }; 37 38 bool Open(const QString &url); 39 void Close(void); 40 41 void Run(void); 42 void Stop(void); 43 44 void AddListener(TSDataListener*); 45 void RemoveListener(TSDataListener*); 46 47 static bool IsHTTP(const QString &url); 48 49 private: 50 IPTVFeederHTTP &operator=(const IPTVFeederHTTP&); 51 IPTVFeederHTTP(const IPTVFeederHTTP&); 52 53 protected: 54 mutable QMutex _lock; 55 vector<TSDataListener*> _listeners; 56 57 private: 58 bool _abort; 59 bool _running; 60 QWaitCondition _cond; 61 URLStream _stream; 62 }; 63 64 #endif // _IPTV_FEEDER_HTTP_H_