uint8_t running_status;
#endif
int l;
+ uint8_t *dlptr, *dptr;
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
if (!tdmi) return -1;
}
TRACE("sdt", "onid %04X tsid %04X", onid, tsid);
+ //hexdump("sdt", ptr, len);
// version = ptr[2] >> 1 & 0x1f;
// section_number = ptr[3];
len -= 8;
ptr += 8;
-
while(len >= 5) {
int save = 0;
service_id = ptr[0] << 8 | ptr[1];
#endif
free_ca_mode = (ptr[3] >> 4) & 0x1;
dllen = ((ptr[3] & 0x0f) << 8) | ptr[4];
+ dlptr = ptr + 5;
TRACE("sdt", " sid %04X running %d free_ca %d",
service_id, running_status, free_ca_mode);
- len -= 5;
- ptr += 5;
-
- if(dllen > len)
+ ptr += (5 + dllen);
+ len -= (5 + dllen);
+ if (len < 0)
break;
stype = 0;
*crid = 0;
while(dllen > 2) {
- dtag = ptr[0];
- dlen = ptr[1];
+ dtag = dlptr[0];
+ dlen = dlptr[1];
+ dptr = dlptr + 2;
- len -= 2; ptr += 2; dllen -= 2;
+ dlptr += (2 + dlen);
+ dllen -= (2 + dlen);
- if(dlen > len) break;
+ if(dllen < 0) break;
switch(dtag) {
case DVB_DESC_SERVICE:
- if(dvb_desc_service(ptr, dlen, &stype,
+ if(dvb_desc_service(dptr, dlen, &stype,
provider, sizeof(provider),
chname0, sizeof(chname0)) == 0) {
TRACE("sdt", " stype = %d, provider = %s, name = %s",
}
break;
case DVB_DESC_DEF_AUTHORITY:
- dvb_desc_def_authority(ptr, dlen, crid, sizeof(crid));
+ dvb_desc_def_authority(dptr, dlen, crid, sizeof(crid));
break;
}
- len -= dlen; ptr += dlen; dllen -= dlen;
}
if (!servicetype_is_tv(stype) &&