From: Jaroslav Kysela Date: Fri, 9 Mar 2018 12:24:43 +0000 (+0100) Subject: parser: rewrite message.c to use the elementary stream tail queue instead array X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0a9e173152dd39e8e3220cdfb6663f7c0937051e;p=thirdparty%2Ftvheadend.git parser: rewrite message.c to use the elementary stream tail queue instead array --- diff --git a/src/esstream.c b/src/esstream.c index 5b27a619a..c8346565d 100644 --- a/src/esstream.c +++ b/src/esstream.c @@ -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); diff --git a/src/esstream.h b/src/esstream.h index 9c8cf0f9e..3e22eb627 100644 --- a/src/esstream.h +++ b/src/esstream.h @@ -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__ diff --git a/src/parsers/message.c b/src/parsers/message.c index ab74a2861..60ad5a261 100644 --- a/src/parsers/message.c +++ b/src/parsers/message.c @@ -35,15 +35,14 @@ /** * */ -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); } diff --git a/src/parsers/parser_teletext.c b/src/parsers/parser_teletext.c index 1e77118a5..409cf1f59 100644 --- a/src/parsers/parser_teletext.c +++ b/src/parsers/parser_teletext.c @@ -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; diff --git a/src/parsers/parsers.h b/src/parsers/parsers.h index f247e743f..032e2dda9 100644 --- a/src/parsers/parsers.h +++ b/src/parsers/parsers.h @@ -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;