diff --git a/components/codecs/include/ftl/codecs/packet.hpp b/components/codecs/include/ftl/codecs/packet.hpp index 546da9ac9e654757730284d269d6c56e305a3175..2f808cc6d0a75735ade215b515c9864c96dccd6f 100644 --- a/components/codecs/include/ftl/codecs/packet.hpp +++ b/components/codecs/include/ftl/codecs/packet.hpp @@ -36,18 +36,14 @@ struct IndexHeader { */ struct Packet { ftl::codecs::codec_t codec; - ftl::codecs::definition_t definition; // Data resolution union { - [[deprecated]] uint8_t block_total; // v1-3 Packets expected per frame - uint8_t frame_count; // v4+ Frames included in this packet + [[deprecated]] ftl::codecs::definition_t definition; // Data resolution + uint8_t reserved=0; }; - union { - [[deprecated]] uint8_t block_number; // v1-3 This packets number within a frame + uint8_t frame_count; // 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) std::vector<uint8_t> data; diff --git a/components/codecs/src/nvidia_encoder.cpp b/components/codecs/src/nvidia_encoder.cpp index 1df49b0e15170b2dfc823e009bc4fa3ef8efebeb..a0b3677c060c96ab22ba225251dabdcd2d83037a 100644 --- a/components/codecs/src/nvidia_encoder.cpp +++ b/components/codecs/src/nvidia_encoder.cpp @@ -104,8 +104,8 @@ static ftl::codecs::NvidiaEncoder::Parameters generateParams(const cv::cuda::Gpu return params; } -static uint64_t calculateBitrate(definition_t def, float ratescale) { - float bitrate = 1.0f; // Megabits +static uint64_t calculateBitrate(int64_t pixels, float ratescale) { + /*float bitrate = 1.0f; // Megabits switch (def) { case definition_t::UHD4k : bitrate = 40.0f; break; case definition_t::HTC_VIVE : bitrate = 32.0f; break; @@ -115,9 +115,11 @@ static uint64_t calculateBitrate(definition_t def, float ratescale) { case definition_t::SD480 : bitrate = 4.0f; break; case definition_t::LD360 : bitrate = 2.0f; break; default : bitrate = 16.0f; - } + }*/ + + float bitrate = 8.0f * float(pixels); - bitrate *= 1000.0f*1000.0f; + //bitrate *= 1000.0f*1000.0f; float minrate = 0.05f * bitrate; return uint64_t((bitrate - minrate)*ratescale + minrate); } @@ -147,19 +149,19 @@ static bool validate(const cv::cuda::GpuMat &in, ftl::codecs::Packet &pkt) { } if (pkt.frame_count == 0) { - pkt.definition = definition_t::Invalid; + //pkt.definition = definition_t::Invalid; return false; } - auto [tx,ty] = ftl::codecs::chooseTileConfig(pkt.frame_count); + /*auto [tx,ty] = ftl::codecs::chooseTileConfig(pkt.frame_count); pkt.definition = (pkt.definition == definition_t::Any) ? ftl::codecs::findDefinition(in.cols/tx, in.rows/ty) : pkt.definition; if (pkt.definition == definition_t::Invalid || pkt.definition == definition_t::Any) { LOG(ERROR) << "Could not find appropriate definition"; return false; - } + }*/ - auto width = ftl::codecs::getWidth(pkt.definition)*tx; - auto height = ftl::codecs::getHeight(pkt.definition)*ty; + auto width = in.cols; //ftl::codecs::getWidth(pkt.definition)*tx; + auto height = in.rows; //ftl::codecs::getHeight(pkt.definition)*ty; if (in.empty()) { LOG(WARNING) << "No data"; @@ -172,12 +174,12 @@ static bool validate(const cv::cuda::GpuMat &in, ftl::codecs::Packet &pkt) { return false; } - if (width != in.cols || height != in.rows) { + /*if (width != in.cols || height != in.rows) { // TODO: Resize if lower definition requested... LOG(ERROR) << "Input size does not match expected: " << in.cols << " != " << width; pkt.definition = definition_t::Invalid; return false; - } + }*/ return true; } @@ -226,7 +228,7 @@ bool NvidiaEncoder::_createEncoder(const cv::cuda::GpuMat &in, const ftl::codecs Parameters params = generateParams(in, pkt); if (nvenc_ && (params == params_)) return true; - uint64_t bitrate = calculateBitrate(pkt.definition, float(pkt.bitrate)/255.0f) * pkt.frame_count; + 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; params_ = params; diff --git a/components/streams/src/receiver.cpp b/components/streams/src/receiver.cpp index 30043cd5f5c31427a3980a95aadeb6b1183d39ec..a319d60e3b14718b67fdf7b07436eecb95c9d8e6 100644 --- a/components/streams/src/receiver.cpp +++ b/components/streams/src/receiver.cpp @@ -279,8 +279,6 @@ void Receiver::_processVideo(const StreamPacket &spkt, const Packet &pkt) { cv::waitKey(1); }*/ - bool apply_Y_filter = value("apply_Y_filter", true); - // Mark a frameset as being partial if (pkt.flags & ftl::codecs::kFlagPartial) { builder_[spkt.streamID].markPartial(spkt.timestamp); @@ -301,18 +299,6 @@ void Receiver::_processVideo(const StreamPacket &spkt, const Packet &pkt) { LOG(WARNING) << "Previous frame not complete: " << spkt.timestamp; } - { - // This ensures that if previous frames are unfinished then they - // are discarded. - /*UNIQUE_LOCK(vidstate.mutex, lk); - if (frame.timestamp != spkt.timestamp && frame.timestamp != -1) { - frame.frame.reset(); - frame.completed.clear(); - LOG(WARNING) << "Frames out-of-phase by: " << spkt.timestamp - frame.timestamp; - } - frame.timestamp = spkt.timestamp;*/ - } - // Add channel to frame and allocate memory if required const cv::Size size = cv::Size(width, height); frame.getBuffer<cv::cuda::GpuMat>(spkt.channel).create(size, ftl::codecs::type(spkt.channel)); //(isFloatChannel(rchan) ? CV_32FC1 : CV_8UC4)); @@ -320,29 +306,6 @@ void Receiver::_processVideo(const StreamPacket &spkt, const Packet &pkt) { cv::Rect roi((i % tx)*width, (i / tx)*height, width, height); cv::cuda::GpuMat sroi = surface(roi); sroi.copyTo(frame.getBuffer<cv::cuda::GpuMat>(spkt.channel), cvstream); - - // Do colour conversion - /*if (isFloatChannel(rchan) && (pkt.flags & 0x2)) { - cv::Rect croi((i % tx)*width, ty*height+(i / tx)*height/2, width, height/2); - cv::cuda::GpuMat csroi = surface(croi); - // Smooth Y channel around discontinuities - // Lerp the uv channels / smooth over a small kernal size. - - //if (value("apply_bilateral", true)) { - // cv::cuda::split - // Apply disparity bilateral to the luminance channel - // cv::cuda::merge or overload vuya_to_depth - //} - - //if (apply_Y_filter) ftl::cuda::smooth_y(sroi, cvstream); - ftl::cuda::vuya_to_depth(frame.getBuffer<cv::cuda::GpuMat>(spkt.channel), sroi, csroi, 16.0f, cvstream); - } else if (isFloatChannel(rchan)) { - sroi.convertTo(frame.getBuffer<cv::cuda::GpuMat>(spkt.channel), CV_32FC1, 1.0f/1000.0f, cvstream); - } else if (sroi.type() == CV_8UC1) { - sroi.copyTo(frame.getBuffer<cv::cuda::GpuMat>(spkt.channel), cvstream); - } else { - cv::cuda::cvtColor(sroi, frame.getBuffer<cv::cuda::GpuMat>(spkt.channel), cv::COLOR_RGBA2BGRA, 0, cvstream); - }*/ } // Must ensure all processing is finished before completing a frame.