00001
00010 #include <algorithm>
00011
00012 #include "iptvfeederfile.h"
00013
00014
00015 #include <QUrl>
00016
00017
00018 #include <BasicUsageEnvironment.hh>
00019 #include <Groupsock.hh>
00020 #include <GroupsockHelper.hh>
00021 #include <ByteStreamFileSource.hh>
00022 #include <TunnelEncaps.hh>
00023
00024
00025 #include "iptvmediasink.h"
00026 #include "mythcontext.h"
00027 #include "mythlogging.h"
00028 #include "tspacket.h"
00029
00030 #define LOC QString("FbFeedFile: ")
00031
00032
00033 IPTVFeederFile::IPTVFeederFile() :
00034 _source(NULL),
00035 _sink(NULL)
00036 {
00037 }
00038
00039 IPTVFeederFile::~IPTVFeederFile()
00040 {
00041 Close();
00042 }
00043
00044 bool IPTVFeederFile::IsFile(const QString &url)
00045 {
00046 return url.startsWith("file:", Qt::CaseInsensitive);
00047 }
00048
00049 bool IPTVFeederFile::Open(const QString &url)
00050 {
00051 LOG(VB_RECORD, LOG_INFO, LOC + QString("Open(%1) -- begin").arg(url));
00052
00053 QMutexLocker locker(&_lock);
00054
00055 if (_source)
00056 {
00057 LOG(VB_RECORD, LOG_INFO, LOC + "Open() -- end 1");
00058 return true;
00059 }
00060
00061 QUrl parse(url);
00062 if (parse.path().isEmpty() || (parse.scheme().toLower() != "file"))
00063 {
00064 LOG(VB_GENERAL, LOG_ERR, LOC + "Open() -- end 2");
00065 return false;
00066 }
00067
00068
00069 if (!InitEnv())
00070 return false;
00071
00072 QString pathstr = parse.toLocalFile();
00073 QByteArray path = pathstr.toLocal8Bit();
00074
00075 _source = ByteStreamFileSource::createNew(
00076 *_live_env, path.constData());
00077 if (!_source)
00078 {
00079 LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to create Live File Source.");
00080 FreeEnv();
00081 return false;
00082 }
00083
00084 _sink = IPTVMediaSink::CreateNew(*_live_env, TSPacket::kSize * 128*1024);
00085 if (!_sink)
00086 {
00087 LOG(VB_GENERAL, LOG_ERR, QString("IPTV # Failed to create sink: %1")
00088 .arg(_live_env->getResultMsg()));
00089
00090 Medium::close(_source);
00091 _source = NULL;
00092 FreeEnv();
00093
00094 return false;
00095 }
00096
00097 _sink->startPlaying(*_source, NULL, NULL);
00098 vector<TSDataListener*>::iterator it = _listeners.begin();
00099 for (; it != _listeners.end(); ++it)
00100 _sink->AddListener(*it);
00101
00102 LOG(VB_RECORD, LOG_INFO, LOC + "Open() -- end");
00103
00104 return true;
00105 }
00106
00107 void IPTVFeederFile::Close(void)
00108 {
00109 LOG(VB_RECORD, LOG_INFO, LOC + "Close() -- begin");
00110 Stop();
00111
00112 QMutexLocker locker(&_lock);
00113
00114 if (_sink)
00115 {
00116 Medium::close(_sink);
00117 _sink = NULL;
00118 }
00119
00120 if (_source)
00121 {
00122 Medium::close(_source);
00123 _source = NULL;
00124 }
00125
00126 FreeEnv();
00127
00128 LOG(VB_RECORD, LOG_INFO, LOC + "Close() -- end");
00129 }
00130
00131 void IPTVFeederFile::AddListener(TSDataListener *item)
00132 {
00133 LOG(VB_RECORD, LOG_INFO, LOC + QString("AddListener(0x%1) -- begin")
00134 .arg((uint64_t)item,0,16));
00135 if (!item)
00136 {
00137 LOG(VB_RECORD, LOG_INFO, LOC + QString("AddListener(0x%1) -- end")
00138 .arg((uint64_t)item,0,16));
00139 return;
00140 }
00141
00142
00143 RemoveListener(item);
00144
00145
00146 QMutexLocker locker(&_lock);
00147 _listeners.push_back(item);
00148
00149 if (_sink)
00150 _sink->AddListener(item);
00151
00152 LOG(VB_RECORD, LOG_INFO, LOC + QString("AddListener(0x%1) -- end")
00153 .arg((uint64_t)item,0,16));
00154 }
00155
00156 void IPTVFeederFile::RemoveListener(TSDataListener *item)
00157 {
00158 LOG(VB_RECORD, LOG_INFO, LOC + QString("RemoveListener(0x%1) -- begin")
00159 .arg((uint64_t)item,0,16));
00160 QMutexLocker locker(&_lock);
00161 vector<TSDataListener*>::iterator it =
00162 find(_listeners.begin(), _listeners.end(), item);
00163
00164 if (it == _listeners.end())
00165 {
00166 LOG(VB_RECORD, LOG_INFO, LOC + QString("RemoveListener(0x%1) -- end 1")
00167 .arg((uint64_t)item,0,16));
00168 return;
00169 }
00170
00171
00172 *it = *_listeners.rbegin();
00173 _listeners.resize(_listeners.size() - 1);
00174
00175 if (_sink)
00176 _sink->RemoveListener(item);
00177
00178 LOG(VB_RECORD, LOG_INFO, LOC + QString("RemoveListener(0x%1) -- end 2")
00179 .arg((uint64_t)item,0,16));
00180 }