From: Jaroslav Kysela Date: Wed, 17 Feb 2016 20:25:45 +0000 (+0100) Subject: parsers: mpeg2video - implement packet backlog X-Git-Tag: v4.2.1~1017 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e3c6b41ae1fc4fdbfe9fb12cde7d00faaaf86eb7;p=thirdparty%2Ftvheadend.git parsers: mpeg2video - implement packet backlog --- diff --git a/src/parsers/parsers.c b/src/parsers/parsers.c index ee144efa1..132753415 100644 --- a/src/parsers/parsers.c +++ b/src/parsers/parsers.c @@ -982,6 +982,11 @@ parse_pes_header(service_t *t, elementary_stream_t *st, return -1; } +/** + * + * MPEG2 video parser + * + */ /** * MPEG2VIDEO frame duration table (in 90kHz clock domain) @@ -1143,7 +1148,6 @@ parser_global_data_move(elementary_stream_t *st, const uint8_t *data, size_t len st->es_buf.sb_ptr -= len; } - /** * MPEG2VIDEO specific reassembly * @@ -1210,6 +1214,8 @@ parse_mpeg2video(service_t *t, elementary_stream_t *st, size_t len, 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; @@ -1264,7 +1270,12 @@ parse_mpeg2video(service_t *t, elementary_stream_t *st, size_t len, } 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; @@ -1290,7 +1301,9 @@ parse_mpeg2video(service_t *t, elementary_stream_t *st, size_t len, /** + * * H.264 (AVC) parser + * */ static void parse_h264_backlog(service_t *t, elementary_stream_t *st, th_pkt_t *pkt) @@ -1514,7 +1527,9 @@ parse_h264(service_t *t, elementary_stream_t *st, size_t len, } /** + * * H.265 (HEVC) parser + * */ static int parse_hevc(service_t *t, elementary_stream_t *st, size_t len, @@ -1900,9 +1915,10 @@ parser_do_backlog(service_t *t, elementary_stream_t *st, 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) { @@ -1945,7 +1961,8 @@ parser_do_backlog(service_t *t, elementary_stream_t *st, meta = NULL; } - pkt_cb(t, st, pkt); + if (pkt_cb) + pkt_cb(t, st, pkt); if (absdts == PTS_UNSET) { absdts = pkt->pkt_dts;