]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
subscription: fix the incorrect parser create/destroy
authorJaroslav Kysela <perex@perex.cz>
Fri, 23 Mar 2018 13:17:01 +0000 (14:17 +0100)
committerJaroslav Kysela <perex@perex.cz>
Fri, 23 Mar 2018 17:05:29 +0000 (18:05 +0100)
src/parsers/message.c
src/parsers/parsers.h
src/subscriptions.c

index 06586c39634062d1755a5a35ad6f314e47a698a0..63a04f4ed0d68896f36acf90e5d1271745dbb09c 100644 (file)
@@ -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
  */
index 0f7ac987035256c685208089afce180d07b54f02..f37a56c57e1e2f8dca2b30c939499513b45cfa7d 100644 (file)
@@ -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);
 
index 4d33ada4494cacfb69d9719f8a743e2aefc58f1a..4838aac06c5e8b21464b1d780fee1522dca0ba1e 100644 (file)
@@ -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);