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.
This commit is contained in:
Jaroslav Kysela 2014-11-19 11:39:44 +01:00
parent 7743670045
commit 33792bf601
3 changed files with 21 additions and 31 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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;