return -1;
}
+/**
+ *
+ * MPEG2 video parser
+ *
+ */
/**
* MPEG2VIDEO frame duration table (in 90kHz clock domain)
st->es_buf.sb_ptr -= len;
}
-
/**
* MPEG2VIDEO specific reassembly
*
if(parse_mpeg2video_seq_start(t, st, &bs) != PARSER_APPEND)
return PARSER_RESET;
parser_global_data_move(st, buf, len);
+ if (!st->es_priv)
+ st->es_priv = malloc(1); /* starting mark */
}
return PARSER_DROP;
}
pkt->pkt_duration = st->es_frame_duration;
- parser_deliver(t, st, pkt);
+ if (st->es_priv) {
+ if (!TAILQ_EMPTY(&st->es_backlog))
+ parser_do_backlog(t, st, NULL, pkt ? pkt->pkt_meta : NULL);
+ parser_deliver(t, st, pkt);
+ } else if (config.parser_backlog)
+ parser_backlog(t, st, pkt);
st->es_curpkt = NULL;
return PARSER_RESET;
/**
+ *
* H.264 (AVC) parser
+ *
*/
static void
parse_h264_backlog(service_t *t, elementary_stream_t *st, th_pkt_t *pkt)
}
/**
+ *
* H.265 (HEVC) parser
+ *
*/
static int
parse_hevc(service_t *t, elementary_stream_t *st, size_t len,
size_t metalen;
tvhtrace("parser",
- "pkt bcklog %2d %-12s - backlog flush start -",
+ "pkt bcklog %2d %-12s - backlog flush start - (meta %ld)",
st->es_index,
- streaming_component_type2txt(st->es_type));
+ streaming_component_type2txt(st->es_type),
+ meta ? (long)pktbuf_len(meta) : -1);
TAILQ_FOREACH(sm, &st->es_backlog, sm_link) {
pkt = sm->sm_data;
if (pkt->pkt_meta) {
meta = NULL;
}
- pkt_cb(t, st, pkt);
+ if (pkt_cb)
+ pkt_cb(t, st, pkt);
if (absdts == PTS_UNSET) {
absdts = pkt->pkt_dts;