From dcf9137b19f514d929fdd9f9c81f4461b531c557 Mon Sep 17 00:00:00 2001 From: emeric Date: Sat, 11 Oct 2014 18:28:35 +0200 Subject: [PATCH] Removed unnecessary output transcode queue --- src/remote/server/MediaRequestHandler.cpp | 26 ++++++------- src/remote/server/MediaRequestHandler.hpp | 4 +- src/transcode/AvConvTranscoder.cpp | 13 ++++--- src/transcode/AvConvTranscoder.hpp | 14 +++---- .../AvConvTranscodeStreamResource.cpp | 39 +++++++------------ 5 files changed, 41 insertions(+), 55 deletions(-) diff --git a/src/remote/server/MediaRequestHandler.cpp b/src/remote/server/MediaRequestHandler.cpp index 10ea5d16..40a0c4e2 100644 --- a/src/remote/server/MediaRequestHandler.cpp +++ b/src/remote/server/MediaRequestHandler.cpp @@ -164,32 +164,28 @@ bool MediaRequestHandler::processGetPart(const MediaRequest::GetPart& request, MediaResponse::PartResult& response) { std::size_t dataSize = request.requested_data_size(); + std::vector data; if (dataSize > _maxPartSize) dataSize = _maxPartSize; - if (_transcoders.find(request.handle()) == _transcoders.end()) + TranscoderMap::iterator itTranscoder = _transcoders.find(request.handle()); + if (itTranscoder == _transcoders.end()) { LMS_LOG(MOD_REMOTE, SEV_ERROR) << "No transcoder found for handle " << request.handle(); return true; } - std::shared_ptr transcoder = _transcoders[request.handle()]; + std::shared_ptr transcoder = itTranscoder->second; - while (!transcoder->isComplete() && transcoder->getOutputData().size() < dataSize) - transcoder->process(); + if (!transcoder->isComplete()) + { + data.reserve(dataSize); + transcoder->process(data, dataSize); + } - LMS_LOG(MOD_REMOTE, SEV_DEBUG) << "MediaRequestHandler::processGetPart, handle = " << request.handle() << ", isComplete = " << std::boolalpha << transcoder->isComplete() << ", size = " << transcoder->getOutputData().size(); + LMS_LOG(MOD_REMOTE, SEV_DEBUG) << "MediaRequestHandler::processGetPart, handle = " << request.handle() << ", isComplete = " << std::boolalpha << transcoder->isComplete() << ", size = " << data.size(); - Transcode::AvConvTranscoder::data_type::iterator itEnd; - if (transcoder->getOutputData().size() > dataSize) - itEnd = transcoder->getOutputData().begin() + dataSize; - else - itEnd = transcoder->getOutputData().end(); - - std::copy(transcoder->getOutputData().begin(), itEnd, std::back_inserter(*response.mutable_data())); - - // Consume sent bytes - transcoder->getOutputData().erase(transcoder->getOutputData().begin(), itEnd); + std::copy(data.begin(), data.end(), std::back_inserter(*response.mutable_data())); return true; } diff --git a/src/remote/server/MediaRequestHandler.hpp b/src/remote/server/MediaRequestHandler.hpp index e1b749c8..675ca59c 100644 --- a/src/remote/server/MediaRequestHandler.hpp +++ b/src/remote/server/MediaRequestHandler.hpp @@ -46,7 +46,9 @@ class MediaRequestHandler // bool processVideoPrepare(const AudioCollectionRequest::GetGenreList& request, AudioCollectionResponse::GenreList& response); - std::map > _transcoders; + typedef std::map > TranscoderMap; + + TranscoderMap _transcoders; Database::Handler& _db; diff --git a/src/transcode/AvConvTranscoder.cpp b/src/transcode/AvConvTranscoder.cpp index 24ba29a1..8700ed20 100644 --- a/src/transcode/AvConvTranscoder.cpp +++ b/src/transcode/AvConvTranscoder.cpp @@ -168,14 +168,17 @@ AvConvTranscoder::AvConvTranscoder(const Parameters& parameters) } void -AvConvTranscoder::process(void) +AvConvTranscoder::process(std::vector& output, std::size_t maxSize) { - std::size_t readDatasSize = 1024; // TODO parametrize elsewhere? + std::size_t readDataSize = 0; + + if (_isComplete) + return; char ch; - while(readDatasSize != 0 && _in && _in.get(ch)) { - _data.push_back(ch); - --readDatasSize; + while(readDataSize < maxSize && _in && _in.get(ch)) { + output.push_back(ch); + readDataSize++; } if (!_in || _in.fail() || _in.eof()) { diff --git a/src/transcode/AvConvTranscoder.hpp b/src/transcode/AvConvTranscoder.hpp index e43612dd..e3663809 100644 --- a/src/transcode/AvConvTranscoder.hpp +++ b/src/transcode/AvConvTranscoder.hpp @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include @@ -37,21 +37,18 @@ namespace Transcode class AvConvTranscoder { public: - - typedef std::deque data_type; - static void init(); ~AvConvTranscoder(); AvConvTranscoder(const Parameters& parameters); - data_type& getOutputData() { return _data; } - const Parameters& getParameters(void) const { return _parameters; } - // Process a bunch of input data - void process(void); + // Get a bunch of input data + // Place it at the end of the parameter, no more that maxSize bytes + void process(std::vector& output, std::size_t maxSize); + bool isComplete(void) const { return _isComplete;}; private: @@ -74,7 +71,6 @@ class AvConvTranscoder static boost::filesystem::path _avConvPath; - data_type _data; bool _isComplete; }; diff --git a/src/ui/resource/AvConvTranscodeStreamResource.cpp b/src/ui/resource/AvConvTranscodeStreamResource.cpp index 28fcc20e..55df2c00 100644 --- a/src/ui/resource/AvConvTranscodeStreamResource.cpp +++ b/src/ui/resource/AvConvTranscodeStreamResource.cpp @@ -44,6 +44,8 @@ void AvConvTranscodeStreamResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Response& response) { + static const std::size_t chunkSize = 8192; // TODO parametrize? + // see if this request is for a continuation: Wt::Http::ResponseContinuation *continuation = request.continuation(); @@ -59,34 +61,21 @@ AvConvTranscodeStreamResource::handleRequest(const Wt::Http::Request& request, response.setMimeType(_parameters.getOutputFormat().getMimeType()); } - Transcode::AvConvTranscoder::data_type& data = transcoder->getOutputData(); - - while (!transcoder->isComplete() && data.size() < _bufferSize) - transcoder->process(); - - // Give the client all the output data - Transcode::AvConvTranscoder::data_type::const_iterator it = data.begin(); - bool copySuccess = true; - std::size_t copiedSize = 0; - for (Transcode::AvConvTranscoder::data_type::const_iterator it = data.begin(); it != data.end(); ++it) + if (!transcoder->isComplete()) { - if (!response.out().put(*it)) { - copySuccess = false; - break; - } - else - copiedSize++; + std::vector data; + data.reserve(chunkSize); + + transcoder->process(data, chunkSize); + + // Give the client all the output data + response.out().write(reinterpret_cast(&data[0]), data.size()); + + if (!response.out()) + LMS_LOG(MOD_UI, SEV_ERROR) << "Write failed!"; } - LMS_LOG(MOD_UI, SEV_DEBUG) << "Wrote " << copiedSize << " bytes"; - - if (!copySuccess) - LMS_LOG(MOD_UI, SEV_ERROR) << "** Write failed!"; - - // Consume copied bytes - data.erase(data.begin(), data.begin() + copiedSize); - - if (copySuccess && !transcoder->isComplete()) { + if (!transcoder->isComplete() && response.out()) { continuation = response.createContinuation(); continuation->setData(transcoder); LMS_LOG(MOD_UI, SEV_DEBUG) << "Continuation set!";