tvhlog_limit_reset(&pes->es_pcr_log);
}
+static void
+parser_do_rstlog(parser_t *prs)
+{
+ streaming_message_t *sm;
+ th_pkt_t *pkt;
+ while ((sm = TAILQ_FIRST(&prs->prs_rstlog)) != NULL) {
+ TAILQ_REMOVE(&prs->prs_rstlog, sm, sm_link);
+ pkt = sm->sm_data;
+ pkt_trace(LS_PARSER, pkt, "deliver from rstlog");
+ streaming_target_deliver2(prs->prs_output, streaming_msg_create_pkt(pkt));
+ sm->sm_data = NULL;
+ streaming_msg_free(sm);
+ }
+}
+
/**
*
*/
prs->prs_pcr_boundary = 6*90000;
streaming_target_deliver2(prs->prs_output, sm);
+ /* do_rstlog */
+ if (!TAILQ_EMPTY(&prs->prs_rstlog)) {
+ parser_do_rstlog(prs);
+ }
}
/**
prs->prs_output = output;
prs->prs_subscription = ts;
prs->prs_service = t;
+ TAILQ_INIT(&prs->prs_rstlog);
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;
parser_t *prs = (parser_t *)pad;
elementary_stream_t *es;
parser_es_t *pes;
+ streaming_queue_clear(&prs->prs_rstlog);
TAILQ_FOREACH(es, &prs->prs_components.set_all, es_link) {
pes = (parser_es_t *)es;
st->es_buf.sb_err = 0;
}
+
+
+/**
+ * prs_rstlog
+ */
+static void
+parser_rstlog(parser_t *t, th_pkt_t *pkt)
+{
+ streaming_message_t *sm = streaming_msg_create_pkt(pkt);
+ pkt_ref_dec(pkt); /* streaming_msg_create_pkt increses ref counter */
+ streaming_message_t *clone = streaming_msg_clone(sm);
+ TAILQ_INSERT_TAIL (&t->prs_rstlog, clone, sm_link);
+}
+
/**
*
*/
deliver:
pkt->pkt_componentindex = st->es_index;
- pkt_trace(LS_PARSER, pkt, "deliver");
-
if (SCT_ISVIDEO(pkt->pkt_type)) {
pkt->v.pkt_aspect_num = st->es_aspect_num;
pkt->v.pkt_aspect_den = st->es_aspect_den;
}
/* Forward packet */
- streaming_target_deliver2(t->prs_output, streaming_msg_create_pkt(pkt));
+ if(atomic_get(&st->es_service->s_pending_restart) == 1) {
+ /* Queue pkt to prs_rstlog if pending restart */
+ pkt_trace(LS_PARSER, pkt, "deliver to rstlog");
+ parser_rstlog(t, pkt);
+ } else {
+ pkt_trace(LS_PARSER, pkt, "deliver");
+ streaming_target_deliver2(t->prs_output, streaming_msg_create_pkt(pkt));
+ }
/* Decrease our own reference to the packet */
pkt_ref_dec(pkt);
commercial_advice_t prs_tt_commercial_advice;
time_t prs_tt_clock; /* Network clock as determined by teletext decoder */
+ /* restart_pending log */
+ struct streaming_message_queue prs_rstlog;
};
static inline int64_t