Deliver raw teletext to clients that are able to display it (e.g. XBMC)

This commit is contained in:
Jernej Fijačko 2011-09-30 12:56:01 +02:00 committed by Adam Sutton
parent 240c7b7a21
commit 765beff332
2 changed files with 58 additions and 4 deletions

View file

@ -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);
@ -165,6 +168,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;
}
@ -1309,6 +1316,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);
}
}
/**
*

View file

@ -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;