diff options
author | methodus <methodus@web.de> | 2012-10-15 07:31:26 +0200 |
---|---|---|
committer | methodus <methodus@web.de> | 2012-10-15 07:31:26 +0200 |
commit | 6ceb9fdba8785f791b790e0a987a4bfea5cf431d (patch) | |
tree | f808c350599b36a37cadf19b3ad913aa1053267e /httptnt/resourceStreamer.ecpp | |
parent | e57c713c24464c73f6cccf0d042b8e63688a65b7 (diff) | |
download | vdr-plugin-upnp-6ceb9fdba8785f791b790e0a987a4bfea5cf431d.tar.gz vdr-plugin-upnp-6ceb9fdba8785f791b790e0a987a4bfea5cf431d.tar.bz2 |
First success to stream recordings. However, seeking and different play speeds do not work, yet.
Diffstat (limited to 'httptnt/resourceStreamer.ecpp')
-rw-r--r-- | httptnt/resourceStreamer.ecpp | 86 |
1 files changed, 48 insertions, 38 deletions
diff --git a/httptnt/resourceStreamer.ecpp b/httptnt/resourceStreamer.ecpp index 3ab17bd..67aa69a 100644 --- a/httptnt/resourceStreamer.ecpp +++ b/httptnt/resourceStreamer.ecpp @@ -37,6 +37,7 @@ int doRequest(tnt::HttpReply reply, tnt::HttpRequest request, std::string object int code = HTTP_OK; + //reply.setKeepAliveHeader(); reply.setContentType(streamer->GetContentType()); reply.setHeader("friendlyName.dlna.org ", server->GetServerDescription().friendlyName); reply.setHeader("contentFeatures.dlna.org ", streamer->GetContentFeatures()); @@ -44,7 +45,7 @@ int doRequest(tnt::HttpReply reply, tnt::HttpRequest request, std::string object if(streamer->GetContentLength() > 0){ reply.setContentLengthHeader(streamer->GetContentLength()); - if(streamer->Seekable()) reply.setHeader("Accept-Ranges", "bytes"); + if(streamer->Seekable()) reply.setHeader("Accept-Ranges ", "bytes"); } if(!request.isMethodHEAD()){ @@ -54,59 +55,68 @@ int doRequest(tnt::HttpReply reply, tnt::HttpRequest request, std::string object goto ret; } - int offset = 0, length = std::numeric_limits<long>::max(); + unsigned long offset = 0, length = streamer->GetContentLength(); + ssize_t bytesRead = 0; bool hasRange = false; - if(streamer->Seekable() && streamer->GetContentLength() > 0){ - if(request.hasHeader("Range")){ - std::string rangeRequest = request.getHeader("Range"); - if(rangeRequest.find("bytes=",0) == 0){ - int minus = rangeRequest.find_first_of('-',6); + if(request.hasHeader("Range:")){ + std::string rangeRequest = request.getHeader("Range:"); + if(rangeRequest.find("bytes=",0) == 0){ + unsigned int minus = rangeRequest.find_first_of('-',6); + if(minus != std::string::npos){ offset = atoi(rangeRequest.substr(6, minus - 6).c_str()); length = atoi(rangeRequest.substr(minus + 1).c_str()) - offset; - - if(length == 0) length = std::numeric_limits<long>::max(); - - hasRange = (offset == 0 && length == std::numeric_limits<long>::max()) ? false : true; + if(length == 0){ + length = streamer->GetContentLength() - offset; + } else { + if(length > MB(1)) + length = MB(1); + hasRange = true; + } } } + } + + if(hasRange && streamer->Seekable() && streamer->GetContentLength() > 0){ if(!streamer->Seek(offset, SEEK_SET)){ code = HTTP_INTERNAL_SERVER_ERROR; - goto ret; + goto close; } - } - char buffer[KB(16)]; - ssize_t bytesRead = 0; - size_t totalBytesRead = 0; - size_t toRead = std::min<size_t>(length, sizeof(buffer)); - while (0 < (bytesRead = streamer->Read(buffer, toRead)) && length > 0) { - reply.out().write(buffer, bytesRead); - if (!reply.out()) { - code = HTTP_GONE; - goto ret; + char buffer[length]; + if((bytesRead = streamer->Read(buffer, length)) > 0){ + std::stringstream ss; + ss << "bytes " << offset << "-" << offset + bytesRead << "/" << streamer->GetContentLength(); + reply.setHeader("Content-Range ", ss.str()); + reply.setContentLengthHeader(bytesRead); + code = HTTP_PARTIAL_CONTENT; + reply.out().write(buffer, bytesRead); + if (!reply.out()) { + code = HTTP_GONE; + goto close; + } + } + + } else { + reply.setDirectMode(); + char buffer[KB(20)]; + while ((bytesRead = streamer->Read(buffer, KB(20))) > 0) { + reply.out().write(buffer, bytesRead); + if (!reply.out()) { + code = HTTP_GONE; + goto close; + } } - length -= bytesRead; - totalBytesRead += bytesRead; - toRead = std::min<size_t>(length, sizeof(buffer)); - } - - reply.setContentLengthHeader(totalBytesRead); - - if ((bytesRead < 0 || length <= 0) && hasRange) { - std::stringstream ss; - ss << "bytes " << offset << "-" << offset + totalBytesRead << "/" << streamer->GetContentLength(); - reply.setHeader("Content-Range", ss.str()); - code = HTTP_PARTIAL_CONTENT; - goto ret; } - + } else { + goto ret; } - ret: + close: streamer->Close(); - //reply.out() << std::flush; + ret: + reply.out() << std::flush; return code; </%cpp> <# |