diff --git a/Buffer/main.cpp b/Buffer/main.cpp index 243205e2..344ddb9d 100644 --- a/Buffer/main.cpp +++ b/Buffer/main.cpp @@ -38,12 +38,14 @@ class user{ int MyBuffer_len; int MyNum; int currsend; + bool gotproperaudio; void * lastpointer; static int UserCount; int s; user(int fd){ s = fd; MyNum = UserCount++; + gotproperaudio = false; std::cout << "User " << MyNum << " connected" << std::endl; }//constructor void Disconnect(std::string reason) { @@ -64,6 +66,7 @@ class user{ return (currsend == todo); } void Send(buffer ** ringbuf, int buffers){ + //TODO: Bij MP3: gotproperaudio - if false, stuur alleen als eerste byte is 0xFF en set op true //not connected? cancel if (s < 0){return;} //still waiting for next buffer? check it diff --git a/Connector_RTMP/main.cpp b/Connector_RTMP/main.cpp index 24a7d12f..e7e246c0 100644 --- a/Connector_RTMP/main.cpp +++ b/Connector_RTMP/main.cpp @@ -3,7 +3,8 @@ //debugging level 2 = errors //debugging level 3 = status information //debugging level 4 = extremely verbose status information -#define DEBUG 3 +//debugging level 5 = save all streams to FLV files +#define DEBUG 4 #include #include @@ -38,7 +39,6 @@ int mainHandler(int connection){ FLV_Pack * tag = 0; //first timestamp set - int lastcheck = getNowMS(); firsttime = getNowMS(); if (doHandshake()){ @@ -60,11 +60,12 @@ int mainHandler(int connection){ ev.data.fd = CONN_fd; epoll_ctl(poller, EPOLL_CTL_ADD, CONN_fd, &ev); struct epoll_event events[1]; - - + #if DEBUG >= 5 + //for writing whole stream to a file FILE * tmpfile = 0; char tmpstr[200]; - + #endif + while (!socketError && !All_Hell_Broke_Loose){ //only parse input if available or not yet init'ed //rightnow = getNowMS(); @@ -80,7 +81,6 @@ int mainHandler(int connection){ case -1: break;//not ready yet default: parseChunk(); - lastcheck = getNowMS(); break; } } @@ -135,16 +135,15 @@ int mainHandler(int connection){ tag->data[6] = ftst % 256; } SendMedia((unsigned char)tag->data[0], (unsigned char *)tag->data+11, tag->len-15, ts); - + #if DEBUG >= 5 + //write whole stream to a file if (tmpfile == 0){ sprintf(tmpstr, "./tmpfile_socket_%i.flv", CONN_fd); tmpfile = fopen(tmpstr, "w"); fwrite(FLVHeader, 13, 1, tmpfile); } fwrite(tag->data, tag->len, 1, tmpfile); - - - lastcheck = getNowMS(); + #endif #if DEBUG >= 4 fprintf(stderr, "Sent a tag to %i\n", CONN_fd); #endif @@ -153,14 +152,15 @@ int mainHandler(int connection){ } } //send ACK if we received a whole window - if ((rec_cnt - rec_window_at > rec_window_size) || (getNowMS() - lastcheck > 1)){ + if ((rec_cnt - rec_window_at > rec_window_size)){ rec_window_at = rec_cnt; SendCTL(3, rec_cnt);//send ack (msg 3) - lastcheck = getNowMS(); } } close(CONN_fd); + #if DEBUG >= 5 fclose(tmpfile); + #endif if (inited) close(ss); #if DEBUG >= 1 if (All_Hell_Broke_Loose){fprintf(stderr, "All Hell Broke Loose\n");} diff --git a/Connector_RTMP/parsechunks.cpp b/Connector_RTMP/parsechunks.cpp index d509173b..0640a58a 100644 --- a/Connector_RTMP/parsechunks.cpp +++ b/Connector_RTMP/parsechunks.cpp @@ -45,7 +45,8 @@ void parseChunk(){ //6 = pingrequest, 4 bytes data //7 = pingresponse, 4 bytes data //we don't need to process this - } break; + SendCTL(3, rec_cnt);//send ack (msg 3) + } break; case 5://window size of other end #if DEBUG >= 4 fprintf(stderr, "CTRL: Window size\n"); @@ -100,6 +101,9 @@ void parseChunk(){ case 20:{//AMF0 command message bool parsed = false; amfdata = parseAMF(next.data, next.real_len); + #if DEBUG >= 4 + amfdata.Print(); + #endif if (amfdata.getContentP(0)->StrValue() == "connect"){ #if DEBUG >= 4 int tmpint; @@ -112,7 +116,7 @@ void parseChunk(){ #endif SendCTL(6, rec_window_size, 0);//send peer bandwidth (msg 6) SendCTL(5, snd_window_size);//send window acknowledgement size (msg 5) - SendUSR(0, 0);//send UCM StreamBegin (0), stream 0 + SendUSR(0, 1);//send UCM StreamBegin (0), stream 1 //send a _result reply AMFType amfreply("container", (unsigned char)0xFF); amfreply.addContent(AMFType("", "_result"));//result success @@ -127,6 +131,9 @@ void parseChunk(){ amfreply.getContentP(3)->addContent(AMFType("description", "Connection succeeded.")); amfreply.getContentP(3)->addContent(AMFType("capabilities", (double)33));//from red5 server amfreply.getContentP(3)->addContent(AMFType("fmsVer", "PLS/1,0,0,0"));//from red5 server + #if DEBUG >= 4 + amfreply.Print(); + #endif SendChunk(3, 20, next.msg_stream_id, amfreply.Pack()); //send onBWDone packet //amfreply = AMFType("container", (unsigned char)0xFF); @@ -143,8 +150,11 @@ void parseChunk(){ amfreply.addContent(amfdata.getContent(1));//same transaction ID amfreply.addContent(AMFType("", (double)0, 0x05));//null - command info amfreply.addContent(AMFType("", (double)1));//stream ID - we use 1 + #if DEBUG >= 4 + amfreply.Print(); + #endif SendChunk(3, 20, next.msg_stream_id, amfreply.Pack()); - SendUSR(0, 0);//send UCM StreamBegin (0), stream 0 + SendUSR(0, 1);//send UCM StreamBegin (0), stream 1 parsed = true; }//createStream if ((amfdata.getContentP(0)->StrValue() == "getStreamLength") || (amfdata.getContentP(0)->StrValue() == "getMovLen")){ @@ -154,6 +164,9 @@ void parseChunk(){ amfreply.addContent(amfdata.getContent(1));//same transaction ID amfreply.addContent(AMFType("", (double)0, 0x05));//null - command info amfreply.addContent(AMFType("", (double)0));//zero length + #if DEBUG >= 4 + amfreply.Print(); + #endif SendChunk(3, 20, next.msg_stream_id, amfreply.Pack()); parsed = true; }//getStreamLength @@ -164,6 +177,9 @@ void parseChunk(){ amfreply.addContent(amfdata.getContent(1));//same transaction ID amfreply.addContent(AMFType("", (double)0, 0x05));//null - command info amfreply.addContent(AMFType("", (double)0, 0x05));//null - command info + #if DEBUG >= 4 + amfreply.Print(); + #endif SendChunk(3, 20, 1, amfreply.Pack()); parsed = true; }//checkBandwidth @@ -186,6 +202,9 @@ void parseChunk(){ amfreply.getContentP(3)->addContent(AMFType("description", "Playing and resetting...")); amfreply.getContentP(3)->addContent(AMFType("details", "PLS")); amfreply.getContentP(3)->addContent(AMFType("clientid", (double)1)); + #if DEBUG >= 4 + amfreply.Print(); + #endif SendChunk(4, 20, next.msg_stream_id, amfreply.Pack()); amfreply = AMFType("container", (unsigned char)0xFF); amfreply.addContent(AMFType("", "onStatus"));//status reply @@ -197,6 +216,9 @@ void parseChunk(){ amfreply.getContentP(3)->addContent(AMFType("description", "Playing!")); amfreply.getContentP(3)->addContent(AMFType("details", "PLS")); amfreply.getContentP(3)->addContent(AMFType("clientid", (double)1)); + #if DEBUG >= 4 + amfreply.Print(); + #endif SendChunk(4, 20, 1, amfreply.Pack()); //No clue what this does. Most real servers send it, though... // amfreply = AMFType("container", (unsigned char)0xFF);