X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/d6e0b1fd881d459036f5b7ace9fa7a61f6bcce8f..6a4d3199f96849af7ef9fae324f34ec4d1b7412b:/lib/dvb/idvb.h diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index ea5e2568..eacc4929 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -1,7 +1,6 @@ #ifndef __dvb_idvb_h #define __dvb_idvb_h -#include #if HAVE_DVB_API_VERSION < 3 #include #define FRONTENDPARAMETERS FrontendParameters @@ -12,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -19,17 +19,27 @@ struct eBouquet { std::string m_bouquet_name; - std::string m_path; + std::string m_filename; // without path.. just name typedef std::list list; list m_services; -// the following four methods are implemented in db.cpp +// the following five methods are implemented in db.cpp RESULT flushChanges(); RESULT addService(const eServiceReference &); RESULT removeService(const eServiceReference &); RESULT moveService(const eServiceReference &, unsigned int); + RESULT setListName(const std::string &name); }; - // bitte KEINE operator int() definieren, sonst bringt das ganze nix! + /* these structures have by intention no operator int() defined. + the reason of these structures is to avoid mixing for example + a onid and a tsid (as there's no general order for them). + + defining an operator int() would implicitely convert values + between them over the constructor with the int argument. + + 'explicit' doesn't here - eTransportStreamID(eOriginalNetworkID(n)) + would still work. */ + struct eTransportStreamID { private: @@ -144,6 +154,12 @@ struct eServiceReferenceDVB: public eServiceReference eDVBNamespace getDVBNamespace() const { return eDVBNamespace(data[4]); } void setDVBNamespace(eDVBNamespace dvbnamespace) { data[4]=dvbnamespace.get(); } + eServiceID getParentServiceID() const { return eServiceID(data[5]); } + void setParentServiceID( eServiceID sid ) { data[5]=sid.get(); } + + eTransportStreamID getParentTransportStreamID() const { return eTransportStreamID(data[6]); } + void setParentTransportStreamID( eTransportStreamID tsid ) { data[6]=tsid.get(); } + eServiceReferenceDVB(eDVBNamespace dvbnamespace, eTransportStreamID transport_stream_id, eOriginalNetworkID original_network_id, eServiceID service_id, int service_type) :eServiceReference(eServiceReference::idDVB, 0) { @@ -170,6 +186,11 @@ struct eServiceReferenceDVB: public eServiceReference :eServiceReference(eServiceReference::idDVB, 0) { } + + eServiceReferenceDVB(const std::string &string) + :eServiceReference(string) + { + } }; @@ -198,6 +219,8 @@ public: std::string m_service_name, m_service_name_sort; std::string m_provider_name; + void genSortName(); + int m_flags; std::set m_ca; std::map m_cache; @@ -207,8 +230,9 @@ public: // iStaticServiceInformation RESULT getName(const eServiceReference &ref, std::string &name); - int getLength(const eServiceReference &ref); - + RESULT getEvent(const eServiceReference &ref, ePtr &ptr, time_t start_time); + bool isPlayable(const eServiceReference &ref, const eServiceReference &ignore); + /* for filtering: */ int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query); }; @@ -268,6 +292,7 @@ public: virtual RESULT addService(const eServiceReferenceDVB &service, eDVBService *service)=0; virtual RESULT getService(const eServiceReferenceDVB &reference, ePtr &service)=0; + virtual RESULT flush()=0; virtual RESULT getBouquet(const eServiceReference &ref, eBouquet* &bouquet)=0; @@ -324,21 +349,32 @@ public: }; virtual RESULT setTone(int tone)=0; enum { - voltageOff, voltage13, voltage18 + voltageOff, voltage13, voltage18, voltage13_5, voltage18_5 }; virtual RESULT setVoltage(int voltage)=0; virtual RESULT sendDiseqc(const eDVBDiseqcCommand &diseqc)=0; virtual RESULT sendToneburst(int burst)=0; virtual RESULT setSEC(iDVBSatelliteEquipmentControl *sec)=0; virtual RESULT setSecSequence(const eSecCommandList &list)=0; + + enum { + bitErrorRate, signalPower, signalQuality + }; + virtual int readFrontendData(int type)=0; + virtual RESULT getData(int num, int &data)=0; virtual RESULT setData(int num, int val)=0; + + /* 0 means: not compatible. other values are a priority. */ + virtual int isCompatibleWith(ePtr &feparm)=0; }; class iDVBSatelliteEquipmentControl: public iObject { public: - virtual RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, eDVBFrontendParametersSatellite &sat)=0; + virtual RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, eDVBFrontendParametersSatellite &sat, int frontend_id)=0; + virtual int canTune(const eDVBFrontendParametersSatellite &feparm, iDVBFrontend *fe, int frontend_id)=0; + virtual void setRotorMoving(bool)=0; }; struct eDVBCIRouting @@ -356,9 +392,16 @@ public: state_failed, /* tuning failed. */ state_unavailable, /* currently unavailable, will be back without further interaction */ state_ok, /* ok */ + state_last_instance, /* just one reference to this channel is left */ state_release /* channel is being shut down. */ }; + + enum + { + evtEOF, evtSOF, evtFailed + }; virtual RESULT connectStateChange(const Slot1 &stateChange, ePtr &connection)=0; + virtual RESULT connectEvent(const Slot2 &eventChange, ePtr &connection)=0; virtual RESULT getState(int &state)=0; /* demux capabilities */ @@ -379,8 +422,44 @@ public: }; /* signed, so we can express deltas. */ + typedef long long pts_t; +class iFilePushScatterGather; + + /* note that a cue sheet describes the logical positions. thus + everything is specified in pts and not file positions */ + + /* implemented in dvb.cpp */ +class eCueSheet: public iObject, public Object +{ + DECLARE_REF(eCueSheet); +public: + eCueSheet(); + + /* frontend */ + void seekTo(int relative, const pts_t &pts); + + void clear(); + void addSourceSpan(const pts_t &begin, const pts_t &end); + + void setSkipmode(const pts_t &ratio); /* 90000 is 1:1 */ + void setDecodingDemux(iDVBDemux *demux); + + /* frontend and backend */ + eSingleLock m_lock; + + /* backend */ + enum { evtSeek, evtSkipmode, evtSpanChanged }; + RESULT connectEvent(const Slot1 &event, ePtr &connection); + + std::list > m_spans; /* begin, end */ + std::list > m_seek_requests; /* relative, delta */ + pts_t m_skipmode_ratio; + Signal1 m_event; + ePtr m_decoding_demux; +}; + class iDVBPVRChannel: public iDVBChannel { public: @@ -390,13 +469,21 @@ public: }; /* FIXME: there are some very ugly buffer-end and ... related problems */ - /* so this is VERY UGLY. */ + /* so this is VERY UGLY. + + ok, it's going to get better. but still...*/ virtual RESULT playFile(const char *file) = 0; + virtual void stopFile() = 0; + + virtual void setCueSheet(eCueSheet *cuesheet) = 0; virtual RESULT getLength(pts_t &pts) = 0; - virtual RESULT getCurrentPosition(pts_t &pos) = 0; - virtual RESULT seekTo(int relative, pts_t &pts) = 0; - virtual RESULT seekToPosition(const off_t &pts) = 0; + + /* we explicitely ask for the decoding demux here because a channel + can be shared between multiple decoders. + */ + virtual RESULT getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, int mode) = 0; + /* skipping must be done with a cue sheet */ }; class iDVBSectionReader; @@ -409,7 +496,7 @@ public: virtual RESULT createSectionReader(eMainloop *context, ePtr &reader)=0; virtual RESULT createTSRecorder(ePtr &recorder)=0; virtual RESULT getMPEGDecoder(ePtr &reader)=0; - virtual RESULT getSTC(pts_t &pts)=0; + virtual RESULT getSTC(pts_t &pts, int num=0)=0; virtual RESULT getCADemuxID(uint8_t &id)=0; virtual RESULT flush()=0; }; @@ -425,12 +512,15 @@ public: /** Set Displayed Audio PID and type */ virtual RESULT setAudioPID(int apid, int type)=0; + /** Set Displayed Videotext PID */ + virtual RESULT setTextPID(int vpid)=0; + /** Set Sync mode to PCR */ virtual RESULT setSyncPCR(int pcrpid)=0; enum { sm_Audio, sm_Video }; /** Set Sync mode to either audio or video master */ virtual RESULT setSyncMaster(int who)=0; - + /** Apply settings */ virtual RESULT start()=0; @@ -439,6 +529,9 @@ public: /** Continue after freeze. */ virtual RESULT unfreeze()=0; + /** fast forward by skipping frames. 0 is disabled, 2 is twice-the-speed, ... */ + virtual RESULT setFastForward(int skip=0)=0; + // stop on .. Picture enum { spm_I, spm_Ref, spm_Any }; /** Stop on specific decoded picture. For I-Frame display. */ @@ -454,6 +547,8 @@ public: enum { zoom_Normal, zoom_PanScan, zoom_Letterbox, zoom_Fullscreen }; /** Set Zoom. mode *must* be fitting. */ virtual RESULT setZoom(int what)=0; + + virtual RESULT setTrickmode(int what) = 0; }; #endif