diff --git a/components/codecs/include/ftl/codecs/packet.hpp b/components/codecs/include/ftl/codecs/packet.hpp index 040f8a1dae03d2f0f87bc34d54c022ab41845bf3..65c07580e471f2362b3a4056bc03e78d26ead094 100644 --- a/components/codecs/include/ftl/codecs/packet.hpp +++ b/components/codecs/include/ftl/codecs/packet.hpp @@ -37,9 +37,9 @@ struct IndexHeader { struct Packet { ftl::codecs::codec_t codec; uint8_t reserved=0; - uint8_t frame_count; // v4+ Frames included in this packet + uint8_t frame_count=1; // v4+ Frames included in this packet uint8_t bitrate=0; // v4+ For multi-bitrate encoding, 0=highest - uint8_t flags; // Codec dependent flags (eg. I-Frame or P-Frame) + uint8_t flags=0; // Codec dependent flags (eg. I-Frame or P-Frame) std::vector<uint8_t> data; MSGPACK_DEFINE(codec, reserved, frame_count, bitrate, flags, data); diff --git a/components/codecs/src/nvidia_encoder.cpp b/components/codecs/src/nvidia_encoder.cpp index 62ae6b0f1aa0a5e63d5b557fd47c1c6531dc706d..a15d6e5980de3f3fd985300ff60cbd678cbc37c9 100644 --- a/components/codecs/src/nvidia_encoder.cpp +++ b/components/codecs/src/nvidia_encoder.cpp @@ -1,5 +1,5 @@ #include <ftl/codecs/nvidia_encoder.hpp> -//#include <loguru.hpp> +#include <loguru.hpp> #include <ftl/timer.hpp> #include <ftl/codecs/codecs.hpp> #include <ftl/cuda_util.hpp> @@ -211,7 +211,7 @@ bool NvidiaEncoder::_createEncoder(const cv::cuda::GpuMat &in, const ftl::codecs if (nvenc_ && (params == params_)) return true; uint64_t bitrate = calculateBitrate(in.cols*in.rows, float(pkt.bitrate)/255.0f) * pkt.frame_count; - //LOG(INFO) << "Calculated bitrate " << ((params.is_float) ? "(float)" : "(rgb)") << ": " << bitrate; + LOG(INFO) << "Calculated bitrate " << (float(bitrate) / 1024.0f / 1024.0f) << "Mbps (" << int(pkt.bitrate) << ")"; params_ = params; diff --git a/components/streams/include/ftl/streams/sender.hpp b/components/streams/include/ftl/streams/sender.hpp index 66b782b0c729ecd759b4eecbeeb19d8a0a376753..2feb3bbe032594866b6ec79fd4d13e9e218cda47 100644 --- a/components/streams/include/ftl/streams/sender.hpp +++ b/components/streams/include/ftl/streams/sender.hpp @@ -96,7 +96,7 @@ class Sender : public ftl::Configurable { void _encodeDataChannel(ftl::rgbd::FrameSet &fs, ftl::codecs::Channel c, bool reset, bool last_flush); void _encodeDataChannel(ftl::data::Frame &fs, ftl::codecs::Channel c, bool reset); - int _generateTiles(const ftl::rgbd::FrameSet &fs, int offset, ftl::codecs::Channel c, cv::cuda::Stream &stream, bool, bool); + int _generateTiles(const ftl::rgbd::FrameSet &fs, int offset, ftl::codecs::Channel c, cv::cuda::Stream &stream, bool); EncodingState &_getTile(int fsid, ftl::codecs::Channel c); cv::Rect _generateROI(const ftl::rgbd::FrameSet &fs, ftl::codecs::Channel c, int offset, bool stereo); float _selectFloatMax(ftl::codecs::Channel c); diff --git a/components/streams/src/sender.cpp b/components/streams/src/sender.cpp index ae56595b7c30275fdb3d6766b455cc5dccf6eb17..a7000329a73e4cfe7ca50f0949cde6a17722f94b 100644 --- a/components/streams/src/sender.cpp +++ b/components/streams/src/sender.cpp @@ -395,12 +395,22 @@ void Sender::setActiveEncoders(uint32_t fsid, const std::unordered_set<Channel> } void Sender::_encodeVideoChannel(ftl::data::FrameSet &fs, Channel c, bool reset, bool last_flush) { - bool lossless = value("lossless", false); - int max_bitrate = std::max(0, std::min(255, value("max_bitrate", 128))); + bool isfloat = ftl::codecs::type(c) == CV_32F; + + bool lossless = (isfloat) ? value("lossless_float", true) : value("lossless_colour", false); + int bitrate = std::max(0, std::min(255, (isfloat) ? value("bitrate_float", 200) : value("bitrate_colour", 64))); + //int min_bitrate = std::max(0, std::min(255, value("min_bitrate", 0))); // TODO: Use this - codec_t codec = static_cast<codec_t>(value("codec", static_cast<int>(codec_t::Any))); + codec_t codec = static_cast<codec_t>( + (isfloat) ? value("codec_float", static_cast<int>(codec_t::Any)) : + value("codec_colour", static_cast<int>(codec_t::Any))); + device_t device = static_cast<device_t>(value("encoder_device", static_cast<int>(device_t::Any))); + if (codec == codec_t::Any) { + codec = (lossless) ? codec_t::HEVC_LOSSLESS : codec_t::HEVC; + } + // TODO: Support high res bool is_stereo = value("stereo", false) && c == Channel::Colour && fs.firstFrame().hasChannel(Channel::Colour2); @@ -457,7 +467,7 @@ void Sender::_encodeVideoChannel(ftl::data::FrameSet &fs, Channel c, bool reset, //} } - int count = _generateTiles(fs, offset, cc, enc->stream(), lossless, is_stereo); + int count = _generateTiles(fs, offset, cc, enc->stream(), is_stereo); if (count <= 0) { LOG(ERROR) << "Could not generate tiles."; break; @@ -473,7 +483,7 @@ void Sender::_encodeVideoChannel(ftl::data::FrameSet &fs, Channel c, bool reset, ftl::codecs::Packet pkt; pkt.frame_count = count; pkt.codec = codec; - pkt.bitrate = (!lossless && ftl::codecs::isFloatChannel(cc)) ? max_bitrate : max_bitrate/2; + pkt.bitrate = bitrate; pkt.flags = 0; // In the event of partial frames, add a flag to indicate that @@ -668,7 +678,7 @@ float Sender::_selectFloatMax(Channel c) { } } -int Sender::_generateTiles(const ftl::rgbd::FrameSet &fs, int offset, Channel c, cv::cuda::Stream &stream, bool lossless, bool stereo) { +int Sender::_generateTiles(const ftl::rgbd::FrameSet &fs, int offset, Channel c, cv::cuda::Stream &stream, bool stereo) { auto &surface = _getTile(fs.id(), c); const ftl::data::Frame *cframe = nullptr; //&fs.frames[offset];