From: Jaroslav Kysela Date: Wed, 3 Feb 2016 08:42:25 +0000 (+0100) Subject: parser: copy metadata to the first frame, fixes #3320 X-Git-Tag: v4.2.1~1087 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=12be36f6e24a0417221e911d53a56ba8a63a75a6;p=thirdparty%2Ftvheadend.git parser: copy metadata to the first frame, fixes #3320 --- diff --git a/src/parsers/parsers.c b/src/parsers/parsers.c index c07cf7d44..5c1845b95 100644 --- a/src/parsers/parsers.c +++ b/src/parsers/parsers.c @@ -1886,7 +1886,8 @@ parser_do_backlog(service_t *t, elementary_stream_t *st, streaming_message_t *sm; int64_t prevdts = PTS_UNSET, absdts = PTS_UNSET; int64_t prevpts = PTS_UNSET, abspts = PTS_UNSET; - th_pkt_t *pkt; + th_pkt_t *pkt, *npkt; + size_t metalen; tvhtrace("parser", "pkt bcklog %2d %-12s - backlog flush start -", @@ -1919,6 +1920,17 @@ parser_do_backlog(service_t *t, elementary_stream_t *st, if (pkt->pkt_meta == NULL) { pktbuf_ref_inc(meta); pkt->pkt_meta = meta; + /* insert the metadata into payload of the first packet, too */ + npkt = pkt_copy_shallow(pkt); + pktbuf_ref_dec(npkt->pkt_payload); + metalen = pktbuf_len(meta); + npkt->pkt_payload = pktbuf_alloc(NULL, metalen + pktbuf_len(pkt->pkt_payload)); + memcpy(pktbuf_ptr(npkt->pkt_payload), pktbuf_ptr(meta), metalen); + memcpy(pktbuf_ptr(npkt->pkt_payload) + metalen, + pktbuf_ptr(pkt->pkt_payload), pktbuf_len(pkt->pkt_payload)); + npkt->pkt_payload->pb_err = pkt->pkt_payload->pb_err + meta->pb_err; + pkt_ref_dec(pkt); + pkt = npkt; } meta = NULL; }