summaryrefslogtreecommitdiff
path: root/frontend_svr.h
blob: 731179445079536896817c396e087154a00edb9c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
 * frontend_svr.h: server for remote frontends
 *
 * See the main source file 'xineliboutput.c' for copyright information and
 * how to reach the author.
 *
 * $Id: frontend_svr.h,v 1.23 2009-03-20 07:20:53 phintuka Exp $
 *
 */

#ifndef __XINELIB_FRONTEND_SVR_H
#define __XINELIB_FRONTEND_SVR_H


#include "config.h"
#include "frontend.h"

//----------------------------- cXinelibServer --------------------------------

#define CTRL_BUF_SIZE 1024

class cBackgroundWriterI;
class cUdpScheduler;
class cStcFuture;
class cCmdFutures;
class cConnState;

#include "tools/cxsocket.h"

class cXinelibServer : public cXinelibThread 
{

  public:
    cXinelibServer(int listen_port);
    virtual ~cXinelibServer();

    // Thread control
    virtual void    Stop(void);

  protected:
    virtual void    Action(void);

  public:
    // Playback control
    virtual void    TrickSpeed(int Speed);

    // Data transfer
    virtual int     Poll(cPoller &Poller, int TimeoutMs);
    virtual bool    Flush(int TimeoutMs);
    virtual void    Clear(void);
    virtual int     Play_PES(const uchar *buf, int len);
    virtual void    OsdCmd(void *cmd);
    virtual int64_t GetSTC();
    virtual void    SetHDMode(bool On);

    // Image grabbing
    virtual uchar  *GrabImage(int &Size, bool Jpeg, int Quality, 
			      int SizeX, int SizeY);
    // Playback files
    virtual int     PlayFileCtrl(const char *Cmd, int TimeoutMs=-1);
    virtual bool    EndOfStreamReached(void);

    // Configuration						  
    virtual bool    Listen(int port);

protected:
    // Playback control
    virtual int     Xine_Control(const char *cmd);  
    virtual int     Xine_Control_Sync(const char *cmd);  

protected:

    // Handling of messages from client(s) 

    void Handle_Discovery_Broadcast(void);
    void Handle_ClientConnected(int fd);

    void Read_Control(int cli);
    void Handle_Control(int cli, const char *cmd);

    void Handle_Control_PIPE      (int cli, const char *arg);
    void Handle_Control_RTP       (int cli, const char *arg);
    void Handle_Control_UDP       (int cli, const char *arg);
    void Handle_Control_DATA      (int cli, const char *arg);
    void Handle_Control_KEY       (int cli, const char *arg);
    void Handle_Control_UDP_RESEND(int cli, const char *arg);
    void Handle_Control_CONFIG    (int cli);
    void Handle_Control_GRAB      (int cli, const char *arg);
    void Handle_Control_CONTROL   (int cli, const char *arg);
    void Handle_Control_HTTP      (int cli, const char *arg);
    void Handle_Control_RTSP      (int cli, const char *arg);

    void CloseDataConnection(int cli);
    void CloseConnection    (int cli);

protected:

    // Data

    int  m_Port;
    int  m_ServerId;

    int  fd_listen;
    int  fd_discovery;

    cxSocket fd_control[MAXCLIENTS];
    int      fd_data   [MAXCLIENTS];

    int  m_OsdTimeouts[MAXCLIENTS];
    char m_CtrlBuf    [MAXCLIENTS][CTRL_BUF_SIZE + 1];
    int  m_CtrlBufPos [MAXCLIENTS];

    int  m_ConnType   [MAXCLIENTS];  // Control connection type. See frontend_svr.c.
    bool m_bUdp       [MAXCLIENTS];  // Client uses UDP transport
    bool m_bMulticast [MAXCLIENTS];  // Client uses multicast RTP
    bool m_bConfigOk  [MAXCLIENTS];  // Client has been configured
    int  m_iMulticastMask; // bit [cli] is 1 or 0. 1 == multicast in use.
    int  m_MasterCli;      // Master client (controls playback speed)

    cString m_PipesDir;

    cBackgroundWriterI *m_Writer[MAXCLIENTS]; // buffered output (pipe/tcp/http)
    cConnState         *m_State[MAXCLIENTS];  // connection state (http/rtsp)
    cUdpScheduler      *m_Scheduler;
    bool                m_Master;

    // Storage for return values of pending RPCs
    cStcFuture         *m_StcFuture;
    cCmdFutures        *m_Futures;

    int  m_Token;
    int  AllocToken(void);
    bool HasClients(void);

    // Cache current PAT/PMT for new clients
    uchar   *m_Header;
    size_t   m_HeaderLength; // bytes used
    size_t   m_HeaderSize;   // bytes allocated
  public:
    void SetHeader(const uchar *Data, int Length, bool Reset = false);
};

#endif // __XINELIB_FRONTEND_SVR_H