aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb
diff options
context:
space:
mode:
authorghost <andreas.monzner@multimedia-labs.de>2010-11-23 13:58:30 +0100
committerghost <andreas.monzner@multimedia-labs.de>2010-11-23 13:58:30 +0100
commit7b2960a205f3c3e3b421d1664cd38644b3ffb679 (patch)
treed57819fb0ff1eb5e64638bc584c54ae18816043f /lib/dvb
parentfc83dfbe60f36712953498b20a1c2f10737e7685 (diff)
parent7199d3c37e7e7065bd6943702b5864fa5186b9a8 (diff)
downloadenigma2-7b2960a205f3c3e3b421d1664cd38644b3ffb679.tar.gz
enigma2-7b2960a205f3c3e3b421d1664cd38644b3ffb679.zip
Merge branch 'bug_615_replace_rawfile'
Diffstat (limited to 'lib/dvb')
-rw-r--r--lib/dvb/dvb.cpp41
-rw-r--r--lib/dvb/dvb.h7
-rw-r--r--lib/dvb/idvb.h5
-rw-r--r--lib/dvb/pmt.cpp15
-rw-r--r--lib/dvb/pmt.h5
-rw-r--r--lib/dvb/tstools.cpp82
-rw-r--r--lib/dvb/tstools.h8
7 files changed, 105 insertions, 58 deletions
diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp
index 51629452..c980ac5a 100644
--- a/lib/dvb/dvb.cpp
+++ b/lib/dvb/dvb.cpp
@@ -1752,6 +1752,20 @@ RESULT eDVBChannel::getCurrentFrontendParameters(ePtr<iDVBFrontendParameters> &p
RESULT eDVBChannel::playFile(const char *file)
{
+ eRawFile *f = new eRawFile();
+ ePtr<iDataSource> source = f;
+
+ if (f->open(file) < 0)
+ {
+ eDebug("can't open PVR file %s (%m)", file);
+ return -ENOENT;
+ }
+
+ return playSource(source, file);
+}
+
+RESULT eDVBChannel::playSource(ePtr<iDataSource> &source, const char *streaminfo_file)
+{
ASSERT(!m_frontend);
if (m_pvr_thread)
{
@@ -1760,7 +1774,13 @@ RESULT eDVBChannel::playFile(const char *file)
m_pvr_thread = 0;
}
- m_tstools.openFile(file);
+ if (!source->valid())
+ {
+ eDebug("PVR source is not valid!");
+ return -ENOENT;
+ }
+
+ m_tstools.setSource(source, streaminfo_file);
/* DON'T EVEN THINK ABOUT FIXING THIS. FIX THE ATI SOURCES FIRST,
THEN DO A REAL FIX HERE! */
@@ -1787,15 +1807,7 @@ RESULT eDVBChannel::playFile(const char *file)
m_event(this, evtPreStart);
- if (m_pvr_thread->start(file, m_pvr_fd_dst))
- {
- delete m_pvr_thread;
- m_pvr_thread = 0;
- ::close(m_pvr_fd_dst);
- m_pvr_fd_dst = -1;
- eDebug("can't open PVR file %s (%m)", file);
- return -ENOENT;
- }
+ m_pvr_thread->start(source, m_pvr_fd_dst);
CONNECT(m_pvr_thread->m_event, eDVBChannel::pvrEvent);
m_state = state_ok;
@@ -1804,7 +1816,7 @@ RESULT eDVBChannel::playFile(const char *file)
return 0;
}
-void eDVBChannel::stopFile()
+void eDVBChannel::stopSource()
{
if (m_pvr_thread)
{
@@ -1814,6 +1826,13 @@ void eDVBChannel::stopFile()
}
if (m_pvr_fd_dst >= 0)
::close(m_pvr_fd_dst);
+ ePtr<iDataSource> d;
+ m_tstools.setSource(d);
+}
+
+void eDVBChannel::stopFile()
+{
+ stopSource();
}
void eDVBChannel::setCueSheet(eCueSheet *cuesheet)
diff --git a/lib/dvb/dvb.h b/lib/dvb/dvb.h
index fb925807..92771604 100644
--- a/lib/dvb/dvb.h
+++ b/lib/dvb/dvb.h
@@ -259,7 +259,10 @@ public:
/* iDVBPVRChannel */
RESULT playFile(const char *file);
void stopFile();
-
+
+ RESULT playSource(ePtr<iDataSource>& source, const char *priv=NULL);
+ void stopSource();
+
void setCueSheet(eCueSheet *cuesheet);
RESULT getLength(pts_t &len);
@@ -301,7 +304,7 @@ private:
std::list<std::pair<off_t, off_t> > m_source_span;
void getNextSourceSpan(off_t current_offset, size_t bytes_read, off_t &start, size_t &size);
void flushPVR(iDVBDemux *decoding_demux=0);
-
+
eSingleLock m_cuesheet_lock;
friend class eUsePtr<eDVBChannel>;
diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h
index f1217a6a..3996b6b6 100644
--- a/lib/dvb/idvb.h
+++ b/lib/dvb/idvb.h
@@ -15,6 +15,7 @@
#include <lib/base/object.h>
#include <lib/base/ebase.h>
#include <lib/base/elock.h>
+#include <lib/base/idatasource.h>
#include <lib/service/service.h>
#include <libsig_comp.h>
#include <connection.h>
@@ -605,6 +606,10 @@ public:
virtual RESULT playFile(const char *file) = 0;
virtual void stopFile() = 0;
+ /* new interface */
+ virtual RESULT playSource(ePtr<iDataSource> &source, const char *priv=NULL) = 0;
+ virtual void stopSource() = 0;
+
virtual void setCueSheet(eCueSheet *cuesheet) = 0;
virtual RESULT getLength(pts_t &pts) = 0;
diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp
index ea4b96c5..7b799662 100644
--- a/lib/dvb/pmt.cpp
+++ b/lib/dvb/pmt.cpp
@@ -675,6 +675,12 @@ void eDVBServicePMTHandler::SDTScanEvent(int event)
int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, eCueSheet *cue, bool simulate, eDVBService *service)
{
+ ePtr<iDataSource> s;
+ return tuneExt(ref, use_decode_demux, s, NULL, cue, simulate, service);
+}
+
+int eDVBServicePMTHandler::tuneExt(eServiceReferenceDVB &ref, int use_decode_demux, ePtr<iDataSource> &source, const char *streaminfo_file, eCueSheet *cue, bool simulate, eDVBService *service)
+{
RESULT res=0;
m_reference = ref;
@@ -704,7 +710,9 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux,
{
eWarning("no .meta file found, trying to find PMT pid");
eDVBTSTools tstools;
- if (tstools.openFile(ref.path.c_str()))
+ if (source)
+ tstools.setSource(source, streaminfo_file ? streaminfo_file : ref.path.c_str());
+ else if (tstools.openFile(ref.path.c_str()))
eWarning("failed to open file");
else
{
@@ -757,7 +765,10 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux,
if (m_pvr_channel)
{
m_pvr_channel->setCueSheet(cue);
- m_pvr_channel->playFile(ref.path.c_str());
+ if (source)
+ m_pvr_channel->playSource(source, streaminfo_file);
+ else
+ m_pvr_channel->playFile(ref.path.c_str());
}
}
diff --git a/lib/dvb/pmt.h b/lib/dvb/pmt.h
index 483c06b1..721a8fca 100644
--- a/lib/dvb/pmt.h
+++ b/lib/dvb/pmt.h
@@ -205,7 +205,12 @@ public:
int getChannel(eUsePtr<iDVBChannel> &channel);
void resetCachedProgram() { m_have_cached_program = false; }
+ /* deprecated interface */
int tune(eServiceReferenceDVB &ref, int use_decode_demux, eCueSheet *sg=0, bool simulate=false, eDVBService *service = 0);
+
+ /* new interface */
+ int tuneExt(eServiceReferenceDVB &ref, int use_decode_demux, ePtr<iDataSource> &, const char *streaminfo_file, eCueSheet *sg=0, bool simulate=false, eDVBService *service = 0);
+
void free();
private:
bool m_have_cached_program;
diff --git a/lib/dvb/tstools.cpp b/lib/dvb/tstools.cpp
index d5ad2494..bd363089 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,39 @@ 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;
+
+ 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 +64,14 @@ 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)
+ closeSource();
}
void eDVBTSTools::setSyncPID(int pid)
@@ -77,31 +91,24 @@ 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 || !m_source->valid())
return -1;
offset -= offset % 188;
- eSingleLocker l(m_file_lock);
- if (m_file.lseek(offset, SEEK_SET) < 0)
- {
- eDebug("lseek failed");
- return -1;
- }
-
int left = m_maxrange;
while (left >= 188)
{
unsigned char packet[188];
- if (m_file.read(packet, 188) != 188)
+ if (m_source->read(offset, packet, 188) != 188)
{
eDebug("read error");
break;
}
left -= 188;
offset += 188;
-
+
if (packet[0] != 0x47)
{
eDebug("resync");
@@ -111,8 +118,8 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed)
if (packet[i] == 0x47)
break;
++i;
+ --offset;
}
- offset = m_file.lseek(i - 188, SEEK_CUR);
continue;
}
@@ -404,7 +411,7 @@ int eDVBTSTools::getNextAccessPoint(pts_t &ts, const pts_t &start, int direction
void eDVBTSTools::calcBegin()
{
- if (!m_file.valid())
+ if (!m_source || !m_source->valid())
return;
if (!(m_begin_valid || m_futile))
@@ -419,11 +426,10 @@ void eDVBTSTools::calcBegin()
void eDVBTSTools::calcEnd()
{
- if (!m_file.valid())
+ if (!m_source || !m_source->valid())
return;
- eSingleLocker l(m_file_lock);
- off_t end = m_file.lseek(0, SEEK_END);
+ off_t end = m_source->lseek(0, SEEK_END);
if (llabs(end - m_last_filelength) > 1*1024*1024)
{
@@ -573,31 +579,28 @@ 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 || !m_source->valid())
{
eDebug(" file not valid");
return -1;
}
- eSingleLocker l(m_file_lock);
- if (m_file.lseek(0, SEEK_SET) < 0)
- {
- eDebug("seek failed");
- return -1;
- }
+ off_t position=0;
int left = 5*1024*1024;
while (left >= 188)
{
unsigned char packet[188];
- if (m_file.read(packet, 188) != 188)
+ int ret = m_source->read(position, packet, 188);
+ if (ret != 188)
{
eDebug("read error");
break;
}
left -= 188;
-
+ position += 188;
+
if (packet[0] != 0x47)
{
int i = 0;
@@ -605,12 +608,11 @@ int eDVBTSTools::findPMT(int &pmt_pid, int &service_id)
{
if (packet[i] == 0x47)
break;
+ --position;
++i;
}
- m_file.lseek(i - 188, SEEK_CUR);
continue;
}
-
int pid = ((packet[1] << 8) | packet[2]) & 0x1FFF;
int pusi = !!(packet[1] & 0x40);
diff --git a/lib/dvb/tstools.h b/lib/dvb/tstools.h
index ed8b9241..1192cd2d 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;