diff --git a/src/dvr/mkmux.c b/src/dvr/mkmux.c index 270040d1..54a350ce 100644 --- a/src/dvr/mkmux.c +++ b/src/dvr/mkmux.c @@ -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; +} + + /** * */ diff --git a/src/dvr/mkmux.h b/src/dvr/mkmux.h index fb5d94ab..f0304351 100644 --- a/src/dvr/mkmux.h +++ b/src/dvr/mkmux.h @@ -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__ diff --git a/src/webui/webui.c b/src/webui/webui.c index b8d16fb7..ed69ebdf 100644 --- a/src/webui/webui.c +++ b/src/webui/webui.c @@ -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: