fixes for /dev/misc/pvr opening problems in some conditions
[enigma2.git] / lib / dvb / scan.h
index 2f75291bf283a4b5d25538aad74dc3daf85f81f3..9f0dd6ef36df2ebcb74c9abbd4faa377cff9c8b2 100644 (file)
@@ -1,26 +1,39 @@
 #ifndef __lib_dvb_scan_h
 #define __lib_dvb_scan_h
 
-#include <lib/dvb_si/nit.h>
-#include <lib/dvb_si/sdt.h>
-#include <lib/dvb_si/bat.h>
-#include <lib/dvb/isection.h>
+#include <dvbsi++/service_description_section.h>
+#include <dvbsi++/network_information_section.h>
+#include <dvbsi++/bouquet_association_section.h>
+#include <dvbsi++/program_association_section.h>
+#include <dvbsi++/program_map_section.h>
+
+#include <lib/dvb/idemux.h>
 #include <lib/dvb/esection.h>
 #include <lib/dvb/db.h>
 
+struct service
+{
+       service(unsigned short pmtPid)
+               :pmtPid(pmtPid), serviceType(0xFF), scrambled(false)
+       {
+       }
+       unsigned short pmtPid;
+       unsigned char serviceType;
+       bool scrambled;
+};
+
 class eDVBScan: public Object, public iObject
 {
-DECLARE_REF(eDVBScan);
-private:
+       DECLARE_REF(eDVBScan);
                /* chid helper functions: */
                
                /* heuristically determine if onid/tsid is valid */
-       int isValidONIDTSID(eOriginalNetworkID onid, eTransportStreamID tsid);
+       int isValidONIDTSID(int orbital_position, eOriginalNetworkID onid, eTransportStreamID tsid);
                /* build dvb namespace */
        eDVBNamespace buildNamespace(eOriginalNetworkID onid, eTransportStreamID tsid, unsigned long hash);
        
                /* scan resources */    
-       ePtr<iDVBChannel> m_channel;
+       eUsePtr<iDVBChannel> m_channel;
        ePtr<iDVBDemux> m_demux;
        
                /* infrastructure */
@@ -31,45 +44,75 @@ private:
        RESULT nextChannel();
        
        RESULT startFilter();   
-       enum { readySDT=1, readyNIT=2, readyBAT=4, readyAll=7,
-              validSDT=8, validNIT=16, validBAT=32};
+       enum { readyPAT=1, readySDT=2, readyNIT=4, readyBAT=8,
+              validPAT=16, validSDT=32, validNIT=64, validBAT=128};
 
                /* scan state variables */
        int m_channel_state;
-       int m_ready;
-       
+       int m_ready, m_ready_all;
+
+       std::map<eDVBChannelID, unsigned int> m_corrected_frequencys;  // yet just used for DVB-T
+
        std::map<eDVBChannelID, ePtr<iDVBFrontendParameters> > m_new_channels;
        std::map<eServiceReferenceDVB, ePtr<eDVBService> > m_new_services;
-       
+       std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator m_last_service;
+
+       std::map<unsigned short, service> m_pmts_to_read;
+       std::map<unsigned short, service>::iterator m_pmt_in_progress;
+       bool m_pmt_running;
+       bool m_abort_current_pmt;
+
        std::list<ePtr<iDVBFrontendParameters> > m_ch_toScan, m_ch_scanned, m_ch_unavailable;
        ePtr<iDVBFrontendParameters> m_ch_current;
-       
-       ePtr<eTable<ServiceDescriptionTable> > m_SDT;
-       ePtr<eTable<NetworkInformationTable> > m_NIT;
-       ePtr<eTable<BouquetAssociationTable> > m_BAT;
-       
+       eDVBChannelID m_chid_current;
+       eTransportStreamID m_pat_tsid;
+
+       ePtr<eTable<ServiceDescriptionSection> > m_SDT;
+       ePtr<eTable<NetworkInformationSection> > m_NIT;
+       ePtr<eTable<BouquetAssociationSection> > m_BAT;
+       ePtr<eTable<ProgramAssociationSection> > m_PAT;
+       ePtr<eTable<ProgramMapSection> > m_PMT;
+
        void SDTready(int err);
        void NITready(int err);
        void BATready(int err);
-       
-       void addChannel(const eDVBChannelID &chid, iDVBFrontendParameters *feparm);
-       int  sameChannel(iDVBFrontendParameters *ch1, iDVBFrontendParameters *ch2) const;
-       
+       void PATready(int err);
+       void PMTready(int err);
+
+       void addKnownGoodChannel(const eDVBChannelID &chid, iDVBFrontendParameters *feparm);
+       void addChannelToScan(const eDVBChannelID &chid, iDVBFrontendParameters *feparm);
+
+       int sameChannel(iDVBFrontendParameters *ch1, iDVBFrontendParameters *ch2, bool exact=false) const;
+
        void channelDone();
        
        Signal1<void,int> m_event;
-       RESULT processSDT(eDVBNamespace dvbnamespace, const ServiceDescriptionTable &sdt);
+       RESULT processSDT(eDVBNamespace dvbnamespace, const ServiceDescriptionSection &sdt);
+       
+       int m_flags;
+       bool m_usePAT;
+       bool m_scan_debug;
 public:
-       eDVBScan(iDVBChannel *channel);
+       eDVBScan(iDVBChannel *channel, bool usePAT=true, bool debug=true );
        ~eDVBScan();
-       
-       void start(const std::list<ePtr<iDVBFrontendParameters> > &known_transponders);
 
-       enum { evtUpdate, evtFinish, evtFail };
-  RESULT connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &connection);
-       void insertInto(iDVBChannelList *db);
+       enum {
+               scanNetworkSearch = 1, scanSearchBAT = 2,
+               scanRemoveServices = 4, scanDontRemoveFeeds = 8,
+               scanDontRemoveUnscanned = 16,
+               clearToScanOnFirstNIT = 32, scanOnlyFree = 64 };
+
+       void start(const eSmartPtrList<iDVBFrontendParameters> &known_transponders, int flags);
+
+       enum { evtUpdate, evtNewService, evtFinish, evtFail };
+       RESULT connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &connection);
+       void insertInto(iDVBChannelList *db, bool dontRemoveNewFlags=false);
        
        void getStats(int &transponders_done, int &transponders_total, int &services);
+       void getLastServiceName(std::string &name);
+       RESULT getFrontend(ePtr<iDVBFrontend> &);
+       RESULT getCurrentTransponder(ePtr<iDVBFrontendParameters> &);
+       eDVBChannelID getCurrentChannelID() { return m_chid_current; }
 };
 
 #endif