2 Copyright 2004-2005 Chris Tallon
4 This file is part of VOMP.
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.
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.
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.
24 #include <vdr/channels.h>
25 #include <vdr/device.h>
26 #include <vdr/receiver.h>
30 #include "ringbuffer.h"
34 class MVPReceiver : public cReceiver, public Thread
37 static MVPReceiver* create(const cChannel*, int priority);
38 virtual ~MVPReceiver();
39 int init(TCP* tcp, ULONG streamID);
40 bool isVdrActivated();
41 void detachMVPReceiver();
44 MVPReceiver(const cChannel* channel, cDevice* device);
49 Ringbuffer processed; // A simpler deleting ringbuffer for processed data
50 pthread_mutex_t processedRingLock; // needs outside locking
54 ULONG streamDataCollected;
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
63 static int numMVPReceivers;
67 int *mergeSpidsTpid(const int *spids,int tpid);
68 int mergedSpidsTpid[MAXSPIDS+2];
75 cReceiver docs from the header file
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.
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
100 ///< See ProvidesChannel() for more information on how
101 ///< priorities are handled, and the meaning of NeedsDetachReceivers.
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
118 ///< See also ProvidesChannel().