Merge branch 'master' into experimental
[vuplus_dvbapp] / lib / dvb / tstools.cpp
index 6fe9113..2e5c566 100644 (file)
@@ -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
                }
        }