X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fdvb%2Ftstools.cpp;h=2e5c5665d9e7a01bb15508078dbc2c5264e55ca6;hp=6fe9113613aa2b01537783f2d6ca1e7a2ee43d2b;hb=8c877cd5c0fa7f79f1191ce9c5cc112abfcd0a68;hpb=3e45b153a93894c4c382d3ba5ded974c738e9589 diff --git a/lib/dvb/tstools.cpp b/lib/dvb/tstools.cpp index 6fe9113..2e5c566 100644 --- a/lib/dvb/tstools.cpp +++ b/lib/dvb/tstools.cpp @@ -71,7 +71,8 @@ void eDVBTSTools::setSearchRange(int maxrange) int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed) { if (m_use_streaminfo) - return m_streaminfo.getPTS(offset, pts); + if (!m_streaminfo.getPTS(offset, pts)) + return 0; if (!m_file.valid()) return -1; @@ -144,9 +145,9 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed) payload = packet + 4; - if (m_pid >= 0) +/* if (m_pid >= 0) if (pid != m_pid) - continue; + continue; */ if (!pusi) continue; @@ -186,7 +187,8 @@ int eDVBTSTools::fixupPTS(const off_t &offset, pts_t &now) { if (m_use_streaminfo) { - return m_streaminfo.fixupPTS(offset, now); + if (!m_streaminfo.fixupPTS(offset, now)) + return 0; } else { /* for the simple case, we assume one epoch, with up to one wrap around in the middle. */ @@ -650,17 +652,23 @@ int eDVBTSTools::findFrame(off_t &_offset, size_t &len, int &direction, int fram int eDVBTSTools::findNextPicture(off_t &offset, size_t &len, int &distance, int frame_types) { - int nr_frames = 0; + int nr_frames, direction; // eDebug("trying to move %d frames at %llx", distance, offset); frame_types = frametypeI; /* TODO: intelligent "allow IP frames when not crossing an I-Frame */ - int direction = distance > 0 ? 0 : -1; - distance = abs(distance); - off_t new_offset = offset; size_t new_len = len; - + int first = 1; + + if (distance > 0) { + direction = 0; + nr_frames = 0; + } else { + direction = -1; + nr_frames = -1; + distance = -distance+1; + } while (distance > 0) { int dir = direction; @@ -674,11 +682,18 @@ int eDVBTSTools::findNextPicture(off_t &offset, size_t &len, int &distance, int // eDebug("we moved %d, %d to go frames (now at %llx)", dir, distance, new_offset); - if (distance >= 0) + if (distance >= 0 || direction == 0) { + first = 0; offset = new_offset; len = new_len; nr_frames += abs(dir); + } + else if (first) { + first = 0; + offset = new_offset; + len = new_len; + nr_frames += abs(dir) + distance; // never jump forward during rewind } }