]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
parser: rewrite message.c to use the elementary stream tail queue instead array
authorJaroslav Kysela <perex@perex.cz>
Fri, 9 Mar 2018 12:24:43 +0000 (13:24 +0100)
committerJaroslav Kysela <perex@perex.cz>
Fri, 23 Mar 2018 17:05:29 +0000 (18:05 +0100)
src/esstream.c
src/esstream.h
src/parsers/message.c
src/parsers/parser_teletext.c
src/parsers/parsers.h

index 5b27a619a20a417ef96b09fac73ed16ed39af9b8..c8346565d77e6ced066378fb94283c899fa23ee7 100644 (file)
@@ -655,7 +655,7 @@ elementary_stream_build_start(elementary_set_t *set)
  */
 elementary_set_t *
 elementary_stream_create_from_start
-  (elementary_set_t *set, streaming_start_t *ss)
+  (elementary_set_t *set, streaming_start_t *ss, size_t es_size)
 {
   elementary_stream_t *st;
   int n;
@@ -666,7 +666,7 @@ elementary_stream_create_from_start
 
   for (n = 0; n < ss->ss_num_components; n++) {
     streaming_start_component_t *ssc = &ss->ss_components[n];
-    st = calloc(1, sizeof(*st));
+    st = calloc(1, es_size ?: sizeof(*st));
     *(elementary_info_t *)st = *(elementary_info_t *)ssc;
     st->es_service = set->set_service;
     elementary_stream_make_nicename(st, set->set_nicename);
index 9c8cf0f9ebc70c9531a777f1ae8dba66348d5c8f..3e22eb627216bcd5e30fede75f3998a4a27ee4a3 100644 (file)
@@ -192,7 +192,7 @@ int elementary_set_has_streams(elementary_set_t *set, int filtered);
 void elementary_set_sort_streams(elementary_set_t *set);
 streaming_start_t *elementary_stream_build_start(elementary_set_t *set);
 elementary_set_t *elementary_stream_create_from_start
-  (elementary_set_t *set, streaming_start_t *ss);
+  (elementary_set_t *set, streaming_start_t *ss, size_t es_size);
 
 
 #endif // ESSTREAM_H__
index ab74a2861b2ca808f8ba4213f1c3ac4d4bd763ed..60ad5a261321d72b46b3090e583788d4f278557d 100644 (file)
 /**
  *
  */
-static parser_es_t *
+static inline parser_es_t *
 parser_find_es(parser_t *prs, int pid)
 {
-  parser_es_t *pes;
-  int i;
+  elementary_stream_t *es;
 
-  for (i = 0, pes = prs->prs_es; i < prs->prs_es_count; i++, pes++)
-    if (pes->es_pid == pid)
-      return pes;
+  TAILQ_FOREACH(es, &prs->prs_components.set_all, es_link)
+    if (es->es_pid == pid)
+      return (parser_es_t *)es;
   return NULL;
 }
 
@@ -231,11 +230,9 @@ static void parser_input_mpegts(parser_t *prs, pktbuf_t *pb)
 /**
  *
  */
-static void parser_init_es(parser_es_t *pes, parser_t *prs,
-                           streaming_component_type_t type)
+static void parser_init_es(parser_es_t *pes, parser_t *prs)
 {
   pes->es_parser = prs;
-  pes->es_type = type;
   pes->es_incomplete = 0;
   pes->es_header_mode = 0;
   pes->es_parser_state = 0;
@@ -292,39 +289,16 @@ static void parser_clean_es(parser_es_t *pes)
 static void parser_input_start(parser_t *prs, streaming_message_t *sm)
 {
   streaming_start_t *ss = sm->sm_data;
-  const streaming_start_component_t *ssc;
-  parser_es_t *pes;
-  char buf[256];
-  int i;
-
-  for (i = 0; i < prs->prs_es_count; i++)
-    parser_clean_es(&prs->prs_es[i]);
-
-  if (prs->prs_es_size < ss->ss_num_components) {
-    prs->prs_es = realloc(prs->prs_es, ss->ss_num_components * sizeof(parser_es_t));
-    if (prs->prs_es == NULL)
-      abort();
-  }
+  elementary_stream_t *es;
 
-  prs->prs_es_count = ss->ss_num_components;
-  for (i = 0; i < ss->ss_num_components; i++) {
-    pes = &prs->prs_es[i];
-    ssc = &ss->ss_components[i];
-    parser_init_es(&prs->prs_es[i], prs, ssc->es_type);
-    pes->es_service = prs->prs_service;
-    pes->es_index = ssc->es_index;
-    pes->es_pid = ssc->es_pid;
-    if (pes->es_pid != -1) {
-      snprintf(buf, sizeof(buf), "%s: %s @ #%d",
-               service_nicename(prs->prs_service),
-               streaming_component_type2txt(pes->es_type),
-               pes->es_pid);
-    } else {
-      snprintf(buf, sizeof(buf), "%s: %s",
-               service_nicename(prs->prs_service),
-               streaming_component_type2txt(pes->es_type));
-    }
-    pes->es_nicename = strdup(buf);
+  TAILQ_FOREACH(es, &prs->prs_components.set_all, es_link)
+    parser_clean_es((parser_es_t *)es);
+  elementary_set_clean(&prs->prs_components);
+
+  elementary_stream_create_from_start(&prs->prs_components, ss, sizeof(parser_es_t));
+  TAILQ_FOREACH(es, &prs->prs_components.set_all, es_link) {
+    parser_init_es((parser_es_t *)es, prs);
+    TAILQ_INSERT_TAIL(&prs->prs_components.set_filter, es, es_filter_link);
   }
 
   prs->prs_current_pcr = PTS_UNSET;
@@ -380,10 +354,12 @@ streaming_target_t *
 parser_create(streaming_target_t *output, th_subscription_t *ts)
 {
   parser_t *prs = calloc(1, sizeof(parser_t));
+  service_t *t = ts->ths_service;
 
   prs->prs_output = output;
   prs->prs_subscription = ts;
-  prs->prs_service = ts->ths_service;
+  prs->prs_service = t;
+  elementary_set_init(&prs->prs_components, LS_PARSER, service_nicename(t), t);
   streaming_target_init(&prs->prs_input, &parser_input_ops, prs, 0);
   return &prs->prs_input;
 
@@ -396,9 +372,10 @@ void
 parser_destroy(streaming_target_t *pad)
 {
   parser_t *prs = (parser_t *)pad;
-  int i;
+  elementary_stream_t *es;
 
-  for (i = 0; i < prs->prs_es_count; i++)
-    parser_clean_es(&prs->prs_es[i]);
+  TAILQ_FOREACH(es, &prs->prs_components.set_all, es_link)
+    parser_clean_es((parser_es_t *)es);
+  elementary_set_clean(&prs->prs_components);
   free(prs);
 }
index 1e77118a5bb2f870d9e465f96f799f2002b32de1..409cf1f595c5417b30f416b6f2f19490483ca3a0 100644 (file)
@@ -838,14 +838,14 @@ dump_page(tt_mag_t *ttm)
 static void
 tt_subtitle_deliver(parser_t *t, parser_es_t *parent, tt_mag_t *ttm)
 {
-  int i;
+  elementary_stream_t *es;
   parser_es_t *st;
 
   if(ttm->ttm_current_pts == PTS_UNSET)
     return;
 
-  for (i = 0; i < t->prs_es_count; i++) {
-    st = &t->prs_es[i];
+  TAILQ_FOREACH(es, &t->prs_components.set_filter, es_filter_link) {
+    st = (parser_es_t *)es;
     if (parent->es_pid == st->es_parent_pid &&
       ttm->ttm_curpage == st->es_pid -  PID_TELETEXT_BASE) {
       if (extract_subtitle(t, st, ttm, ttm->ttm_current_pts))
@@ -1041,7 +1041,7 @@ teletext_rundown_scan(parser_t *prs, tt_private_t *ttp)
   if(ttp->ttp_rundown_valid == 0)
     return;
 
-  if(prs->prs_es_count <= 0)
+  if(TAILQ_EMPTY(&prs->prs_components.set_filter))
     return;
 
   t = (mpegts_service_t *)prs->prs_service;
index f247e743f372db5df53b6f2a08d17bac68f1c054..032e2dda9c43a0fdf9be14e00cc3631ec6ac8e05 100644 (file)
@@ -78,9 +78,7 @@ struct parser {
   service_t *prs_service;
 
   /* Elementary streams */
-  int prs_es_size;
-  int prs_es_count;
-  parser_es_t *prs_es;
+  elementary_set_t prs_components;
 
   /* Globals */
   uint16_t prs_pcr_pid;