From 3fb3d79ba04d99771200deaf7aa3380e16cf4ecc Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sat, 6 Nov 2010 16:38:19 +0100 Subject: [PATCH 01/27] Buffer conn timeout fix --- util/flv.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/util/flv.cpp b/util/flv.cpp index 0e119a52..0c922506 100644 --- a/util/flv.cpp +++ b/util/flv.cpp @@ -35,15 +35,16 @@ bool FLV_Readheader(){ //will assign pointer if null //resizes FLV_Pack data field bigger if data doesn't fit // (does not auto-shrink for speed!) -void FLV_GetPacket(FLV_Pack *& p){ +bool FLV_GetPacket(FLV_Pack *& p){ if (!p){p = (FLV_Pack*)calloc(1, sizeof(FLV_Pack));} if (p->buf < 15){p->data = (char*)realloc(p->data, 15); p->buf = 15;} - fread(p->data,1,11,stdin); + if (fread(p->data,1,11,stdin) != 11){return false;} p->len = p->data[3] + 15; p->len += (p->data[2] << 8); p->len += (p->data[1] << 16); if (p->buf < p->len){p->data = (char*)realloc(p->data, p->len);p->buf = p->len;} - fread(p->data+11,1,p->len-11,stdin); + if (fread(p->data+11,1,p->len-11,stdin) != (unsigned int)(p->len-11)){return false;} p->isKeyframe = false; if ((p->data[0] == 0x09) && (((p->data[11] & 0xf0) >> 4) == 1)){p->isKeyframe = true;} + return true; }//FLV_GetPacket From 731a212bb05c3f77a232d004c3b3e1d016c21150 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 14:49:45 +0100 Subject: [PATCH 02/27] Gearbox updates, FLV parser rewrite, buffer fixes... --- util/flv.cpp | 93 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 65 insertions(+), 28 deletions(-) diff --git a/util/flv.cpp b/util/flv.cpp index 0c922506..e7048dcb 100644 --- a/util/flv.cpp +++ b/util/flv.cpp @@ -8,43 +8,80 @@ struct FLV_Pack { };//FLV_Pack char FLVHeader[13]; +bool All_Hell_Broke_Loose = false; -//reads full length from a file descriptor -void Magic_Read(char * buf, int len, int file){ - int i = 0; - while (i < len) i += read(file, buf, len-i); -} - - -//reads a FLV header and checks for correctness +//checks FLV Header for correctness //returns true if everything is alright, false otherwise -bool FLV_Readheader(){ - fread(FLVHeader,1,13,stdin); - if (FLVHeader[0] != 'F') return false; - if (FLVHeader[1] != 'L') return false; - if (FLVHeader[2] != 'V') return false; - if (FLVHeader[8] != 0x09) return false; - if (FLVHeader[9] != 0) return false; - if (FLVHeader[10] != 0) return false; - if (FLVHeader[11] != 0) return false; - if (FLVHeader[12] != 0) return false; +bool FLV_Checkheader(char * header){ + if (header[0] != 'F') return false; + if (header[1] != 'L') return false; + if (header[2] != 'V') return false; + if (header[8] != 0x09) return false; + if (header[9] != 0) return false; + if (header[10] != 0) return false; + if (header[11] != 0) return false; + if (header[12] != 0) return false; return true; -}//FLV_Readheader +}//FLV_Checkheader + +//returns true if header is an FLV header +bool FLV_Isheader(char * header){ + if (header[0] != 'F') return false; + if (header[1] != 'L') return false; + if (header[2] != 'V') return false; + return true; +}//FLV_Isheader + +bool ReadUntil(char * buffer, unsigned int count, unsigned int & sofar){ + if (sofar >= count){return true;} + int r = 0; + r = fread(buffer + sofar,1,count-sofar,stdin); + if (r < 0){All_Hell_Broke_Loose = true; return false;} + sofar += r; + if (sofar >= count){return true;} + return false; +} //gets a packet, storing in given FLV_Pack pointer. //will assign pointer if null //resizes FLV_Pack data field bigger if data doesn't fit // (does not auto-shrink for speed!) bool FLV_GetPacket(FLV_Pack *& p){ + static bool done = true; + static unsigned int sofar = 0; if (!p){p = (FLV_Pack*)calloc(1, sizeof(FLV_Pack));} if (p->buf < 15){p->data = (char*)realloc(p->data, 15); p->buf = 15;} - if (fread(p->data,1,11,stdin) != 11){return false;} - p->len = p->data[3] + 15; - p->len += (p->data[2] << 8); - p->len += (p->data[1] << 16); - if (p->buf < p->len){p->data = (char*)realloc(p->data, p->len);p->buf = p->len;} - if (fread(p->data+11,1,p->len-11,stdin) != (unsigned int)(p->len-11)){return false;} - p->isKeyframe = false; - if ((p->data[0] == 0x09) && (((p->data[11] & 0xf0) >> 4) == 1)){p->isKeyframe = true;} - return true; + + if (done){ + //read a header + if (ReadUntil(p->data, 11, sofar)){ + //if its a correct FLV header, throw away and read tag header + if (FLV_Isheader(p->data)){ + if (ReadUntil(p->data, 13, sofar)){ + if (FLV_Checkheader(p->data)){ + sofar = 0; + memcpy(FLVHeader, p->data, 13); + }else{All_Hell_Broke_Loose = true;} + } + }else{ + //if a tag header, calculate length and read tag body + p->len = p->data[3] + 15; + p->len += (p->data[2] << 8); + p->len += (p->data[1] << 16); + if (p->buf < p->len){p->data = (char*)realloc(p->data, p->len);p->buf = p->len;} + done = false; + } + } + }else{ + //read tag body + if (ReadUntil(p->data, p->len, sofar)){ + //calculate keyframeness, next time read header again, return true + p->isKeyframe = false; + if ((p->data[0] == 0x09) && (((p->data[11] & 0xf0) >> 4) == 1)){p->isKeyframe = true;} + done = true; + return true; + } + } + return false; }//FLV_GetPacket + From 06e63e438c24835d37e683498d37975f47442079 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 15:03:46 +0100 Subject: [PATCH 03/27] Oeps --- util/flv.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/util/flv.cpp b/util/flv.cpp index e7048dcb..44185ffd 100644 --- a/util/flv.cpp +++ b/util/flv.cpp @@ -79,6 +79,7 @@ bool FLV_GetPacket(FLV_Pack *& p){ p->isKeyframe = false; if ((p->data[0] == 0x09) && (((p->data[11] & 0xf0) >> 4) == 1)){p->isKeyframe = true;} done = true; + sofar = 0; return true; } } From 5af9fd2674e4f4f601ddf493d0bdeeb5f4b22592 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 22:48:05 +0100 Subject: [PATCH 04/27] First version of standalone RTMP connector --- util/ddv_socket.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 util/ddv_socket.cpp diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp new file mode 100644 index 00000000..82bf1b7e --- /dev/null +++ b/util/ddv_socket.cpp @@ -0,0 +1,41 @@ +#include +#include +#include +#include +#include +#include +#include + + +int DDV_Listen(int port){ + int s = socket(AF_INET, SOCK_STREAM, 0); + + struct sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_port = htons(port);//port 8888 + inet_pton(AF_INET, "0.0.0.0", &addr.sin_addr);//listen on all interfaces + ret = bind(sock, (sockaddr*)&addr, sizeof(addr));//bind to all interfaces, chosen port + if (ret == 0){ + ret = listen(sock, 100);//start listening, backlog of 100 allowed + if (ret == 0){ + return s; + }else{ + printf("Listen failed! Error: %s\n", strerror(errno)); + close(s); + return 0; + } + }else{ + printf("Binding failed! Error: %s\n", strerror(errno)); + close(s); + return 0; + } +} + +int DDV_Accept(int sock){ + int r = accept(sock, 0, 0); + if (r != -1){ + return fdopen(r, "r+"); + }else{ + return -1; + } +} From b210630fcc63846dda1b6908a529745089e34858 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 22:52:00 +0100 Subject: [PATCH 05/27] Compilende versie RTMP superconnector --- util/ddv_socket.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 82bf1b7e..17f06366 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -14,9 +14,9 @@ int DDV_Listen(int port){ addr.sin_family = AF_INET; addr.sin_port = htons(port);//port 8888 inet_pton(AF_INET, "0.0.0.0", &addr.sin_addr);//listen on all interfaces - ret = bind(sock, (sockaddr*)&addr, sizeof(addr));//bind to all interfaces, chosen port + int ret = bind(s, (sockaddr*)&addr, sizeof(addr));//bind to all interfaces, chosen port if (ret == 0){ - ret = listen(sock, 100);//start listening, backlog of 100 allowed + ret = listen(s, 100);//start listening, backlog of 100 allowed if (ret == 0){ return s; }else{ @@ -31,11 +31,11 @@ int DDV_Listen(int port){ } } -int DDV_Accept(int sock){ +FILE * DDV_Accept(int sock){ int r = accept(sock, 0, 0); if (r != -1){ return fdopen(r, "r+"); }else{ - return -1; + return (FILE*)0; } } From 0bfafcda2b675b57298bcc6aaa5b3e96b92408db Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 7 Nov 2010 23:50:20 +0100 Subject: [PATCH 06/27] Nog een poging... --- util/ddv_socket.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 17f06366..beb23d41 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -31,11 +31,6 @@ int DDV_Listen(int port){ } } -FILE * DDV_Accept(int sock){ - int r = accept(sock, 0, 0); - if (r != -1){ - return fdopen(r, "r+"); - }else{ - return (FILE*)0; - } +int DDV_Accept(int sock){ + return accept(sock, 0, 0); } From 2ad46257e73629b8d8726b63aafab362647c38df Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 00:56:49 +0100 Subject: [PATCH 07/27] Nog een poging... --- util/ddv_socket.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index beb23d41..bc6fe670 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -34,3 +34,11 @@ int DDV_Listen(int port){ int DDV_Accept(int sock){ return accept(sock, 0, 0); } + +bool DDV_write(char * buffer, int width, int count, int sock){ + return (send(sock, buffer, width*count, 0) == width*count); +} + +bool DDV_read(char * buffer, int width, int count, int sock){ + return (recv(sock, buffer, width*count, 0) == width*count); +} From c980c4fd45f6d716d4cba0673a9658da344c1291 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 01:00:22 +0100 Subject: [PATCH 08/27] Nog een poging... --- util/ddv_socket.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index bc6fe670..595ab2bb 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -6,6 +6,7 @@ #include #include +bool socketError = false; int DDV_Listen(int port){ int s = socket(AF_INET, SOCK_STREAM, 0); @@ -36,9 +37,13 @@ int DDV_Accept(int sock){ } bool DDV_write(char * buffer, int width, int count, int sock){ - return (send(sock, buffer, width*count, 0) == width*count); + bool r = (send(sock, buffer, width*count, 0) == width*count); + if (!r){socketError = true} + return r; } bool DDV_read(char * buffer, int width, int count, int sock){ - return (recv(sock, buffer, width*count, 0) == width*count); + bool r = (recv(sock, buffer, width*count, 0) == width*count); + if (!r){socketError = true} + return r; } From cd4e2f696caa50b1a7e61482fee6aa3768776056 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 01:00:52 +0100 Subject: [PATCH 09/27] Nog een poging... --- util/ddv_socket.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 595ab2bb..72201cf0 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -36,13 +36,13 @@ int DDV_Accept(int sock){ return accept(sock, 0, 0); } -bool DDV_write(char * buffer, int width, int count, int sock){ +bool DDV_write(void * buffer, int width, int count, int sock){ bool r = (send(sock, buffer, width*count, 0) == width*count); if (!r){socketError = true} return r; } -bool DDV_read(char * buffer, int width, int count, int sock){ +bool DDV_read(void * buffer, int width, int count, int sock){ bool r = (recv(sock, buffer, width*count, 0) == width*count); if (!r){socketError = true} return r; From b3214427a1d1ee6df263d8e785ba6ca0a60cce44 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 01:01:59 +0100 Subject: [PATCH 10/27] Nog een poging... --- util/ddv_socket.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 72201cf0..6ab42140 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -38,12 +38,12 @@ int DDV_Accept(int sock){ bool DDV_write(void * buffer, int width, int count, int sock){ bool r = (send(sock, buffer, width*count, 0) == width*count); - if (!r){socketError = true} + if (!r){socketError = true;} return r; } bool DDV_read(void * buffer, int width, int count, int sock){ bool r = (recv(sock, buffer, width*count, 0) == width*count); - if (!r){socketError = true} + if (!r){socketError = true;} return r; } From ed8008f956d8554e92f6e61578feca786e3fac4f Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 01:04:11 +0100 Subject: [PATCH 11/27] Nog een poging... --- util/ddv_socket.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 6ab42140..1217293a 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -38,12 +38,18 @@ int DDV_Accept(int sock){ bool DDV_write(void * buffer, int width, int count, int sock){ bool r = (send(sock, buffer, width*count, 0) == width*count); - if (!r){socketError = true;} + if (!r){ + socketError = true; + printf("Could not write! %s\n", strerror(errno)); + } return r; } bool DDV_read(void * buffer, int width, int count, int sock){ bool r = (recv(sock, buffer, width*count, 0) == width*count); - if (!r){socketError = true;} + if (!r){ + socketError = true; + printf("Could not read! %s\n", strerror(errno)); + } return r; } From 28373a9f6ec671d04bd42f3ae4e635155e734c7d Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 01:14:23 +0100 Subject: [PATCH 12/27] Nog een poging... --- util/ddv_socket.cpp | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 1217293a..56e298de 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -37,19 +37,31 @@ int DDV_Accept(int sock){ } bool DDV_write(void * buffer, int width, int count, int sock){ - bool r = (send(sock, buffer, width*count, 0) == width*count); - if (!r){ - socketError = true; - printf("Could not write! %s\n", strerror(errno)); + int sofar = 0; + int todo = width*count; + while (sofar != todo){ + int r = send(sock, (char*)buffer + sofar, todo-sofar, 0); + if (r < 0){ + socketError = true; + printf("Could not write! %s\n", strerror(errno)); + return false; + } + sofar += r; } - return r; + return true; } bool DDV_read(void * buffer, int width, int count, int sock){ - bool r = (recv(sock, buffer, width*count, 0) == width*count); - if (!r){ - socketError = true; - printf("Could not read! %s\n", strerror(errno)); + int sofar = 0; + int todo = width*count; + while (sofar != todo){ + int r = recv(sock, (char*)buffer + sofar, todo-sofar, 0); + if (r < 0){ + socketError = true; + printf("Could not read! %s\n", strerror(errno)); + return false; + } + sofar += r; } - return r; + return true; } From cd0ed3be751bce01f909ec04ec46ad224981262f Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 02:45:46 +0100 Subject: [PATCH 13/27] Fix voor afsluiten verbinding... --- util/ddv_socket.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 56e298de..4e1341d2 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -41,7 +41,7 @@ bool DDV_write(void * buffer, int width, int count, int sock){ int todo = width*count; while (sofar != todo){ int r = send(sock, (char*)buffer + sofar, todo-sofar, 0); - if (r < 0){ + if (r <= 0){ socketError = true; printf("Could not write! %s\n", strerror(errno)); return false; @@ -56,7 +56,7 @@ bool DDV_read(void * buffer, int width, int count, int sock){ int todo = width*count; while (sofar != todo){ int r = recv(sock, (char*)buffer + sofar, todo-sofar, 0); - if (r < 0){ + if (r <= 0){ socketError = true; printf("Could not read! %s\n", strerror(errno)); return false; From 84c7c9c275ddb895348d72a85fc1ae5c53fde80c Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 03:12:24 +0100 Subject: [PATCH 14/27] Buffer crash fix --- util/flv.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/util/flv.cpp b/util/flv.cpp index 44185ffd..c04d977a 100644 --- a/util/flv.cpp +++ b/util/flv.cpp @@ -1,4 +1,5 @@ #include //for read() +#include struct FLV_Pack { int len; @@ -47,6 +48,9 @@ bool ReadUntil(char * buffer, unsigned int count, unsigned int & sofar){ //resizes FLV_Pack data field bigger if data doesn't fit // (does not auto-shrink for speed!) bool FLV_GetPacket(FLV_Pack *& p){ + int preflags = fcntl(fileno(stdin), F_GETFL, 0); + int postflags = preflags | O_NONBLOCK; + fcntl(fileno(stdin), F_SETFL, postflags); static bool done = true; static unsigned int sofar = 0; if (!p){p = (FLV_Pack*)calloc(1, sizeof(FLV_Pack));} @@ -80,9 +84,11 @@ bool FLV_GetPacket(FLV_Pack *& p){ if ((p->data[0] == 0x09) && (((p->data[11] & 0xf0) >> 4) == 1)){p->isKeyframe = true;} done = true; sofar = 0; + fcntl(fileno(stdin), F_SETFL, preflags); return true; } } + fcntl(fileno(stdin), F_SETFL, preflags); return false; }//FLV_GetPacket From 5f3d64ba0b215a7d8c2e5ec8034a2f73d2f8e897 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 03:19:17 +0100 Subject: [PATCH 15/27] FLV Socket lezer fix --- util/flv_sock.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/util/flv_sock.cpp b/util/flv_sock.cpp index 8d6c55a4..60bc3abe 100644 --- a/util/flv_sock.cpp +++ b/util/flv_sock.cpp @@ -2,17 +2,21 @@ SWBaseSocket::SWBaseError SWBerr; char * FLVbuffer; int FLV_len; int FLVbs = 0; +bool HeaderDone = false; +static char FLVheader[13]; void FLV_Readheader(SWUnixSocket & ss){ - static char header[13]; - while (ss.frecv(header, 13, &SWBerr) != 13){ - //wait - } }//FLV_Readheader void FLV_Dump(){FLV_len = 0;} bool FLV_GetPacket(SWUnixSocket & ss){ + if (!HeaderDone){ + if (ss.frecv(FLVheader, 13, &SWBerr) == 13){HeaderDone = true;} + return false; + } + + if (FLVbs < 15){FLVbuffer = (char*)realloc(FLVbuffer, 15); FLVbs = 15;} //if received a whole header, receive a whole packet //if not, retry header next pass From 6949269ccc03a794d6c0c93acfda137b333943b7 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 15:28:56 +0100 Subject: [PATCH 16/27] Nieuwe flv parser, nieuwe unix sockets support... --- util/ddv_socket.cpp | 52 +++++++++++++++++++-- util/flv_sock.cpp | 108 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 131 insertions(+), 29 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 4e1341d2..caece508 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -1,13 +1,34 @@ #include #include +#include #include #include #include #include #include +#include bool socketError = false; +int DDV_OpenUnix(const char adres[], bool nonblock = false){ + int s = socket(AF_UNIX, SOCK_STREAM, 0); + sockaddr_un addr; + addr.sun_family = AF_UNIX; + strcpy(addr.sun_path, adres); + int r = connect(s, (sockaddr*)&adres, sizeof(addr)); + if (r == 0){ + if (nonblock){ + int flags = fcntl(s, F_GETFL, 0); + flags |= O_NONBLOCK; + fcntl(s, F_SETFL, flags); + } + return s; + }else{ + close(s); + return 0; + } +} + int DDV_Listen(int port){ int s = socket(AF_INET, SOCK_STREAM, 0); @@ -36,9 +57,8 @@ int DDV_Accept(int sock){ return accept(sock, 0, 0); } -bool DDV_write(void * buffer, int width, int count, int sock){ +bool DDV_write(void * buffer, int todo, int sock){ int sofar = 0; - int todo = width*count; while (sofar != todo){ int r = send(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ @@ -51,9 +71,8 @@ bool DDV_write(void * buffer, int width, int count, int sock){ return true; } -bool DDV_read(void * buffer, int width, int count, int sock){ +bool DDV_read(void * buffer, int todo, int sock){ int sofar = 0; - int todo = width*count; while (sofar != todo){ int r = recv(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ @@ -65,3 +84,28 @@ bool DDV_read(void * buffer, int width, int count, int sock){ } return true; } + + +bool DDV_read(void * buffer, int width, int count, int sock){return DDV_read(buffer, width*count, sock);} +bool DDV_write(void * buffer, int width, int count, int sock){return DDV_write(buffer, width*count, sock);} + + +int DDV_iwrite(void * buffer, int todo, int sock){ + int r = send(sock, buffer, todo, 0); + if (r < 0){ + socketError = true; + printf("Could not write! %s\n", strerror(errno)); + } + return r; +} + +int DDV_iread(void * buffer, int todo, int sock){ + int r = recv(sock, buffer, todo, 0); + if (r < 0){ + socketError = true; + printf("Could not write! %s\n", strerror(errno)); + } + return r; +} + + diff --git a/util/flv_sock.cpp b/util/flv_sock.cpp index 60bc3abe..ac520b43 100644 --- a/util/flv_sock.cpp +++ b/util/flv_sock.cpp @@ -1,34 +1,92 @@ -SWBaseSocket::SWBaseError SWBerr; -char * FLVbuffer; -int FLV_len; -int FLVbs = 0; -bool HeaderDone = false; -static char FLVheader[13]; -void FLV_Readheader(SWUnixSocket & ss){ -}//FLV_Readheader +struct FLV_Pack { + int len; + int buf; + bool isKeyframe; + char * data; +};//FLV_Pack -void FLV_Dump(){FLV_len = 0;} +char FLVHeader[13]; +bool All_Hell_Broke_Loose = false; -bool FLV_GetPacket(SWUnixSocket & ss){ - if (!HeaderDone){ - if (ss.frecv(FLVheader, 13, &SWBerr) == 13){HeaderDone = true;} - return false; - } +//checks FLV Header for correctness +//returns true if everything is alright, false otherwise +bool FLV_Checkheader(char * header){ + if (header[0] != 'F') return false; + if (header[1] != 'L') return false; + if (header[2] != 'V') return false; + if (header[8] != 0x09) return false; + if (header[9] != 0) return false; + if (header[10] != 0) return false; + if (header[11] != 0) return false; + if (header[12] != 0) return false; + return true; +}//FLV_Checkheader - - if (FLVbs < 15){FLVbuffer = (char*)realloc(FLVbuffer, 15); FLVbs = 15;} - //if received a whole header, receive a whole packet - //if not, retry header next pass - if (FLV_len == 0){ - if (ss.frecv(FLVbuffer, 11, &SWBerr) == 11){ - FLV_len = FLVbuffer[3] + 15; - FLV_len += (FLVbuffer[2] << 8); - FLV_len += (FLVbuffer[1] << 16); - if (FLVbs < FLV_len){FLVbuffer = (char*)realloc(FLVbuffer, FLV_len);FLVbs = FLV_len;} +//returns true if header is an FLV header +bool FLV_Isheader(char * header){ + if (header[0] != 'F') return false; + if (header[1] != 'L') return false; + if (header[2] != 'V') return false; + return true; +}//FLV_Isheader + +bool ReadUntil(char * buffer, unsigned int count, unsigned int & sofar, int sock){ + if (sofar >= count){return true;} + int r = 0; + r = DDV_iread(buffer + sofar,count-sofar,sock); + if (r < 0){All_Hell_Broke_Loose = true; return false;} + sofar += r; + if (sofar >= count){return true;} + return false; +} + +//gets a packet, storing in given FLV_Pack pointer. +//will assign pointer if null +//resizes FLV_Pack data field bigger if data doesn't fit +// (does not auto-shrink for speed!) +bool FLV_GetPacket(FLV_Pack *& p, int sock){ + int preflags = fcntl(sock, F_GETFL, 0); + int postflags = preflags | O_NONBLOCK; + fcntl(sock, F_SETFL, postflags); + static bool done = true; + static unsigned int sofar = 0; + if (!p){p = (FLV_Pack*)calloc(1, sizeof(FLV_Pack));} + if (p->buf < 15){p->data = (char*)realloc(p->data, 15); p->buf = 15;} + + if (done){ + //read a header + if (ReadUntil(p->data, 11, sofar, sock)){ + //if its a correct FLV header, throw away and read tag header + if (FLV_Isheader(p->data)){ + if (ReadUntil(p->data, 13, sofar, sock)){ + if (FLV_Checkheader(p->data)){ + sofar = 0; + memcpy(FLVHeader, p->data, 13); + }else{All_Hell_Broke_Loose = true;} + } + }else{ + //if a tag header, calculate length and read tag body + p->len = p->data[3] + 15; + p->len += (p->data[2] << 8); + p->len += (p->data[1] << 16); + if (p->buf < p->len){p->data = (char*)realloc(p->data, p->len);p->buf = p->len;} + done = false; + } } }else{ - if (ss.frecv(FLVbuffer+11, FLV_len-11, &SWBerr) == FLV_len-11){return true;} + //read tag body + if (ReadUntil(p->data, p->len, sofar, sock)){ + //calculate keyframeness, next time read header again, return true + p->isKeyframe = false; + if ((p->data[0] == 0x09) && (((p->data[11] & 0xf0) >> 4) == 1)){p->isKeyframe = true;} + done = true; + sofar = 0; + fcntl(sock, F_SETFL, preflags); + return true; + } } + fcntl(sock, F_SETFL, preflags); return false; }//FLV_GetPacket + From a0f1d494ac1c36cafcc97a6232def981e4ddda5c Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 15:32:13 +0100 Subject: [PATCH 17/27] Allow socket reuse --- util/ddv_socket.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index caece508..49f34806 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -12,6 +12,8 @@ bool socketError = false; int DDV_OpenUnix(const char adres[], bool nonblock = false){ int s = socket(AF_UNIX, SOCK_STREAM, 0); + int on = 1; + setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); sockaddr_un addr; addr.sun_family = AF_UNIX; strcpy(addr.sun_path, adres); From da133096702d874f1063d5438ee139ac0f8018ad Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 15:43:01 +0100 Subject: [PATCH 18/27] Connect fux --- util/ddv_socket.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 49f34806..7f7000aa 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -17,7 +17,7 @@ int DDV_OpenUnix(const char adres[], bool nonblock = false){ sockaddr_un addr; addr.sun_family = AF_UNIX; strcpy(addr.sun_path, adres); - int r = connect(s, (sockaddr*)&adres, sizeof(addr)); + int r = connect(s, (sockaddr*)&addr, sizeof(addr)); if (r == 0){ if (nonblock){ int flags = fcntl(s, F_GETFL, 0); From 3a856002a6c41c18e8f79475ca95c01d9f9b7872 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 15:51:06 +0100 Subject: [PATCH 19/27] DDVSocket edits --- util/ddv_socket.cpp | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 7f7000aa..1aa0cad9 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -64,9 +64,15 @@ bool DDV_write(void * buffer, int todo, int sock){ while (sofar != todo){ int r = send(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ - socketError = true; - printf("Could not write! %s\n", strerror(errno)); - return false; + switch (errno){ + case EWOULDBLOCK: printf("Would block\n"); break; + case EAGAIN: printf("Again\n"); break; + default: + socketError = true; + printf("Could not write! %s\n", strerror(errno)); + return false; + break; + } } sofar += r; } @@ -78,9 +84,15 @@ bool DDV_read(void * buffer, int todo, int sock){ while (sofar != todo){ int r = recv(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ - socketError = true; - printf("Could not read! %s\n", strerror(errno)); - return false; + switch (errno){ + case EWOULDBLOCK: printf("Read: Would block\n"); break; + case EAGAIN: printf("Read: Again\n"); break; + default: + socketError = true; + printf("Could not read! %s\n", strerror(errno)); + return false; + break; + } } sofar += r; } @@ -96,7 +108,7 @@ int DDV_iwrite(void * buffer, int todo, int sock){ int r = send(sock, buffer, todo, 0); if (r < 0){ socketError = true; - printf("Could not write! %s\n", strerror(errno)); + printf("Could not iwrite! %s\n", strerror(errno)); } return r; } @@ -105,7 +117,7 @@ int DDV_iread(void * buffer, int todo, int sock){ int r = recv(sock, buffer, todo, 0); if (r < 0){ socketError = true; - printf("Could not write! %s\n", strerror(errno)); + printf("Could not iread! %s\n", strerror(errno)); } return r; } From 0d04ea2ace154dabe7ad1dac4a817f9311323118 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 15:51:34 +0100 Subject: [PATCH 20/27] DDVSocket edits --- util/ddv_socket.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 1aa0cad9..19bcab59 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -66,7 +66,6 @@ bool DDV_write(void * buffer, int todo, int sock){ if (r <= 0){ switch (errno){ case EWOULDBLOCK: printf("Would block\n"); break; - case EAGAIN: printf("Again\n"); break; default: socketError = true; printf("Could not write! %s\n", strerror(errno)); @@ -86,7 +85,6 @@ bool DDV_read(void * buffer, int todo, int sock){ if (r <= 0){ switch (errno){ case EWOULDBLOCK: printf("Read: Would block\n"); break; - case EAGAIN: printf("Read: Again\n"); break; default: socketError = true; printf("Could not read! %s\n", strerror(errno)); From 71a5bf4ea69d0094ad47d548a445615b3580d9b2 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 15:52:53 +0100 Subject: [PATCH 21/27] DDVSocket edits --- util/ddv_socket.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 19bcab59..23f2de8b 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -105,8 +105,14 @@ bool DDV_write(void * buffer, int width, int count, int sock){return DDV_write(b int DDV_iwrite(void * buffer, int todo, int sock){ int r = send(sock, buffer, todo, 0); if (r < 0){ - socketError = true; - printf("Could not iwrite! %s\n", strerror(errno)); + switch (errno){ + case EWOULDBLOCK: printf("Write: Would block\n"); break; + default: + socketError = true; + printf("Could not write! %s\n", strerror(errno)); + return false; + break; + } } return r; } @@ -114,8 +120,14 @@ int DDV_iwrite(void * buffer, int todo, int sock){ int DDV_iread(void * buffer, int todo, int sock){ int r = recv(sock, buffer, todo, 0); if (r < 0){ - socketError = true; - printf("Could not iread! %s\n", strerror(errno)); + switch (errno){ + case EWOULDBLOCK: printf("Read: Would block\n"); break; + default: + socketError = true; + printf("Could not read! %s\n", strerror(errno)); + return false; + break; + } } return r; } From 8c6a315dfb8b3cc12f7f150bf7c3df11e9ee948d Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 15:56:43 +0100 Subject: [PATCH 22/27] DDVSocket edits --- util/ddv_socket.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 23f2de8b..0c14a371 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -55,8 +55,14 @@ int DDV_Listen(int port){ } } -int DDV_Accept(int sock){ - return accept(sock, 0, 0); +int DDV_Accept(int sock, bool nonblock = false){ + int r = accept(sock, 0, 0); + if ((r > 0) && nonblock){ + int flags = fcntl(r, F_GETFL, 0); + flags |= O_NONBLOCK; + fcntl(r, F_SETFL, flags); + } + return r; } bool DDV_write(void * buffer, int todo, int sock){ From a6311fe5358082612234463949ac628fb3815d56 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 16:09:42 +0100 Subject: [PATCH 23/27] DDVSocket edits --- util/ddv_socket.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 0c14a371..1d3efd69 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -9,6 +9,7 @@ #include bool socketError = false; +bool socketBlocking = false; int DDV_OpenUnix(const char adres[], bool nonblock = false){ int s = socket(AF_UNIX, SOCK_STREAM, 0); @@ -67,11 +68,12 @@ int DDV_Accept(int sock, bool nonblock = false){ bool DDV_write(void * buffer, int todo, int sock){ int sofar = 0; + socketBlocking = false; while (sofar != todo){ int r = send(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ switch (errno){ - case EWOULDBLOCK: printf("Would block\n"); break; + case EWOULDBLOCK: printf("Would block\n"); socketBlocking = true; break; default: socketError = true; printf("Could not write! %s\n", strerror(errno)); @@ -86,11 +88,12 @@ bool DDV_write(void * buffer, int todo, int sock){ bool DDV_read(void * buffer, int todo, int sock){ int sofar = 0; + socketBlocking = false; while (sofar != todo){ int r = recv(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ switch (errno){ - case EWOULDBLOCK: printf("Read: Would block\n"); break; + case EWOULDBLOCK: printf("Read: Would block\n"); socketBlocking = true; break; default: socketError = true; printf("Could not read! %s\n", strerror(errno)); From a23c9696b6735ca311e86db855b9ed39484b433b Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 16:12:53 +0100 Subject: [PATCH 24/27] DDVSocket edits --- util/ddv_socket.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 1d3efd69..19a6b80e 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -73,7 +73,7 @@ bool DDV_write(void * buffer, int todo, int sock){ int r = send(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ switch (errno){ - case EWOULDBLOCK: printf("Would block\n"); socketBlocking = true; break; + case EWOULDBLOCK: socketBlocking = true; return false; break; default: socketError = true; printf("Could not write! %s\n", strerror(errno)); @@ -93,7 +93,7 @@ bool DDV_read(void * buffer, int todo, int sock){ int r = recv(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ switch (errno){ - case EWOULDBLOCK: printf("Read: Would block\n"); socketBlocking = true; break; + case EWOULDBLOCK: socketBlocking = true; return false; break; default: socketError = true; printf("Could not read! %s\n", strerror(errno)); @@ -115,7 +115,7 @@ int DDV_iwrite(void * buffer, int todo, int sock){ int r = send(sock, buffer, todo, 0); if (r < 0){ switch (errno){ - case EWOULDBLOCK: printf("Write: Would block\n"); break; + case EWOULDBLOCK: break; default: socketError = true; printf("Could not write! %s\n", strerror(errno)); @@ -130,7 +130,7 @@ int DDV_iread(void * buffer, int todo, int sock){ int r = recv(sock, buffer, todo, 0); if (r < 0){ switch (errno){ - case EWOULDBLOCK: printf("Read: Would block\n"); break; + case EWOULDBLOCK: break; default: socketError = true; printf("Could not read! %s\n", strerror(errno)); From 83f59d4213b6f13bdb6a1d00824c29a09cef54a1 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 16:25:35 +0100 Subject: [PATCH 25/27] DDVSocket edits --- util/ddv_socket.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 19a6b80e..43406e4d 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -73,7 +73,7 @@ bool DDV_write(void * buffer, int todo, int sock){ int r = send(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ switch (errno){ - case EWOULDBLOCK: socketBlocking = true; return false; break; + case EWOULDBLOCK: socketBlocking = true; break; default: socketError = true; printf("Could not write! %s\n", strerror(errno)); @@ -86,6 +86,12 @@ bool DDV_write(void * buffer, int todo, int sock){ return true; } +bool DDV_ready(int sock){ + char tmp; + int r = recv(sock, &tmp, 1, MSG_PEEK); + return (r == 1); +} + bool DDV_read(void * buffer, int todo, int sock){ int sofar = 0; socketBlocking = false; @@ -93,7 +99,7 @@ bool DDV_read(void * buffer, int todo, int sock){ int r = recv(sock, (char*)buffer + sofar, todo-sofar, 0); if (r <= 0){ switch (errno){ - case EWOULDBLOCK: socketBlocking = true; return false; break; + case EWOULDBLOCK: socketBlocking = true; break; default: socketError = true; printf("Could not read! %s\n", strerror(errno)); From 8081e4cb66195cfec40c13d1e358145bf6c6d528 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 16:29:06 +0100 Subject: [PATCH 26/27] DDVSocket edits --- util/ddv_socket.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index 43406e4d..a1cecf6e 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -88,7 +88,11 @@ bool DDV_write(void * buffer, int todo, int sock){ bool DDV_ready(int sock){ char tmp; + int preflags = fcntl(sock, F_GETFL, 0); + int postflags = preflags | O_NONBLOCK; + fcntl(sock, F_SETFL, postflags); int r = recv(sock, &tmp, 1, MSG_PEEK); + fcntl(sock, F_SETFL, preflags); return (r == 1); } From 8420db87ca0bfb631ee26121ddf0ef8735d5ec93 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 8 Nov 2010 16:33:30 +0100 Subject: [PATCH 27/27] DDVSocket edits --- util/ddv_socket.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index a1cecf6e..cedcc76c 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -13,8 +13,6 @@ bool socketBlocking = false; int DDV_OpenUnix(const char adres[], bool nonblock = false){ int s = socket(AF_UNIX, SOCK_STREAM, 0); - int on = 1; - setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); sockaddr_un addr; addr.sun_family = AF_UNIX; strcpy(addr.sun_path, adres); @@ -35,6 +33,8 @@ int DDV_OpenUnix(const char adres[], bool nonblock = false){ int DDV_Listen(int port){ int s = socket(AF_INET, SOCK_STREAM, 0); + int on = 1; + setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(port);//port 8888