diff options
| -rw-r--r-- | etc/miav.conf | 13 | ||||
| -rw-r--r-- | src/Makefile.am | 2 | ||||
| -rw-r--r-- | src/audio_encoder.cc | 2 | ||||
| -rw-r--r-- | src/miav_config.h | 2 | ||||
| -rw-r--r-- | src/mov_encoder.cc | 2 | ||||
| -rw-r--r-- | src/mov_encoder_thread.cc | 4 | ||||
| -rw-r--r-- | src/mov_encoder_thread.h | 2 | ||||
| -rw-r--r-- | src/mov_encoder_writer.cc | 32 | ||||
| -rw-r--r-- | src/mov_encoder_writer.h | 2 | ||||
| -rw-r--r-- | src/multicast.cc | 37 | ||||
| -rw-r--r-- | src/server.cc | 5 | 
11 files changed, 42 insertions, 61 deletions
| diff --git a/etc/miav.conf b/etc/miav.conf index 708b4f6..62f1e9a 100644 --- a/etc/miav.conf +++ b/etc/miav.conf @@ -20,6 +20,9 @@ screensize	= 19.0  pixel_width	= 1024  pixel_height	= 768 +# mcast conf file +multicast_configurationfile= "../etc/multicast.conf" +  # Set to 1 if client is slow ( less than 1.5 ghz )  player_skip_frames = 1 @@ -35,16 +38,6 @@ server_group	= "miav"  server_movie_root	= "/home/miav/miav_movie_files"  server_image_root	= "/home/miav/miav_image_files" -# Multicast adresses: -# 224.0.0.1 All systems on this subnet -# 224.0.0.2 All routers on this subnet -# 224.0.0.5 OSPF routers -# 224.0.0.6 OSPF designated routers -# 224.0.0.12 DHCP server/relay agent -server_multicast	= false -server_multicast_addr	= "224.0.0.1" -server_multicast_port	= 1234 -  # Video output controls. A sequence of I and P, where I is keyframes  # which is fast to create, but uses a lot of discspace.  # B uses changes since last frame, is more cpu intensive, but uses a diff --git a/src/Makefile.am b/src/Makefile.am index effa384..6a72a0d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -35,6 +35,7 @@ miav_SOURCES = $(shell  if [ $QT_CXXFLAGS ] ; then ../tools/MocList cc; fi ) \  	mov_encoder_thread.cc \  	mov_encoder_writer.cc \  	multicast.cc \ +	multicast_configuration.cc \  	multiplexer.cc \  	mutex.cc \  	network.cc \ @@ -88,6 +89,7 @@ EXTRA_DIST = \  	mov_encoder_thread.h \  	mov_encoder_writer.h \  	multicast.h \ +	multicast_configuration.h \  	multiplexer.h \  	mutex.h \  	network.h \ diff --git a/src/audio_encoder.cc b/src/audio_encoder.cc index 119268c..6e412c3 100644 --- a/src/audio_encoder.cc +++ b/src/audio_encoder.cc @@ -52,7 +52,7 @@ void AudioEncoder::thread_main()    info->info("AudioEncoder::run");    // Run with slightly lower priority than MovEncoderWriter -  //  nice(2); +  nice(1);    Frame *in_frame = NULL;    Frame *out_frame = NULL; diff --git a/src/miav_config.h b/src/miav_config.h index 45732c1..a8658f1 100644 --- a/src/miav_config.h +++ b/src/miav_config.h @@ -72,7 +72,7 @@ public:    string *readString(char *node);    float readFloat(char *node); -private: +protected:    Info *info;    string filename; diff --git a/src/mov_encoder.cc b/src/mov_encoder.cc index 1132b63..a4d3483 100644 --- a/src/mov_encoder.cc +++ b/src/mov_encoder.cc @@ -77,7 +77,7 @@ void MovEncoder::thread_main()    //  int insize = 0;    // Run with slightly lower priority than MovEncoderWriter AND AudioEncoder -  //  nice(3); +  nice(2);    FrameVector *item;    Frame *in_frame; diff --git a/src/mov_encoder_thread.cc b/src/mov_encoder_thread.cc index 2e4c16b..6c54191 100644 --- a/src/mov_encoder_thread.cc +++ b/src/mov_encoder_thread.cc @@ -29,7 +29,7 @@  #include <errno.h>  #include "miav_config.h" -MovEncoderThread::MovEncoderThread(const char *cpr, Info *i) +MovEncoderThread::MovEncoderThread(const char *clientip, const char *cpr, Info *i)  {    info = i;    info->info("MovEncoderThread"); @@ -79,7 +79,7 @@ MovEncoderThread::MovEncoderThread(const char *cpr, Info *i)    audioenc->run();    // Create the multiplexer -  writer = new MovEncoderWriter(cpr, +  writer = new MovEncoderWriter(clientip, cpr,                                  video_output_queue,                                  audio_output_queue,                                  info); diff --git a/src/mov_encoder_thread.h b/src/mov_encoder_thread.h index 3e7c1aa..201a332 100644 --- a/src/mov_encoder_thread.h +++ b/src/mov_encoder_thread.h @@ -49,7 +49,7 @@ using namespace std;  class MovEncoderThread {  public: -  MovEncoderThread(const char *cpr, Info *info); +  MovEncoderThread(const char *clientip, const char *cpr, Info *info);    ~MovEncoderThread();    void encode(Frame* frame); diff --git a/src/mov_encoder_writer.cc b/src/mov_encoder_writer.cc index 7f3bfec..d533b81 100644 --- a/src/mov_encoder_writer.cc +++ b/src/mov_encoder_writer.cc @@ -46,7 +46,9 @@ using namespace std;  #include "multiplexer.h" -MovEncoderWriter::MovEncoderWriter(const char* cpr,  +#include "multicast_configuration.h" + +MovEncoderWriter::MovEncoderWriter(const char *clientip, const char* cpr,                                      ThreadSafeQueuePriority *video_q,                                     ThreadSafeQueuePriority *audio_q,                                     Info *i) @@ -57,6 +59,7 @@ MovEncoderWriter::MovEncoderWriter(const char* cpr,    // Create path and filename    char fname[256];    string *server_root; +  string *mcconfig_file;    char birthmonth[3];    char date[32]; @@ -81,15 +84,24 @@ MovEncoderWriter::MovEncoderWriter(const char* cpr,    file = new File(fname, "mpg", info); -  if(config->readBool("server_multicast")) { -    string *addr = config->readString("server_multicast_addr"); -    int port = config->readInt("server_multicast_port"); -    info->info("Enabling multicast %s : %d", addr->c_str(), port); -    multicast = new Multicast(info, (char*)addr->c_str(), port); -  } else { -    info->info("Disabling multicast"); -    multicast = NULL; -  } +  // Get multicast configuration filename +  mcconfig_file = config->readString("multicast_configurationfile"); + +  MulticastConfiguration mcconfig(info, (char*)mcconfig_file->c_str()); + +  mcastconf_t mcclientconf = mcconfig.getConf((char*)clientip); + +  info->info("Client: %s - Enabled: %s - Addr: %s - Port: %d",  +             mcclientconf.client.c_str(), +             mcclientconf.enabled?"Yes\0":"No\0", +             mcclientconf.addr.c_str(), +             mcclientconf.port); + + +  multicast = NULL; +  if(mcclientconf.enabled) multicast = new Multicast(info,  +                                                     (char*)mcclientconf.addr.c_str(), +                                                     mcclientconf.port);    video_queue = video_q;    audio_queue = audio_q; diff --git a/src/mov_encoder_writer.h b/src/mov_encoder_writer.h index 00d5262..eaf4fc8 100644 --- a/src/mov_encoder_writer.h +++ b/src/mov_encoder_writer.h @@ -44,7 +44,7 @@ using namespace std;  class MovEncoderWriter : public Thread {  public: -  MovEncoderWriter(const char* cpr, +  MovEncoderWriter(const char *clientip, const char* cpr,                     ThreadSafeQueuePriority *video_queue,                     ThreadSafeQueuePriority *audio_queue,                     Info *info); diff --git a/src/multicast.cc b/src/multicast.cc index 80be2ce..34c7241 100644 --- a/src/multicast.cc +++ b/src/multicast.cc @@ -35,22 +35,6 @@  Multicast::Multicast(Info *i, char *addr, int port)  { -  /* -    Multicast adresses: -    224.0.0.1 All systems on this subnet -    224.0.0.2 All routers on this subnet -    224.0.0.5 OSPF routers -    224.0.0.6 OSPF designated routers -    224.0.0.12 DHCP server/relay agent -server_multicast	= true -server_multicast_addr	= "224.0.0.1" -server_multicast_port	= 1234 -  */ - -  // Multicast to all systems on this subnet -  //  char addr[] = "224.0.0.1"; -  //  int port = 1234; -    info = i;    if(!UDPOpen(addr, port)) info->error("Error creating socket %s:%d", addr, port);  } @@ -61,17 +45,9 @@ Multicast::~Multicast()  void Multicast::Write(void* buf, int size)  { -  //  char addr[] = "192.168.0.10"; -  //  int port = 1234; - -  if(write(sock, buf, size) != size) { -    info->error("Error Writing to socket."); -    //    if(!UDPOpen(addr, port)) info->error("Error creating socket %s:%d", addr, port); -  } +  if(write(sock, buf, size) != size) info->error("Error Writing to socket.");  } -#define USE_MULTICAST -  bool Multicast::is_address_multicast(unsigned long address)  {    if((address & 255) >= 224 && (address & 255) <= 239) { @@ -106,12 +82,10 @@ bool Multicast::UDPOpen(char *address, int port)    if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &enable, sizeof(unsigned long int)) < 0)       return false; -#ifdef USE_MULTICAST    // If the address is multicast, register to the multicast group -  if(is_address_multicast(stAddr.sin_addr.s_addr)) -  { +  if(is_address_multicast(stAddr.sin_addr.s_addr)) {      struct ip_mreq stMreq; -   +          // Bind the socket to port      stLclAddr.sin_family      = AF_INET;      stLclAddr.sin_addr.s_addr = htonl(INADDR_ANY); @@ -123,10 +97,7 @@ bool Multicast::UDPOpen(char *address, int port)      stMreq.imr_interface.s_addr = INADDR_ANY;      if(setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) & stMreq, sizeof(stMreq)) < 0)         return false; -  } -  else -#endif -  { +  } else {      // Bind the socket to port      stLclAddr.sin_family      = AF_INET;      stLclAddr.sin_addr.s_addr = htonl(INADDR_ANY); diff --git a/src/server.cc b/src/server.cc index 29571d6..34f0b30 100644 --- a/src/server.cc +++ b/src/server.cc @@ -57,6 +57,7 @@  void newConnection(Socket *socket, Info *info)  {    char cpr[256]; +  char clientip[64];    bool hasCpr = false;    ServerStatus status(info); @@ -71,6 +72,8 @@ void newConnection(Socket *socket, Info *info)    info->info("CONNECTION OPENED");    info->info("New connection (%s)", inet_ntoa(socket->socketaddr.sin_addr)); +  sprintf(clientip, "%s", inet_ntoa(socket->socketaddr.sin_addr)); +    Network network = Network(socket, info);    while(int ret = network.recvPackage(&h, frame->data, frame->size)) { @@ -109,7 +112,7 @@ void newConnection(Socket *socket, Info *info)      // This one must be last!      if(h.header.h_data.record) {        //      if(!enc) enc = newMovEncoder(cpr); -      if(!enc) enc = new MovEncoderThread(cpr, info); +      if(!enc) enc = new MovEncoderThread(clientip, cpr, info);        enc->encode(frame);      } | 
