From 4bdb7eb4e43d7171ea2c34dbed348f053e2ef2ec Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sat, 16 Apr 2011 03:44:48 +0200 Subject: [PATCH] *evil scientist laughter* ITS ALIVE! ITS ALIVE! --- util/ddv_socket.cpp | 6 ++++-- util/flv_tag.cpp | 31 +++++++++++++++---------------- util/flv_tag.h | 2 ++ 3 files changed, 21 insertions(+), 18 deletions(-) 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);