diff --git a/FrameGrabber.cpp b/FrameGrabber.cpp index d0c6cb7..69fcae7 100644 --- a/FrameGrabber.cpp +++ b/FrameGrabber.cpp @@ -305,7 +305,7 @@ void FrameGrabber::addFrame (GstBuffer *buffer, GstCaps *caps, float dt) if (active_) { // calculate dt in ns - timeframe_ += gst_gdouble_to_guint64( dt * 1000000.f); + timeframe_ += gst_gdouble_to_guint64( dt * 1000000.f ); // if time is passed one frame duration (with 10% margin) // and if the encoder accepts data diff --git a/ImGuiToolkit.cpp b/ImGuiToolkit.cpp index dc701cf..286ed2c 100644 --- a/ImGuiToolkit.cpp +++ b/ImGuiToolkit.cpp @@ -124,7 +124,7 @@ void ImGuiToolkit::Icon(int i, int j) ImGui::Image((void*)(intptr_t)textureicons, ImVec2(ImGui::GetTextLineHeightWithSpacing(), ImGui::GetTextLineHeightWithSpacing()), uv0, uv1); } -bool ImGuiToolkit::ButtonIcon(int i, int j) +bool ImGuiToolkit::ButtonIcon(int i, int j, const char *tooltip) { // icons.dds is a 20 x 20 grid of icons if (textureicons == 0) @@ -137,6 +137,13 @@ bool ImGuiToolkit::ButtonIcon(int i, int j) bool ret = ImGui::ImageButton((void*)(intptr_t)textureicons, ImVec2(ImGui::GetTextLineHeightWithSpacing(),ImGui::GetTextLineHeightWithSpacing()), uv0, uv1, 3); ImGui::PopID(); + if (tooltip != nullptr && ImGui::IsItemHovered()) + { + ImGui::BeginTooltip(); + ImGui::Text("%s", tooltip); + ImGui::EndTooltip(); + } + return ret; } diff --git a/ImGuiToolkit.h b/ImGuiToolkit.h index 5e2a0eb..91dd1fd 100644 --- a/ImGuiToolkit.h +++ b/ImGuiToolkit.h @@ -15,7 +15,7 @@ namespace ImGuiToolkit void ShowIconsWindow(bool* p_open); // utility buttons - bool ButtonIcon (int i, int j); + bool ButtonIcon (int i, int j, const char* tooltip = nullptr); bool ButtonIconToggle (int i, int j, int i_toggle, int j_toggle, bool* toggle); bool ButtonIconMultistate (std::vector > icons, int* state); bool ButtonToggle(const char* label, bool* toggle); diff --git a/Loopback.cpp b/Loopback.cpp index bcca62c..612ed52 100644 --- a/Loopback.cpp +++ b/Loopback.cpp @@ -55,7 +55,7 @@ bool Loopback::system_loopback_initialized = false; * Useful command lines for debug * $ v4l2-ctl --all -d 10 * $ gst-launch-1.0 v4l2src device=/dev/video10 ! videoconvert ! autovideosink - * $ gst-launch-1.0 videotestsrc ! v4l2sink device=/dev/video1 + * $ gst-launch-1.0 videotestsrc ! v4l2sink device=/dev/video10 */ #include @@ -64,7 +64,7 @@ bool Loopback::system_loopback_initialized = false; #include std::string Loopback::system_loopback_name = "/dev/video10"; -std::string Loopback::system_loopback_pipeline = "appsrc name=src ! videoconvert ! v4l2sink sync=false name=sink"; +std::string Loopback::system_loopback_pipeline = "appsrc name=src ! videoconvert ! queue ! v4l2sink sync=false name=sink"; bool Loopback::initializeSystemLoopback() { @@ -87,6 +87,7 @@ bool Loopback::initializeSystemLoopback() // create command line for installing v4l2loopback std::string cmdline = "export SUDO_ASKPASS=\"" + sudoscript + "\"\n"; cmdline += "sudo -A apt install v4l2loopback-dkms 2>&1\n"; + cmdline += "sudo -A modprobe -r v4l2loopback 2>&1\n"; cmdline += "sudo -A modprobe v4l2loopback exclusive_caps=1 video_nr=10 card_label=\"vimix loopback\" 2>&1\n"; // execute v4l2 command line diff --git a/UserInterfaceManager.cpp b/UserInterfaceManager.cpp index 0bc12d3..a68709c 100644 --- a/UserInterfaceManager.cpp +++ b/UserInterfaceManager.cpp @@ -1314,22 +1314,26 @@ void UserInterface::RenderPreview() static char dummy_str[512]; sprintf(dummy_str, "sudo apt install v4l2loopback-dkms"); - ImGui::SetNextItemWidth(w + 20); + ImGui::Text("Install v4l2loopack:"); ImGui::InputText("##cmd1", dummy_str, IM_ARRAYSIZE(dummy_str), ImGuiInputTextFlags_ReadOnly); + ImGui::SameLine(); + ImGui::PushID(358794); + if ( ImGuiToolkit::ButtonIcon(3,6, "Copy to clipboard") ) + ImGui::SetClipboardText(dummy_str); + ImGui::PopID(); + sprintf(dummy_str, "sudo modprobe v4l2loopback exclusive_caps=1 video_nr=10 card_label=\"vimix loopback\""); - ImGui::SetNextItemWidth(w + 20); + ImGui::Text("Initialize v4l2loopack:"); ImGui::InputText("##cmd2", dummy_str, IM_ARRAYSIZE(dummy_str), ImGuiInputTextFlags_ReadOnly); + ImGui::SameLine(); + ImGui::PushID(899872); + if ( ImGuiToolkit::ButtonIcon(3,6, "Copy to clipboard") ) + ImGui::SetClipboardText(dummy_str); + ImGui::PopID(); ImGui::Separator(); - if (ImGui::Button("Cancel, I'll do it.\n(try again later)", ImVec2(w/2, 0))) { ImGui::CloseCurrentPopup(); } - ImGui::SameLine(); ImGui::SetItemDefaultFocus(); - if (ImGui::Button("Ok, let vimix try.\n(sudo password required)", ImVec2(w/2, 0)) ) { - if (Loopback::initializeSystemLoopback()) { - FrameGrabber *fg = new Loopback; - webcam_emulator_ = fg->id(); - FrameGrabbing::manager().add(fg); - } + if (ImGui::Button("Ok, I'll do it and try again later.", ImVec2(w, 0)) ) { ImGui::CloseCurrentPopup(); }