summaryrefslogtreecommitdiff
path: root/miavd/server.cc
diff options
context:
space:
mode:
Diffstat (limited to 'miavd/server.cc')
-rw-r--r--miavd/server.cc137
1 files changed, 137 insertions, 0 deletions
diff --git a/miavd/server.cc b/miavd/server.cc
new file mode 100644
index 0000000..9180c3d
--- /dev/null
+++ b/miavd/server.cc
@@ -0,0 +1,137 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * server.cc
+ *
+ * Mon Nov 8 11:35:01 CET 2004
+ * Copyright 2004 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of MIaV.
+ *
+ * MIaV is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * MIaV is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MIaV; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include "server.h"
+#include "miav.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+// For mkdir
+#include <sys/stat.h>
+#include <sys/types.h>
+
+// For unlink
+#include <unistd.h>
+
+// For errno
+#include <errno.h>
+
+// For inet_ntoa
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include "miav_config.h"
+
+#include "img_encoder.h"
+
+#include "server_status.h"
+
+#include "ffmpeg_encoder.h"
+
+#include "dv.h"
+
+void newConnection(Socket *socket)
+{
+ char cpr[256];
+ char clientip[64];
+ bool hasCpr = false;
+ ServerStatus status(MIaV::info);
+
+ n_savestate savestate = LATER;
+ n_header h;
+ Frame *frame;
+ Frame *freeze_frame = NULL;
+ FFMpegEncoder *enc = NULL;
+
+ frame = new Frame(NULL, DVPACKAGE_SIZE);
+
+ MIaV::info->info("CONNECTION OPENED");
+ MIaV::info->info("New connection (%s)", inet_ntoa(socket->socketaddr.sin_addr));
+
+ sprintf(clientip, "%s", inet_ntoa(socket->socketaddr.sin_addr));
+
+ Network network = Network(socket, MIaV::info);
+ while(int ret = network.recvPackage(&h, frame->data, frame->size)) {
+ status.checkPoint();
+
+ if(ret == -1) {
+ MIaV::info->error("A network error ocurred, terminating session");
+ break;
+ }
+
+ frame->mute = h.header.h_data.mute;
+
+ if(!hasCpr) {
+ sprintf(cpr, h.header.h_data.cpr);
+ hasCpr = true;
+ }
+
+ if(h.header.h_data.snapshot) {
+ if(freeze_frame) {
+ ImgEncoder(cpr).encode(freeze_frame, 100);
+ delete freeze_frame;
+ freeze_frame = NULL;
+ } else {
+ ImgEncoder(cpr).encode(frame, 100);
+ }
+ }
+
+ if(h.header.h_data.savestate != NO_CHANGE) {
+ savestate = h.header.h_data.savestate;
+ MIaV::info->info("GOT SAVESTATE FROM NETWORK: %d", savestate );
+ }
+
+ if(h.header.h_data.freeze) {
+ if(freeze_frame) delete freeze_frame;
+ // copy the frame into another temporary one.
+ freeze_frame = new Frame(frame->data, frame->size);
+ }
+
+ // This one must be last!
+ if(h.header.h_data.record) {
+ if(!enc) enc = new FFMpegEncoder(clientip, cpr);
+ enc->encode(frame);
+ }
+
+ frame = new Frame(NULL, DVPACKAGE_SIZE);
+ }
+
+ MIaV::info->info("Closing connection...");
+
+ // No encoder exists, if this is a pure snapshot (image) connection.
+ if(enc) {
+ enc->setSaveState(savestate);
+ // Send end of stream frame.
+ frame->endOfFrameStream = true;
+ enc->encode(frame);
+
+ delete enc;
+ }
+
+ MIaV::info->info("CONNECTION CLOSED");
+}