]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Add support for SCT_RDS
authorKai Sommerfeld <kai.sommerfeld@gmx.com>
Thu, 5 Aug 2021 21:15:56 +0000 (23:15 +0200)
committerFlole998 <Flole998@users.noreply.github.com>
Mon, 6 Sep 2021 19:30:59 +0000 (21:30 +0200)
src/esfilter.h
src/esstream.h
src/input/mpegts/dvb_psi_pmt.c
src/parsers/parsers.c
src/streaming.c

index c96a22e9c762e792bae195729cae2be2e3b73798..86d0c8a07e3f71ee65b9ac6f65c6b628d46118fe 100644 (file)
@@ -63,7 +63,7 @@ extern const idclass_t esfilter_class_other;
   SCT_MASK(SCT_CA)
 
 #define ESF_MASK_OTHER \
-  (SCT_MASK(SCT_MPEGTS) | SCT_MASK(SCT_HBBTV))
+  (SCT_MASK(SCT_MPEGTS) | SCT_MASK(SCT_HBBTV) | SCT_MASK(SCT_RDS))
 
 extern uint32_t esfilterclsmask[];
 
index 9d756bf0efa4fb489a4cae20a0f09ea47b78ab7c..35199e045a4323af05ae4930a46fa9c0e89a4ae4 100644 (file)
@@ -45,6 +45,7 @@ enum streaming_component_type {
   SCT_CAT,     /* MPEG-TS CAT (EMM) data */
   SCT_CA,      /* MPEG-TS ECM data */
   SCT_HBBTV,   /* HBBTV info */
+  SCT_RDS,     /* Radio Data System */
   /* standard codecs */
   SCT_MPEG2VIDEO,
   SCT_MPEG2AUDIO,
index bff3a7d3456b299849e17722048f6a634ad2d806..09854c00a7210c05954ed89e08f17afbabed3333 100644 (file)
@@ -437,6 +437,14 @@ dvb_psi_parse_pmt
           hts_stream_type = SCT_EAC3;
         break;
 
+      case DVB_DESC_ANCILLARY_DATA:
+        if(dlen < 1 || hts_stream_type != SCT_UNKNOWN)
+          break;
+
+        if(estype == 0x89 && (ptr[0] & 0x40) == 0x40) // ancillary_data_id 0x40 : RDS via UECP
+          hts_stream_type = SCT_RDS;
+        break;
+
       default:
         break;
       }
index 231501e39f97e5dda26f43dbefd415caa4188faf..7c20d01d218162f8592ff9efc5a2ba93d1f29b48 100644 (file)
@@ -1917,6 +1917,59 @@ parse_hbbtv(parser_t *t, parser_es_t *st, const uint8_t *data,
   parser_deliver(t, st, pkt);
 }
 
+/**
+ * RDS parser
+ */
+static void
+parse_rds(parser_t *t, parser_es_t *st, const uint8_t *data,
+          int len, int start)
+{
+  th_pkt_t *pkt;
+  int psize, hlen;
+  const uint8_t *buf;
+  const uint8_t *d;
+
+  if(start) {
+    /* Payload unit start */
+    st->es_parser_state = 1;
+    sbuf_reset(&st->es_buf, 4000);
+  }
+
+  if(st->es_parser_state == 0)
+    return;
+
+  sbuf_append(&st->es_buf, data, len);
+
+  if(st->es_buf.sb_ptr < 6)
+    return;
+  d = st->es_buf.sb_data;
+
+  psize = d[4] << 8 | d[5];
+
+  if(st->es_buf.sb_ptr != psize + 6)
+    return;
+
+  st->es_parser_state = 0;
+
+  hlen = parse_pes_header(t, st, d + 6, st->es_buf.sb_ptr - 6);
+  if(hlen < 0)
+    return;
+
+  psize -= hlen;
+  buf = d + 6 + hlen;
+
+  if(psize < 2 || buf[0] != 0xfe || buf[psize-1] != 0xff)
+    return;
+
+  if(psize > 2) {
+    pkt = pkt_alloc(st->es_type, buf, psize,
+                    t->prs_current_pcr, t->prs_current_pcr, t->prs_current_pcr);
+    pkt->pkt_err = st->es_buf.sb_err;
+    parser_deliver(t, st, pkt);
+    sbuf_reset(&st->es_buf, 4000);
+  }
+}
+
 /**
  * for debugging
  */
@@ -2008,6 +2061,10 @@ parse_mpeg_ts(parser_t *t, parser_es_t *st, const uint8_t *data,
     st->es_parse_callback = parse_hbbtv;
     break;
 
+  case SCT_RDS:
+    st->es_parse_callback = parse_rds;
+    break;
+
   default:
     st->es_parse_callback = parse_none;
     break;
index 0e513e46a0b07d03fdca3ea4c60768d1c4d57e58..8f4349a2a38142017402505787f2482a907f8f9b 100644 (file)
@@ -570,6 +570,7 @@ static struct strtab streamtypetab[] = {
   { "CAT",        SCT_CAT },
   { "CA",         SCT_CA },
   { "HBBTV",      SCT_HBBTV },
+  { "RDS",        SCT_RDS },
   { "MPEG2VIDEO", SCT_MPEG2VIDEO },
   { "MPEG2AUDIO", SCT_MPEG2AUDIO },
   { "H264",       SCT_H264 },