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;
payload = packet + 4;
- if (m_pid >= 0)
+/* if (m_pid >= 0)
if (pid != m_pid)
- continue;
+ continue; */
if (!pusi)
continue;
{
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. */
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;
// 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
}
}