Ticket #2152: patch-freebox-udp.diff
File patch-freebox-udp.diff, 28.3 KB (added by , 18 years ago) |
---|
-
libs/libmythtv/freeboxsignalmonitor.cpp
2 2 3 3 // MythTV headers 4 4 #include "mpegstreamdata.h" 5 #include "freeboxfeederwrapper.h" 5 6 #include "freeboxsignalmonitor.h" 6 7 #include "rtspcomms.h" 7 8 … … 34 35 dtvMonitorRunning(false) 35 36 { 36 37 bool isLocked = false; 37 if (GetChannel()->GetRTSP()->Init()) 38 FreeboxChannelInfo chaninfo = GetChannel()->GetCurrentChanInfo(); 39 if (chaninfo.isValid()) 38 40 { 39 FreeboxChannelInfo chaninfo = GetChannel()->GetCurrentChanInfo();40 i sLocked = (chaninfo.isValid() &&41 GetChannel()->GetRTSP()->Open(chaninfo.m_url));41 isLocked = GetChannel()->GetFeeder()->Init(chaninfo.m_url); 42 if (isLocked) 43 isLocked = GetChannel()->GetFeeder()->Open(); 42 44 } 43 45 44 46 QMutexLocker locker(&statusLock); … … 51 53 */ 52 54 FreeboxSignalMonitor::~FreeboxSignalMonitor() 53 55 { 54 GetChannel()->Get RTSP()->RemoveListener(this);56 GetChannel()->GetFeeder()->RemoveListener(this); 55 57 Stop(); 56 58 } 57 59 … … 63 65 void FreeboxSignalMonitor::deleteLater(void) 64 66 { 65 67 disconnect(); // disconnect signals we may be sending... 66 GetChannel()->Get RTSP()->RemoveListener(this);68 GetChannel()->GetFeeder()->RemoveListener(this); 67 69 Stop(); 68 70 DTVSignalMonitor::deleteLater(); 69 71 } … … 74 76 void FreeboxSignalMonitor::Stop(void) 75 77 { 76 78 DBG_SM("Stop", "begin"); 77 GetChannel()->Get RTSP()->RemoveListener(this);79 GetChannel()->GetFeeder()->RemoveListener(this); 78 80 SignalMonitor::Stop(); 79 81 if (dtvMonitorRunning) 80 82 { 81 GetChannel()->Get RTSP()->Stop();83 GetChannel()->GetFeeder()->Stop(); 82 84 dtvMonitorRunning = false; 83 85 pthread_join(table_monitor_thread, NULL); 84 86 } … … 101 103 102 104 GetStreamData()->AddListeningPID(0); 103 105 104 GetChannel()->Get RTSP()->AddListener(this);105 GetChannel()->Get RTSP()->Run();106 GetChannel()->Get RTSP()->RemoveListener(this);106 GetChannel()->GetFeeder()->AddListener(this); 107 GetChannel()->GetFeeder()->Run(); 108 GetChannel()->GetFeeder()->RemoveListener(this); 107 109 108 110 dtvMonitorRunning = false; 109 111 DBG_SM("Run", "end"); 110 112 } 111 113 112 114 void FreeboxSignalMonitor::AddData( 113 unsigned char *data, unsigned dataSize , struct timeval)115 unsigned char *data, unsigned dataSize) 114 116 { 115 117 GetStreamData()->ProcessData(data, dataSize); 116 118 } -
libs/libmythtv/freeboxfeederudp.cpp
1 /** -*- Mode: c++ -*- 2 * FreeboxFeederUdp 3 * Copyright (c) 2006 by Mickaël Remars 4 * Distributed as part of MythTV under GPL v2 and later. 5 */ 6 7 #include "freeboxfeederudp.h" 8 9 #include "../libavformat/avformat.h" 10 #include "freeboxmediasink.h" 11 #include "mythcontext.h" 12 #include "tspacket.h" 13 14 #define LOC QString("FBFeedUdp:") 15 #define LOC_ERR QString("FBFeedUdp, Error:") 16 17 18 FreeboxFeederUdp::FreeboxFeederUdp() : 19 url_context(0), 20 network_buffer(0), 21 _stream_fd(-1), 22 _lock(false), 23 _abort(0), 24 _running(false) 25 { 26 QMutexLocker locker(&avcodeclock); 27 av_register_all(); 28 } 29 30 FreeboxFeederUdp::~FreeboxFeederUdp() 31 { 32 } 33 34 bool FreeboxFeederUdp::CanHandle(const QString &url) const 35 { 36 return url.startsWith("udp://", false); 37 } 38 39 bool FreeboxFeederUdp::Init(void) 40 { 41 // Nothing to init 42 return true; 43 } 44 45 void FreeboxFeederUdp::Deinit(void) 46 { 47 // Nothing to deinit 48 } 49 50 bool FreeboxFeederUdp::Open(const QString &url) 51 { 52 VERBOSE(VB_RECORD, LOC << "Open(" << url << ")"); 53 54 avcodeclock.lock(); 55 assert(url_context==NULL); 56 int err = url_open(&url_context, url, URL_RDONLY); 57 avcodeclock.unlock(); 58 59 if (err < 0) 60 { 61 VERBOSE(VB_IMPORTANT, LOC_ERR + 62 "failed to open the avformat URLContext" + ENO); 63 return false; 64 } 65 66 assert(_stream_fd<0); 67 _stream_fd = udp_get_file_handle(url_context); 68 if (_stream_fd < 0) 69 { 70 VERBOSE(VB_IMPORTANT, LOC_ERR + 71 "failed to get the URLContext's file descriptor" + ENO); 72 return false; 73 } 74 75 return true; 76 } 77 78 bool FreeboxFeederUdp::IsOpen(void) const 79 { 80 return _stream_fd>=0; 81 } 82 83 void FreeboxFeederUdp::Close(void) 84 { 85 if (url_context) 86 { 87 url_close(url_context); 88 url_context = 0; 89 _stream_fd = -1; 90 } 91 } 92 93 void FreeboxFeederUdp::Run(void) 94 { 95 VERBOSE(VB_RECORD, LOC + "Run() -- begin"); 96 _lock.lock(); 97 _running = true; 98 _abort = 0; 99 _lock.unlock(); 100 101 VERBOSE(VB_RECORD, LOC + "Run() -- loop begin"); 102 DoEventLoop(); 103 VERBOSE(VB_RECORD, LOC + "Run() -- loop end"); 104 105 _lock.lock(); 106 _running = false; 107 _cond.wakeAll(); 108 _lock.unlock(); 109 VERBOSE(VB_RECORD, LOC + "Run() -- end"); 110 } 111 112 void FreeboxFeederUdp::DoEventLoop(void) 113 { 114 struct timeval tv; 115 fd_set rdset; 116 ssize_t bytes_read; 117 ssize_t unprocessed_bytes = 0; 118 unsigned char _buffer[TSPacket::SIZE * 50]; 119 int _buffer_size = TSPacket::SIZE * 50; 120 bzero(_buffer, _buffer_size); 121 122 while (!_abort) 123 { 124 tv.tv_sec = 5; 125 tv.tv_usec = 0; 126 FD_ZERO(&rdset); 127 FD_SET(_stream_fd, &rdset); 128 129 // wait until we can read something 130 switch (select(_stream_fd + 1, &rdset, NULL, NULL, &tv)) 131 { 132 case -1: 133 if (errno == EINTR) 134 continue; 135 136 VERBOSE(VB_IMPORTANT, LOC_ERR + "select error" + ENO); 137 continue; 138 139 case 0: 140 VERBOSE(VB_RECORD, LOC_ERR + "select timeout"); 141 continue; 142 143 default: break; 144 } 145 146 bytes_read = url_read(url_context, _buffer + unprocessed_bytes, 147 _buffer_size - unprocessed_bytes); 148 149 if (bytes_read < 0 && errno != EAGAIN) 150 { 151 VERBOSE(VB_IMPORTANT, LOC_ERR + 152 "failed to read from the URLContext" + ENO); 153 continue; 154 } 155 else if (bytes_read == 0) 156 continue; 157 158 bytes_read += unprocessed_bytes; 159 unprocessed_bytes = ProcessData(_buffer, bytes_read); 160 if (unprocessed_bytes > 0) 161 { 162 ssize_t ts_remainder = unprocessed_bytes % TSPacket::SIZE; 163 if (ts_remainder > 0) 164 unprocessed_bytes += ts_remainder; 165 166 memmove(_buffer, &(_buffer[_buffer_size - unprocessed_bytes]), 167 unprocessed_bytes); 168 } 169 } 170 } 171 172 ssize_t FreeboxFeederUdp::ProcessData(unsigned char *buf, ssize_t len) 173 { 174 QMutexLocker locker(&_lock); 175 std::vector<RTSPListener*>::iterator it = _listeners.begin(); 176 for (; it != _listeners.end(); ++it) 177 (*it)->AddData(buf, len); 178 return 0; 179 } 180 181 void FreeboxFeederUdp::Stop(void) 182 { 183 VERBOSE(VB_RECORD, LOC + "Stop() -- begin"); 184 QMutexLocker locker(&_lock); 185 _abort = 0xFF; 186 187 while (_running) 188 _cond.wait(&_lock, 500); 189 VERBOSE(VB_RECORD, LOC + "Stop() -- end"); 190 } 191 192 void FreeboxFeederUdp::AddListener(RTSPListener *item) 193 { 194 VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- begin"); 195 if (!item) 196 { 197 VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- end 0"); 198 return; 199 } 200 201 QMutexLocker locker(&_lock); 202 std::vector<RTSPListener*>::iterator it = 203 find(_listeners.begin(), _listeners.end(), item); 204 if (it == _listeners.end()) // avoid duplicates 205 _listeners.push_back(item); 206 207 VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- end 1"); 208 } 209 210 void FreeboxFeederUdp::RemoveListener(RTSPListener *item) 211 { 212 VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- begin"); 213 QMutexLocker locker(&_lock); 214 std::vector<RTSPListener*>::iterator it = 215 find(_listeners.begin(), _listeners.end(), item); 216 217 if (it == _listeners.end()) 218 { 219 VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- end (not found)"); 220 return; 221 } 222 223 // remove from local list.. 224 *it = *_listeners.rbegin(); 225 _listeners.resize(_listeners.size() - 1); 226 VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- end (ok, removed)"); 227 } -
libs/libmythtv/freeboxchannel.h
12 12 13 13 #include <qmutex.h> 14 14 15 class RTSPComms;15 class FreeboxFeederWrapper; 16 16 17 17 class FreeboxChannel : public ChannelBase 18 18 { … … 32 32 FreeboxChannelInfo GetCurrentChanInfo(void) const 33 33 { return GetChanInfo(curchannelname); } 34 34 35 RTSPComms *GetRTSP(void) { return m_rtsp; }36 const RTSPComms *GetRTSP(void) const { return m_rtsp; }35 FreeboxFeederWrapper *GetFeeder(void) { return m_feeder; } 36 const FreeboxFeederWrapper *GetFeeder(void) const { return m_feeder; } 37 37 38 38 private: 39 39 FreeboxChannelInfo GetChanInfo(const QString& channum, … … 41 41 42 42 QString m_videodev; 43 43 fbox_chan_map_t m_freeboxchannels; 44 RTSPComms *m_rtsp;44 FreeboxFeederWrapper *m_feeder; 45 45 mutable QMutex m_lock; 46 46 47 47 private: -
libs/libmythtv/libmythtv.pro
398 398 HEADERS += freeboxchannel.h freeboxchannelfetcher.h 399 399 HEADERS += freeboxsignalmonitor.h rtspcomms.h 400 400 HEADERS += freeboxchannelinfo.h 401 HEADERS += freeboxfeeder.h 402 HEADERS += freeboxfeederrtsp.h 403 HEADERS += freeboxfeederudp.h 404 HEADERS += freeboxfeederwrapper.h 401 405 402 406 SOURCES += freeboxrecorder.cpp freeboxmediasink.cpp 403 407 SOURCES += freeboxchannel.cpp freeboxchannelfetcher.cpp 404 408 SOURCES += freeboxsignalmonitor.cpp rtspcomms.cpp 409 SOURCES += freeboxfeederrtsp.cpp 410 SOURCES += freeboxfeederudp.cpp 411 SOURCES += freeboxfeederwrapper.cpp 405 412 406 413 DEFINES += USING_FREEBOX 407 414 } -
libs/libmythtv/freeboxchannel.cpp
11 11 #include "libmyth/mythcontext.h" 12 12 #include "libmyth/mythdbcon.h" 13 13 #include "libmythtv/freeboxchannelfetcher.h" 14 #include "libmythtv/ rtspcomms.h"14 #include "libmythtv/freeboxfeederwrapper.h" 15 15 16 16 #define LOC QString("FBChan(%1): ").arg(GetCardID()) 17 17 #define LOC_ERR QString("FBChan(%1), Error: ").arg(GetCardID()) … … 20 20 const QString &videodev) 21 21 : ChannelBase(parent), 22 22 m_videodev(QDeepCopy<QString>(videodev)), 23 m_ rtsp(new RTSPComms()),23 m_feeder(new FreeboxFeederWrapper()), 24 24 m_lock(true) 25 25 { 26 26 VERBOSE(VB_CHANNEL, LOC + "ctor"); … … 29 29 FreeboxChannel::~FreeboxChannel() 30 30 { 31 31 VERBOSE(VB_CHANNEL, LOC + "dtor -- begin"); 32 if (m_ rtsp)32 if (m_feeder) 33 33 { 34 delete m_ rtsp;35 m_ rtsp= NULL;34 delete m_feeder; 35 m_feeder = NULL; 36 36 } 37 37 VERBOSE(VB_CHANNEL, LOC + "dtor -- end"); 38 38 } -
libs/libmythtv/freeboxmediasink.cpp
61 61 } 62 62 63 63 void FreeboxMediaSink::afterGettingFrame1(unsigned int frameSize, 64 struct timeval presentationTime)64 struct timeval) 65 65 { 66 66 lock.lock(); 67 67 vector<RTSPListener*>::iterator it = listeners.begin(); 68 68 for (; it != listeners.end(); ++it) 69 (*it)->AddData(fBuffer, frameSize , presentationTime);69 (*it)->AddData(fBuffer, frameSize); 70 70 lock.unlock(); 71 71 72 72 continuePlaying(); -
libs/libmythtv/freeboxsignalmonitor.h
6 6 #include "dtvsignalmonitor.h" 7 7 #include "freeboxmediasink.h" 8 8 9 class RTSPComms;10 9 class FreeboxChannel; 11 10 11 12 12 class FreeboxSignalMonitor : public DTVSignalMonitor, public RTSPListener 13 13 { 14 14 Q_OBJECT … … 23 23 24 24 // implements RTSPListener 25 25 void AddData(unsigned char *data, 26 unsigned dataSize, 27 struct timeval); 26 unsigned dataSize); 28 27 29 28 public slots: 30 29 void deleteLater(void); -
libs/libmythtv/freeboxfeederwrapper.cpp
1 /** -*- Mode: c++ -*- 2 * FreeboxFeederWrapper 3 * Copyright (c) 2006 by Mickaël Remars 4 * Distributed as part of MythTV under GPL v2 and later. 5 */ 6 7 #include "freeboxfeederwrapper.h" 8 9 #include "freeboxfeeder.h" 10 #include "freeboxfeederrtsp.h" 11 #include "freeboxfeederudp.h" 12 #include "mythcontext.h" 13 14 #define LOC QString("FBFeed: ") 15 #define LOC_ERR QString("FBFeed, Error: ") 16 17 18 FreeboxFeederWrapper::FreeboxFeederWrapper() : 19 _feeder(NULL) 20 { 21 } 22 23 FreeboxFeederWrapper::~FreeboxFeederWrapper() 24 { 25 delete _feeder; 26 } 27 28 bool FreeboxFeederWrapper::Init(const QString &url) 29 { 30 VERBOSE(VB_RECORD, LOC + "Init() -- begin"); 31 QMutexLocker locker(&_lock); 32 if (_feeder && _feeder->CanHandle(url)) 33 { 34 _url = url; 35 VERBOSE(VB_RECORD, LOC + "Init() -- end 0"); 36 return true; 37 } 38 39 FreeboxFeeder *feeder = NULL; 40 if (url.startsWith("rtsp://", false)) 41 { 42 feeder = new FreeboxFeederRtsp(); 43 } 44 else if (url.startsWith("udp://", false)) 45 { 46 feeder = new FreeboxFeederUdp(); 47 } 48 else 49 { 50 VERBOSE(VB_RECORD, LOC_ERR + QString("Init() -- unhandled url (%1)") 51 .arg(url)); 52 } 53 bool result = feeder && feeder->Init(); 54 delete _feeder; 55 _url = url; 56 _feeder = feeder; 57 58 VERBOSE(VB_RECORD, LOC + "Init() -- adding listeners"); 59 std::vector<RTSPListener*>::iterator it = _listeners.begin(); 60 for (; it != _listeners.end(); ++it) 61 _feeder->AddListener(*it); 62 63 VERBOSE(VB_RECORD, LOC + "Init() -- end 1"); 64 return result; 65 } 66 67 void FreeboxFeederWrapper::Deinit(void) 68 { 69 VERBOSE(VB_RECORD, LOC + "Deinit() -- begin"); 70 QMutexLocker locker(&_lock); 71 assert(_feeder!=NULL); 72 _feeder->Deinit(); 73 delete _feeder; 74 _feeder = NULL; 75 _url = QString(); 76 VERBOSE(VB_RECORD, LOC + "Deinit() -- end"); 77 } 78 79 bool FreeboxFeederWrapper::Open() 80 { 81 VERBOSE(VB_RECORD, LOC + "Open() -- begin"); 82 assert(_feeder!=NULL); 83 bool result = _feeder->Open(_url); 84 VERBOSE(VB_RECORD, LOC + "Open() -- end"); 85 return result; 86 } 87 88 bool FreeboxFeederWrapper::IsOpen(void) const 89 { 90 VERBOSE(VB_RECORD, LOC + "IsOpen() -- begin"); 91 assert(_feeder!=NULL); 92 bool result = _feeder->IsOpen(); 93 VERBOSE(VB_RECORD, LOC + "IsOpen() -- end"); 94 return result; 95 } 96 97 void FreeboxFeederWrapper::Close(void) 98 { 99 VERBOSE(VB_RECORD, LOC + "Close() -- begin"); 100 assert(_feeder!=NULL); 101 _feeder->Close(); 102 VERBOSE(VB_RECORD, LOC + "Close() -- end"); 103 } 104 105 void FreeboxFeederWrapper::Run(void) 106 { 107 VERBOSE(VB_RECORD, LOC + "Run() -- begin"); 108 assert(_feeder!=NULL); 109 _feeder->Run(); 110 VERBOSE(VB_RECORD, LOC + "Run() -- end"); 111 } 112 113 void FreeboxFeederWrapper::Stop(void) 114 { 115 VERBOSE(VB_RECORD, LOC + "Stop() -- begin"); 116 assert(_feeder!=NULL); 117 _feeder->Stop(); 118 VERBOSE(VB_RECORD, LOC + "Stop() -- end"); 119 } 120 121 void FreeboxFeederWrapper::AddListener(RTSPListener *item) 122 { 123 VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- begin"); 124 if (!item) 125 { 126 VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- end 0"); 127 return; 128 } 129 130 QMutexLocker locker(&_lock); 131 std::vector<RTSPListener*>::iterator it = 132 find(_listeners.begin(), _listeners.end(), item); 133 if (it == _listeners.end()) // avoid duplicates 134 { 135 _listeners.push_back(item); 136 if(_feeder) _feeder->AddListener(item); 137 } 138 139 VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- end 1"); 140 } 141 142 void FreeboxFeederWrapper::RemoveListener(RTSPListener *item) 143 { 144 VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- begin"); 145 QMutexLocker locker(&_lock); 146 std::vector<RTSPListener*>::iterator it = 147 find(_listeners.begin(), _listeners.end(), item); 148 149 if (it == _listeners.end()) 150 { 151 VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- end (not found)"); 152 return; 153 } 154 155 // remove from local list.. 156 *it = *_listeners.rbegin(); 157 _listeners.resize(_listeners.size() - 1); 158 if(_feeder) _feeder->RemoveListener(item); 159 VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- end (ok, removed)"); 160 } -
libs/libmythtv/freeboxfeederrtsp.h
1 /** -*- Mode: c++ -*- 2 * FreeboxFeederRtsp 3 * Copyright (c) 2006 by Mickaël Remars 4 * Distributed as part of MythTV under GPL v2 and later. 5 */ 6 7 #ifndef FREEBOXFEEDERRTSP_H 8 #define FREEBOXFEEDERRTSP_H 9 10 #include "freeboxfeeder.h" 11 #include "rtspcomms.h" 12 13 14 class FreeboxFeederRtsp : public FreeboxFeeder 15 { 16 public: 17 FreeboxFeederRtsp(); 18 virtual ~FreeboxFeederRtsp(); 19 20 public: 21 bool CanHandle(const QString &url) const; 22 bool Init(void); 23 void Deinit(void); 24 25 bool Open(const QString &url); 26 bool IsOpen(void) const; 27 void Close(void); 28 29 void Run(void); 30 void Stop(void); 31 32 void AddListener(RTSPListener*); 33 void RemoveListener(RTSPListener*); 34 35 private: 36 RTSPComms m_rtsp; 37 38 private: 39 /// avoid default copy operator 40 FreeboxFeederRtsp& operator=(const FreeboxFeederRtsp&); 41 /// avoid default copy constructor 42 FreeboxFeederRtsp(const FreeboxFeederRtsp&); 43 }; 44 45 #endif // FREEBOXFEEDERRTSP_H -
libs/libmythtv/freeboxrecorder.cpp
8 8 #include "mpegstreamdata.h" 9 9 #include "tspacket.h" 10 10 #include "freeboxchannel.h" 11 #include "freeboxfeederwrapper.h" 11 12 #include "freeboxrecorder.h" 12 #include "rtspcomms.h"13 13 14 14 #define LOC QString("FBRec: ") 15 15 #define LOC_ERR QString("FBRec, Error: ") … … 23 23 _channel(channel), 24 24 _stream_data(NULL) 25 25 { 26 _channel->Get RTSP()->AddListener(this);26 _channel->GetFeeder()->AddListener(this); 27 27 } 28 28 29 29 FreeboxRecorder::~FreeboxRecorder() 30 30 { 31 31 StopRecording(); 32 _channel->Get RTSP()->RemoveListener(this);32 _channel->GetFeeder()->RemoveListener(this); 33 33 } 34 34 35 35 bool FreeboxRecorder::Open(void) 36 36 { 37 37 VERBOSE(VB_RECORD, LOC + "Open() -- begin"); 38 38 39 if (_channel->Get RTSP()->IsOpen())40 _channel->Get RTSP()->Close();39 if (_channel->GetFeeder()->IsOpen()) 40 _channel->GetFeeder()->Close(); 41 41 42 42 FreeboxChannelInfo chaninfo = _channel->GetCurrentChanInfo(); 43 43 if (!chaninfo.isValid()) … … 46 46 } 47 47 else 48 48 { 49 _error = !(_channel->Get RTSP()->Init());49 _error = !(_channel->GetFeeder()->Init(chaninfo.m_url)); 50 50 if (!_error) 51 _error = !(_channel->Get RTSP()->Open(chaninfo.m_url));51 _error = !(_channel->GetFeeder()->Open()); 52 52 } 53 53 54 54 VERBOSE(VB_RECORD, LOC + "Open() -- end err("<<_error<<")"); … … 58 58 void FreeboxRecorder::Close(void) 59 59 { 60 60 VERBOSE(VB_RECORD, LOC + "Close() -- begin"); 61 _channel->Get RTSP()->Stop();62 _channel->Get RTSP()->Close();61 _channel->GetFeeder()->Stop(); 62 _channel->GetFeeder()->Close(); 63 63 VERBOSE(VB_RECORD, LOC + "Close() -- end"); 64 64 } 65 65 … … 67 67 { 68 68 VERBOSE(VB_RECORD, LOC + "Pause() -- begin"); 69 69 DTVRecorder::Pause(clear); 70 _channel->Get RTSP()->Stop();71 _channel->Get RTSP()->Close();70 _channel->GetFeeder()->Stop(); 71 _channel->GetFeeder()->Close(); 72 72 VERBOSE(VB_RECORD, LOC + "Pause() -- end"); 73 73 } 74 74 75 75 void FreeboxRecorder::Unpause(void) 76 76 { 77 77 VERBOSE(VB_RECORD, LOC + "Unpause() -- begin"); 78 if (_recording && !_channel->Get RTSP()->IsOpen())78 if (_recording && !_channel->GetFeeder()->IsOpen()) 79 79 Open(); 80 80 DTVRecorder::Unpause(); 81 81 VERBOSE(VB_RECORD, LOC + "Unpause() -- end"); … … 99 99 if (PauseAndWait()) 100 100 continue; 101 101 102 if (!_channel->Get RTSP()->IsOpen())102 if (!_channel->GetFeeder()->IsOpen()) 103 103 { 104 104 usleep(5000); 105 105 continue; 106 106 } 107 107 108 108 // Go into main RTSP loop, feeding data to AddData 109 _channel->Get RTSP()->Run();109 _channel->GetFeeder()->Run(); 110 110 } 111 111 112 112 // Finish up... … … 122 122 { 123 123 VERBOSE(VB_RECORD, LOC + "StopRecording() -- begin"); 124 124 Pause(); 125 _channel->Get RTSP()->Close();125 _channel->GetFeeder()->Close(); 126 126 127 127 _request_recording = false; 128 128 while (_recording) … … 153 153 // AddData : feed data from RTSP flow to mythtv 154 154 // =================================================== 155 155 void FreeboxRecorder::AddData(unsigned char *data, 156 unsigned dataSize, 157 struct timeval) 156 unsigned dataSize) 158 157 { 159 158 unsigned int readIndex = 0; 160 159 -
libs/libmythtv/freeboxfeederudp.h
1 /** -*- Mode: c++ -*- 2 * FreeboxFeederUdp 3 * Copyright (c) 2006 by Mickaël Remars 4 * Distributed as part of MythTV under GPL v2 and later. 5 */ 6 7 #ifndef FREEBOXFEEDERUDP_H 8 #define FREEBOXFEEDERUDP_H 9 10 // C++ headers 11 #include <vector> 12 13 // Qt headers 14 #include <qwaitcondition.h> 15 #include <qmutex.h> 16 17 // MythTV headers 18 #include "freeboxfeeder.h" 19 20 struct URLContext; 21 22 23 class FreeboxFeederUdp : public FreeboxFeeder 24 { 25 public: 26 FreeboxFeederUdp(); 27 virtual ~FreeboxFeederUdp(); 28 29 public: 30 bool CanHandle(const QString& url) const; 31 bool Init(void); 32 void Deinit(void); 33 34 bool Open(const QString &url); 35 bool IsOpen(void) const; 36 void Close(void); 37 38 void Run(void); 39 void Stop(void); 40 41 void AddListener(RTSPListener*); 42 void RemoveListener(RTSPListener*); 43 44 private: 45 void DoEventLoop(); 46 ssize_t ProcessData(unsigned char *buf, ssize_t len); 47 48 private: 49 // UDP support (using libavformat) 50 URLContext *url_context; 51 unsigned char *network_buffer; 52 int _stream_fd; 53 54 std::vector<RTSPListener*> _listeners; 55 QWaitCondition _cond; ///< Condition used to coordinate threads 56 mutable QMutex _lock; ///< Lock used to coordinate threads 57 char _abort; 58 bool _running; 59 60 private: 61 /// avoid default copy operator 62 FreeboxFeederUdp& operator=(const FreeboxFeederUdp&); 63 /// avoid default copy constructor 64 FreeboxFeederUdp(const FreeboxFeederUdp&); 65 }; 66 67 #endif // FREEBOXFEEDERUDP_H -
libs/libmythtv/freeboxmediasink.h
19 19 public: 20 20 /// Callback function to add MPEG2 TS data 21 21 virtual void AddData(unsigned char *data, 22 unsigned int dataSize, 23 struct timeval presentationTime) = 0; 22 unsigned int dataSize) = 0; 24 23 protected: 25 24 virtual ~RTSPListener() {} 26 25 }; -
libs/libmythtv/freeboxrecorder.h
47 47 48 48 // implements RTSPListener 49 49 void AddData(unsigned char *data, 50 unsigned int dataSize, 51 struct timeval presentationTime); 50 unsigned int dataSize); 52 51 53 52 // implements MPEGSingleProgramStreamListener 54 53 void HandleSingleProgramPAT(ProgramAssociationTable *pat); -
libs/libmythtv/freeboxfeeder.h
1 /** -*- Mode: c++ -*- 2 * FreeboxFeeder 3 * Copyright (c) 2006 by Mickaël Remars 4 * Distributed as part of MythTV under GPL v2 and later. 5 */ 6 7 #ifndef FREEBOXFEEDER_H 8 #define FREEBOXFEEDER_H 9 10 #include <qstring.h> 11 12 class RTSPListener; 13 14 15 class FreeboxFeeder 16 { 17 public: 18 virtual ~FreeboxFeeder() {} 19 20 virtual bool CanHandle(const QString &url) const = 0; 21 virtual bool Init(void) = 0; 22 virtual void Deinit(void) = 0; 23 24 virtual bool Open(const QString &url) = 0; 25 virtual bool IsOpen(void) const = 0; 26 virtual void Close(void) = 0; 27 28 virtual void Run(void) = 0; 29 virtual void Stop(void) = 0; 30 31 virtual void AddListener(RTSPListener*) = 0; 32 virtual void RemoveListener(RTSPListener*) = 0; 33 }; 34 35 #endif//FREEBOXFEEDER_H 36 -
libs/libmythtv/freeboxfeederrtsp.cpp
1 /** -*- Mode: c++ -*- 2 * FreeboxFeederRtsp 3 * Copyright (c) 2006 by Mickaël Remars 4 * Distributed as part of MythTV under GPL v2 and later. 5 */ 6 7 #include "freeboxfeederrtsp.h" 8 9 FreeboxFeederRtsp::FreeboxFeederRtsp() 10 { 11 } 12 13 FreeboxFeederRtsp::~FreeboxFeederRtsp() 14 { 15 } 16 17 bool FreeboxFeederRtsp::CanHandle(const QString &url) const 18 { 19 return url.startsWith("rtsp://", false); 20 } 21 22 bool FreeboxFeederRtsp::Init(void) 23 { 24 return m_rtsp.Init(); 25 } 26 27 void FreeboxFeederRtsp::Deinit(void) 28 { 29 m_rtsp.Deinit(); 30 } 31 32 bool FreeboxFeederRtsp::Open(const QString &url) 33 { 34 return m_rtsp.Open(url); 35 } 36 37 bool FreeboxFeederRtsp::IsOpen(void) const 38 { 39 return m_rtsp.IsOpen(); 40 } 41 42 void FreeboxFeederRtsp::Close(void) 43 { 44 m_rtsp.Close(); 45 } 46 47 void FreeboxFeederRtsp::Run(void) 48 { 49 m_rtsp.Run(); 50 } 51 52 void FreeboxFeederRtsp::Stop(void) 53 { 54 m_rtsp.Stop(); 55 } 56 57 void FreeboxFeederRtsp::AddListener(RTSPListener *listener) 58 { 59 m_rtsp.AddListener(listener); 60 } 61 62 void FreeboxFeederRtsp::RemoveListener(RTSPListener *listener) 63 { 64 m_rtsp.RemoveListener(listener); 65 } -
libs/libmythtv/freeboxfeederwrapper.h
1 /** -*- Mode: c++ -*- 2 * FreeboxFeederWrapper 3 * Copyright (c) 2006 by Mickaël Remars 4 * Distributed as part of MythTV under GPL v2 and later. 5 */ 6 7 #ifndef FREEBOXFEEDERWRAPPER_H 8 #define FREEBOXFEEDERWRAPPER_H 9 10 #include <qmutex.h> 11 #include <qstring.h> 12 #include <vector> 13 14 class FreeboxFeeder; 15 class RTSPListener; 16 17 18 class FreeboxFeederWrapper 19 { 20 public: 21 FreeboxFeederWrapper(); 22 ~FreeboxFeederWrapper(); 23 24 public: 25 bool Init(const QString &url); 26 void Deinit(void); 27 28 bool Open(void); 29 bool IsOpen(void) const; 30 void Close(void); 31 32 void Run(void); 33 void Stop(void); 34 35 void AddListener(RTSPListener*); 36 void RemoveListener(RTSPListener*); 37 38 private: 39 FreeboxFeeder *_feeder; 40 QString _url; 41 mutable QMutex _lock; ///< Lock used to coordinate threads 42 std::vector<RTSPListener*> _listeners; 43 44 private: 45 /// avoid default copy operator 46 FreeboxFeederWrapper& operator=(const FreeboxFeederWrapper&); 47 /// avoid default copy constructor 48 FreeboxFeederWrapper(const FreeboxFeederWrapper&); 49 }; 50 51 #endif//FREEBOXFEEDERWRAPPER_H