From: Jaroslav Kysela Date: Tue, 27 Mar 2018 14:31:56 +0000 (+0200) Subject: parser: fix the saving of the parsed parameters, fixes #5034 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5782d8c1422dd42951e33fa7dcd0b7968eb7643b;p=thirdparty%2Ftvheadend.git parser: fix the saving of the parsed parameters, fixes #5034 The parser do not touch the elementary streams registered for service (the timeshift preparation), but the parsed parameters should be saved for the live streaming. This fixed the endless streaming restart (visible for MPEG2 streams). --- diff --git a/src/parsers/parsers.c b/src/parsers/parsers.c index ca9d17694..62cff29a7 100644 --- a/src/parsers/parsers.c +++ b/src/parsers/parsers.c @@ -812,7 +812,7 @@ ok: tvhtrace(LS_PARSER, "mpeg audio version change %02d: val=%d (old=%d)", st->es_index, layer, st->es_audio_version); st->es_audio_version = layer; - atomic_set(&st->es_service->s_pending_restart, 1); + service_update_elementary_stream(st->es_service, (elementary_stream_t *)st); } makeapkt(t, st, buf + i, fsize, dts, duration, channels, mpa_sri[(buf[i+2] >> 2) & 3]); @@ -1117,8 +1117,7 @@ parser_set_stream_vparam(parser_es_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); - atomic_set(&st->es_service->s_pending_restart, 1); + service_update_elementary_stream(st->es_service, (elementary_stream_t *)st); } } diff --git a/src/service.c b/src/service.c index 86fe77e3f..5352c2e38 100644 --- a/src/service.c +++ b/src/service.c @@ -1030,6 +1030,44 @@ service_restart(service_t *t) descrambler_service_start(t); } +/** + * Update one elementary stream from the parser. + * The update should be handled only for the live streaming. + */ +void +service_update_elementary_stream(service_t *t, elementary_stream_t *src) +{ + elementary_stream_t *es; + int change = 0, restart = 0; + + es = elementary_stream_find(&t->s_components, src->es_pid); + if (es == NULL) + return; + + # define _CHANGE(field) \ + if (es->field != src->field) { es->field = src->field; change++; } + # define _RESTART(field) \ + if (es->field != src->field) { es->field = src->field; restart++; } + + _CHANGE(es_frame_duration); + _RESTART(es_width); + _RESTART(es_height); + _CHANGE(es_aspect_num); + _CHANGE(es_aspect_den); + _RESTART(es_audio_version); + _RESTART(es_sri); + _RESTART(es_ext_sri); + _CHANGE(es_channels); + + # undef _CHANGE + # undef _RESTART + + if (change || restart) + service_request_save(t); + if (restart) + atomic_set(&t->s_pending_restart, 1); +} + /** * */ diff --git a/src/service.h b/src/service.h index 4ea9726b6..925abf0b2 100644 --- a/src/service.h +++ b/src/service.h @@ -475,6 +475,8 @@ void service_restart_streams(service_t *t); void service_request_save(service_t *t); +void service_update_elementary_stream(service_t *t, elementary_stream_t *src); + void service_source_info_free(source_info_t *si); void service_source_info_copy(source_info_t *dst, const source_info_t *src);