summaryrefslogtreecommitdiff
path: root/lib/network.cc
diff options
context:
space:
mode:
authordeva <deva>2006-08-12 15:00:40 +0000
committerdeva <deva>2006-08-12 15:00:40 +0000
commit49265541974282f3346c9dc7de2365858f9fcb4d (patch)
tree0861c3b9bdb9d64a7c68674c4f864171a26eed18 /lib/network.cc
parenta145483e4f59ae76b28657cefd1b1e72fe5e4e2c (diff)
Added timecode and fixed the sending and receiving of frames through the network.
Diffstat (limited to 'lib/network.cc')
-rw-r--r--lib/network.cc138
1 files changed, 136 insertions, 2 deletions
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 <config.h>
#include "network.h"
+//#ifdef USE_DEBUG
+//#include "efencepp.h"
+//#endif /*USE_DEBUG*/
+
#include "info.h"
#include <stdlib.h>
@@ -34,6 +37,8 @@
#include <string.h>
#include <sys/socket.h>
+#include <arpa/inet.h>
+
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;
+}