Add flag to services so we can mark services as dedicated 3D
[openblackhole/openblackhole-enigma2.git] / lib / dvb / idvb.h
1 #ifndef __dvb_idvb_h
2 #define __dvb_idvb_h
3
4 #ifndef SWIG
5
6 #include <linux/dvb/frontend.h>
7 #include <linux/dvb/video.h>
8 #include <lib/base/object.h>
9 #include <lib/base/ebase.h>
10 #include <lib/base/elock.h>
11 #include <lib/base/itssource.h>
12 #include <lib/service/service.h>
13 #include <libsig_comp.h>
14 #include <connection.h>
15
16 #define CAID_LIST std::list<uint16_t>
17
18 #ifndef DMX_FILTER_SIZE
19 #define DMX_FILTER_SIZE   16
20 #endif
21
22 struct eDVBSectionFilterMask
23 {
24         int pid;
25                 /* mode is 0 for positive, 1 for negative filtering */
26         uint8_t data[DMX_FILTER_SIZE], mask[DMX_FILTER_SIZE], mode[DMX_FILTER_SIZE];
27         enum
28         {
29                 rfCRC=1,
30                 rfNoAbort=2
31         };
32         int flags;
33 };
34
35 struct eDVBTableSpec
36 {
37         int pid, tid, tidext, tid_mask, tidext_mask;
38         int version;
39         int timeout;        /* timeout in ms */
40         enum
41         {
42                 tfInOrder               = 1,
43                 /*
44                         tfAnyVersion      filter ANY version
45                         0                 filter all EXCEPT given version (negative filtering)
46                         tfThisVersion     filter only THIS version
47                 */
48                 tfAnyVersion    = 2,
49                 tfThisVersion   = 4,
50                 tfHaveTID               = 8,
51                 tfHaveTIDExt    = 16,
52                 tfCheckCRC              = 32,
53                 tfHaveTimeout   = 64,
54                 tfHaveTIDMask   = 128,
55                 tfHaveTIDExtMask= 256
56         };
57         int flags;
58 };
59
60 struct eBouquet
61 {
62         std::string m_bouquet_name;
63         std::string m_filename;  // without path.. just name
64         typedef std::list<eServiceReference> list;
65         list m_services;
66 // the following five methods are implemented in db.cpp
67         RESULT flushChanges();
68         RESULT addService(const eServiceReference &, eServiceReference before=eServiceReference());
69         RESULT removeService(const eServiceReference &, bool renameBouquet=true);
70         RESULT moveService(const eServiceReference &, unsigned int);
71         RESULT setListName(const std::string &name);
72 };
73
74 /* these structures have by intention no operator int() defined.
75         the reason of these structures is to avoid mixing for example
76         a onid and a tsid (as there's no general order for them).
77
78         defining an operator int() would implicitely convert values
79         between them over the constructor with the int argument.
80
81         'explicit' doesn't here - eTransportStreamID(eOriginalNetworkID(n))
82         would still work. */
83
84 struct eTransportStreamID
85 {
86 private:
87         int v;
88 public:
89         int get() const { return v; }
90         eTransportStreamID(int i): v(i) { }
91         eTransportStreamID(): v(-1) { }
92         bool operator == (const eTransportStreamID &c) const { return v == c.v; }
93         bool operator != (const eTransportStreamID &c) const { return v != c.v; }
94         bool operator < (const eTransportStreamID &c) const { return v < c.v; }
95         bool operator > (const eTransportStreamID &c) const { return v > c.v; }
96 };
97
98 struct eServiceID
99 {
100 private:
101         int v;
102 public:
103         int get() const { return v; }
104         eServiceID(int i): v(i) { }
105         eServiceID(): v(-1) { }
106         bool operator == (const eServiceID &c) const { return v == c.v; }
107         bool operator != (const eServiceID &c) const { return v != c.v; }
108         bool operator < (const eServiceID &c) const { return v < c.v; }
109         bool operator > (const eServiceID &c) const { return v > c.v; }
110 };
111
112 struct eOriginalNetworkID
113 {
114 private:
115         int v;
116 public:
117         int get() const { return v; }
118         eOriginalNetworkID(int i): v(i) { }
119         eOriginalNetworkID(): v(-1) { }
120         bool operator == (const eOriginalNetworkID &c) const { return v == c.v; }
121         bool operator != (const eOriginalNetworkID &c) const { return v != c.v; }
122         bool operator < (const eOriginalNetworkID &c) const { return v < c.v; }
123         bool operator > (const eOriginalNetworkID &c) const { return v > c.v; }
124 };
125
126 struct eDVBNamespace
127 {
128 private:
129         int v;
130 public:
131         int get() const { return v; }
132         eDVBNamespace(int i): v(i) { }
133         eDVBNamespace(): v(-1) { }
134         bool operator == (const eDVBNamespace &c) const { return v == c.v; }
135         bool operator != (const eDVBNamespace &c) const { return v != c.v; }
136         bool operator < (const eDVBNamespace &c) const { return v < c.v; }
137         bool operator > (const eDVBNamespace &c) const { return v > c.v; }
138 };
139
140 struct eDVBChannelID
141 {
142         eDVBNamespace dvbnamespace;
143         eTransportStreamID transport_stream_id;
144         eOriginalNetworkID original_network_id;
145
146         bool operator==(const eDVBChannelID &c) const
147         {
148                 return dvbnamespace == c.dvbnamespace &&
149                         transport_stream_id == c.transport_stream_id &&
150                         original_network_id == c.original_network_id;
151         }
152
153         bool operator<(const eDVBChannelID &c) const
154         {
155                 if (dvbnamespace < c.dvbnamespace)
156                         return 1;
157                 else if (dvbnamespace == c.dvbnamespace)
158                 {
159                         if (original_network_id < c.original_network_id)
160                                 return 1;
161                         else if (original_network_id == c.original_network_id)
162                                 if (transport_stream_id < c.transport_stream_id)
163                                         return 1;
164                 }
165                 return 0;
166         }
167         eDVBChannelID(eDVBNamespace dvbnamespace, eTransportStreamID tsid, eOriginalNetworkID onid):
168                         dvbnamespace(dvbnamespace), transport_stream_id(tsid), original_network_id(onid)
169         {
170         }
171         eDVBChannelID():
172                         dvbnamespace(-1), transport_stream_id(-1), original_network_id(-1)
173         {
174         }
175         operator bool() const
176         {
177                 return (dvbnamespace != -1) && (transport_stream_id != -1) && (original_network_id != -1);
178         }
179 };
180
181 class eServiceReferenceDVB: public eServiceReference
182 {
183 public:
184         enum service_ref
185         {
186                 ref_service_type= 0,
187                 ref_service_id  = 1,
188
189         };
190
191         int getServiceType() const { return data[ref_service_type]; }
192         void setServiceType(int service_type) { data[ref_service_type]=service_type; }
193
194         eServiceID getServiceID() const { return eServiceID(data[ref_service_id]); }
195         void setServiceID(eServiceID service_id) { data[ref_service_id]=service_id.get(); }
196
197         eTransportStreamID getTransportStreamID() const { return eTransportStreamID(data[2]); }
198         void setTransportStreamID(eTransportStreamID transport_stream_id) { data[2]=transport_stream_id.get(); }
199
200         eOriginalNetworkID getOriginalNetworkID() const { return eOriginalNetworkID(data[3]); }
201         void setOriginalNetworkID(eOriginalNetworkID original_network_id) { data[3]=original_network_id.get(); }
202
203         eDVBNamespace getDVBNamespace() const { return eDVBNamespace(data[4]); }
204         void setDVBNamespace(eDVBNamespace dvbnamespace) { data[4]=dvbnamespace.get(); }
205
206         eServiceID getParentServiceID() const { return eServiceID(data[5]); }
207         void setParentServiceID( eServiceID sid ) { data[5]=sid.get(); }
208
209         eTransportStreamID getParentTransportStreamID() const { return eTransportStreamID(data[6]); }
210         void setParentTransportStreamID( eTransportStreamID tsid ) { data[6]=tsid.get(); }
211
212         eServiceReferenceDVB getParentServiceReference() const
213         {
214                 eServiceReferenceDVB tmp(*this);
215                 if (data[5] && data[6])
216                 {
217                         tmp.data[1] = data[5];
218                         tmp.data[2] = data[6];
219                         tmp.data[5] = tmp.data[6] = 0;
220                 }
221                 else
222                         tmp.type = idInvalid;
223                 return tmp;
224         }
225
226         eServiceReferenceDVB(eDVBNamespace dvbnamespace, eTransportStreamID transport_stream_id, eOriginalNetworkID original_network_id, eServiceID service_id, int service_type)
227                 :eServiceReference(eServiceReference::idDVB, 0)
228         {
229                 setTransportStreamID(transport_stream_id);
230                 setOriginalNetworkID(original_network_id);
231                 setDVBNamespace(dvbnamespace);
232                 setServiceID(service_id);
233                 setServiceType(service_type);
234         }
235
236         void set(const eDVBChannelID &chid)
237         {
238                 setDVBNamespace(chid.dvbnamespace);
239                 setOriginalNetworkID(chid.original_network_id);
240                 setTransportStreamID(chid.transport_stream_id);
241         }
242
243         void getChannelID(eDVBChannelID &chid) const
244         {
245                 chid = eDVBChannelID(getDVBNamespace(), getTransportStreamID(), getOriginalNetworkID());
246         }
247
248         eServiceReferenceDVB()
249                 :eServiceReference(eServiceReference::idDVB, 0)
250         {
251         }
252
253         eServiceReferenceDVB(const std::string &string)
254                 :eServiceReference(string)
255         {
256         }
257 };
258
259
260 ////////////////// TODO: we need an interface here, but what exactly?
261
262 #include <set>
263 // btw, still implemented in db.cpp. FIX THIS, TOO.
264
265 class eDVBChannelQuery;
266
267 class eDVBService: public iStaticServiceInformation
268 {
269         DECLARE_REF(eDVBService);
270         int *m_cache;
271         void initCache();
272         void copyCache(int *source);
273 public:
274         enum cacheID
275         {
276                 cVPID, cMPEGAPID, cTPID, cPCRPID, cAC3PID,
277                 cVTYPE, cACHANNEL, cAC3DELAY, cPCMDELAY,
278                 cSUBTITLE, cAACHEAPID=12, cDDPPID, cacheMax
279         };
280
281         int getCacheEntry(cacheID);
282         void setCacheEntry(cacheID, int);
283
284         bool cacheEmpty();
285
286         eDVBService();
287                 /* m_service_name_sort is uppercase, with special chars removed, to increase sort performance. */
288         std::string m_service_name, m_service_name_sort;
289         std::string m_provider_name;
290
291         void genSortName();
292
293         int m_flags;
294         enum
295         {
296                 dxNoSDT=1,    // don't get SDT
297                 dxDontshow=2,
298                 dxNoDVB=4,  // dont use PMT for this service ( use cached pids )
299                 dxHoldName=8,
300                 dxNewFound=64,
301                 dxIsDedicated3D=128,
302         };
303
304         bool usePMT() const { return !(m_flags & dxNoDVB); }
305         bool isHidden() const { return m_flags & dxDontshow; }
306         bool isDedicated3D() const { return m_flags & dxIsDedicated3D; }
307
308         CAID_LIST m_ca;
309
310         virtual ~eDVBService();
311
312         eDVBService &operator=(const eDVBService &);
313
314         // iStaticServiceInformation
315         RESULT getName(const eServiceReference &ref, std::string &name);
316         RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time);
317         bool isCrypted();
318         int isPlayable(const eServiceReference &ref, const eServiceReference &ignore, bool simulate=false);
319         ePtr<iDVBTransponderData> getTransponderData(const eServiceReference &ref);
320
321                 /* for filtering: */
322         int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query);
323 };
324
325 //////////////////
326
327 class iDVBChannel;
328 class iDVBDemux;
329 class iDVBFrontendParameters;
330
331 class iDVBChannelListQuery: public iObject
332 {
333 public:
334         virtual RESULT getNextResult(eServiceReferenceDVB &ref)=0;
335         virtual int compareLessEqual(const eServiceReferenceDVB &a, const eServiceReferenceDVB &b)=0;
336 };
337
338 class eDVBChannelQuery: public iObject
339 {
340         DECLARE_REF(eDVBChannelQuery);
341 public:
342         enum
343         {
344                 tName,
345                 tProvider,
346                 tType,
347                 tBouquet,
348                 tSatellitePosition,
349                 tChannelID,
350                 tAND,
351                 tOR,
352                 tAny,
353                 tFlags
354         };
355
356         int m_type;
357         int m_inverse;
358
359         std::string m_string;
360         int m_int;
361         eDVBChannelID m_channelid;
362
363                 /* sort is only valid in root, and must be from the enum above. */
364         int m_sort;
365         std::string m_bouquet_name;
366
367         static RESULT compile(ePtr<eDVBChannelQuery> &res, std::string query);
368
369         ePtr<eDVBChannelQuery> m_p1, m_p2;
370 };
371
372 class iDVBChannelList: public iObject
373 {
374 public:
375         virtual RESULT removeService(const eServiceReference &service)=0;
376         virtual RESULT removeServices(eDVBChannelID chid=eDVBChannelID(), unsigned int orb_pos=0xFFFFFFFF)=0;
377         virtual RESULT removeServices(int dvb_namespace=-1, int tsid=-1, int onid=-1, unsigned int orb_pos=0xFFFFFFFF)=0;
378         virtual RESULT removeServices(iDVBFrontendParameters *feparm)=0;
379         virtual RESULT addFlag(const eServiceReference &service, unsigned int flagmask=0xFFFFFFFF)=0;
380         virtual RESULT removeFlag(const eServiceReference &service, unsigned int flagmask=0xFFFFFFFF)=0;
381         virtual RESULT removeFlags(unsigned int flagmask, eDVBChannelID chid=eDVBChannelID(), unsigned int orb_pos=0xFFFFFFFF)=0;
382         virtual RESULT removeFlags(unsigned int flagmask, int dvb_namespace=-1, int tsid=-1, int onid=-1, unsigned int orb_pos=0xFFFFFFFF)=0;
383         virtual RESULT addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm)=0;
384         virtual RESULT removeChannel(const eDVBChannelID &id)=0;
385
386         virtual RESULT getChannelFrontendData(const eDVBChannelID &id, ePtr<iDVBFrontendParameters> &parm)=0;
387
388         virtual RESULT addService(const eServiceReferenceDVB &reference, eDVBService *service)=0;
389         virtual RESULT getService(const eServiceReferenceDVB &reference, ePtr<eDVBService> &service)=0;
390         virtual RESULT flush()=0;
391
392         virtual RESULT getBouquet(const eServiceReference &ref,  eBouquet* &bouquet)=0;
393
394         virtual RESULT startQuery(ePtr<iDVBChannelListQuery> &query, eDVBChannelQuery *q, const eServiceReference &source)=0;
395 };
396
397 #endif  // SWIG
398
399 class eDVBFrontendParametersSatellite;
400 class eDVBFrontendParametersCable;
401 class eDVBFrontendParametersTerrestrial;
402 class eDVBFrontendParametersATSC;
403
404 class iDVBFrontendParameters: public iObject
405 {
406 #ifdef SWIG
407         iDVBFrontendParameters();
408         ~iDVBFrontendParameters();
409 #endif
410 public:
411         enum { flagOnlyFree = 1 };
412         virtual SWIG_VOID(RESULT) getSystem(int &SWIG_OUTPUT) const = 0;
413         virtual SWIG_VOID(RESULT) getDVBS(eDVBFrontendParametersSatellite &SWIG_OUTPUT) const = 0;
414         virtual SWIG_VOID(RESULT) getDVBC(eDVBFrontendParametersCable &SWIG_OUTPUT) const = 0;
415         virtual SWIG_VOID(RESULT) getDVBT(eDVBFrontendParametersTerrestrial &SWIG_OUTPUT) const = 0;
416         virtual SWIG_VOID(RESULT) getATSC(eDVBFrontendParametersATSC &SWIG_OUTPUT) const = 0;
417         virtual SWIG_VOID(RESULT) getFlags(unsigned int &SWIG_OUTPUT) const = 0;
418 #ifndef SWIG
419         virtual SWIG_VOID(RESULT) calculateDifference(const iDVBFrontendParameters *parm, int &, bool exact) const = 0;
420         virtual SWIG_VOID(RESULT) getHash(unsigned long &) const = 0;
421         virtual SWIG_VOID(RESULT) calcLockTimeout(unsigned int &) const = 0;
422 #endif
423 };
424 SWIG_TEMPLATE_TYPEDEF(ePtr<iDVBFrontendParameters>, iDVBFrontendParametersPtr);
425
426 #define MAX_DISEQC_LENGTH  16
427
428 class eDVBDiseqcCommand
429 {
430 #ifndef SWIG
431 public:
432 #endif
433         int len;
434         uint8_t data[MAX_DISEQC_LENGTH];
435 #ifdef SWIG
436 public:
437 #endif
438         void setCommandString(const char *str);
439 };
440
441 class iDVBSatelliteEquipmentControl;
442 class eSecCommandList;
443
444 class iDVBFrontend_ENUMS
445 {
446 #ifdef SWIG
447         iDVBFrontend_ENUMS();
448         ~iDVBFrontend_ENUMS();
449 #endif
450 public:
451         enum { feSatellite, feCable, feTerrestrial, feATSC };
452         enum { stateIdle, stateTuning, stateFailed, stateLock, stateLostLock, stateClosed };
453         enum { toneOff, toneOn };
454         enum { voltageOff, voltage13, voltage18, voltage13_5, voltage18_5 };
455 };
456
457 class iDVBFrontendStatus:  public iDVBFrontend_ENUMS, public iObject
458 {
459 public:
460         virtual int getState() const = 0;
461         virtual std::string getStateDescription() const = 0;
462         virtual int getLocked() const = 0;
463         virtual int getSynced() const = 0;
464         virtual int getBER() const = 0;
465         virtual int getSNR() const = 0;
466         virtual int getSNRdB() const = 0;
467         virtual int getSignalPower() const = 0;
468 };
469
470 class iDVBTransponderData: public iObject
471 {
472 public:
473         virtual std::string getTunerType() const = 0;
474         virtual int getInversion() const = 0;
475         virtual unsigned int getFrequency() const = 0;
476         virtual unsigned int getSymbolRate() const = 0;
477         virtual int getOrbitalPosition() const = 0;
478         virtual int getFecInner() const = 0;
479         virtual int getModulation() const = 0;
480         virtual int getPolarization() const = 0;
481         virtual int getRolloff() const = 0;
482         virtual int getPilot() const = 0;
483         virtual int getSystem() const = 0;
484         virtual int getBandwidth() const = 0;
485         virtual int getCodeRateLp() const = 0;
486         virtual int getCodeRateHp() const = 0;
487         virtual int getConstellation() const = 0;
488         virtual int getTransmissionMode() const = 0;
489         virtual int getGuardInterval() const = 0;
490         virtual int getHierarchyInformation() const = 0;
491         virtual int getPlpId() const = 0;
492 };
493
494 class iDVBFrontendData: public iDVBFrontend_ENUMS, public iObject
495 {
496 public:
497         virtual int getNumber() const = 0;
498         virtual std::string getTypeDescription() const = 0;
499 };
500
501 class iDVBFrontend: public iDVBFrontend_ENUMS, public iObject
502 {
503 public:
504         virtual RESULT tune(const iDVBFrontendParameters &where)=0;
505         virtual int closeFrontend(bool force = false, bool no_delayed = false)=0;
506         virtual void reopenFrontend()=0;
507 #ifndef SWIG
508         virtual RESULT connectStateChange(const Slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection)=0;
509 #endif
510         virtual RESULT getState(int &SWIG_OUTPUT)=0;
511         virtual RESULT setTone(int tone)=0;
512         virtual RESULT setVoltage(int voltage)=0;
513         virtual RESULT sendDiseqc(const eDVBDiseqcCommand &diseqc)=0;
514         virtual RESULT sendToneburst(int burst)=0;
515 #ifndef SWIG
516         virtual RESULT setSEC(iDVBSatelliteEquipmentControl *sec)=0;
517         virtual RESULT setSecSequence(eSecCommandList &list)=0;
518 #endif
519         virtual int readFrontendData(int type)=0;
520         virtual void getFrontendStatus(ePtr<iDVBFrontendStatus> &dest)=0;
521         virtual void getTransponderData(ePtr<iDVBTransponderData> &dest, bool original)=0;
522         virtual void getFrontendData(ePtr<iDVBFrontendData> &dest)=0;
523 #ifndef SWIG
524         virtual RESULT getData(int num, long &data)=0;
525         virtual RESULT setData(int num, long val)=0;
526                 /* 0 means: not compatible. other values are a priority. */
527         virtual int isCompatibleWith(ePtr<iDVBFrontendParameters> &feparm)=0;
528 #endif
529 };
530 SWIG_TEMPLATE_TYPEDEF(ePtr<iDVBFrontend>, iDVBFrontendPtr);
531
532 #ifndef SWIG
533 class iDVBSatelliteEquipmentControl: public iObject
534 {
535 public:
536         virtual RESULT prepare(iDVBFrontend &frontend, const eDVBFrontendParametersSatellite &sat, int &frequency, int frontend_id, unsigned int timeout)=0;
537         virtual void prepareTurnOffSatCR(iDVBFrontend &frontend, int satcr)=0;
538         virtual int canTune(const eDVBFrontendParametersSatellite &feparm, iDVBFrontend *fe, int frontend_id, int *highest_score_lnb=0)=0;
539         virtual void setRotorMoving(int slotid, bool)=0;
540 };
541
542 struct eDVBCIRouting
543 {
544         int enabled;
545 };
546 #endif // SWIG
547
548 SWIG_IGNORE(iDVBChannel);
549 class iDVBChannel: public iObject
550 {
551 public:
552                 /* direct frontend access for raw channels and/or status inquiries. */
553         virtual SWIG_VOID(RESULT) getFrontend(ePtr<iDVBFrontend> &SWIG_OUTPUT)=0;
554         virtual RESULT requestTsidOnid() { return -1; }
555         PSignal2<void, int, int> receivedTsidOnid;
556         virtual int reserveDemux() { return -1; }
557 #ifndef SWIG
558         enum
559         {
560                 state_idle,        /* not yet tuned */
561                 state_tuning,      /* currently tuning (first time) */
562                 state_failed,      /* tuning failed. */
563                 state_unavailable, /* currently unavailable, will be back without further interaction */
564                 state_ok,          /* ok */
565                 state_last_instance, /* just one reference to this channel is left */
566                 state_release      /* channel is being shut down. */
567         };
568         virtual RESULT getState(int &)=0;
569
570         virtual RESULT getCurrentFrontendParameters(ePtr<iDVBFrontendParameters> &)=0;
571         enum
572         {
573                 evtPreStart, evtEOF, evtSOF, evtFailed, evtStopped
574         };
575         virtual RESULT connectStateChange(const Slot1<void,iDVBChannel*> &stateChange, ePtr<eConnection> &connection)=0;
576         virtual RESULT connectEvent(const Slot2<void,iDVBChannel*,int> &eventChange, ePtr<eConnection> &connection)=0;
577
578                 /* demux capabilities */
579         enum
580         {
581                 capDecode = 1,
582                 /* capCI = 2 */
583         };
584         virtual RESULT setCIRouting(const eDVBCIRouting &routing)=0;
585         virtual RESULT getDemux(ePtr<iDVBDemux> &demux, int cap=0)=0;
586
587                 /* use count handling */
588         virtual void AddUse() = 0;
589         virtual void ReleaseUse() = 0;
590 #endif
591 };
592 SWIG_TEMPLATE_TYPEDEF(eUsePtr<iDVBChannel>, iDVBChannelPtr);
593
594 #ifndef SWIG
595         /* signed, so we can express deltas. */
596
597 typedef long long pts_t;
598
599 class iFilePushScatterGather;
600 class iTSMPEGDecoder;
601
602         /* note that a cue sheet describes the logical positions. thus
603            everything is specified in pts and not file positions */
604
605         /* implemented in dvb.cpp */
606 class eCueSheet: public iObject, public Object
607 {
608         DECLARE_REF(eCueSheet);
609 public:
610         eCueSheet();
611
612                         /* frontend */
613         void seekTo(int relative, const pts_t &pts);
614
615         void clear();
616         void addSourceSpan(const pts_t &begin, const pts_t &end);
617         void commitSpans();
618
619         void setSkipmode(const pts_t &ratio); /* 90000 is 1:1 */
620         void setDecodingDemux(iDVBDemux *demux, iTSMPEGDecoder *decoder);
621
622                         /* frontend and backend */
623         eRdWrLock m_lock;
624
625                         /* backend */
626         enum { evtSeek, evtSkipmode, evtSpanChanged };
627         RESULT connectEvent(const Slot1<void, int> &event, ePtr<eConnection> &connection);
628
629         std::list<std::pair<pts_t,pts_t> > m_spans;     /* begin, end */
630         std::list<std::pair<int, pts_t> > m_seek_requests; /* relative, delta */
631         pts_t m_skipmode_ratio;
632         Signal1<void,int> m_event;
633         ePtr<iDVBDemux> m_decoding_demux;
634         ePtr<iTSMPEGDecoder> m_decoder;
635 };
636
637 class iDVBPVRChannel: public iDVBChannel
638 {
639 public:
640         enum
641         {
642                 state_eof = state_release + 1  /* end-of-file reached. */
643         };
644
645         virtual RESULT playFile(const char *file) = 0;
646         virtual RESULT playSource(ePtr<iTsSource> &source, const char *priv=NULL) = 0;
647         virtual void stop() = 0;
648
649         virtual void setCueSheet(eCueSheet *cuesheet) = 0;
650         virtual void setOfflineDecodeMode(int parityswitchdelay) = 0;
651
652         virtual RESULT getLength(pts_t &pts) = 0;
653
654                 /* we explicitely ask for the decoding demux here because a channel
655                    can be shared between multiple decoders.
656                 */
657         virtual RESULT getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, int mode) = 0;
658                 /* skipping must be done with a cue sheet */
659 };
660
661 class iDVBSectionReader;
662 class iDVBPESReader;
663 class iDVBTSRecorder;
664 class iTSMPEGDecoder;
665
666 class iDVBDemux: public iObject
667 {
668 public:
669         virtual RESULT createSectionReader(eMainloop *context, ePtr<iDVBSectionReader> &reader)=0;
670         virtual RESULT createPESReader(eMainloop *context, ePtr<iDVBPESReader> &reader)=0;
671         virtual RESULT createTSRecorder(ePtr<iDVBTSRecorder> &recorder, int packetsize = 188, bool streaming=false)=0;
672         virtual RESULT getMPEGDecoder(ePtr<iTSMPEGDecoder> &reader, int index = 0)=0;
673         virtual RESULT getSTC(pts_t &pts, int num=0)=0;
674         virtual RESULT getCADemuxID(uint8_t &id)=0;
675         virtual RESULT getCAAdapterID(uint8_t &id)=0;
676         virtual RESULT flush()=0;
677         virtual int openDVR(int flags)=0;
678 };
679
680 class iTSMPEGDecoder: public iObject
681 {
682 public:
683         enum { pidDisabled = -1 };
684                 /** Set Displayed Video PID and type */
685         virtual RESULT setVideoPID(int vpid, int type)=0;
686
687         enum { af_MPEG, af_AC3, af_DTS, af_AAC, af_DTSHD };
688                 /** Set Displayed Audio PID and type */
689         virtual RESULT setAudioPID(int apid, int type)=0;
690
691         enum { ac_left, ac_stereo, ac_right };
692                 /** Set Displayed Audio Channel */
693         virtual RESULT setAudioChannel(int channel)=0;
694         virtual int getAudioChannel()=0;
695
696         virtual RESULT setPCMDelay(int delay)=0;
697         virtual int getPCMDelay()=0;
698         virtual RESULT setAC3Delay(int delay)=0;
699         virtual int getAC3Delay()=0;
700
701                 /** Set Displayed Videotext PID */
702         virtual RESULT setTextPID(int vpid)=0;
703
704                 /** Set Sync mode to PCR */
705         virtual RESULT setSyncPCR(int pcrpid)=0;
706         enum { sm_Audio, sm_Video };
707                 /** Set Sync mode to either audio or video master */
708         virtual RESULT setSyncMaster(int who)=0;
709
710                 /** Apply settings but don't change state */
711         virtual RESULT set()=0;
712                 /* all those apply settings, then transition to the given state */
713
714                 /** play */
715         virtual RESULT play()=0;
716                 /** Freeze frame. */
717         virtual RESULT pause()=0;
718
719                 /** fast forward by skipping frames. 0 is disabled, 2 is twice-the-speed, ... */
720         virtual RESULT setFastForward(int skip=0)=0;
721
722                 /** Slow Motion by repeating pictures */
723         virtual RESULT setSlowMotion(int repeat)=0;
724
725                 /** Display any complete data as fast as possible */
726         virtual RESULT setTrickmode()=0;
727
728         virtual RESULT getPTS(int what, pts_t &pts) = 0;
729
730         virtual RESULT showSinglePic(const char *filename) = 0;
731
732         virtual RESULT setRadioPic(const std::string &filename) = 0;
733
734         struct videoEvent
735         {
736                 enum { eventUnknown = 0,
737                         eventSizeChanged = VIDEO_EVENT_SIZE_CHANGED,
738                         eventFrameRateChanged = VIDEO_EVENT_FRAME_RATE_CHANGED,
739                         eventProgressiveChanged = 16
740                 } type;
741                 unsigned char aspect;
742                 unsigned short height;
743                 unsigned short width;
744                 bool progressive;
745                 unsigned short framerate;
746         };
747
748         virtual RESULT connectVideoEvent(const Slot1<void, struct videoEvent> &event, ePtr<eConnection> &connection) = 0;
749
750         virtual int getVideoWidth() = 0;
751         virtual int getVideoHeight() = 0;
752         virtual int getVideoProgressive() = 0;
753         virtual int getVideoFrameRate() = 0;
754         virtual int getVideoAspect() = 0;
755 };
756
757 #endif //SWIG
758 #endif