Ticket #2593: 2593-v1.patch
File 2593-v1.patch, 19.0 KB (added by , 17 years ago) |
---|
-
libs/libmythtv/libmythtv.pro
402 402 HEADERS += iptv/iptvchannelfetcher.h iptv/iptvchannelinfo.h 403 403 HEADERS += iptv/iptvmediasink.h iptv/iptvlistener.h 404 404 HEADERS += iptv/iptvfeeder.h iptv/iptvfeederwrapper.h 405 HEADERS += iptv/iptvfeederrtsp.h iptv/iptvfeederlive.h 405 HEADERS += iptv/iptvfeederrtsp.h iptv/iptvfeederudp.h 406 HEADERS += iptv/iptvfeederfile.h iptv/iptvfeederlive.h 407 HEADERS += iptv/iptvfeederrtp.h 406 408 HEADERS += iptv/urlfetcher.h iptv/timeoutedtaskscheduler.h 407 409 408 410 SOURCES += iptvchannel.cpp iptvrecorder.cpp … … 410 412 SOURCES += iptv/iptvchannelfetcher.cpp 411 413 SOURCES += iptv/iptvmediasink.cpp 412 414 SOURCES += iptv/iptvfeeder.cpp iptv/iptvfeederwrapper.cpp 413 SOURCES += iptv/iptvfeederrtsp.cpp iptv/iptvfeederlive.cpp 415 SOURCES += iptv/iptvfeederrtsp.cpp iptv/iptvfeederudp.cpp 416 SOURCES += iptv/iptvfeederfile.cpp iptv/iptvfeederlive.cpp 417 SOURCES += iptv/iptvfeederrtp.cpp 414 418 SOURCES += iptv/urlfetcher.cpp iptv/timeoutedtaskscheduler.cpp 415 419 416 420 DEFINES += USING_IPTV -
libs/libmythtv/iptv/iptvfeederwrapper.cpp
8 8 9 9 #include "iptvfeeder.h" 10 10 #include "iptvfeederrtsp.h" 11 #include "iptvfeederudp.h" 12 #include "iptvfeederrtp.h" 13 #include "iptvfeederfile.h" 11 14 #include "mythcontext.h" 12 15 13 16 #define LOC QString("IPTVFeed: ") … … 48 51 { 49 52 tmp_feeder = new IPTVFeederRTSP(); 50 53 } 54 else if (IPTVFeederUDP::IsUDP(url)) 55 { 56 tmp_feeder = new IPTVFeederUDP(); 57 } 58 else if (IPTVFeederRTP::IsRTP(url)) 59 { 60 tmp_feeder = new IPTVFeederRTP(); 61 } 62 else if (IPTVFeederFile::IsFile(url)) 63 { 64 tmp_feeder = new IPTVFeederFile(); 65 } 51 66 else 52 67 { 53 68 VERBOSE(VB_RECORD, LOC_ERR + -
libs/libmythtv/iptv/iptvfeederfile.h
1 /** -*- Mode: c++ -*- 2 * IPTVFeederFile 3 * Copyright (c) 2006 by Mike Mironov & Mickaël Remars 4 * Distributed as part of MythTV under GPL v2 and later. 5 */ 6 7 #ifndef _IPTV_FEEDER_FILE_H_ 8 #define _IPTV_FEEDER_FILE_H_ 9 10 // MythTV headers 11 #include "iptvfeederlive.h" 12 13 class IPTVListener; 14 class ByteStreamFileSource; 15 class IPTVMediaSink; 16 17 18 class IPTVFeederFile : public IPTVFeederLive 19 { 20 public: 21 IPTVFeederFile(); 22 virtual ~IPTVFeederFile(); 23 24 bool CanHandle(const QString &url) const { return IsFile(url); } 25 bool IsOpen(void) const { return _source; } 26 27 bool Open(const QString &url); 28 void Close(void); 29 30 void AddListener(IPTVListener*); 31 void RemoveListener(IPTVListener*); 32 33 static bool IsFile(const QString &url); 34 35 private: 36 IPTVFeederFile &operator=(const IPTVFeederFile&); 37 IPTVFeederFile(const IPTVFeederFile&); 38 39 private: 40 ByteStreamFileSource *_source; 41 IPTVMediaSink *_sink; 42 }; 43 44 #endif //_IPTV_FEEDER_FILE_H_ -
libs/libmythtv/iptv/iptvfeederudp.cpp
1 /** -*- Mode: c++ -*- 2 * IPTVFeederUdp 3 * Copyright (c) 2006 by Mike Mironov & Mickaël Remars 4 * Distributed as part of MythTV under GPL v2 and later. 5 */ 6 7 #include "iptvfeederudp.h" 8 9 // Qt headers 10 #include <qurl.h> 11 12 // Live555 headers 13 #include <BasicUsageEnvironment.hh> 14 #include <Groupsock.hh> 15 #include <GroupsockHelper.hh> 16 #include <BasicUDPSource.hh> 17 #include <TunnelEncaps.hh> 18 19 // MythTV headers 20 #include "iptvmediasink.h" 21 #include "mythcontext.h" 22 #include "tspacket.h" 23 24 #define LOC QString("IPTVFeedUDP: ") 25 #define LOC_ERR QString("IPTVFeedUDP, Error: ") 26 27 IPTVFeederUDP::IPTVFeederUDP() : 28 _source(NULL), 29 _sink(NULL) 30 { 31 VERBOSE(VB_RECORD, LOC + "ctor -- success"); 32 } 33 34 IPTVFeederUDP::~IPTVFeederUDP() 35 { 36 VERBOSE(VB_RECORD, LOC + "dtor -- begin"); 37 Close(); 38 VERBOSE(VB_RECORD, LOC + "dtor -- end"); 39 } 40 41 bool IPTVFeederUDP::IsUDP(const QString &url) 42 { 43 return url.startsWith("udp://", false); 44 } 45 46 bool IPTVFeederUDP::Open(const QString &url) 47 { 48 VERBOSE(VB_RECORD, LOC + QString("Open(%1) -- begin").arg(url)); 49 50 QMutexLocker locker(&_lock); 51 52 if (_source) 53 { 54 VERBOSE(VB_RECORD, LOC + "Open() -- end 1"); 55 return true; 56 } 57 58 QUrl parse(url); 59 if (!parse.isValid() || !parse.hasHost() || !parse.hasPort()) 60 { 61 VERBOSE(VB_RECORD, LOC + "Open() -- end 2"); 62 return false; 63 } 64 65 struct in_addr addr; 66 addr.s_addr = our_inet_addr(parse.host().latin1()); 67 68 // Begin by setting up our usage environment: 69 if (!InitEnv()) 70 return false; 71 72 Groupsock *socket = new Groupsock(*_live_env, addr, parse.port(), 0); 73 if (!socket) 74 { 75 VERBOSE(VB_IMPORTANT, LOC + "Failed to create Live UDP Socket."); 76 FreeEnv(); 77 return false; 78 } 79 _source = BasicUDPSource::createNew(*_live_env, socket); 80 if (!_source) 81 { 82 VERBOSE(VB_IMPORTANT, LOC + "Failed to create Live UDP Source."); 83 84 if (socket) 85 delete socket; 86 87 FreeEnv(); 88 return false; 89 } 90 91 _sink = IPTVMediaSink::CreateNew(*_live_env, TSPacket::SIZE * 128*1024); 92 if (!_sink) 93 { 94 VERBOSE(VB_IMPORTANT, 95 QString("IPTV # Failed to create sink: %1") 96 .arg(_live_env->getResultMsg())); 97 98 Medium::close(_source); 99 _source = NULL; 100 if (socket) 101 delete socket; 102 FreeEnv(); 103 104 return false; 105 } 106 107 _sink->startPlaying(*_source, NULL, NULL); 108 vector<IPTVListener*>::iterator it = _listeners.begin(); 109 for (; it != _listeners.end(); ++it) 110 _sink->AddListener(*it); 111 112 VERBOSE(VB_RECORD, LOC + "Open() -- end"); 113 114 return true; 115 } 116 117 void IPTVFeederUDP::Close(void) 118 { 119 VERBOSE(VB_RECORD, LOC + "Close() -- begin"); 120 Stop(); 121 122 QMutexLocker locker(&_lock); 123 124 if (_sink) 125 { 126 Medium::close(_sink); 127 _sink = NULL; 128 } 129 130 if (_source) 131 { 132 Groupsock *socket = _source->gs(); 133 Medium::close(_source); 134 _source = NULL; 135 if (socket) 136 delete socket; 137 } 138 139 FreeEnv(); 140 141 VERBOSE(VB_RECORD, LOC + "Close() -- end"); 142 } 143 144 void IPTVFeederUDP::AddListener(IPTVListener *item) 145 { 146 VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- begin"); 147 if (!item) 148 { 149 VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- end"); 150 return; 151 } 152 153 // avoid duplicates 154 RemoveListener(item); 155 156 // add to local list 157 QMutexLocker locker(&_lock); 158 _listeners.push_back(item); 159 160 if (_sink) 161 _sink->AddListener(item); 162 163 VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- end"); 164 } 165 166 void IPTVFeederUDP::RemoveListener(IPTVListener *item) 167 { 168 VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- begin"); 169 QMutexLocker locker(&_lock); 170 vector<IPTVListener*>::iterator it = 171 find(_listeners.begin(), _listeners.end(), item); 172 173 if (it == _listeners.end()) 174 { 175 VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- end 1"); 176 return; 177 } 178 179 // remove from local list.. 180 *it = *_listeners.rbegin(); 181 _listeners.resize(_listeners.size() - 1); 182 183 if (_sink) 184 _sink->RemoveListener(item); 185 186 VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- end 2"); 187 } -
libs/libmythtv/iptv/iptvfeederudp.h
1 /** -*- Mode: c++ -*- 2 * IPTVFeederUDP 3 * Copyright (c) 2006 by Mike Mironov & Mickaël Remars 4 * Distributed as part of MythTV under GPL v2 and later. 5 */ 6 7 #ifndef _IPTV_FEEDER_UDP_H_ 8 #define _IPTV_FEEDER_UDP_H_ 9 10 // MythTV headers 11 #include "iptvfeederlive.h" 12 13 class BasicUDPSource; 14 class IPTVMediaSink; 15 16 17 class IPTVFeederUDP : public IPTVFeederLive 18 { 19 public: 20 IPTVFeederUDP(); 21 virtual ~IPTVFeederUDP(); 22 23 bool CanHandle(const QString &url) const { return IsUDP(url); } 24 bool IsOpen(void) const { return _source; } 25 26 bool Open(const QString &url); 27 void Close(void); 28 29 void AddListener(IPTVListener*); 30 void RemoveListener(IPTVListener*); 31 32 static bool IsUDP(const QString &url); 33 34 private: 35 BasicUDPSource *_source; 36 IPTVMediaSink *_sink; 37 }; 38 39 #endif // _IPTV_FEEDER_UDP_H_ -
libs/libmythtv/iptv/iptvfeederrtp.cpp
1 /** -*- Mode: c++ -*- 2 * IPTVFeederRtp 3 * Copyright (c) 2006 by Mike Mironov & Mickaël Remars 4 * Distributed as part of MythTV under GPL v2 and later. 5 */ 6 7 #include "iptvfeederrtp.h" 8 9 // Qt headers 10 #include <qurl.h> 11 12 // Live555 headers 13 #include <BasicUsageEnvironment.hh> 14 #include <Groupsock.hh> 15 #include <GroupsockHelper.hh> 16 #include <SimpleRTPSource.hh> 17 #include <TunnelEncaps.hh> 18 19 // MythTV headers 20 #include "iptvmediasink.h" 21 #include "mythcontext.h" 22 #include "tspacket.h" 23 24 #define LOC QString("IPTVFeedRTP: ") 25 #define LOC_ERR QString("IPTVFeedRTP, Error: ") 26 27 IPTVFeederRTP::IPTVFeederRTP() : 28 _source(NULL), 29 _sink(NULL) 30 { 31 VERBOSE(VB_RECORD, LOC + "ctor -- success"); 32 } 33 34 IPTVFeederRTP::~IPTVFeederRTP() 35 { 36 VERBOSE(VB_RECORD, LOC + "dtor -- begin"); 37 Close(); 38 VERBOSE(VB_RECORD, LOC + "dtor -- end"); 39 } 40 41 bool IPTVFeederRTP::IsRTP(const QString &url) 42 { 43 return url.startsWith("rtp://", false); 44 } 45 46 bool IPTVFeederRTP::Open(const QString &url) 47 { 48 VERBOSE(VB_RECORD, LOC + QString("Open(%1) -- begin").arg(url)); 49 50 QMutexLocker locker(&_lock); 51 52 if (_source) 53 { 54 VERBOSE(VB_RECORD, LOC + "Open() -- end 1"); 55 return true; 56 } 57 58 QUrl parse(url); 59 if (!parse.isValid() || !parse.hasHost() || !parse.hasPort()) 60 { 61 VERBOSE(VB_RECORD, LOC + "Open() -- end 2"); 62 return false; 63 } 64 65 struct in_addr addr; 66 addr.s_addr = our_inet_addr(parse.host().latin1()); 67 68 // Begin by setting up our usage environment: 69 if (!InitEnv()) 70 return false; 71 72 Groupsock *socket = new Groupsock(*_live_env, addr, parse.port(), 0); 73 if (!socket) 74 { 75 VERBOSE(VB_IMPORTANT, LOC + "Failed to create Live RTP Socket."); 76 FreeEnv(); 77 return false; 78 } 79 80 _source = SimpleRTPSource::createNew(*_live_env, socket, 33, 90000, 81 "video/MP2T", 0, False); 82 if (!_source) 83 { 84 VERBOSE(VB_IMPORTANT, LOC + "Failed to create Live RTP Source."); 85 86 if (socket) 87 delete socket; 88 89 FreeEnv(); 90 return false; 91 } 92 93 _sink = IPTVMediaSink::CreateNew(*_live_env, TSPacket::SIZE * 128*1024); 94 if (!_sink) 95 { 96 VERBOSE(VB_IMPORTANT, 97 QString("IPTV # Failed to create sink: %1") 98 .arg(_live_env->getResultMsg())); 99 100 Medium::close(_source); 101 _source = NULL; 102 if (socket) 103 delete socket; 104 FreeEnv(); 105 106 return false; 107 } 108 109 _sink->startPlaying(*_source, NULL, NULL); 110 vector<IPTVListener*>::iterator it = _listeners.begin(); 111 for (; it != _listeners.end(); ++it) 112 _sink->AddListener(*it); 113 114 VERBOSE(VB_RECORD, LOC + "Open() -- end"); 115 116 return true; 117 } 118 119 void IPTVFeederRTP::Close(void) 120 { 121 VERBOSE(VB_RECORD, LOC + "Close() -- begin"); 122 Stop(); 123 124 QMutexLocker locker(&_lock); 125 126 if (_sink) 127 { 128 Medium::close(_sink); 129 _sink = NULL; 130 } 131 132 if (_source) 133 { 134 Groupsock *socket = _source->RTPgs(); 135 Medium::close(_source); 136 _source = NULL; 137 if (socket) 138 delete socket; 139 } 140 141 FreeEnv(); 142 143 VERBOSE(VB_RECORD, LOC + "Close() -- end"); 144 } 145 146 void IPTVFeederRTP::AddListener(IPTVListener *item) 147 { 148 VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- begin"); 149 if (!item) 150 { 151 VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- end"); 152 return; 153 } 154 155 // avoid duplicates 156 RemoveListener(item); 157 158 // add to local list 159 QMutexLocker locker(&_lock); 160 _listeners.push_back(item); 161 162 if (_sink) 163 _sink->AddListener(item); 164 165 VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- end"); 166 } 167 168 void IPTVFeederRTP::RemoveListener(IPTVListener *item) 169 { 170 VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- begin"); 171 QMutexLocker locker(&_lock); 172 vector<IPTVListener*>::iterator it = 173 find(_listeners.begin(), _listeners.end(), item); 174 175 if (it == _listeners.end()) 176 { 177 VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- end 1"); 178 return; 179 } 180 181 // remove from local list.. 182 *it = *_listeners.rbegin(); 183 _listeners.resize(_listeners.size() - 1); 184 185 if (_sink) 186 _sink->RemoveListener(item); 187 188 VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- end 2"); 189 } -
libs/libmythtv/iptv/iptvfeederrtp.h
1 /** -*- Mode: c++ -*- 2 * IPTVFeederRTP 3 * Copyright (c) 2006 by Mike Mironov & Mickaël Remars 4 * Distributed as part of MythTV under GPL v2 and later. 5 */ 6 7 #ifndef _IPTV_FEEDER_RTP_H_ 8 #define _IPTV_FEEDER_RTP_H_ 9 10 // MythTV headers 11 #include "iptvfeederlive.h" 12 13 class SimpleRTPSource; 14 class IPTVMediaSink; 15 16 17 class IPTVFeederRTP : public IPTVFeederLive 18 { 19 public: 20 IPTVFeederRTP(); 21 virtual ~IPTVFeederRTP(); 22 23 bool CanHandle(const QString &url) const { return IsRTP(url); } 24 bool IsOpen(void) const { return _source; } 25 26 bool Open(const QString &url); 27 void Close(void); 28 29 void AddListener(IPTVListener*); 30 void RemoveListener(IPTVListener*); 31 32 static bool IsRTP(const QString &url); 33 34 private: 35 IPTVFeederRTP &operator=(const IPTVFeederRTP&); 36 IPTVFeederRTP(const IPTVFeederRTP&); 37 38 private: 39 SimpleRTPSource *_source; 40 IPTVMediaSink *_sink; 41 }; 42 43 #endif // _IPTV_FEEDER_RTP_H_ -
libs/libmythtv/iptv/iptvfeederfile.cpp
1 /** -*- Mode: c++ -*- 2 * IPTVFeederFile 3 * 4 * Please, don't submit bug reports if it 5 * can't read your file. Just use MythVideo! 6 * 7 * Copyright (c) 2006 by Mike Mironov & Mickaël Remars 8 * Distributed as part of MythTV under GPL v2 and later. 9 */ 10 11 #include "iptvfeederfile.h" 12 13 // Qt headers 14 #include <qurl.h> 15 16 // Live555 headers 17 #include <BasicUsageEnvironment.hh> 18 #include <Groupsock.hh> 19 #include <GroupsockHelper.hh> 20 #include <ByteStreamFileSource.hh> 21 #include <TunnelEncaps.hh> 22 23 // MythTV headers 24 #include "iptvmediasink.h" 25 #include "mythcontext.h" 26 #include "tspacket.h" 27 28 #define LOC QString("FbFeedFile: ") 29 #define LOC_ERR QString("FbFeedFile, Error: ") 30 31 32 IPTVFeederFile::IPTVFeederFile() : 33 _source(NULL), 34 _sink(NULL) 35 { 36 } 37 38 IPTVFeederFile::~IPTVFeederFile() 39 { 40 Close(); 41 } 42 43 bool IPTVFeederFile::IsFile(const QString &url) 44 { 45 return url.startsWith("file:", false); 46 } 47 48 bool IPTVFeederFile::Open(const QString &url) 49 { 50 VERBOSE(VB_RECORD, LOC + QString("Open(%1) -- begin").arg(url)); 51 52 QMutexLocker locker(&_lock); 53 54 if (_source) 55 { 56 VERBOSE(VB_RECORD, LOC + "Open() -- end 1"); 57 return true; 58 } 59 60 QUrl parse(url); 61 if (!parse.hasPath() || !parse.isLocalFile()) 62 { 63 VERBOSE(VB_RECORD, LOC + "Open() -- end 2"); 64 return false; 65 } 66 67 // Begin by setting up our usage environment: 68 if (!InitEnv()) 69 return false; 70 71 _source = ByteStreamFileSource::createNew( 72 *_live_env, parse.path().local8Bit()); 73 if (!_source) 74 { 75 VERBOSE(VB_IMPORTANT, LOC + "Failed to create Live File Source."); 76 FreeEnv(); 77 return false; 78 } 79 80 _sink = IPTVMediaSink::CreateNew(*_live_env, TSPacket::SIZE * 128*1024); 81 if (!_sink) 82 { 83 VERBOSE(VB_IMPORTANT, 84 QString("IPTV # Failed to create sink: %1") 85 .arg(_live_env->getResultMsg())); 86 87 Medium::close(_source); 88 _source = NULL; 89 FreeEnv(); 90 91 return false; 92 } 93 94 _sink->startPlaying(*_source, NULL, NULL); 95 vector<IPTVListener*>::iterator it = _listeners.begin(); 96 for (; it != _listeners.end(); ++it) 97 _sink->AddListener(*it); 98 99 VERBOSE(VB_RECORD, LOC + "Open() -- end"); 100 101 return true; 102 } 103 104 void IPTVFeederFile::Close(void) 105 { 106 VERBOSE(VB_RECORD, LOC + "Close() -- begin"); 107 Stop(); 108 109 QMutexLocker locker(&_lock); 110 111 if (_sink) 112 { 113 Medium::close(_sink); 114 _sink = NULL; 115 } 116 117 if (_source) 118 { 119 Medium::close(_source); 120 _source = NULL; 121 } 122 123 FreeEnv(); 124 125 VERBOSE(VB_RECORD, LOC + "Close() -- end"); 126 } 127 128 void IPTVFeederFile::AddListener(IPTVListener *item) 129 { 130 VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- begin"); 131 if (!item) 132 { 133 VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- end"); 134 return; 135 } 136 137 // avoid duplicates 138 RemoveListener(item); 139 140 // add to local list 141 QMutexLocker locker(&_lock); 142 _listeners.push_back(item); 143 144 if (_sink) 145 _sink->AddListener(item); 146 147 VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- end"); 148 } 149 150 void IPTVFeederFile::RemoveListener(IPTVListener *item) 151 { 152 VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- begin"); 153 QMutexLocker locker(&_lock); 154 vector<IPTVListener*>::iterator it = 155 find(_listeners.begin(), _listeners.end(), item); 156 157 if (it == _listeners.end()) 158 { 159 VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- end 1"); 160 return; 161 } 162 163 // remove from local list.. 164 *it = *_listeners.rbegin(); 165 _listeners.resize(_listeners.size() - 1); 166 167 if (_sink) 168 _sink->RemoveListener(item); 169 170 VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- end 2"); 171 }