vdr-plugin-satip/tuner.h

179 lines
5.9 KiB
C
Raw Normal View History

2014-03-08 12:07:47 +01:00
/*
* tuner.h: SAT>IP plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __SATIP_TUNER_H
#define __SATIP_TUNER_H
#include <vdr/thread.h>
#include <vdr/tools.h>
#include "deviceif.h"
2015-01-15 22:33:51 +01:00
#include "discover.h"
#include "rtp.h"
#include "rtcp.h"
2014-11-09 11:51:52 +01:00
#include "rtsp.h"
#include "server.h"
2014-03-08 12:07:47 +01:00
#include "statistics.h"
2014-11-09 01:32:50 +01:00
class cSatipPid : public cVector<int> {
private:
static int PidCompare(const void *aPidP, const void *bPidP)
{
return (*(int*)aPidP - *(int*)bPidP);
}
public:
2014-11-09 01:32:50 +01:00
void RemovePid(const int &pidP)
{
if (RemoveElement(pidP))
Sort(PidCompare);
2014-11-09 01:32:50 +01:00
}
void AddPid(int pidP)
{
if (AppendUnique(pidP))
Sort(PidCompare);
2014-11-09 01:32:50 +01:00
}
2014-12-14 16:54:37 +01:00
cString ListPids(void)
{
cString list = "";
if (Size()) {
for (int i = 0; i < Size(); ++i)
list = cString::sprintf("%s%d,", *list, At(i));
list = list.Truncate(-1);
}
return list;
}
2014-11-09 01:32:50 +01:00
};
2015-01-15 22:33:51 +01:00
class cSatipTunerServer
{
private:
cSatipServer *serverM;
int deviceIdM;
2015-01-15 22:33:51 +01:00
int transponderM;
public:
cSatipTunerServer(cSatipServer *serverP, const int deviceIdP, const int transponderP) : serverM(serverP), deviceIdM(deviceIdP), transponderM(transponderP) {}
2015-01-15 22:33:51 +01:00
~cSatipTunerServer() {}
cSatipTunerServer(const cSatipTunerServer &objP) { serverM = NULL; deviceIdM = -1; transponderM = 0; }
cSatipTunerServer& operator= (const cSatipTunerServer &objP) { serverM = objP.serverM; deviceIdM = objP.deviceIdM; transponderM = objP.transponderM; return *this; }
2015-01-15 22:33:51 +01:00
bool IsValid(void) { return !!serverM; }
bool IsQuirk(int quirkP) { return (serverM && cSatipDiscover::GetInstance()->IsServerQuirk(serverM, quirkP)); }
bool HasCI(void) { return (serverM && cSatipDiscover::GetInstance()->HasServerCI(serverM)); }
void Attach(void) { if (serverM) cSatipDiscover::GetInstance()->AttachServer(serverM, deviceIdM, transponderM); }
void Detach(void) { if (serverM) cSatipDiscover::GetInstance()->DetachServer(serverM, deviceIdM, transponderM); }
2015-01-15 22:33:51 +01:00
void Set(cSatipServer *serverP, const int transponderP) { serverM = serverP; transponderM = transponderP; }
void Reset(void) { serverM = NULL; transponderM = 0; }
cString GetAddress(void) { return serverM ? cSatipDiscover::GetInstance()->GetServerAddress(serverM) : ""; }
cString GetSrcAddress(void) { return serverM ? cSatipDiscover::GetInstance()->GetSourceAddress(serverM) : ""; }
int GetPort(void) { return serverM ? cSatipDiscover::GetInstance()->GetServerPort(serverM) : SATIP_DEFAULT_RTSP_PORT; }
cString GetInfo(void) { return cString::sprintf("server=%s deviceid=%d transponder=%d", serverM ? "assigned" : "null", deviceIdM, transponderM); }
2015-01-15 22:33:51 +01:00
};
class cSatipTuner : public cThread, public cSatipTunerStatistics, public cSatipTunerIf
{
2014-03-08 12:07:47 +01:00
private:
enum {
eDummyPid = 100,
eDefaultSignalStrengthDBm = -25,
eDefaultSignalStrength = 224,
eDefaultSignalQuality = 15,
eSleepTimeoutMs = 250, // in milliseconds
eStatusUpdateTimeoutMs = 1000, // in milliseconds
ePidUpdateIntervalMs = 250, // in milliseconds
eConnectTimeoutMs = 5000, // in milliseconds
eIdleCheckTimeoutMs = 15000, // in milliseconds
eTuningTimeoutMs = 20000, // in milliseconds
eMinKeepAliveIntervalMs = 30000, // in milliseconds
2021-05-26 21:10:34 +02:00
eKeepAlivePreBufferMs = 2000, // in milliseconds
eSetupTimeoutMs = 2000 // in milliseconds
2014-03-08 12:07:47 +01:00
};
enum eTunerState { tsIdle, tsRelease, tsSet, tsTuned, tsLocked };
2014-11-23 21:22:38 +01:00
enum eStateMode { smInternal, smExternal };
2014-03-08 12:07:47 +01:00
cCondWait sleepM;
cSatipDeviceIf* deviceM;
2014-11-09 11:51:52 +01:00
int deviceIdM;
2014-11-16 15:39:20 +01:00
cSatipRtsp rtspM;
cSatipRtp rtpM;
cSatipRtcp rtcpM;
2014-03-08 12:07:47 +01:00
cString streamAddrM;
cString streamParamM;
cString lastAddrM;
cString lastParamM;
cString tnrParamM;
int streamPortM;
2015-01-15 22:33:51 +01:00
cSatipTunerServer currentServerM;
cSatipTunerServer nextServerM;
2014-03-08 12:07:47 +01:00
cMutex mutexM;
2014-11-16 14:38:23 +01:00
cTimeMs reConnectM;
2014-03-08 12:07:47 +01:00
cTimeMs keepAliveM;
cTimeMs statusUpdateM;
2014-03-08 12:07:47 +01:00
cTimeMs pidUpdateCacheM;
cTimeMs setupTimeoutM;
cString sessionM;
eTunerState currentStateM;
2014-11-23 21:22:38 +01:00
cVector<eTunerState> internalStateM;
cVector<eTunerState> externalStateM;
2014-03-08 12:07:47 +01:00
int timeoutM;
bool hasLockM;
double signalStrengthDBmM;
2014-03-08 12:07:47 +01:00
int signalStrengthM;
int signalQualityM;
int frontendIdM;
2014-03-08 12:07:47 +01:00
int streamIdM;
int pmtPidM;
2014-11-09 01:32:50 +01:00
cSatipPid addPidsM;
cSatipPid delPidsM;
cSatipPid pidsM;
2014-03-08 12:07:47 +01:00
bool Connect(void);
bool Disconnect(void);
2018-10-21 19:21:33 +02:00
bool Receive(void);
bool KeepAlive(bool forceP = false);
bool ReadReceptionStatus(bool forceP = false);
2014-04-19 16:27:47 +02:00
bool UpdatePids(bool forceP = false);
2014-11-23 21:22:38 +01:00
void UpdateCurrentState(void);
2014-11-19 20:01:45 +01:00
bool StateRequested(void);
2014-11-23 21:22:38 +01:00
bool RequestState(eTunerState stateP, eStateMode modeP);
const char *StateModeString(eStateMode modeP);
const char *TunerStateString(eTunerState stateP);
cString GetBaseUrl(const char *addressP, const int portP);
2014-03-08 12:07:47 +01:00
protected:
virtual void Action(void);
public:
cSatipTuner(cSatipDeviceIf &deviceP, unsigned int packetLenP);
virtual ~cSatipTuner();
2014-12-07 17:12:08 +01:00
bool IsTuned(void) const { return (currentStateM >= tsTuned); }
2015-01-15 22:33:51 +01:00
bool SetSource(cSatipServer *serverP, const int transponderP, const char *parameterP, const int indexP);
2014-03-08 12:07:47 +01:00
bool SetPid(int pidP, int typeP, bool onP);
bool Open(void);
bool Close(void);
int FrontendId(void);
2014-03-08 12:07:47 +01:00
int SignalStrength(void);
double SignalStrengthDBm(void);
2014-03-08 12:07:47 +01:00
int SignalQuality(void);
bool HasLock(void);
cString GetSignalStatus(void);
cString GetInformation(void);
2014-11-09 11:51:52 +01:00
// for internal tuner interface
public:
2014-11-16 14:38:23 +01:00
virtual void ProcessVideoData(u_char *bufferP, int lengthP);
virtual void ProcessApplicationData(u_char *bufferP, int lengthP);
virtual void ProcessRtpData(u_char *bufferP, int lengthP);
virtual void ProcessRtcpData(u_char *bufferP, int lengthP);
2014-11-09 11:51:52 +01:00
virtual void SetStreamId(int streamIdP);
virtual void SetSessionTimeout(const char *sessionP, int timeoutP);
2016-12-11 00:18:12 +01:00
virtual void SetupTransport(int rtpPortP, int rtcpPortP, const char *streamAddrP, const char *sourceAddrP);
2014-11-09 11:51:52 +01:00
virtual int GetId(void);
2014-03-08 12:07:47 +01:00
};
#endif // __SATIP_TUNER_H