skip seekhead for live streams and append epg tags whenever they change.
This commit is contained in:
parent
19ad4c1262
commit
841ab9087f
3 changed files with 44 additions and 29 deletions
|
@ -659,28 +659,15 @@ mk_write_metaseek(mk_mux_t *mkm, int first)
|
|||
*/
|
||||
static htsbuf_queue_t *
|
||||
mk_build_segment(mk_mux_t *mkm,
|
||||
const struct streaming_start *ss,
|
||||
const event_t *e)
|
||||
const struct streaming_start *ss)
|
||||
{
|
||||
htsbuf_queue_t q;
|
||||
htsbuf_queue_t *p = htsbuf_queue_alloc(0);
|
||||
htsbuf_queue_init(&q, 0);
|
||||
int offset = e ? 48 : 33;
|
||||
|
||||
mkm->segmentinfo_pos = offset;
|
||||
ebml_append_master(&q, 0x1549a966, mk_build_segment_info(mkm));
|
||||
mkm->segmentinfo_pos = p->hq_size;
|
||||
ebml_append_master(p, 0x1549a966, mk_build_segment_info(mkm));
|
||||
|
||||
mkm->trackinfo_pos = offset + q.hq_size;
|
||||
ebml_append_master(&q, 0x1654ae6b, mk_build_tracks(mkm, ss));
|
||||
|
||||
if(e) {
|
||||
mkm->metadata_pos = offset + q.hq_size;
|
||||
ebml_append_master(&q, 0x1254c367, mk_build_metadata2(e));
|
||||
}
|
||||
|
||||
ebml_append_master(p, 0x114d9b74, mk_build_metaseek(mkm));
|
||||
htsbuf_appendq(p, &q);
|
||||
htsbuf_queue_flush(&q);
|
||||
mkm->trackinfo_pos = p->hq_size;
|
||||
ebml_append_master(p, 0x1654ae6b, mk_build_tracks(mkm, ss));
|
||||
|
||||
return p;
|
||||
}
|
||||
|
@ -738,7 +725,7 @@ mk_mux_create(const char *filename,
|
|||
|
||||
mk_mux_t *
|
||||
mk_mux_stream_create(int fd, const struct streaming_start *ss,
|
||||
const event_t *e)
|
||||
const channel_t *ch)
|
||||
{
|
||||
mk_mux_t *mkm;
|
||||
htsbuf_queue_t q;
|
||||
|
@ -749,8 +736,8 @@ mk_mux_stream_create(int fd, const struct streaming_start *ss,
|
|||
mkm->fd = fd;
|
||||
mkm->cluster_maxsize = 0;
|
||||
|
||||
if(e && e->e_channel && e->e_channel->ch_name)
|
||||
mkm->title = strdup(e->e_channel->ch_name);
|
||||
if(ch && ch->ch_name)
|
||||
mkm->title = strdup(ch->ch_name);
|
||||
else
|
||||
mkm->title = strdup("Live stream");
|
||||
|
||||
|
@ -760,13 +747,14 @@ mk_mux_stream_create(int fd, const struct streaming_start *ss,
|
|||
|
||||
ebml_append_master(&q, 0x1a45dfa3, mk_build_ebmlheader());
|
||||
htsbuf_appendq(&q, mk_build_segment_header(0));
|
||||
htsbuf_appendq(&q, mk_build_segment(mkm, ss, e));
|
||||
htsbuf_appendq(&q, mk_build_segment(mkm, ss));
|
||||
|
||||
mk_write_queue(mkm, &q);
|
||||
|
||||
return mkm;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
@ -793,6 +781,22 @@ mk_close_cluster(mk_mux_t *mkm)
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
int
|
||||
mk_mux_append_meta(mk_mux_t *mkm, event_t *e)
|
||||
{
|
||||
htsbuf_queue_t q;
|
||||
|
||||
htsbuf_queue_init(&q, 0);
|
||||
ebml_append_master(&q, 0x1254c367, mk_build_metadata2(e));
|
||||
mk_write_queue(mkm, &q);
|
||||
|
||||
return mkm->error;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
|
|
@ -24,6 +24,8 @@ typedef struct mk_mux mk_mux_t;
|
|||
struct streaming_start;
|
||||
struct dvr_entry;
|
||||
struct th_pkt;
|
||||
struct channel;
|
||||
struct event;
|
||||
|
||||
mk_mux_t *mk_mux_create(const char *filename,
|
||||
const struct streaming_start *ss,
|
||||
|
@ -32,10 +34,12 @@ mk_mux_t *mk_mux_create(const char *filename,
|
|||
|
||||
mk_mux_t *mk_mux_stream_create(int fd,
|
||||
const struct streaming_start *ss,
|
||||
const event_t *e);
|
||||
const struct channel *ch);
|
||||
|
||||
int mk_mux_write_pkt(mk_mux_t *mkm, struct th_pkt *pkt);
|
||||
|
||||
int mk_mux_append_meta(mk_mux_t *mkm, struct event *e);
|
||||
|
||||
void mk_mux_close(mk_mux_t *mk_mux);
|
||||
|
||||
#endif // MKMUX_H__
|
||||
|
|
|
@ -133,6 +133,7 @@ http_stream_run(http_connection_t *hc, streaming_queue_t *sq, th_subscription_t
|
|||
streaming_message_t *sm;
|
||||
int run = 1;
|
||||
mk_mux_t *mkm = NULL;
|
||||
uint32_t event_id = 0;
|
||||
int timeouts = 0;
|
||||
|
||||
while(run) {
|
||||
|
@ -168,17 +169,26 @@ http_stream_run(http_connection_t *hc, streaming_queue_t *sq, th_subscription_t
|
|||
TAILQ_REMOVE(&sq->sq_queue, sm, sm_link);
|
||||
|
||||
switch(sm->sm_type) {
|
||||
case SMT_PACKET:
|
||||
case SMT_PACKET: {
|
||||
if(!mkm)
|
||||
break;
|
||||
|
||||
pkt_ref_inc(sm->sm_data);
|
||||
run = !mk_mux_write_pkt(mkm, sm->sm_data);
|
||||
sm->sm_data = NULL;
|
||||
|
||||
event_t *e = NULL;
|
||||
if(s->ths_channel)
|
||||
e = s->ths_channel->ch_epg_current;
|
||||
|
||||
if(e && event_id != e->e_id) {
|
||||
event_id = e->e_id;
|
||||
run = !mk_mux_append_meta(mkm, e);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case SMT_START: {
|
||||
event_t *e = NULL;
|
||||
tvhlog(LOG_DEBUG, "webui", "Start streaming %s", hc->hc_url_orig);
|
||||
|
||||
if(s->ths_service->s_servicetype == ST_RADIO)
|
||||
|
@ -186,10 +196,7 @@ http_stream_run(http_connection_t *hc, streaming_queue_t *sq, th_subscription_t
|
|||
else
|
||||
http_output_content(hc, "video/x-matroska");
|
||||
|
||||
if(s->ths_channel)
|
||||
e = s->ths_channel->ch_epg_current;
|
||||
|
||||
mkm = mk_mux_stream_create(hc->hc_fd, sm->sm_data, e);
|
||||
mkm = mk_mux_stream_create(hc->hc_fd, sm->sm_data, s->ths_channel);
|
||||
break;
|
||||
}
|
||||
case SMT_STOP:
|
||||
|
|
Loading…
Add table
Reference in a new issue