atsc: started adding back in VCT processing

This commit is contained in:
Adam Sutton 2013-11-09 23:58:20 +00:00
parent 9de5cc4c98
commit 8dac141576
5 changed files with 110 additions and 12 deletions

View file

@ -37,6 +37,7 @@ struct mpegts_table;
#define DVB_NIT_PID 0x10
#define DVB_SDT_PID 0x11
#define DVB_BAT_PID 0x11
#define DVB_VCT_PID 0x1FFB
/* Tables */
@ -58,6 +59,10 @@ struct mpegts_table;
#define DVB_BAT_BASE 0x48
#define DVB_BAT_MASK 0xF8
#define DVB_VCT_T_BASE 0xC8
#define DVB_VCT_C_BASE 0xC9
#define DVB_VCT_MASK 0xFF
#define DVB_TELETEXT_BASE 0x2000
/* Descriptors */
@ -182,6 +187,8 @@ int dvb_sdt_callback
(struct mpegts_table *mt, const uint8_t *ptr, int len, int tableid);
int dvb_tdt_callback
(struct mpegts_table *mt, const uint8_t *ptr, int len, int tableid);
int atsc_vct_callback
(struct mpegts_table *mt, const uint8_t *ptr, int len, int tableid);
/*
* Delivery systems and DVB API wrappers

View file

@ -1008,6 +1008,99 @@ done:
return dvb_table_end(mt, st, sect);
}
/*
* ATSC VCT processing
*/
/* Done */
int
atsc_vct_callback
(mpegts_table_t *mt, const uint8_t *ptr, int len, int tableid)
{
int i, r, sect, last, ver, extraid, save, dlen;
int maj, min, count;
uint16_t tsid, sid, type;
char chname[256];
mpegts_mux_t *mm = mt->mt_mux;
mpegts_network_t *mn = mm->mm_network;
mpegts_service_t *s;
mpegts_table_state_t *st = NULL;
/* Validate */
if (tableid != 0xc8 && tableid != 0xc9) return -1;
/* Extra ID */
tsid = ptr[0] << 8 | ptr[1];
extraid = tsid;
/* Begin */
r = dvb_table_begin(mt, ptr, len, tableid, extraid, 7,
&st, &sect, &last, &ver);
if (r != 1) return r;
tvhdebug("vct", "tsid %04X (%d)", tsid, tsid);
/* # channels */
count = ptr[6];
tvhdebug("vct", "channel count %d", count);
ptr += 7;
len -= 7;
for (i = 0; i < count && len >= 32; i++) {
dlen = ((ptr[30] & 0x3) << 8) | ptr[31];
if (dlen + 32 > len) return -1;
/* Extract fields */
atsc_utf16_to_utf8(ptr, 7, chname, sizeof(chname));
maj = (ptr[14] & 0xF) << 6 | ptr[15] >> 2;
min = (ptr[15] & 0x3) << 2 | ptr[16];
tsid = (ptr[22]) << 8 | ptr[23];
sid = (ptr[24]) << 8 | ptr[25];
type = ptr[27] & 0x3f;
tvhdebug("vct", "tsid %04X (%d)", tsid, tsid);
tvhdebug("vct", "sid %04X (%d)", sid, sid);
tvhdebug("vct", "chname %s", chname);
tvhdebug("vct", "chnum %d.%d", maj, min);
tvhdebug("vct", "type %02X (%d)", type, type);
/* Find mux */
LIST_FOREACH(mm, &mn->mn_muxes, mm_network_link)
if (mm->mm_tsid == tsid)
break;
if (!mm) goto next;
/* Find the service */
if (!(s = mpegts_service_find(mm, sid, 0, 1, &save)))
goto next;
/* Update */
if (s->s_dvb_servicetype != type) {
s->s_dvb_servicetype = type;
save = 1;
}
if (strcmp(s->s_dvb_svcname ?: "", chname)) {
tvh_str_set(&s->s_dvb_svcname, chname);
save = 1;
}
if (s->s_dvb_channel_num != maj) {
// TODO: ATSC channel numbering is plain weird!
// could shift the major (*100 or something) and append
// minor, but that'll probably confuse people, as will this!
s->s_dvb_channel_num = maj;
save = 1;
}
/* Save */
if (save)
s->s_config_save((service_t*)s);
/* Move on */
next:
ptr += dlen + 32;
len -= dlen + 32;
}
return dvb_table_end(mt, st, sect);
}
/*
* DVB BAT processing
*/

View file

@ -414,15 +414,13 @@ linuxdvb_frontend_default_tables
/* ATSC */
if (lfe->lfe_info.type == FE_ATSC) {
#if 0
int tableid;
if (lc->lm_tuning.dmc_fe_params.u.vsb.modulation == VSB_8)
tableid = ATSC_VCT_TERR;
if (lm->lm_tuning.dmc_fe_params.u.vsb.modulation == VSB_8)
tableid = DVB_VCT_T_BASE;
else
tableid = ATSC_VCT_CAB;
mpegts_table_add(mm, tableid, 0xff, atsc_vct_callback,
NULL, "vct", MT_QUICKREQ | MT_CRC, ATSC_VCT_PID);
#endif
tableid = DVB_VCT_C_BASE;
mpegts_table_add(mm, tableid, DVB_VCT_MASK, atsc_vct_callback,
NULL, "vct", MT_QUICKREQ | MT_CRC, DVB_VCT_PID);
/* DVB */
} else {

View file

@ -40,18 +40,14 @@ static mpegts_service_t *
tsfile_network_create_service
( mpegts_mux_t *mm, uint16_t sid, uint16_t pmt_pid )
{
static int t = 0;
pthread_mutex_lock(&tsfile_lock);
mpegts_service_t *s = mpegts_service_create1(NULL, mm, sid, pmt_pid, NULL);
pthread_mutex_unlock(&tsfile_lock);
// TODO: HACK: REMOVE ME
if (s) {
char buf[128];
sprintf(buf, "channel-%d", t);
channel_t *c = channel_create(NULL, NULL, buf);
channel_t *c = channel_create(NULL, NULL, NULL);
service_mapper_link((service_t*)s, c);
t++;
}
return s;
}

View file

@ -220,6 +220,10 @@ tsfile_input_start_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *t )
NULL, "sdt", MT_QUICKREQ | MT_CRC, DVB_SDT_PID);
mpegts_table_add(mm, DVB_BAT_BASE, DVB_BAT_MASK, dvb_bat_callback,
NULL, "bat", MT_CRC, DVB_BAT_PID);
mpegts_table_add(mm, DVB_VCT_T_BASE, DVB_VCT_MASK, atsc_vct_callback,
NULL, "vct", MT_CRC, DVB_VCT_PID);
mpegts_table_add(mm, DVB_VCT_C_BASE, DVB_VCT_MASK, atsc_vct_callback,
NULL, "vct", MT_CRC, DVB_VCT_PID);
#if 0
mpegts_table_add(mm, 0x1, 0xff, dvb_cat_callback, NULL, "cat",
MT_CRC, 1);