}
}
+#define DVR_FEED(f) \
+ (((f)->type == DMX_TYPE_TS) && \
+ ((f)->feed.ts.is_filtering) && \
+ (((f)->ts_type & (TS_PACKET|TS_PAYLOAD_ONLY)) == TS_PACKET))
void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf)
{
struct dvb_demux_feed *feed;
struct list_head *pos, *head=&demux->feed_list;
u16 pid = ts_pid(buf);
+ int dvr_done = 0;
list_for_each(pos, head) {
feed = list_entry(pos, struct dvb_demux_feed, list_head);
- if (feed->pid == pid)
+
+ if ((feed->pid != pid) && (feed->pid != 0x2000))
+ continue;
+
+ /* copy each packet only once to the dvr device, even
+ * if a PID is in multiple filters (e.g. video + PCR) */
+ if ((DVR_FEED(feed)) && (dvr_done++))
+ continue;
+
+ if (feed->pid == pid) {
dvb_dmx_swfilter_packet_type (feed, buf);
+ if (DVR_FEED(feed))
+ continue;
+ }
+
if (feed->pid == 0x2000)
feed->cb.ts(buf, 188, 0, 0, &feed->feed.ts, DMX_OK);
}
pid_t thread_pid;
unsigned long release_jiffies;
unsigned long lost_sync_jiffies;
+ int aquire_signal;
int bending;
int lnb_drift;
int timeout_count;
fe->lost_sync_count = 0;
fe->lost_sync_jiffies = jiffies;
fe->lnb_drift = 0;
+ fe->aquire_signal = 1;
if (fe->status & ~FE_TIMEDOUT)
dvb_frontend_add_event (fe, 0);
memcpy (&fe->parameters, param,
*/
static void dvb_frontend_recover (struct dvb_frontend_data *fe)
{
+ int j = fe->lost_sync_count;
+ int stepsize;
+
dprintk ("%s\n", __FUNCTION__);
#if 0
/**
* let's start a zigzag scan to compensate LNB drift...
*/
- {
- int j = fe->lost_sync_count;
- int stepsize;
-
if (fe->info->type == FE_QPSK)
stepsize = fe->parameters.u.qpsk.symbol_rate / 16000;
else if (fe->info->type == FE_QAM)
}
dvb_frontend_set_parameters (fe, &fe->parameters, 0);
- }
dvb_frontend_internal_ioctl (&fe->frontend, FE_RESET, NULL);
}
if (s & FE_HAS_LOCK) {
fe->timeout_count = 0;
fe->lost_sync_count = 0;
+ fe->aquire_signal = 0;
} else {
fe->lost_sync_count++;
if (!(fe->info->caps & FE_CAN_RECOVER)) {
if (!(fe->info->caps & FE_CAN_CLEAN_SETUP)) {
- if (fe->lost_sync_count < 10)
+ if (fe->lost_sync_count < 10) {
+ if (fe->aquire_signal)
+ dvb_frontend_internal_ioctl(
+ &fe->frontend,
+ FE_RESET, NULL);
continue;
}
+ }
dvb_frontend_recover (fe);
delay = HZ/5;
}
break;
case FE_SET_FRONTEND:
err = dvb_frontend_set_parameters (fe, parg, 1);
+ set_current_state(TASK_INTERRUPTIBLE);
+ schedule_timeout(1);
+ wake_up_interruptible(&fe->wait_queue);
break;
case FE_GET_EVENT:
err = dvb_frontend_get_event (fe, parg, file->f_flags);
else
ves1x93_writereg (i2c, 0x05, init_1x93_tab[0x05] & 0x7f);
- ves1x93_writereg (i2c, 0x00, 0x00);
- ves1x93_writereg (i2c, 0x00, 0x01);
-
/* ves1993 hates this, will lose lock */
if (demod_type != DEMOD_VES1993)
ves1x93_clr_bit (i2c);