summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/tests/AVStreams/mpeg/source/mpeg_server/Video_Server.h
blob: f12c519bfc6720b857874ace33e970ca30a0a196 (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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
/* -*- C++ -*- */
/* $Id$  */

/* Copyright (c) 1995 Oregon Graduate Institute of Science and Technology
 * P.O.Box 91000-1000, Portland, OR 97291, USA;
 * 
 * Permission to use, copy, modify, distribute, and sell this software and its 
 * documentation for any purpose is hereby granted without fee, provided that 
 * the above copyright notice appear in all copies and that both that 
 * copyright notice and this permission notice appear in supporting 
 * documentation, and that the name of O.G.I. not be used in advertising or 
 * publicity pertaining to distribution of the software without specific, 
 * written prior permission.  O.G.I. makes no representations about the 
 * suitability of this software for any purpose.  It is provided "as is" 
 * without express or implied warranty.
 * 
 * O.G.I. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 
 * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 
 * O.G.I. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY 
 * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 
 * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 * Author: Shanwei Cen
 *         Department of Computer Science and Engineering
 *         email: scen@cse.ogi.edu
 */

#if !defined (MPEG_VIDEO_SERVER_H)
#define MPEG_VIDEO_SERVER_H

#include "ace/Reactor.h"
#include "ace/Event_Handler.h"

#include "tao/TAO.h"
#include "include/common.h"
#include "mpeg_shared/fileio.h"
#include "mpeg_shared/com.h"   
#include "mpeg_shared/routine.h"
#include "mpeg_shared/sendpt.h"
#include "mpeg_shared/Video_ControlS.h"
#include "mpeg_server/server_proto.h"
#include "mpeg_server/Video_Control_State.h"
#include "mpeg_server/Globals.h"

class Video_Control_Handler : public virtual ACE_Event_Handler
{
  // = TITLE
  //   Defines the event handler class for the Video Control.
  //
  // = DESCRIPTION
  //   This class makes use of a TCP socket.It contains a pointer to
  //   the current state which is implemented using the state pattern.
public:

  Video_Control_Handler (int video_control_fd);
  // Construct this handler with a control (TCP) fd
  // %% use sock stream instead of fd

  virtual int handle_input (ACE_HANDLE fd = ACE_INVALID_HANDLE);
  // Called when input events occur (e.g., connection or data).

  virtual ACE_HANDLE get_handle (void) const;
  // Returns the handle used by the event_handler.
  
  Video_Control_State *get_state (void);
  // Accessor for the state_ 

  void change_state (Video_Control_State *state);
  // Used to change the state

  virtual CORBA::Boolean init_video (const Video_Control::INITvideoPara &para,
                                     CORBA::Environment &_tao_environment);
  
  virtual CORBA::Boolean stat_stream (CORBA::Char_out ch,
                                      CORBA::Long_out size,
                                      CORBA::Environment &_tao_environment);

  virtual CORBA::Boolean close (CORBA::Environment &_tao_environment);
  
  virtual CORBA::Boolean stat_sent (CORBA::Environment &_tao_environment);

  virtual CORBA::Boolean fast_forward (const Video_Control::FFpara &para,
                                       CORBA::Environment &_tao_environment
                                       );

  virtual CORBA::Boolean fast_backward (const Video_Control::FFpara &para,
                                        CORBA::Environment &_tao_environment);

  virtual CORBA::Boolean step (const Video_Control::STEPpara &para,
                               CORBA::Environment &_tao_environment);
  
  virtual CORBA::Boolean play (const Video_Control::PLAYpara &para,
                               CORBA::Long_out vts,
                               CORBA::Environment &_tao_environment);

  virtual CORBA::Boolean position (const Video_Control::POSITIONpara &para,
                                   CORBA::Environment &_tao_environment);

  virtual CORBA::Boolean speed (const Video_Control::SPEEDpara &para,
                                CORBA::Environment &_tao_environment);

  virtual CORBA::Boolean stop (CORBA::Long cmdsn,
                               CORBA::Environment &_tao_environment);

private:
  Video_Control_State *state_;
  // State pattern - pointer to abstract State object

  ACE_HANDLE control_handle_;
};

class Video_Control_Handler_Instance
{
  // = TITLE
  //   Defines a Video_Control_Handler_Instance class which is to be
  //   used as a singleton to give access to a Video_Control_Handler
  //   instance to the state pattern classes.
  //
  // = DESCRIPTION
  //   The Video_Control_Handler has to be set using the
  //   set_video_control_handler method.
public:
  // @@ Please add comments to these methods.
  Video_Control_Handler_Instance (void);
  
  void set_video_control_handler (Video_Control_Handler *h);
  
  Video_Control_Handler *get_video_control_handler (void);

private:
  Video_Control_Handler *video_control_handler_;
};

// Video_Control_Handler instance singleton.
//@@ Does this really need to be a thread-specific singleton?
typedef ACE_TSS_Singleton <Video_Control_Handler_Instance,
                           ACE_SYNCH_MUTEX>
        VIDEO_CONTROL_HANDLER_INSTANCE; 

class Video_Sig_Handler : public virtual ACE_Event_Handler
{
  // = TITLE
  //   Defines a video signal handler class which registers itself with the
  //   default ACE_Reactor::instance () . Handles the
  //   SIGALRM signal.
  //
  // = DESCRIPTION
  //   This class contains a pointer to a Video_Control_Handler
  //   instance and decides the signal action depending on its state.
  //   An object of this class is used to periodically send the video
  //   frames to the client using the Video_Timer_Global class.
public:
  Video_Sig_Handler (Video_Control_Handler *vch);

  virtual ACE_HANDLE get_handle (void) const;

  int register_handler (void);
  // this will register this sig_handler
  // with the reactor for SIGALRM

  virtual int shutdown (ACE_HANDLE, 
                        ACE_Reactor_Mask);

  virtual int handle_input (ACE_HANDLE);

  virtual int handle_signal (ACE_HANDLE signum,
                             siginfo_t * = 0,
                             ucontext_t* = 0);
private:
  ACE_HANDLE handle_;
  // my handle

  Video_Control_Handler *vch_;
  // Pointer to the control handler, for accessing
  // the current state of the server.
};

class Video_Data_Handler : public virtual ACE_Event_Handler
{
  // = TITLE
  //   Defines a event handler for video data using a datagram i.e UDP
  //   socket.
  //
  // = DESCRIPTION
  //   This takes a pointer to a Video_Control_Handler instance and
  //   reacts differently to the events based on the
  //   video_control_handler's state.
public:
  Video_Data_Handler (int video_data_fd,
                      Video_Control_Handler *vch);
  // Construct this handler with a data fd

  virtual int handle_input (ACE_HANDLE fd = ACE_INVALID_HANDLE);
  // Called when input events occur (e.g., connection or data).

  virtual ACE_HANDLE get_handle (void) const;
  // Get the handle used by this event handler

private:
  ACE_HANDLE data_handle_;
  // my handle

  Video_Control_Handler *vch_;
  // Pointer to the control handler, for accessing
  // the current state of the server.
};

class Video_Server
{
  // = TITLE
  //   Defines a class that abstracts the functionality of a
  //   video_server.
  //
  // = DESCRIPTION
  //   This registers 3 event handlers with the <ACE_Reactor::instance>,
  //   namely a control,data and signal handlers.
public:
  Video_Server (void);
  // Default constructor

  Video_Server (int control_fd,
                int data_fd,
                int rttag,
                int max_pkt_size);
  // constructor taking the handles

  ~Video_Server ();
  // Destructor

  int init (int control_fd,
            int data_fd,
            int rttag,
            int max_pkt_size);
  // initialize the Video Server.

  int register_handlers (void);
  // register the handlers with the reactor
  // and set the control_handler to the WAITING state

  static void on_exit_routine(void);

private:

  ACE_Reactor* reactor_;
  // alias Reactor ,points to ACE_Reactor::instance ()

  Video_Data_Handler* data_handler_;
  // Data Socket Event Handler

  Video_Control_Handler* control_handler_;
  // Control Socket Event Handler

  Video_Sig_Handler *sig_handler_;
  // signal handler for SIGALRM to periodically send the video frames
  // to the client
};

#endif /* MPEG_VIDEO_SERVER_H */