diff options
Diffstat (limited to 'miavd/server.cc')
-rw-r--r-- | miavd/server.cc | 137 |
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"); +} |