aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorghost <andreas.monzner@multimedia-labs.de>2010-11-09 23:29:55 +0100
committerghost <andreas.monzner@multimedia-labs.de>2010-11-09 23:29:55 +0100
commit2a0689a69ba995ec3adcf1cd6cc20146a6d4ef58 (patch)
tree0abec77b9c4a4aceb1b6937cfc56852aa70bfb05 /lib
parent593d7ac3a2a3c916eda486352bbcc25c4aede678 (diff)
downloadenigma2-2a0689a69ba995ec3adcf1cd6cc20146a6d4ef58.tar.gz
enigma2-2a0689a69ba995ec3adcf1cd6cc20146a6d4ef58.zip
tstools.h/cpp: migrate to iDataSource
Diffstat (limited to 'lib')
-rw-r--r--lib/dvb/tstools.cpp83
-rw-r--r--lib/dvb/tstools.h8
2 files changed, 60 insertions, 31 deletions
diff --git a/lib/dvb/tstools.cpp b/lib/dvb/tstools.cpp
index d5ad2494..7739f601 100644
--- a/lib/dvb/tstools.cpp
+++ b/lib/dvb/tstools.cpp
@@ -7,7 +7,6 @@
#include <stdio.h>
eDVBTSTools::eDVBTSTools()
- :m_file_lock(true)
{
m_pid = -1;
m_maxrange = 256*1024;
@@ -23,19 +22,41 @@ eDVBTSTools::eDVBTSTools()
m_futile = 0;
}
+void eDVBTSTools::closeSource()
+{
+ m_source = NULL;
+}
+
eDVBTSTools::~eDVBTSTools()
{
- closeFile();
+ closeSource();
}
int eDVBTSTools::openFile(const char *filename, int nostreaminfo)
{
+ eRawFile *f = new eRawFile();
+ ePtr<iDataSource> src = f;
+
+ eSingleLocker l(f->getLock());
+
+ if (f->open(filename, 1) < 0)
+ return -1;
+
+ setSource(src, filename);
+
+ return 0;
+}
+
+void eDVBTSTools::setSource(ePtr<iDataSource> source, const char *stream_info_filename)
+{
closeFile();
-
- if (!nostreaminfo)
+
+ m_source = source;
+
+ if (stream_info_filename)
{
- eDebug("loading streaminfo for %s", filename);
- m_streaminfo.load(filename);
+ eDebug("loading streaminfo for %s", stream_info_filename);
+ m_streaminfo.load(stream_info_filename);
}
if (!m_streaminfo.empty())
@@ -45,19 +66,16 @@ int eDVBTSTools::openFile(const char *filename, int nostreaminfo)
// eDebug("no recorded stream information available");
m_use_streaminfo = 0;
}
-
- m_samples_taken = 0;
- eSingleLocker l(m_file_lock);
- if (m_file.open(filename, 1) < 0)
- return -1;
- return 0;
+ m_samples_taken = 0;
}
void eDVBTSTools::closeFile()
{
- eSingleLocker l(m_file_lock);
- m_file.close();
+ if (m_source) {
+ eSingleLocker l(m_source->getLock());
+ closeSource();
+ }
}
void eDVBTSTools::setSyncPID(int pid)
@@ -77,13 +95,16 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed)
if (!m_streaminfo.getPTS(offset, pts))
return 0;
- if (!m_file.valid())
+ if (!m_source->valid())
return -1;
offset -= offset % 188;
- eSingleLocker l(m_file_lock);
- if (m_file.lseek(offset, SEEK_SET) < 0)
+ iDataSourcePositionRestorer r(m_source);
+
+ eSingleLocker l(m_source->getLock());
+
+ if (m_source->lseek(offset, SEEK_SET) < 0)
{
eDebug("lseek failed");
return -1;
@@ -94,7 +115,7 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed)
while (left >= 188)
{
unsigned char packet[188];
- if (m_file.read(packet, 188) != 188)
+ if (m_source->read(packet, 188) != 188)
{
eDebug("read error");
break;
@@ -112,7 +133,7 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed)
break;
++i;
}
- offset = m_file.lseek(i - 188, SEEK_CUR);
+ offset = m_source->lseek(i - 188, SEEK_CUR);
continue;
}
@@ -404,7 +425,7 @@ int eDVBTSTools::getNextAccessPoint(pts_t &ts, const pts_t &start, int direction
void eDVBTSTools::calcBegin()
{
- if (!m_file.valid())
+ if (!m_source->valid())
return;
if (!(m_begin_valid || m_futile))
@@ -419,11 +440,14 @@ void eDVBTSTools::calcBegin()
void eDVBTSTools::calcEnd()
{
- if (!m_file.valid())
+ if (!m_source->valid())
return;
- eSingleLocker l(m_file_lock);
- off_t end = m_file.lseek(0, SEEK_END);
+ iDataSourcePositionRestorer r(m_source);
+
+ eSingleLocker l(m_source->getLock());
+
+ off_t end = m_source->lseek(0, SEEK_END);
if (llabs(end - m_last_filelength) > 1*1024*1024)
{
@@ -573,14 +597,17 @@ int eDVBTSTools::takeSample(off_t off, pts_t &p)
int eDVBTSTools::findPMT(int &pmt_pid, int &service_id)
{
/* FIXME: this will be factored out soon! */
- if (!m_file.valid())
+ if (!m_source->valid())
{
eDebug(" file not valid");
return -1;
}
- eSingleLocker l(m_file_lock);
- if (m_file.lseek(0, SEEK_SET) < 0)
+ iDataSourcePositionRestorer r(m_source);
+
+ eSingleLocker l(m_source->getLock());
+
+ if (m_source->lseek(0, SEEK_SET) < 0)
{
eDebug("seek failed");
return -1;
@@ -591,7 +618,7 @@ int eDVBTSTools::findPMT(int &pmt_pid, int &service_id)
while (left >= 188)
{
unsigned char packet[188];
- if (m_file.read(packet, 188) != 188)
+ if (m_source->read(packet, 188) != 188)
{
eDebug("read error");
break;
@@ -607,7 +634,7 @@ int eDVBTSTools::findPMT(int &pmt_pid, int &service_id)
break;
++i;
}
- m_file.lseek(i - 188, SEEK_CUR);
+ m_source->lseek(i - 188, SEEK_CUR);
continue;
}
diff --git a/lib/dvb/tstools.h b/lib/dvb/tstools.h
index ed8b9241..41312c4c 100644
--- a/lib/dvb/tstools.h
+++ b/lib/dvb/tstools.h
@@ -19,9 +19,12 @@ public:
eDVBTSTools();
~eDVBTSTools();
+ void setSource(ePtr<iDataSource> source, const char *streaminfo_filename=NULL);
+ void closeSource();
+
int openFile(const char *filename, int nostreaminfo = 0);
void closeFile();
-
+
void setSyncPID(int pid);
void setSearchRange(int maxrange);
@@ -77,8 +80,7 @@ private:
int m_pid;
int m_maxrange;
- eSingleLock m_file_lock;
- eRawFile m_file;
+ ePtr<iDataSource> m_source;
int m_begin_valid, m_end_valid;
pts_t m_pts_begin, m_pts_end;