From 49265541974282f3346c9dc7de2365858f9fcb4d Mon Sep 17 00:00:00 2001 From: deva Date: Sat, 12 Aug 2006 15:00:40 +0000 Subject: Added timecode and fixed the sending and receiving of frames through the network. --- lib/network.cc | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 136 insertions(+), 2 deletions(-) (limited to 'lib/network.cc') diff --git a/lib/network.cc b/lib/network.cc index f00d358..cb3f94e 100644 --- a/lib/network.cc +++ b/lib/network.cc @@ -3,7 +3,7 @@ * network.cc * * Wed Nov 3 21:23:14 CET 2004 - * Copyright 2004 Bent Bisballe + * Copyright 2004 Bent Bisballe Nyeng * deva@aasimon.org ****************************************************************************/ @@ -24,9 +24,12 @@ * along with MIaV; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include #include "network.h" +//#ifdef USE_DEBUG +//#include "efencepp.h" +//#endif /*USE_DEBUG*/ + #include "info.h" #include @@ -34,6 +37,8 @@ #include #include +#include + Network::Network(Socket *gs) { s = gs; @@ -150,3 +155,132 @@ int Network::recvPackage(n_header *h, void* buf, int bufsz) return n; } +int Network::sendFrame(Frame *frame) +{ + frameheader_t header; + struct msghdr msg; + struct iovec iovecs[2]; + + if(!s->isConnected()) { + // MIaV::info->error("Write attempted to a socket not connected!"); + return -1; + } + + header.timecode.hour = htonl(frame->timecode.hour); + header.timecode.min = htonl(frame->timecode.min); + header.timecode.sec = htonl(frame->timecode.sec); + header.timecode.frame = htonl(frame->timecode.frame); + header.snapshot = htonl(frame->snapshot); + header.freeze = htonl(frame->freeze); + header.vformat = (video_format_t)htons((short unsigned int)frame->vformat); + header.aformat = (audio_format_t)htons((short unsigned int)frame->aformat); + header.vframesize = htonl(frame->vframesize); + header.aframesize = htonl(frame->aframesize); + + write(&header, sizeof(header)); + + char *vframe = frame->vframe; + char *aframe = frame->aframe; + + int vframesize = frame->vframesize; + int aframesize = frame->aframesize; + + memset(&msg, 0, sizeof(msg)); + + msg.msg_iov = iovecs; + msg.msg_iovlen = 2; + + msg.msg_iov[0].iov_base = vframe; + msg.msg_iov[0].iov_len = vframesize; + + msg.msg_iov[1].iov_base = aframe; + msg.msg_iov[1].iov_len = aframesize; + + int n = sendmsg(s->ssocket, &msg, 0); + + if(n < 0) { + MIaV::info->error("A network error ocurred during sendPackage!"); + return -1; + } + + return n; +} + + +Frame *Network::recvFrame() +{ + Frame *frame = NULL; + + frameheader_t header; + struct msghdr msg; + struct iovec iovecs[2]; + + if(!s->isConnected()) { + // MIaV::info->error("Read attempted to a socket not connected!"); + return NULL; + } + + read(&header, sizeof(header)); + + int vframesize = ntohl(header.vframesize); + int aframesize = ntohl(header.aframesize); + + char *vframe = new char[vframesize]; + char *aframe = new char[aframesize]; + + memset(&msg, 0, sizeof(msg)); + + iovecs[0].iov_base = vframe; + iovecs[0].iov_len = vframesize; + + iovecs[1].iov_base = aframe; + iovecs[1].iov_len = aframesize; + + msg.msg_iov = iovecs; + msg.msg_iovlen = 2; + + int n = recvmsg(s->ssocket, &msg, MSG_WAITALL); + + if(n < 0) { + MIaV::info->error("A network error ocurred during recvPackage!"); + return NULL; + } + + if(n == 0) { + // No more frames to receive. + return NULL; + } + + if(msg.msg_iovlen != 2) { + MIaV::info->error("Wrong package format!"); + return NULL; + } + + frame = new Frame(vframe, vframesize, (video_format_t)ntohs((short unsigned int)header.vformat), + aframe, aframesize, (audio_format_t)ntohs((short unsigned int)header.aformat)); + + frame->timecode.hour = ntohl(header.timecode.hour); + frame->timecode.min = ntohl(header.timecode.min); + frame->timecode.sec = ntohl(header.timecode.sec); + frame->timecode.frame = ntohl(header.timecode.frame); + frame->snapshot = ntohl(header.snapshot); + frame->freeze = ntohl(header.freeze); + + return frame; +} + +int Network::sendStatus(Status *status) +{ + return 0; +} + +int Network::recvStatus(Status *status) +{ + /* + status.diskspace = 10; + status.diskspace_max = 100; + status.load = 80; + status.load_max = 100; + */ + return 0; +} -- cgit v1.2.3