]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvb psi: cosmetic code reshuffle, translate onid/tsid 0xffff to 55555
authorJaroslav Kysela <perex@perex.cz>
Wed, 14 Jun 2017 07:02:42 +0000 (09:02 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 9 Oct 2017 13:34:53 +0000 (15:34 +0200)
src/input/mpegts/dvb_psi.c

index 2486549b3bdb65ceb39c2e4b31a5c337708b11a9..866914f10f7bc7f3d726725b52ebf09725f73549 100644 (file)
@@ -91,6 +91,52 @@ static int
 psi_parse_pmt(mpegts_table_t *mt, mpegts_service_t *t,
               const uint8_t *ptr, int len, int *_update);
 
+static inline uint16_t
+extract_2byte(const uint8_t *ptr)
+{
+  return (ptr[0] << 8) | ptr[1];
+}
+
+
+static inline uint16_t
+extract_4byte(const uint8_t *ptr)
+{
+  return (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | ptr[3];
+}
+
+
+static inline uint16_t
+extract_tsid(const uint8_t *ptr)
+{
+  uint16_t r = (ptr[0] << 8) | ptr[1];
+  if (r == MPEGTS_TSID_NONE) r = 55555;
+  return r;
+}
+
+
+static inline uint16_t
+extract_onid(const uint8_t *ptr)
+{
+  uint16_t r = (ptr[0] << 8) | ptr[1];
+  if (r == MPEGTS_ONID_NONE) r = 55555;
+  return r;
+}
+
+
+static inline uint16_t
+extract_pid(const uint8_t *ptr)
+{
+  return ((ptr[0] & 0x1f) << 8) | ptr[1];
+}
+
+
+static inline uint16_t
+extract_svcid(const uint8_t *ptr)
+{
+  return (ptr[0] << 8) | ptr[1];
+}
+
+
 static inline int
 mpegts_mux_alive(mpegts_mux_t *mm)
 {
@@ -366,7 +412,7 @@ dvb_desc_terr_del
   if (len < 11) return NULL;
 
   /* Extract data */
-  frequency     = ((ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | ptr[3]);
+  frequency     = extract_4byte(ptr);
   if (frequency < 1000000 || frequency > 200000000) {
     tvhtrace(mt->mt_subsys, "%s: dvb-t frequency error (%d)", mt->mt_name, frequency);
     return NULL;
@@ -464,7 +510,7 @@ dvb_desc_service_list
   int i;
 
   for (i = 0; i < len; i += 3) {
-    sid   = (ptr[i] << 8) | ptr[i+1];
+    sid   = extract_svcid(ptr + i);
     stype = ptr[i+2];
     tvhdebug(mt->mt_subsys, "%s:    service %04X (%d) type %02X (%d)", mt->mt_name, sid, sid, stype, stype);
     if (mm) {
@@ -492,8 +538,8 @@ dvb_desc_local_channel
     return 0;
 
   while(len >= 4) {
-    sid = (ptr[0] << 8) | ptr[1];
-    lcn = ((ptr[2] & 3) << 8) | ptr[3];
+    sid = extract_svcid(ptr);
+    lcn = extract_2byte(ptr + 2) & 0x3ff;
     tvhdebug(mt->mt_subsys, "%s:    sid %d lcn %d", mt->mt_name, sid, lcn);
     if (sid && lcn && mm) {
       s = mpegts_service_find(mm, sid, 0, 0, &save);
@@ -532,8 +578,8 @@ dvb_freesat_local_channels
   int len2;
 
   while (len > 4) {
-    sid = (ptr[0] << 8) | ptr[1];
-    unk = (ptr[2] << 8) | ptr[3];
+    sid = extract_svcid(ptr);
+    unk = extract_2byte(ptr + 2);
     len2 = ptr[4];
     ptr += 5;
     len -= 5;
@@ -541,8 +587,8 @@ dvb_freesat_local_channels
       break;
     tvhtrace(mt->mt_subsys, "%s:      sid %04X (%d) uknown %04X (%d)", mt->mt_name, sid, sid, unk, unk);
     while (len2 > 3) {
-      lcn = ((ptr[0] & 0x0f) << 8) | ptr[1];
-      regionid = (ptr[2] << 8) | ptr[3];
+      lcn = extract_2byte(ptr) & 0xfff;
+      regionid = extract_2byte(ptr + 2);
       tvhtrace(mt->mt_subsys, "%s:        lcn %d region %d", mt->mt_name, lcn, regionid);
       
       TAILQ_FOREACH(fs, &bi->fservices, link)
@@ -576,7 +622,7 @@ dvb_freesat_regions
     return;
 
   while (len > 5) {
-    id = (ptr[0] << 8) | ptr[1];
+    id = extract_2byte(ptr);
     /* language: ptr[2-4]: 'eng' */
     if ((r = dvb_get_string_with_len(name, sizeof(name), ptr + 5, len - 5, NULL, NULL)) < 0)
       break;
@@ -796,10 +842,10 @@ dvb_bskyb_local_channels
            mt->mt_name, regionid, regionid, ptr[0], ptr[0]);
 
   while (len > 8) {
-    sid = (ptr[0] << 8) | ptr[1];
-    lcn = (ptr[5] << 8) | ptr[6];
+    sid = extract_svcid(ptr);
+    lcn = extract_2byte(ptr + 5);
     stype = ptr[2];
-    unk = (ptr[3] << 8) | ptr[4];
+    unk = extract_2byte(ptr + 3);
     ptr += 9;
     len -= 9;
 
@@ -871,7 +917,7 @@ dvb_pat_callback
 
   /* Begin */
   if (tableid != 0) return -1;
-  tsid = (ptr[0] << 8) | ptr[1];
+  tsid = extract_tsid(ptr);
   r    = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
                          tableid, tsid, 5, &st, &sect, &last, &ver);
   if (r != 1) return r;
@@ -908,8 +954,8 @@ dvb_pat_callback
   ptr += 5;
   len -= 5;
   while(len >= 4) {
-    sid = ptr[0]         << 8 | ptr[1];
-    pid = (ptr[2] & 0x1f) << 8 | ptr[3];
+    sid = extract_svcid(ptr);
+    pid = extract_pid(ptr + 2);
 
     /* NIT PID */
     if (sid == 0) {
@@ -981,8 +1027,8 @@ dvb_cat_callback
     switch(dtag) {
       case DVB_DESC_CA:
         if (len >= 4 && dlen >= 4) {
-          caid = ( ptr[0]         << 8) | ptr[1];
-          pid  = ((ptr[2] & 0x1f) << 8) | ptr[3];
+          caid = extract_2byte(ptr);
+          pid  = extract_pid(ptr + 2);
           tvhdebug(mt->mt_subsys, "%s:  caid %04X (%d) pid %04X (%d)",
                    mt->mt_name, (uint16_t)caid, (uint16_t)caid, pid, pid);
         }
@@ -1033,7 +1079,7 @@ dvb_pmt_callback
   mpegts_psi_table_state_t *st  = NULL;
 
   /* Start */
-  sid = ptr[0] << 8 | ptr[1];
+  sid = extract_svcid(ptr);
   r   = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
                         tableid, sid, 9, &st, &sect, &last, &ver);
   if (r != 1) return r;
@@ -1279,7 +1325,7 @@ dvb_nit_mux
       break;
     case DVB_DESC_PRIVATE_DATA:
       if (dlen == 4) {
-        priv = (dptr[0] << 24) | (dptr[1] << 16) | (dptr[2] << 8) | dptr[3];
+        priv = extract_4byte(dptr);
         tvhtrace(mt->mt_subsys, "%s:      private %08X", mt->mt_name, priv);
       }
       break;
@@ -1354,7 +1400,7 @@ dvb_nit_callback
   dvb_bat_id_t *bi = NULL;
 
   /* Net/Bat ID */
-  nbid = (ptr[0] << 8) | ptr[1];
+  nbid = extract_2byte(ptr);
 
   /* Begin */
   if (tableid == DVB_FASTSCAN_NIT_BASE) {
@@ -1447,7 +1493,7 @@ dvb_nit_callback
         break;
       case DVB_DESC_PRIVATE_DATA:
         if (tableid == 0x4A && dlen == 4) {
-          priv = (dptr[0] << 24) | (dptr[1] << 16) | (dptr[2] << 8) | dptr[3];
+          priv = extract_4byte(dptr);
           tvhtrace(mt->mt_subsys, "%s:    private %08X", mt->mt_name, priv);
         }
         break;
@@ -1488,8 +1534,8 @@ dvb_nit_callback
 
   /* Transport length */
   DVB_LOOP_FOREACH(mt, ptr, len, 0, lptr, llen, 6) {
-    tsid  = (lptr[0] << 8) | lptr[1];
-    onid  = (lptr[2] << 8) | lptr[3];
+    tsid  = extract_tsid(lptr);
+    onid  = extract_onid(lptr + 2);
 
 #if ENABLE_MPEGTS_DVB
     /* Create new muxes (auto-discovery) */
@@ -1553,7 +1599,7 @@ dvb_sdt_mux
   while(len >= 5) {
     mpegts_service_t *s;
     int master = 0, save = 0, save2 = 0;
-    uint16_t service_id                = ptr[0] << 8 | ptr[1];
+    uint16_t service_id                = extract_svcid(ptr);
     int      free_ca_mode              = (ptr[3] >> 4) & 0x1;
     int      stype = 0;
     char     sprov[256], sname[256], sauth[256];
@@ -1588,7 +1634,7 @@ dvb_sdt_mux
           break;
         case DVB_DESC_PRIVATE_DATA:
           if (dlen == 4) {
-            priv = (dptr[0] << 24) | (dptr[1] << 16) | (dptr[2] << 8) | dptr[3];
+            priv = extract_4byte(dptr);
             tvhtrace(mt->mt_subsys, "%s:  private %08X", mt->mt_name, priv);
           }
           break;
@@ -1678,8 +1724,8 @@ dvb_sdt_callback
   mpegts_psi_table_state_t *st  = NULL;
 
   /* Begin */
-  tsid    = ptr[0] << 8 | ptr[1];
-  onid    = ptr[5] << 8 | ptr[6];
+  tsid    = extract_onid(ptr);
+  onid    = extract_tsid(ptr + 5);
   extraid = ((int)onid) << 16 | tsid;
   if (tableid != 0x42 && tableid != 0x46) return -1;
   r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len,
@@ -1739,7 +1785,7 @@ atsc_vct_callback
   if (tableid != 0xc8 && tableid != 0xc9) return -1;
 
   /* Extra ID */
-  tsid    = ptr[0] << 8 | ptr[1];
+  tsid    = extract_tsid(ptr);
   extraid = tsid;
 
   /* Begin */
@@ -1761,8 +1807,8 @@ atsc_vct_callback
     atsc_utf16_to_utf8(ptr, 7, chname, sizeof(chname));
     maj  = (ptr[14] & 0xF) << 6 | ptr[15] >> 2;
     min  = (ptr[15] & 0x3) << 2 | ptr[16];
-    tsid = (ptr[22]) << 8 | ptr[23];
-    sid  = (ptr[24]) << 8 | ptr[25];
+    tsid = extract_tsid(ptr + 22);
+    sid  = extract_svcid(ptr + 24);
     type = ptr[27] & 0x3f;
     srcid  = (ptr[28]) << 8 | ptr[29];
     tvhdebug(mt->mt_subsys, "%s: tsid   %04X (%d)", mt->mt_name, tsid, tsid);
@@ -1851,7 +1897,7 @@ atsc_stt_callback
   if (tableid != DVB_ATSC_STT_BASE) return -1;
 
   /* Extra ID */
-  extraid = ptr[0] << 8 | ptr[1];
+  extraid = extract_2byte(ptr);
 
   /* Begin */
   r = dvb_table_begin((mpegts_psi_table_t *)mt, ptr, len, tableid, extraid, 7,
@@ -1859,7 +1905,7 @@ atsc_stt_callback
   if (r != 1) return r;
 
   /* Parse fields */
-  systemtime = ptr[6] << 24 | ptr[7] << 16 | ptr[8] << 8 | ptr[9];
+  systemtime = extract_4byte(ptr + 6);
   gps_utc_offset = ptr[10];
   is_dst = ptr[11] >> 7;
 
@@ -1898,9 +1944,9 @@ dvb_fs_sdt_mux
     mpegts_service_t *s;
     int stype = 0, save = 0;
 
-    onid = (ptr[0] << 8) | ptr[1];
-    tsid = (ptr[2] << 8) | ptr[3];
-    service_id = (ptr[4] << 8) | ptr[5];
+    onid = extract_onid(ptr);
+    tsid = extract_tsid(ptr + 2);
+    service_id = extract_svcid(ptr + 4);
     /* (ptr[6] << 8) | ptr[7]   - video pid */
     /* (ptr[7] << 8) | ptr[8]   - audio pid */
     /* (ptr[9] << 8) | ptr[10]  - video ecm pid */
@@ -2028,7 +2074,7 @@ dvb_fs_sdt_callback
   mpegts_psi_table_state_t *st = NULL;
 
   /* Fastscan ID */
-  nbid = (ptr[0] << 8) | ptr[1];
+  nbid = extract_2byte(ptr);
 
   /* Begin */
   if (tableid != 0xBD)
@@ -2120,23 +2166,23 @@ psi_desc_ca(mpegts_table_t *mt, mpegts_service_t *t, const uint8_t *buffer, int
   int r = 0;
   int i;
   uint32_t provid = 0;
-  uint16_t caid = (buffer[0] << 8) | buffer[1];
-  uint16_t pid = ((buffer[2]&0x1F) << 8) | buffer[3];
+  uint16_t caid = extract_2byte(buffer);
+  uint16_t pid = extract_pid(buffer + 2);
 
   switch (caid & 0xFF00) {
   case 0x0100: // SECA/Mediaguard
-    provid = (buffer[4] << 8) | buffer[5];
+    provid = extract_2byte(buffer + 4);
 
     //Add extra providers, if any
     for (i = 17; i < size; i += 15){
-      uint16_t xpid = ((buffer[i]&0x1F) << 8) | buffer[i + 1];
-      uint16_t xprovid = (buffer[i + 2] << 8) | buffer[i + 3];
+      uint16_t xpid = extract_pid(buffer + i);
+      uint16_t xprovid = extract_2byte(buffer + i + 2);
 
       r |= psi_desc_add_ca(mt, t, caid, xprovid, xpid);
     }
     break;
   case 0x0500:// Viaccess
-    for (i = 4; i < size;) {
+    for (i = 4; i + 5 <= size;) {
       uint8_t nano    = buffer[i++];
       uint8_t nanolen = buffer[i++];
 
@@ -2248,7 +2294,7 @@ psi_parse_pmt
   lock_assert(&t->s_stream_mutex);
 
   version = ptr[2] >> 1 & 0x1f;
-  pcr_pid = (ptr[5] & 0x1f) << 8 | ptr[6];
+  pcr_pid = extract_pid(ptr + 5);
   dllen   = (ptr[7] & 0xf) << 8 | ptr[8];
   
   if(t->s_pcr_pid != pcr_pid) {
@@ -2291,7 +2337,7 @@ psi_parse_pmt
 
   while(len >= 5) {
     estype  = ptr[0];
-    pid     = (ptr[1] & 0x1f) << 8 | ptr[2];
+    pid     = extract_pid(ptr + 1);
     dllen   = (ptr[3] & 0xf) << 8 | ptr[4];
     tvhdebug(mt->mt_subsys, "%s:  pid %04X estype %d", mt->mt_name, pid, estype);
     tvhlog_hexdump(mt->mt_subsys, ptr, 5);
@@ -2407,8 +2453,8 @@ psi_parse_pmt
           break;
 
         lang = lang_code_get2((const char*)ptr, 3);
-        composition_id = ptr[4] << 8 | ptr[5];
-        ancillary_id   = ptr[6] << 8 | ptr[7];
+        composition_id = extract_2byte(ptr + 4);
+        ancillary_id   = extract_2byte(ptr + 6);
         hts_stream_type = SCT_DVBSUB;
         break;