6 #if HAVE_DVB_API_VERSION < 3
7 #include <ost/frontend.h>
8 #define FRONTENDPARAMETERS FrontendParameters
10 #include <linux/dvb/frontend.h>
11 #include <linux/dvb/video.h>
12 #define FRONTENDPARAMETERS struct dvb_frontend_parameters
14 #include <lib/dvb/frontendparms.h>
15 #include <lib/base/object.h>
16 #include <lib/base/ebase.h>
17 #include <lib/base/elock.h>
18 #include <lib/base/itssource.h>
19 #include <lib/service/service.h>
20 #include <libsig_comp.h>
21 #include <connection.h>
23 #if defined(__GNUC__) && ((__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || __GNUC__ == 4 ) // check if gcc version >= 3.1
25 #define CAID_LIST __gnu_cxx::slist<uint16_t>
28 #define CAID_LIST std::slist<uint16_t>
31 #ifndef DMX_FILTER_SIZE
32 #define DMX_FILTER_SIZE 16
35 struct eDVBSectionFilterMask
38 /* mode is 0 for positive, 1 for negative filtering */
39 __u8 data[DMX_FILTER_SIZE], mask[DMX_FILTER_SIZE], mode[DMX_FILTER_SIZE];
49 int pid, tid, tidext, tid_mask, tidext_mask;
51 int timeout; /* timeout in ms */
56 tfAnyVersion filter ANY version
57 0 filter all EXCEPT given version (negative filtering)
58 tfThisVersion filter only THIS version
74 std::string m_bouquet_name;
75 std::string m_filename; // without path.. just name
76 typedef std::list<eServiceReference> list;
78 // the following five methods are implemented in db.cpp
79 RESULT flushChanges();
80 RESULT addService(const eServiceReference &, eServiceReference before=eServiceReference());
81 RESULT removeService(const eServiceReference &);
82 RESULT moveService(const eServiceReference &, unsigned int);
83 RESULT setListName(const std::string &name);
86 /* these structures have by intention no operator int() defined.
87 the reason of these structures is to avoid mixing for example
88 a onid and a tsid (as there's no general order for them).
90 defining an operator int() would implicitely convert values
91 between them over the constructor with the int argument.
93 'explicit' doesn't here - eTransportStreamID(eOriginalNetworkID(n))
96 struct eTransportStreamID
101 int get() const { return v; }
102 eTransportStreamID(int i): v(i) { }
103 eTransportStreamID(): v(-1) { }
104 bool operator == (const eTransportStreamID &c) const { return v == c.v; }
105 bool operator != (const eTransportStreamID &c) const { return v != c.v; }
106 bool operator < (const eTransportStreamID &c) const { return v < c.v; }
107 bool operator > (const eTransportStreamID &c) const { return v > c.v; }
115 int get() const { return v; }
116 eServiceID(int i): v(i) { }
117 eServiceID(): v(-1) { }
118 bool operator == (const eServiceID &c) const { return v == c.v; }
119 bool operator != (const eServiceID &c) const { return v != c.v; }
120 bool operator < (const eServiceID &c) const { return v < c.v; }
121 bool operator > (const eServiceID &c) const { return v > c.v; }
124 struct eOriginalNetworkID
129 int get() const { return v; }
130 eOriginalNetworkID(int i): v(i) { }
131 eOriginalNetworkID(): v(-1) { }
132 bool operator == (const eOriginalNetworkID &c) const { return v == c.v; }
133 bool operator != (const eOriginalNetworkID &c) const { return v != c.v; }
134 bool operator < (const eOriginalNetworkID &c) const { return v < c.v; }
135 bool operator > (const eOriginalNetworkID &c) const { return v > c.v; }
143 int get() const { return v; }
144 eDVBNamespace(int i): v(i) { }
145 eDVBNamespace(): v(-1) { }
146 bool operator == (const eDVBNamespace &c) const { return v == c.v; }
147 bool operator != (const eDVBNamespace &c) const { return v != c.v; }
148 bool operator < (const eDVBNamespace &c) const { return v < c.v; }
149 bool operator > (const eDVBNamespace &c) const { return v > c.v; }
154 eDVBNamespace dvbnamespace;
155 eTransportStreamID transport_stream_id;
156 eOriginalNetworkID original_network_id;
158 bool operator==(const eDVBChannelID &c) const
160 return dvbnamespace == c.dvbnamespace &&
161 transport_stream_id == c.transport_stream_id &&
162 original_network_id == c.original_network_id;
165 bool operator<(const eDVBChannelID &c) const
167 if (dvbnamespace < c.dvbnamespace)
169 else if (dvbnamespace == c.dvbnamespace)
171 if (original_network_id < c.original_network_id)
173 else if (original_network_id == c.original_network_id)
174 if (transport_stream_id < c.transport_stream_id)
179 eDVBChannelID(eDVBNamespace dvbnamespace, eTransportStreamID tsid, eOriginalNetworkID onid):
180 dvbnamespace(dvbnamespace), transport_stream_id(tsid), original_network_id(onid)
184 dvbnamespace(-1), transport_stream_id(-1), original_network_id(-1)
187 operator bool() const
189 return (dvbnamespace != -1) && (transport_stream_id != -1) && (original_network_id != -1);
193 struct eServiceReferenceDVB: public eServiceReference
195 int getServiceType() const { return data[0]; }
196 void setServiceType(int service_type) { data[0]=service_type; }
198 eServiceID getServiceID() const { return eServiceID(data[1]); }
199 void setServiceID(eServiceID service_id) { data[1]=service_id.get(); }
201 eTransportStreamID getTransportStreamID() const { return eTransportStreamID(data[2]); }
202 void setTransportStreamID(eTransportStreamID transport_stream_id) { data[2]=transport_stream_id.get(); }
204 eOriginalNetworkID getOriginalNetworkID() const { return eOriginalNetworkID(data[3]); }
205 void setOriginalNetworkID(eOriginalNetworkID original_network_id) { data[3]=original_network_id.get(); }
207 eDVBNamespace getDVBNamespace() const { return eDVBNamespace(data[4]); }
208 void setDVBNamespace(eDVBNamespace dvbnamespace) { data[4]=dvbnamespace.get(); }
210 eServiceID getParentServiceID() const { return eServiceID(data[5]); }
211 void setParentServiceID( eServiceID sid ) { data[5]=sid.get(); }
213 eTransportStreamID getParentTransportStreamID() const { return eTransportStreamID(data[6]); }
214 void setParentTransportStreamID( eTransportStreamID tsid ) { data[6]=tsid.get(); }
216 eServiceReferenceDVB getParentServiceReference() const
218 eServiceReferenceDVB tmp(*this);
219 if (data[5] && data[6])
221 tmp.data[1] = data[5];
222 tmp.data[2] = data[6];
223 tmp.data[5] = tmp.data[6] = 0;
226 tmp.type = idInvalid;
230 eServiceReferenceDVB(eDVBNamespace dvbnamespace, eTransportStreamID transport_stream_id, eOriginalNetworkID original_network_id, eServiceID service_id, int service_type)
231 :eServiceReference(eServiceReference::idDVB, 0)
233 setTransportStreamID(transport_stream_id);
234 setOriginalNetworkID(original_network_id);
235 setDVBNamespace(dvbnamespace);
236 setServiceID(service_id);
237 setServiceType(service_type);
240 void set(const eDVBChannelID &chid)
242 setDVBNamespace(chid.dvbnamespace);
243 setOriginalNetworkID(chid.original_network_id);
244 setTransportStreamID(chid.transport_stream_id);
247 void getChannelID(eDVBChannelID &chid) const
249 chid = eDVBChannelID(getDVBNamespace(), getTransportStreamID(), getOriginalNetworkID());
252 eServiceReferenceDVB()
253 :eServiceReference(eServiceReference::idDVB, 0)
257 eServiceReferenceDVB(const std::string &string)
258 :eServiceReference(string)
264 ////////////////// TODO: we need an interface here, but what exactly?
267 // btw, still implemented in db.cpp. FIX THIS, TOO.
269 class eDVBChannelQuery;
271 class eDVBService: public iStaticServiceInformation
273 DECLARE_REF(eDVBService);
276 void copyCache(int *source);
280 cVPID, cAPID, cTPID, cPCRPID, cAC3PID,
281 cVTYPE, cACHANNEL, cAC3DELAY, cPCMDELAY,
285 int getCacheEntry(cacheID);
286 void setCacheEntry(cacheID, int);
291 /* m_service_name_sort is uppercase, with special chars removed, to increase sort performance. */
292 std::string m_service_name, m_service_name_sort;
293 std::string m_provider_name;
300 dxNoSDT=1, // don't get SDT
302 dxNoDVB=4, // dont use PMT for this service ( use cached pids )
307 bool usePMT() const { return !(m_flags & dxNoDVB); }
308 bool isHidden() const { return m_flags & dxDontshow; }
312 virtual ~eDVBService();
314 eDVBService &operator=(const eDVBService &);
316 // iStaticServiceInformation
317 RESULT getName(const eServiceReference &ref, std::string &name);
318 RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time);
319 int isPlayable(const eServiceReference &ref, const eServiceReference &ignore, bool simulate=false);
320 PyObject *getInfoObject(const eServiceReference &ref, int); // implemented in lib/service/servicedvb.h
323 int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query);
330 class iDVBFrontendParameters;
332 class iDVBChannelListQuery: public iObject
335 virtual RESULT getNextResult(eServiceReferenceDVB &ref)=0;
336 virtual int compareLessEqual(const eServiceReferenceDVB &a, const eServiceReferenceDVB &b)=0;
339 class eDVBChannelQuery: public iObject
341 DECLARE_REF(eDVBChannelQuery);
360 std::string m_string;
362 eDVBChannelID m_channelid;
364 /* sort is only valid in root, and must be from the enum above. */
366 std::string m_bouquet_name;
368 static RESULT compile(ePtr<eDVBChannelQuery> &res, std::string query);
370 ePtr<eDVBChannelQuery> m_p1, m_p2;
373 class iDVBChannelList: public iObject
376 virtual RESULT removeService(const eServiceReference &service)=0;
377 virtual RESULT removeServices(eDVBChannelID chid=eDVBChannelID(), unsigned int orb_pos=0xFFFFFFFF)=0;
378 virtual RESULT removeServices(int dvb_namespace=-1, int tsid=-1, int onid=-1, unsigned int orb_pos=0xFFFFFFFF)=0;
379 virtual RESULT removeServices(iDVBFrontendParameters *feparm)=0;
380 virtual RESULT addFlag(const eServiceReference &service, unsigned int flagmask=0xFFFFFFFF)=0;
381 virtual RESULT removeFlag(const eServiceReference &service, unsigned int flagmask=0xFFFFFFFF)=0;
382 virtual RESULT removeFlags(unsigned int flagmask, eDVBChannelID chid=eDVBChannelID(), unsigned int orb_pos=0xFFFFFFFF)=0;
383 virtual RESULT removeFlags(unsigned int flagmask, int dvb_namespace=-1, int tsid=-1, int onid=-1, unsigned int orb_pos=0xFFFFFFFF)=0;
384 virtual RESULT addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm)=0;
385 virtual RESULT removeChannel(const eDVBChannelID &id)=0;
387 virtual RESULT getChannelFrontendData(const eDVBChannelID &id, ePtr<iDVBFrontendParameters> &parm)=0;
389 virtual RESULT addService(const eServiceReferenceDVB &reference, eDVBService *service)=0;
390 virtual RESULT getService(const eServiceReferenceDVB &reference, ePtr<eDVBService> &service)=0;
391 virtual RESULT flush()=0;
393 virtual RESULT getBouquet(const eServiceReference &ref, eBouquet* &bouquet)=0;
395 virtual RESULT startQuery(ePtr<iDVBChannelListQuery> &query, eDVBChannelQuery *q, const eServiceReference &source)=0;
400 class iDVBFrontendParameters: public iObject
403 iDVBFrontendParameters();
404 ~iDVBFrontendParameters();
407 enum { flagOnlyFree = 1 };
408 virtual SWIG_VOID(RESULT) getSystem(int &SWIG_OUTPUT) const = 0;
409 virtual SWIG_VOID(RESULT) getDVBS(eDVBFrontendParametersSatellite &SWIG_OUTPUT) const = 0;
410 virtual SWIG_VOID(RESULT) getDVBC(eDVBFrontendParametersCable &SWIG_OUTPUT) const = 0;
411 virtual SWIG_VOID(RESULT) getDVBT(eDVBFrontendParametersTerrestrial &SWIG_OUTPUT) const = 0;
412 virtual SWIG_VOID(RESULT) getFlags(unsigned int &SWIG_OUTPUT) const = 0;
414 virtual SWIG_VOID(RESULT) calculateDifference(const iDVBFrontendParameters *parm, int &, bool exact) const = 0;
415 virtual SWIG_VOID(RESULT) getHash(unsigned long &) const = 0;
416 virtual SWIG_VOID(RESULT) calcLockTimeout(unsigned int &) const = 0;
419 SWIG_TEMPLATE_TYPEDEF(ePtr<iDVBFrontendParameters>, iDVBFrontendParametersPtr);
421 #define MAX_DISEQC_LENGTH 16
423 class eDVBDiseqcCommand
429 __u8 data[MAX_DISEQC_LENGTH];
430 #if HAVE_DVB_API_VERSION < 3
437 void setCommandString(const char *str);
440 class iDVBSatelliteEquipmentControl;
441 class eSecCommandList;
443 class iDVBFrontend_ENUMS
446 iDVBFrontend_ENUMS();
447 ~iDVBFrontend_ENUMS();
450 enum { feSatellite, feCable, feTerrestrial };
451 enum { stateIdle, stateTuning, stateFailed, stateLock, stateLostLock, stateClosed };
452 enum { toneOff, toneOn };
453 enum { voltageOff, voltage13, voltage18, voltage13_5, voltage18_5 };
454 enum { bitErrorRate, signalPower, signalQuality, locked, synced, frontendNumber, signalQualitydB };
457 SWIG_IGNORE(iDVBFrontend);
458 class iDVBFrontend: public iDVBFrontend_ENUMS, public iObject
461 virtual RESULT getFrontendType(int &SWIG_OUTPUT)=0;
462 virtual RESULT tune(const iDVBFrontendParameters &where)=0;
463 virtual int closeFrontend(bool force = false, bool no_delayed = false)=0;
464 virtual void reopenFrontend()=0;
466 virtual RESULT connectStateChange(const Slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection)=0;
468 virtual RESULT getState(int &SWIG_OUTPUT)=0;
469 virtual RESULT setTone(int tone)=0;
470 virtual RESULT setVoltage(int voltage)=0;
471 virtual RESULT sendDiseqc(const eDVBDiseqcCommand &diseqc)=0;
472 virtual RESULT sendToneburst(int burst)=0;
474 virtual RESULT setSEC(iDVBSatelliteEquipmentControl *sec)=0;
475 virtual RESULT setSecSequence(eSecCommandList &list)=0;
477 virtual int readFrontendData(int type)=0;
478 virtual void getFrontendStatus(SWIG_PYOBJECT(ePyObject) dest)=0;
479 virtual void getTransponderData(SWIG_PYOBJECT(ePyObject) dest, bool original)=0;
480 virtual void getFrontendData(SWIG_PYOBJECT(ePyObject) dest)=0;
482 virtual RESULT getData(int num, long &data)=0;
483 virtual RESULT setData(int num, long val)=0;
484 /* 0 means: not compatible. other values are a priority. */
485 virtual int isCompatibleWith(ePtr<iDVBFrontendParameters> &feparm)=0;
488 SWIG_TEMPLATE_TYPEDEF(ePtr<iDVBFrontend>, iDVBFrontendPtr);
491 class iDVBSatelliteEquipmentControl: public iObject
494 virtual RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int frontend_id, unsigned int timeout)=0;
495 virtual void prepareTurnOffSatCR(iDVBFrontend &frontend, int satcr)=0;
496 virtual int canTune(const eDVBFrontendParametersSatellite &feparm, iDVBFrontend *fe, int frontend_id, int *highest_score_lnb=0)=0;
497 virtual void setRotorMoving(int slotid, bool)=0;
506 SWIG_IGNORE(iDVBChannel);
507 class iDVBChannel: public iObject
510 /* direct frontend access for raw channels and/or status inquiries. */
511 virtual SWIG_VOID(RESULT) getFrontend(ePtr<iDVBFrontend> &SWIG_OUTPUT)=0;
512 virtual RESULT requestTsidOnid(SWIG_PYOBJECT(ePyObject) callback) { return -1; }
513 virtual int reserveDemux() { return -1; }
517 state_idle, /* not yet tuned */
518 state_tuning, /* currently tuning (first time) */
519 state_failed, /* tuning failed. */
520 state_unavailable, /* currently unavailable, will be back without further interaction */
522 state_last_instance, /* just one reference to this channel is left */
523 state_release /* channel is being shut down. */
525 virtual RESULT getState(int &)=0;
527 virtual RESULT getCurrentFrontendParameters(ePtr<iDVBFrontendParameters> &)=0;
530 evtPreStart, evtEOF, evtSOF, evtFailed
532 virtual RESULT connectStateChange(const Slot1<void,iDVBChannel*> &stateChange, ePtr<eConnection> &connection)=0;
533 virtual RESULT connectEvent(const Slot2<void,iDVBChannel*,int> &eventChange, ePtr<eConnection> &connection)=0;
535 /* demux capabilities */
541 virtual RESULT setCIRouting(const eDVBCIRouting &routing)=0;
542 virtual RESULT getDemux(ePtr<iDVBDemux> &demux, int cap=0)=0;
544 /* use count handling */
545 virtual void AddUse() = 0;
546 virtual void ReleaseUse() = 0;
549 SWIG_TEMPLATE_TYPEDEF(eUsePtr<iDVBChannel>, iDVBChannelPtr);
552 /* signed, so we can express deltas. */
554 typedef long long pts_t;
556 class iFilePushScatterGather;
557 class iTSMPEGDecoder;
559 /* note that a cue sheet describes the logical positions. thus
560 everything is specified in pts and not file positions */
562 /* implemented in dvb.cpp */
563 class eCueSheet: public iObject, public Object
565 DECLARE_REF(eCueSheet);
570 void seekTo(int relative, const pts_t &pts);
573 void addSourceSpan(const pts_t &begin, const pts_t &end);
576 void setSkipmode(const pts_t &ratio); /* 90000 is 1:1 */
577 void setDecodingDemux(iDVBDemux *demux, iTSMPEGDecoder *decoder);
579 /* frontend and backend */
583 enum { evtSeek, evtSkipmode, evtSpanChanged };
584 RESULT connectEvent(const Slot1<void, int> &event, ePtr<eConnection> &connection);
586 std::list<std::pair<pts_t,pts_t> > m_spans; /* begin, end */
587 std::list<std::pair<int, pts_t> > m_seek_requests; /* relative, delta */
588 pts_t m_skipmode_ratio;
589 Signal1<void,int> m_event;
590 ePtr<iDVBDemux> m_decoding_demux;
591 ePtr<iTSMPEGDecoder> m_decoder;
594 class iDVBPVRChannel: public iDVBChannel
599 state_eof = state_release + 1 /* end-of-file reached. */
602 /* FIXME: there are some very ugly buffer-end and ... related problems */
603 /* so this is VERY UGLY.
605 ok, it's going to get better. but still...*/
606 virtual RESULT playFile(const char *file) = 0;
607 virtual void stopFile() = 0;
610 virtual RESULT playSource(ePtr<iTsSource> &source, const char *priv=NULL) = 0;
611 virtual void stopSource() = 0;
613 virtual void setCueSheet(eCueSheet *cuesheet) = 0;
615 virtual RESULT getLength(pts_t &pts) = 0;
617 /* we explicitely ask for the decoding demux here because a channel
618 can be shared between multiple decoders.
620 virtual RESULT getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, int mode) = 0;
621 /* skipping must be done with a cue sheet */
624 class iDVBSectionReader;
626 class iDVBTSRecorder;
627 class iTSMPEGDecoder;
629 class iDVBDemux: public iObject
632 virtual RESULT createSectionReader(eMainloop *context, ePtr<iDVBSectionReader> &reader)=0;
633 virtual RESULT createPESReader(eMainloop *context, ePtr<iDVBPESReader> &reader)=0;
634 virtual RESULT createTSRecorder(ePtr<iDVBTSRecorder> &recorder)=0;
635 virtual RESULT getMPEGDecoder(ePtr<iTSMPEGDecoder> &reader, int primary=1)=0;
636 virtual RESULT getSTC(pts_t &pts, int num=0)=0;
637 virtual RESULT getCADemuxID(uint8_t &id)=0;
638 virtual RESULT flush()=0;
641 #if HAVE_DVB_API_VERSION < 3 && !defined(VIDEO_EVENT_SIZE_CHANGED)
642 #define VIDEO_EVENT_SIZE_CHANGED 1
643 #define VIDEO_EVENT_FRAME_RATE_CHANGED 2
646 class iTSMPEGDecoder: public iObject
649 enum { pidDisabled = -1 };
650 /** Set Displayed Video PID and type */
651 virtual RESULT setVideoPID(int vpid, int type)=0;
653 enum { af_MPEG, af_AC3, af_DTS, af_AAC, af_DTSHD };
654 /** Set Displayed Audio PID and type */
655 virtual RESULT setAudioPID(int apid, int type)=0;
657 enum { ac_left, ac_stereo, ac_right };
658 /** Set Displayed Audio Channel */
659 virtual RESULT setAudioChannel(int channel)=0;
660 virtual int getAudioChannel()=0;
662 virtual RESULT setPCMDelay(int delay)=0;
663 virtual int getPCMDelay()=0;
664 virtual RESULT setAC3Delay(int delay)=0;
665 virtual int getAC3Delay()=0;
667 /** Set Displayed Videotext PID */
668 virtual RESULT setTextPID(int vpid)=0;
670 /** Set Sync mode to PCR */
671 virtual RESULT setSyncPCR(int pcrpid)=0;
672 enum { sm_Audio, sm_Video };
673 /** Set Sync mode to either audio or video master */
674 virtual RESULT setSyncMaster(int who)=0;
676 /** Apply settings but don't change state */
677 virtual RESULT set()=0;
678 /* all those apply settings, then transition to the given state */
681 virtual RESULT play()=0;
683 virtual RESULT pause()=0;
685 /** fast forward by skipping frames. 0 is disabled, 2 is twice-the-speed, ... */
686 virtual RESULT setFastForward(int skip=0)=0;
688 /** Slow Motion by repeating pictures */
689 virtual RESULT setSlowMotion(int repeat)=0;
691 /** Display any complete data as fast as possible */
692 virtual RESULT setTrickmode()=0;
694 virtual RESULT getPTS(int what, pts_t &pts) = 0;
696 virtual RESULT showSinglePic(const char *filename) = 0;
698 virtual RESULT setRadioPic(const std::string &filename) = 0;
702 enum { eventUnknown = 0,
703 eventSizeChanged = VIDEO_EVENT_SIZE_CHANGED,
704 eventFrameRateChanged = VIDEO_EVENT_FRAME_RATE_CHANGED,
705 eventProgressiveChanged = 16
707 unsigned char aspect;
708 unsigned short height;
709 unsigned short width;
711 unsigned short framerate;
714 virtual RESULT connectVideoEvent(const Slot1<void, struct videoEvent> &event, ePtr<eConnection> &connection) = 0;
716 virtual int getVideoWidth() = 0;
717 virtual int getVideoHeight() = 0;
718 virtual int getVideoProgressive() = 0;
719 virtual int getVideoFrameRate() = 0;
720 virtual int getVideoAspect() = 0;