|
|
@@ -4,11 +4,12 @@
|
|
|
void image_streamer::impl::create_encoder() {
|
|
|
switch (chose_encoder_type) {
|
|
|
case ENCODER_NVENC: {
|
|
|
- auto img_info = OBJ_QUERY(image_u8c4, conf.img_name)->as_info();
|
|
|
- int img_freq = std::round(OBJ_STATS(conf.img_name).save_frequency);
|
|
|
-
|
|
|
+ img_size = get_image_size(conf.img_name);
|
|
|
+ if (img_size.empty()) break; // lazy create
|
|
|
+ int img_freq = conf.frame_rate.value_or(
|
|
|
+ std::round(OBJ_STATS(conf.img_name).save_frequency));
|
|
|
auto enc_conf = encoder_nvenc::create_config();
|
|
|
- enc_conf.frame_size = img_info.size;
|
|
|
+ enc_conf.frame_size = img_size;
|
|
|
enc_conf.frame_rate = img_freq;
|
|
|
enc_conf.bitrate_mbps = enc_bitrate_mbps;
|
|
|
enc_conf.save_file = enc_save_file;
|
|
|
@@ -19,6 +20,7 @@ void image_streamer::impl::create_encoder() {
|
|
|
assert(enc_nvenc == nullptr);
|
|
|
enc_nvenc = encoder_nvenc::create(enc_conf);
|
|
|
assert(enc_nvenc != nullptr);
|
|
|
+ SPDLOG_INFO("NvEnc created with size {}x{}.", img_size.width, img_size.height);
|
|
|
return;
|
|
|
}
|
|
|
default: {
|
|
|
@@ -112,6 +114,26 @@ void image_streamer::impl::stop() {
|
|
|
is_running = false;
|
|
|
}
|
|
|
|
|
|
+void image_streamer::impl::change_frame_rate(int fps) {
|
|
|
+ conf.frame_rate = fps;
|
|
|
+ if (!is_running) return;
|
|
|
+
|
|
|
+ switch (chose_encoder_type) {
|
|
|
+ case ENCODER_NVENC: {
|
|
|
+ auto mod_conf = encoder_nvenc::modifiable_config{
|
|
|
+ .frame_rate = fps, .bitrate_mbps =enc_bitrate_mbps,
|
|
|
+ };
|
|
|
+ enc_nvenc->change_config(mod_conf);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case ENCODER_JPEG: // do nothing
|
|
|
+ break;
|
|
|
+ default: {
|
|
|
+ RET_ERROR;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void image_streamer::impl::image_callback(obj_name_type name) {
|
|
|
assert(name == conf.img_name);
|
|
|
|
|
|
@@ -135,6 +157,10 @@ frame_info image_streamer::impl::encode_image() {
|
|
|
switch (chose_encoder_type) {
|
|
|
case ENCODER_NVENC: {
|
|
|
auto img = OBJ_QUERY(image_u8c4, conf.img_name);
|
|
|
+ if (img->size() != img_size) { // recreate encoder
|
|
|
+ enc_nvenc = nullptr;
|
|
|
+ create_encoder();
|
|
|
+ }
|
|
|
assert(enc_nvenc != nullptr);
|
|
|
auto frame = enc_nvenc->encode(img, enc_idr_requested);
|
|
|
enc_idr_requested = false;
|
|
|
@@ -254,4 +280,8 @@ image_streamer::~image_streamer() = default;
|
|
|
|
|
|
void image_streamer::show() {
|
|
|
pimpl->show();
|
|
|
+}
|
|
|
+
|
|
|
+void image_streamer::change_frame_rate(int fps) {
|
|
|
+ pimpl->change_frame_rate(fps);
|
|
|
}
|