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:
parent
7743670045
commit
33792bf601
3 changed files with 21 additions and 31 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue