summaryrefslogtreecommitdiff
path: root/httptnt/resourceStreamer.ecpp
diff options
context:
space:
mode:
authormethodus <methodus@web.de>2012-10-15 07:31:26 +0200
committermethodus <methodus@web.de>2012-10-15 07:31:26 +0200
commit6ceb9fdba8785f791b790e0a987a4bfea5cf431d (patch)
treef808c350599b36a37cadf19b3ad913aa1053267e /httptnt/resourceStreamer.ecpp
parente57c713c24464c73f6cccf0d042b8e63688a65b7 (diff)
downloadvdr-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.ecpp86
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>
<#