Fix some bugs in the ATSC VCT table parser
This commit is contained in:
parent
052f730788
commit
c6b7ecea6d
1 changed files with 20 additions and 6 deletions
|
@ -1004,8 +1004,10 @@ atsc_vct_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
||||||
uint8_t stype;
|
uint8_t stype;
|
||||||
uint16_t service_id;
|
uint16_t service_id;
|
||||||
uint16_t transport_stream_id;
|
uint16_t transport_stream_id;
|
||||||
|
int dlen, dl;
|
||||||
|
uint8_t *dptr;
|
||||||
|
|
||||||
if(tableid != 0xc8 || tableid != 0xc9)
|
if(tableid != 0xc8 && tableid != 0xc9)
|
||||||
return -1; // Fail
|
return -1; // Fail
|
||||||
|
|
||||||
ptr += 5; // Skip generic header
|
ptr += 5; // Skip generic header
|
||||||
|
@ -1018,8 +1020,13 @@ atsc_vct_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
||||||
ptr += 2;
|
ptr += 2;
|
||||||
len -= 2;
|
len -= 2;
|
||||||
|
|
||||||
for(; numch > 0 && len >= 32; len -= 32, ptr += 32) {
|
for(; numch > 0 && len >= 32; ptr += 32 + dlen, len -= 32 + dlen, numch--) {
|
||||||
|
|
||||||
|
dl = dlen = ((ptr[30] & 3) << 8) | ptr[31];
|
||||||
|
|
||||||
|
if(dlen + 32 > len)
|
||||||
|
return -1; // Corrupt table
|
||||||
|
|
||||||
transport_stream_id = (ptr[22] << 8) | ptr[23];
|
transport_stream_id = (ptr[22] << 8) | ptr[23];
|
||||||
|
|
||||||
/* Search all muxes on adapter */
|
/* Search all muxes on adapter */
|
||||||
|
@ -1031,19 +1038,25 @@ atsc_vct_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
service_id = (ptr[24] << 8) | ptr[25];
|
service_id = (ptr[24] << 8) | ptr[25];
|
||||||
t = dvb_transport_find(tdmi, service_id, 0, NULL);
|
if((t = dvb_transport_find(tdmi, service_id, 0, NULL)) == NULL)
|
||||||
if(t == NULL)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
atsc_stype = ptr[27] & 0x3f;
|
atsc_stype = ptr[27] & 0x3f;
|
||||||
if(atsc_stype != 0x02) {
|
if(atsc_stype != 0x02) {
|
||||||
/* Not TV */
|
/* Not ATSC TV */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
stype = ST_SDTV;
|
stype = ST_SDTV;
|
||||||
atsc_utf16_to_utf8(ptr, 7, chname, sizeof(chname));
|
atsc_utf16_to_utf8(ptr, 7, chname, sizeof(chname));
|
||||||
|
|
||||||
|
dptr = ptr + 32;
|
||||||
|
while(dl > 1) {
|
||||||
|
// int desclen = dptr[1];
|
||||||
|
dl -= dptr[1] + 2;
|
||||||
|
dptr += dptr[1] + 2;
|
||||||
|
}
|
||||||
|
|
||||||
if(t->tht_servicetype != stype ||
|
if(t->tht_servicetype != stype ||
|
||||||
strcmp(t->tht_svcname ?: "", chname)) {
|
strcmp(t->tht_svcname ?: "", chname)) {
|
||||||
|
|
||||||
|
@ -1053,6 +1066,7 @@ atsc_vct_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
|
||||||
t->tht_config_save(t);
|
t->tht_config_save(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue