Deliver raw teletext to clients that are able to display it (e.g. XBMC)
This commit is contained in:
parent
240c7b7a21
commit
765beff332
2 changed files with 58 additions and 4 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue