diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index 73b031f9..709b51e8 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -31,13 +31,12 @@ typedef struct dvr_config { char *dvr_storage; uint32_t dvr_retention_days; int dvr_flags; - int dvr_mux_flags; char *dvr_postproc; int dvr_extra_time_pre; int dvr_extra_time_post; muxer_container_type_t dvr_mc; - muxer_cache_type_t dvr_mux_cache; + muxer_config_t dvr_muxcnf; /* Series link support */ int dvr_sl_brand_lock; diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index 536e55a2..d37ceb28 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -1113,19 +1113,20 @@ dvr_init(void) cfg = dvr_config_create(s); cfg->dvr_mc = htsmsg_get_u32_or_default(m, "container", MC_MATROSKA); - cfg->dvr_mux_cache = htsmsg_get_u32_or_default(m, "cache", MC_CACHE_DONTKEEP); + cfg->dvr_muxcnf.m_cache + = htsmsg_get_u32_or_default(m, "cache", MC_CACHE_DONTKEEP); if(!htsmsg_get_u32(m, "rewrite-pat", &u32)) { if (u32) - cfg->dvr_mux_flags |= MUX_REWRITE_PAT; + cfg->dvr_muxcnf.m_flags |= MC_REWRITE_PAT; else - cfg->dvr_mux_flags &= ~MUX_REWRITE_PAT; + cfg->dvr_muxcnf.m_flags &= ~MC_REWRITE_PAT; } if(!htsmsg_get_u32(m, "rewrite-pmt", &u32)) { if (u32) - cfg->dvr_mux_flags |= MUX_REWRITE_PMT; + cfg->dvr_muxcnf.m_flags |= MC_REWRITE_PMT; else - cfg->dvr_mux_flags &= ~MUX_REWRITE_PMT; + cfg->dvr_muxcnf.m_flags &= ~MC_REWRITE_PMT; } htsmsg_get_s32(m, "pre-extra-time", &cfg->dvr_extra_time_pre); @@ -1295,7 +1296,6 @@ dvr_config_create(const char *name) cfg->dvr_config_name = strdup(name); cfg->dvr_retention_days = 31; cfg->dvr_mc = MC_MATROSKA; - cfg->dvr_mux_cache = MC_CACHE_DONTKEEP; cfg->dvr_flags = DVR_TAG_FILES | DVR_SKIP_COMMERCIALS; /* series link support */ @@ -1306,8 +1306,9 @@ dvr_config_create(const char *name) cfg->dvr_sl_more_recent = 1; // Only record more reason episodes cfg->dvr_sl_quality_lock = 1; // Don't attempt to ajust quality - /* PAT/PMT rewrite support */ - cfg->dvr_mux_flags |= MUX_REWRITE_PAT; + /* Muxer config */ + cfg->dvr_muxcnf.m_cache = MC_CACHE_DONTKEEP; + cfg->dvr_muxcnf.m_flags |= MC_REWRITE_PAT; /* dup detect */ cfg->dvr_dup_detect_episode = 1; // detect dup episodes @@ -1354,9 +1355,11 @@ dvr_save(dvr_config_t *cfg) htsmsg_add_str(m, "config_name", cfg->dvr_config_name); htsmsg_add_str(m, "storage", cfg->dvr_storage); htsmsg_add_u32(m, "container", cfg->dvr_mc); - htsmsg_add_u32(m, "cache", cfg->dvr_mux_cache); - htsmsg_add_u32(m, "rewrite-pat", !!(cfg->dvr_mux_flags & MUX_REWRITE_PAT)); - htsmsg_add_u32(m, "rewrite-pmt", !!(cfg->dvr_mux_flags & MUX_REWRITE_PMT)); + htsmsg_add_u32(m, "cache", cfg->dvr_muxcnf.m_cache); + htsmsg_add_u32(m, "rewrite-pat", + !!(cfg->dvr_muxcnf.m_flags & MC_REWRITE_PAT)); + htsmsg_add_u32(m, "rewrite-pmt", + !!(cfg->dvr_muxcnf.m_flags & MC_REWRITE_PMT)); htsmsg_add_u32(m, "retention-days", cfg->dvr_retention_days); htsmsg_add_u32(m, "pre-extra-time", cfg->dvr_extra_time_pre); htsmsg_add_u32(m, "post-extra-time", cfg->dvr_extra_time_post); @@ -1424,10 +1427,10 @@ dvr_mux_cache_set(dvr_config_t *cfg, int mcache) if (mcache < MC_CACHE_UNKNOWN || mcache > MC_CACHE_LAST) mcache = MC_CACHE_UNKNOWN; - if(cfg->dvr_mux_cache == mcache) + if(cfg->dvr_muxcnf.m_cache == mcache) return; - cfg->dvr_mux_cache = mcache; + cfg->dvr_muxcnf.m_cache = mcache; dvr_save(cfg); } @@ -1488,10 +1491,10 @@ dvr_flags_set(dvr_config_t *cfg, int flags) void dvr_mux_flags_set(dvr_config_t *cfg, int flags) { - if(cfg->dvr_mux_flags == flags) + if(cfg->dvr_muxcnf.m_flags == flags) return; - cfg->dvr_mux_flags = flags; + cfg->dvr_muxcnf.m_flags = flags; dvr_save(cfg); } diff --git a/src/dvr/dvr_rec.c b/src/dvr/dvr_rec.c index 4b1b1132..de6169e9 100644 --- a/src/dvr/dvr_rec.c +++ b/src/dvr/dvr_rec.c @@ -289,13 +289,10 @@ dvr_rec_start(dvr_entry_t *de, const streaming_start_t *ss) int i; dvr_config_t *cfg = dvr_config_find_by_name_default(de->de_config_name); muxer_container_type_t mc; - muxer_config_t m_cfg; mc = de->de_mc; - m_cfg.dvr_flags = cfg->dvr_mux_flags; - m_cfg.dvr_cache = cfg->dvr_mux_cache; - de->de_mux = muxer_create(mc, &m_cfg); + de->de_mux = muxer_create(mc, &cfg->dvr_muxcnf); if(!de->de_mux) { dvr_rec_fatal_error(de, "Unable to create muxer"); return -1; diff --git a/src/muxer.c b/src/muxer.c index a07e02cf..5b4aebab 100644 --- a/src/muxer.c +++ b/src/muxer.c @@ -237,10 +237,12 @@ muxer_container_mime2type(const char *str) * Create a new muxer */ muxer_t* -muxer_create(muxer_container_type_t mc, muxer_config_t *m_cfg) +muxer_create(muxer_container_type_t mc, const muxer_config_t *m_cfg) { muxer_t *m; + assert(m_cfg); + m = pass_muxer_create(mc, m_cfg); if(!m) @@ -256,7 +258,8 @@ muxer_create(muxer_container_type_t mc, muxer_config_t *m_cfg) muxer_container_type2txt(mc)); return NULL; } - m->m_cache = m_cfg ? m_cfg->dvr_cache : MC_CACHE_SYSTEM; + + memcpy(&m->m_config, m_cfg, sizeof(muxer_config_t)); return m; } @@ -444,7 +447,7 @@ muxer_cache_txt2type(const char *str) void muxer_cache_update(muxer_t *m, int fd, off_t pos, size_t size) { - switch (m->m_cache) { + switch (m->m_config.m_cache) { case MC_CACHE_UNKNOWN: case MC_CACHE_SYSTEM: break; diff --git a/src/muxer.h b/src/muxer.h index c6518c73..9f147d58 100644 --- a/src/muxer.h +++ b/src/muxer.h @@ -21,8 +21,8 @@ #include "htsmsg.h" -#define MUX_REWRITE_PAT 0x0001 -#define MUX_REWRITE_PMT 0x0002 +#define MC_REWRITE_PAT 0x0001 +#define MC_REWRITE_PMT 0x0002 typedef enum { MC_UNKNOWN = 0, @@ -45,8 +45,8 @@ typedef enum { /* Muxer configuration used when creating a muxer. */ typedef struct muxer_config { - int dvr_flags; - muxer_cache_type_t dvr_cache; + int m_flags; + muxer_cache_type_t m_cache; } muxer_config_t; struct muxer; @@ -75,7 +75,7 @@ typedef struct muxer { int m_errors; // Number of errors muxer_container_type_t m_container; // The type of the container - muxer_cache_type_t m_cache; // Caching scheme + muxer_config_t m_config; // general configuration } muxer_t; @@ -91,7 +91,7 @@ const char* muxer_container_suffix(muxer_container_type_t mc, int vid int muxer_container_list(htsmsg_t *array); // Muxer factory -muxer_t *muxer_create(muxer_container_type_t mc, muxer_config_t *m_cfg); +muxer_t *muxer_create(muxer_container_type_t mc, const muxer_config_t *m_cfg); // Wrapper functions int muxer_open_file (muxer_t *m, const char *filename); diff --git a/src/muxer/muxer_libav.c b/src/muxer/muxer_libav.c index 1fae8395..876dffce 100644 --- a/src/muxer/muxer_libav.c +++ b/src/muxer/muxer_libav.c @@ -493,7 +493,7 @@ lav_muxer_destroy(muxer_t *m) * Create a new libavformat based muxer */ muxer_t* -lav_muxer_create(muxer_container_type_t mc, muxer_config_t *m_cfg) +lav_muxer_create(muxer_container_type_t mc, const muxer_config_t *m_cfg) { const char *mux_name; lav_muxer_t *lm; diff --git a/src/muxer/muxer_libav.h b/src/muxer/muxer_libav.h index 748898b3..e8e719bf 100644 --- a/src/muxer/muxer_libav.h +++ b/src/muxer/muxer_libav.h @@ -21,6 +21,7 @@ #include "muxer.h" -muxer_t* lav_muxer_create(muxer_container_type_t mc, muxer_config_t* m_cfg); +muxer_t* lav_muxer_create + (muxer_container_type_t mc, const muxer_config_t* m_cfg); #endif diff --git a/src/muxer/muxer_pass.c b/src/muxer/muxer_pass.c index c31c8ec7..64b53411 100644 --- a/src/muxer/muxer_pass.c +++ b/src/muxer/muxer_pass.c @@ -42,7 +42,6 @@ typedef struct pass_muxer { char *pm_filename; /* TS muxing */ - uint8_t pm_flags; uint8_t pm_pat_cc; uint16_t pm_pmt_pid; uint8_t pm_pmt_cc; @@ -322,7 +321,7 @@ pass_muxer_reconfigure(muxer_t* m, const struct streaming_start *ss) pm->pm_pmt_pid = ss->ss_pmt_pid; pm->pm_service_id = ss->ss_service_id; - if (pm->pm_flags & MUX_REWRITE_PMT) { + if (pm->m_config.m_flags & MC_REWRITE_PMT) { pm->pm_pmt = realloc(pm->pm_pmt, 188); memset(pm->pm_pmt, 0xff, 188); pm->pm_pmt[0] = 0x47; @@ -430,20 +429,20 @@ pass_muxer_write_ts(muxer_t *m, pktbuf_t *pb) unsigned char* tsb; /* Rewrite PAT/PMT in operation */ - if (pm->pm_flags & (MUX_REWRITE_PAT | MUX_REWRITE_PMT)) { + if (pm->m_config.m_flags & (MC_REWRITE_PAT | MC_REWRITE_PMT)) { tsb = pb->pb_data; while (tsb < pb->pb_data + pb->pb_size) { int pid = (tsb[1] & 0x1f) << 8 | tsb[2]; /* PAT */ - if (pm->pm_flags & MUX_REWRITE_PAT && pid == 0) { + if (pm->m_config.m_flags & MC_REWRITE_PAT && pid == 0) { if (pass_muxer_rewrite_pat(pm, tsb)) { tvherror("pass", "PAT rewrite failed, disabling"); - pm->pm_flags &= ~MUX_REWRITE_PAT; + pm->m_config.m_flags &= ~MC_REWRITE_PAT; } /* PMT */ - } else if (pm->pm_flags & MUX_REWRITE_PMT && pid == pm->pm_pmt_pid) { + } else if (pm->m_config.m_flags & MC_REWRITE_PMT && pid == pm->pm_pmt_pid) { if (tsb[1] & 0x40) { /* pusi - the first PMT packet */ memcpy(tsb, pm->pm_pmt, 188); tsb[3] = (pm->pm_pmt[3] & 0xf0) | pm->pm_pmt_cc; @@ -541,7 +540,7 @@ pass_muxer_destroy(muxer_t *m) * Create a new passthrough muxer */ muxer_t* -pass_muxer_create(muxer_container_type_t mc, muxer_config_t *m_cfg) +pass_muxer_create(muxer_container_type_t mc, const muxer_config_t *m_cfg) { pass_muxer_t *pm; @@ -559,9 +558,6 @@ pass_muxer_create(muxer_container_type_t mc, muxer_config_t *m_cfg) pm->m_close = pass_muxer_close; pm->m_destroy = pass_muxer_destroy; pm->pm_fd = -1; - /* Copy any configuration values we are interested in */ - if ((mc == MC_PASS) && (m_cfg)) - pm->pm_flags = m_cfg->dvr_flags; return (muxer_t *)pm; } diff --git a/src/muxer/muxer_pass.h b/src/muxer/muxer_pass.h index e93495a2..637d312d 100644 --- a/src/muxer/muxer_pass.h +++ b/src/muxer/muxer_pass.h @@ -21,6 +21,7 @@ #include "muxer.h" -muxer_t* pass_muxer_create(muxer_container_type_t mc, muxer_config_t* m_cfg); +muxer_t* pass_muxer_create + (muxer_container_type_t mc, const muxer_config_t* m_cfg); #endif diff --git a/src/muxer/muxer_tvh.c b/src/muxer/muxer_tvh.c index 30daf66f..44768dd8 100644 --- a/src/muxer/muxer_tvh.c +++ b/src/muxer/muxer_tvh.c @@ -220,7 +220,7 @@ tvh_muxer_destroy(muxer_t *m) * Create a new builtin muxer */ muxer_t* -tvh_muxer_create(muxer_container_type_t mc, muxer_config_t *m_cfg) +tvh_muxer_create(muxer_container_type_t mc, const muxer_config_t *m_cfg) { tvh_muxer_t *tm; diff --git a/src/muxer/muxer_tvh.h b/src/muxer/muxer_tvh.h index 384b5668..488e443a 100644 --- a/src/muxer/muxer_tvh.h +++ b/src/muxer/muxer_tvh.h @@ -21,6 +21,7 @@ #include "muxer.h" -muxer_t* tvh_muxer_create(muxer_container_type_t mc, muxer_config_t* m_cfg); +muxer_t* tvh_muxer_create + (muxer_container_type_t mc, const muxer_config_t* m_cfg); #endif diff --git a/src/webui/extjs.c b/src/webui/extjs.c index e9af647c..00225b9a 100755 --- a/src/webui/extjs.c +++ b/src/webui/extjs.c @@ -1126,9 +1126,11 @@ extjs_dvr(http_connection_t *hc, const char *remain, void *opaque) r = htsmsg_create_map(); htsmsg_add_str(r, "storage", cfg->dvr_storage); htsmsg_add_str(r, "container", muxer_container_type2txt(cfg->dvr_mc)); - htsmsg_add_u32(r, "cache", cfg->dvr_mux_cache); - htsmsg_add_u32(r, "rewritePAT", !!(cfg->dvr_mux_flags & MUX_REWRITE_PAT)); - htsmsg_add_u32(r, "rewritePMT", !!(cfg->dvr_mux_flags & MUX_REWRITE_PMT)); + htsmsg_add_u32(r, "cache", cfg->dvr_muxcnf.m_cache); + htsmsg_add_u32(r, "rewritePAT", + !!(cfg->dvr_muxcnf.m_flags & MC_REWRITE_PAT)); + htsmsg_add_u32(r, "rewritePMT", + !!(cfg->dvr_muxcnf.m_flags & MC_REWRITE_PMT)); if(cfg->dvr_postproc != NULL) htsmsg_add_str(r, "postproc", cfg->dvr_postproc); htsmsg_add_u32(r, "retention", cfg->dvr_retention_days); @@ -1213,9 +1215,9 @@ extjs_dvr(http_connection_t *hc, const char *remain, void *opaque) /* Muxer flags */ flags = 0; if(http_arg_get(&hc->hc_req_args, "rewritePAT") != NULL) - flags |= MUX_REWRITE_PAT; + flags |= MC_REWRITE_PAT; if(http_arg_get(&hc->hc_req_args, "rewritePMT") != NULL) - flags |= MUX_REWRITE_PMT; + flags |= MC_REWRITE_PMT; dvr_mux_flags_set(cfg, flags); diff --git a/src/webui/webui.c b/src/webui/webui.c index 6fc7d658..56dcb7d2 100644 --- a/src/webui/webui.c +++ b/src/webui/webui.c @@ -665,7 +665,6 @@ http_stream_service(http_connection_t *hc, service_t *service, int weight) size_t qsize; const char *name; char addrbuf[50]; - muxer_config_t m_cfg; cfg = dvr_config_find_by_name_default(""); @@ -674,7 +673,6 @@ http_stream_service(http_connection_t *hc, service_t *service, int weight) if(mc == MC_UNKNOWN) { mc = cfg->dvr_mc; } - m_cfg.dvr_flags = cfg->dvr_mux_flags; if ((str = http_arg_get(&hc->hc_req_args, "qsize"))) qsize = atoll(str); @@ -704,7 +702,7 @@ http_stream_service(http_connection_t *hc, service_t *service, int weight) if(s) { name = tvh_strdupa(service->s_nicename); pthread_mutex_unlock(&global_lock); - http_stream_run(hc, &sq, name, mc, s, &m_cfg); + http_stream_run(hc, &sq, name, mc, s, &cfg->dvr_muxcnf); pthread_mutex_lock(&global_lock); subscription_unsubscribe(s); } @@ -777,7 +775,6 @@ http_stream_channel(http_connection_t *hc, channel_t *ch, int weight) size_t qsize; const char *name; char addrbuf[50]; - muxer_config_t m_cfg; cfg = dvr_config_find_by_name_default(""); @@ -786,8 +783,6 @@ http_stream_channel(http_connection_t *hc, channel_t *ch, int weight) if(mc == MC_UNKNOWN) { mc = cfg->dvr_mc; } - m_cfg.dvr_flags = cfg->dvr_mux_flags; - m_cfg.dvr_cache = cfg->dvr_mux_cache; if ((str = http_arg_get(&hc->hc_req_args, "qsize"))) qsize = atoll(str); @@ -825,7 +820,7 @@ http_stream_channel(http_connection_t *hc, channel_t *ch, int weight) if(s) { name = tvh_strdupa(channel_get_name(ch)); pthread_mutex_unlock(&global_lock); - http_stream_run(hc, &sq, name, mc, s, &m_cfg); + http_stream_run(hc, &sq, name, mc, s, &cfg->dvr_muxcnf); pthread_mutex_lock(&global_lock); subscription_unsubscribe(s); }