if (ioctl(fd, DMX_GET_STC, &stc) < 0)
{
+ eDebug("DMX_GET_STC failed!");
::close(fd);
return -1;
}
pts = stc.stc;
+ eDebug("DMX_GET_STC - %lld", pts);
+
::close(fd);
return 0;
}
return;
if(r < 0)
{
- if (errno == EAGAIN) /* ok */
+ if (errno == EAGAIN || errno == EINTR) /* ok */
return;
eWarning("ERROR reading PES (fd=%d) - %m", m_fd);
return;
m_read(buffer, r);
else
eWarning("PES reader not active");
+ if (r != 16384)
+ break;
}
}
void saveTimingInformation(const std::string &filename);
protected:
- void filterRecordData(const unsigned char *data, int len);
+ int filterRecordData(const unsigned char *data, int len, size_t ¤t_span_remaining);
private:
eMPEGStreamParserTS m_ts_parser;
eMPEGStreamInformation m_stream_info;
m_stream_info.save(filename.c_str());
}
-void eDVBRecordFileThread::filterRecordData(const unsigned char *data, int len)
+int eDVBRecordFileThread::filterRecordData(const unsigned char *data, int len, size_t ¤t_span_remaining)
{
m_ts_parser.parseData(m_current_offset, data, len);
m_current_offset += len;
+
+ return len;
}
DEFINE_REF(eDVBTSRecorder);
m_running = 0;
m_target_fd = -1;
m_thread = new eDVBRecordFileThread();
+ CONNECT(m_thread->m_event, eDVBTSRecorder::filepushEvent);
#ifndef HAVE_ADD_PID
m_demux->m_dvr_busy = 1;
#endif
}
m_pids[pid] = fd;
#else
- if (::ioctl(m_source_fd, DMX_ADD_PID, pid))
- perror("DMX_ADD_PID");
- else
- m_pids[pid] = 1;
+ while(true) {
+ if (::ioctl(m_source_fd, DMX_ADD_PID, pid) < 0) {
+ perror("DMX_ADD_PID");
+ if (errno == EAGAIN || errno == EINTR) {
+ eDebug("retry!");
+ continue;
+ }
+ } else
+ m_pids[pid] = 1;
+ break;
+ }
#endif
return 0;
}
#else
if (m_pids[pid] != -1)
{
- if (::ioctl(m_source_fd, DMX_REMOVE_PID, pid))
- perror("DMX_REMOVE_PID");
+ while(true) {
+ if (::ioctl(m_source_fd, DMX_REMOVE_PID, pid) < 0) {
+ perror("DMX_REMOVE_PID");
+ if (errno == EAGAIN || errno == EINTR) {
+ eDebug("retry!");
+ continue;
+ }
+ }
+ break;
+ }
}
#endif
m_pids[pid] = -1;
}
+
+void eDVBTSRecorder::filepushEvent(int event)
+{
+ switch (event)
+ {
+ case eFilePushThread::evtWriteError:
+ m_event(eventWriteError);
+ break;
+ }
+}