From 2a0689a69ba995ec3adcf1cd6cc20146a6d4ef58 Mon Sep 17 00:00:00 2001 From: ghost Date: Tue, 9 Nov 2010 23:29:55 +0100 Subject: [PATCH 1/1] tstools.h/cpp: migrate to iDataSource --- lib/dvb/tstools.cpp | 83 +++++++++++++++++++++++++++++++++++------------------ lib/dvb/tstools.h | 8 ++++-- 2 files changed, 60 insertions(+), 31 deletions(-) diff --git a/lib/dvb/tstools.cpp b/lib/dvb/tstools.cpp index d5ad249..7739f60 100644 --- a/lib/dvb/tstools.cpp +++ b/lib/dvb/tstools.cpp @@ -7,7 +7,6 @@ #include 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 src = f; + + eSingleLocker l(f->getLock()); + + if (f->open(filename, 1) < 0) + return -1; + + setSource(src, filename); + + return 0; +} + +void eDVBTSTools::setSource(ePtr 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 ed8b924..41312c4 100644 --- a/lib/dvb/tstools.h +++ b/lib/dvb/tstools.h @@ -19,9 +19,12 @@ public: eDVBTSTools(); ~eDVBTSTools(); + void setSource(ePtr 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 m_source; int m_begin_valid, m_end_valid; pts_t m_pts_begin, m_pts_end; -- 2.7.4