X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fdvb%2Ftstools.cpp;h=1403059ffcdefc75fe3f2c8cb1a0bedc201c2514;hp=7739f60197e86ed385cbb7b556d8ef882af66153;hb=d7ab8980f447224e6ece5d741dd9a334949ca315;hpb=2a0689a69ba995ec3adcf1cd6cc20146a6d4ef58 diff --git a/lib/dvb/tstools.cpp b/lib/dvb/tstools.cpp index 7739f60..1403059 100644 --- a/lib/dvb/tstools.cpp +++ b/lib/dvb/tstools.cpp @@ -35,19 +35,17 @@ eDVBTSTools::~eDVBTSTools() int eDVBTSTools::openFile(const char *filename, int nostreaminfo) { eRawFile *f = new eRawFile(); - ePtr src = f; - - eSingleLocker l(f->getLock()); + ePtr src = f; if (f->open(filename, 1) < 0) return -1; - setSource(src, filename); + setSource(src, nostreaminfo ? NULL : filename); return 0; } -void eDVBTSTools::setSource(ePtr source, const char *stream_info_filename) +void eDVBTSTools::setSource(ePtr &source, const char *stream_info_filename) { closeFile(); @@ -72,10 +70,8 @@ void eDVBTSTools::setSource(ePtr source, const char *stream_info_fi void eDVBTSTools::closeFile() { - if (m_source) { - eSingleLocker l(m_source->getLock()); + if (m_source) closeSource(); - } } void eDVBTSTools::setSyncPID(int pid) @@ -95,34 +91,24 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed) if (!m_streaminfo.getPTS(offset, pts)) return 0; - if (!m_source->valid()) + if (!m_source || !m_source->valid()) return -1; offset -= offset % 188; - iDataSourcePositionRestorer r(m_source); - - eSingleLocker l(m_source->getLock()); - - if (m_source->lseek(offset, SEEK_SET) < 0) - { - eDebug("lseek failed"); - return -1; - } - int left = m_maxrange; while (left >= 188) { unsigned char packet[188]; - if (m_source->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"); @@ -132,8 +118,8 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed) if (packet[i] == 0x47) break; ++i; + --offset; } - offset = m_source->lseek(i - 188, SEEK_CUR); continue; } @@ -425,7 +411,7 @@ int eDVBTSTools::getNextAccessPoint(pts_t &ts, const pts_t &start, int direction void eDVBTSTools::calcBegin() { - if (!m_source->valid()) + if (!m_source || !m_source->valid()) return; if (!(m_begin_valid || m_futile)) @@ -440,13 +426,9 @@ void eDVBTSTools::calcBegin() void eDVBTSTools::calcEnd() { - if (!m_source->valid()) + if (!m_source || !m_source->valid()) return; - 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) @@ -597,34 +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_source->valid()) + if (!m_source || !m_source->valid()) { eDebug(" file not valid"); return -1; } - iDataSourcePositionRestorer r(m_source); - - eSingleLocker l(m_source->getLock()); - - if (m_source->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_source->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; @@ -632,12 +608,11 @@ int eDVBTSTools::findPMT(int &pmt_pid, int &service_id) { if (packet[i] == 0x47) break; + --position; ++i; } - m_source->lseek(i - 188, SEEK_CUR); continue; } - int pid = ((packet[1] << 8) | packet[2]) & 0x1FFF; int pusi = !!(packet[1] & 0x40);