zapit/src/scannit.cpp: parse network descriptors

This commit is contained in:
[CST] Focus
2012-03-18 17:30:32 +04:00
parent 5ff235027f
commit f9262a20b1

View File

@@ -25,6 +25,7 @@
#include <zapit/scan.h> #include <zapit/scan.h>
#include <dvbsi++/descriptor_tag.h> #include <dvbsi++/descriptor_tag.h>
#include <dvbsi++/network_name_descriptor.h> #include <dvbsi++/network_name_descriptor.h>
#include <dvbsi++/linkage_descriptor.h>
#include <math.h> #include <math.h>
#include <eitd/edvbstring.h> #include <eitd/edvbstring.h>
@@ -158,19 +159,62 @@ bool CNit::Parse()
NetworkInformationSectionIterator sit; NetworkInformationSectionIterator sit;
for (sit = sections.begin(); sit != sections.end(); ++sit) { for (sit = sections.begin(); sit != sections.end(); ++sit) {
NetworkInformationSection * nit = *sit; NetworkInformationSection * nit = *sit;
const TransportStreamInfoList *tslist = nit->getTsInfo();
if (CServiceScan::getInstance()->Aborted()) if (CServiceScan::getInstance()->Aborted())
return false; return false;
const DescriptorList * dlist = nit->getDescriptors();
DescriptorConstIterator dit;
#ifdef DEBUG_NIT
printf("NIT: section %d, %d descriptors\n", nit->getSectionNumber(), dlist->size());
#endif
for (dit = dlist->begin(); dit != dlist->end(); ++dit) {
Descriptor * d = *dit;
switch(d->getTag()) {
case NETWORK_NAME_DESCRIPTOR:
{
#ifdef DEBUG_NIT
NetworkNameDescriptor * nd = (NetworkNameDescriptor *) d;
std::string networkName = stringDVBUTF8(nd->getNetworkName());
printf("NIT: network name [%s]\n", networkName.c_str());
#endif
}
break;
case LINKAGE_DESCRIPTOR:
{
#ifdef DEBUG_NIT
LinkageDescriptor * ld = (LinkageDescriptor*) d;
printf("NIT: linkage, tsid %04x onid %04x sid %04x type %02x\n", ld->getTransportStreamId(),
ld->getOriginalNetworkId(), ld->getServiceId(), ld->getLinkageType());
#endif
}
break;
default:
{
#ifdef DEBUG_NIT_UNUSED
printf("NIT net loop: descriptor %02x len %d: ", d->getTag(), d->getLength());
#if 0
uint8_t len = 2+d->getLength();
uint8_t buf[len];
d->writeToBuffer(buf);
for(uint8_t i = 0; i < len; i++)
printf("%02x ", buf[i]);
#endif
printf("\n");
#endif
}
break;
}
}
const TransportStreamInfoList *tslist = nit->getTsInfo();
for(TransportStreamInfoConstIterator tit = tslist->begin(); tit != tslist->end(); ++tit) { for(TransportStreamInfoConstIterator tit = tslist->begin(); tit != tslist->end(); ++tit) {
TransportStreamInfo * tsinfo = *tit; TransportStreamInfo * tsinfo = *tit;
const DescriptorList * dlist = tsinfo->getDescriptors(); dlist = tsinfo->getDescriptors();
#if 0 #if 0
printf("NIT: tsid %04x onid %04x %d descriptors\n", tsinfo->getTransportStreamId(), printf("NIT: tsid %04x onid %04x %d descriptors\n", tsinfo->getTransportStreamId(),
tsinfo->getOriginalNetworkId(), dlist->size()); tsinfo->getOriginalNetworkId(), dlist->size());
#endif #endif
DescriptorConstIterator dit; //DescriptorConstIterator dit;
for (dit = dlist->begin(); dit != dlist->end(); ++dit) { for (dit = dlist->begin(); dit != dlist->end(); ++dit) {
Descriptor * d = *dit; Descriptor * d = *dit;
switch(d->getTag()) { switch(d->getTag()) {
@@ -189,18 +233,11 @@ bool CNit::Parse()
case LOGICAL_CHANNEL_DESCRIPTOR: case LOGICAL_CHANNEL_DESCRIPTOR:
ParseLogicalChannels((LogicalChannelDescriptor *) d, tsinfo); ParseLogicalChannels((LogicalChannelDescriptor *) d, tsinfo);
break; break;
case NETWORK_NAME_DESCRIPTOR:
{
NetworkNameDescriptor * nd = (NetworkNameDescriptor *) d;
int tsidonid = (tsinfo->getTransportStreamId() << 16) | tsinfo->getOriginalNetworkId();
std::string networkName = stringDVBUTF8(nd->getNetworkName(), 0, tsidonid);
printf("NIT: network name [%s]\n", networkName.c_str());
}
break; break;
default: default:
{ {
#ifdef DEBUG_NIT_UNUSED #ifdef DEBUG_NIT_UNUSED
printf("NIT: descriptor %02x: ", d->getTag()); printf("NIT TS loop: descriptor %02x: ", d->getTag());
uint8_t len = 2+d->getLength(); uint8_t len = 2+d->getLength();
uint8_t buf[len]; uint8_t buf[len];
d->writeToBuffer(buf); d->writeToBuffer(buf);
@@ -311,10 +348,10 @@ bool CNit::ParseLogicalChannels(LogicalChannelDescriptor * ld, TransportStreamIn
/* FIXME dont use freq_id / satellitePosition ? */ /* FIXME dont use freq_id / satellitePosition ? */
t_channel_id channel_id = CZapitChannel::makeChannelId(satellitePosition, t_channel_id channel_id = CZapitChannel::makeChannelId(satellitePosition,
freq_id, transport_stream_id, original_network_id, service_id); freq_id, transport_stream_id, original_network_id, service_id);
// (*it)->getVisibleServiceFlag(); /* (*it)->getVisibleServiceFlag(); */
logical_map[channel_id] = lcn; logical_map[channel_id] = lcn;
#ifdef DEBUG_LCN #ifdef DEBUG_LCN
printf("NIT: lcn tsid %04x onid %04x %llx -> %d\n", transport_stream_id, original_network_id, channel_id, lcn); printf("NIT: logical channel tsid %04x onid %04x %llx -> %d\n", transport_stream_id, original_network_id, channel_id, lcn);
#endif #endif
} }
return true; return true;