]> git.vomp.tv Git - vompserver.git/blob - mvpreceiver.h
Compatibilty updates for VDR 2.3.1 & 2.3.2
[vompserver.git] / mvpreceiver.h
1 /*
2     Copyright 2004-2005 Chris Tallon
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP; if not, write to the Free Software
18     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19 */
20
21 #ifndef MVPRECEIVER_H
22 #define MVPRECEIVER_H
23
24 #include <vdr/channels.h>
25 #include <vdr/device.h>
26 #include <vdr/receiver.h>
27
28 #include "log.h"
29 #include "thread.h"
30 #include "ringbuffer.h"
31 #include "tcp.h"
32 #include "thread.h"
33
34 class MVPReceiver : public cReceiver, public Thread
35 {
36   public:
37     static MVPReceiver* create(const cChannel*, int priority);
38     virtual ~MVPReceiver();
39     int init(TCP* tcp, ULONG streamID);
40     bool isVdrActivated();
41     void detachMVPReceiver();
42
43   private:
44     MVPReceiver(const cChannel* channel, cDevice* device);
45
46     Log* logger;
47     bool vdrActivated;
48     int inittedOK;
49     Ringbuffer processed;    // A simpler deleting ringbuffer for processed data
50     pthread_mutex_t processedRingLock; // needs outside locking
51
52     TCP* tcp;
53     ULONG streamID;
54     ULONG streamDataCollected;
55     int streamChunkSize;
56
57     // cReciever stuff
58     void Activate(bool On);
59     void Receive(UCHAR *Data, int Length); // VDR 2.2.0
60     void Receive(const UCHAR *Data, int Length); // > VDR 2.2.0
61     void sendStreamEnd();
62
63     static int numMVPReceivers;
64     
65   protected:
66     void threadMethod();
67     int *mergeSpidsTpid(const int *spids,int tpid);
68     int  mergedSpidsTpid[MAXSPIDS+2];
69 };
70
71 #endif
72
73
74 /*
75     cReceiver docs from the header file
76
77     void Activate(bool On);
78       // This function is called just before the cReceiver gets attached to
79       // (On == true) or detached from (On == false) a cDevice. It can be used
80       // to do things like starting/stopping a thread.
81       // It is guaranteed that Receive() will not be called before Activate(true).
82     void Receive(uchar *Data, int Length);
83       // This function is called from the cDevice we are attached to, and
84       // delivers one TS packet from the set of PIDs the cReceiver has requested.
85       // The data packet must be accepted immediately, and the call must return
86       // as soon as possible, without any unnecessary delay. Each TS packet
87       // will be delivered only ONCE, so the cReceiver must make sure that
88       // it will be able to buffer the data if necessary.
89
90 */
91
92 /*
93
94   cDevice docs
95
96 (VDR 1.4)
97   static cDevice *GetDevice(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL);
98      ///< Returns a device that is able to receive the given Channel at the
99      ///< given Priority.
100      ///< See ProvidesChannel() for more information on how
101      ///< priorities are handled, and the meaning of NeedsDetachReceivers.
102
103 (VDR >1.5)
104   static cDevice *GetDevice(const cChannel *Channel, int Priority, bool LiveView);
105      ///< Returns a device that is able to receive the given Channel at the
106      ///< given Priority, with the least impact on active recordings and
107      ///< live viewing. The LiveView parameter tells whether the device will
108      ///< be used for live viewing or a recording.
109      ///< If the Channel is encrypted, a CAM slot that claims to be able to
110      ///< decrypt the channel is automatically selected and assigned to the
111      ///< returned device. Whether or not this combination of device and CAM
112      ///< slot is actually able to decrypt the channel can only be determined
113      ///< by checking the "scrambling control" bits of the received TS packets.
114      ///< The Action() function automatically does this and takes care that
115      ///< after detaching any receivers because the channel can't be decrypted,
116      ///< this device/CAM combination will be skipped in the next call to
117      ///< GetDevice().
118      ///< See also ProvidesChannel().
119
120 */