Skip to content
Snippets Groups Projects

Implements #218 red blue swap

Merged Nicolas Pope requested to merge feature/218/swaprgb into master
1 file
+ 5
2
Compare changes
  • Side-by-side
  • Inline
@@ -20,6 +20,7 @@ NvPipeEncoder::NvPipeEncoder(definition_t maxdef,
current_definition_ = definition_t::HD1080;
is_float_channel_ = false;
was_reset_ = false;
preference_ = codec_t::Any;
}
NvPipeEncoder::~NvPipeEncoder() {
@@ -30,6 +31,14 @@ void NvPipeEncoder::reset() {
was_reset_ = true;
}
bool NvPipeEncoder::supports(ftl::codecs::codec_t codec) {
switch (codec) {
case codec_t::H264:
case codec_t::HEVC: preference_ = codec; return true;
default: return false;
}
}
/* Check preset resolution is not better than actual resolution. */
definition_t NvPipeEncoder::_verifiedDefinition(definition_t def, const cv::Mat &in) {
int height = ftl::codecs::getHeight(def);
@@ -103,9 +112,12 @@ bool NvPipeEncoder::encode(const cv::Mat &in, definition_t odefinition, bitrate_
if (tmp.type() == CV_32F) {
tmp.convertTo(tmp, CV_16UC1, 1000);
} else if (tmp.type() == CV_8UC3) {
cv::cvtColor(tmp, tmp, cv::COLOR_BGR2BGRA);
cv::cvtColor(tmp, tmp, cv::COLOR_BGR2RGBA);
} else if (tmp.type() == CV_8UC4) {
cv::cvtColor(tmp, tmp, cv::COLOR_BGRA2RGBA);
} else {
//in.copyTo(tmp);
LOG(ERROR) << "Unsupported cv::Mat type in Nvidia encoder";
return false;
}
// scale/pad to fit output format
@@ -114,10 +126,11 @@ bool NvPipeEncoder::encode(const cv::Mat &in, definition_t odefinition, bitrate_
//std::swap(tmp, tmp2);
Packet pkt;
pkt.codec = codec_t::HEVC;
pkt.codec = (preference_ == codec_t::Any) ? codec_t::HEVC : preference_;
pkt.definition = definition;
pkt.block_total = 1;
pkt.block_number = 0;
pkt.flags = NvPipeEncoder::kFlagRGB;
pkt.data.resize(ftl::codecs::kVideoBufferSize);
uint64_t cs = NvPipe_Encode(
@@ -147,9 +160,35 @@ bool NvPipeEncoder::_encoderMatch(const cv::Mat &in, definition_t def) {
((in.type() == CV_8UC3 || in.type() == CV_8UC4) && !is_float_channel_)) && current_definition_ == def;
}
static uint64_t calculateBitrate(definition_t def, bitrate_t rate) {
float scale = 1.0f;
switch (rate) {
case bitrate_t::High : break;
case bitrate_t::Standard : scale = 0.5f; break;
case bitrate_t::Low : scale = 0.25f; break;
}
float bitrate = 1.0f; // Megabits
switch (def) {
case definition_t::UHD4k : bitrate = 24.0f; break;
case definition_t::HTC_VIVE : bitrate = 16.0f; break;
case definition_t::HD1080 : bitrate = 16.0f; break;
case definition_t::HD720 : bitrate = 8.0f; break;
case definition_t::SD576 :
case definition_t::SD480 : bitrate = 4.0f; break;
case definition_t::LD360 : bitrate = 2.0f; break;
default : bitrate = 8.0f;
}
return uint64_t(bitrate * 1000.0f * 1000.0f * scale);
}
bool NvPipeEncoder::_createEncoder(const cv::Mat &in, definition_t def, bitrate_t rate) {
if (_encoderMatch(in, def) && nvenc_) return true;
uint64_t bitrate = calculateBitrate(def, rate);
LOG(INFO) << "Calculated bitrate: " << bitrate;
if (in.type() == CV_32F) is_float_channel_ = true;
else is_float_channel_ = false;
current_definition_ = def;
@@ -158,9 +197,9 @@ bool NvPipeEncoder::_createEncoder(const cv::Mat &in, definition_t def, bitrate_
const int fps = 1000/ftl::timer::getInterval();
nvenc_ = NvPipe_CreateEncoder(
(is_float_channel_) ? NVPIPE_UINT16 : NVPIPE_RGBA32,
NVPIPE_HEVC,
(preference_ == codec_t::Any || preference_ == codec_t::HEVC) ? NVPIPE_HEVC : NVPIPE_H264,
(is_float_channel_) ? NVPIPE_LOSSLESS : NVPIPE_LOSSY,
16*1000*1000,
bitrate,
fps, // FPS
ftl::codecs::getWidth(def), // Output Width
ftl::codecs::getHeight(def) // Output Height
Loading