diff --git a/src/descrambler.h b/src/descrambler.h index 36c7a52d..12fb20d8 100755 --- a/src/descrambler.h +++ b/src/descrambler.h @@ -60,7 +60,6 @@ typedef struct th_descrambler { } 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; diff --git a/src/descrambler/descrambler.c b/src/descrambler/descrambler.c index d57567ca..602f5172 100755 --- a/src/descrambler/descrambler.c +++ b/src/descrambler/descrambler.c @@ -133,7 +133,6 @@ descrambler_service_start ( service_t *t ) 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; } } @@ -362,8 +361,8 @@ descrambler_descramble ( service_t *t, 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]; @@ -396,7 +395,7 @@ descrambler_descramble ( service_t *t, 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; @@ -446,12 +445,13 @@ next2: } } 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; diff --git a/src/service.c b/src/service.c index 639cb91a..68f4f87e 100644 --- a/src/service.c +++ b/src/service.c @@ -1120,29 +1120,24 @@ service_servicetype_txt ( service_t *s ) 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); diff --git a/src/service.h b/src/service.h index 6707daa9..d7706e4f 100644 --- a/src/service.h +++ b/src/service.h @@ -379,13 +379,13 @@ typedef struct service { #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 @@ -506,8 +506,17 @@ void service_set_streaming_status_flags_(service_t *t, int flag); 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;