From 3b407aa2053b1db3316873acd05c64319676eb34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jernej=20Fija=C4=8Dko?= Date: Fri, 30 Sep 2011 12:56:01 +0200 Subject: [PATCH 1/2] Deliver raw teletext to clients that are able to display it (e.g. XBMC) --- src/parsers.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/tsdemux.c | 7 +++---- 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/src/parsers.c b/src/parsers.c index 9b7337dc..68c7996c 100644 --- a/src/parsers.c +++ b/src/parsers.c @@ -102,6 +102,9 @@ static void parse_aac(service_t *t, elementary_stream_t *st, const uint8_t *data static void parse_subtitles(service_t *t, elementary_stream_t *st, const uint8_t *data, int len, int start); +static void parse_teletext(service_t *t, elementary_stream_t *st, + const uint8_t *data, int len, int start); + static int parse_mpa(service_t *t, elementary_stream_t *st, size_t len, uint32_t next_startcode, int sc_offset); @@ -158,6 +161,10 @@ parse_mpeg_ts(service_t *t, elementary_stream_t *st, const uint8_t *data, parse_aac(t, st, data, len, start); break; + case SCT_TELETEXT: + parse_teletext(t, st, data, len, start); + break; + default: break; } @@ -1232,6 +1239,54 @@ parse_subtitles(service_t *t, elementary_stream_t *st, const uint8_t *data, } } +/** + * Teletext parser + */ +static void +parse_teletext(service_t *t, elementary_stream_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) { + st->es_parser_state = 1; + st->es_buf.sb_err = 0; + st->es_parser_ptr = 0; + sbuf_reset(&st->es_buf); + } + + 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 >= 46) { + + pkt = pkt_alloc(buf, psize, st->es_curpts, st->es_curdts); + pkt->pkt_commercial = t->s_tt_commercial_advice; + parser_deliver(t, st, pkt); + } +} /** * diff --git a/src/tsdemux.c b/src/tsdemux.c index 897fe1d6..5fdaf8bd 100644 --- a/src/tsdemux.c +++ b/src/tsdemux.c @@ -110,11 +110,10 @@ ts_recv_packet0(service_t *t, elementary_stream_t *st, const uint8_t *tsb) got_section, st); break; - case SCT_TELETEXT: - teletext_input(t, st, tsb); - break; - default: + if(st->es_type == SCT_TELETEXT) + teletext_input(t, st, tsb); + if(off > 188) break; From a8026cd5b412c5096b0904f060ad5ffccdb883cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jernej=20Fija=C4=8Dko?= Date: Thu, 17 Nov 2011 08:25:31 +0100 Subject: [PATCH 2/2] Disable teletext recording to prevent issues with other elementary streams. Temporary until a better solution is found. --- src/plumbing/globalheaders.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/plumbing/globalheaders.c b/src/plumbing/globalheaders.c index 703591bd..7f183d4b 100644 --- a/src/plumbing/globalheaders.c +++ b/src/plumbing/globalheaders.c @@ -202,6 +202,12 @@ gh_hold(globalheaders_t *gh, streaming_message_t *sm) pkt->pkt_componentindex); assert(ssc != NULL); + if(ssc->ssc_type == SCT_TELETEXT) { + free(sm); + ssc->ssc_disabled = 1; + break; + } + pkt = convertpkt(ssc, pkt); apply_header(ssc, pkt);