4f2cfe04f848777400dcffbb5df95e9227483ea3
[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         };
302
303         bool usePMT() const { return !(m_flags & dxNoDVB); }
304         bool isHidden() const { return m_flags & dxDontshow; }
305
306         CAID_LIST m_ca;
307
308         virtual ~eDVBService();
309
310         eDVBService &operator=(const eDVBService &);
311
312         // iStaticServiceInformation
313         RESULT getName(const eServiceReference &ref, std::string &name);
314         RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time);
315         bool isCrypted();
316         int isPlayable(const eServiceReference &ref, const eServiceReference &ignore, bool simulate=false);
317         ePtr<iDVBTransponderData> getTransponderData(const eServiceReference &ref);
318
319                 /* for filtering: */
320         int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query);
321 };
322
323 //////////////////
324
325 class iDVBChannel;
326 class iDVBDemux;
327 class iDVBFrontendParameters;
328
329 class iDVBChannelListQuery: public iObject
330 {
331 public:
332         virtual RESULT getNextResult(eServiceReferenceDVB &ref)=0;
333         virtual int compareLessEqual(const eServiceReferenceDVB &a, const eServiceReferenceDVB &b)=0;
334 };
335
336 class eDVBChannelQuery: public iObject
337 {
338         DECLARE_REF(eDVBChannelQuery);
339 public:
340         enum
341         {
342                 tName,
343                 tProvider,
344                 tType,
345                 tBouquet,
346                 tSatellitePosition,
347                 tChannelID,
348                 tAND,
349                 tOR,
350                 tAny,
351                 tFlags
352         };
353
354         int m_type;
355         int m_inverse;
356
357         std::string m_string;
358         int m_int;
359         eDVBChannelID m_channelid;
360
361                 /* sort is only valid in root, and must be from the enum above. */
362         int m_sort;
363         std::string m_bouquet_name;
364
365         static RESULT compile(ePtr<eDVBChannelQuery> &res, std::string query);
366
367         ePtr<eDVBChannelQuery> m_p1, m_p2;
368 };
369
370 class iDVBChannelList: public iObject
371 {
372 public:
373         virtual RESULT removeService(const eServiceReference &service)=0;
374         virtual RESULT removeServices(eDVBChannelID chid=eDVBChannelID(), unsigned int orb_pos=0xFFFFFFFF)=0;
375         virtual RESULT removeServices(int dvb_namespace=-1, int tsid=-1, int onid=-1, unsigned int orb_pos=0xFFFFFFFF)=0;
376         virtual RESULT removeServices(iDVBFrontendParameters *feparm)=0;
377         virtual RESULT addFlag(const eServiceReference &service, unsigned int flagmask=0xFFFFFFFF)=0;
378         virtual RESULT removeFlag(const eServiceReference &service, unsigned int flagmask=0xFFFFFFFF)=0;
379         virtual RESULT removeFlags(unsigned int flagmask, eDVBChannelID chid=eDVBChannelID(), unsigned int orb_pos=0xFFFFFFFF)=0;
380         virtual RESULT removeFlags(unsigned int flagmask, int dvb_namespace=-1, int tsid=-1, int onid=-1, unsigned int orb_pos=0xFFFFFFFF)=0;
381         virtual RESULT addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm)=0;
382         virtual RESULT removeChannel(const eDVBChannelID &id)=0;
383
384         virtual RESULT getChannelFrontendData(const eDVBChannelID &id, ePtr<iDVBFrontendParameters> &parm)=0;
385
386         virtual RESULT addService(const eServiceReferenceDVB &reference, eDVBService *service)=0;
387         virtual RESULT getService(const eServiceReferenceDVB &reference, ePtr<eDVBService> &service)=0;
388         virtual RESULT flush()=0;
389
390         virtual RESULT getBouquet(const eServiceReference &ref,  eBouquet* &bouquet)=0;
391
392         virtual RESULT startQuery(ePtr<iDVBChannelListQuery> &query, eDVBChannelQuery *q, const eServiceReference &source)=0;
393 };
394
395 #endif  // SWIG
396
397 class eDVBFrontendParametersSatellite;
398 class eDVBFrontendParametersCable;
399 class eDVBFrontendParametersTerrestrial;
400 class eDVBFrontendParametersATSC;
401
402 class iDVBFrontendParameters: public iObject
403 {
404 #ifdef SWIG
405         iDVBFrontendParameters();
406         ~iDVBFrontendParameters();
407 #endif
408 public:
409         enum { flagOnlyFree = 1 };
410         virtual SWIG_VOID(RESULT) getSystem(int &SWIG_OUTPUT) const = 0;
411         virtual SWIG_VOID(RESULT) getDVBS(eDVBFrontendParametersSatellite &SWIG_OUTPUT) const = 0;
412         virtual SWIG_VOID(RESULT) getDVBC(eDVBFrontendParametersCable &SWIG_OUTPUT) const = 0;
413         virtual SWIG_VOID(RESULT) getDVBT(eDVBFrontendParametersTerrestrial &SWIG_OUTPUT) const = 0;
414         virtual SWIG_VOID(RESULT) getATSC(eDVBFrontendParametersATSC &SWIG_OUTPUT) const = 0;
415         virtual SWIG_VOID(RESULT) getFlags(unsigned int &SWIG_OUTPUT) const = 0;
416 #ifndef SWIG
417         virtual SWIG_VOID(RESULT) calculateDifference(const iDVBFrontendParameters *parm, int &, bool exact) const = 0;
418         virtual SWIG_VOID(RESULT) getHash(unsigned long &) const = 0;
419         virtual SWIG_VOID(RESULT) calcLockTimeout(unsigned int &) const = 0;
420 #endif
421 };
422 SWIG_TEMPLATE_TYPEDEF(ePtr<iDVBFrontendParameters>, iDVBFrontendParametersPtr);
423
424 #define MAX_DISEQC_LENGTH  16
425
426 class eDVBDiseqcCommand
427 {
428 #ifndef SWIG
429 public:
430 #endif
431         int len;
432         uint8_t data[MAX_DISEQC_LENGTH];
433 #ifdef SWIG
434 public:
435 #endif
436         void setCommandString(const char *str);
437 };
438
439 class iDVBSatelliteEquipmentControl;
440 class eSecCommandList;
441
442 class iDVBFrontend_ENUMS
443 {
444 #ifdef SWIG
445         iDVBFrontend_ENUMS();
446         ~iDVBFrontend_ENUMS();
447 #endif
448 public:
449         enum { feSatellite, feCable, feTerrestrial, feATSC };
450         enum { stateIdle, stateTuning, stateFailed, stateLock, stateLostLock, stateClosed };
451         enum { toneOff, toneOn };
452         enum { voltageOff, voltage13, voltage18, voltage13_5, voltage18_5 };
453 };
454
455 class iDVBFrontendStatus:  public iDVBFrontend_ENUMS, public iObject
456 {
457 public:
458         virtual int getState() const = 0;
459         virtual std::string getStateDescription() const = 0;
460         virtual int getLocked() const = 0;
461         virtual int getSynced() const = 0;
462         virtual int getBER() const = 0;
463         virtual int getSNR() const = 0;
464         virtual int getSNRdB() const = 0;
465         virtual int getSignalPower() const = 0;
466 };
467
468 class iDVBTransponderData: public iObject
469 {
470 public:
471         virtual std::string getTunerType() const = 0;
472         virtual int getInversion() const = 0;
473         virtual unsigned int getFrequency() const = 0;
474         virtual unsigned int getSymbolRate() const = 0;
475         virtual int getOrbitalPosition() const = 0;
476         virtual int getFecInner() const = 0;
477         virtual int getModulation() const = 0;
478         virtual int getPolarization() const = 0;
479         virtual int getRolloff() const = 0;
480         virtual int getPilot() const = 0;
481         virtual int getSystem() const = 0;
482         virtual int getBandwidth() const = 0;
483         virtual int getCodeRateLp() const = 0;
484         virtual int getCodeRateHp() const = 0;
485         virtual int getConstellation() const = 0;
486         virtual int getTransmissionMode() const = 0;
487         virtual int getGuardInterval() const = 0;
488         virtual int getHierarchyInformation() const = 0;
489         virtual int getPlpId() const = 0;
490 };
491
492 class iDVBFrontendData: public iDVBFrontend_ENUMS, public iObject
493 {
494 public:
495         virtual int getNumber() const = 0;
496         virtual std::string getTypeDescription() const = 0;
497 };
498
499 class iDVBFrontend: public iDVBFrontend_ENUMS, public iObject
500 {
501 public:
502         virtual RESULT tune(const iDVBFrontendParameters &where)=0;
503         virtual int closeFrontend(bool force = false, bool no_delayed = false)=0;
504         virtual void reopenFrontend()=0;
505 #ifndef SWIG
506         virtual RESULT connectStateChange(const Slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection)=0;
507 #endif
508         virtual RESULT getState(int &SWIG_OUTPUT)=0;
509         virtual RESULT setTone(int tone)=0;
510         virtual RESULT setVoltage(int voltage)=0;
511         virtual RESULT sendDiseqc(const eDVBDiseqcCommand &diseqc)=0;
512         virtual RESULT sendToneburst(int burst)=0;
513 #ifndef SWIG
514         virtual RESULT setSEC(iDVBSatelliteEquipmentControl *sec)=0;
515         virtual RESULT setSecSequence(eSecCommandList &list)=0;
516 #endif
517         virtual int readFrontendData(int type)=0;
518         virtual void getFrontendStatus(ePtr<iDVBFrontendStatus> &dest)=0;
519         virtual void getTransponderData(ePtr<iDVBTransponderData> &dest, bool original)=0;
520         virtual void getFrontendData(ePtr<iDVBFrontendData> &dest)=0;
521 #ifndef SWIG
522         virtual RESULT getData(int num, long &data)=0;
523         virtual RESULT setData(int num, long val)=0;
524                 /* 0 means: not compatible. other values are a priority. */
525         virtual int isCompatibleWith(ePtr<iDVBFrontendParameters> &feparm)=0;
526 #endif
527 };
528 SWIG_TEMPLATE_TYPEDEF(ePtr<iDVBFrontend>, iDVBFrontendPtr);
529
530 #ifndef SWIG
531 class iDVBSatelliteEquipmentControl: public iObject
532 {
533 public:
534         virtual RESULT prepare(iDVBFrontend &frontend, const eDVBFrontendParametersSatellite &sat, int &frequency, int frontend_id, unsigned int timeout)=0;
535         virtual void prepareTurnOffSatCR(iDVBFrontend &frontend, int satcr)=0;
536         virtual int canTune(const eDVBFrontendParametersSatellite &feparm, iDVBFrontend *fe, int frontend_id, int *highest_score_lnb=0)=0;
537         virtual void setRotorMoving(int slotid, bool)=0;
538 };
539
540 struct eDVBCIRouting
541 {
542         int enabled;
543 };
544 #endif // SWIG
545
546 SWIG_IGNORE(iDVBChannel);
547 class iDVBChannel: public iObject
548 {
549 public:
550                 /* direct frontend access for raw channels and/or status inquiries. */
551         virtual SWIG_VOID(RESULT) getFrontend(ePtr<iDVBFrontend> &SWIG_OUTPUT)=0;
552         virtual RESULT requestTsidOnid() { return -1; }
553         PSignal2<void, int, int> receivedTsidOnid;
554         virtual int reserveDemux() { return -1; }
555 #ifndef SWIG
556         enum
557         {
558                 state_idle,        /* not yet tuned */
559                 state_tuning,      /* currently tuning (first time) */
560                 state_failed,      /* tuning failed. */
561                 state_unavailable, /* currently unavailable, will be back without further interaction */
562                 state_ok,          /* ok */
563                 state_last_instance, /* just one reference to this channel is left */
564                 state_release      /* channel is being shut down. */
565         };
566         virtual RESULT getState(int &)=0;
567
568         virtual RESULT getCurrentFrontendParameters(ePtr<iDVBFrontendParameters> &)=0;
569         enum
570         {
571                 evtPreStart, evtEOF, evtSOF, evtFailed, evtStopped
572         };
573         virtual RESULT connectStateChange(const Slot1<void,iDVBChannel*> &stateChange, ePtr<eConnection> &connection)=0;
574         virtual RESULT connectEvent(const Slot2<void,iDVBChannel*,int> &eventChange, ePtr<eConnection> &connection)=0;
575
576                 /* demux capabilities */
577         enum
578         {
579                 capDecode = 1,
580                 /* capCI = 2 */
581         };
582         virtual RESULT setCIRouting(const eDVBCIRouting &routing)=0;
583         virtual RESULT getDemux(ePtr<iDVBDemux> &demux, int cap=0)=0;
584
585                 /* use count handling */
586         virtual void AddUse() = 0;
587         virtual void ReleaseUse() = 0;
588 #endif
589 };
590 SWIG_TEMPLATE_TYPEDEF(eUsePtr<iDVBChannel>, iDVBChannelPtr);
591
592 #ifndef SWIG
593         /* signed, so we can express deltas. */
594
595 typedef long long pts_t;
596
597 class iFilePushScatterGather;
598 class iTSMPEGDecoder;
599
600         /* note that a cue sheet describes the logical positions. thus
601            everything is specified in pts and not file positions */
602
603         /* implemented in dvb.cpp */
604 class eCueSheet: public iObject, public Object
605 {
606         DECLARE_REF(eCueSheet);
607 public:
608         eCueSheet();
609
610                         /* frontend */
611         void seekTo(int relative, const pts_t &pts);
612
613         void clear();
614         void addSourceSpan(const pts_t &begin, const pts_t &end);
615         void commitSpans();
616
617         void setSkipmode(const pts_t &ratio); /* 90000 is 1:1 */
618         void setDecodingDemux(iDVBDemux *demux, iTSMPEGDecoder *decoder);
619
620                         /* frontend and backend */
621         eRdWrLock m_lock;
622
623                         /* backend */
624         enum { evtSeek, evtSkipmode, evtSpanChanged };
625         RESULT connectEvent(const Slot1<void, int> &event, ePtr<eConnection> &connection);
626
627         std::list<std::pair<pts_t,pts_t> > m_spans;     /* begin, end */
628         std::list<std::pair<int, pts_t> > m_seek_requests; /* relative, delta */
629         pts_t m_skipmode_ratio;
630         Signal1<void,int> m_event;
631         ePtr<iDVBDemux> m_decoding_demux;
632         ePtr<iTSMPEGDecoder> m_decoder;
633 };
634
635 class iDVBPVRChannel: public iDVBChannel
636 {
637 public:
638         enum
639         {
640                 state_eof = state_release + 1  /* end-of-file reached. */
641         };
642
643         virtual RESULT playFile(const char *file) = 0;
644         virtual RESULT playSource(ePtr<iTsSource> &source, const char *priv=NULL) = 0;
645         virtual void stop() = 0;
646
647         virtual void setCueSheet(eCueSheet *cuesheet) = 0;
648         virtual void setOfflineDecodeMode(int parityswitchdelay) = 0;
649
650         virtual RESULT getLength(pts_t &pts) = 0;
651
652                 /* we explicitely ask for the decoding demux here because a channel
653                    can be shared between multiple decoders.
654                 */
655         virtual RESULT getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, int mode) = 0;
656                 /* skipping must be done with a cue sheet */
657 };
658
659 class iDVBSectionReader;
660 class iDVBPESReader;
661 class iDVBTSRecorder;
662 class iTSMPEGDecoder;
663
664 class iDVBDemux: public iObject
665 {
666 public:
667         virtual RESULT createSectionReader(eMainloop *context, ePtr<iDVBSectionReader> &reader)=0;
668         virtual RESULT createPESReader(eMainloop *context, ePtr<iDVBPESReader> &reader)=0;
669         virtual RESULT createTSRecorder(ePtr<iDVBTSRecorder> &recorder, int packetsize = 188, bool streaming=false)=0;
670         virtual RESULT getMPEGDecoder(ePtr<iTSMPEGDecoder> &reader, int index = 0)=0;
671         virtual RESULT getSTC(pts_t &pts, int num=0)=0;
672         virtual RESULT getCADemuxID(uint8_t &id)=0;
673         virtual RESULT getCAAdapterID(uint8_t &id)=0;
674         virtual RESULT flush()=0;
675         virtual int openDVR(int flags)=0;
676 };
677
678 class iTSMPEGDecoder: public iObject
679 {
680 public:
681         enum { pidDisabled = -1 };
682                 /** Set Displayed Video PID and type */
683         virtual RESULT setVideoPID(int vpid, int type)=0;
684
685         enum { af_MPEG, af_AC3, af_DTS, af_AAC, af_DTSHD };
686                 /** Set Displayed Audio PID and type */
687         virtual RESULT setAudioPID(int apid, int type)=0;
688
689         enum { ac_left, ac_stereo, ac_right };
690                 /** Set Displayed Audio Channel */
691         virtual RESULT setAudioChannel(int channel)=0;
692         virtual int getAudioChannel()=0;
693
694         virtual RESULT setPCMDelay(int delay)=0;
695         virtual int getPCMDelay()=0;
696         virtual RESULT setAC3Delay(int delay)=0;
697         virtual int getAC3Delay()=0;
698
699                 /** Set Displayed Videotext PID */
700         virtual RESULT setTextPID(int vpid)=0;
701
702                 /** Set Sync mode to PCR */
703         virtual RESULT setSyncPCR(int pcrpid)=0;
704         enum { sm_Audio, sm_Video };
705                 /** Set Sync mode to either audio or video master */
706         virtual RESULT setSyncMaster(int who)=0;
707
708                 /** Apply settings but don't change state */
709         virtual RESULT set()=0;
710                 /* all those apply settings, then transition to the given state */
711
712                 /** play */
713         virtual RESULT play()=0;
714                 /** Freeze frame. */
715         virtual RESULT pause()=0;
716
717                 /** fast forward by skipping frames. 0 is disabled, 2 is twice-the-speed, ... */
718         virtual RESULT setFastForward(int skip=0)=0;
719
720                 /** Slow Motion by repeating pictures */
721         virtual RESULT setSlowMotion(int repeat)=0;
722
723                 /** Display any complete data as fast as possible */
724         virtual RESULT setTrickmode()=0;
725
726         virtual RESULT getPTS(int what, pts_t &pts) = 0;
727
728         virtual RESULT showSinglePic(const char *filename) = 0;
729
730         virtual RESULT setRadioPic(const std::string &filename) = 0;
731
732         struct videoEvent
733         {
734                 enum { eventUnknown = 0,
735                         eventSizeChanged = VIDEO_EVENT_SIZE_CHANGED,
736                         eventFrameRateChanged = VIDEO_EVENT_FRAME_RATE_CHANGED,
737                         eventProgressiveChanged = 16
738                 } type;
739                 unsigned char aspect;
740                 unsigned short height;
741                 unsigned short width;
742                 bool progressive;
743                 unsigned short framerate;
744         };
745
746         virtual RESULT connectVideoEvent(const Slot1<void, struct videoEvent> &event, ePtr<eConnection> &connection) = 0;
747
748         virtual int getVideoWidth() = 0;
749         virtual int getVideoHeight() = 0;
750         virtual int getVideoProgressive() = 0;
751         virtual int getVideoFrameRate() = 0;
752         virtual int getVideoAspect() = 0;
753 };
754
755 #endif //SWIG
756 #endif