5 #if HAVE_DVB_API_VERSION < 3
6 #include <ost/frontend.h>
7 #define FRONTENDPARAMETERS FrontendParameters
9 #include <linux/dvb/frontend.h>
10 #define FRONTENDPARAMETERS struct dvb_frontend_parameters
12 #include <lib/base/object.h>
13 #include <lib/base/ebase.h>
14 #include <lib/service/service.h>
15 #include <libsig_comp.h>
16 #include <connection.h>
20 std::string m_bouquet_name;
22 typedef std::list<eServiceReference> list;
24 // the following three methods are implemented in db.cpp
25 RESULT addService(const eServiceReference &);
26 RESULT removeService(const eServiceReference &);
27 RESULT moveService(const eServiceReference &, unsigned int);
30 // bitte KEINE operator int() definieren, sonst bringt das ganze nix!
31 struct eTransportStreamID
36 int get() const { return v; }
37 eTransportStreamID(int i): v(i) { }
38 eTransportStreamID(): v(-1) { }
39 bool operator == (const eTransportStreamID &c) const { return v == c.v; }
40 bool operator != (const eTransportStreamID &c) const { return v != c.v; }
41 bool operator < (const eTransportStreamID &c) const { return v < c.v; }
42 bool operator > (const eTransportStreamID &c) const { return v > c.v; }
50 int get() const { return v; }
51 eServiceID(int i): v(i) { }
52 eServiceID(): v(-1) { }
53 bool operator == (const eServiceID &c) const { return v == c.v; }
54 bool operator != (const eServiceID &c) const { return v != c.v; }
55 bool operator < (const eServiceID &c) const { return v < c.v; }
56 bool operator > (const eServiceID &c) const { return v > c.v; }
59 struct eOriginalNetworkID
64 int get() const { return v; }
65 eOriginalNetworkID(int i): v(i) { }
66 eOriginalNetworkID(): v(-1) { }
67 bool operator == (const eOriginalNetworkID &c) const { return v == c.v; }
68 bool operator != (const eOriginalNetworkID &c) const { return v != c.v; }
69 bool operator < (const eOriginalNetworkID &c) const { return v < c.v; }
70 bool operator > (const eOriginalNetworkID &c) const { return v > c.v; }
78 int get() const { return v; }
79 eDVBNamespace(int i): v(i) { }
80 eDVBNamespace(): v(-1) { }
81 bool operator == (const eDVBNamespace &c) const { return v == c.v; }
82 bool operator != (const eDVBNamespace &c) const { return v != c.v; }
83 bool operator < (const eDVBNamespace &c) const { return v < c.v; }
84 bool operator > (const eDVBNamespace &c) const { return v > c.v; }
89 eDVBNamespace dvbnamespace;
90 eTransportStreamID transport_stream_id;
91 eOriginalNetworkID original_network_id;
93 bool operator==(const eDVBChannelID &c) const
95 return dvbnamespace == c.dvbnamespace &&
96 transport_stream_id == c.transport_stream_id &&
97 original_network_id == c.original_network_id;
100 bool operator<(const eDVBChannelID &c) const
102 if (dvbnamespace < c.dvbnamespace)
104 else if (dvbnamespace == c.dvbnamespace)
106 if (original_network_id < c.original_network_id)
108 else if (original_network_id == c.original_network_id)
109 if (transport_stream_id < c.transport_stream_id)
114 eDVBChannelID(eDVBNamespace dvbnamespace, eTransportStreamID tsid, eOriginalNetworkID onid):
115 dvbnamespace(dvbnamespace), transport_stream_id(tsid), original_network_id(onid)
119 dvbnamespace(-1), transport_stream_id(-1), original_network_id(-1)
122 operator bool() const
124 return (dvbnamespace != -1) && (transport_stream_id != -1) && (original_network_id != -1);
128 struct eServiceReferenceDVB: public eServiceReference
130 int getServiceType() const { return data[0]; }
131 void setServiceType(int service_type) { data[0]=service_type; }
133 eServiceID getServiceID() const { return eServiceID(data[1]); }
134 void setServiceID(eServiceID service_id) { data[1]=service_id.get(); }
136 eTransportStreamID getTransportStreamID() const { return eTransportStreamID(data[2]); }
137 void setTransportStreamID(eTransportStreamID transport_stream_id) { data[2]=transport_stream_id.get(); }
139 eOriginalNetworkID getOriginalNetworkID() const { return eOriginalNetworkID(data[3]); }
140 void setOriginalNetworkID(eOriginalNetworkID original_network_id) { data[3]=original_network_id.get(); }
142 eDVBNamespace getDVBNamespace() const { return eDVBNamespace(data[4]); }
143 void setDVBNamespace(eDVBNamespace dvbnamespace) { data[4]=dvbnamespace.get(); }
145 eServiceReferenceDVB(eDVBNamespace dvbnamespace, eTransportStreamID transport_stream_id, eOriginalNetworkID original_network_id, eServiceID service_id, int service_type)
146 :eServiceReference(eServiceReference::idDVB, 0)
148 setTransportStreamID(transport_stream_id);
149 setOriginalNetworkID(original_network_id);
150 setDVBNamespace(dvbnamespace);
151 setServiceID(service_id);
152 setServiceType(service_type);
155 void set(const eDVBChannelID &chid)
157 setDVBNamespace(chid.dvbnamespace);
158 setOriginalNetworkID(chid.original_network_id);
159 setTransportStreamID(chid.transport_stream_id);
162 void getChannelID(eDVBChannelID &chid) const
164 chid = eDVBChannelID(getDVBNamespace(), getTransportStreamID(), getOriginalNetworkID());
167 eServiceReferenceDVB()
168 :eServiceReference(eServiceReference::idDVB, 0)
174 ////////////////// TODO: we need an interface here, but what exactly?
177 // btw, still implemented in db.cpp. FIX THIS, TOO.
179 class eDVBChannelQuery;
181 class eDVBService: public iStaticServiceInformation
183 DECLARE_REF(eDVBService);
187 cVPID, cAPID, cTPID, cPCRPID, cAC3PID, cacheMax
190 int getCachePID(cacheID);
191 void setCachePID(cacheID, int);
192 bool cacheEmpty() { return m_cache.empty(); }
195 /* m_service_name_sort is uppercase, with special chars removed, to increase sort performance. */
196 std::string m_service_name, m_service_name_sort;
197 std::string m_provider_name;
201 std::map<int,int> m_cache;
202 virtual ~eDVBService();
204 eDVBService &operator=(const eDVBService &);
206 // iStaticServiceInformation
207 RESULT getName(const eServiceReference &ref, std::string &name);
208 int getLength(const eServiceReference &ref);
211 int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query);
218 class iDVBFrontendParameters;
220 class iDVBChannelListQuery: public iObject
223 virtual RESULT getNextResult(eServiceReferenceDVB &ref)=0;
224 virtual int compareLessEqual(const eServiceReferenceDVB &a, const eServiceReferenceDVB &b)=0;
227 class eDVBChannelQuery: public iObject
229 DECLARE_REF(eDVBChannelQuery);
246 std::string m_string;
248 eDVBChannelID m_channelid;
250 /* sort is only valid in root, and must be from the enum above. */
252 std::string m_bouquet_name;
254 static RESULT compile(ePtr<eDVBChannelQuery> &res, std::string query);
256 ePtr<eDVBChannelQuery> m_p1, m_p2;
259 class iDVBChannelList: public iObject
262 virtual RESULT addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm)=0;
263 virtual RESULT removeChannel(const eDVBChannelID &id)=0;
265 virtual RESULT getChannelFrontendData(const eDVBChannelID &id, ePtr<iDVBFrontendParameters> &parm)=0;
267 virtual RESULT addService(const eServiceReferenceDVB &service, eDVBService *service)=0;
268 virtual RESULT getService(const eServiceReferenceDVB &reference, ePtr<eDVBService> &service)=0;
270 virtual RESULT getBouquet(const eServiceReference &ref, eBouquet* &bouquet)=0;
272 virtual RESULT startQuery(ePtr<iDVBChannelListQuery> &query, eDVBChannelQuery *query, const eServiceReference &source)=0;
275 class SatelliteDeliverySystemDescriptor;
276 class CableDeliverySystemDescriptor;
277 class TerrestrialDeliverySystemDescriptor;
279 struct eDVBFrontendParametersSatellite
284 Horizontal, Vertical, CircularLeft, CircularRight
296 fNone, f1_2, f2_3, f3_4, f5_6, f7_8, fAuto
299 unsigned int frequency, symbol_rate;
300 int polarisation, fec, inversion, orbital_position;
302 void set(const SatelliteDeliverySystemDescriptor &);
305 struct eDVBFrontendParametersCable
307 unsigned int frequency, symbol_rate;
308 int modulation, inversion, fec_inner;
309 void set(const CableDeliverySystemDescriptor &);
312 struct eDVBFrontendParametersTerrestrial
314 unsigned int frequency;
316 enum { Bw8MHz, Bw7MHz, Bw6MHz, BwAuto };
322 fNone, f1_2, f2_3, f3_4, f5_6, f7_8, fAuto
326 struct TransmissionMode {
332 struct GuardInterval {
334 GI_1_32, GI_1_16, GI_1_8, GI_1_4, GI_Auto
340 HNone, H1, H2, H4, HAuto
358 int code_rate_HP, code_rate_LP;
360 int transmission_mode;
365 void set(const TerrestrialDeliverySystemDescriptor &);
368 class iDVBFrontendParameters: public iObject
371 virtual RESULT getSystem(int &type) const = 0;
372 virtual RESULT getDVBS(eDVBFrontendParametersSatellite &p) const = 0;
373 virtual RESULT getDVBC(eDVBFrontendParametersCable &p) const = 0;
374 virtual RESULT getDVBT(eDVBFrontendParametersTerrestrial &p) const = 0;
376 virtual RESULT calculateDifference(const iDVBFrontendParameters *parm, int &diff) const = 0;
377 virtual RESULT getHash(unsigned long &hash) const = 0;
380 #define MAX_DISEQC_LENGTH 16
382 class eDVBDiseqcCommand
386 __u8 data[MAX_DISEQC_LENGTH];
387 #if HAVE_DVB_API_VERSION < 3
393 class iDVBSatelliteEquipmentControl;
394 class eSecCommandList;
396 class iDVBFrontend: public iObject
400 feSatellite, feCable, feTerrestrial
402 virtual RESULT getFrontendType(int &type)=0;
403 virtual RESULT tune(const iDVBFrontendParameters &where)=0;
404 virtual RESULT connectStateChange(const Slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection)=0;
412 virtual RESULT getState(int &state)=0;
416 virtual RESULT setTone(int tone)=0;
418 voltageOff, voltage13, voltage18
420 virtual RESULT setVoltage(int voltage)=0;
421 virtual RESULT sendDiseqc(const eDVBDiseqcCommand &diseqc)=0;
422 virtual RESULT sendToneburst(int burst)=0;
423 virtual RESULT setSEC(iDVBSatelliteEquipmentControl *sec)=0;
424 virtual RESULT setSecSequence(const eSecCommandList &list)=0;
425 virtual RESULT getData(int num, int &data)=0;
426 virtual RESULT setData(int num, int val)=0;
429 class iDVBSatelliteEquipmentControl: public iObject
432 virtual RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, eDVBFrontendParametersSatellite &sat)=0;
440 class iDVBChannel: public iObject
445 state_idle, /* not yet tuned */
446 state_tuning, /* currently tuning (first time) */
447 state_failed, /* tuning failed. */
448 state_unavailable, /* currently unavailable, will be back without further interaction */
450 state_release /* channel is being shut down. */
452 virtual RESULT connectStateChange(const Slot1<void,iDVBChannel*> &stateChange, ePtr<eConnection> &connection)=0;
453 virtual RESULT getState(int &state)=0;
455 /* demux capabilities */
461 virtual RESULT setCIRouting(const eDVBCIRouting &routing)=0;
462 virtual RESULT getDemux(ePtr<iDVBDemux> &demux, int cap=0)=0;
464 /* direct frontend access for raw channels and/or status inquiries. */
465 virtual RESULT getFrontend(ePtr<iDVBFrontend> &frontend)=0;
467 /* use count handling */
468 virtual void AddUse() = 0;
469 virtual void ReleaseUse() = 0;
472 typedef unsigned long long pts_t;
474 class iDVBPVRChannel: public iDVBChannel
479 state_eof = state_release + 1 /* end-of-file reached. */
482 /* FIXME: there are some very ugly buffer-end and ... related problems */
483 /* so this is VERY UGLY. */
484 virtual RESULT playFile(const char *file) = 0;
486 virtual RESULT getLength(pts_t &pts) = 0;
487 virtual RESULT getCurrentPosition(pts_t &pos) = 0;
488 virtual RESULT seekTo(pts_t &pts) = 0;
489 virtual RESULT seekToPosition(int relative, const off_t &pts) = 0;
492 class iDVBSectionReader;
493 class iDVBTSRecorder;
494 class iTSMPEGDecoder;
496 class iDVBDemux: public iObject
499 virtual RESULT createSectionReader(eMainloop *context, ePtr<iDVBSectionReader> &reader)=0;
500 virtual RESULT createTSRecorder(ePtr<iDVBTSRecorder> &recorder)=0;
501 virtual RESULT getMPEGDecoder(ePtr<iTSMPEGDecoder> &reader)=0;
502 virtual RESULT getSTC(pts_t &pts)=0;
503 virtual RESULT getCADemuxID(uint8_t &id)=0;
504 virtual RESULT flush()=0;
507 class iTSMPEGDecoder: public iObject
510 enum { pidDisabled = -1 };
511 /** Set Displayed Video PID */
512 virtual RESULT setVideoPID(int vpid)=0;
514 enum { af_MPEG, af_AC3, af_DTS };
515 /** Set Displayed Audio PID and type */
516 virtual RESULT setAudioPID(int apid, int type)=0;
518 /** Set Sync mode to PCR */
519 virtual RESULT setSyncPCR(int pcrpid)=0;
520 enum { sm_Audio, sm_Video };
521 /** Set Sync mode to either audio or video master */
522 virtual RESULT setSyncMaster(int who)=0;
524 /** Apply settings */
525 virtual RESULT start()=0;
527 /** Freeze frame. Either continue decoding (without display) or halt. */
528 virtual RESULT freeze(int cont)=0;
529 /** Continue after freeze. */
530 virtual RESULT unfreeze()=0;
532 // stop on .. Picture
533 enum { spm_I, spm_Ref, spm_Any };
534 /** Stop on specific decoded picture. For I-Frame display. */
535 virtual RESULT setSinglePictureMode(int when)=0;
537 enum { pkm_B, pkm_PB };
538 /** Fast forward by skipping either B or P/B pictures */
539 virtual RESULT setPictureSkipMode(int what)=0;
541 /** Slow Motion by repeating pictures */
542 virtual RESULT setSlowMotion(int repeat)=0;
544 enum { zoom_Normal, zoom_PanScan, zoom_Letterbox, zoom_Fullscreen };
545 /** Set Zoom. mode *must* be fitting. */
546 virtual RESULT setZoom(int what)=0;