#include <stdio.h>
eDVBTSTools::eDVBTSTools()
+ :m_file_lock(true)
{
m_pid = -1;
m_maxrange = 256*1024;
m_samples_taken = 0;
+ eSingleLocker l(m_file_lock);
if (m_file.open(filename, 1) < 0)
return -1;
return 0;
void eDVBTSTools::closeFile()
{
+ eSingleLocker l(m_file_lock);
m_file.close();
}
return -1;
offset -= offset % 188;
-
+
+ eSingleLocker l(m_file_lock);
if (m_file.lseek(offset, SEEK_SET) < 0)
{
eDebug("lseek failed");
{
if (!m_file.valid())
return;
-
+
+ eSingleLocker l(m_file_lock);
off_t end = m_file.lseek(0, SEEK_END);
if (llabs(end - m_last_filelength) > 1*1024*1024)
return -1;
}
+ eSingleLocker l(m_file_lock);
if (m_file.lseek(0, SEEK_SET) < 0)
{
eDebug("seek failed");
else if (direction == +1)
direction = 0;
}
- /* let's find the next frame after the given offset */
off_t start = offset;
+#if 0
+ /* backtrack to find the previous sequence start, in case of MPEG2 */
+ if ((data & 0xFF) == 0x00) {
+ do {
+ --start;
+ if (m_streaminfo.getStructureEntry(start, data, 0))
+ {
+ eDebug("get previous failed");
+ return -1;
+ }
+ } while (((data & 0xFF) != 9) && ((data & 0xFF) != 0x00) && ((data & 0xFF) != 0xB3)); /* sequence start or previous frame */
+ if ((data & 0xFF) != 0xB3)
+ start = offset; /* Failed to find corresponding sequence start, so never mind */
+ }
+
+#endif
+
+ /* let's find the next frame after the given offset */
do {
if (m_streaminfo.getStructureEntry(offset, data, 1))
{
// eDebug("%08llx@%llx (next)", data, offset);
} while (((data & 0xFF) != 9) && ((data & 0xFF) != 0x00)); /* next frame */
+#if 0
/* align to TS pkt start */
-// start = start - (start % 188);
-// offset = offset - (offset % 188);
+ start = start - (start % 188);
+ offset = offset - (offset % 188);
+#endif
len = offset - start;
_offset = start;