From: Jaroslav Kysela Date: Fri, 3 Nov 2017 16:37:10 +0000 (+0100) Subject: service: use s_pending_restart more properly, issue #4701 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=910fef46754fb11055a664fc950eb10db57bc2f7;p=thirdparty%2Ftvheadend.git service: use s_pending_restart more properly, issue #4701 --- diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index 4256ef004..e608096b6 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -2660,7 +2660,7 @@ psi_parse_pmt update&PMT_UPDATE_CAID_PID ? ", CAID PID changed":"", update&PMT_REORDERED ? ", PIDs reordered":""); - service_request_save((service_t*)t, 1); + service_request_save((service_t*)t, 0); // Only restart if something that our clients worry about did change if(update & ~(PMT_UPDATE_NEW_CA_STREAM | @@ -2678,11 +2678,6 @@ psi_parse_pmt t->s_verified = 1; } - /* FIXME: Move pending_restart handling to another place? */ - if (atomic_set(&t->s_pending_restart, 0) && !ret) - tvhdebug(mt->mt_subsys, "%s: Service \"%s\" forced restart", - mt->mt_name, service_nicename((service_t*)t)); - *_update = update; return ret; } diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index acd0334b0..24dd2342f 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -462,7 +462,6 @@ mpegts_service_setsourceinfo(service_t *t, source_info_t *si) /* Validate */ assert(s->s_source_type == S_MPEG_TS); - lock_assert(&global_lock); /* Update */ memset(si, 0, sizeof(struct source_info)); diff --git a/src/parsers/parsers.c b/src/parsers/parsers.c index 5eac1ad6c..3089e9476 100644 --- a/src/parsers/parsers.c +++ b/src/parsers/parsers.c @@ -671,7 +671,7 @@ parse_mpa123(service_t *t, elementary_stream_t *st) default: fsize = 0; } - if (fsize && st->es_audio_version != layer) { + if (fsize && st->es_audio_version < layer) { st->es_audio_version = layer; atomic_set(&t->s_pending_restart, 1); } @@ -1065,7 +1065,8 @@ parser_set_stream_vparam(elementary_stream_t *st, int width, int height, st->es_width = width; st->es_height = height; st->es_frame_duration = duration; - service_request_save(st->es_service, 1); + service_request_save(st->es_service, 0); + atomic_set(&st->es_service->s_pending_restart, 1); } } diff --git a/src/service.c b/src/service.c index 7e38a9599..219371968 100644 --- a/src/service.c +++ b/src/service.c @@ -1460,23 +1460,16 @@ service_set_streaming_status_flags_(service_t *t, int set) } /** - * Restart output on a service. + * Restart output on a service (streams only). * Happens if the stream composition changes. * (i.e. an AC3 stream disappears, etc) */ void -service_restart(service_t *t) +service_restart_streams(service_t *t) { streaming_message_t *sm; - int had_components; - - if(t->s_type != STYPE_STD) - goto refresh; - - pthread_mutex_lock(&t->s_stream_mutex); - - had_components = TAILQ_FIRST(&t->s_filt_components) != NULL && - t->s_running; + int had_components = TAILQ_FIRST(&t->s_filt_components) != NULL && + t->s_running; service_build_filter(t); @@ -1493,13 +1486,25 @@ service_restart(service_t *t) streaming_service_deliver(t, sm); t->s_running = 0; } +} - pthread_mutex_unlock(&t->s_stream_mutex); +/** + * Restart output on a service. + * Happens if the stream composition changes. + * (i.e. an AC3 stream disappears, etc) + */ +void +service_restart(service_t *t) +{ + if (t->s_type == STYPE_STD) { + pthread_mutex_lock(&t->s_stream_mutex); + service_restart_streams(t); + pthread_mutex_unlock(&t->s_stream_mutex); - descrambler_caid_changed(t); + descrambler_caid_changed(t); + } -refresh: - if(t->s_refresh_feed != NULL) + if (t->s_refresh_feed != NULL) t->s_refresh_feed(t); descrambler_service_start(t); diff --git a/src/service.h b/src/service.h index 0f012c8ae..d7a17a0a9 100644 --- a/src/service.h +++ b/src/service.h @@ -617,6 +617,8 @@ struct streaming_start *service_build_stream_start(service_t *t); void service_restart(service_t *t); +void service_restart_streams(service_t *t); + void service_stream_destroy(service_t *t, elementary_stream_t *st); void service_request_save(service_t *t, int restart); diff --git a/src/streaming.c b/src/streaming.c index c134abe68..708af3930 100644 --- a/src/streaming.c +++ b/src/streaming.c @@ -426,6 +426,8 @@ streaming_pad_deliver(streaming_pad_t *sp, streaming_message_t *sm) void streaming_service_deliver(service_t *t, streaming_message_t *sm) { + if (atomic_set(&t->s_pending_restart, 0)) + service_restart_streams(t); streaming_pad_deliver(&t->s_streaming_pad, sm); }