4 #if HAVE_DVB_API_VERSION < 3
5 #include <ost/frontend.h>
6 #define FRONTENDPARAMETERS FrontendParameters
8 #include <linux/dvb/frontend.h>
9 #define FRONTENDPARAMETERS struct dvb_frontend_parameters
11 #include <lib/dvb/frontendparms.h>
12 #include <lib/base/object.h>
13 #include <lib/base/ebase.h>
14 #include <lib/base/elock.h>
15 #include <lib/service/service.h>
16 #include <libsig_comp.h>
17 #include <connection.h>
21 std::string m_bouquet_name;
22 std::string m_filename; // without path.. just name
23 typedef std::list<eServiceReference> list;
25 // the following five methods are implemented in db.cpp
26 RESULT flushChanges();
27 RESULT addService(const eServiceReference &);
28 RESULT removeService(const eServiceReference &);
29 RESULT moveService(const eServiceReference &, unsigned int);
30 RESULT setListName(const std::string &name);
33 /* these structures have by intention no operator int() defined.
34 the reason of these structures is to avoid mixing for example
35 a onid and a tsid (as there's no general order for them).
37 defining an operator int() would implicitely convert values
38 between them over the constructor with the int argument.
40 'explicit' doesn't here - eTransportStreamID(eOriginalNetworkID(n))
43 struct eTransportStreamID
48 int get() const { return v; }
49 eTransportStreamID(int i): v(i) { }
50 eTransportStreamID(): v(-1) { }
51 bool operator == (const eTransportStreamID &c) const { return v == c.v; }
52 bool operator != (const eTransportStreamID &c) const { return v != c.v; }
53 bool operator < (const eTransportStreamID &c) const { return v < c.v; }
54 bool operator > (const eTransportStreamID &c) const { return v > c.v; }
62 int get() const { return v; }
63 eServiceID(int i): v(i) { }
64 eServiceID(): v(-1) { }
65 bool operator == (const eServiceID &c) const { return v == c.v; }
66 bool operator != (const eServiceID &c) const { return v != c.v; }
67 bool operator < (const eServiceID &c) const { return v < c.v; }
68 bool operator > (const eServiceID &c) const { return v > c.v; }
71 struct eOriginalNetworkID
76 int get() const { return v; }
77 eOriginalNetworkID(int i): v(i) { }
78 eOriginalNetworkID(): v(-1) { }
79 bool operator == (const eOriginalNetworkID &c) const { return v == c.v; }
80 bool operator != (const eOriginalNetworkID &c) const { return v != c.v; }
81 bool operator < (const eOriginalNetworkID &c) const { return v < c.v; }
82 bool operator > (const eOriginalNetworkID &c) const { return v > c.v; }
90 int get() const { return v; }
91 eDVBNamespace(int i): v(i) { }
92 eDVBNamespace(): v(-1) { }
93 bool operator == (const eDVBNamespace &c) const { return v == c.v; }
94 bool operator != (const eDVBNamespace &c) const { return v != c.v; }
95 bool operator < (const eDVBNamespace &c) const { return v < c.v; }
96 bool operator > (const eDVBNamespace &c) const { return v > c.v; }
101 eDVBNamespace dvbnamespace;
102 eTransportStreamID transport_stream_id;
103 eOriginalNetworkID original_network_id;
105 bool operator==(const eDVBChannelID &c) const
107 return dvbnamespace == c.dvbnamespace &&
108 transport_stream_id == c.transport_stream_id &&
109 original_network_id == c.original_network_id;
112 bool operator<(const eDVBChannelID &c) const
114 if (dvbnamespace < c.dvbnamespace)
116 else if (dvbnamespace == c.dvbnamespace)
118 if (original_network_id < c.original_network_id)
120 else if (original_network_id == c.original_network_id)
121 if (transport_stream_id < c.transport_stream_id)
126 eDVBChannelID(eDVBNamespace dvbnamespace, eTransportStreamID tsid, eOriginalNetworkID onid):
127 dvbnamespace(dvbnamespace), transport_stream_id(tsid), original_network_id(onid)
131 dvbnamespace(-1), transport_stream_id(-1), original_network_id(-1)
134 operator bool() const
136 return (dvbnamespace != -1) && (transport_stream_id != -1) && (original_network_id != -1);
140 struct eServiceReferenceDVB: public eServiceReference
142 int getServiceType() const { return data[0]; }
143 void setServiceType(int service_type) { data[0]=service_type; }
145 eServiceID getServiceID() const { return eServiceID(data[1]); }
146 void setServiceID(eServiceID service_id) { data[1]=service_id.get(); }
148 eTransportStreamID getTransportStreamID() const { return eTransportStreamID(data[2]); }
149 void setTransportStreamID(eTransportStreamID transport_stream_id) { data[2]=transport_stream_id.get(); }
151 eOriginalNetworkID getOriginalNetworkID() const { return eOriginalNetworkID(data[3]); }
152 void setOriginalNetworkID(eOriginalNetworkID original_network_id) { data[3]=original_network_id.get(); }
154 eDVBNamespace getDVBNamespace() const { return eDVBNamespace(data[4]); }
155 void setDVBNamespace(eDVBNamespace dvbnamespace) { data[4]=dvbnamespace.get(); }
157 eServiceID getParentServiceID() const { return eServiceID(data[5]); }
158 void setParentServiceID( eServiceID sid ) { data[5]=sid.get(); }
160 eTransportStreamID getParentTransportStreamID() const { return eTransportStreamID(data[6]); }
161 void setParentTransportStreamID( eTransportStreamID tsid ) { data[6]=tsid.get(); }
163 eServiceReferenceDVB(eDVBNamespace dvbnamespace, eTransportStreamID transport_stream_id, eOriginalNetworkID original_network_id, eServiceID service_id, int service_type)
164 :eServiceReference(eServiceReference::idDVB, 0)
166 setTransportStreamID(transport_stream_id);
167 setOriginalNetworkID(original_network_id);
168 setDVBNamespace(dvbnamespace);
169 setServiceID(service_id);
170 setServiceType(service_type);
173 void set(const eDVBChannelID &chid)
175 setDVBNamespace(chid.dvbnamespace);
176 setOriginalNetworkID(chid.original_network_id);
177 setTransportStreamID(chid.transport_stream_id);
180 void getChannelID(eDVBChannelID &chid) const
182 chid = eDVBChannelID(getDVBNamespace(), getTransportStreamID(), getOriginalNetworkID());
185 eServiceReferenceDVB()
186 :eServiceReference(eServiceReference::idDVB, 0)
190 eServiceReferenceDVB(const std::string &string)
191 :eServiceReference(string)
197 ////////////////// TODO: we need an interface here, but what exactly?
200 // btw, still implemented in db.cpp. FIX THIS, TOO.
202 class eDVBChannelQuery;
204 class eDVBService: public iStaticServiceInformation
206 DECLARE_REF(eDVBService);
210 cVPID, cAPID, cTPID, cPCRPID, cAC3PID, cacheMax
213 int getCachePID(cacheID);
214 void setCachePID(cacheID, int);
215 bool cacheEmpty() { return m_cache.empty(); }
218 /* m_service_name_sort is uppercase, with special chars removed, to increase sort performance. */
219 std::string m_service_name, m_service_name_sort;
220 std::string m_provider_name;
226 std::map<int,int> m_cache;
227 virtual ~eDVBService();
229 eDVBService &operator=(const eDVBService &);
231 // iStaticServiceInformation
232 RESULT getName(const eServiceReference &ref, std::string &name);
233 RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time);
234 bool isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
237 int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query);
244 class iDVBFrontendParameters;
246 class iDVBChannelListQuery: public iObject
249 virtual RESULT getNextResult(eServiceReferenceDVB &ref)=0;
250 virtual int compareLessEqual(const eServiceReferenceDVB &a, const eServiceReferenceDVB &b)=0;
253 class eDVBChannelQuery: public iObject
255 DECLARE_REF(eDVBChannelQuery);
272 std::string m_string;
274 eDVBChannelID m_channelid;
276 /* sort is only valid in root, and must be from the enum above. */
278 std::string m_bouquet_name;
280 static RESULT compile(ePtr<eDVBChannelQuery> &res, std::string query);
282 ePtr<eDVBChannelQuery> m_p1, m_p2;
285 class iDVBChannelList: public iObject
288 virtual RESULT addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm)=0;
289 virtual RESULT removeChannel(const eDVBChannelID &id)=0;
291 virtual RESULT getChannelFrontendData(const eDVBChannelID &id, ePtr<iDVBFrontendParameters> &parm)=0;
293 virtual RESULT addService(const eServiceReferenceDVB &service, eDVBService *service)=0;
294 virtual RESULT getService(const eServiceReferenceDVB &reference, ePtr<eDVBService> &service)=0;
295 virtual RESULT flush()=0;
297 virtual RESULT getBouquet(const eServiceReference &ref, eBouquet* &bouquet)=0;
299 virtual RESULT startQuery(ePtr<iDVBChannelListQuery> &query, eDVBChannelQuery *query, const eServiceReference &source)=0;
302 class iDVBFrontendParameters: public iObject
305 virtual RESULT getSystem(int &type) const = 0;
306 virtual RESULT getDVBS(eDVBFrontendParametersSatellite &p) const = 0;
307 virtual RESULT getDVBC(eDVBFrontendParametersCable &p) const = 0;
308 virtual RESULT getDVBT(eDVBFrontendParametersTerrestrial &p) const = 0;
310 virtual RESULT calculateDifference(const iDVBFrontendParameters *parm, int &diff) const = 0;
311 virtual RESULT getHash(unsigned long &hash) const = 0;
314 #define MAX_DISEQC_LENGTH 16
316 class eDVBDiseqcCommand
320 __u8 data[MAX_DISEQC_LENGTH];
321 #if HAVE_DVB_API_VERSION < 3
327 class iDVBSatelliteEquipmentControl;
328 class eSecCommandList;
330 class iDVBFrontend: public iObject
334 feSatellite, feCable, feTerrestrial
336 virtual RESULT getFrontendType(int &type)=0;
337 virtual RESULT tune(const iDVBFrontendParameters &where)=0;
338 virtual RESULT connectStateChange(const Slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection)=0;
346 virtual RESULT getState(int &state)=0;
350 virtual RESULT setTone(int tone)=0;
352 voltageOff, voltage13, voltage18, voltage13_5, voltage18_5
354 virtual RESULT setVoltage(int voltage)=0;
355 virtual RESULT sendDiseqc(const eDVBDiseqcCommand &diseqc)=0;
356 virtual RESULT sendToneburst(int burst)=0;
357 virtual RESULT setSEC(iDVBSatelliteEquipmentControl *sec)=0;
358 virtual RESULT setSecSequence(const eSecCommandList &list)=0;
361 bitErrorRate, signalPower, signalQuality, Locked, Synced
363 virtual int readFrontendData(int type)=0;
364 virtual PyObject *readTransponderData()=0;
366 virtual RESULT getData(int num, int &data)=0;
367 virtual RESULT setData(int num, int val)=0;
369 /* 0 means: not compatible. other values are a priority. */
370 virtual int isCompatibleWith(ePtr<iDVBFrontendParameters> &feparm)=0;
373 class iDVBSatelliteEquipmentControl: public iObject
376 virtual RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int frontend_id)=0;
377 virtual int canTune(const eDVBFrontendParametersSatellite &feparm, iDVBFrontend *fe, int frontend_id)=0;
378 virtual void setRotorMoving(bool)=0;
386 class iDVBChannel: public iObject
391 state_idle, /* not yet tuned */
392 state_tuning, /* currently tuning (first time) */
393 state_failed, /* tuning failed. */
394 state_unavailable, /* currently unavailable, will be back without further interaction */
396 state_last_instance, /* just one reference to this channel is left */
397 state_release /* channel is being shut down. */
402 evtEOF, evtSOF, evtFailed
404 virtual RESULT connectStateChange(const Slot1<void,iDVBChannel*> &stateChange, ePtr<eConnection> &connection)=0;
405 virtual RESULT connectEvent(const Slot2<void,iDVBChannel*,int> &eventChange, ePtr<eConnection> &connection)=0;
406 virtual RESULT getState(int &state)=0;
408 /* demux capabilities */
414 virtual RESULT setCIRouting(const eDVBCIRouting &routing)=0;
415 virtual RESULT getDemux(ePtr<iDVBDemux> &demux, int cap=0)=0;
417 /* direct frontend access for raw channels and/or status inquiries. */
418 virtual RESULT getFrontend(ePtr<iDVBFrontend> &frontend)=0;
420 /* use count handling */
421 virtual void AddUse() = 0;
422 virtual void ReleaseUse() = 0;
425 /* signed, so we can express deltas. */
427 typedef long long pts_t;
429 class iFilePushScatterGather;
430 class iTSMPEGDecoder;
432 /* note that a cue sheet describes the logical positions. thus
433 everything is specified in pts and not file positions */
435 /* implemented in dvb.cpp */
436 class eCueSheet: public iObject, public Object
438 DECLARE_REF(eCueSheet);
443 void seekTo(int relative, const pts_t &pts);
446 void addSourceSpan(const pts_t &begin, const pts_t &end);
449 void setSkipmode(const pts_t &ratio); /* 90000 is 1:1 */
450 void setDecodingDemux(iDVBDemux *demux, iTSMPEGDecoder *decoder);
452 /* frontend and backend */
456 enum { evtSeek, evtSkipmode, evtSpanChanged };
457 RESULT connectEvent(const Slot1<void, int> &event, ePtr<eConnection> &connection);
459 std::list<std::pair<pts_t,pts_t> > m_spans; /* begin, end */
460 std::list<std::pair<int, pts_t> > m_seek_requests; /* relative, delta */
461 pts_t m_skipmode_ratio;
462 Signal1<void,int> m_event;
463 ePtr<iDVBDemux> m_decoding_demux;
464 ePtr<iTSMPEGDecoder> m_decoder;
467 class iDVBPVRChannel: public iDVBChannel
472 state_eof = state_release + 1 /* end-of-file reached. */
475 /* FIXME: there are some very ugly buffer-end and ... related problems */
476 /* so this is VERY UGLY.
478 ok, it's going to get better. but still...*/
479 virtual RESULT playFile(const char *file) = 0;
480 virtual void stopFile() = 0;
482 virtual void setCueSheet(eCueSheet *cuesheet) = 0;
484 virtual RESULT getLength(pts_t &pts) = 0;
486 /* we explicitely ask for the decoding demux here because a channel
487 can be shared between multiple decoders.
489 virtual RESULT getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, int mode) = 0;
490 /* skipping must be done with a cue sheet */
493 class iDVBSectionReader;
494 class iDVBTSRecorder;
495 class iTSMPEGDecoder;
497 class iDVBDemux: public iObject
500 virtual RESULT createSectionReader(eMainloop *context, ePtr<iDVBSectionReader> &reader)=0;
501 virtual RESULT createTSRecorder(ePtr<iDVBTSRecorder> &recorder)=0;
502 virtual RESULT getMPEGDecoder(ePtr<iTSMPEGDecoder> &reader)=0;
503 virtual RESULT getSTC(pts_t &pts, int num=0)=0;
504 virtual RESULT getCADemuxID(uint8_t &id)=0;
505 virtual RESULT flush()=0;
508 class iTSMPEGDecoder: public iObject
511 enum { pidDisabled = -1 };
512 /** Set Displayed Video PID */
513 virtual RESULT setVideoPID(int vpid)=0;
515 enum { af_MPEG, af_AC3, af_DTS };
516 /** Set Displayed Audio PID and type */
517 virtual RESULT setAudioPID(int apid, int type)=0;
519 /** Set Displayed Videotext PID */
520 virtual RESULT setTextPID(int vpid)=0;
522 /** Set Sync mode to PCR */
523 virtual RESULT setSyncPCR(int pcrpid)=0;
524 enum { sm_Audio, sm_Video };
525 /** Set Sync mode to either audio or video master */
526 virtual RESULT setSyncMaster(int who)=0;
528 /** Apply settings */
529 virtual RESULT start()=0;
531 /** Freeze frame. Either continue decoding (without display) or halt. */
532 virtual RESULT freeze(int cont)=0;
533 /** Continue after freeze. */
534 virtual RESULT unfreeze()=0;
536 /** fast forward by skipping frames. 0 is disabled, 2 is twice-the-speed, ... */
537 virtual RESULT setFastForward(int skip=0)=0;
539 // stop on .. Picture
540 enum { spm_I, spm_Ref, spm_Any };
541 /** Stop on specific decoded picture. For I-Frame display. */
542 virtual RESULT setSinglePictureMode(int when)=0;
544 enum { pkm_B, pkm_PB };
545 /** Fast forward by skipping either B or P/B pictures */
546 virtual RESULT setPictureSkipMode(int what)=0;
548 /** Slow Motion by repeating pictures */
549 virtual RESULT setSlowMotion(int repeat)=0;
551 enum { zoom_Normal, zoom_PanScan, zoom_Letterbox, zoom_Fullscreen };
552 /** Set Zoom. mode *must* be fitting. */
553 virtual RESULT setZoom(int what)=0;
555 virtual RESULT setTrickmode(int what) = 0;
557 virtual RESULT getPTS(int what, pts_t &pts) = 0;