diff --git a/src/dvr/dvr_rec.c b/src/dvr/dvr_rec.c index acca4a3f..39be2d24 100644 --- a/src/dvr/dvr_rec.c +++ b/src/dvr/dvr_rec.c @@ -330,8 +330,13 @@ dvr_rec_start(dvr_entry_t *de, const streaming_start_t *ss) return -1; } - if (!(muxer = prch->prch_muxer)) - muxer = prch->prch_muxer = muxer_create(&cfg->dvr_muxcnf); + if (!(muxer = prch->prch_muxer)) { + if (profile_chain_reopen(prch, &cfg->dvr_muxcnf, 0)) { + dvr_rec_fatal_error(de, "Unable to reopen muxer"); + return -1; + } + muxer = prch->prch_muxer; + } if(!muxer) { dvr_rec_fatal_error(de, "Unable to create muxer"); diff --git a/src/profile.c b/src/profile.c index 7394f518..3d75ac44 100644 --- a/src/profile.c +++ b/src/profile.c @@ -677,6 +677,19 @@ profile_chain_work(profile_chain_t *prch, struct streaming_target *dst, return -1; } +/* + * + */ +int +profile_chain_reopen(profile_chain_t *prch, + muxer_config_t *m_cfg, int flags) +{ + profile_t *pro = prch->prch_pro; + if (pro && pro->pro_reopen) + return pro->pro_reopen(prch, m_cfg, flags); + return -1; +} + /* * */ @@ -845,8 +858,8 @@ const idclass_t profile_mpegts_pass_class = }; static int -profile_mpegts_pass_open(profile_chain_t *prch, - muxer_config_t *m_cfg, int flags, size_t qsize) +profile_mpegts_pass_reopen(profile_chain_t *prch, + muxer_config_t *m_cfg, int flags) { profile_mpegts_t *pro = (profile_mpegts_t *)prch->prch_pro; muxer_config_t c; @@ -860,13 +873,23 @@ profile_mpegts_pass_open(profile_chain_t *prch, c.m_rewrite_pat = pro->pro_rewrite_pat; c.m_rewrite_pmt = pro->pro_rewrite_pmt; + assert(!prch->prch_muxer); + prch->prch_muxer = muxer_create(&c); + return 0; +} + +static int +profile_mpegts_pass_open(profile_chain_t *prch, + muxer_config_t *m_cfg, int flags, size_t qsize) +{ prch->prch_flags = SUBSCRIPTION_RAW_MPEGTS; prch->prch_sq.sq_st.st_reject_filter = SMT_PACKET; prch->prch_sq.sq_maxsize = qsize; - prch->prch_muxer = muxer_create(&c); prch->prch_st = &prch->prch_sq.sq_st; + + profile_mpegts_pass_reopen(prch, m_cfg, flags); return 0; } @@ -880,6 +903,7 @@ static profile_t * profile_mpegts_pass_builder(void) { profile_mpegts_t *pro = calloc(1, sizeof(*pro)); + pro->pro_reopen = profile_mpegts_pass_reopen; pro->pro_open = profile_mpegts_pass_open; pro->pro_get_mc = profile_mpegts_pass_get_mc; return (profile_t *)pro; @@ -911,11 +935,10 @@ const idclass_t profile_matroska_class = }; static int -profile_matroska_open(profile_chain_t *prch, - muxer_config_t *m_cfg, int flags, size_t qsize) +profile_matroska_reopen(profile_chain_t *prch, + muxer_config_t *m_cfg, int flags) { profile_matroska_t *pro = (profile_matroska_t *)prch->prch_pro; - streaming_target_t *dst; muxer_config_t c; if (m_cfg) @@ -927,12 +950,25 @@ profile_matroska_open(profile_chain_t *prch, if (pro->pro_webm) c.m_type = MC_WEBM; + assert(!prch->prch_muxer); + prch->prch_muxer = muxer_create(&c); + return 0; +} + +static int +profile_matroska_open(profile_chain_t *prch, + muxer_config_t *m_cfg, int flags, size_t qsize) +{ + streaming_target_t *dst; + prch->prch_sq.sq_maxsize = qsize; dst = prch->prch_gh = globalheaders_create(&prch->prch_sq.sq_st); dst = prch->prch_tsfix = tsfix_create(dst); prch->prch_st = dst; - prch->prch_muxer = muxer_create(&c); + + profile_matroska_reopen(prch, m_cfg, flags); + return 0; } @@ -949,6 +985,7 @@ static profile_t * profile_matroska_builder(void) { profile_matroska_t *pro = calloc(1, sizeof(*pro)); + pro->pro_reopen = profile_matroska_reopen; pro->pro_open = profile_matroska_open; pro->pro_get_mc = profile_matroska_get_mc; return (profile_t *)pro; @@ -1286,12 +1323,11 @@ profile_transcode_mc_valid(int mc) } static int -profile_transcode_open(profile_chain_t *prch, - muxer_config_t *m_cfg, int flags, size_t qsize) +profile_transcode_reopen(profile_chain_t *prch, + muxer_config_t *m_cfg, int flags) { profile_transcode_t *pro = (profile_transcode_t *)prch->prch_pro; muxer_config_t c; - int r; if (m_cfg) c = *m_cfg; /* do not alter the original parameter */ @@ -1303,6 +1339,17 @@ profile_transcode_open(profile_chain_t *prch, c.m_type = MC_MATROSKA; } + assert(!prch->prch_muxer); + prch->prch_muxer = muxer_create(&c); + return 0; +} + +static int +profile_transcode_open(profile_chain_t *prch, + muxer_config_t *m_cfg, int flags, size_t qsize) +{ + int r; + prch->prch_sq.sq_maxsize = qsize; prch->prch_gh = globalheaders_create(&prch->prch_sq.sq_st); @@ -1313,7 +1360,7 @@ profile_transcode_open(profile_chain_t *prch, return r; } - prch->prch_muxer = muxer_create(&c); + profile_transcode_reopen(prch, m_cfg, flags); return 0; } @@ -1339,6 +1386,7 @@ profile_transcode_builder(void) profile_transcode_t *pro = calloc(1, sizeof(*pro)); pro->pro_free = profile_transcode_free; pro->pro_work = profile_transcode_work; + pro->pro_reopen = profile_transcode_reopen; pro->pro_open = profile_transcode_open; pro->pro_get_mc = profile_transcode_get_mc; return (profile_t *)pro; diff --git a/src/profile.h b/src/profile.h index e18701dd..2d8fb13a 100644 --- a/src/profile.h +++ b/src/profile.h @@ -112,6 +112,8 @@ typedef struct profile { int (*pro_work)(profile_chain_t *prch, struct streaming_target *dst, uint32_t timeshift_period, int flags); + int (*pro_reopen)(profile_chain_t *prch, + muxer_config_t *m_cfg, int flags); int (*pro_open)(profile_chain_t *prch, muxer_config_t *m_cfg, int flags, size_t qsize); } profile_t; @@ -135,6 +137,9 @@ int profile_chain_work(profile_chain_t *prch, struct streaming_target *dst, uint32_t timeshift_period, int flags); int +profile_chain_reopen(profile_chain_t *prch, + muxer_config_t *m_cfg, int flags); +int profile_chain_open(profile_chain_t *prch, muxer_config_t *m_cfg, int flags, size_t qsize); void profile_chain_init(profile_chain_t *prch, profile_t *pro, void *id);