diff --git a/components/codecs/include/ftl/codecs/bitrates.hpp b/components/codecs/include/ftl/codecs/bitrates.hpp index 8e41b13f7e4d9b77ad38cf23fdb2622d2107a537..976e039fc07b3dd15e7f4ede219ed06c27cff0fe 100644 --- a/components/codecs/include/ftl/codecs/bitrates.hpp +++ b/components/codecs/include/ftl/codecs/bitrates.hpp @@ -36,7 +36,9 @@ enum struct definition_t : uint8_t { SD576 = 4, SD480 = 5, LD360 = 6, - Any = 7 + Any = 7, + + HTC_VIVE = 8 // TODO: Add audio definitions }; @@ -66,7 +68,7 @@ enum struct bitrate_t { * the best quality and kPreset9 is the worst. The use of presets is useful for * adaptive bitrate scenarios where the numbers are increased or decreased. */ -typedef uint8_t preset_t; +typedef int8_t preset_t; static const preset_t kPreset0 = 0; static const preset_t kPreset1 = 1; static const preset_t kPreset2 = 2; @@ -81,6 +83,8 @@ static const preset_t kPresetBest = 0; static const preset_t kPresetWorst = 9; static const preset_t kPresetLQThreshold = 4; +static const preset_t kPresetHTCVive = -1; + /** * Represents the details of each preset codec configuration. */ diff --git a/components/codecs/src/bitrates.cpp b/components/codecs/src/bitrates.cpp index 519c86712487a8be9285f28392342e6ca6c16713..035e850d1ff20f5e113db2f7004b85c8bbea3040 100644 --- a/components/codecs/src/bitrates.cpp +++ b/components/codecs/src/bitrates.cpp @@ -8,6 +8,10 @@ using ftl::codecs::preset_t; using ftl::codecs::definition_t; using ftl::codecs::codec_t; +static const CodecPreset special_presets[] = { + definition_t::HTC_VIVE, definition_t::HTC_VIVE, bitrate_t::High, bitrate_t::High +}; + static const CodecPreset presets[] = { definition_t::HD1080, definition_t::HD1080, bitrate_t::High, bitrate_t::High, definition_t::HD1080, definition_t::HD720, bitrate_t::Standard, bitrate_t::Standard, @@ -35,7 +39,9 @@ static const Resolution resolutions[] = { 1280, 720, // HD720 1024, 576, // SD576 854, 480, // SD480 - 640, 360 // LD360 + 640, 360, // LD360 + 0, 0, // ANY + 1852, 2056 // HTC_VIVE }; int ftl::codecs::getWidth(definition_t d) { @@ -47,6 +53,7 @@ int ftl::codecs::getHeight(definition_t d) { } const CodecPreset &ftl::codecs::getPreset(preset_t p) { + if (p < 0 && p >= -1) return special_presets[std::abs(p+1)]; if (p > kPresetWorst) return presets[kPresetWorst]; if (p < kPresetBest) return presets[kPresetBest]; return presets[p]; diff --git a/components/codecs/src/encoder.cpp b/components/codecs/src/encoder.cpp index 3ebe40cf91ad75cec92937b013d3215de4104004..fdacc89596668937f8f465995f52f0955bbded01 100644 --- a/components/codecs/src/encoder.cpp +++ b/components/codecs/src/encoder.cpp @@ -73,5 +73,6 @@ bool Encoder::encode(const cv::Mat &in, preset_t preset, const auto &settings = ftl::codecs::getPreset(preset); const definition_t definition = (in.type() == CV_32F) ? settings.depth_res : settings.colour_res; const bitrate_t bitrate = (in.type() == CV_32F) ? settings.depth_qual : settings.colour_qual; + LOG(INFO) << "Encode definition: " << (int)definition; return encode(in, definition, bitrate, cb); } diff --git a/components/codecs/src/nvpipe_decoder.cpp b/components/codecs/src/nvpipe_decoder.cpp index bd0273a2747ecd4501a8c755c4cccf1423ba7440..74519a8f2f3b1b5c8e4eb13ea23ff89778402825 100644 --- a/components/codecs/src/nvpipe_decoder.cpp +++ b/components/codecs/src/nvpipe_decoder.cpp @@ -62,6 +62,8 @@ bool NvPipeDecoder::decode(const ftl::codecs::Packet &pkt, cv::Mat &out) { is_float_channel_ = is_float_frame; last_definition_ = pkt.definition; + //LOG(INFO) << "DECODE RESOLUTION: (" << (int)pkt.definition << ") " << ftl::codecs::getWidth(pkt.definition) << "x" << ftl::codecs::getHeight(pkt.definition); + // Build a decoder instance of the correct kind if (nv_decoder_ == nullptr) { nv_decoder_ = NvPipe_CreateDecoder( diff --git a/components/codecs/src/nvpipe_encoder.cpp b/components/codecs/src/nvpipe_encoder.cpp index 1b91c13d083c2bb48a14805d480793a2b3215580..80bde1f9fac0dc63fc68db845b7e53084f6c59ec 100644 --- a/components/codecs/src/nvpipe_encoder.cpp +++ b/components/codecs/src/nvpipe_encoder.cpp @@ -72,7 +72,22 @@ void scaleDownAndPad(cv::Mat &in, cv::Mat &out) { bool NvPipeEncoder::encode(const cv::Mat &in, definition_t odefinition, bitrate_t bitrate, const std::function<void(const ftl::codecs::Packet&)> &cb) { cudaSetDevice(0); - auto definition = _verifiedDefinition(odefinition, in); + auto definition = odefinition; //_verifiedDefinition(odefinition, in); + + auto width = ftl::codecs::getWidth(definition); + auto height = ftl::codecs::getHeight(definition); + + cv::Mat tmp; + if (width != in.cols || height != in.rows) { + LOG(WARNING) << "Mismatch resolution with encoding resolution"; + if (in.type() == CV_32F) { + cv::resize(in, tmp, cv::Size(width,height), 0.0, 0.0, cv::INTER_NEAREST); + } else { + cv::resize(in, tmp, cv::Size(width,height)); + } + } else { + tmp = in; + } //LOG(INFO) << "Definition: " << ftl::codecs::getWidth(definition) << "x" << ftl::codecs::getHeight(definition); @@ -80,17 +95,17 @@ bool NvPipeEncoder::encode(const cv::Mat &in, definition_t odefinition, bitrate_ LOG(ERROR) << "Missing data for Nvidia encoder"; return false; } - if (!_createEncoder(in, definition, bitrate)) return false; + if (!_createEncoder(tmp, definition, bitrate)) return false; //LOG(INFO) << "NvPipe Encode: " << int(definition) << " " << in.cols; - cv::Mat tmp; - if (in.type() == CV_32F) { - in.convertTo(tmp, CV_16UC1, 1000); - } else if (in.type() == CV_8UC3) { - cv::cvtColor(in, tmp, cv::COLOR_BGR2BGRA); + //cv::Mat tmp; + if (tmp.type() == CV_32F) { + tmp.convertTo(tmp, CV_16UC1, 1000); + } else if (tmp.type() == CV_8UC3) { + cv::cvtColor(tmp, tmp, cv::COLOR_BGR2BGRA); } else { - in.copyTo(tmp); + //in.copyTo(tmp); } // scale/pad to fit output format diff --git a/components/rgbd-sources/src/streamer.cpp b/components/rgbd-sources/src/streamer.cpp index c446445c9566f8b3560fc9b8f0b4123eaa427fa2..939252d77a6704bf7c9c5a2202ec72a6c45562a8 100644 --- a/components/rgbd-sources/src/streamer.cpp +++ b/components/rgbd-sources/src/streamer.cpp @@ -127,6 +127,20 @@ Streamer::Streamer(nlohmann::json &config, Universe *net) //net->bind("ping_streamer", [this](unsigned long long time) -> unsigned long long { // return time; //}); + + on("hq_bitrate", [this](const ftl::config::Event &e) { + UNIQUE_LOCK(mutex_,ulk); + for (auto &s : sources_) { + s.second->hq_bitrate = value("hq_bitrate", ftl::codecs::kPresetBest); + } + }); + + on("lq_bitrate", [this](const ftl::config::Event &e) { + UNIQUE_LOCK(mutex_,ulk); + for (auto &s : sources_) { + s.second->lq_bitrate = value("lq_bitrate", ftl::codecs::kPresetWorst); + } + }); } Streamer::~Streamer() { @@ -166,6 +180,10 @@ void Streamer::add(Source *src) { s->clientCount = 0; s->hq_count = 0; s->lq_count = 0; + + s->hq_bitrate = value("hq_bitrate", ftl::codecs::kPresetBest); + s->lq_bitrate = value("lq_bitrate", ftl::codecs::kPresetWorst); + sources_[src->getID()] = s; group_.addSource(src);