diff --git a/Buffer/main.cpp b/Buffer/main.cpp index 6d806d9c..efbbc3f7 100644 --- a/Buffer/main.cpp +++ b/Buffer/main.cpp @@ -230,16 +230,16 @@ namespace Buffer{ users.back().MyBuffer = lastproper; users.back().MyBuffer_num = -1; /// \todo Do this more nicely? - if (!incoming.write(FLV::Header, 13)){ + if (!users.back().S.write(FLV::Header, 13)){ users.back().Disconnect("failed to receive the header!"); }else{ - if (!incoming.write(metadata.data, metadata.len)){ + if (!users.back().S.write(metadata.data, metadata.len)){ users.back().Disconnect("failed to receive metadata!"); } - if (!incoming.write(video_init.data, video_init.len)){ + if (!users.back().S.write(video_init.data, video_init.len)){ users.back().Disconnect("failed to receive video init!"); } - if (!incoming.write(audio_init.data, audio_init.len)){ + if (!users.back().S.write(audio_init.data, audio_init.len)){ users.back().Disconnect("failed to receive audio init!"); } } diff --git a/Connector_HTTP/main.cpp b/Connector_HTTP/main.cpp index 6ae3392f..a7fbf0e3 100644 --- a/Connector_HTTP/main.cpp +++ b/Connector_HTTP/main.cpp @@ -337,7 +337,7 @@ namespace Connector_HTTP{ conn.close(); if (inited) ss.close(); #if DEBUG >= 1 - if (FLV::Parse_Error){fprintf(stderr, "FLV Parser Error\n");} + if (FLV::Parse_Error){fprintf(stderr, "FLV Parser Error: %s\n", FLV::Error_Str.c_str());} fprintf(stderr, "User %i disconnected.\n", conn.getSocket()); if (inited){ fprintf(stderr, "Status was: inited\n"); diff --git a/util/ddv_socket.cpp b/util/ddv_socket.cpp index e82ea8ae..3b3567ac 100644 --- a/util/ddv_socket.cpp +++ b/util/ddv_socket.cpp @@ -121,8 +121,9 @@ bool DDV::Socket::write(const void * buffer, int len){ return false; break; } + }else{ + sofar += r; } - sofar += r; } return true; }//DDv::Socket::write @@ -151,8 +152,9 @@ bool DDV::Socket::read(void * buffer, int len){ return false; break; } + }else{ + sofar += r; } - sofar += r; } return true; }//DDV::Socket::read diff --git a/util/flv_tag.cpp b/util/flv_tag.cpp index 08fed05b..02494b56 100644 --- a/util/flv_tag.cpp +++ b/util/flv_tag.cpp @@ -143,7 +143,7 @@ void FLV::Tag::tagTime(unsigned int T){ /// The buffer length is initialized to 0, and later automatically /// increased if neccesary. FLV::Tag::Tag(){ - len = 0; buf = 0; data = 0; isKeyframe = false; + len = 0; buf = 0; data = 0; isKeyframe = false; done = true; sofar = 0; }//empty constructor /// Copy constructor, copies the contents of an existing tag. @@ -151,6 +151,8 @@ FLV::Tag::Tag(){ /// that is being copied, and later automaticallt increased if /// neccesary. FLV::Tag::Tag(const Tag& O){ + done = true; + sofar = 0; buf = O.len; len = buf; if (len > 0){ @@ -166,14 +168,18 @@ FLV::Tag::Tag(const Tag& O){ /// This operator checks for self-assignment. FLV::Tag & FLV::Tag::operator= (const FLV::Tag& O){ if (this != &O){//no self-assignment - if (data != 0){free(data);} - buf = O.len; - len = buf; + len = O.len; if (len > 0){ - data = (char*)malloc(len); + if (!data){ + data = (char*)malloc(len); + buf = len; + }else{ + if (buf < len){ + data = (char*)realloc(data, len); + buf = len; + } + } memcpy(data, O.data, len); - }else{ - data = 0; } isKeyframe = O.isKeyframe; } @@ -211,8 +217,6 @@ bool FLV::Tag::MemReadUntil(char * buffer, unsigned int count, unsigned int & so /// \param P The current position in the data buffer. Will be updated to reflect new position. /// \return True if a whole tag is succesfully read, false otherwise. bool FLV::Tag::MemLoader(char * D, unsigned int S, unsigned int & P){ - static bool done = true; - static unsigned int sofar = 0; if (buf < 15){data = (char*)realloc(data, 15); buf = 15;} if (done){ //read a header @@ -259,15 +263,14 @@ bool FLV::Tag::MemLoader(char * D, unsigned int S, unsigned int & P){ /// \return True if count bytes are read succesfully, false otherwise. bool FLV::Tag::SockReadUntil(char * buffer, unsigned int count, unsigned int & sofar, DDV::Socket & sock){ if (sofar == count){return true;} - int r = sock.read(buffer + sofar,count-sofar); - if (r < 0){ + if (!sock.read(buffer + sofar,count-sofar)){ if (errno != EWOULDBLOCK){ FLV::Parse_Error = true; Error_Str = "Error reading from socket."; } return false; } - sofar += r; + sofar += count-sofar; if (sofar == count){return true;} if (sofar > count){ FLV::Parse_Error = true; @@ -282,8 +285,6 @@ bool FLV::Tag::SockReadUntil(char * buffer, unsigned int count, unsigned int & s /// \param sock The socket to read from. /// \return True if a whole tag is succesfully read, false otherwise. bool FLV::Tag::SockLoader(DDV::Socket sock){ - static bool done = true; - static unsigned int sofar = 0; if (buf < 15){data = (char*)realloc(data, 15); buf = 15;} if (done){ if (SockReadUntil(data, 11, sofar, sock)){ @@ -354,8 +355,6 @@ bool FLV::Tag::FileLoader(FILE * f){ int preflags = fcntl(fileno(f), F_GETFL, 0); int postflags = preflags | O_NONBLOCK; fcntl(fileno(f), F_SETFL, postflags); - static bool done = true; - static unsigned int sofar = 0; if (buf < 15){data = (char*)realloc(data, 15); buf = 15;} if (done){ diff --git a/util/flv_tag.h b/util/flv_tag.h index e824228c..0ba13ea5 100644 --- a/util/flv_tag.h +++ b/util/flv_tag.h @@ -35,6 +35,8 @@ namespace FLV { bool FileLoader(FILE * f); protected: int buf; ///< Maximum length of buffer space. + bool done; ///< Body reading done? + unsigned int sofar; ///< How many bytes are read sofar? //loader helper functions bool MemReadUntil(char * buffer, unsigned int count, unsigned int & sofar, char * D, unsigned int S, unsigned int & P); bool SockReadUntil(char * buffer, unsigned int count, unsigned int & sofar, DDV::Socket & sock);