6 #if HAVE_DVB_API_VERSION < 3
7 #include <ost/frontend.h>
8 #define FRONTENDPARAMETERS FrontendParameters
10 #include <linux/dvb/frontend.h>
11 #define FRONTENDPARAMETERS struct dvb_frontend_parameters
13 #include <lib/dvb/frontendparms.h>
14 #include <lib/base/object.h>
15 #include <lib/base/ebase.h>
16 #include <lib/base/elock.h>
17 #include <lib/service/service.h>
18 #include <libsig_comp.h>
19 #include <connection.h>
21 #if defined(__GNUC__) && ((__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || __GNUC__ == 4 ) // check if gcc version >= 3.1
23 #define CAID_LIST __gnu_cxx::slist<uint16_t>
26 #define CAID_LIST std::slist<uint16_t>
31 std::string m_bouquet_name;
32 std::string m_filename; // without path.. just name
33 typedef std::list<eServiceReference> list;
35 // the following five methods are implemented in db.cpp
36 RESULT flushChanges();
37 RESULT addService(const eServiceReference &);
38 RESULT removeService(const eServiceReference &);
39 RESULT moveService(const eServiceReference &, unsigned int);
40 RESULT setListName(const std::string &name);
43 /* these structures have by intention no operator int() defined.
44 the reason of these structures is to avoid mixing for example
45 a onid and a tsid (as there's no general order for them).
47 defining an operator int() would implicitely convert values
48 between them over the constructor with the int argument.
50 'explicit' doesn't here - eTransportStreamID(eOriginalNetworkID(n))
53 struct eTransportStreamID
58 int get() const { return v; }
59 eTransportStreamID(int i): v(i) { }
60 eTransportStreamID(): v(-1) { }
61 bool operator == (const eTransportStreamID &c) const { return v == c.v; }
62 bool operator != (const eTransportStreamID &c) const { return v != c.v; }
63 bool operator < (const eTransportStreamID &c) const { return v < c.v; }
64 bool operator > (const eTransportStreamID &c) const { return v > c.v; }
72 int get() const { return v; }
73 eServiceID(int i): v(i) { }
74 eServiceID(): v(-1) { }
75 bool operator == (const eServiceID &c) const { return v == c.v; }
76 bool operator != (const eServiceID &c) const { return v != c.v; }
77 bool operator < (const eServiceID &c) const { return v < c.v; }
78 bool operator > (const eServiceID &c) const { return v > c.v; }
81 struct eOriginalNetworkID
86 int get() const { return v; }
87 eOriginalNetworkID(int i): v(i) { }
88 eOriginalNetworkID(): v(-1) { }
89 bool operator == (const eOriginalNetworkID &c) const { return v == c.v; }
90 bool operator != (const eOriginalNetworkID &c) const { return v != c.v; }
91 bool operator < (const eOriginalNetworkID &c) const { return v < c.v; }
92 bool operator > (const eOriginalNetworkID &c) const { return v > c.v; }
100 int get() const { return v; }
101 eDVBNamespace(int i): v(i) { }
102 eDVBNamespace(): v(-1) { }
103 bool operator == (const eDVBNamespace &c) const { return v == c.v; }
104 bool operator != (const eDVBNamespace &c) const { return v != c.v; }
105 bool operator < (const eDVBNamespace &c) const { return v < c.v; }
106 bool operator > (const eDVBNamespace &c) const { return v > c.v; }
111 eDVBNamespace dvbnamespace;
112 eTransportStreamID transport_stream_id;
113 eOriginalNetworkID original_network_id;
115 bool operator==(const eDVBChannelID &c) const
117 return dvbnamespace == c.dvbnamespace &&
118 transport_stream_id == c.transport_stream_id &&
119 original_network_id == c.original_network_id;
122 bool operator<(const eDVBChannelID &c) const
124 if (dvbnamespace < c.dvbnamespace)
126 else if (dvbnamespace == c.dvbnamespace)
128 if (original_network_id < c.original_network_id)
130 else if (original_network_id == c.original_network_id)
131 if (transport_stream_id < c.transport_stream_id)
136 eDVBChannelID(eDVBNamespace dvbnamespace, eTransportStreamID tsid, eOriginalNetworkID onid):
137 dvbnamespace(dvbnamespace), transport_stream_id(tsid), original_network_id(onid)
141 dvbnamespace(-1), transport_stream_id(-1), original_network_id(-1)
144 operator bool() const
146 return (dvbnamespace != -1) && (transport_stream_id != -1) && (original_network_id != -1);
150 struct eServiceReferenceDVB: public eServiceReference
152 int getServiceType() const { return data[0]; }
153 void setServiceType(int service_type) { data[0]=service_type; }
155 eServiceID getServiceID() const { return eServiceID(data[1]); }
156 void setServiceID(eServiceID service_id) { data[1]=service_id.get(); }
158 eTransportStreamID getTransportStreamID() const { return eTransportStreamID(data[2]); }
159 void setTransportStreamID(eTransportStreamID transport_stream_id) { data[2]=transport_stream_id.get(); }
161 eOriginalNetworkID getOriginalNetworkID() const { return eOriginalNetworkID(data[3]); }
162 void setOriginalNetworkID(eOriginalNetworkID original_network_id) { data[3]=original_network_id.get(); }
164 eDVBNamespace getDVBNamespace() const { return eDVBNamespace(data[4]); }
165 void setDVBNamespace(eDVBNamespace dvbnamespace) { data[4]=dvbnamespace.get(); }
167 eServiceID getParentServiceID() const { return eServiceID(data[5]); }
168 void setParentServiceID( eServiceID sid ) { data[5]=sid.get(); }
170 eTransportStreamID getParentTransportStreamID() const { return eTransportStreamID(data[6]); }
171 void setParentTransportStreamID( eTransportStreamID tsid ) { data[6]=tsid.get(); }
173 eServiceReferenceDVB getParentServiceReference() const
175 eServiceReferenceDVB tmp(*this);
176 if (data[5] && data[6])
178 tmp.data[1] = data[5];
179 tmp.data[2] = data[6];
180 tmp.data[5] = tmp.data[6] = 0;
183 tmp.type = idInvalid;
187 eServiceReferenceDVB(eDVBNamespace dvbnamespace, eTransportStreamID transport_stream_id, eOriginalNetworkID original_network_id, eServiceID service_id, int service_type)
188 :eServiceReference(eServiceReference::idDVB, 0)
190 setTransportStreamID(transport_stream_id);
191 setOriginalNetworkID(original_network_id);
192 setDVBNamespace(dvbnamespace);
193 setServiceID(service_id);
194 setServiceType(service_type);
197 void set(const eDVBChannelID &chid)
199 setDVBNamespace(chid.dvbnamespace);
200 setOriginalNetworkID(chid.original_network_id);
201 setTransportStreamID(chid.transport_stream_id);
204 void getChannelID(eDVBChannelID &chid) const
206 chid = eDVBChannelID(getDVBNamespace(), getTransportStreamID(), getOriginalNetworkID());
209 eServiceReferenceDVB()
210 :eServiceReference(eServiceReference::idDVB, 0)
214 eServiceReferenceDVB(const std::string &string)
215 :eServiceReference(string)
221 ////////////////// TODO: we need an interface here, but what exactly?
224 // btw, still implemented in db.cpp. FIX THIS, TOO.
226 class eDVBChannelQuery;
228 class eDVBService: public iStaticServiceInformation
230 DECLARE_REF(eDVBService);
233 void copyCache(int *source);
237 cVPID, cAPID, cTPID, cPCRPID, cAC3PID, cVTYPE, cACHANNEL, cacheMax
240 int getCacheEntry(cacheID);
241 void setCacheEntry(cacheID, int);
246 /* m_service_name_sort is uppercase, with special chars removed, to increase sort performance. */
247 std::string m_service_name, m_service_name_sort;
248 std::string m_provider_name;
255 dxNoSDT=1, // don't get SDT
257 dxNoDVB=4, // dont use PMT for this service ( use cached pids )
262 bool usePMT() const { return !(m_flags & dxNoDVB); }
266 virtual ~eDVBService();
268 eDVBService &operator=(const eDVBService &);
270 // iStaticServiceInformation
271 RESULT getName(const eServiceReference &ref, std::string &name);
272 RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time);
273 bool isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
276 int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query);
283 class iDVBFrontendParameters;
285 class iDVBChannelListQuery: public iObject
288 virtual RESULT getNextResult(eServiceReferenceDVB &ref)=0;
289 virtual int compareLessEqual(const eServiceReferenceDVB &a, const eServiceReferenceDVB &b)=0;
292 class eDVBChannelQuery: public iObject
294 DECLARE_REF(eDVBChannelQuery);
313 std::string m_string;
315 eDVBChannelID m_channelid;
317 /* sort is only valid in root, and must be from the enum above. */
319 std::string m_bouquet_name;
321 static RESULT compile(ePtr<eDVBChannelQuery> &res, std::string query);
323 ePtr<eDVBChannelQuery> m_p1, m_p2;
326 class iDVBChannelList: public iObject
329 virtual RESULT removeService(const eServiceReference &service)=0;
330 virtual RESULT removeServices(eDVBChannelID chid=eDVBChannelID(), unsigned int orb_pos=0xFFFFFFFF)=0;
331 virtual RESULT removeServices(int dvb_namespace=-1, int tsid=-1, int onid=-1, unsigned int orb_pos=0xFFFFFFFF)=0;
332 virtual RESULT addFlag(const eServiceReference &service, unsigned int flagmask=0xFFFFFFFF)=0;
333 virtual RESULT removeFlag(const eServiceReference &service, unsigned int flagmask=0xFFFFFFFF)=0;
334 virtual RESULT removeFlags(unsigned int flagmask, eDVBChannelID chid=eDVBChannelID(), unsigned int orb_pos=0xFFFFFFFF)=0;
335 virtual RESULT removeFlags(unsigned int flagmask, int dvb_namespace=-1, int tsid=-1, int onid=-1, unsigned int orb_pos=0xFFFFFFFF)=0;
336 virtual RESULT addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm)=0;
337 virtual RESULT removeChannel(const eDVBChannelID &id)=0;
339 virtual RESULT getChannelFrontendData(const eDVBChannelID &id, ePtr<iDVBFrontendParameters> &parm)=0;
341 virtual RESULT addService(const eServiceReferenceDVB &service, eDVBService *service)=0;
342 virtual RESULT getService(const eServiceReferenceDVB &reference, ePtr<eDVBService> &service)=0;
343 virtual RESULT flush()=0;
345 virtual RESULT getBouquet(const eServiceReference &ref, eBouquet* &bouquet)=0;
347 virtual RESULT startQuery(ePtr<iDVBChannelListQuery> &query, eDVBChannelQuery *query, const eServiceReference &source)=0;
352 class iDVBFrontendParameters: public iObject
355 iDVBFrontendParameters();
356 ~iDVBFrontendParameters();
359 virtual RESULT getSystem(int &SWIG_OUTPUT) const = 0;
360 virtual RESULT getDVBS(eDVBFrontendParametersSatellite &SWIG_OUTPUT) const = 0;
361 virtual RESULT getDVBC(eDVBFrontendParametersCable &SWIG_OUTPUT) const = 0;
362 virtual RESULT getDVBT(eDVBFrontendParametersTerrestrial &SWIG_OUTPUT) const = 0;
364 virtual RESULT calculateDifference(const iDVBFrontendParameters *parm, int &SWIG_OUTPUT) const = 0;
365 virtual RESULT getHash(unsigned long &SWIG_OUTPUT) const = 0;
368 #define MAX_DISEQC_LENGTH 16
370 class eDVBDiseqcCommand
376 __u8 data[MAX_DISEQC_LENGTH];
377 #if HAVE_DVB_API_VERSION < 3
384 void setCommandString(const char *str);
387 class iDVBSatelliteEquipmentControl;
388 class eSecCommandList;
390 class iDVBFrontend: public iObject
394 feSatellite, feCable, feTerrestrial
396 virtual RESULT getFrontendType(int &SWIG_OUTPUT)=0;
397 virtual RESULT tune(const iDVBFrontendParameters &where)=0;
399 virtual RESULT connectStateChange(const Slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection)=0;
408 virtual RESULT getState(int &SWIG_OUTPUT)=0;
412 virtual RESULT setTone(int tone)=0;
414 voltageOff, voltage13, voltage18, voltage13_5, voltage18_5
416 virtual RESULT setVoltage(int voltage)=0;
417 virtual RESULT sendDiseqc(const eDVBDiseqcCommand &diseqc)=0;
418 virtual RESULT sendToneburst(int burst)=0;
420 virtual RESULT setSEC(iDVBSatelliteEquipmentControl *sec)=0;
421 virtual RESULT setSecSequence(const eSecCommandList &list)=0;
424 bitErrorRate, signalPower, signalQuality, locked, synced, frontendNumber
426 virtual int readFrontendData(int type)=0;
427 virtual PyObject *readTransponderData(bool original)=0;
430 virtual RESULT getData(int num, int &data)=0;
431 virtual RESULT setData(int num, int val)=0;
432 /* 0 means: not compatible. other values are a priority. */
433 virtual int isCompatibleWith(ePtr<iDVBFrontendParameters> &feparm)=0;
436 TEMPLATE_TYPEDEF(ePtr<iDVBFrontend>, iDVBFrontendPtr);
439 class iDVBSatelliteEquipmentControl: public iObject
442 virtual RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int frontend_id)=0;
443 virtual int canTune(const eDVBFrontendParametersSatellite &feparm, iDVBFrontend *fe, int frontend_id)=0;
444 virtual void setRotorMoving(bool)=0;
453 class iDVBChannel: public iObject
458 state_idle, /* not yet tuned */
459 state_tuning, /* currently tuning (first time) */
460 state_failed, /* tuning failed. */
461 state_unavailable, /* currently unavailable, will be back without further interaction */
463 state_last_instance, /* just one reference to this channel is left */
464 state_release /* channel is being shut down. */
466 virtual RESULT getState(int &SWIG_OUTPUT)=0;
468 /* direct frontend access for raw channels and/or status inquiries. */
469 virtual RESULT getFrontend(ePtr<iDVBFrontend> &)=0;
472 virtual RESULT getCurrentFrontendParameters(ePtr<iDVBFrontendParameters> &)=0;
475 evtEOF, evtSOF, evtFailed
477 virtual RESULT connectStateChange(const Slot1<void,iDVBChannel*> &stateChange, ePtr<eConnection> &connection)=0;
478 virtual RESULT connectEvent(const Slot2<void,iDVBChannel*,int> &eventChange, ePtr<eConnection> &connection)=0;
480 /* demux capabilities */
486 virtual RESULT setCIRouting(const eDVBCIRouting &routing)=0;
487 virtual RESULT getDemux(ePtr<iDVBDemux> &demux, int cap=0)=0;
489 /* use count handling */
490 virtual void AddUse() = 0;
491 virtual void ReleaseUse() = 0;
494 TEMPLATE_TYPEDEF(eUsePtr<iDVBChannel>, iDVBChannelPtr);
498 /* signed, so we can express deltas. */
500 typedef long long pts_t;
502 class iFilePushScatterGather;
503 class iTSMPEGDecoder;
505 /* note that a cue sheet describes the logical positions. thus
506 everything is specified in pts and not file positions */
508 /* implemented in dvb.cpp */
509 class eCueSheet: public iObject, public Object
511 DECLARE_REF(eCueSheet);
516 void seekTo(int relative, const pts_t &pts);
519 void addSourceSpan(const pts_t &begin, const pts_t &end);
522 void setSkipmode(const pts_t &ratio); /* 90000 is 1:1 */
523 void setDecodingDemux(iDVBDemux *demux, iTSMPEGDecoder *decoder);
525 /* frontend and backend */
529 enum { evtSeek, evtSkipmode, evtSpanChanged };
530 RESULT connectEvent(const Slot1<void, int> &event, ePtr<eConnection> &connection);
532 std::list<std::pair<pts_t,pts_t> > m_spans; /* begin, end */
533 std::list<std::pair<int, pts_t> > m_seek_requests; /* relative, delta */
534 pts_t m_skipmode_ratio;
535 Signal1<void,int> m_event;
536 ePtr<iDVBDemux> m_decoding_demux;
537 ePtr<iTSMPEGDecoder> m_decoder;
540 class iDVBPVRChannel: public iDVBChannel
545 state_eof = state_release + 1 /* end-of-file reached. */
548 /* FIXME: there are some very ugly buffer-end and ... related problems */
549 /* so this is VERY UGLY.
551 ok, it's going to get better. but still...*/
552 virtual RESULT playFile(const char *file) = 0;
553 virtual void stopFile() = 0;
555 virtual void setCueSheet(eCueSheet *cuesheet) = 0;
557 virtual RESULT getLength(pts_t &pts) = 0;
559 /* we explicitely ask for the decoding demux here because a channel
560 can be shared between multiple decoders.
562 virtual RESULT getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, int mode) = 0;
563 /* skipping must be done with a cue sheet */
566 class iDVBSectionReader;
568 class iDVBTSRecorder;
569 class iTSMPEGDecoder;
571 class iDVBDemux: public iObject
574 virtual RESULT createSectionReader(eMainloop *context, ePtr<iDVBSectionReader> &reader)=0;
575 virtual RESULT createPESReader(eMainloop *context, ePtr<iDVBPESReader> &reader)=0;
576 virtual RESULT createTSRecorder(ePtr<iDVBTSRecorder> &recorder)=0;
577 virtual RESULT getMPEGDecoder(ePtr<iTSMPEGDecoder> &reader, int primary=1)=0;
578 virtual RESULT getSTC(pts_t &pts, int num=0)=0;
579 virtual RESULT getCADemuxID(uint8_t &id)=0;
580 virtual RESULT flush()=0;
583 class iTSMPEGDecoder: public iObject
586 enum { pidDisabled = -1 };
587 /** Set Displayed Video PID and type */
588 virtual RESULT setVideoPID(int vpid, int type)=0;
590 enum { af_MPEG, af_AC3, af_DTS, af_AAC };
591 /** Set Displayed Audio PID and type */
592 virtual RESULT setAudioPID(int apid, int type)=0;
594 enum { ac_left, ac_stereo, ac_right };
595 /** Set Displayed Audio Channel */
596 virtual RESULT setAudioChannel(int channel)=0;
598 /** Set Displayed Videotext PID */
599 virtual RESULT setTextPID(int vpid)=0;
601 /** Set Sync mode to PCR */
602 virtual RESULT setSyncPCR(int pcrpid)=0;
603 enum { sm_Audio, sm_Video };
604 /** Set Sync mode to either audio or video master */
605 virtual RESULT setSyncMaster(int who)=0;
607 /** Apply settings */
608 virtual RESULT start()=0;
610 /** Freeze frame. Either continue decoding (without display) or halt. */
611 virtual RESULT freeze(int cont)=0;
612 /** Continue after freeze. */
613 virtual RESULT unfreeze()=0;
615 /** fast forward by skipping frames. 0 is disabled, 2 is twice-the-speed, ... */
616 virtual RESULT setFastForward(int skip=0)=0;
618 // stop on .. Picture
619 enum { spm_I, spm_Ref, spm_Any };
620 /** Stop on specific decoded picture. For I-Frame display. */
621 virtual RESULT setSinglePictureMode(int when)=0;
623 enum { pkm_B, pkm_PB };
624 /** Fast forward by skipping either B or P/B pictures */
625 virtual RESULT setPictureSkipMode(int what)=0;
627 /** Slow Motion by repeating pictures */
628 virtual RESULT setSlowMotion(int repeat)=0;
630 enum { zoom_Normal, zoom_PanScan, zoom_Letterbox, zoom_Fullscreen };
631 /** Set Zoom. mode *must* be fitting. */
632 virtual RESULT setZoom(int what)=0;
634 virtual RESULT setTrickmode(int what) = 0;
636 virtual RESULT getPTS(int what, pts_t &pts) = 0;