mirror of
https://github.com/brunoherbelin/vimix.git
synced 2025-12-17 05:09:58 +01:00
Simplified v4l2loopback system
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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<std::pair<int, int> > icons, int* state);
|
||||
bool ButtonToggle(const char* label, bool* toggle);
|
||||
|
||||
@@ -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 <stdio.h>
|
||||
@@ -64,7 +64,7 @@ bool Loopback::system_loopback_initialized = false;
|
||||
#include <unistd.h>
|
||||
|
||||
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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user