From: Jaroslav Kysela Date: Fri, 23 Mar 2018 13:17:01 +0000 (+0100) Subject: subscription: fix the incorrect parser create/destroy X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8cdb20d8ace2cea056414569e036ba4b088caac5;p=thirdparty%2Ftvheadend.git subscription: fix the incorrect parser create/destroy --- diff --git a/src/parsers/message.c b/src/parsers/message.c index 06586c396..63a04f4ed 100644 --- a/src/parsers/message.c +++ b/src/parsers/message.c @@ -348,6 +348,15 @@ static streaming_ops_t parser_input_ops = { .st_info = parser_input_info }; +/** + * Parser get output target + */ +streaming_target_t * +parser_output(streaming_target_t *pad) +{ + return ((parser_t *)pad)->prs_output; +} + /** * Parser create */ diff --git a/src/parsers/parsers.h b/src/parsers/parsers.h index 0f7ac9870..f37a56c57 100644 --- a/src/parsers/parsers.h +++ b/src/parsers/parsers.h @@ -125,6 +125,8 @@ streaming_target_t * parser_create(streaming_target_t *output, struct th_subscri void parser_destroy(streaming_target_t *pad); +streaming_target_t * parser_output(streaming_target_t *pad); + void parse_mpeg_ts(parser_t *t, parser_es_t *st, const uint8_t *data, int len, int start, int err); diff --git a/src/subscriptions.c b/src/subscriptions.c index 4d33ada44..4838aac06 100644 --- a/src/subscriptions.c +++ b/src/subscriptions.c @@ -91,8 +91,13 @@ subscription_link_service(th_subscription_t *s, service_t *t) streaming_start_t *ss; subsetstate(s, SUBSCRIPTION_TESTING_SERVICE); - s->ths_service = t; + + if ((s->ths_flags & SUBSCRIPTION_TYPE_MASK) == SUBSCRIPTION_PACKET) { + assert(s->ths_parser == NULL); + s->ths_output = s->ths_parser = parser_create(s->ths_output, s); + } + LIST_INSERT_HEAD(&t->s_subscriptions, s, ths_service_link); tvhtrace(LS_SUBSCRIPTION, "%04X: linking sub %p to svc %p type %i", @@ -154,10 +159,18 @@ subscription_unlink_service0(th_subscription_t *s, int reason, int resched) t->s_running = 0; } + if (s->ths_parser) + s->ths_output = parser_output(s->ths_parser); + pthread_mutex_unlock(&t->s_stream_mutex); LIST_REMOVE(s, ths_service_link); + if (s->ths_parser) { + parser_destroy(s->ths_parser); + s->ths_parser = NULL; + } + if (!resched && (s->ths_flags & SUBSCRIPTION_ONESHOT) != 0) mtimer_arm_rel(&s->ths_remove_timer, subscription_unsubscribe_cb, s, 0); @@ -777,8 +790,6 @@ subscription_create if (!st) { st = calloc(1, sizeof(streaming_target_t)); streaming_target_init(st, &subscription_input_null_ops, s, 0); - } else if ((flags & SUBSCRIPTION_TYPE_MASK) == SUBSCRIPTION_PACKET) { - st = s->ths_parser = parser_create(st, s); } streaming_target_init(&s->ths_input, ops, s, 0);