From 25640de4028df113995968f588303fa2407b8da1 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sat, 19 Mar 2011 15:49:14 +0100 Subject: [PATCH 1/5] Segments bevatten nu alleen hele keyframes - added some extra references --- Connector_HTTP/main.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Connector_HTTP/main.cpp b/Connector_HTTP/main.cpp index bc6f90fd..0c26241d 100644 --- a/Connector_HTTP/main.cpp +++ b/Connector_HTTP/main.cpp @@ -126,6 +126,7 @@ int mainHandler(int CONN_fd){ std::string FlashBuf; std::string FlashMeta; bool Flash_ManifestSent = false; + bool Flash_RequestPending = false; FLV_Pack * tag = 0; HTTPReader HTTP_R, HTTP_S;//HTTP Receiver en HTTP Sender. @@ -180,11 +181,7 @@ int mainHandler(int CONN_fd){ printf( "Segment: %d\n", Segment ); printf( "Fragment: %d\n", ReqFragment ); #endif - HTTP_S.Clean(); - HTTP_S.SetHeader("Content-Type","video/mp4"); - HTTP_S.SetBody(Interface::mdatFold(FlashBuf)); - FlashBuf = ""; - HTTP_S.SendResponse(CONN_fd, "200", "OK");//schrijf de HTTP response header + Flash_RequestPending = true; }else{ Movie = HTTP_R.url.substr(1); Movie = Movie.substr(0,Movie.find("/")); @@ -246,6 +243,15 @@ int mainHandler(int CONN_fd){ if (FLV_GetPacket(tag, ss)){//able to read a full packet? if (handler == HANDLER_FLASH){ if(tag->data[0] != 0x12 ) { + if (tag->isKeyframe){ + if (Flash_RequestPending){ + HTTP_S.Clean(); + HTTP_S.SetHeader("Content-Type","video/mp4"); + HTTP_S.SetBody(Interface::mdatFold(FlashBuf)); + FlashBuf = ""; + HTTP_S.SendResponse(CONN_fd, "200", "OK");//schrijf de HTTP response header + } + } FlashBuf.append(tag->data,tag->len); } else { FlashMeta = ""; From a6b04273aa4876ae0073aa9d3a595e8304542aef Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sat, 19 Mar 2011 16:03:47 +0100 Subject: [PATCH 2/5] FIFO buffer for fragments --- Connector_HTTP/main.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Connector_HTTP/main.cpp b/Connector_HTTP/main.cpp index 0c26241d..1432604e 100644 --- a/Connector_HTTP/main.cpp +++ b/Connector_HTTP/main.cpp @@ -6,6 +6,7 @@ #define DEBUG 4 #include +#include #include #include #include @@ -127,6 +128,7 @@ int mainHandler(int CONN_fd){ std::string FlashMeta; bool Flash_ManifestSent = false; bool Flash_RequestPending = false; + std::queue Flash_FragBuffer; FLV_Pack * tag = 0; HTTPReader HTTP_R, HTTP_S;//HTTP Receiver en HTTP Sender. @@ -244,12 +246,17 @@ int mainHandler(int CONN_fd){ if (handler == HANDLER_FLASH){ if(tag->data[0] != 0x12 ) { if (tag->isKeyframe){ + Flash_FragBuffer.push(FlashBuf); + FlashBuf = ""; if (Flash_RequestPending){ HTTP_S.Clean(); HTTP_S.SetHeader("Content-Type","video/mp4"); - HTTP_S.SetBody(Interface::mdatFold(FlashBuf)); - FlashBuf = ""; + HTTP_S.SetBody(Interface::mdatFold(Flash_FragBuffer.front())); + Flash_FragBuffer.pop(); HTTP_S.SendResponse(CONN_fd, "200", "OK");//schrijf de HTTP response header + #if DEBUG >= 4 + fprintf(stderr, "Sending a video fragment. %i left in buffer.\n", (int)Flash_FragBuffer.size()); + #endif } } FlashBuf.append(tag->data,tag->len); From ce29cf218e68ec0e9bfb66a95af60d962cc44910 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sat, 19 Mar 2011 16:21:01 +0100 Subject: [PATCH 3/5] Poging tot betere fragment queue --- Connector_HTTP/main.cpp | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/Connector_HTTP/main.cpp b/Connector_HTTP/main.cpp index 1432604e..9d386ad6 100644 --- a/Connector_HTTP/main.cpp +++ b/Connector_HTTP/main.cpp @@ -127,7 +127,7 @@ int mainHandler(int CONN_fd){ std::string FlashBuf; std::string FlashMeta; bool Flash_ManifestSent = false; - bool Flash_RequestPending = false; + int Flash_RequestPending = 0; std::queue Flash_FragBuffer; FLV_Pack * tag = 0; HTTPReader HTTP_R, HTTP_S;//HTTP Receiver en HTTP Sender. @@ -178,12 +178,9 @@ int mainHandler(int CONN_fd){ ReqFragment = atoi( HTTP_R.url.substr(temp).c_str() ); #if DEBUG >= 4 printf( "URL: %s\n", HTTP_R.url.c_str()); - printf( "Movie Identifier: %s\n", Movie.c_str() ); - printf( "Quality Modifier: %s\n", Quality.c_str() ); - printf( "Segment: %d\n", Segment ); - printf( "Fragment: %d\n", ReqFragment ); + printf( "Movie: %s, Quality: %s, Seg %d Frag %d\n", Movie.c_str(), Quality.c_str(), Segment, ReqFragment); #endif - Flash_RequestPending = true; + Flash_RequestPending++; }else{ Movie = HTTP_R.url.substr(1); Movie = Movie.substr(0,Movie.find("/")); @@ -232,6 +229,17 @@ int mainHandler(int CONN_fd){ #endif inited = true; } + if ((Flash_RequestPending > 0) && !Flash_FragBuffer.empty()){ + HTTP_S.Clean(); + HTTP_S.SetHeader("Content-Type","video/mp4"); + HTTP_S.SetBody(Interface::mdatFold(Flash_FragBuffer.front())); + Flash_FragBuffer.pop(); + HTTP_S.SendResponse(CONN_fd, "200", "OK");//schrijf de HTTP response header + Flash_RequestPending--; + #if DEBUG >= 4 + fprintf(stderr, "Sending a video fragment. %i left in buffer, %i requested\n", (int)Flash_FragBuffer.size(), Flash_RequestPending); + #endif + } retval = epoll_wait(sspoller, events, 1, 1); switch (DDV_ready(ss)){ case 0: @@ -248,16 +256,6 @@ int mainHandler(int CONN_fd){ if (tag->isKeyframe){ Flash_FragBuffer.push(FlashBuf); FlashBuf = ""; - if (Flash_RequestPending){ - HTTP_S.Clean(); - HTTP_S.SetHeader("Content-Type","video/mp4"); - HTTP_S.SetBody(Interface::mdatFold(Flash_FragBuffer.front())); - Flash_FragBuffer.pop(); - HTTP_S.SendResponse(CONN_fd, "200", "OK");//schrijf de HTTP response header - #if DEBUG >= 4 - fprintf(stderr, "Sending a video fragment. %i left in buffer.\n", (int)Flash_FragBuffer.size()); - #endif - } } FlashBuf.append(tag->data,tag->len); } else { From 59e2f66238823a0ba4996add7cca3ba6c7fa360c Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sat, 19 Mar 2011 16:27:10 +0100 Subject: [PATCH 4/5] Wat debug info toegevoegd --- Connector_HTTP/main.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Connector_HTTP/main.cpp b/Connector_HTTP/main.cpp index 9d386ad6..c241c885 100644 --- a/Connector_HTTP/main.cpp +++ b/Connector_HTTP/main.cpp @@ -236,7 +236,7 @@ int mainHandler(int CONN_fd){ Flash_FragBuffer.pop(); HTTP_S.SendResponse(CONN_fd, "200", "OK");//schrijf de HTTP response header Flash_RequestPending--; - #if DEBUG >= 4 + #if DEBUG >= 3 fprintf(stderr, "Sending a video fragment. %i left in buffer, %i requested\n", (int)Flash_FragBuffer.size(), Flash_RequestPending); #endif } @@ -255,6 +255,9 @@ int mainHandler(int CONN_fd){ if(tag->data[0] != 0x12 ) { if (tag->isKeyframe){ Flash_FragBuffer.push(FlashBuf); + #if DEBUG >= 4 + fprintf(stderr, "Received a fragment. Now %i in buffer.\n", (int)Flash_FragBuffer.size()); + #endif FlashBuf = ""; } FlashBuf.append(tag->data,tag->len); From ef99414220ce9cffe9a2b180d79aee5d42fd9a81 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sat, 19 Mar 2011 16:45:46 +0100 Subject: [PATCH 5/5] Fixesheids --- Connector_HTTP/main.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Connector_HTTP/main.cpp b/Connector_HTTP/main.cpp index c241c885..3912698b 100644 --- a/Connector_HTTP/main.cpp +++ b/Connector_HTTP/main.cpp @@ -254,10 +254,12 @@ int mainHandler(int CONN_fd){ if (handler == HANDLER_FLASH){ if(tag->data[0] != 0x12 ) { if (tag->isKeyframe){ - Flash_FragBuffer.push(FlashBuf); - #if DEBUG >= 4 - fprintf(stderr, "Received a fragment. Now %i in buffer.\n", (int)Flash_FragBuffer.size()); - #endif + if (FlashBuf != ""){ + Flash_FragBuffer.push(FlashBuf); + #if DEBUG >= 4 + fprintf(stderr, "Received a fragment. Now %i in buffer.\n", (int)Flash_FragBuffer.size()); + #endif + } FlashBuf = ""; } FlashBuf.append(tag->data,tag->len);