]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
psi tables: moved base parsers outside mpegts.h
authorJaroslav Kysela <perex@perex.cz>
Mon, 23 Mar 2015 12:35:03 +0000 (13:35 +0100)
committerJaroslav Kysela <perex@perex.cz>
Mon, 23 Mar 2015 14:28:04 +0000 (15:28 +0100)
src/epggrab/module/eit.c
src/epggrab/module/opentv.c
src/input/mpegts.h
src/input/mpegts/dvb.h
src/input/mpegts/dvb_psi.c
src/input/mpegts/dvb_psi_lib.c
src/input/mpegts/dvb_support.c
src/input/mpegts/mpegts_table.c

index 5c448fd7eb451e8abdaec5bad622d2253fc9e8a4..85e53142b6d0187f0b4ca348458eb620fbdf875f 100644 (file)
@@ -565,7 +565,7 @@ _eit_callback
   epggrab_ota_map_t    *map = mt->mt_opaque;
   epggrab_module_t     *mod = (epggrab_module_t *)map->om_module;
   epggrab_ota_mux_t    *ota = NULL;
-  mpegts_table_state_t *st;
+  mpegts_psi_table_state_t *st;
 
   /* Validate */
   if(tableid < 0x4e || tableid > 0x6f || len < 11)
@@ -584,7 +584,8 @@ _eit_callback
     ota = epggrab_ota_register((epggrab_module_ota_t*)mod, NULL, mm);
 
   /* Begin */
-  r = dvb_table_begin(mt, ptr, len, tableid, extraid, 11, &st, &sect, &last, &ver);
+  r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
+                      tableid, extraid, 11, &st, &sect, &last, &ver);
   if (r != 1) return r;
   if (st) {
     uint32_t mask;
@@ -657,7 +658,7 @@ _eit_callback
   if (save)    epg_updated();
   
 done:
-  r = dvb_table_end(mt, st, sect);
+  r = dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
   if (ota && !r)
     epggrab_ota_complete((epggrab_module_ota_t*)mod, ota);
   
index d735390e9dc0e852111101f752e69bb96a7e4abd..07f4469f1fe9f8c232f395c0dfd791f15a8aab8a 100644 (file)
@@ -512,7 +512,7 @@ opentv_table_callback
 {
   int r = 1, cid, mjd;
   int sect, last, ver;
-  mpegts_table_state_t *st;
+  mpegts_psi_table_state_t *st;
   opentv_status_t *sta = mt->mt_opaque;
   opentv_module_t *mod = sta->os_mod;
   epggrab_ota_mux_t *ota = sta->os_ota;
@@ -526,7 +526,8 @@ opentv_table_callback
   mjd = (mjd - 40587) * 86400;
 
   /* Begin */
-  r = dvb_table_begin(mt, buf, len, tableid, (uint64_t)cid << 32 | mjd, 7,
+  r = dvb_table_begin((mpegts_psi_table_t *)mt, buf, len,
+                      tableid, (uint64_t)cid << 32 | mjd, 7,
                       &st, &sect, &last, &ver);
   if (r != 1) goto done;
 
@@ -534,7 +535,7 @@ opentv_table_callback
   r = opentv_parse_event_section(sta, cid, mjd, buf, len);
 
   /* End */
-  r = dvb_table_end(mt, st, sect);
+  r = dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
 
   /* Complete */
 done:
index 3708c06f3cf75d9de07249593c4c4d33a21018fa..3c07569534c79d9ed7b8d3eb4204ff6572870543 100644 (file)
@@ -125,17 +125,6 @@ struct mpegts_table_mux_cb
               const uint8_t dtag, const uint8_t *dptr, int dlen );
 };
 
-typedef struct mpegts_table_state
-{
-  int      tableid;
-  uint64_t extraid;
-  int      version;
-  int      complete;
-  int      working;
-  uint32_t sections[8];
-  RB_ENTRY(mpegts_table_state)   link;
-} mpegts_table_state_t;
-
 typedef struct mpegts_pid_sub
 {
   RB_ENTRY(mpegts_pid_sub) mps_link;
@@ -165,6 +154,8 @@ typedef struct mpegts_pid
 
 struct mpegts_table
 {
+  mpegts_psi_table_t;
+
   /**
    * Flags, must never be changed after creation.
    * We inspect it without holding global_lock
@@ -194,20 +185,13 @@ struct mpegts_table
    * File descriptor for filter
    */
 
-  LIST_ENTRY(mpegts_table) mt_link;
   TAILQ_ENTRY(mpegts_table) mt_defer_link;
   mpegts_mux_t *mt_mux;
 
-  char *mt_name;
-
   void *mt_opaque;
   void *mt_bat;
   mpegts_table_callback_t mt_callback;
 
-  RB_HEAD(,mpegts_table_state) mt_state;
-  int mt_complete;
-  int mt_incomplete;
-  uint8_t mt_finished;
   uint8_t mt_subscribed;
   uint8_t mt_defer_cmd;
 
@@ -218,13 +202,8 @@ struct mpegts_table
 
   int mt_count;
 
-  int mt_pid;
-
   int mt_id;
  
-  int mt_table; // SI table id (base)
-  int mt_mask;  //              mask
-
   int mt_destroyed; // Refcounting
   int mt_arefcount;
 
index 8a74924662365e94b7d63f6d775f83fe65b4c371..a30c76c44b3528521b086c6f90120bbcf5b15aaa 100644 (file)
@@ -215,6 +215,34 @@ typedef struct mpegts_psi_section
 typedef void (*mpegts_psi_section_callback_t)
   ( const uint8_t *tsb, size_t len, void *opaque );
 
+typedef struct mpegts_psi_table_state
+{
+  int      tableid;
+  uint64_t extraid;
+  int      version;
+  int      complete;
+  int      working;
+  uint32_t sections[8];
+  RB_ENTRY(mpegts_psi_table_state) link;
+} mpegts_psi_table_state_t;
+
+typedef struct mpegts_psi_table
+{
+  LIST_ENTRY(mpegts_table) mt_link;
+  RB_HEAD(,mpegts_psi_table_state) mt_state;
+
+  char   *mt_name;
+
+  uint8_t mt_table; // SI table id (base)
+  uint8_t mt_mask;  //              mask
+
+  int     mt_pid;
+
+  int     mt_complete;
+  int     mt_incomplete;
+  uint8_t mt_finished;
+} mpegts_psi_table_t;
+
 /*
  * Assemble SI section
  */
@@ -225,13 +253,13 @@ void mpegts_psi_section_reassemble
 /* PSI table callbacks */
 
 int dvb_table_end
-  (struct mpegts_table *mt, struct mpegts_table_state *st, int sect );
+  (mpegts_psi_table_t *mt, mpegts_psi_table_state_t *st, int sect );
 int dvb_table_begin
-  (struct mpegts_table *mt, const uint8_t *ptr, int len,
+  (mpegts_psi_table_t *mt, const uint8_t *ptr, int len,
    int tableid, uint64_t extraid, int minlen,
-   struct mpegts_table_state **st, int *sect, int *last, int *ver);
-void dvb_table_reset
-  (struct mpegts_table *mt);
+   mpegts_psi_table_state_t **st, int *sect, int *last, int *ver);
+void dvb_table_reset (mpegts_psi_table_t *mt);
+void dvb_table_release (mpegts_psi_table_t *mt);
 
 extern htsmsg_t *satellites;
 
index beba4a72ec80e1345c27d35db4486c94e7bfd6ac..0e9ff0a61fc861cc71a83c9c9412872a7170462d 100644 (file)
@@ -848,15 +848,15 @@ dvb_pat_callback
   int r, sect, last, ver;
   uint16_t sid, pid, tsid;
   uint16_t nit_pid = 0;
-  mpegts_mux_t          *mm  = mt->mt_mux;
-  mpegts_table_state_t  *st  = NULL;
+  mpegts_mux_t             *mm  = mt->mt_mux;
+  mpegts_psi_table_state_t *st  = NULL;
   mpegts_service_t *s;
 
   /* Begin */
   if (tableid != 0) return -1;
   tsid = (ptr[0] << 8) | ptr[1];
-  r    = dvb_table_begin(mt, ptr, len, tableid, tsid, 5,
-                         &st, &sect, &last, &ver);
+  r    = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
+                         tableid, tsid, 5, &st, &sect, &last, &ver);
   if (r != 1) return r;
 
   /* Multiplex */
@@ -907,7 +907,7 @@ dvb_pat_callback
                      NULL, "nit", MT_QUICKREQ | MT_CRC, nit_pid);
 
   /* End */
-  return dvb_table_end(mt, st, sect);
+  return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
 }
 
 /*
@@ -921,11 +921,12 @@ dvb_cat_callback
   uint8_t dtag, dlen;
   uint16_t pid; 
   uintptr_t caid;
-  mpegts_mux_t          *mm  = mt->mt_mux;
-  mpegts_table_state_t  *st  = NULL;
+  mpegts_mux_t             *mm  = mt->mt_mux;
+  mpegts_psi_table_state_t *st  = NULL;
 
   /* Start */
-  r = dvb_table_begin(mt, ptr, len, tableid, 0, 5, &st, &sect, &last, &ver);
+  r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
+                      tableid, 0, 5, &st, &sect, &last, &ver);
   if (r != 1) return r;
   ptr += 5;
   len -= 5;
@@ -956,7 +957,7 @@ dvb_cat_callback
   }
 
   /* Finish */
-  return dvb_table_end(mt, st, sect);
+  return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
 }
 
 /*
@@ -971,11 +972,12 @@ dvb_pmt_callback
   uint16_t sid;
   mpegts_mux_t *mm = mt->mt_mux;
   mpegts_service_t *s;
-  mpegts_table_state_t  *st  = NULL;
+  mpegts_psi_table_state_t *st  = NULL;
 
   /* Start */
   sid = ptr[0] << 8 | ptr[1];
-  r   = dvb_table_begin(mt, ptr, len, tableid, sid, 9, &st, &sect, &last, &ver);
+  r   = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
+                        tableid, sid, 9, &st, &sect, &last, &ver);
   if (r != 1) return r;
 
   /* Find service */
@@ -992,7 +994,7 @@ dvb_pmt_callback
     service_restart((service_t*)s);
 
   /* Finish */
-  return dvb_table_end(mt, st, sect);
+  return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
 }
 
 /*
@@ -1267,7 +1269,7 @@ dvb_nit_callback
   mpegts_mux_t     *mm = mt->mt_mux, *mux;
   mpegts_network_t *mn = mm->mm_network;
   char name[256];
-  mpegts_table_state_t  *st  = NULL;
+  mpegts_psi_table_state_t *st  = NULL;
   const char *charset;
   bouquet_t *bq = NULL;
   dvb_bat_t *b = NULL;
@@ -1281,7 +1283,8 @@ dvb_nit_callback
       tableid != DVB_FASTSCAN_NIT_BASE)
     return -1;
 
-  r = dvb_table_begin(mt, ptr, len, tableid, nbid, 7, &st, &sect, &last, &ver);
+  r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
+                      tableid, nbid, 7, &st, &sect, &last, &ver);
   if (r == 0) {
     if (tableid == 0x4A || tableid == DVB_FASTSCAN_NIT_BASE) {
       if ((b = mt->mt_bat) != NULL) {
@@ -1304,12 +1307,12 @@ dvb_nit_callback
     /* Specific NID */
     if (mn->mn_nid) {
       if (mn->mn_nid != nbid) {
-        return dvb_table_end(mt, st, sect);
+        return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
       }
   
     /* Only use "this" network */
     } else if (tableid != 0x40) {
-      return dvb_table_end(mt, st, sect);
+      return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
     }
   }
 
@@ -1426,7 +1429,7 @@ dvb_nit_callback
   }
 
   /* End */
-  return dvb_table_end(mt, st, sect);
+  return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
 }
 
 /**
@@ -1579,14 +1582,15 @@ dvb_sdt_callback
   uint16_t onid, tsid;
   mpegts_mux_t     *mm = mt->mt_mux, *mm_orig = mm;
   mpegts_network_t *mn = mm->mm_network;
-  mpegts_table_state_t  *st  = NULL;
+  mpegts_psi_table_state_t *st  = NULL;
 
   /* Begin */
   tsid    = ptr[0] << 8 | ptr[1];
   onid    = ptr[5] << 8 | ptr[6];
   extraid = ((int)onid) << 16 | tsid;
   if (tableid != 0x42 && tableid != 0x46) return -1;
-  r = dvb_table_begin(mt, ptr, len, tableid, extraid, 8, &st, &sect, &last, &ver);
+  r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
+                      tableid, extraid, 8, &st, &sect, &last, &ver);
   if (r != 1) return r;
 
   /* ID */
@@ -1614,7 +1618,7 @@ dvb_sdt_callback
   }
 
   /* Done */
-  return dvb_table_end(mt, st, sect);
+  return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
 }
 
 /*
@@ -1632,7 +1636,7 @@ atsc_vct_callback
   mpegts_mux_t     *mm = mt->mt_mux, *mm_orig = mm;
   mpegts_network_t *mn = mm->mm_network;
   mpegts_service_t *s;
-  mpegts_table_state_t  *st  = NULL;
+  mpegts_psi_table_state_t *st  = NULL;
 
   /* Validate */
   if (tableid != 0xc8 && tableid != 0xc9) return -1;
@@ -1642,8 +1646,8 @@ atsc_vct_callback
   extraid = tsid;
 
   /* Begin */
-  r = dvb_table_begin(mt, ptr, len, tableid, extraid, 7,
-                      &st, &sect, &last, &ver);
+  r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
+                      tableid, extraid, 7, &st, &sect, &last, &ver);
   if (r != 1) return r;
   tvhdebug("vct", "tsid %04X (%d)", tsid, tsid);
 
@@ -1701,7 +1705,7 @@ next:
     len -= dlen + 32;
   }
 
-  return dvb_table_end(mt, st, sect);
+  return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
 }
 
 
@@ -1718,7 +1722,7 @@ dvb_bat_callback
 #if ENABLE_MPEGTS_DVB
 static int
 dvb_fs_sdt_mux
-  ( mpegts_table_t *mt, mpegts_mux_t *mm, mpegts_table_state_t *st,
+  ( mpegts_table_t *mt, mpegts_mux_t *mm, mpegts_psi_table_state_t *st,
     const uint8_t *ptr, int len, int discovery )
 {
   uint16_t onid, tsid, service_id;
@@ -1857,7 +1861,7 @@ dvb_fs_sdt_callback
   int r, sect, last, ver;
   uint16_t nbid;
   mpegts_mux_t *mm = mt->mt_mux;
-  mpegts_table_state_t  *st  = NULL;
+  mpegts_psi_table_state_t *st  = NULL;
 
   /* Fastscan ID */
   nbid = (ptr[0] << 8) | ptr[1];
@@ -1865,7 +1869,8 @@ dvb_fs_sdt_callback
   /* Begin */
   if (tableid != 0xBD)
     return -1;
-  r = dvb_table_begin(mt, ptr, len, tableid, nbid, 7, &st, &sect, &last, &ver);
+  r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
+                      tableid, nbid, 7, &st, &sect, &last, &ver);
   if (r == 0) {
     mt->mt_working -= st->working;
     st->working = 0;
@@ -1879,7 +1884,7 @@ dvb_fs_sdt_callback
   dvb_fs_sdt_mux(mt, mm, st, ptr, len, 0);
 
   /* End */
-  return dvb_table_end(mt, st, sect);
+  return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
 }
 #endif
 
index 4960496969617c278ab83fcec7ed869fe7a9383f..b65232c0295bbaa4a810a0046d678ee9088a5c3c 100644 (file)
@@ -21,7 +21,7 @@
 #include "input.h"
 #include "dvb.h"
 
-SKEL_DECLARE(mpegts_table_state_skel, struct mpegts_table_state);
+SKEL_DECLARE(mpegts_psi_table_state_skel, struct mpegts_psi_table_state);
 
 /* **************************************************************************
  * Lookup tables
@@ -151,7 +151,7 @@ mpegts_psi_section_reassemble
  */
 
 static int sect_cmp
-  ( struct mpegts_table_state *a, struct mpegts_table_state *b )
+  ( mpegts_psi_table_state_t *a, mpegts_psi_table_state_t *b )
 {
   if (a->tableid != b->tableid)
     return a->tableid - b->tableid;
@@ -164,7 +164,7 @@ static int sect_cmp
 
 static void
 mpegts_table_state_reset
-  ( mpegts_table_t *mt, mpegts_table_state_t *st, int last )
+  ( mpegts_psi_table_t *mt, mpegts_psi_table_state_t *st, int last )
 {
   int i;
   mt->mt_finished = 0;
@@ -176,20 +176,20 @@ mpegts_table_state_reset
   st->sections[last / 32] = 0xFFFFFFFF << (31 - (last % 32));
 }
 
-static struct mpegts_table_state *
+static mpegts_psi_table_state_t *
 mpegts_table_state_find
-  ( mpegts_table_t *mt, int tableid, uint64_t extraid, int last )
+  ( mpegts_psi_table_t *mt, int tableid, uint64_t extraid, int last )
 {
-  struct mpegts_table_state *st;
+  mpegts_psi_table_state_t *st;
 
   /* Find state */
-  SKEL_ALLOC(mpegts_table_state_skel);
-  mpegts_table_state_skel->tableid = tableid;
-  mpegts_table_state_skel->extraid = extraid;
-  st = RB_INSERT_SORTED(&mt->mt_state, mpegts_table_state_skel, link, sect_cmp);
+  SKEL_ALLOC(mpegts_psi_table_state_skel);
+  mpegts_psi_table_state_skel->tableid = tableid;
+  mpegts_psi_table_state_skel->extraid = extraid;
+  st = RB_INSERT_SORTED(&mt->mt_state, mpegts_psi_table_state_skel, link, sect_cmp);
   if (!st) {
-    st   = mpegts_table_state_skel;
-    SKEL_USED(mpegts_table_state_skel);
+    st   = mpegts_psi_table_state_skel;
+    SKEL_USED(mpegts_psi_table_state_skel);
     mt->mt_incomplete++;
     mpegts_table_state_reset(mt, st, last);
   }
@@ -201,11 +201,11 @@ mpegts_table_state_find
  */
 static int
 dvb_table_complete
-  (mpegts_table_t *mt)
+  (mpegts_psi_table_t *mt)
 {
   if (mt->mt_incomplete || !mt->mt_complete) {
     int total = 0;
-    mpegts_table_state_t *st;
+    mpegts_psi_table_state_t *st;
     RB_FOREACH(st, &mt->mt_state, link)
       total++;
     tvhtrace(mt->mt_name, "incomplete %d complete %d total %d",
@@ -220,7 +220,7 @@ dvb_table_complete
 
 int
 dvb_table_end
-  (mpegts_table_t *mt, mpegts_table_state_t *st, int sect)
+  (mpegts_psi_table_t *mt, mpegts_psi_table_state_t *st, int sect)
 {
   int sa, sb;
   uint32_t rem;
@@ -250,11 +250,11 @@ dvb_table_end
  */
 int
 dvb_table_begin
-  (mpegts_table_t *mt, const uint8_t *ptr, int len,
+  (mpegts_psi_table_t *mt, const uint8_t *ptr, int len,
    int tableid, uint64_t extraid, int minlen,
-   mpegts_table_state_t **ret, int *sect, int *last, int *ver)
+   mpegts_psi_table_state_t **ret, int *sect, int *last, int *ver)
 {
-  mpegts_table_state_t *st;
+  mpegts_psi_table_state_t *st;
   uint32_t sa, sb;
 
   /* Not long enough */
@@ -326,9 +326,9 @@ dvb_table_begin
 }
 
 void
-dvb_table_reset(mpegts_table_t *mt)
+dvb_table_reset(mpegts_psi_table_t *mt)
 {
-  mpegts_table_state_t *st;
+  mpegts_psi_table_state_t *st;
 
   tvhtrace(mt->mt_name, "pid %02X complete reset", mt->mt_pid);
   mt->mt_incomplete = 0;
@@ -338,3 +338,14 @@ dvb_table_reset(mpegts_table_t *mt)
     free(st);
   }
 }
+
+void
+dvb_table_release(mpegts_psi_table_t *mt)
+{
+  mpegts_psi_table_state_t *st;
+
+  while ((st = RB_FIRST(&mt->mt_state))) {
+    RB_REMOVE(&mt->mt_state, st, link);
+    free(st);
+  }
+}
index 7afd081b1ac3eb015ea6250ff1ffeda83e7b5c98..bc9a5c34af9a2dab2d6519bb49e6ba18242b2952 100644 (file)
@@ -933,9 +933,9 @@ void dvb_init( void )
 
 void dvb_done( void )
 {
-  extern SKEL_DECLARE(mpegts_table_state_skel, struct mpegts_table_state);
+  extern SKEL_DECLARE(mpegts_psi_table_state_skel, mpegts_psi_table_state_t);
 
-  SKEL_FREE(mpegts_table_state_skel);
+  SKEL_FREE(mpegts_psi_table_state_skel);
 #if ENABLE_MPEGTS_DVB
   htsmsg_destroy(satellites);
 #endif
index f27b671fb9738793c4e025a0200a959f87f335b4..29715650d49b0c34d98b44d9b351f7acaf376311 100644 (file)
@@ -88,7 +88,7 @@ mpegts_table_dispatch
                              "(len %i, total %zi, errors %zi)",
                              len, r, mt->mt_err_log.count);
     }
-    dvb_table_reset(mt);
+    dvb_table_reset((mpegts_psi_table_t *)mt);
     return;
   }
 
@@ -134,12 +134,7 @@ mpegts_table_dispatch
 void
 mpegts_table_release_ ( mpegts_table_t *mt )
 {
-  struct mpegts_table_state *st;
-
-  while ((st = RB_FIRST(&mt->mt_state))) {
-    RB_REMOVE(&mt->mt_state, st, link);
-    free(st);
-  }
+  dvb_table_release((mpegts_psi_table_t *)mt);
   tvhtrace("mpegts", "table: mux %p free %s %02X/%02X (%d) pid %04X (%d)",
            mt->mt_mux, mt->mt_name, mt->mt_table, mt->mt_mask, mt->mt_table,
            mt->mt_pid, mt->mt_pid);