*/
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->trackinfo_pos = offset + q.hq_size;
- ebml_append_master(&q, 0x1654ae6b, mk_build_tracks(mkm, ss));
+ mkm->segmentinfo_pos = p->hq_size;
+ ebml_append_master(p, 0x1549a966, mk_build_segment_info(mkm));
- 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;
}
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;
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");
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;
}
+
/**
*
*/
}
+/**
+ *
+ */
+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;
+}
+
+
/**
*
*/
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,
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__
streaming_message_t *sm;
int run = 1;
mk_mux_t *mkm = NULL;
+ uint32_t event_id = 0;
int timeouts = 0;
while(run) {
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)
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: