]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
muxer dvr: fix configuration passing to reduce potential for error
authorAdam Sutton <dev@adamsutton.me.uk>
Fri, 21 Mar 2014 14:56:46 +0000 (14:56 +0000)
committerAdam Sutton <dev@adamsutton.me.uk>
Fri, 21 Mar 2014 14:56:46 +0000 (14:56 +0000)
This should fix #2015

13 files changed:
src/dvr/dvr.h
src/dvr/dvr_db.c
src/dvr/dvr_rec.c
src/muxer.c
src/muxer.h
src/muxer/muxer_libav.c
src/muxer/muxer_libav.h
src/muxer/muxer_pass.c
src/muxer/muxer_pass.h
src/muxer/muxer_tvh.c
src/muxer/muxer_tvh.h
src/webui/extjs.c
src/webui/webui.c

index 73b031f93f45398c7d4249e04745c8ffba6940d3..709b51e8947b0d369bb1f713c0feb240ed087c99 100644 (file)
@@ -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;
index 536e55a240904e50533251eae7d345d687c41ac0..d37ceb284f66bff7edc5e5a60b7967de54942b97 100644 (file)
@@ -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);
 }
 
index 4b1b1132ffc360cecdbf1a4aa4838bd469ce7037..de6169e9517181714557376923abfbff03e9313b 100644 (file)
@@ -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;
index a07e02cfa547dfd12e876052c31cfe4ccd5fe7d9..5b4aebab202ef20f8f908badfe81ef7346c7ac1b 100644 (file)
@@ -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;
index c6518c73e9f62f90f7c17f76c8ed8f555c130665..9f147d58730cf55f3c5f1b733a01e18f425042bd 100644 (file)
@@ -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);
index 1fae839599d55a1d1528e57172f920f367e110c4..876dffce5a4901a03c5a6e73f22d873401efa1fb 100644 (file)
@@ -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;
index 748898b3c08d1cfa4a75ccb1c15ce72edceafe61..e8e719bf68599dfa41a425bf5c9615c219253ea7 100644 (file)
@@ -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
index c31c8ec79cbeb7bcf08dc0edff9c07b5209e4752..64b5341171eacdd4e9fe3bdb7ea1eb46c420ff0d 100644 (file)
@@ -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;
 }
index e93495a2a68e334aa8fac6e99706ab1fabc02955..637d312d33a78ae5033a1bd5d4082896273c7a8e 100644 (file)
@@ -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
index 30daf66fa4de59957d704dafa24476b61de560d9..44768dd84f7337fefa4ab73d5820be5843bcd030 100644 (file)
@@ -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;
 
index 384b5668759217fd05759eef8b2d5acc9105ce8e..488e443a8f7cef0d9a01adb6e85eb3e9bc2b692b 100644 (file)
@@ -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
index e9af647c02652d762221420be59729dcbc7198ca..00225b9a6dc84d107d3d8ed41fb99f2e0ae5da9a 100755 (executable)
@@ -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);
 
index 6fc7d658faaba5247c3500e3fb1f5812fa2083fe..56dcb7d2dbfa1c0991bfec12897c5048344df365 100644 (file)
@@ -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);
   }