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,
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
*/
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;