From 50df9f82457403a918e6e4e7fc706914bc5902d5 Mon Sep 17 00:00:00 2001 From: "[CST] Focus" Date: Fri, 13 Jan 2012 16:01:48 +0400 Subject: [PATCH] sdt: change to use new pat/pmt classes; use new CServiceScan and CFEManager API --- src/zapit/src/sdt.cpp | 58 +++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/src/zapit/src/sdt.cpp b/src/zapit/src/sdt.cpp index 210bcb25d..7a55c9120 100644 --- a/src/zapit/src/sdt.cpp +++ b/src/zapit/src/sdt.cpp @@ -29,11 +29,9 @@ #include #include -#include // DEMUX_DEVICE #include -#include -#include -#include +#include +#include #include #define SDT_SIZE 1026 @@ -176,7 +174,7 @@ int parse_sdt( int flen; bool cable_hack_done = false; - bool cable = (CFrontend::getInstance()->getInfo()->type == FE_QAM); + bool cable = (CServiceScan::getInstance()->GetFrontend()->getInfo()->type == FE_QAM); #if 1 flen = 5; memset(filter, 0x00, DMX_FILTER_SIZE); @@ -257,10 +255,11 @@ _repeat: ISO_639_language_descriptor(buffer + pos2); break; - /* case 0x40: - network_name_descriptor(buffer + pos2); - break; - */ + /* + case 0x40: + network_name_descriptor(buffer + pos2); + break; + */ case 0x42: stuffing_descriptor(buffer + pos2); break; @@ -362,10 +361,11 @@ _repeat: goto _repeat; } delete dmx; - +#if 0 sat_iterator_t sit = satellitePositions.find(satellitePosition); if(sit != satellitePositions.end()) sit->second.have_channels = true; +#endif return 0; } @@ -394,7 +394,7 @@ int parse_current_sdt( const t_transport_stream_id p_transport_stream_id, const unsigned char filter[DMX_FILTER_SIZE]; unsigned char mask[DMX_FILTER_SIZE]; - transponder_id_t current_tp_id = CFrontend::getInstance()->getTsidOnid(); + transponder_id_t current_tp_id = CFEManager::getInstance()->getLiveFE()->getTsidOnid(); memset(filter, 0x00, DMX_FILTER_SIZE); filter[0] = 0x42; @@ -412,13 +412,24 @@ int parse_current_sdt( const t_transport_stream_id p_transport_stream_id, const mask[6] = 0xFF; mask[7] = 0xFF; - std::vector > sidpmt; - int pat_ok = scan_parse_pat( sidpmt ); + CPat pat; + + int pat_ok = pat.Parse(); cDemux * dmx = new cDemux(); dmx->Open(DMX_PSI_CHANNEL); int ret = -1; + t_service_id current_sid = 0; + unsigned short curent_pmt = 0; + unsigned char current_scrambled = 0; + CZapitChannel * channel = CZapit::getInstance()->GetCurrentChannel(); + if(channel) { + current_sid = channel->getServiceId(); + curent_pmt = channel->getPmtPid(); + current_scrambled = channel->scrambled; + } + //printf("parse_current_sdt: *************** current sid 0x%x ***************\n", current_sid); do { if ((dmx->sectionFilter(0x11, filter, mask, 8) < 0) || (dmx->Read(buffer, SDT_SIZE) < 0)) { delete dmx; @@ -437,11 +448,22 @@ int parse_current_sdt( const t_transport_stream_id p_transport_stream_id, const EIT_present_following_flag = buffer[pos + 2] & 0x01; running_status = buffer [pos + 3] & 0xE0; - for (unsigned short i=0; i 0) && running_status != 32) { + if(service_id != current_sid) { + CPmt pmt; + tmp_free_CA_mode = pmt.haveCaSys(pmtpid, service_id); + //printf("parse_current_sdt: sid 0x%x scrambled %d\n", service_id, tmp_free_CA_mode); + } else if(pmtpid != curent_pmt) { + ret = -2; + break; + } + else { + tmp_free_CA_mode = current_scrambled; + //printf("parse_current_sdt: skip current sid 0x%x\n", current_sid); } } + if(tmp_free_CA_mode == -1){ free_CA_mode = buffer [pos + 3] & 0x10; }else{ @@ -472,14 +494,14 @@ int parse_current_sdt( const t_transport_stream_id p_transport_stream_id, const break; } #endif - if(current_tp_id != CFrontend::getInstance()->getTsidOnid()) + if(current_tp_id != CFEManager::getInstance()->getLiveFE()->getTsidOnid()) break; } } while (filter[4]++ != buffer[7]); delete dmx; - if(current_tp_id != CFrontend::getInstance()->getTsidOnid()) + if(current_tp_id != CFEManager::getInstance()->getLiveFE()->getTsidOnid()) ret = -2; return ret;