muxer dvr: fix configuration passing to reduce potential for error
This should fix #2015
This commit is contained in:
parent
85e01365b7
commit
6482d33ba9
13 changed files with 55 additions and 57 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
12
src/muxer.h
12
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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue