From 33792bf6012c2913b346efa88c7a7c60116d4268 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Wed, 19 Nov 2014 11:39:44 +0100 Subject: [PATCH] htsp: another fix for H264 - headers merge The real headers merge is in avc_convert_pkt() but this is called only from the global headers plugin. Add the global headers plugin to all HTSP chains. This patch removes the merging from the TS parser. --- src/parsers/parser_avc.c | 23 +++++++++++------------ src/parsers/parsers.c | 17 ++++------------- src/profile.c | 12 ++++++------ 3 files changed, 21 insertions(+), 31 deletions(-) diff --git a/src/parsers/parser_avc.c b/src/parsers/parser_avc.c index 3efacf09..46831484 100644 --- a/src/parsers/parser_avc.c +++ b/src/parsers/parser_avc.c @@ -95,10 +95,11 @@ static int avc_parse_nal_units_buf(const uint8_t *buf_in, uint8_t **buf, int *size) { sbuf_t sb; + sbuf_init(&sb); + avc_parse_nal_units(&sb, buf_in, *size); - free(*buf); *buf = sb.sb_data; *size = sb.sb_ptr; return 0; @@ -126,7 +127,7 @@ isom_write_avcc(sbuf_t *sb, const uint8_t *data, int len) /* check for h264 start code */ if (RB32(data) == 0x00000001 || RB24(data) == 0x000001) { - uint8_t *buf=NULL, *end, *start; + uint8_t *buf, *end, *start; uint32_t *sps_size_array=0, *pps_size_array=0; uint32_t pps_count=0,sps_count=0; uint8_t **sps_array=0, **pps_array=0; @@ -210,30 +211,28 @@ isom_write_avcc(sbuf_t *sb, const uint8_t *data, int len) th_pkt_t * avc_convert_pkt(th_pkt_t *src) { - th_pkt_t *pkt = malloc(sizeof(th_pkt_t)); + sbuf_t payload, headers; + th_pkt_t *pkt = malloc(sizeof(*pkt)); + *pkt = *src; pkt->pkt_refcount = 1; pkt->pkt_meta = NULL; - pkt->pkt_payload = NULL; + + sbuf_init(&payload); if (src->pkt_meta) { - sbuf_t headers; sbuf_init(&headers); - isom_write_avcc(&headers, pktbuf_ptr(src->pkt_meta), - pktbuf_len(src->pkt_meta)); + pktbuf_len(src->pkt_meta)); pkt->pkt_meta = pktbuf_make(headers.sb_data, headers.sb_ptr); } - sbuf_t payload; - sbuf_init(&payload); - if(src->pkt_meta) avc_parse_nal_units(&payload, pktbuf_ptr(src->pkt_meta), - pktbuf_len(src->pkt_meta)); + pktbuf_len(src->pkt_meta)); avc_parse_nal_units(&payload, pktbuf_ptr(src->pkt_payload), - pktbuf_len(src->pkt_payload)); + pktbuf_len(src->pkt_payload)); pkt->pkt_payload = pktbuf_make(payload.sb_data, payload.sb_ptr); return pkt; diff --git a/src/parsers/parsers.c b/src/parsers/parsers.c index a637941a..1a590f98 100644 --- a/src/parsers/parsers.c +++ b/src/parsers/parsers.c @@ -1230,27 +1230,18 @@ parse_h264(service_t *t, elementary_stream_t *st, size_t len, if (st->es_incomplete) return 4; th_pkt_t *pkt = st->es_curpkt; - size_t metalen = 0; if(pkt != NULL) { if(st->es_global_data) { pkt->pkt_meta = pktbuf_make(st->es_global_data, - metalen = st->es_global_data_len); + st->es_global_data_len); st->es_global_data = NULL; st->es_global_data_len = 0; } - if (metalen) { - pkt->pkt_payload = pktbuf_alloc(NULL, metalen + st->es_buf.sb_ptr - 4); - memcpy(pktbuf_ptr(pkt->pkt_payload), pktbuf_ptr(pkt->pkt_meta), metalen); - memcpy(pktbuf_ptr(pkt->pkt_payload) + metalen, st->es_buf.sb_data, st->es_buf.sb_ptr - 4); - sbuf_reset(&st->es_buf, 16000); - } else { - pkt->pkt_payload = pktbuf_make(st->es_buf.sb_data, - st->es_buf.sb_ptr - 4); - sbuf_steal_data(&st->es_buf); - } - + pkt->pkt_payload = pktbuf_make(st->es_buf.sb_data, + st->es_buf.sb_ptr - 4); + sbuf_steal_data(&st->es_buf); parser_deliver(t, st, pkt, st->es_buf.sb_err); st->es_curpkt = NULL; diff --git a/src/profile.c b/src/profile.c index e14b5719..ac215bdd 100644 --- a/src/profile.c +++ b/src/profile.c @@ -524,10 +524,8 @@ profile_sharer_deliver(profile_chain_t *prch, streaming_message_t *sm) if (!prch->prch_ts_delta) goto deliver; th_pkt_t *pkt = sm->sm_data; - if (prch->prch_ts_delta == PTS_UNSET) { + if (prch->prch_ts_delta == PTS_UNSET) prch->prch_ts_delta = MAX(0, pkt->pkt_dts - 10000); - printf("ts delta: %li\n", (long)prch->prch_ts_delta); - } /* * time correction here */ @@ -805,6 +803,8 @@ profile_htsp_work(profile_chain_t *prch, dst = prch->prch_timeshift = timeshift_create(dst, timeshift_period); #endif + dst = prch->prch_gh = globalheaders_create(dst); + if (profile_sharer_create(prsh, prch, dst)) goto fail; @@ -1296,6 +1296,8 @@ profile_transcode_work(profile_chain_t *prch, props.tp_bandwidth = profile_transcode_bandwidth(pro); strncpy(props.tp_language, pro->pro_language ?: "", 3); + dst = prch->prch_gh = globalheaders_create(dst); + #if ENABLE_TIMESHIFT if (timeshift_period > 0) dst = prch->prch_timeshift = timeshift_create(dst, timeshift_period); @@ -1364,9 +1366,7 @@ profile_transcode_open(profile_chain_t *prch, prch->prch_sq.sq_maxsize = qsize; - prch->prch_gh = globalheaders_create(&prch->prch_sq.sq_st); - - r = profile_transcode_work(prch, prch->prch_gh, 0, 0); + r = profile_transcode_work(prch, &prch->prch_sq.sq_st, 0, 0); if (r) { profile_chain_close(prch); return r;