} th_descrambler_t;
typedef struct th_descrambler_runtime {
- time_t dr_last_descramble;
uint32_t dr_key:1;
uint32_t dr_key_first:1;
uint8_t dr_key_index;
t->s_descramble = dr = calloc(1, sizeof(th_descrambler_runtime_t));
sbuf_init(&dr->dr_buf);
dr->dr_key_index = 0xff;
- dr->dr_last_descramble = dispatch_clock;
}
}
td->td_csa->csa_descramble(td->td_csa,
(mpegts_service_t *)td->td_service,
tsb2);
- dr->dr_last_descramble = dispatch_clock;
}
+ service_reset_streaming_status_flags(t, TSS_NO_ACCESS);
sbuf_free(&dr->dr_buf);
}
ki = tsb[3];
td->td_csa->csa_descramble(td->td_csa,
(mpegts_service_t *)td->td_service,
tsb);
- dr->dr_last_descramble = dispatch_clock;
+ service_reset_streaming_status_flags(t, TSS_NO_ACCESS);
return 1;
next:
flush_data = 1;
}
}
sbuf_append(&dr->dr_buf, tsb, 188);
+ service_set_streaming_status_flags(t, TSS_NO_ACCESS);
}
+ } else {
+ service_set_streaming_status_flags(t, TSS_NO_ACCESS);
}
if (flush_data)
descrambler_flush_table_data(t);
- if (dr->dr_last_descramble + 25 < dispatch_clock)
- return -1;
if (count && count == failed)
return -1;
return count;
void
service_set_streaming_status_flags_(service_t *t, int set)
{
- int n;
streaming_message_t *sm;
lock_assert(&t->s_stream_mutex);
- n = t->s_streaming_status;
-
- n |= set;
-
- if(n == t->s_streaming_status)
+ if(set == t->s_streaming_status)
return; // Already set
- t->s_streaming_status = n;
+ t->s_streaming_status = set;
tvhlog(LOG_DEBUG, "service", "%s: Status changed to %s%s%s%s%s%s%s%s",
service_nicename(t),
- n & TSS_INPUT_HARDWARE ? "[Hardware input] " : "",
- n & TSS_INPUT_SERVICE ? "[Input on service] " : "",
- n & TSS_MUX_PACKETS ? "[Demuxed packets] " : "",
- n & TSS_PACKETS ? "[Reassembled packets] " : "",
- n & TSS_NO_DESCRAMBLER ? "[No available descrambler] " : "",
- n & TSS_NO_ACCESS ? "[No access] " : "",
- n & TSS_GRACEPERIOD ? "[Graceperiod expired] " : "",
- n & TSS_TIMEOUT ? "[Data timeout] " : "");
+ set & TSS_INPUT_HARDWARE ? "[Hardware input] " : "",
+ set & TSS_INPUT_SERVICE ? "[Input on service] " : "",
+ set & TSS_MUX_PACKETS ? "[Demuxed packets] " : "",
+ set & TSS_PACKETS ? "[Reassembled packets] " : "",
+ set & TSS_NO_DESCRAMBLER ? "[No available descrambler] " : "",
+ set & TSS_NO_ACCESS ? "[No access] " : "",
+ set & TSS_GRACEPERIOD ? "[Graceperiod expired] " : "",
+ set & TSS_TIMEOUT ? "[Data timeout] " : "");
sm = streaming_msg_create_code(SMT_SERVICE_STATUS,
t->s_streaming_status);
#define TSS_INPUT_SERVICE 0x2
#define TSS_MUX_PACKETS 0x4
#define TSS_PACKETS 0x8
+#define TSS_NO_ACCESS 0x10
#define TSS_GRACEPERIOD 0x8000
// Errors
#define TSS_NO_DESCRAMBLER 0x10000
-#define TSS_NO_ACCESS 0x20000
-#define TSS_TIMEOUT 0x40000
+#define TSS_TIMEOUT 0x20000
#define TSS_ERRORS 0xffff0000
static inline void
service_set_streaming_status_flags(service_t *t, int flag)
{
- if ((t->s_streaming_status & flag) != flag)
- service_set_streaming_status_flags_(t, flag);
+ int n = t->s_streaming_status;
+ if ((n & flag) != flag)
+ service_set_streaming_status_flags_(t, n | flag);
+}
+
+static inline void
+service_reset_streaming_status_flags(service_t *t, int flag)
+{
+ int n = t->s_streaming_status;
+ if ((n & flag) != 0)
+ service_set_streaming_status_flags_(t, n & ~flag);
}
struct streaming_start;