diff options
author | Frank Schmirler <vdr@schmirler.de> | 2014-09-07 02:48:07 +0200 |
---|---|---|
committer | Frank Schmirler <vdr@schmirler.de> | 2014-09-07 02:48:07 +0200 |
commit | e83c9d92aa1c4a83e2fb9d2474e09dfd78be33ef (patch) | |
tree | b368170ef36d9825cbe62718cb327eadb7c14bcf /server/connectionHTTP.c | |
parent | 71c26e7455ea1180800dfdaead281fe4d7850abb (diff) | |
parent | 520adaf3da652f8b29de9882ac518470a5592842 (diff) | |
download | vdr-plugin-streamdev-e83c9d92aa1c4a83e2fb9d2474e09dfd78be33ef.tar.gz vdr-plugin-streamdev-e83c9d92aa1c4a83e2fb9d2474e09dfd78be33ef.tar.bz2 |
Implemented remuxing of recordings (closes #1892)
Diffstat (limited to 'server/connectionHTTP.c')
-rw-r--r-- | server/connectionHTTP.c | 61 |
1 files changed, 51 insertions, 10 deletions
diff --git a/server/connectionHTTP.c b/server/connectionHTTP.c index bcb4b58..517fb2e 100644 --- a/server/connectionHTTP.c +++ b/server/connectionHTTP.c @@ -35,6 +35,7 @@ cConnectionHTTP::cConnectionHTTP(void): cConnectionHTTP::~cConnectionHTTP() { + SetStreamer(NULL); delete m_RecPlayer; delete m_MenuList; } @@ -164,6 +165,14 @@ bool cConnectionHTTP::ProcessRequest(void) } } + tStrStrMap::const_iterator it; + it = m_Params.find("apid"); + if (it != m_Params.end()) + m_Apid[0] = atoi(it->second.c_str()); + it = m_Params.find("dpid"); + if (it != m_Params.end()) + m_Dpid[0] = atoi(it->second.c_str()); + tStrStrMap::const_iterator it_method = Headers().find(REQUEST_METHOD); tStrStrMap::const_iterator it_pathinfo = Headers().find(PATH_INFO); if (it_method == Headers().end() || it_pathinfo == Headers().end()) { @@ -196,30 +205,46 @@ bool cConnectionHTTP::ProcessRequest(void) } else if (m_RecPlayer != NULL) { Dprintf("GET recording\n"); + bool isPes = m_RecPlayer->getCurrentRecording()->IsPesRecording(); + // no remuxing for old PES recordings + if (isPes && m_StreamType != stPES) + return HttpResponse(503, true); + int64_t from, to; bool hasRange = ParseRange(from, to); cStreamdevRecStreamer* recStreamer; if (from == 0 && hasRange && m_ReplayFakeRange) { - recStreamer = new cStreamdevRecStreamer(m_RecPlayer, this); + recStreamer = new cStreamdevRecStreamer(this, m_RecPlayer, m_StreamType, (int64_t) 0L, m_Apid[0] ? m_Apid : NULL, m_Dpid[0] ? m_Dpid : NULL); from += m_ReplayPos; if (to >= 0) to += m_ReplayPos; } else - recStreamer = new cStreamdevRecStreamer(m_RecPlayer, this, m_ReplayPos); + recStreamer = new cStreamdevRecStreamer(this, m_RecPlayer, m_StreamType, m_ReplayPos, m_Apid[0] ? m_Apid : NULL, m_Dpid[0] ? m_Dpid : NULL); SetStreamer(recStreamer); + + if (m_StreamType == stEXT) + return Respond("HTTP/1.0 200 OK"); + else if (m_StreamType == stES && (m_Apid[0] || m_Dpid[0])) + return HttpResponse(200, false, "audio/mpeg"); + + const char* contentType = (isPes || m_RecPlayer->getPatPmtData()->Vpid()) ? "video/mpeg" : "audio/mpeg"; + // range not supported when remuxing + if (m_StreamType != stTS && !isPes) + return HttpResponse(200, false, contentType); + uint64_t total = recStreamer->GetLength(); if (hasRange) { int64_t length = recStreamer->SetRange(from, to); Dprintf("range response: %lld-%lld/%lld, len %lld\n", (long long)from, (long long)to, (long long)total, (long long)length); if (length < 0L) - return HttpResponse(416, true, "video/mpeg", "Accept-Ranges: bytes\r\nContent-Range: bytes */%llu", (unsigned long long) total); + return HttpResponse(416, true, contentType, "Accept-Ranges: bytes\r\nContent-Range: bytes */%llu", (unsigned long long) total); else - return HttpResponse(206, false, "video/mpeg", "Accept-Ranges: bytes\r\nContent-Range: bytes %lld-%lld/%llu\r\nContent-Length: %lld", (long long) from, (long long) to, (unsigned long long) total, (long long) length); + return HttpResponse(206, false, contentType, "Accept-Ranges: bytes\r\nContent-Range: bytes %lld-%lld/%llu\r\nContent-Length: %lld", (long long) from, (long long) to, (unsigned long long) total, (long long) length); } else - return HttpResponse(200, false, "video/mpeg", "Accept-Ranges: bytes"); + return HttpResponse(200, false, contentType, "Accept-Ranges: bytes"); } else { return HttpResponse(404, true); @@ -247,29 +272,45 @@ bool cConnectionHTTP::ProcessRequest(void) } else if (m_RecPlayer != NULL) { Dprintf("HEAD recording\n"); + bool isPes = m_RecPlayer->getCurrentRecording()->IsPesRecording(); + // no remuxing for old PES recordings + if (isPes && m_StreamType != stPES) + return HttpResponse(503, true); + int64_t from, to; bool hasRange = ParseRange(from, to); cStreamdevRecStreamer* recStreamer; if (from == 0 && hasRange && m_ReplayFakeRange) { - recStreamer = new cStreamdevRecStreamer(m_RecPlayer, this, m_ReplayPos); + recStreamer = new cStreamdevRecStreamer(this, m_RecPlayer, m_StreamType, m_ReplayPos, m_Apid[0] ? m_Apid : NULL, m_Dpid[0] ? m_Dpid : NULL); from += m_ReplayPos; if (to >= 0) to += m_ReplayPos; } else - recStreamer = new cStreamdevRecStreamer(m_RecPlayer, this, m_ReplayPos); + recStreamer = new cStreamdevRecStreamer(this, m_RecPlayer, m_StreamType, m_ReplayPos, m_Apid[0] ? m_Apid : NULL, m_Dpid[0] ? m_Dpid : NULL); SetStreamer(recStreamer); + + if (m_StreamType == stEXT) + return Respond("HTTP/1.0 200 OK"); + else if (m_StreamType == stES && (m_Apid[0] || m_Dpid[0])) + return HttpResponse(200, true, "audio/mpeg"); + + const char* contentType = (isPes || m_RecPlayer->getPatPmtData()->Vpid()) ? "video/mpeg" : "audio/mpeg"; + // range not supported when remuxing + if (m_StreamType != stTS && !isPes) + return HttpResponse(200, false, contentType); + uint64_t total = recStreamer->GetLength(); if (hasRange) { int64_t length = recStreamer->SetRange(from, to); if (length < 0L) - return HttpResponse(416, true, "video/mpeg", "Accept-Ranges: bytes\r\nContent-Range: bytes */%llu", (unsigned long long) total); + return HttpResponse(416, true, contentType, "Accept-Ranges: bytes\r\nContent-Range: bytes */%llu", (unsigned long long) total); else - return HttpResponse(206, true, "video/mpeg", "Accept-Ranges: bytes\r\nContent-Range: bytes %lld-%lld/%llu\r\nContent-Length: %lld", (long long) from, (long long) to, (unsigned long long) total, (long long) length); + return HttpResponse(206, true, contentType, "Accept-Ranges: bytes\r\nContent-Range: bytes %lld-%lld/%llu\r\nContent-Length: %lld", (long long) from, (long long) to, (unsigned long long) total, (long long) length); } else - return HttpResponse(200, true, "video/mpeg", "Accept-Ranges: bytes"); + return HttpResponse(200, true, contentType, "Accept-Ranges: bytes"); } else { return HttpResponse(404, true); |