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;
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);
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 */
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
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);
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);
}
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);
}
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;
* 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)
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;
}
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;
#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,
/* 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;
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;
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);
* 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;
#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
char *pm_filename;
/* TS muxing */
- uint8_t pm_flags;
uint8_t pm_pat_cc;
uint16_t pm_pmt_pid;
uint8_t pm_pmt_cc;
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;
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;
* 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;
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;
}
#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
* 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;
#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
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);
/* 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);
size_t qsize;
const char *name;
char addrbuf[50];
- muxer_config_t m_cfg;
cfg = dvr_config_find_by_name_default("");
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);
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);
}
size_t qsize;
const char *name;
char addrbuf[50];
- muxer_config_t m_cfg;
cfg = dvr_config_find_by_name_default("");
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);
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);
}