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;
}
{
while (1)
{
- __u8 data[4096];
+ __u8 buffer[16384];
int r;
- r = ::read(m_fd, data, 4096);
+ r = ::read(m_fd, buffer, 16384);
if (!r)
- break;
+ return;
if(r < 0)
{
- eWarning("ERROR reading section - %m\n");
+ if (errno == EAGAIN || errno == EINTR) /* ok */
+ return;
+ eWarning("ERROR reading PES (fd=%d) - %m", m_fd);
return;
}
+
if (m_active)
- m_read(data, r);
+ m_read(buffer, r);
+ else
+ eWarning("PES reader not active");
+ if (r != 16384)
+ break;
}
}
if (m_fd >= 0)
{
+ ::ioctl(m_fd, DMX_SET_BUFFER_SIZE, 64*1024);
+ ::fcntl(m_fd, F_SETFL, O_NONBLOCK);
m_notifier = new eSocketNotifier(context, m_fd, eSocketNotifier::Read, false);
CONNECT(m_notifier->activated, eDVBPESReader::data);
res = 0;
flt.flags = DMX_IMMEDIATE_START;
res = ::ioctl(m_fd, DMX_SET_PES_FILTER, &flt);
+
+ if (res)
+ eWarning("PES filter: DMX_SET_PES_FILTER - %m");
if (!res)
m_active = 1;
return res;
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;
};
eDVBRecordFileThread::eDVBRecordFileThread()
- : m_ts_parser(m_stream_info)
+ :eFilePushThread(IOPRIO_CLASS_RT, 7), m_ts_parser(m_stream_info)
{
m_current_offset = 0;
}
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;
+ bool retry=false;
+ 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;
+ }
+}