Fastscan sort close to provider's way

git-svn-id: file:///home/bas/coolstream_public_svn/THIRDPARTY/applications/neutrino-experimental@473 e54a6e83-5905-42d5-8d5c-058d10e6a962


Origin commit data
------------------
Branch: ni/coolstream
Commit: 3fcf105374
Author: [CST] Focus <focus.cst@gmail.com>
Date: 2010-03-10 (Wed, 10 Mar 2010)



------------------
This commit was generated by Migit
This commit is contained in:
[CST] Focus
2010-03-10 18:59:06 +00:00
parent 38d05b28f3
commit 1ecd26f3b6
3 changed files with 64 additions and 13 deletions

View File

@@ -1,9 +1,6 @@
#ifndef _FASTSCAN_H_
#define _FASTSCAN_H_
int parse_fnt(unsigned short pid, unsigned short operator_id);
int parse_fst(unsigned short pid, unsigned short operator_id);
void * start_fast_scan(void * arg);
typedef enum fs_operator {
@@ -34,5 +31,8 @@ typedef struct fast_scan_type {
} fast_scan_type_t;
extern fast_scan_operator_t fast_scan_operators [OPERATOR_MAX];
int parse_fst(unsigned short pid, fast_scan_operator_t * op);
int parse_fnt(unsigned short pid, unsigned short operator_id);
#endif

View File

@@ -104,7 +104,7 @@ CZapitChannel* CZapitBouquet::getChannelByChannelID(const t_channel_id channel_i
void CZapitBouquet::sortBouquet(void)
{
//printf("*************** sorting %s TV\n", Name.c_str());fflush(stdout);//FIXME
sort(tvChannels.begin(), tvChannels.end(), CmpChannelByChName());fflush(stdout);//FIXME
sort(tvChannels.begin(), tvChannels.end(), CmpChannelByChName());
//printf("*************** sorting %s RADIO\n", Name.c_str());
sort(radioChannels.begin(), radioChannels.end(), CmpChannelByChName());
}

View File

@@ -47,9 +47,11 @@ extern t_channel_id live_channel_id;
int process_satellite_delivery_system_descriptor(const unsigned char * const buffer, FrontendParameters * feparams, uint8_t * polarization, t_satellite_position * satellitePosition);
void process_service_list_descriptor(const unsigned char * const buffer, const t_transport_stream_id transport_stream_id, const t_original_network_id original_network_id, t_satellite_position satellitePosition, freq_id_t freq);
void process_logical_service_descriptor(const unsigned char * const buffer, const t_transport_stream_id transport_stream_id, const t_original_network_id original_network_id, t_satellite_position satellitePosition, freq_id_t freq);
std::map <t_channel_id, t_satellite_position> fast_services_sat;
std::map <t_channel_id, freq_id_t> fast_services_freq;
std::map <t_channel_id, int> fast_services_number;
void * start_fast_scan(void * arg)
{
@@ -90,18 +92,19 @@ void * start_fast_scan(void * arg)
fast_services_sat.clear();
fast_services_freq.clear();
fast_services_number.clear();
if(type & FAST_SCAN_SD) {
res = parse_fnt(op->sd_pid, op->id);
if(res == 0)
parse_fst(op->sd_pid, op->id);
parse_fst(op->sd_pid, op);
printf("[fast scan] pid %d (SD) scan done, found %d transponders and %d services\n", op->sd_pid, found_transponders, found_channels);
}
if(type & FAST_SCAN_HD) {
res = parse_fnt(op->hd_pid, op->id);
if(res == 0)
res = parse_fst(op->hd_pid, op->id);
res = parse_fst(op->hd_pid, op);
printf("[fast scan] pid %d (HD) scan done, found %d transponders and %d services\n", op->hd_pid, found_transponders, found_channels);
}
@@ -111,6 +114,7 @@ void * start_fast_scan(void * arg)
SaveServices(true);
scanBouquetManager->saveBouquets(bouquetMode, "");
g_bouquetManager->saveBouquets();
g_bouquetManager->saveUBouquets();
g_bouquetManager->clearAll();
g_bouquetManager->loadBouquets();
stop_scan(true);
@@ -122,6 +126,7 @@ void * start_fast_scan(void * arg)
}
fast_services_sat.clear();
fast_services_freq.clear();
fast_services_number.clear();
printf("[fast scan] fast scan done, found %d transponders and %d services\n", found_transponders, found_channels);
return NULL;
@@ -130,10 +135,22 @@ _err:
return NULL;
}
int parse_fst(unsigned short pid, unsigned short operator_id)
struct CmpChannelByNum: public binary_function <const CZapitChannel * const, const CZapitChannel * const, bool>
{
bool operator() (const CZapitChannel * const c1, const CZapitChannel * const c2)
{
return c1->number < c2->number;
;
};
};
int parse_fst(unsigned short pid, fast_scan_operator_t * op)
{
int secdone[255];
int sectotal = -1;
unsigned short operator_id = op->id;
CZapitBouquet* bouquet;
int bouquetId;
memset(secdone, 0, 255);
@@ -217,17 +234,26 @@ int parse_fst(unsigned short pid, unsigned short operator_id)
t_satellite_position satellitePosition = 0;
freq_id_t freq = 0;
int num = 0;
t_channel_id channel_id = CREATE_CHANNEL_ID64;
std::map <t_channel_id, t_satellite_position>::iterator sIt = fast_services_sat.find(channel_id);
if(sIt != fast_services_sat.end())
if(sIt != fast_services_sat.end()) {
satellitePosition = sIt->second;
sat_iterator_t sit = satellitePositions.find(satellitePosition);
if(sit != satellitePositions.end())
sit->second.have_channels = true;
}
std::map <t_channel_id, freq_id_t>::iterator fIt = fast_services_freq.find(channel_id);
if(fIt != fast_services_freq.end())
freq = fIt->second;
std::map <t_channel_id, int>::iterator nIt = fast_services_number.find(channel_id);
if(nIt != fast_services_number.end())
num = nIt->second;
//std::string providerName = CDVBString((const char*)&(dbuf[4]), service_provider_name_length).getContent();
//std::string serviceName = CDVBString((const char*)&(dbuf[4 + service_provider_name_length + 1]), (2 + dbuf[1]) - (4 + service_provider_name_length + 1)).getContent();
@@ -236,7 +262,7 @@ int parse_fst(unsigned short pid, unsigned short operator_id)
eventServer->sendEvent(CZapitClient::EVT_SCAN_PROVIDER, CEventServer::INITID_ZAPIT, (void *) providerName.c_str(), providerName.length() + 1);
#ifdef SCAN_DEBUG
printf("[FST] sat %04d onid %04x tid %04x sid %04x vpid %04x apid %04x pcr %04x freq %05d type %d prov [%s] name [%s]\n", satellitePosition, original_network_id, transport_stream_id, service_id, video_pid, audio_pid, pcr_pid, freq, service_type, providerName.c_str(), serviceName.c_str());
printf("[FST] #%04d at %04d: net %04x tp %04x sid %04x v %04x a %04x pcr %04x frq %05d type %d prov [%s] name [%s]\n", num, satellitePosition, original_network_id, transport_stream_id, service_id, video_pid, audio_pid, pcr_pid, freq, service_type, providerName.c_str(), serviceName.c_str());
#endif
found_channels ++;
eventServer->sendEvent ( CZapitClient::EVT_SCAN_NUM_CHANNELS, CEventServer::INITID_ZAPIT, &found_channels, sizeof(found_channels));
@@ -260,7 +286,6 @@ int parse_fst(unsigned short pid, unsigned short operator_id)
break;
}
eventServer->sendEvent(CZapitClient::EVT_SCAN_SERVICENAME, CEventServer::INITID_ZAPIT, (void *) serviceName.c_str(), serviceName.length() + 1);
//service_descriptor(buffer + pos2, service_id, transport_stream_id, original_network_id, satellitePosition, freq, free_CA_mode);
channel_id = CREATE_CHANNEL_ID64;
CZapitChannel * channel;
@@ -293,9 +318,8 @@ int parse_fst(unsigned short pid, unsigned short operator_id)
channel->setAudioPid(audio_pid);
channel->setPcrPid(pcr_pid);
channel->setPidsFlag();
channel->number = num;
CZapitBouquet* bouquet;
int bouquetId;
char pname[100];
if (frontend->getInfo()->type == FE_QPSK)
snprintf(pname, 100, "[%c%03d.%d] %s", satellitePosition > 0? 'E' : 'W', abs(satellitePosition)/10, abs(satellitePosition)%10, providerName.c_str());
@@ -304,14 +328,23 @@ int parse_fst(unsigned short pid, unsigned short operator_id)
bouquetId = scanBouquetManager->existsBouquet(pname);
if (bouquetId == -1)
if (bouquetId == -1) {
bouquet = scanBouquetManager->addBouquet(std::string(pname), false);
}
else
bouquet = scanBouquetManager->Bouquets[bouquetId];
bouquet->addService(channel);
if(channel->getServiceType() == 1)
live_channel_id = channel->getChannelID();
bouquetId = g_bouquetManager->existsUBouquet(op->name);
if (bouquetId == -1) {
bouquet = g_bouquetManager->addBouquet(std::string(op->name), true);
}
else
bouquet = g_bouquetManager->Bouquets[bouquetId];
bouquet->addService(channel);
}
break;
default:
@@ -323,6 +356,13 @@ int parse_fst(unsigned short pid, unsigned short operator_id)
} while(sectotal < buffer[7]);
delete dmx;
bouquetId = g_bouquetManager->existsUBouquet(op->name);
if (bouquetId >= 0) {
bouquet = g_bouquetManager->Bouquets[bouquetId];
sort(bouquet->tvChannels.begin(), bouquet->tvChannels.end(), CmpChannelByNum());
sort(bouquet->radioChannels.begin(), bouquet->radioChannels.end(), CmpChannelByNum());
}
printf("[FST] done\n\n");
return 0;
}
@@ -472,6 +512,7 @@ int parse_fnt(unsigned short pid, unsigned short operator_id)
process_service_list_descriptor(buffer + pos2, transport_stream_id, original_network_id, 0, 0);
break;
case 0x83: // logical_service_desciptor
process_logical_service_descriptor(buffer + pos2, transport_stream_id, original_network_id, 0, 0);
break;
case 0x44:
//cable_delivery_system_descriptor(buffer + pos2, transport_stream_id, original_network_id, satellitePosition, freq);
@@ -501,6 +542,16 @@ int parse_fnt(unsigned short pid, unsigned short operator_id)
return ret;
}
void process_logical_service_descriptor(const unsigned char * const buffer, const t_transport_stream_id transport_stream_id, const t_original_network_id original_network_id, t_satellite_position satellitePosition, freq_id_t freq)
{
for (int i = 0; i < buffer[1]; i += 4) {
t_service_id service_id = buffer[i + 2] << 8 | buffer[i + 3];
t_channel_id channel_id = CREATE_CHANNEL_ID64;
int num = (buffer[i + 4] & 0x3F) << 8 | buffer[i + 5];
fast_services_number[channel_id] = num;
}
}
void process_service_list_descriptor(const unsigned char * const buffer, const t_transport_stream_id transport_stream_id, const t_original_network_id original_network_id, t_satellite_position satellitePosition, freq_id_t freq)
{
for (int i = 0; i < buffer[1]; i += 3) {