diff --git a/src/main.cpp b/src/main.cpp index 58271f83d02..e836eab47ec 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -45,6 +45,7 @@ bl::sources::severity_logger error(4); // Recoverable errors bl::sources::severity_logger fatal(5); // Unrecoverable errors bool display_cursor = true; +bool resend_frame = false; using text_sink = bl::sinks::asynchronous_sink; boost::shared_ptr sink; diff --git a/src/main.h b/src/main.h index 89c4dbdc6f4..8e49a638bd8 100644 --- a/src/main.h +++ b/src/main.h @@ -12,6 +12,7 @@ extern util::ThreadPool task_pool; extern bool display_cursor; +extern bool resend_frame; extern boost::log::sources::severity_logger verbose; extern boost::log::sources::severity_logger debug; diff --git a/src/platform/linux/kmsgrab.cpp b/src/platform/linux/kmsgrab.cpp index 04763026288..64abb65ca5b 100644 --- a/src/platform/linux/kmsgrab.cpp +++ b/src/platform/linux/kmsgrab.cpp @@ -671,13 +671,13 @@ class display_ram_t : public display_t { } next_frame = now + delay; - auto status = snapshot(img.get(), 1000ms, *cursor); + auto status = snapshot(img.get(), std::chrono::duration_cast(delay), *cursor); switch(status) { case platf::capture_e::reinit: case platf::capture_e::error: return status; case platf::capture_e::timeout: - std::this_thread::sleep_for(1ms); + if(resend_frame) img = snapshot_cb(img); continue; case platf::capture_e::ok: img = snapshot_cb(img); diff --git a/src/platform/linux/wlgrab.cpp b/src/platform/linux/wlgrab.cpp index 31d5cfa062b..2d338eac2e3 100644 --- a/src/platform/linux/wlgrab.cpp +++ b/src/platform/linux/wlgrab.cpp @@ -128,12 +128,13 @@ class wlr_ram_t : public wlr_t { } next_frame = now + delay; - auto status = snapshot(img.get(), 1000ms, *cursor); + auto status = snapshot(img.get(), std::chrono::duration_cast(delay), *cursor); switch(status) { case platf::capture_e::reinit: case platf::capture_e::error: return status; case platf::capture_e::timeout: + if(resend_frame) img = snapshot_cb(img); continue; case platf::capture_e::ok: img = snapshot_cb(img); @@ -366,4 +367,4 @@ std::vector wl_display_names() { return display_names; } -} // namespace platf \ No newline at end of file +} // namespace platf diff --git a/src/platform/linux/x11grab.cpp b/src/platform/linux/x11grab.cpp index c024f4d8f40..41054be9fba 100644 --- a/src/platform/linux/x11grab.cpp +++ b/src/platform/linux/x11grab.cpp @@ -470,13 +470,13 @@ struct x11_attr_t : public display_t { } next_frame = now + delay; - auto status = snapshot(img.get(), 1000ms, *cursor); + auto status = snapshot(img.get(), std::chrono::duration_cast(delay), *cursor); switch(status) { case platf::capture_e::reinit: case platf::capture_e::error: return status; case platf::capture_e::timeout: - std::this_thread::sleep_for(1ms); + if(resend_frame) img = snapshot_cb(img); continue; case platf::capture_e::ok: img = snapshot_cb(img); diff --git a/src/platform/windows/display_ram.cpp b/src/platform/windows/display_ram.cpp index 596d4880ff3..61bbac2cfef 100644 --- a/src/platform/windows/display_ram.cpp +++ b/src/platform/windows/display_ram.cpp @@ -175,13 +175,13 @@ capture_e display_ram_t::capture(snapshot_cb_t &&snapshot_cb, std::shared_ptr<:: } next_frame = now + delay; - auto status = snapshot(img.get(), 1000ms, *cursor); + auto status = snapshot(img.get(), std::chrono::duration_cast(delay), *cursor); switch(status) { case platf::capture_e::reinit: case platf::capture_e::error: return status; case platf::capture_e::timeout: - std::this_thread::sleep_for(1ms); + if(resend_frame) img = snapshot_cb(img); continue; case platf::capture_e::ok: img = snapshot_cb(img); diff --git a/src/platform/windows/display_vram.cpp b/src/platform/windows/display_vram.cpp index 3cf7c97789b..25282f578bf 100644 --- a/src/platform/windows/display_vram.cpp +++ b/src/platform/windows/display_vram.cpp @@ -573,13 +573,13 @@ capture_e display_vram_t::capture(snapshot_cb_t &&snapshot_cb, std::shared_ptr<: } next_frame = now + delay; - auto status = snapshot(img.get(), 1000ms, *cursor); + auto status = snapshot(img.get(), std::chrono::duration_cast(delay), *cursor); switch(status) { case platf::capture_e::reinit: case platf::capture_e::error: return status; case platf::capture_e::timeout: - std::this_thread::sleep_for(1ms); + if(resend_frame) img = snapshot_cb(img); continue; case platf::capture_e::ok: img = snapshot_cb(img); @@ -885,4 +885,4 @@ int init() { return 0; } -} // namespace platf::dxgi \ No newline at end of file +} // namespace platf::dxgi diff --git a/src/video.cpp b/src/video.cpp index bec77c81b9d..667a20d6f51 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -776,9 +776,14 @@ int encode(int64_t frame_nr, session_t &session, frame_t::pointer frame, safe::m while(ret >= 0) { auto packet = std::make_unique(nullptr); auto av_packet = packet.get()->av_packet; + resend_frame = false; ret = avcodec_receive_packet(ctx.get(), av_packet); - if(ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) { + if(ret == AVERROR(EAGAIN)) { + if(!(encoders.front().flags & PARALLEL_ENCODING)) resend_frame = true; + return 0; + } + else if(ret == AVERROR_EOF) { return 0; } else if(ret < 0) {