X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/ca7d92c97764d916bb8dd6731efa1ccff693b944..3e3832c8784e966dca29354c158ffb636f33c8cb:/lib/dvb/idvb.h diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index e9fb3cf0..c18d2421 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -8,6 +8,7 @@ #define FRONTENDPARAMETERS FrontendParameters #else #include +#include #define FRONTENDPARAMETERS struct dvb_frontend_parameters #endif #include @@ -18,6 +19,55 @@ #include #include +#if defined(__GNUC__) && ((__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || __GNUC__ == 4 ) // check if gcc version >= 3.1 +#include +#define CAID_LIST __gnu_cxx::slist +#else +#include +#define CAID_LIST std::slist +#endif + +#ifndef DMX_FILTER_SIZE +#define DMX_FILTER_SIZE 16 +#endif + +struct eDVBSectionFilterMask +{ + int pid; + /* mode is 0 for positive, 1 for negative filtering */ + __u8 data[DMX_FILTER_SIZE], mask[DMX_FILTER_SIZE], mode[DMX_FILTER_SIZE]; + enum { + rfCRC=1, + rfNoAbort=2 + }; + int flags; +}; + +struct eDVBTableSpec +{ + int pid, tid, tidext, tid_mask, tidext_mask; + int version; + int timeout; /* timeout in ms */ + enum + { + tfInOrder=1, + /* + tfAnyVersion filter ANY version + 0 filter all EXCEPT given version (negative filtering) + tfThisVersion filter only THIS version + */ + tfAnyVersion=2, + tfThisVersion=4, + tfHaveTID=8, + tfHaveTIDExt=16, + tfCheckCRC=32, + tfHaveTimeout=64, + tfHaveTIDMask=128, + tfHaveTIDExtMask=256 + }; + int flags; +}; + struct eBouquet { std::string m_bouquet_name; @@ -26,7 +76,7 @@ struct eBouquet list m_services; // the following five methods are implemented in db.cpp RESULT flushChanges(); - RESULT addService(const eServiceReference &); + RESULT addService(const eServiceReference &, eServiceReference before=eServiceReference()); RESULT removeService(const eServiceReference &); RESULT moveService(const eServiceReference &, unsigned int); RESULT setListName(const std::string &name); @@ -220,15 +270,21 @@ class eDVBChannelQuery; class eDVBService: public iStaticServiceInformation { DECLARE_REF(eDVBService); + int *m_cache; + void initCache(); + void copyCache(int *source); public: enum cacheID { - cVPID, cAPID, cTPID, cPCRPID, cAC3PID, cacheMax + cVPID, cAPID, cTPID, cPCRPID, cAC3PID, + cVTYPE, cACHANNEL, cAC3DELAY, cPCMDELAY, + cSUBTITLE, cacheMax }; - int getCachePID(cacheID); - void setCachePID(cacheID, int); - bool cacheEmpty() { return m_cache.empty(); } + int getCacheEntry(cacheID); + void setCacheEntry(cacheID, int); + + bool cacheEmpty(); eDVBService(); /* m_service_name_sort is uppercase, with special chars removed, to increase sort performance. */ @@ -240,19 +296,17 @@ public: int m_flags; enum { -#if 0 // not yet implemented dxNoSDT=1, // don't get SDT - dxDontshow=2, +//nyi dxDontshow=2, + dxNoDVB=4, // dont use PMT for this service ( use cached pids ) dxHoldName=8, -#endif dxNewFound=64, - dxNoDVB=4 // dont use PMT for this service ( use cached pids ) }; bool usePMT() const { return !(m_flags & dxNoDVB); } - std::set m_ca; - std::map m_cache; + CAID_LIST m_ca; + virtual ~eDVBService(); eDVBService &operator=(const eDVBService &); @@ -260,7 +314,8 @@ public: // iStaticServiceInformation RESULT getName(const eServiceReference &ref, std::string &name); RESULT getEvent(const eServiceReference &ref, ePtr &ptr, time_t start_time); - bool isPlayable(const eServiceReference &ref, const eServiceReference &ignore); + int isPlayable(const eServiceReference &ref, const eServiceReference &ignore); + PyObject *getInfoObject(const eServiceReference &ref, int); // implemented in lib/service/servicedvb.h /* for filtering: */ int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query); @@ -351,9 +406,10 @@ public: virtual RESULT getDVBC(eDVBFrontendParametersCable &SWIG_OUTPUT) const = 0; virtual RESULT getDVBT(eDVBFrontendParametersTerrestrial &SWIG_OUTPUT) const = 0; - virtual RESULT calculateDifference(const iDVBFrontendParameters *parm, int &SWIG_OUTPUT) const = 0; + virtual RESULT calculateDifference(const iDVBFrontendParameters *parm, int &SWIG_OUTPUT, bool exact) const = 0; virtual RESULT getHash(unsigned long &SWIG_OUTPUT) const = 0; }; +SWIG_TEMPLATE_TYPEDEF(ePtr, iDVBFrontendParametersPtr); #define MAX_DISEQC_LENGTH 16 @@ -377,32 +433,31 @@ public: class iDVBSatelliteEquipmentControl; class eSecCommandList; -class iDVBFrontend: public iObject +class iDVBFrontend_ENUMS +{ +#ifdef SWIG + iDVBFrontend_ENUMS(); + ~iDVBFrontend_ENUMS(); +#endif +public: + enum { feSatellite, feCable, feTerrestrial }; + enum { stateIdle, stateTuning, stateFailed, stateLock, stateLostLock }; + enum { toneOff, toneOn }; + enum { voltageOff, voltage13, voltage18, voltage13_5, voltage18_5 }; + enum { bitErrorRate, signalPower, signalQuality, locked, synced, frontendNumber, signalPowerdB }; +}; + +SWIG_IGNORE(iDVBFrontend); +class iDVBFrontend: public iDVBFrontend_ENUMS, public iObject { public: - enum { - feSatellite, feCable, feTerrestrial - }; virtual RESULT getFrontendType(int &SWIG_OUTPUT)=0; virtual RESULT tune(const iDVBFrontendParameters &where)=0; #ifndef SWIG virtual RESULT connectStateChange(const Slot1 &stateChange, ePtr &connection)=0; #endif - enum { - stateIdle = 0, - stateTuning = 1, - stateFailed = 2, - stateLock = 3, - stateLostLock = 4, - }; virtual RESULT getState(int &SWIG_OUTPUT)=0; - enum { - toneOff, toneOn - }; virtual RESULT setTone(int tone)=0; - enum { - 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; @@ -410,12 +465,10 @@ public: virtual RESULT setSEC(iDVBSatelliteEquipmentControl *sec)=0; virtual RESULT setSecSequence(const eSecCommandList &list)=0; #endif - enum { - bitErrorRate, signalPower, signalQuality, Locked, Synced - }; virtual int readFrontendData(int type)=0; - virtual PyObject *readTransponderData(bool original)=0; - + virtual void getFrontendStatus(SWIG_PYOBJECT(ePyObject) dest)=0; + virtual void getTransponderData(SWIG_PYOBJECT(ePyObject) dest, bool original)=0; + virtual void getFrontendData(SWIG_PYOBJECT(ePyObject) dest)=0; #ifndef SWIG virtual RESULT getData(int num, int &data)=0; virtual RESULT setData(int num, int val)=0; @@ -423,7 +476,7 @@ public: virtual int isCompatibleWith(ePtr &feparm)=0; #endif }; -TEMPLATE_TYPEDEF(ePtr, iDVBFrontendPtr); +SWIG_TEMPLATE_TYPEDEF(ePtr, iDVBFrontendPtr); #ifndef SWIG class iDVBSatelliteEquipmentControl: public iObject @@ -440,9 +493,13 @@ struct eDVBCIRouting }; #endif // SWIG +SWIG_IGNORE(iDVBChannel); class iDVBChannel: public iObject { public: + /* direct frontend access for raw channels and/or status inquiries. */ + virtual SWIG_VOID(RESULT) getFrontend(ePtr &SWIG_OUTPUT)=0; +#ifndef SWIG enum { state_idle, /* not yet tuned */ @@ -453,12 +510,8 @@ public: state_last_instance, /* just one reference to this channel is left */ state_release /* channel is being shut down. */ }; - virtual RESULT getState(int &SWIG_OUTPUT)=0; + virtual RESULT getState(int &)=0; - /* direct frontend access for raw channels and/or status inquiries. */ - virtual RESULT getFrontend(ePtr &)=0; - -#ifndef SWIG virtual RESULT getCurrentFrontendParameters(ePtr &)=0; enum { @@ -481,10 +534,9 @@ public: virtual void ReleaseUse() = 0; #endif }; -TEMPLATE_TYPEDEF(eUsePtr, iDVBChannelPtr); +SWIG_TEMPLATE_TYPEDEF(eUsePtr, iDVBChannelPtr); #ifndef SWIG - /* signed, so we can express deltas. */ typedef long long pts_t; @@ -513,7 +565,7 @@ public: void setDecodingDemux(iDVBDemux *demux, iTSMPEGDecoder *decoder); /* frontend and backend */ - eSingleLock m_lock; + eRdWrLock m_lock; /* backend */ enum { evtSeek, evtSkipmode, evtSpanChanged }; @@ -554,6 +606,7 @@ public: }; class iDVBSectionReader; +class iDVBPESReader; class iDVBTSRecorder; class iTSMPEGDecoder; @@ -561,6 +614,7 @@ class iDVBDemux: public iObject { public: virtual RESULT createSectionReader(eMainloop *context, ePtr &reader)=0; + virtual RESULT createPESReader(eMainloop *context, ePtr &reader)=0; virtual RESULT createTSRecorder(ePtr &recorder)=0; virtual RESULT getMPEGDecoder(ePtr &reader, int primary=1)=0; virtual RESULT getSTC(pts_t &pts, int num=0)=0; @@ -568,17 +622,31 @@ public: virtual RESULT flush()=0; }; +#if HAVE_DVB_API_VERSION < 3 && !defined(VIDEO_EVENT_SIZE_CHANGED) +#define VIDEO_EVENT_SIZE_CHANGED 1 +#endif + class iTSMPEGDecoder: public iObject { public: enum { pidDisabled = -1 }; - /** Set Displayed Video PID */ - virtual RESULT setVideoPID(int vpid)=0; + /** Set Displayed Video PID and type */ + virtual RESULT setVideoPID(int vpid, int type)=0; - enum { af_MPEG, af_AC3, af_DTS }; + enum { af_MPEG, af_AC3, af_DTS, af_AAC }; /** Set Displayed Audio PID and type */ virtual RESULT setAudioPID(int apid, int type)=0; + enum { ac_left, ac_stereo, ac_right }; + /** Set Displayed Audio Channel */ + virtual RESULT setAudioChannel(int channel)=0; + virtual int getAudioChannel()=0; + + virtual RESULT setPCMDelay(int delay)=0; + virtual int getPCMDelay()=0; + virtual RESULT setAC3Delay(int delay)=0; + virtual int getAC3Delay()=0; + /** Set Displayed Videotext PID */ virtual RESULT setTextPID(int vpid)=0; @@ -588,36 +656,52 @@ public: /** Set Sync mode to either audio or video master */ virtual RESULT setSyncMaster(int who)=0; - /** Apply settings */ + /** Apply settings with starting video */ virtual RESULT start()=0; - + /** Apply settings but don't start yet */ + virtual RESULT preroll()=0; + /** Freeze frame. Either continue decoding (without display) or halt. */ virtual RESULT freeze(int cont)=0; /** 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. */ virtual RESULT setSinglePictureMode(int when)=0; - + enum { pkm_B, pkm_PB }; /** Fast forward by skipping either B or P/B pictures */ virtual RESULT setPictureSkipMode(int what)=0; - + /** Slow Motion by repeating pictures */ virtual RESULT setSlowMotion(int repeat)=0; 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; - + virtual RESULT getPTS(int what, pts_t &pts) = 0; + + virtual RESULT showSinglePic(const char *filename) = 0; + + virtual RESULT setRadioPic(const std::string &filename) = 0; + + struct videoEvent + { + enum { eventUnknown = 0, eventSizeChanged = VIDEO_EVENT_SIZE_CHANGED } type; + unsigned char aspect; + unsigned short height; + unsigned short width; + }; + + virtual RESULT connectVideoEvent(const Slot1 &event, ePtr &connection) = 0; }; #endif //SWIG