Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
perexg committed Nov 19, 2014
1 parent 7743670 commit 33792bf
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 31 deletions.
23 changes: 11 additions & 12 deletions src/parsers/parser_avc.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
17 changes: 4 additions & 13 deletions src/parsers/parsers.c
Expand Up @@ -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;
Expand Down
12 changes: 6 additions & 6 deletions src/profile.c
Expand Up @@ -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
*/
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 33792bf

Please sign in to comment.